diff options
author | Asbjørn Sloth Tønnesen <ast@2e8.dk> | 2019-07-18 21:35:10 +0000 |
---|---|---|
committer | Asbjørn Sloth Tønnesen <ast@2e8.dk> | 2019-07-18 21:35:10 +0000 |
commit | cfec9c2570b9f185447025a17c735f44a7b9f525 (patch) | |
tree | d6ec96013caada6cc3803080a210400fa07084bf /lua/inet/core.lua | |
parent | 0667077147ea9da13811bf99bd6b960e847af15e (diff) | |
download | lua-inet-cfec9c2570b9f185447025a17c735f44a7b9f525.tar.gz lua-inet-cfec9c2570b9f185447025a17c735f44a7b9f525.tar.xz lua-inet-cfec9c2570b9f185447025a17c735f44a7b9f525.zip |
add inet6:netmask()
Signed-off-by: Asbjørn Sloth Tønnesen <ast@2e8.dk>
Diffstat (limited to 'lua/inet/core.lua')
-rw-r--r-- | lua/inet/core.lua | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lua/inet/core.lua b/lua/inet/core.lua index 9848e52..0b062e7 100644 --- a/lua/inet/core.lua +++ b/lua/inet/core.lua @@ -3,6 +3,9 @@ local bit32 = require 'bit32' local common = require 'inet.common' local format = string.format +local floor = math.floor +local min = math.min +local max = math.max local lshift = bit32.lshift local rshift = bit32.rshift @@ -688,6 +691,31 @@ function inet6:network() return new_inet6(newpcs, netbits) end +local function build_inet6_mask(z1, o1, z2) + assert(z1 + o1 + z2 == 128) + local pcs = { 0, 0, 0, 0, 0, 0, 0, 0 } + local b, l = z1, o1 + if l > 0 then + local e = b + l - 1 + local bpcs = floor(b / 16) + 1 + local epcs = floor(e / 16) + 1 + for j=bpcs,epcs do + local o = (j-1) * 16 + local bo = max(0,b-o) + local width = min(15,e-o)+1 - bo + local fbit = 16 - width - bo + local v = replace(pcs[j], 0xffff, fbit, width) + pcs[j] = v + end + end + return new_inet6(pcs) +end + +function inet6:netmask() + local mask = self.mask + return build_inet6_mask(0, mask, 128 - mask) +end + function inet6:flip() -- find twin by flipping the last network bit local mask = self.mask |