libs/core: Taught luci.ip how to use netmasks and smaller syntax sugars
This commit is contained in:
parent
77ef326e77
commit
256ab6b57c
1 changed files with 38 additions and 7 deletions
|
@ -74,11 +74,15 @@ ntohs = htons
|
||||||
ntohl = htonl
|
ntohl = htonl
|
||||||
|
|
||||||
|
|
||||||
function IPv4(address)
|
function IPv4(address, netmask)
|
||||||
|
address = address or "0.0.0.0/0"
|
||||||
|
|
||||||
local data = {}
|
local data = {}
|
||||||
local prefix = address:match("/(.+)")
|
local prefix = address:match("/(.+)")
|
||||||
|
|
||||||
if prefix then
|
if netmask then
|
||||||
|
prefix = IPv4():prefix(netmask)
|
||||||
|
elseif prefix then
|
||||||
address = address:gsub("/.+","")
|
address = address:gsub("/.+","")
|
||||||
prefix = tonumber(prefix)
|
prefix = tonumber(prefix)
|
||||||
if not prefix or prefix < 0 or prefix > 32 then return nil end
|
if not prefix or prefix < 0 or prefix > 32 then return nil end
|
||||||
|
@ -86,7 +90,7 @@ function IPv4(address)
|
||||||
prefix = 32
|
prefix = 32
|
||||||
end
|
end
|
||||||
|
|
||||||
local b1, b2, b3, b4 = address:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")
|
local b1, b2, b3, b4 = address:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")
|
||||||
|
|
||||||
b1 = tonumber(b1)
|
b1 = tonumber(b1)
|
||||||
b2 = tonumber(b2)
|
b2 = tonumber(b2)
|
||||||
|
@ -106,11 +110,15 @@ function IPv4(address)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function IPv6(address)
|
function IPv6(address, netmask)
|
||||||
|
address = address or "::/0"
|
||||||
|
|
||||||
local data = {}
|
local data = {}
|
||||||
local prefix = address:match("/(.+)")
|
local prefix = address:match("/(.+)")
|
||||||
|
|
||||||
if prefix then
|
if netmask then
|
||||||
|
prefix = IPv6():prefix(netmask)
|
||||||
|
elseif prefix then
|
||||||
address = address:gsub("/.+","")
|
address = address:gsub("/.+","")
|
||||||
prefix = tonumber(prefix)
|
prefix = tonumber(prefix)
|
||||||
if not prefix or prefix < 0 or prefix > 128 then return nil end
|
if not prefix or prefix < 0 or prefix > 128 then return nil end
|
||||||
|
@ -238,8 +246,31 @@ function cidr.equal( self, addr )
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
function cidr.prefix( self )
|
function cidr.prefix( self, mask )
|
||||||
return self[3]
|
local prefix = self[3]
|
||||||
|
|
||||||
|
if mask then
|
||||||
|
prefix = 0
|
||||||
|
|
||||||
|
local obj = self:is4() and IPv4(mask) or IPv6(mask)
|
||||||
|
if not obj then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, block in ipairs(obj[2]) do
|
||||||
|
local pos = bit.lshift(1, 15)
|
||||||
|
for i=15, 0, -1 do
|
||||||
|
if bit.band(block, pos) == pos then
|
||||||
|
prefix = prefix + 1
|
||||||
|
else
|
||||||
|
return prefix
|
||||||
|
end
|
||||||
|
pos = bit.rshift(pos, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return prefix
|
||||||
end
|
end
|
||||||
|
|
||||||
function cidr.network( self )
|
function cidr.network( self )
|
||||||
|
|
Loading…
Reference in a new issue