X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_neighbor.py;h=b33a70b2a3c59df8fb3a01ed2010fba051e3a0e4;hb=b31fbc47f5fcf8234c757558d7b0285348774086;hp=2dc27a83b0aa17b8af108f64de80a94ac4a7c6b8;hpb=4ac36bcb190b85e6541d27072157fdcee42bee23;p=vpp.git diff --git a/test/test_neighbor.py b/test/test_neighbor.py index 2dc27a83b0a..b33a70b2a3c 100644 --- a/test/test_neighbor.py +++ b/test/test_neighbor.py @@ -4,11 +4,13 @@ import unittest import os from socket import AF_INET, AF_INET6, inet_pton +from framework import tag_fixme_vpp_workers from framework import VppTestCase, VppTestRunner from vpp_neighbor import VppNeighbor, find_nbr from vpp_ip_route import VppIpRoute, VppRoutePath, find_route, \ - VppIpTable, DpoProto, FibPathType + VppIpTable, DpoProto, FibPathType, VppIpInterfaceAddress from vpp_papi import VppEnum +from vpp_ip import VppIpPuntRedirect import scapy.compat from scapy.packet import Raw @@ -81,6 +83,7 @@ class ARPTestCase(VppTestCase): ether = rx[Ether] self.assertEqual(ether.dst, "ff:ff:ff:ff:ff:ff") self.assertEqual(ether.src, smac) + self.assertEqual(ether.type, 0x0806) arp = rx[ARP] self.assertEqual(arp.hwtype, 1) @@ -97,6 +100,7 @@ class ARPTestCase(VppTestCase): ether = rx[Ether] self.assertEqual(ether.dst, dmac) self.assertEqual(ether.src, smac) + self.assertEqual(ether.type, 0x0806) arp = rx[ARP] self.assertEqual(arp.hwtype, 1) @@ -131,6 +135,7 @@ class ARPTestCase(VppTestCase): ether = rx[Ether] self.assertEqual(ether.dst, dmac) self.assertEqual(ether.src, smac) + self.assertEqual(ether.type, 0x0800) ip = rx[IP] self.assertEqual(ip.src, sip) @@ -140,6 +145,7 @@ class ARPTestCase(VppTestCase): ether = rx[Ether] self.assertEqual(ether.dst, dmac) self.assertEqual(ether.src, smac) + self.assertEqual(ether.type, 0x8847) mpls = rx[MPLS] self.assertTrue(mpls.label, label) @@ -798,9 +804,9 @@ class ARPTestCase(VppTestCase): # # setup a punt redirect so packets from the uplink go to the tap # - self.vapi.ip_punt_redirect(self.pg0.sw_if_index, - self.pg2.sw_if_index, - self.pg0.local_ip4) + redirect = VppIpPuntRedirect(self, self.pg0.sw_if_index, + self.pg2.sw_if_index, self.pg0.local_ip4) + redirect.add_vpp_config() p_tcp = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac,) / @@ -844,6 +850,7 @@ class ARPTestCase(VppTestCase): 'low': self.pg0._local_ip4_subnet, 'hi': self.pg0._local_ip4_bcast}, is_add=0) + redirect.remove_vpp_config() def test_proxy_arp(self): """ Proxy ARP """ @@ -1719,7 +1726,110 @@ class ARPTestCase(VppTestCase): self.pg1.unconfig_ip4() self.pg1.set_table_ip4(0) + def test_glean_src_select(self): + """ Multi Connecteds """ + # + # configure multiple connected subnets on an interface + # and ensure that ARP requests for hosts on those subnets + # pick up the correct source address + # + conn1 = VppIpInterfaceAddress(self, self.pg1, + "10.0.0.1", 24).add_vpp_config() + conn2 = VppIpInterfaceAddress(self, self.pg1, + "10.0.1.1", 24).add_vpp_config() + + p1 = (Ether(src=self.pg0.remote_mac, + dst=self.pg0.local_mac) / + IP(src=self.pg1.remote_ip4, + dst="10.0.0.128") / + Raw(b'0x5' * 100)) + + rxs = self.send_and_expect(self.pg0, [p1], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.0.1", + "10.0.0.128") + + p2 = (Ether(src=self.pg0.remote_mac, + dst=self.pg0.local_mac) / + IP(src=self.pg1.remote_ip4, + dst="10.0.1.128") / + Raw(b'0x5' * 100)) + + rxs = self.send_and_expect(self.pg0, [p2], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.1.1", + "10.0.1.128") + + # + # add a local address in the same subnet + # the source addresses are equivalent. VPP happens to + # choose the last one that was added + conn3 = VppIpInterfaceAddress(self, self.pg1, + "10.0.1.2", 24).add_vpp_config() + + rxs = self.send_and_expect(self.pg0, [p2], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.1.2", + "10.0.1.128") + + # + # remove + # + conn3.remove_vpp_config() + rxs = self.send_and_expect(self.pg0, [p2], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.1.1", + "10.0.1.128") + + # + # add back, this time remove the first one + # + conn3 = VppIpInterfaceAddress(self, self.pg1, + "10.0.1.2", 24).add_vpp_config() + + rxs = self.send_and_expect(self.pg0, [p2], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.1.2", + "10.0.1.128") + + conn1.remove_vpp_config() + rxs = self.send_and_expect(self.pg0, [p2], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.1.2", + "10.0.1.128") + + # apply a connected prefix to an interface in a different table + VppIpRoute(self, "10.0.1.0", 24, + [VppRoutePath("0.0.0.0", + self.pg1.sw_if_index)], + table_id=1).add_vpp_config() + + rxs = self.send_and_expect(self.pg3, [p2], self.pg1) + for rx in rxs: + self.verify_arp_req(rx, + self.pg1.local_mac, + "10.0.1.2", + "10.0.1.128") + + # cleanup + conn3.remove_vpp_config() + conn2.remove_vpp_config() + + +@tag_fixme_vpp_workers class NeighborStatsTestCase(VppTestCase): """ ARP/ND Counters """