Annotate

util/ip.lua @ 11105:3c0940f3cf74 0.11

util.dbuffer: Simplify test case An earlier theory involved the bug being related to collapsing multiple items, so it exercised that too. Also correct the comment, it referred to the space in "hello world" in an earlier version before the test string was changed to "foobar", which was what was tested in a REPL
author Kim Alvefur <zash@zash.se>
date Mon, 24 Aug 2020 17:28:48 +0200
parent 9955:c74c89a96cbf
child 10593:079b31c8dbf2
child 11649:aa119de5f6c7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
1 -- Prosody IM
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
2 -- Copyright (C) 2008-2011 Florian Zeitz
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
3 --
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
4 -- This project is MIT/X11 licensed. Please see the
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
5 -- COPYING file in the source package for more information.
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
6 --
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
7
8430
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
8 local net = require "util.net";
8432
da807f4f706c util.ip: Simplify bitstring method
Kim Alvefur <zash@zash.se>
parents: 8431
diff changeset
9 local hex = require "util.hex";
8430
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
10
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
11 local ip_methods = {};
8428
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
12
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
13 local ip_mt = {
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
14 __index = function (ip, key)
8436
ab9ddfb03d4d util.ip: Cache return values of all methods in one place
Kim Alvefur <zash@zash.se>
parents: 8435
diff changeset
15 local method = ip_methods[key];
ab9ddfb03d4d util.ip: Cache return values of all methods in one place
Kim Alvefur <zash@zash.se>
parents: 8435
diff changeset
16 if not method then return nil; end
ab9ddfb03d4d util.ip: Cache return values of all methods in one place
Kim Alvefur <zash@zash.se>
parents: 8435
diff changeset
17 local ret = method(ip);
ab9ddfb03d4d util.ip: Cache return values of all methods in one place
Kim Alvefur <zash@zash.se>
parents: 8435
diff changeset
18 ip[key] = ret;
ab9ddfb03d4d util.ip: Cache return values of all methods in one place
Kim Alvefur <zash@zash.se>
parents: 8435
diff changeset
19 return ret;
8428
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
20 end,
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
21 __tostring = function (ip) return ip.addr; end,
8441
e6e69be59233 util.ip: Do equality checking by comparing packed representation to avoid any variations
Kim Alvefur <zash@zash.se>
parents: 8439
diff changeset
22 __eq = function (ipA, ipB) return ipA.packed == ipB.packed; end
8428
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
23 };
ca44e462322c util.ip: Reflow metatable
Kim Alvefur <zash@zash.se>
parents: 8382
diff changeset
24
8382
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7486
diff changeset
25 local hex2bits = {
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7486
diff changeset
26 ["0"] = "0000", ["1"] = "0001", ["2"] = "0010", ["3"] = "0011",
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7486
diff changeset
27 ["4"] = "0100", ["5"] = "0101", ["6"] = "0110", ["7"] = "0111",
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7486
diff changeset
28 ["8"] = "1000", ["9"] = "1001", ["A"] = "1010", ["B"] = "1011",
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7486
diff changeset
29 ["C"] = "1100", ["D"] = "1101", ["E"] = "1110", ["F"] = "1111",
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7486
diff changeset
30 };
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
31
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
32 local function new_ip(ipStr, proto)
8430
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
33 local zone;
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
34 if (not proto or proto == "IPv6") and ipStr:find('%', 1, true) then
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
35 ipStr, zone = ipStr:match("^(.-)%%(.*)");
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
36 end
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
37
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
38 local packed, err = net.pton(ipStr);
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
39 if not packed then return packed, err end
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
40 if proto == "IPv6" and #packed ~= 16 then
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
41 return nil, "invalid-ipv6";
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
42 elseif proto == "IPv4" and #packed ~= 4 then
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
43 return nil, "invalid-ipv4";
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
44 elseif not proto then
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
45 if #packed == 16 then
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
46 proto = "IPv6";
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
47 elseif #packed == 4 then
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
48 proto = "IPv4";
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
49 else
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
50 return nil, "unknown protocol";
7052
306aabf2d57d util.ip: Automatically determine protocol of IP address if none specified. Return error if invalid. [Backported from 0.10]
Matthew Wild <mwild1@gmail.com>
parents: 5597
diff changeset
51 end
8430
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
52 elseif proto ~= "IPv6" and proto ~= "IPv4" then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
53 return nil, "invalid protocol";
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
54 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
55
8430
a58d560aa8d5 util.ip: Parse IP address using inet_pton
Kim Alvefur <zash@zash.se>
parents: 8429
diff changeset
56 return setmetatable({ addr = ipStr, packed = packed, proto = proto, zone = zone }, ip_mt);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
57 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
58
8433
ca7f8e60410a util.ip: Add a method returning a normalized IP address
Kim Alvefur <zash@zash.se>
parents: 8432
diff changeset
59 function ip_methods:normal()
ca7f8e60410a util.ip: Add a method returning a normalized IP address
Kim Alvefur <zash@zash.se>
parents: 8432
diff changeset
60 return net.ntop(self.packed);
ca7f8e60410a util.ip: Add a method returning a normalized IP address
Kim Alvefur <zash@zash.se>
parents: 8432
diff changeset
61 end
ca7f8e60410a util.ip: Add a method returning a normalized IP address
Kim Alvefur <zash@zash.se>
parents: 8432
diff changeset
62
8431
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
63 function ip_methods.bits(ip)
8432
da807f4f706c util.ip: Simplify bitstring method
Kim Alvefur <zash@zash.se>
parents: 8431
diff changeset
64 return hex.to(ip.packed):upper():gsub(".", hex2bits);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
65 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
66
8431
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
67 function ip_methods.bits_full(ip)
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
68 if ip.proto == "IPv4" then
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
69 ip = ip.toV4mapped;
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
70 end
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
71 return ip.bits;
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
72 end
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
73
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
74 local match;
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
75
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
76 local function commonPrefixLength(ipA, ipB)
8431
a5a03d40a20c util.ip: Make bit string function into a method
Kim Alvefur <zash@zash.se>
parents: 8430
diff changeset
77 ipA, ipB = ipA.bits_full, ipB.bits_full;
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
78 for i = 1, 128 do
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
79 if ipA:sub(i,i) ~= ipB:sub(i,i) then
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
80 return i-1;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
81 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
82 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
83 return 128;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
84 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
85
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
86 -- Instantiate once
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
87 local loopback = new_ip("::1");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
88 local loopback4 = new_ip("127.0.0.0");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
89 local sixtofour = new_ip("2002::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
90 local teredo = new_ip("2001::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
91 local linklocal = new_ip("fe80::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
92 local linklocal4 = new_ip("169.254.0.0");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
93 local uniquelocal = new_ip("fc00::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
94 local sitelocal = new_ip("fec0::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
95 local sixbone = new_ip("3ffe::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
96 local defaultunicast = new_ip("::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
97 local multicast = new_ip("ff00::");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
98 local ipv6mapped = new_ip("::ffff:0:0");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
99
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
100 local function v4scope(ip)
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
101 if match(ip, loopback4, 8) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
102 return 0x2;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
103 elseif match(ip, linklocal4) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
104 return 0x2;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
105 else -- Global unicast
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
106 return 0xE;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
107 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
108 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
109
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
110 local function v6scope(ip)
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
111 if ip == loopback then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
112 return 0x2;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
113 elseif match(ip, linklocal, 10) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
114 return 0x2;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
115 elseif match(ip, sitelocal, 10) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
116 return 0x5;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
117 elseif match(ip, multicast, 10) then
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
118 return ip.packed:byte(2) % 0x10;
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
119 else -- Global unicast
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
120 return 0xE;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
121 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
122 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
123
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
124 local function label(ip)
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
125 if ip == loopback then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
126 return 0;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
127 elseif match(ip, sixtofour, 16) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
128 return 2;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
129 elseif match(ip, teredo, 32) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
130 return 5;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
131 elseif match(ip, uniquelocal, 7) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
132 return 13;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
133 elseif match(ip, sitelocal, 10) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
134 return 11;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
135 elseif match(ip, sixbone, 16) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
136 return 12;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
137 elseif match(ip, defaultunicast, 96) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
138 return 3;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
139 elseif match(ip, ipv6mapped, 96) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
140 return 4;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
141 else
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
142 return 1;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
143 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
144 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
145
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
146 local function precedence(ip)
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
147 if ip == loopback then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
148 return 50;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
149 elseif match(ip, sixtofour, 16) then
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
150 return 30;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
151 elseif match(ip, teredo, 32) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
152 return 5;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
153 elseif match(ip, uniquelocal, 7) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
154 return 3;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
155 elseif match(ip, sitelocal, 10) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
156 return 1;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
157 elseif match(ip, sixbone, 16) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
158 return 1;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
159 elseif match(ip, defaultunicast, 96) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
160 return 1;
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
161 elseif match(ip, ipv6mapped, 96) then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 4433
diff changeset
162 return 35;
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
163 else
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
164 return 40;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
165 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
166 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
167
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
168 function ip_methods:toV4mapped()
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
169 if self.proto ~= "IPv4" then return nil, "No IPv4 address" end
8434
ec8f37baffaa util.ip: Simplify creation of IPv6-mapped IPv4 addresses
Kim Alvefur <zash@zash.se>
parents: 8433
diff changeset
170 local value = new_ip("::ffff:" .. self.normal);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
171 return value;
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
172 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
173
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
174 function ip_methods:label()
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
175 if self.proto == "IPv4" then
8469
52d48cea1f60 util.ip: Remove redundant caching of method output (supposed to be done in ab9ddfb03d4d but lost somehow)
Kim Alvefur <zash@zash.se>
parents: 8468
diff changeset
176 return label(self.toV4mapped);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
177 else
8469
52d48cea1f60 util.ip: Remove redundant caching of method output (supposed to be done in ab9ddfb03d4d but lost somehow)
Kim Alvefur <zash@zash.se>
parents: 8468
diff changeset
178 return label(self);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
179 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
180 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
181
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
182 function ip_methods:precedence()
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
183 if self.proto == "IPv4" then
8469
52d48cea1f60 util.ip: Remove redundant caching of method output (supposed to be done in ab9ddfb03d4d but lost somehow)
Kim Alvefur <zash@zash.se>
parents: 8468
diff changeset
184 return precedence(self.toV4mapped);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
185 else
8469
52d48cea1f60 util.ip: Remove redundant caching of method output (supposed to be done in ab9ddfb03d4d but lost somehow)
Kim Alvefur <zash@zash.se>
parents: 8468
diff changeset
186 return precedence(self);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
187 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
188 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
189
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
190 function ip_methods:scope()
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
191 if self.proto == "IPv4" then
8469
52d48cea1f60 util.ip: Remove redundant caching of method output (supposed to be done in ab9ddfb03d4d but lost somehow)
Kim Alvefur <zash@zash.se>
parents: 8468
diff changeset
192 return v4scope(self);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
193 else
8469
52d48cea1f60 util.ip: Remove redundant caching of method output (supposed to be done in ab9ddfb03d4d but lost somehow)
Kim Alvefur <zash@zash.se>
parents: 8468
diff changeset
194 return v6scope(self);
4419
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
195 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
196 end
b1e49cc314cb util.ip: New module containing IP related functions
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
197
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
198 local rfc1918_8 = new_ip("10.0.0.0");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
199 local rfc1918_12 = new_ip("172.16.0.0");
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
200 local rfc1918_16 = new_ip("192.168.0.0");
8439
293dbb08427b util.ip: Add CGNAT network range reserved in RFC 6598
Kim Alvefur <zash@zash.se>
parents: 8438
diff changeset
201 local rfc6598 = new_ip("100.64.0.0");
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
202
5588
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
203 function ip_methods:private()
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
204 local private = self.scope ~= 0xE;
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
205 if not private and self.proto == "IPv4" then
9955
c74c89a96cbf util.ip: Add missing netmask for 192.168/16 range (fixes #1343)
Kim Alvefur <zash@zash.se>
parents: 8469
diff changeset
206 return match(self, rfc1918_8, 8) or match(self, rfc1918_12, 12) or match(self, rfc1918_16, 16) or match(self, rfc6598, 10);
5588
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
207 end
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
208 return private;
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
209 end
8c1a3243d16f util.ip: Add 'private' method/property to determine whether an IP address is generally expected to be internet-routeable (YMMV)
Matthew Wild <mwild1@gmail.com>
parents: 5587
diff changeset
210
5603
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
211 local function parse_cidr(cidr)
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
212 local bits;
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
213 local ip_len = cidr:find("/", 1, true);
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
214 if ip_len then
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
215 bits = tonumber(cidr:sub(ip_len+1, -1));
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
216 cidr = cidr:sub(1, ip_len-1);
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
217 end
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
218 return new_ip(cidr), bits;
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
219 end
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
220
8435
47195f035d2f util.ip: Instantiate various addresses used for comparisons once
Kim Alvefur <zash@zash.se>
parents: 8434
diff changeset
221 function match(ipA, ipB, bits)
8438
499663bd0122 util.ip: Do exact match for longer bit counts than available
Kim Alvefur <zash@zash.se>
parents: 8437
diff changeset
222 if not bits or bits >= 128 or ipB.proto == "IPv4" and bits >= 32 then
8437
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
223 return ipA == ipB;
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
224 elseif bits < 1 then
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
225 return true;
5603
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
226 end
8437
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
227 if ipA.proto ~= ipB.proto then
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
228 if ipA.proto == "IPv4" then
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
229 ipA = ipA.toV4mapped;
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
230 elseif ipB.proto == "IPv4" then
8468
5bfe58539b6c util.ip: Convert the correct IP to IPv6-mapped for comparison (fixes traceback, possibly invalid result)
Kim Alvefur <zash@zash.se>
parents: 8441
diff changeset
231 ipB = ipB.toV4mapped;
8437
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
232 bits = bits + (128 - 32);
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
233 end
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
234 end
021129f7b0a3 util.ip: Do CIDR matching by comparing all bits at once instead of using O(n) function
Kim Alvefur <zash@zash.se>
parents: 8436
diff changeset
235 return ipA.bits:sub(1, bits) == ipB.bits:sub(1, bits);
5603
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
236 end
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
237
8429
b3562a1b1caa util.ip: Reflow module export table
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
238 return {
b3562a1b1caa util.ip: Reflow module export table
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
239 new_ip = new_ip,
5603
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
240 commonPrefixLength = commonPrefixLength,
e07f4f02e4f9 util.ip: Add CIDR notation parsing and matching
Matthew Wild <mwild1@gmail.com>
parents: 5599
diff changeset
241 parse_cidr = parse_cidr,
8429
b3562a1b1caa util.ip: Reflow module export table
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
242 match = match,
b3562a1b1caa util.ip: Reflow module export table
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
243 };