From cfec9c2570b9f185447025a17c735f44a7b9f525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Sloth=20T=C3=B8nnesen?= Date: Thu, 18 Jul 2019 21:35:10 +0000 Subject: add inet6:netmask() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Asbjørn Sloth Tønnesen --- lua/inet/core.lua | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'lua/inet') 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 -- cgit v1.2.1