X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Fip.lua;h=bba701ae24c3f1114f01c2021e9878535f6a9b2b;hb=db82e041a88938b839455d61faf4178365d4fa8f;hp=bcb821a46e384f0b5b136b131c9faff8dd6f5dcb;hpb=648126f6d00cfca1313c00e29f68d1a1a260dd04;p=project%2Fluci.git diff --git a/libs/core/luasrc/ip.lua b/libs/core/luasrc/ip.lua index bcb821a46..bba701ae2 100644 --- a/libs/core/luasrc/ip.lua +++ b/libs/core/luasrc/ip.lua @@ -20,10 +20,16 @@ module( "luci.ip", package.seeall ) require("bit") require("luci.util") +--- Boolean; true if system is little endian LITTLE_ENDIAN = not luci.util.bigendian() + +--- Boolean; true if system is big endian BIG_ENDIAN = not LITTLE_ENDIAN +--- Specifier for IPv4 address family FAMILY_INET4 = 0x04 + +--- Specifier for IPv6 address family FAMILY_INET6 = 0x06 @@ -314,19 +320,20 @@ end --- LuCI IP Library / CIDR instances -- @class module +-- @cstyle instance -- @name luci.ip.cidr cidr = luci.util.class() --- Test whether the instance is a IPv4 address. -- @return Boolean indicating a IPv4 address type --- @see is6 +-- @see cidr.is6 function cidr.is4( self ) return self[1] == FAMILY_INET4 end --- Test whether the instance is a IPv6 address. -- @return Boolean indicating a IPv6 address type --- @see is4 +-- @see cidr.is4 function cidr.is6( self ) return self[1] == FAMILY_INET6 end @@ -360,8 +367,8 @@ end -- family than this instance. -- @param addr A luci.ip.cidr instance to compare against -- @return Boolean indicating whether this instance is lower --- @see higher --- @see equal +-- @see cidr.higher +-- @see cidr.equal function cidr.lower( self, addr ) assert( self[1] == addr[1], "Can't compare IPv4 and IPv6 addresses" ) for i = 1, #self[2] do @@ -377,8 +384,8 @@ end -- family than this instance. -- @param addr A luci.ip.cidr instance to compare against -- @return Boolean indicating whether this instance is higher --- @see lower --- @see equal +-- @see cidr.lower +-- @see cidr.equal function cidr.higher( self, addr ) assert( self[1] == addr[1], "Can't compare IPv4 and IPv6 addresses" ) for i = 1, #self[2] do @@ -389,13 +396,13 @@ function cidr.higher( self, addr ) return false end ---- Test whether the value of the instance is uequal to the given address. +--- Test whether the value of the instance is equal to the given address. -- This function will throw an exception if the given address is a different -- family than this instance. -- @param addr A luci.ip.cidr instance to compare against -- @return Boolean indicating whether this instance is equal --- @see lower --- @see higher +-- @see cidr.lower +-- @see cidr.higher function cidr.equal( self, addr ) assert( self[1] == addr[1], "Can't compare IPv4 and IPv6 addresses" ) for i = 1, #self[2] do @@ -407,7 +414,8 @@ function cidr.equal( self, addr ) end --- Return the prefix length of this CIDR instance. --- @return Prefix length in bit +-- @param mask Override instance prefix with given netmask (optional) +-- @return Prefix length in bit function cidr.prefix( self, mask ) local prefix = self[3] @@ -444,9 +452,9 @@ end -- instance. -- @param bits Override prefix length of this instance (optional) -- @return CIDR instance containing the network address --- @see host --- @see broadcast --- @see mask +-- @see cidr.host +-- @see cidr.broadcast +-- @see cidr.mask function cidr.network( self, bits ) local data = { } bits = bits or self[3] @@ -469,9 +477,9 @@ end --- Return a corresponding CIDR representing the host address of this -- instance. This is intended to extract the host address from larger subnet. -- @return CIDR instance containing the network address --- @see network --- @see broadcast --- @see mask +-- @see cidr.network +-- @see cidr.broadcast +-- @see cidr.mask function cidr.host( self ) return __bless({ self[1], data, __maxlen(self[1]) }) end @@ -479,9 +487,9 @@ end --- Return a corresponding CIDR representing the netmask of this instance. -- @param bits Override prefix length of this instance (optional) -- @return CIDR instance containing the netmask --- @see network --- @see host --- @see broadcast +-- @see cidr.network +-- @see cidr.host +-- @see cidr.broadcast function cidr.mask( self, bits ) local data = { } bits = bits or self[3] @@ -502,11 +510,10 @@ function cidr.mask( self, bits ) end --- Return CIDR containing the broadcast address of this instance. --- @param bits Override prefix length of this instance (optional) -- @return CIDR instance containing the netmask, always nil for IPv6 --- @see network --- @see host --- @see mask +-- @see cidr.network +-- @see cidr.host +-- @see cidr.mask function cidr.broadcast( self ) -- IPv6 has no broadcast addresses (XXX: assert() instead?) if self[1] == FAMILY_INET4 then @@ -539,24 +546,22 @@ end -- @param amount Number of hosts to add to this instance -- @param inplace Boolen indicating whether to alter values inplace (optional) -- @return CIDR representing the new address or nil on overflow error --- @see sub +-- @see cidr.sub function cidr.add( self, amount, inplace ) local data = { unpack(self[2]) } local shorts = __array16( amount, self[1] ) - if shorts then - for pos = #data, 1, -1 do - local add = ( #shorts > 0 ) and table.remove( shorts, #shorts ) or 0 - if ( data[pos] + add ) > 0xFFFF then - data[pos] = ( data[pos] + add ) % 0xFFFF - if pos > 1 then - data[pos-1] = data[pos-1] + ( add - data[pos] ) - else - return nil - end + for pos = #data, 1, -1 do + local add = ( #shorts > 0 ) and table.remove( shorts, #shorts ) or 0 + if ( data[pos] + add ) > 0xFFFF then + data[pos] = ( data[pos] + add ) % 0xFFFF + if pos > 1 then + data[pos-1] = data[pos-1] + ( add - data[pos] ) else - data[pos] = data[pos] + add + return nil end + else + data[pos] = data[pos] + add end end @@ -572,24 +577,22 @@ end -- @param amount Number of hosts to substract from this instance -- @param inplace Boolen indicating whether to alter values inplace (optional) -- @return CIDR representing the new address or nil on underflow error --- @see add +-- @see cidr.add function cidr.sub( self, amount, inplace ) local data = { unpack(self[2]) } local shorts = __array16( amount, self[1] ) - if shorts then - for pos = #data, 1, -1 do - local sub = ( #shorts > 0 ) and table.remove( shorts, #shorts ) or 0 - if ( data[pos] - sub ) < 0 then - data[pos] = ( sub - data[pos] ) % 0xFFFF - if pos > 1 then - data[pos-1] = data[pos-1] - ( sub + data[pos] ) - else - return nil - end + for pos = #data, 1, -1 do + local sub = ( #shorts > 0 ) and table.remove( shorts, #shorts ) or 0 + if ( data[pos] - sub ) < 0 then + data[pos] = ( sub - data[pos] ) % 0xFFFF + if pos > 1 then + data[pos-1] = data[pos-1] - ( sub + data[pos] ) else - data[pos] = data[pos] - sub + return nil end + else + data[pos] = data[pos] - sub end end @@ -603,7 +606,7 @@ end --- Return CIDR containing the lowest available host address within this subnet. -- @return CIDR containing the host address, nil if subnet is too small --- @see maxhost +-- @see cidr.maxhost function cidr.minhost( self ) if self[3] <= __sublen(self[1]) then -- 1st is Network Address in IPv4 and Subnet-Router Anycast Adresse in IPv6 @@ -613,7 +616,7 @@ end --- Return CIDR containing the highest available host address within the subnet. -- @return CIDR containing the host address, nil if subnet is too small --- @see minhost +-- @see cidr.minhost function cidr.maxhost( self ) if self[3] <= __sublen(self[1]) then local data = { unpack(self[2]) }