Software /
code /
prosody
Changeset
8437:021129f7b0a3
util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 01 Dec 2017 03:29:25 +0100 |
parents | 8436:ab9ddfb03d4d |
children | 8438:499663bd0122 |
files | util/ip.lua |
diffstat | 1 files changed, 13 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/util/ip.lua Fri Dec 01 02:25:25 2017 +0100 +++ b/util/ip.lua Fri Dec 01 03:29:25 2017 +0100 @@ -228,11 +228,20 @@ end function match(ipA, ipB, bits) - local common_bits = commonPrefixLength(ipA, ipB); - if bits and ipB.proto == "IPv4" then - common_bits = common_bits - 96; -- v6 mapped addresses always share these bits + if not bits then + return ipA == ipB; + elseif bits < 1 then + return true; end - return common_bits >= (bits or 128); + if ipA.proto ~= ipB.proto then + if ipA.proto == "IPv4" then + ipA = ipA.toV4mapped; + elseif ipB.proto == "IPv4" then + ipB = ipA.toV4mapped; + bits = bits + (128 - 32); + end + end + return ipA.bits:sub(1, bits) == ipB.bits:sub(1, bits); end return {