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 {