X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=test%2Ftest_igmp.py;h=68a3e4e41f3ab9b9d61adbf081a50400ce974bab;hb=99536f4b492478bab66ee8c6b0905a940b8db3c9;hp=253007811be51adab4a13d08d9145a4358491237;hpb=a279d9cf615bd60439085ba103125e6f2fa3b27c;p=vpp.git diff --git a/test/test_igmp.py b/test/test_igmp.py index 253007811be..68a3e4e41f3 100644 --- a/test/test_igmp.py +++ b/test/test_igmp.py @@ -2,7 +2,7 @@ import unittest -from scapy.layers.l2 import Ether +from scapy.layers.l2 import Ether, Raw from scapy.layers.inet import IP, IPOption from scapy.contrib.igmpv3 import IGMPv3, IGMPv3gr, IGMPv3mq, IGMPv3mr @@ -20,6 +20,14 @@ class IgmpMode: class TestIgmp(VppTestCase): """ IGMP Test Case """ + @classmethod + def setUpClass(cls): + super(TestIgmp, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestIgmp, cls).tearDownClass() + def setUp(self): super(TestIgmp, self).setUp() @@ -186,12 +194,15 @@ class TestIgmp(VppTestCase): # # Send a general query (to the all router's address) - # expect VPP to respond with a membership report + # expect VPP to respond with a membership report. + # Pad the query with 0 - some devices in the big wild + # internet are prone to this. # p_g = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) / IP(src=self.pg0.remote_ip4, dst='224.0.0.1', tos=0xc0) / IGMPv3(type="Membership Query", mrcode=100) / - IGMPv3mq(gaddr="0.0.0.0")) + IGMPv3mq(gaddr="0.0.0.0") / + Raw('\x00' * 10)) self.send(self.pg0, p_g) @@ -232,6 +243,19 @@ class TestIgmp(VppTestCase): self.verify_report(capture[0], [IgmpRecord(h1.sg, "Mode Is Include")]) + # + # A group and source specific query that reports more sources + # than the packet actually has. + # + p_gs2 = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) / + IP(src=self.pg0.remote_ip4, dst='239.1.1.1', tos=0xc0, + options=[IPOption(copy_flag=1, optclass="control", + option="router_alert")]) / + IGMPv3(type="Membership Query", mrcode=100) / + IGMPv3mq(gaddr="239.1.1.1", numsrc=4, srcaddrs=["1.1.1.1"])) + + self.send_and_assert_no_replies(self.pg0, p_gs2, timeout=10) + # # A group and source specific query, with the source NOT matching # the source VPP has. There should be no response. @@ -265,7 +289,7 @@ class TestIgmp(VppTestCase): [IgmpRecord(h1.sg, "Mode Is Include")]) # - # Two source and group specific queires in qucik sucession, the + # Two source and group specific queries in quick succession, the # first does not have VPPs source the second does. then vice-versa # self.send(self.pg0, [p_gs2, p_gs1]) @@ -554,7 +578,7 @@ class TestIgmp(VppTestCase): # # resend the join. wait for two queries and then send a current-state - # record to include all sources. this should reset the exiry time + # record to include all sources. this should reset the expiry time # on the sources and thus they will still be present in 2 seconds time. # If the source timer was not refreshed, then the state would have # expired in 3 seconds. @@ -601,7 +625,7 @@ class TestIgmp(VppTestCase): self.assertFalse(self.vapi.igmp_dump()) # - # resend the join, then a leave. Router sends a gruop+source + # resend the join, then a leave. Router sends a group+source # specific query containing both sources # self.send(self.pg0, p_j) @@ -658,7 +682,7 @@ class TestIgmp(VppTestCase): "239.1.1.3", "0.0.0.0", 1)) # - # A 'allow sourcees' for {} should be ignored as it should + # A 'allow sources' for {} should be ignored as it should # never be sent. # p_j = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /