ptf/sairoute.py (1,042 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 RIF tests """ from sai_thrift.sai_headers import * from ptf.testutils import * from ptf.packet import * from ptf.thriftutils import * from sai_base_test import * class multipleRoutesTest(PlatformSaiHelper): ''' Verify forwarding with multiple route to the same nhop. ''' def setUp(self): super(multipleRoutesTest, self).setUp() def runTest(self): print("multipleRoutesTest") dmac = '00:11:22:33:44:55' neighbor_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry, dst_mac_address=dmac) nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, route_entry1, next_hop_id=nhop1) route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.2/32')) sai_thrift_create_route_entry(self.client, route_entry2, next_hop_id=nhop1) pkt1 = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) pkt2 = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt1 = simple_tcp_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) exp_pkt2 = simple_tcp_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt1) verify_packet(self, exp_pkt1, self.dev_port10) print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt2) verify_packet(self, exp_pkt2, self.dev_port10) finally: sai_thrift_remove_route_entry(self.client, route_entry1) sai_thrift_remove_route_entry(self.client, route_entry2) sai_thrift_remove_next_hop(self.client, nhop1) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry) def tearDown(self): super(multipleRoutesTest, self).tearDown() class dropRouteTest(PlatformSaiHelper): ''' Verify drop route. ''' def setUp(self): super(dropRouteTest, self).setUp() def runTest(self): print("dropRouteTest") dmac = '00:11:22:33:44:55' neighbor_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry, dst_mac_address=dmac) nhop = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry( self.client, route_entry, next_hop_id=nhop, packet_action=SAI_PACKET_ACTION_TRAP) pkt = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) try: pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) finally: sai_thrift_remove_route_entry(self.client, route_entry) sai_thrift_remove_next_hop(self.client, nhop) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry) def tearDown(self): super(dropRouteTest, self).tearDown() class routeUpdateTest(PlatformSaiHelper): ''' Verify correct forwarding after route update. ''' def setUp(self): super(routeUpdateTest, self).setUp() def runTest(self): print("routeUpdateTest") dmac = '00:11:22:33:44:55' dmac2 = '00:11:22:33:44:66' neighbor_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry, dst_mac_address=dmac) nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=nhop1) pkt = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) exp_pkt2 = simple_tcp_packet( eth_dst='00:11:22:33:44:66', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) print("Updating route nexthop to different nexthop") neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('10.10.10.3')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry2, dst_mac_address=dmac2) nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.3'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) sai_thrift_set_route_entry_attribute(self.client, route_entry, next_hop_id=nhop2) print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt2, self.dev_port10) print("Updating route nexthop to drop nexthop") sai_thrift_set_route_entry_attribute( self.client, route_entry, packet_action=SAI_PACKET_ACTION_DROP) print("Sending packet on port %d, drop" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=3) print("Updating route nexthop to regular nexthop") sai_thrift_set_route_entry_attribute( self.client, route_entry, packet_action=SAI_PACKET_ACTION_FORWARD) print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt2, self.dev_port10) print("Updating route nexthop to CPU nexthop") sai_thrift_set_route_entry_attribute( self.client, route_entry, packet_action=SAI_PACKET_ACTION_TRAP) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) print("Updating route nexthop to regular nexthop") sai_thrift_set_route_entry_attribute( self.client, route_entry, packet_action=SAI_PACKET_ACTION_FORWARD) print("Sending packet on port %d, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt2, self.dev_port10) finally: sai_thrift_remove_route_entry(self.client, route_entry) sai_thrift_remove_next_hop(self.client, nhop1) sai_thrift_remove_next_hop(self.client, nhop2) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry2) def tearDown(self): super(routeUpdateTest, self).tearDown() class routeIngressRifTest(PlatformSaiHelper): ''' Verify forwarding to ingress rif. ''' def setUp(self): super(routeIngressRifTest, self).setUp() def runTest(self): print("routeIngressRifTest") dmac = '00:11:22:33:44:55' neighbor_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry, dst_mac_address=dmac) nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=nhop1) pkt = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending packet on port %d, forward" % self.dev_port10) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port10) finally: sai_thrift_remove_route_entry(self.client, route_entry) sai_thrift_remove_next_hop(self.client, nhop1) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry) def tearDown(self): super(routeIngressRifTest, self).tearDown() class emptyECMPGroupTest(PlatformSaiHelper): ''' Verify drop on empty ECMP group. ''' def setUp(self): super(emptyECMPGroupTest, self).setUp() def runTest(self): print("emptyECMPGroupTest") nhop_group = sai_thrift_create_next_hop_group( self.client, type=SAI_NEXT_HOP_GROUP_TYPE_ECMP) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=nhop_group) pkt = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) try: print("Sending packet on port %d, drop" % self.dev_port10) send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=3) finally: sai_thrift_remove_route_entry(self.client, route_entry) sai_thrift_remove_next_hop_group(self.client, nhop_group) def tearDown(self): super(emptyECMPGroupTest, self).tearDown() class sviNeighborTest(PlatformSaiHelper): ''' Function verifying correct SVI neighbor forwarding. ''' def setUp(self): super(sviNeighborTest, self).setUp() def runTest(self): print("sviNeighborTest") port24_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port24, type=SAI_BRIDGE_PORT_TYPE_PORT) port25_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port25, type=SAI_BRIDGE_PORT_TYPE_PORT) port26_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port26, type=SAI_BRIDGE_PORT_TYPE_PORT) # vlan100 with members port24, port25 and port26 vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) vlan_member100 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=port24_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member101 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=port25_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_port_attribute(self.client, self.port24, port_vlan_id=100) sai_thrift_set_port_attribute(self.client, self.port25, port_vlan_id=100) sai_thrift_set_port_attribute(self.client, self.port26, port_vlan_id=100) # create vlan100_rif vlan100_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=vlan100) dmac1 = '00:11:22:33:44:55' dmac2 = '00:22:22:33:44:55' dmac3 = '00:33:22:33:44:55' # create nhop1, nhop2 & nhop3 on SVI neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=vlan100_rif, ip_address=sai_ipaddress('10.10.0.1')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry1, dst_mac_address=dmac1) nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.1'), router_interface_id=vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, route_entry1, next_hop_id=nhop1) neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=vlan100_rif, ip_address=sai_ipaddress('10.10.0.2')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry2, dst_mac_address=dmac2) nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.2'), router_interface_id=vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.2/32')) sai_thrift_create_route_entry(self.client, route_entry2, next_hop_id=nhop2) neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=vlan100_rif, ip_address=sai_ipaddress('10.10.0.3')) sai_thrift_create_neighbor_entry(self.client, neighbor_entry3, dst_mac_address=dmac3) nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.3'), router_interface_id=vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry3 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.3/32')) sai_thrift_create_route_entry(self.client, route_entry3, next_hop_id=nhop3) pkt = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry1 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=dmac1, bv_id=vlan100) sai_thrift_create_fdb_entry( self.client, fdb_entry1, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=port24_bp, packet_action=mac_action) fdb_entry2 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=dmac2, bv_id=vlan100) sai_thrift_create_fdb_entry( self.client, fdb_entry2, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=port25_bp, packet_action=mac_action) fdb_entry3 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=dmac3, bv_id=vlan100) sai_thrift_create_fdb_entry( self.client, fdb_entry3, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=port26_bp, packet_action=mac_action) print("Sending packet port %d to port %d " % (self.dev_port10, self.dev_port24) + "(192.168.0.1 -> 10.10.10.1) Routed") send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) sai_thrift_remove_fdb_entry(self.client, fdb_entry3) sai_thrift_remove_fdb_entry(self.client, fdb_entry2) sai_thrift_remove_fdb_entry(self.client, fdb_entry1) finally: sai_thrift_remove_route_entry(self.client, route_entry3) sai_thrift_remove_route_entry(self.client, route_entry2) sai_thrift_remove_route_entry(self.client, route_entry1) sai_thrift_remove_next_hop(self.client, nhop3) sai_thrift_remove_next_hop(self.client, nhop2) sai_thrift_remove_next_hop(self.client, nhop1) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry3) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry2) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry1) sai_thrift_remove_router_interface(self.client, vlan100_rif) sai_thrift_set_port_attribute(self.client, self.port24, port_vlan_id=0) sai_thrift_set_port_attribute(self.client, self.port25, port_vlan_id=0) sai_thrift_set_port_attribute(self.client, self.port26, port_vlan_id=0) sai_thrift_remove_vlan_member(self.client, vlan_member102) sai_thrift_remove_vlan_member(self.client, vlan_member101) sai_thrift_remove_vlan_member(self.client, vlan_member100) sai_thrift_remove_vlan(self.client, vlan100) sai_thrift_remove_bridge_port(self.client, port26_bp) sai_thrift_remove_bridge_port(self.client, port25_bp) sai_thrift_remove_bridge_port(self.client, port24_bp) def tearDown(self): super(sviNeighborTest, self).tearDown() class cpuForwardTest(PlatformSaiHelper): ''' Function verifying forwading to CPU. ''' def setUp(self): super(cpuForwardTest, self).setUp() def runTest(self): print("cpuForwardTest") cpu_port = sai_thrift_get_switch_attribute(self.client, cpu_port=True)['cpu_port'] route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=cpu_port) pkt = simple_tcp_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) try: print("Sending packet on port %d, drop" % self.dev_port0) send_packet(self, self.dev_port0, pkt) verify_no_other_packets(self, timeout=3) print("Creating hostif trap for IP2ME") trap_group = sai_thrift_create_hostif_trap_group( self.client, admin_state=True, queue=4) trap = sai_thrift_create_hostif_trap( self.client, trap_group=trap_group, trap_type=SAI_HOSTIF_TRAP_TYPE_IP2ME, packet_action=SAI_PACKET_ACTION_TRAP) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) print("Sending packet on port %d, forward to CPU" % self.dev_port10) send_packet(self, self.dev_port10, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) finally: sai_thrift_remove_route_entry(self.client, route_entry) sai_thrift_remove_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) def tearDown(self): super(cpuForwardTest, self).tearDown() class RemoveAddNeighborTest(PlatformSaiHelper): """ Verifies if IPv4 host route is not created according to SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE attribute value """ def setUp(self): """ Set up test. """ super(RemoveAddNeighborTest, self).setUp() self.ipv4_addr = "10.1.1.10" self.mac_addr = "00:10:10:10:10:10" self.lag_dev_ports = [self.dev_port17,self.dev_port18,self.dev_port19] self.nbr_entry_v4 = sai_thrift_neighbor_entry_t( rif_id=self.lag4_rif, ip_address=sai_ipaddress(self.ipv4_addr)) status = sai_thrift_create_neighbor_entry( self.client, self.nbr_entry_v4, dst_mac_address=self.mac_addr) self.assertEqual(status, SAI_STATUS_SUCCESS) self.net_route = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(self.ipv4_addr+'/32')) sai_thrift_create_route_entry( self.client, self.net_route, next_hop_id=self.lag4_rif) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) def RemoveAddNeighborTestV4(self): ''' Check the config, make sure the CPU queue0 is created and neighbor(NO_HOST_ROUTE=True) for LAGs already created Create route interface for LAG1:rifx Create a route for DIP:10.1.1.10/32 through the new rifx Send packet for DIP:10.1.1.10 DMAC: SWITCH_MAC on port5 verify packet received with SMAC: SWITCH_MAC SIP 192.168.0.1 DIP:10.1.1.10 on one of LAG1 member Delete the neighbor for IP:10.1.1.10 Send packet for DIP:10.1.1.10 DMAC: SWITCH_MAC on port5 Verify no packet on any port Verify the CPU queue0 get one more item Add the neighbor for IP:10.1.1.10 on LAG1 again Send packet for DIP:10.1.1.10 DMAC: SWITCH_MAC on port5 verify packet received with SMAC: SWITCH_MAC SIP 192.168.0.1 DIP:10.1.1.10 on one of LAG1 member ''' print("\nRemoveAddNeighborTest()") print("Sending IPv4 packet when host route not exists") pkt = simple_udp_packet(eth_dst=ROUTER_MAC, ip_dst=self.ipv4_addr, ip_ttl=64) exp_pkt = simple_udp_packet(eth_dst=self.mac_addr, eth_src=ROUTER_MAC, ip_dst=self.ipv4_addr, ip_ttl=63) send_packet(self, self.dev_port10, pkt) verify_packet_any_port(self, exp_pkt, self.lag_dev_ports) sai_thrift_remove_neighbor_entry(self.client, self.nbr_entry_v4) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) pre_cpu_queue_state = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0)[ "SAI_QUEUE_STAT_PACKETS"] send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self) print("Packet dropped") post_cpu_queue_state = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0)[ "SAI_QUEUE_STAT_PACKETS"] self.assertEqual(post_cpu_queue_state - pre_cpu_queue_state, 1) # bug 15205360 above check print(str(post_cpu_queue_state - pre_cpu_queue_state)) sai_thrift_create_neighbor_entry( self.client, self.nbr_entry_v4, dst_mac_address=self.mac_addr) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) send_packet(self, self.dev_port10, pkt) verify_packet_any_port(self, exp_pkt, self.lag_dev_ports) def runTest(self): try: self.RemoveAddNeighborTestV4() finally: pass def tearDown(self): """ TearDown process """ sai_thrift_remove_route_entry(self.client, self.net_route) sai_thrift_remove_neighbor_entry(self.client, self.nbr_entry_v4) super().tearDown() class routeNbrColisionTest(PlatformSaiHelper): ''' Verfies if packet is gleaned to CPU when nexthop id is RIF for cases with and without a neighbor ''' def setUp(self): super(routeNbrColisionTest, self).setUp() def runTest(self): print("routeNbrColisionTest") ip_addr = '10.10.10.1' ip_addr_subnet = '10.10.10.1/32' dmac = '00:11:22:33:44:55' pkt_ip_src = '192.168.0.1' pkt_ip_dst = '10.10.10.1' pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst=pkt_ip_dst, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) exp_pkt1 = simple_tcp_packet(eth_dst=dmac, eth_src=ROUTER_MAC, ip_dst=pkt_ip_dst, ip_src=pkt_ip_src, ip_id=105, ip_ttl=63) print("Creates neighbor with %s ip address, %d router interface id and" " %s destination mac" % (ip_addr, self.port10_rif, dmac)) nbr_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress(ip_addr)) sai_thrift_create_neighbor_entry( self.client, nbr_entry, dst_mac_address=dmac) print("Creates nhop with %s ip address and %d router interface id" % (ip_addr, self.port10_rif)) nhop = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(ip_addr), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) try: print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port11, self.dev_port10, pkt_ip_src, pkt_ip_dst)) send_packet(self, self.dev_port11, pkt) verify_packets(self, exp_pkt1, [self.dev_port10]) print("Creates route with %s ip prefix and %d router interface id" % (ip_addr_subnet, self.port10_rif)) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( ip_addr_subnet)) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=self.port10_rif) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port11, self.dev_port10, pkt_ip_src, pkt_ip_dst)) send_packet(self, self.dev_port11, pkt) verify_packets(self, exp_pkt1, [self.dev_port10]) print("Removes route") sai_thrift_remove_route_entry(self.client, route_entry) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port11, self.dev_port10, pkt_ip_src, pkt_ip_dst)) send_packet(self, self.dev_port11, pkt) verify_packets(self, exp_pkt1, [self.dev_port10]) print("Creates route with %s ip prefix and %d router interface id" % (ip_addr_subnet, self.port10_rif)) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( ip_addr_subnet)) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=self.port10_rif) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port11, self.dev_port10, pkt_ip_src, pkt_ip_dst)) send_packet(self, self.dev_port11, pkt) verify_packets(self, exp_pkt1, [self.dev_port10]) print("Removes neighbor") sai_thrift_remove_neighbor_entry(self.client, nbr_entry) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, glean to cpu" % self.dev_port11) send_packet(self, self.dev_port11, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) print("Creates neighbor with %s ip address, %d router interface id" " and %s destination mac" % (ip_addr, self.port10_rif, dmac)) nbr_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress(ip_addr)) sai_thrift_create_neighbor_entry( self.client, nbr_entry, dst_mac_address=dmac) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port11, self.dev_port10, pkt_ip_src, pkt_ip_dst)) send_packet(self, self.dev_port11, pkt) verify_packets(self, exp_pkt1, [self.dev_port10]) print("Removes route") sai_thrift_remove_route_entry(self.client, route_entry) print("Removes neighbor") sai_thrift_remove_neighbor_entry(self.client, nbr_entry) print("Sending packet on port %d, dropped" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self) print("Creates route with %s ip prefix and %d router interface id" % (ip_addr_subnet, self.port10_rif)) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( ip_addr_subnet)) sai_thrift_create_route_entry(self.client, route_entry, next_hop_id=self.port10_rif) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, glean to cpu" % self.dev_port11) send_packet(self, self.dev_port11, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) print("Creates neighbor with %s ip address, %d router interface id" " and %s destination mac" % (ip_addr, self.port10_rif, dmac)) nbr_entry = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress(ip_addr)) sai_thrift_create_neighbor_entry( self.client, nbr_entry, dst_mac_address=dmac) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port11, self.dev_port10, pkt_ip_src, pkt_ip_dst)) send_packet(self, self.dev_port11, pkt) verify_packets(self, exp_pkt1, [self.dev_port10]) finally: sai_thrift_remove_route_entry(self.client, route_entry) sai_thrift_remove_next_hop(self.client, nhop) sai_thrift_remove_neighbor_entry(self.client, nbr_entry) def tearDown(self): super(routeNbrColisionTest, self).tearDown() class L3DirBcastRouteTestHelper(PlatformSaiHelper): ''' Verifies direct broadcast routing ''' def setUp(self): super(L3DirBcastRouteTestHelper, self).setUp() vlan100_id = 100 self.ip_addr1 = '10.10.10.1' self.ip_addr1_subnet = '10.10.10.0/24' self.dmac1 = '00:11:22:33:44:55' self.dir_bcast_ip_addr1 = '10.10.10.255' self.dir_bcast_dmac1 = 'ff:ff:ff:ff:ff:ff' self.ip_addr2 = '20.20.20.1' self.ip_addr2_subnet = '20.20.20.0/24' self.dmac2 = '22:11:22:33:44:55' self.mac_action = SAI_PACKET_ACTION_FORWARD self.port24_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port24, type=SAI_BRIDGE_PORT_TYPE_PORT) self.port25_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port25, type=SAI_BRIDGE_PORT_TYPE_PORT) self.vlan100 = sai_thrift_create_vlan(self.client, vlan_id=vlan100_id) self.vlan100_member1 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=self.port24_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan100_member2 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=self.port25_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_port_attribute(self.client, self.port24, port_vlan_id=vlan100_id) sai_thrift_set_port_attribute(self.client, self.port25, port_vlan_id=vlan100_id) self.fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address=self.dmac1, bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, self.fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=self.mac_action) self.vlan100_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=self.vlan100) def tearDown(self): print("Removes router interface %d" % self.vlan100_rif) sai_thrift_remove_router_interface(self.client, self.vlan100_rif) print("Removes fdb") sai_thrift_remove_fdb_entry(self.client, self.fdb_entry) print("Sets port attributes") sai_thrift_set_port_attribute(self.client, self.port24, port_vlan_id=0) sai_thrift_set_port_attribute(self.client, self.port25, port_vlan_id=0) print("Removes vlan member 1 %d" % self.vlan100_member1) sai_thrift_remove_vlan_member(self.client, self.vlan100_member1) print("Removes vlan member 2 %d" % self.vlan100_member2) sai_thrift_remove_vlan_member(self.client, self.vlan100_member2) print("Removes vlan %d" % self.vlan100) sai_thrift_remove_vlan(self.client, self.vlan100) print("Removes bridge port %d" % self.port24_bp) sai_thrift_remove_bridge_port(self.client, self.port24_bp) print("Removes bridge port %d" % self.port25_bp) sai_thrift_remove_bridge_port(self.client, self.port25_bp) super(L3DirBcastRouteTestHelper, self).tearDown() def trafficTrapTest1(self): """ Verifies the test packets are gleaned to CPU when neighbors don't exist """ try: pkt_ip_src = '192.168.0.1' pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:21', ip_dst=self.ip_addr1, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, glean to cpu" % self.dev_port10) send_packet(self, self.dev_port10, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst=self.ip_addr2, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, glean to cpu" % self.dev_port24) send_packet(self, self.dev_port24, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) finally: pass def trafficTrapTest2(self): """ Verifies the test packets are gleaned to CPU when neighbors don't exist """ try: pkt_ip_src = '192.168.0.1' pkt_ip_dst = '10.10.10.2' pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:21', ip_dst=pkt_ip_dst, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, glean to cpu" % self.dev_port10) send_packet(self, self.dev_port10, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) pkt_ip_dst = '20.20.20.2' pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst=pkt_ip_dst, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet on port %d, glean to cpu" % self.dev_port24) send_packet(self, self.dev_port24, pkt) time.sleep(4) post_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) self.assertEqual( post_stats["SAI_QUEUE_STAT_PACKETS"], pre_stats["SAI_QUEUE_STAT_PACKETS"] + 1) finally: pass def trafficTest(self): """ Verfies if test packets are properly forwarded """ try: pkt_ip_src = '192.168.0.1' # send the test packet(s) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:21', ip_dst=self.ip_addr1, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst=self.dmac1, eth_src=ROUTER_MAC, ip_dst=self.ip_addr1, ip_src=pkt_ip_src, ip_id=105, ip_ttl=63) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port10, self.dev_port24, pkt_ip_src, self.ip_addr1)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst=self.dir_bcast_ip_addr1, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst=self.dir_bcast_dmac1, eth_src=ROUTER_MAC, ip_dst=self.dir_bcast_ip_addr1, ip_src=pkt_ip_src, ip_id=105, ip_ttl=63) print("Sending packet on port %d to port %d and %d, forward from " "%s to %s" % (self.dev_port10, self.dev_port24, self.dev_port25, pkt_ip_src, self.dir_bcast_ip_addr1)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, ports=[self.dev_port24, self.dev_port25]) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:23', ip_dst=self.ip_addr2, ip_src=pkt_ip_src, ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst=self.dmac2, eth_src=ROUTER_MAC, ip_dst=self.ip_addr2, ip_src=pkt_ip_src, ip_id=105, ip_ttl=63) print("Sending packet on port %d to port %d, forward from %s to %s" % (self.dev_port25, self.dev_port10, pkt_ip_src, self.ip_addr2)) send_packet(self, self.dev_port25, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) finally: pass class DirBcastGleanAndForwardTest(L3DirBcastRouteTestHelper): """ Verifies if frame is frowarded to cpu when there is only route without neighbor then if frame is forwarded properly after creating neighbor and nhop """ def setUp(self): super(DirBcastGleanAndForwardTest, self).setUp() def runTest(self): nhop1 = 0 nhop2 = 0 try: # create subnet routes print("Creates route 1 with %s ip prefix and %d router" " interface id" % (self.ip_addr1_subnet, self.vlan100_rif)) route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( self.ip_addr1_subnet)) sai_thrift_create_route_entry(self.client, route_entry1, next_hop_id=self.vlan100_rif) print("Creates route 2 with %s ip prefix and %d router" " interface id" % (self.ip_addr2_subnet, self.port10_rif)) route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(self.ip_addr2_subnet)) sai_thrift_create_route_entry(self.client, route_entry2, next_hop_id=self.port10_rif) self.trafficTrapTest1() self.trafficTrapTest2() # create directed broadcast neighbor on SVI rif print("Creates directed broadcast neighbor with %s ip address, " "%d router interface id and %s destination mac" % (self.dir_bcast_ip_addr1, self.vlan100_rif, self.dir_bcast_dmac1)) nbr_entry0 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress( self.dir_bcast_ip_addr1)) sai_thrift_create_neighbor_entry( self.client, nbr_entry0, dst_mac_address=self.dir_bcast_dmac1) # simulate arp entry add of rif1 and 2 print("Creates neighbor 1 with %s ip address, %d router interface" " id and %s destination mac" % ( self.ip_addr1, self.vlan100_rif, self.dmac1)) nbr_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress(self.ip_addr1)) sai_thrift_create_neighbor_entry( self.client, nbr_entry1, dst_mac_address=self.dmac1) print("Creates nhop 1 with %s ip address and %d router" " interface id" % (self.ip_addr1, self.vlan100_rif)) nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(self.ip_addr1), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) print("Creates neighbor 2 with %s ip address, %d router interface" " id and %s destination mac" % ( self.ip_addr2, self.port10_rif, self.dmac2)) nbr_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress(self.ip_addr2)) sai_thrift_create_neighbor_entry( self.client, nbr_entry2, dst_mac_address=self.dmac2) print("Creates nhop 2 with %s ip address and %d router " "interface id" % (self.ip_addr2, self.port10_rif)) nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(self.ip_addr2), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) self.trafficTest() self.trafficTrapTest2() finally: sai_thrift_remove_route_entry(self.client, route_entry1) sai_thrift_remove_route_entry(self.client, route_entry2) if nhop1: sai_thrift_remove_next_hop(self.client, nhop1) if nhop2: sai_thrift_remove_next_hop(self.client, nhop2) if 'nbr_entry1' in locals(): sai_thrift_remove_neighbor_entry(self.client, nbr_entry1) if 'nbr_entry2' in locals(): sai_thrift_remove_neighbor_entry(self.client, nbr_entry2) if 'nbr_entry0' in locals(): sai_thrift_remove_neighbor_entry(self.client, nbr_entry0) def tearDown(self): super(DirBcastGleanAndForwardTest, self).tearDown() class DirBcastForwardTest(L3DirBcastRouteTestHelper): """ Verifies if frame is forwarded properly when configuration is correct """ def setUp(self): super(DirBcastForwardTest, self).setUp() def runTest(self): nhop1 = 0 nhop2 = 0 try: # simulate arp entry add print("Creates neighbor 1 with %s ip address, %d router interface" "id and %s destination mac" % ( self.ip_addr1, self.vlan100_rif, self.dmac1)) nbr_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress(self.ip_addr1)) sai_thrift_create_neighbor_entry( self.client, nbr_entry1, dst_mac_address=self.dmac1) print("Creates nhop 1 with %s ip address and %d router" "interface id" % (self.ip_addr1, self.vlan100_rif)) nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(self.ip_addr1), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) print("Creates neighbor 2 with %s ip address, %d router interface" "id and %s destination mac" % ( self.ip_addr2, self.port10_rif, self.dmac2)) nbr_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress(self.ip_addr2)) sai_thrift_create_neighbor_entry( self.client, nbr_entry2, dst_mac_address=self.dmac2) print("Creates nhop 2 with %s ip address and %d router" "interface id" % (self.ip_addr2, self.port10_rif)) nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(self.ip_addr2), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) # create directed broadcast neighbor on SVI rif print("Creates directed broadcast neighbor with %s ip address," "%d router interface id and %s destination mac" % (self.dir_bcast_ip_addr1, self.vlan100_rif, self.dir_bcast_dmac1)) nbr_entry0 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress(self.dir_bcast_ip_addr1)) sai_thrift_create_neighbor_entry( self.client, nbr_entry0, dst_mac_address=self.dir_bcast_dmac1) # create subnet routes print("Creates route 1 with %s ipprefix and %d router interface id" % (self.ip_addr1_subnet, self.vlan100_rif)) route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(self.ip_addr1_subnet)) sai_thrift_create_route_entry(self.client, route_entry1, next_hop_id=self.vlan100_rif) print("Creates route 2 with %s ipprefix and %d router interface id" % (self.ip_addr2_subnet, self.port10_rif)) route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(self.ip_addr2_subnet)) sai_thrift_create_route_entry(self.client, route_entry2, next_hop_id=self.port10_rif) self.trafficTest() self.trafficTrapTest2() finally: sai_thrift_remove_route_entry(self.client, route_entry1) sai_thrift_remove_route_entry(self.client, route_entry2) if nhop1: sai_thrift_remove_next_hop(self.client, nhop1) if nhop2: sai_thrift_remove_next_hop(self.client, nhop2) sai_thrift_remove_neighbor_entry(self.client, nbr_entry1) sai_thrift_remove_neighbor_entry(self.client, nbr_entry2) sai_thrift_remove_neighbor_entry(self.client, nbr_entry0) def tearDown(self): super(DirBcastForwardTest, self).tearDown()