Merge lp:~mpontillo/maas/fix-bogus-mac-in-moved-event--bug-1609194 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: no longer in the source branch.
Merged at revision: 5292
Proposed branch: lp:~mpontillo/maas/fix-bogus-mac-in-moved-event--bug-1609194
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 69 lines (+38/-3)
2 files modified
src/provisioningserver/utils/arp.py (+6/-3)
src/provisioningserver/utils/tests/test_arp.py (+32/-0)
To merge this branch: bzr merge lp:~mpontillo/maas/fix-bogus-mac-in-moved-event--bug-1609194
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+303879@code.launchpad.net

Commit message

Fix bug where ARP parser considers the all-zeroes MAC address to be valid.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) :
review: Needs Information
Revision history for this message
Mike Pontillo (mpontillo) :
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Sounds good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/provisioningserver/utils/arp.py'
2--- src/provisioningserver/utils/arp.py 2016-08-09 00:14:06 +0000
3+++ src/provisioningserver/utils/arp.py 2016-08-25 16:11:01 +0000
4@@ -183,17 +183,20 @@
5 # This is an ARP request.
6 # We can find a binding in the (source_eui, source_ip)
7 source_ip = self.source_ip
8- if int(source_ip) != 0:
9+ source_eui = self.source_eui
10+ if int(source_ip) != 0 and int(source_eui) != 0:
11 yield (source_ip, self.source_eui)
12 elif self.operation == 2:
13 # This is an ARP reply.
14 # We can find a binding in both the (source_eui, source_ip) and
15 # the (target_eui, target_ip).
16 source_ip = self.source_ip
17+ source_eui = self.source_eui
18 target_ip = self.target_ip
19- if int(source_ip) != 0:
20+ target_eui = self.target_eui
21+ if int(source_ip) != 0 and int(source_eui) != 0:
22 yield (source_ip, self.source_eui)
23- if int(target_ip) != 0:
24+ if int(target_ip) != 0 and int(target_eui) != 0:
25 yield (target_ip, self.target_eui)
26
27 def write(self, out=sys.stdout):
28
29=== modified file 'src/provisioningserver/utils/tests/test_arp.py'
30--- src/provisioningserver/utils/tests/test_arp.py 2016-08-09 00:14:06 +0000
31+++ src/provisioningserver/utils/tests/test_arp.py 2016-08-25 16:11:01 +0000
32@@ -217,6 +217,38 @@
33 self.assertItemsEqual(
34 arp.bindings(), [(IPAddress(pkt_sender_ip), EUI(pkt_sender_mac))])
35
36+ def test__bindings__skips_null_source_eui_for_request(self):
37+ pkt_sender_mac = '00:00:00:00:00:00'
38+ pkt_sender_ip = '192.168.0.1'
39+ pkt_target_ip = '192.168.0.2'
40+ pkt_target_mac = '00:00:00:00:00:00'
41+ arp = ARP(make_arp_packet(
42+ pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac,
43+ op=ARP_OPERATION.REQUEST))
44+ self.assertItemsEqual(arp.bindings(), [])
45+
46+ def test__bindings__skips_null_source_eui_in_reply(self):
47+ pkt_sender_mac = '00:00:00:00:00:00'
48+ pkt_sender_ip = '192.168.0.1'
49+ pkt_target_ip = '192.168.0.2'
50+ pkt_target_mac = '02:03:04:05:06:07'
51+ arp = ARP(make_arp_packet(
52+ pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac,
53+ op=ARP_OPERATION.REPLY))
54+ self.assertItemsEqual(
55+ arp.bindings(), [(IPAddress(pkt_target_ip), EUI(pkt_target_mac))])
56+
57+ def test__bindings__skips_null_target_eui_in_reply(self):
58+ pkt_sender_mac = '01:02:03:04:05:06'
59+ pkt_sender_ip = '192.168.0.1'
60+ pkt_target_ip = '192.168.0.2'
61+ pkt_target_mac = '00:00:00:00:00:00'
62+ arp = ARP(make_arp_packet(
63+ pkt_sender_ip, pkt_sender_mac, pkt_target_ip, pkt_target_mac,
64+ op=ARP_OPERATION.REPLY))
65+ self.assertItemsEqual(
66+ arp.bindings(), [(IPAddress(pkt_sender_ip), EUI(pkt_sender_mac))])
67+
68
69 class TestUpdateBindingsAndGetEvent(MAASTestCase):
70