+function ipmask(val)
+ return ipmask4(val) or ipmask6(val)
+end
+
+function ipmask4(val)
+ local ip, mask = val:match("^([^/]+)/([^/]+)$")
+ local bits = tonumber(mask)
+
+ if bits and (bits < 0 or bits > 32) then
+ return false
+ end
+
+ if not bits and mask and not ip4addr(mask) then
+ return false
+ end
+
+ return ip4addr(ip or val)
+end
+
+function ipmask6(val)
+ local ip, mask = val:match("^([^/]+)/([^/]+)$")
+ local bits = tonumber(mask)
+
+ if bits and (bits < 0 or bits > 128) then
+ return false
+ end
+
+ if not bits and mask and not ip6addr(mask) then
+ return false
+ end
+
+ return ip6addr(ip or val)
+end
+
+function ip6hostid(val)
+ if val and val:match("^[a-fA-F0-9:]+$") and (#val > 2) then
+ return (ip6addr("2001:db8:0:0" .. val) or ip6addr("2001:db8:0:0:" .. val))
+ end
+
+ return false
+end
+