Skip to content

Commit 3ebd22b

Browse files
authored
Merge pull request #278 from ldx/issue260_fix
Apply subnet mask to IP address - issue260
2 parents 5339990 + d788d71 commit 3ebd22b

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

iptc/ip4tc.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,9 +1064,6 @@ def set_src(self, src):
10641064
saddr = _a_to_i(socket.inet_pton(socket.AF_INET, addr))
10651065
except socket.error:
10661066
raise ValueError("invalid address %s" % (addr))
1067-
ina = in_addr()
1068-
ina.s_addr = ct.c_uint32(saddr)
1069-
self.entry.ip.src = ina
10701067

10711068
if not netm.isdigit():
10721069
try:
@@ -1080,8 +1077,11 @@ def set_src(self, src):
10801077
nmask = socket.htonl((2 ** imask - 1) << (32 - imask))
10811078
neta = in_addr()
10821079
neta.s_addr = ct.c_uint32(nmask)
1083-
10841080
self.entry.ip.smsk = neta
1081+
# Apply subnet mask to IP address
1082+
ina = in_addr()
1083+
ina.s_addr = ct.c_uint32(saddr & nmask)
1084+
self.entry.ip.src = ina
10851085

10861086
src = property(get_src, set_src)
10871087
"""This is the source network address with an optional network mask in
@@ -1125,9 +1125,6 @@ def set_dst(self, dst):
11251125
daddr = _a_to_i(socket.inet_pton(socket.AF_INET, addr))
11261126
except socket.error:
11271127
raise ValueError("invalid address %s" % (addr))
1128-
ina = in_addr()
1129-
ina.s_addr = ct.c_uint32(daddr)
1130-
self.entry.ip.dst = ina
11311128

11321129
if not netm.isdigit():
11331130
try:
@@ -1142,6 +1139,10 @@ def set_dst(self, dst):
11421139
neta = in_addr()
11431140
neta.s_addr = ct.c_uint32(nmask)
11441141
self.entry.ip.dmsk = neta
1142+
# Apply subnet mask to IP address
1143+
ina = in_addr()
1144+
ina.s_addr = ct.c_uint32(daddr & nmask)
1145+
self.entry.ip.dst = ina
11451146

11461147
dst = property(get_dst, set_dst)
11471148
"""This is the destination network address with an optional network mask

tests/test_iptc.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -620,13 +620,13 @@ def tearDown(self):
620620
def test_rule_address(self):
621621
# valid addresses
622622
rule = iptc.Rule()
623-
for addr in [("127.0.0.1/255.255.255.0", "127.0.0.1/255.255.255.0"),
624-
("!127.0.0.1/255.255.255.0", "!127.0.0.1/255.255.255.0"),
625-
("127.0.0.1/255.255.128.0", "127.0.0.1/255.255.128.0"),
626-
("127.0.0.1/16", "127.0.0.1/255.255.0.0"),
627-
("127.0.0.1/24", "127.0.0.1/255.255.255.0"),
628-
("127.0.0.1/17", "127.0.0.1/255.255.128.0"),
629-
("!127.0.0.1/17", "!127.0.0.1/255.255.128.0")]:
623+
for addr in [("127.0.0.1/255.255.255.0", "127.0.0.0/255.255.255.0"),
624+
("!127.0.0.1/255.255.255.0", "!127.0.0.0/255.255.255.0"),
625+
("127.0.0.1/255.255.128.0", "127.0.0.0/255.255.128.0"),
626+
("127.0.0.1/16", "127.0.0.0/255.255.0.0"),
627+
("127.0.0.1/24", "127.0.0.0/255.255.255.0"),
628+
("127.0.0.1/17", "127.0.0.0/255.255.128.0"),
629+
("!127.0.0.1/17", "!127.0.0.0/255.255.128.0")]:
630630
rule.src = addr[0]
631631
self.assertEquals(rule.src, addr[1])
632632
rule.dst = addr[0]

0 commit comments

Comments
 (0)