|
2 | 2 | :IP6, :IP4 = require"ipparse.l2.ethernet".proto |
3 | 3 | :ip6, :ip62s, :s2ip6, :net62s, :s2net6 = require"ipparse.l3.ip6" |
4 | 4 | :ip4, :ip42s, :s2ip4, :net42s, :s2net4 = require"ipparse.l3.ip4" |
5 | | -su = string.unpack |
| 5 | +:sub, unpack: su = string |
6 | 6 |
|
7 | 7 | get_version = (off) => -- Accepts data string; returns IP version |
8 | 8 | su("B", @, off) >> 4 |
@@ -38,26 +38,24 @@ net2s = => -- Accepts data string; returns subnet as readable string. |
38 | 38 | s2net = => -- Accepts readable string; retuns subnet as data string |
39 | 39 | (@match":" and s2net6 or @match"%." and s2net4) @ |
40 | 40 |
|
41 | | -contains_subnet = (subnet) => -- Accepts 2 data strings; checks whether net @ contains subnet |
42 | | - return false if #@ ~= #subnet |
43 | | - nmask = su "B", @ |
44 | | - smask = su "B", subnet |
45 | | - return false if nmask > smask |
46 | | - fmt, shft = "c#{nmask >> 3}", 8 - (nmask & 0x7) |
47 | | - nbytes, nbits = su fmt, @, 2 |
48 | | - sbytes, sbits = su fmt, subnet, 2 |
49 | | - return true if nbytes == sbytes and (nbits >> shft) == (sbits >> shft) |
50 | | - false |
51 | | - |
52 | | -contains_ip = (i) => -- Accepts 2 data strings; checks whether net @ contains ip |
53 | | - return false if #@ ~= #i+1 |
54 | | - nmask = su "B", @ |
55 | | - fmt, shft = "c#{nmask >> 3}", 8 - (nmask & 0x7) |
| 41 | +contains_ip = (i, nmask) => -- Accepts 2 data strings; checks whether net @ contains ip |
| 42 | + if not nmask |
| 43 | + return false if #@ ~= #i+1 |
| 44 | + nmask = su "B", @ |
| 45 | + return sub(@, 2) == i if nmask == 128 |
| 46 | + fmt, shft = "c#{nmask >> 3}B", 8 - (nmask & 0x7) |
56 | 47 | nbytes, nbits = su fmt, @, 2 |
57 | 48 | sbytes, sbits = su fmt, i |
58 | 49 | return true if nbytes == sbytes and (nbits >> shft) == (sbits >> shft) |
59 | 50 | false |
60 | 51 |
|
| 52 | +contains_subnet = (subnet) => -- Accepts 2 data strings; checks whether net @ contains subnet |
| 53 | + return false if #@ ~= #subnet |
| 54 | + nmask, smask = su("B", @), su("B", subnet) |
| 55 | + return false if nmask > smask |
| 56 | + return @ == subnet if nmask == smask |
| 57 | + contains_ip @, sub(subnet, 2), nmask |
| 58 | + |
61 | 59 | proto = |
62 | 60 | ICMP: 0x01 |
63 | 61 | TCP: 0x06 |
|
0 commit comments