ptf/saineighbor.py (324 lines of code) (raw):

# Copyright 2021-present Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Thrift SAI interface Neighbor tests """ from ptf.packet import * from ptf.testutils import * from ptf.thriftutils import * from sai_base_test import * class NeighborAttrIpv6TestHelper(PlatformSaiHelper): """ Neighbor entry attributes IPv6 tests class Configuration +----------+-----------+ | port0 | port0_rif | +----------+-----------+ | port1 | port1_rif | +----------+-----------+ """ def setUp(self): super(NeighborAttrIpv6TestHelper, self).setUp() self.create_routing_interfaces(ports=[0, 1]) self.test_rif = self.port0_rif self.ipv6_addr = "2001:0db8::1:10" self.ll_ipv6_addr = "fe80::10" self.mac_addr = "00:10:10:10:10:10" self.pkt_v6 = simple_udpv6_packet(eth_dst=ROUTER_MAC, ipv6_dst=self.ipv6_addr, ipv6_hlim=64) self.exp_pkt_v6 = simple_udpv6_packet(eth_dst=self.mac_addr, eth_src=ROUTER_MAC, ipv6_dst=self.ipv6_addr, ipv6_hlim=63) self.ll_pkt_v6 = simple_udpv6_packet(eth_dst=ROUTER_MAC, ipv6_dst=self.ll_ipv6_addr, ipv6_hlim=64) def tearDown(self): self.destroy_routing_interfaces() super(NeighborAttrIpv6TestHelper, self).tearDown() class noHostRouteIpv6NeighborTest(NeighborAttrIpv6TestHelper): ''' Verifies if IPv6 host route is not created according to SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE attribute value ''' def setUp(self): super(noHostRouteIpv6NeighborTest, self).setUp() def runTest(self): print("\nnoHostRouteIpv6NeighborTest()") nbr_entry_v6 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv6_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v6, dst_mac_address=self.mac_addr, no_host_route=True) self.assertEqual(status, SAI_STATUS_SUCCESS) try: print("Sending IPv6 packet when host route not exists") send_packet(self, self.dev_port1, self.pkt_v6) verify_no_other_packets(self) print("Packet dropped") finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v6) def tearDown(self): super(noHostRouteIpv6NeighborTest, self).tearDown() class noHostRouteIpv6LinkLocalNeighborTest(NeighborAttrIpv6TestHelper): ''' Verifies if host route is not created for link local IPv6 address irrespective of SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE attribute value ''' def setUp(self): super(noHostRouteIpv6LinkLocalNeighborTest, self).setUp() def runTest(self): print("\nnoHostRouteIpv6LinkLocalNeighborTest()") ll_nbr_entry_1 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ll_ipv6_addr)) status = sai_thrift_create_neighbor_entry( self.client, ll_nbr_entry_1, dst_mac_address=self.mac_addr, no_host_route=True) self.assertEqual(status, SAI_STATUS_SUCCESS) try: print("Sending IPv6 packet - no_host_route was set to True") send_packet(self, self.dev_port1, self.ll_pkt_v6) verify_no_other_packets(self) print("Packet dropped") status = sai_thrift_remove_neighbor_entry( self.client, ll_nbr_entry_1) self.assertEqual(status, SAI_STATUS_SUCCESS) ll_nbr_entry_2 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ll_ipv6_addr)) status = sai_thrift_create_neighbor_entry( self.client, ll_nbr_entry_2, dst_mac_address=self.mac_addr, no_host_route=False) self.assertEqual(status, SAI_STATUS_SUCCESS) print("Sending IPv6 packet - no_host_route was set to False") send_packet(self, self.dev_port1, self.ll_pkt_v6) verify_no_other_packets(self) print("Packet dropped") finally: sai_thrift_remove_neighbor_entry(self.client, ll_nbr_entry_2) def tearDown(self): super(noHostRouteIpv6LinkLocalNeighborTest, self).tearDown() class addHostRouteIpv6NeighborTest(NeighborAttrIpv6TestHelper): ''' Verifies if IPv6 host route is created according to SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE attribute value ''' def setUp(self): super(addHostRouteIpv6NeighborTest, self).setUp() def runTest(self): print("\naddHostRouteIpv6NeighborTest()") nbr_entry_v6 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv6_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v6, dst_mac_address=self.mac_addr, no_host_route=False) self.assertEqual(status, SAI_STATUS_SUCCESS) try: print("Sending IPv6 packet when host route exists") send_packet(self, self.dev_port1, self.pkt_v6) verify_packet(self, self.exp_pkt_v6, self.dev_port0) print("Packet forwarded") finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v6) def tearDown(self): super(addHostRouteIpv6NeighborTest, self).tearDown() class NeighborAttrIpv4TestHelper(PlatformSaiHelper): """ Neighbor entry attributes IPv4 tests class Configuration +----------+-----------+ | port0 | port0_rif | +----------+-----------+ | port1 | port1_rif | +----------+-----------+ """ def setUp(self): super(NeighborAttrIpv4TestHelper, self).setUp() self.create_routing_interfaces(ports=[0, 1]) self.test_rif = self.port0_rif self.ipv4_addr = "10.10.10.1" self.mac_addr = "00:10:10:10:10:10" self.mac_update_addr = "00:22:22:33:44:66" self.pkt_v4 = simple_udp_packet(eth_dst=ROUTER_MAC, ip_dst=self.ipv4_addr, ip_ttl=64) self.exp_pkt_v4 = simple_udp_packet(eth_dst=self.mac_addr, eth_src=ROUTER_MAC, ip_dst=self.ipv4_addr, ip_ttl=63) self.exp_updt_mac_pkt = simple_udp_packet(eth_dst=self.mac_update_addr, eth_src=ROUTER_MAC, ip_dst=self.ipv4_addr, ip_ttl=63) def tearDown(self): self.destroy_routing_interfaces() super(NeighborAttrIpv4TestHelper, self).tearDown() class noHostRouteIpv4NeighborTest(NeighborAttrIpv4TestHelper): ''' Verifies if IPv4 host route is not created according to SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE attribute value ''' def setUp(self): super(noHostRouteIpv4NeighborTest, self).setUp() def runTest(self): print("\nnoHostRouteIpv4NeighborTest()") nbr_entry_v4 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv4_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v4, dst_mac_address=self.mac_addr, no_host_route=True) self.assertEqual(status, SAI_STATUS_SUCCESS) try: print("Sending IPv4 packet when host route not exists") send_packet(self, self.dev_port1, self.pkt_v4) verify_no_other_packets(self) print("Packet dropped") finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v4) def tearDown(self): super(noHostRouteIpv4NeighborTest, self).tearDown() class addHostRouteIpv4NeighborTest(NeighborAttrIpv4TestHelper): ''' Verifies if IPv4 host route is created according to SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE attribute value ''' def setUp(self): super(addHostRouteIpv4NeighborTest, self).setUp() def runTest(self): print("\naddHostRouteIpv4NeighborTest()") nbr_entry_v4 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv4_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v4, dst_mac_address=self.mac_addr, no_host_route=False) self.assertEqual(status, SAI_STATUS_SUCCESS) try: print("Sending IPv4 packet when host route exists") send_packet(self, self.dev_port1, self.pkt_v4) verify_packet(self, self.exp_pkt_v4, self.dev_port0) print("Packet forwarded") finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v4) def tearDown(self): super(addHostRouteIpv4NeighborTest, self).tearDown() class updateNeighborEntryAttributeDstMacAddr(NeighborAttrIpv4TestHelper): ''' Verifies if SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS is updated ''' def setUp(self): super(updateNeighborEntryAttributeDstMacAddr, self).setUp() def runTest(self): print("\nupdateNeighborEntryAttributeDstMacAddr()") nbr_entry_v4 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv4_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v4, dst_mac_address=self.mac_addr) self.assertEqual(status, SAI_STATUS_SUCCESS) try: print("Sending IPv4 packet before updating the destination mac") send_packet(self, self.dev_port1, self.pkt_v4) verify_packet(self, self.exp_pkt_v4, self.dev_port0) print("Packet forwarded") print("Update neighbor to 00:22:22:33:44:66") status = sai_thrift_set_neighbor_entry_attribute( self.client, nbr_entry_v4, dst_mac_address="00:22:22:33:44:66") self.assertEqual(status, SAI_STATUS_SUCCESS) attr = sai_thrift_get_neighbor_entry_attribute( self.client, nbr_entry_v4, dst_mac_address=True) self.assertEqual(attr['dst_mac_address'], '00:22:22:33:44:66') print("Sending IPv4 packet after updating the destination mac") send_packet(self, self.dev_port1, self.pkt_v4) verify_packet(self, self.exp_updt_mac_pkt, self.dev_port0) print("Packet forwarded") finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v4) def tearDown(self): super(updateNeighborEntryAttributeDstMacAddr, self).tearDown() class addNeighborEntryAttrIPv4addrFamily(NeighborAttrIpv4TestHelper): ''' check NeighborEntryAttrIPaddrFamily is SAI_IP_ADDR_FAMILY_IPV4 ''' def setUp(self): super(addNeighborEntryAttrIPv4addrFamily, self).setUp() def runTest(self): print("\naddNeighborEntryAttrIPv4addrFamily()") try: before_ipv4_neighbor_entry = sai_thrift_get_switch_attribute( self.client, available_ipv4_neighbor_entry=True) nbr_entry_v4 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv4_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v4, dst_mac_address=self.mac_addr) self.assertEqual(status, SAI_STATUS_SUCCESS) nbr_entry_v4_1 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress("10.10.10.2")) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v4_1, dst_mac_address="00:22:22:33:44:66") self.assertEqual(status, SAI_STATUS_SUCCESS) nbr_entry_v4_2 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress("10.10.10.3")) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v4_2, dst_mac_address="00:22:22:33:44:88") self.assertEqual(status, SAI_STATUS_SUCCESS) after_ipv4_neighbor_entry = sai_thrift_get_switch_attribute( self.client, available_ipv4_neighbor_entry=True) available_ipv4_entries = before_ipv4_neighbor_entry[ 'available_ipv4_neighbor_entry'] - after_ipv4_neighbor_entry[ 'available_ipv4_neighbor_entry'] print("available_ipv4_entries: ", available_ipv4_entries) self.assertEqual(available_ipv4_entries, 3) finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v4) sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v4_1) sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v4_2) def tearDown(self): super(addNeighborEntryAttrIPv4addrFamily, self).tearDown() class addNeighborEntryAttrIPv6addrFamily(NeighborAttrIpv6TestHelper): ''' check NeighborEntryAttrIPaddrFamily is SAI_IP_ADDR_FAMILY_IPV6 ''' def setUp(self): super(addNeighborEntryAttrIPv6addrFamily, self).setUp() def runTest(self): print("\naddNeighborEntryAttrIPv6addrFamily()") try: before_ipv6_neighbor_entry = sai_thrift_get_switch_attribute( self.client, available_ipv6_neighbor_entry=True) nbr_entry_v6 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress(self.ipv6_addr)) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v6, dst_mac_address=self.mac_addr) self.assertEqual(status, SAI_STATUS_SUCCESS) nbr_entry_v6_1 = sai_thrift_neighbor_entry_t( rif_id=self.test_rif, ip_address=sai_ipaddress("2001:0db8::1:11")) status = sai_thrift_create_neighbor_entry( self.client, nbr_entry_v6_1, dst_mac_address="00:22:22:33:44:66") self.assertEqual(status, SAI_STATUS_SUCCESS) after_ipv6_neighbor_entry = sai_thrift_get_switch_attribute( self.client, available_ipv6_neighbor_entry=True) available_ipv6_entries = before_ipv6_neighbor_entry[ 'available_ipv6_neighbor_entry'] - after_ipv6_neighbor_entry[ 'available_ipv6_neighbor_entry'] print("available_ipv6_entries: ", available_ipv6_entries) self.assertEqual(available_ipv6_entries, 2) finally: sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v6) sai_thrift_remove_neighbor_entry(self.client, nbr_entry_v6_1) def tearDown(self): super(addNeighborEntryAttrIPv6addrFamily, self).tearDown()