ptf/sairif.py (7,559 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 """ import binascii from sai_thrift.sai_headers import * from ptf.mask import Mask from ptf.packet import * from ptf.testutils import * from ptf.thriftutils import * from sai_base_test import * @group("draft") class L3InterfaceTestHelper(PlatformSaiHelper): """ This class contains base router interface tests for regular L3 port RIFs """ def setUp(self): super(L3InterfaceTestHelper, self).setUp() self.port10_rif_counter_in = 0 self.port10_rif_counter_out = 0 self.port11_rif_counter_in = 0 self.port11_rif_counter_out = 0 self.port12_rif_counter_out = 0 self.port13_rif_counter_out = 0 self.lag1_rif_counter_in = 0 self.lag1_rif_counter_out = 0 self.port10_rif_counter_out_octects = 0 self.port11_rif_counter_in_octects = 0 dmac1 = '00:11:22:33:44:55' dmac3 = '00:33:22:33:44:55' self.lag1_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.lag1) self.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) self.neighbor_entry1 = 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, self.neighbor_entry1, dst_mac_address=dmac1) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.lag1_rif, ip_address=sai_ipaddress('12.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry3, dst_mac_address=dmac3) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('12.10.10.2'), router_interface_id=self.lag1_rif, type=SAI_NEXT_HOP_TYPE_IP) self.route_entry0 = 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, self.route_entry0, next_hop_id=self.nhop1) self.route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:99aa/128')) sai_thrift_create_route_entry( self.client, self.route_entry1, next_hop_id=self.nhop1) self.route_lag0 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('12.10.10.1/32')) sai_thrift_create_route_entry( self.client, self.route_lag0, next_hop_id=self.nhop3) self.route_lag1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:1122:3344:5566:7788/128')) sai_thrift_create_route_entry( self.client, self.route_lag1, next_hop_id=self.nhop3) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_route_entry(self.client, self.route_lag0) sai_thrift_remove_route_entry(self.client, self.route_lag1) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) sai_thrift_remove_router_interface(self.client, self.lag1_rif) super(L3InterfaceTestHelper, self).tearDown() @group("draft") class Ipv4FibLagTest(L3InterfaceTestHelper): """ Verifies basic forwarding on RIF using LAG and with new lag member and if packet is dropped on ingress port after being removed from LAG """ def setUp(self): super(Ipv4FibLagTest, self).setUp() def runTest(self): print("\nipv4FibLagTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='12.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:33:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='12.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) pkt_lag = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_src='12.10.10.1', ip_id=105, ip_ttl=64) exp_pkt_lag = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_src='12.10.10.1', ip_id=105, ip_ttl=63) print("Sending packet port %d -> lag 1 (192.168.0.1 -> " "12.10.10.1)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port4, self.dev_port10)) send_packet(self, self.dev_port4, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port5, self.dev_port10)) send_packet(self, self.dev_port5, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port6, self.dev_port10)) send_packet(self, self.dev_port6, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d dropped" % self.dev_port24) send_packet(self, self.dev_port24, pkt_lag) verify_no_other_packets(self, timeout=1) lag_member = sai_thrift_create_lag_member( self.client, lag_id=self.lag1, port_id=self.port24) print("Sending packet port %d-> lag 1 (192.168.0.1 -> 12.10.10.1)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6, self.dev_port24]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port4, self.dev_port10)) send_packet(self, self.dev_port4, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port5, self.dev_port10)) send_packet(self, self.dev_port5, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port6, self.dev_port10)) send_packet(self, self.dev_port6, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port24, self.dev_port10)) send_packet(self, self.dev_port24, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 sai_thrift_remove_lag_member(self.client, lag_member) print("Sending packet port %d -> lag 1 (192.168.0.1 -> 12.10.10.1)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port4, self.dev_port10)) send_packet(self, self.dev_port4, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port5, self.dev_port10)) send_packet(self, self.dev_port5, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d (12.10.10.1 -> " "10.10.10.1)" % (self.dev_port6, self.dev_port10)) send_packet(self, self.dev_port6, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d dropped" % self.dev_port24) send_packet(self, self.dev_port24, pkt_lag) verify_no_other_packets(self, timeout=1) def tearDown(self): super(Ipv4FibLagTest, self).tearDown() @group("draft") class Ipv6FibLagTest(L3InterfaceTestHelper): """ Verifies basic IPv6 forwarding on RIF using LAG, with new lag member and if packet is dropped on ingress port after being removed from LAG """ def setUp(self): super(Ipv6FibLagTest, self).setUp() def runTest(self): print("\nipv6FibLagTest()") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_src='2000::1', ipv6_hlim=64) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_src='2000::1', ipv6_hlim=63) pkt_lag = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_hlim=64) exp_pkt_lag = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_hlim=63) print("Sending packet port %d -> lag 1 (2000::1 -> " "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port4, self.dev_port10)) send_packet(self, self.dev_port4, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port5, self.dev_port10)) send_packet(self, self.dev_port5, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port6, self.dev_port10)) send_packet(self, self.dev_port6, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d" % self.dev_port24, " dropped") send_packet(self, self.dev_port24, pkt_lag) verify_no_other_packets(self, timeout=1) lag_member = sai_thrift_create_lag_member( self.client, lag_id=self.lag1, port_id=self.port24) print("Sending packet port %d -> lag 1 (2000::1 -> " "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6, self.dev_port24]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port4, self.dev_port10)) send_packet(self, self.dev_port4, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port5, self.dev_port10)) send_packet(self, self.dev_port5, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port6, self.dev_port10)) send_packet(self, self.dev_port6, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port24, self.dev_port10)) send_packet(self, self.dev_port24, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 sai_thrift_remove_lag_member(self.client, lag_member) print("Sending packet port %d -> lag 1 (2000::1 -> " "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port4, self.dev_port10)) send_packet(self, self.dev_port4, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port5, self.dev_port10)) send_packet(self, self.dev_port5, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d -> port %d " "(1234:5678:9abc:def0:1122:3344:5566:7788 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa" % (self.dev_port6, self.dev_port10)) send_packet(self, self.dev_port6, pkt_lag) verify_packet(self, exp_pkt_lag, self.dev_port10) self.lag1_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port10_rif_counter_out_octects += len(exp_pkt_lag) + 4 print("Sending packet port %d" % self.dev_port24, " dropped") send_packet(self, self.dev_port24, pkt_lag) verify_no_other_packets(self, timeout=1) def tearDown(self): super(Ipv6FibLagTest, self).tearDown() @group("draft") class RifSharedMtuTest(L3InterfaceTestHelper): """ Verifies same MTU value shared between RIF and if MTU check works after deleting and adding another RIF with same MTU value """ def setUp(self): super(RifSharedMtuTest, self).setUp() def runTest(self): print("\nrifSharedMtuTest()") port24_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.port24, admin_v4_state=True) mac_action = SAI_PACKET_ACTION_FORWARD dmac1 = '00:11:22:33:44:66' neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=port24_rif, ip_address=sai_ipaddress('20.10.10.2')) sai_thrift_create_neighbor_entry( self.client, neighbor_entry1, dst_mac_address=dmac1) nhop1 = sai_thrift_create_next_hop(self.client, ip=sai_ipaddress('20.10.10.2'), router_interface_id=port24_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('20.10.10.1/32')) sai_thrift_create_route_entry( self.client, route_entry1, next_hop_id=nhop1) mac_action = SAI_PACKET_ACTION_FORWARD dmac2 = '00:11:22:33:44:77' neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.vlan30_rif, ip_address=sai_ipaddress('30.10.10.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('30.10.10.2'), router_interface_id=self.vlan30_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.10.10.1/32')) sai_thrift_create_route_entry( self.client, route_entry2, next_hop_id=nhop2) fdb_entry = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=dmac2, bv_id=self.vlan30) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port20_bp, packet_action=mac_action) sai_thrift_set_port_attribute( self.client, self.port20, port_vlan_id=30) print("MTU is 200, packet size is 199") sai_thrift_set_router_interface_attribute( self.client, port24_rif, mtu=200) sai_thrift_set_router_interface_attribute( self.client, self.vlan30_rif, mtu=200) try: pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, pktlen=199 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:66', eth_src=ROUTER_MAC, ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63, pktlen=199 + 14) vlan_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='30.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, pktlen=199 + 14) vlan_exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:77', eth_src=ROUTER_MAC, ip_dst='30.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63, pktlen=199 + 14) print("Sending packet port %d -> port %d (192.168.0.1 -> " "20.10.10.1)" % (self.dev_port11, self.dev_port24)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending vlan packet port %d -> vlan 30 (port %d) " "(192.168.0.1 -> 30.10.10.1)" % (self.dev_port11, self.dev_port20)) send_packet(self, self.dev_port11, vlan_pkt) verify_packet(self, vlan_exp_pkt, self.dev_port20) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(vlan_pkt) + 4 # update mtu on port10_rif print("Setting port24_rif MTU to 190") sai_thrift_set_router_interface_attribute( self.client, port24_rif, mtu=190) print("Sending packet port %d, droppped" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending vlan packet port %d -> vlan 30 (port %d) " "(192.168.0.1 -> 30.10.10.1)" % (self.dev_port11, self.dev_port20)) send_packet(self, self.dev_port11, vlan_pkt) verify_packet(self, vlan_exp_pkt, self.dev_port20) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(vlan_pkt) + 4 # update mtu on vlan30_rif print("Setting vlan30_rif MTU to 190") sai_thrift_set_router_interface_attribute( self.client, self.vlan30_rif, mtu=190) print("Sending packet port %d, droppped" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending vlan packet port %d, droppped" % self.dev_port11) send_packet(self, self.dev_port11, vlan_pkt) verify_no_other_packets(self, timeout=1) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(vlan_pkt) + 4 # remove port24_rif, vlan30_rif should not be affected print("Removing port24_rif") sai_thrift_remove_route_entry(self.client, route_entry1) sai_thrift_remove_next_hop(self.client, nhop1) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry1) sai_thrift_remove_router_interface(self.client, port24_rif) print("Sending vlan packet port %d, droppped" % self.dev_port11) send_packet(self, self.dev_port11, vlan_pkt) verify_no_other_packets(self, timeout=1) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(vlan_pkt) + 4 print("Adding port24_rif") port24_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.port24, admin_v4_state=True) mac_action = SAI_PACKET_ACTION_FORWARD dmac1 = '00:11:22:33:44:66' neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=port24_rif, ip_address=sai_ipaddress('20.10.10.2')) sai_thrift_create_neighbor_entry( self.client, neighbor_entry1, dst_mac_address=dmac1) nhop1 = sai_thrift_create_next_hop(self.client, ip=sai_ipaddress('20.10.10.2'), router_interface_id=port24_rif, type=SAI_NEXT_HOP_TYPE_IP) route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('20.10.10.1/32')) sai_thrift_create_route_entry( self.client, route_entry1, next_hop_id=nhop1) print("Sending packet port %d -> port %d (192.168.0.1 -> " "20.10.10.1)" % (self.dev_port11, self.dev_port24)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(pkt) + 4 print("Sending vlan packet port %d, droppped" % self.dev_port11) send_packet(self, self.dev_port11, vlan_pkt) verify_no_other_packets(self, timeout=1) self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(vlan_pkt) + 4 finally: sai_thrift_remove_route_entry(self.client, route_entry1) sai_thrift_remove_next_hop(self.client, nhop1) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry1) sai_thrift_remove_router_interface(self.client, port24_rif) sai_thrift_set_port_attribute( self.client, self.port20, port_vlan_id=0) sai_thrift_remove_fdb_entry(self.client, fdb_entry) sai_thrift_remove_route_entry(self.client, route_entry2) sai_thrift_remove_next_hop(self.client, nhop2) sai_thrift_remove_neighbor_entry(self.client, neighbor_entry2) def tearDown(self): super(RifSharedMtuTest, self).tearDown() @group("draft") class McastDisableTest(L3InterfaceTestHelper): """ Verify IPv4 multicast packets are dropped when V4_MCAST_ENABLE or V6_MCAST_ENABLE is set to False """ def setUp(self): super(McastDisableTest, self).setUp() def runTest(self): print("\nmcastDisableTest()") dst_mcast_ip = "225.0.0.1" dst_mcast_ipv6 = "ff11::1111:1" src_ip = "10.10.10.1" src_ipv6 = "2001:0db8::1111" try: ipmc_group = sai_thrift_create_ipmc_group(self.client) rpf_group = sai_thrift_create_rpf_group(self.client) ipmc_group_member1 = sai_thrift_create_ipmc_group_member( self.client, ipmc_group_id=ipmc_group, ipmc_output_id=self.port10_rif) ipmc_group_member2 = sai_thrift_create_ipmc_group_member( self.client, ipmc_group_id=ipmc_group, ipmc_output_id=self.port12_rif) ipmc_group_member3 = sai_thrift_create_ipmc_group_member( self.client, ipmc_group_id=ipmc_group, ipmc_output_id=self.port13_rif) ipmc_entry = sai_thrift_ipmc_entry_t( switch_id=self.switch_id, vr_id=self.default_vrf, type=SAI_IPMC_ENTRY_TYPE_SG, source=sai_ipaddress(src_ip), destination=sai_ipaddress(dst_mcast_ip)) sai_thrift_create_ipmc_entry( self.client, ipmc_entry, packet_action=SAI_PACKET_ACTION_FORWARD, rpf_group_id=rpf_group, output_group_id=ipmc_group) ipmc_entry_v6 = sai_thrift_ipmc_entry_t( switch_id=self.switch_id, vr_id=self.default_vrf, type=SAI_IPMC_ENTRY_TYPE_SG, source=sai_ipaddress(src_ipv6), destination=sai_ipaddress(dst_mcast_ipv6)) sai_thrift_create_ipmc_entry( self.client, ipmc_entry_v6, packet_action=SAI_PACKET_ACTION_FORWARD, rpf_group_id=rpf_group, output_group_id=ipmc_group) mcast_pkt = simple_tcp_packet(eth_dst='01:00:5e:11:22:33', eth_src='00:22:22:22:22:22', ip_dst=dst_mcast_ip, ip_src=src_ip, ip_id=105, ip_ttl=64) print("Enabling IPv4 multicast on port %d" % self.dev_port11) sai_thrift_set_router_interface_attribute( self.client, self.port11_rif, v4_mcast_enable=True) print("Sending IPv4 multicast packet on port %d -> ports " "%d, %d, %d" % (self.dev_port11, self.dev_port10, self.dev_port12, self.dev_port13)) send_packet(self, self.dev_port11, mcast_pkt) verify_packets(self, mcast_pkt, [self.dev_port10, self.dev_port12, self.dev_port13]) print("\tOK") self.port11_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port12_rif_counter_out += 1 self.port13_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(mcast_pkt) + 4 self.port10_rif_counter_out_octects += len(mcast_pkt) + 4 print("Disabling IPv4 multicast on port %d" % self.dev_port11) sai_thrift_set_router_interface_attribute( self.client, self.port11_rif, v4_mcast_enable=False) print("Sending IPv4 multicast packet on port %d" % self.dev_port11) send_packet(self, self.dev_port11, mcast_pkt) verify_no_other_packets(self) print("\tDropped") self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(mcast_pkt) + 4 mcast_pkt_v6 = simple_tcpv6_packet(eth_dst='33:33:00:11:22:33', eth_src='00:22:22:22:22:22', ipv6_dst=dst_mcast_ipv6, ipv6_src=src_ipv6, ipv6_hlim=64) print("Enabling IPv6 multicast on port %d" % self.dev_port11) sai_thrift_set_router_interface_attribute( self.client, self.port11_rif, v6_mcast_enable=True) print("Sending IPv6 multicast packet on port %d -> ports " "%d, %d, %d" % (self.dev_port11, self.dev_port10, self.dev_port12, self.dev_port13)) send_packet(self, self.dev_port11, mcast_pkt_v6) verify_packets(self, mcast_pkt_v6, [self.dev_port10, self.dev_port12, self.dev_port13]) print("\tOK") self.port11_rif_counter_in += 1 self.port10_rif_counter_out += 1 self.port12_rif_counter_out += 1 self.port13_rif_counter_out += 1 self.port11_rif_counter_in_octects += len(mcast_pkt_v6) + 4 self.port10_rif_counter_out_octects += len(mcast_pkt_v6) + 4 print("Disabling IPv6 multicast on port %d" % self.dev_port11) sai_thrift_set_router_interface_attribute( self.client, self.port11_rif, v6_mcast_enable=False) print("Sending IPv6 multicast packet on port %d" % self.dev_port11) send_packet(self, self.dev_port11, mcast_pkt_v6) verify_no_other_packets(self) print("\tDropped") self.port11_rif_counter_in += 1 self.port11_rif_counter_in_octects += len(mcast_pkt_v6) + 4 finally: sai_thrift_remove_ipmc_entry(self.client, ipmc_entry_v6) sai_thrift_remove_ipmc_entry(self.client, ipmc_entry) sai_thrift_remove_ipmc_group_member( self.client, ipmc_group_member3) sai_thrift_remove_ipmc_group_member( self.client, ipmc_group_member2) sai_thrift_remove_ipmc_group_member( self.client, ipmc_group_member1) sai_thrift_remove_rpf_group(self.client, rpf_group) sai_thrift_remove_ipmc_group(self.client, ipmc_group) def tearDown(self): super(McastDisableTest, self).tearDown() @group("draft") class DuplicatePortRifCreationTest(L3InterfaceTestHelper): """ Verifies if duplicate L3 RIF creation fails """ def setUp(self): super(DuplicatePortRifCreationTest, self).setUp() def runTest(self): print("\nduplicatePortRifCreationTest()") existing_rif_port = self.port10 existing_rif_lag = self.lag3 try: print("Trying to create duplicated port RIF") dupl_port_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=existing_rif_port) self.assertFalse(dupl_port_rif != 0) print("Creation failed") print("Trying to create duplicated LAG RIF") dupl_lag_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=existing_rif_lag) self.assertFalse(dupl_lag_rif != 0) print("Creation failed") finally: if dupl_port_rif: sai_thrift_remove_router_interface(self.client, dupl_port_rif) if dupl_lag_rif: sai_thrift_remove_router_interface(self.client, dupl_lag_rif) def tearDown(self): super(DuplicatePortRifCreationTest, self).tearDown() @group("draft") class L3InterfaceSimplifiedTestHelper(PlatformSaiHelper): """ Configuration +----------+-----------+ | port0 | port0_rif | +----------+-----------+ | port1 | port1_rif | +----------+-----------+ """ def setUp(self): super(L3InterfaceSimplifiedTestHelper, self).setUp() dmac1 = '00:11:22:33:44:55' self.create_routing_interfaces(ports=[0, 1]) self.port1_rif_counter_in = 0 self.port0_rif_counter_out = 0 self.port0_rif_counter_out_octects = 0 self.port1_rif_counter_in_octects = 0 self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port0_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.port0_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry1, dst_mac_address=dmac1) self.route_entry0 = 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, self.route_entry0, next_hop_id=self.nhop1) self.route_entry0_lpm = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('11.11.11.0/24')) sai_thrift_create_route_entry( self.client, self.route_entry0_lpm, next_hop_id=self.nhop1) self.route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:99aa/128')) sai_thrift_create_route_entry( self.client, self.route_entry1, next_hop_id=self.nhop1) self.route_entry1_lpm = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('4000::0/65')) sai_thrift_create_route_entry( self.client, self.route_entry1_lpm, next_hop_id=self.nhop1) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_route_entry(self.client, self.route_entry0_lpm) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_route_entry(self.client, self.route_entry1_lpm) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) self.destroy_routing_interfaces() super(L3InterfaceSimplifiedTestHelper, self).tearDown() @group("draft") class MacUpdateTest(L3InterfaceSimplifiedTestHelper): """ Verifies if packet is forwarded correctly after MAC address updated and if packet is dropped for old MAC address after update """ def setUp(self): super(MacUpdateTest, self).setUp() def runTest(self): print("\nMacUpdateTest()") new_router_mac = "00:77:66:55:44:44" pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.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='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) pkt1 = simple_tcp_packet(eth_dst=new_router_mac, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', 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='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) print("Sending packet on port %d with mac %s, forward" % (self.dev_port1, ROUTER_MAC)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 print("Updating src_mac_address to %s" % (new_router_mac)) sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, src_mac_address=new_router_mac) attrs = sai_thrift_get_router_interface_attribute( self.client, self.port1_rif, src_mac_address=True) self.assertEqual(attrs["src_mac_address"], new_router_mac) # still forwarded since rmac is same as switch default rmac print("Sending packet on port %d with mac %s, forwarded" % (self.dev_port1, ROUTER_MAC)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 print("Sending packet on port %d with mac %s, forward" % (self.dev_port1, new_router_mac)) send_packet(self, self.dev_port1, pkt1) verify_packet(self, exp_pkt1, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt1) + 4 self.port0_rif_counter_out_octects += len(exp_pkt1) + 4 print("Reverting src_mac_address to %s" % (ROUTER_MAC)) sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, src_mac_address=ROUTER_MAC) attrs = sai_thrift_get_router_interface_attribute( self.client, self.port1_rif, src_mac_address=True) self.assertEqual(attrs["src_mac_address"], ROUTER_MAC) print("Sending packet on port %d with mac %s, dropped" % (self.dev_port1, new_router_mac)) send_packet(self, self.dev_port1, pkt1) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port1_rif_counter_in_octects += len(pkt1) + 4 print("Sending packet on port %d with mac %s, forward" % (self.dev_port1, ROUTER_MAC)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 def tearDown(self): super(MacUpdateTest, self).tearDown() @group("draft") class Ipv4FibLPMTest(L3InterfaceSimplifiedTestHelper): """ Verifies basic forwarding for IPv4 LPM routes """ def setUp(self): super(Ipv4FibLPMTest, self).setUp() def runTest(self): print("\nipv4FibLPMTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.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='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) print("Sending packet port %d -> port %d (192.168.0.1 -> " "11.11.11.0/24) LPM" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 def tearDown(self): super(Ipv4FibLPMTest, self).tearDown() @group("draft") class Ipv4FibTest(L3InterfaceSimplifiedTestHelper): """ Verifies basic forwarding for IPv4 host """ def setUp(self): super(Ipv4FibTest, self).setUp() def runTest(self): print("\nipv4FibTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.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='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) gre_pkt = ipv4_erspan_pkt(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=0, ip_ttl=64, ip_flags=0x0, version=2, # ERSPAN_III mirror_id=1, sgt_other=4, inner_frame=pkt) exp_gre_pkt = ipv4_erspan_pkt(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=0, ip_ttl=63, ip_flags=0x0, version=2, # ERSPAN_III mirror_id=1, sgt_other=4, inner_frame=pkt) print("Sending packet port %d -> port %d (192.168.0.1 -> " "11.11.11.1)" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 print("Sending gre encapsulated packet port %d -> port %d " "(192.168.0.1 -> 11.11.11.1)" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, gre_pkt) verify_packet(self, exp_gre_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(gre_pkt) + 4 self.port0_rif_counter_out_octects += len(exp_gre_pkt) + 4 def tearDown(self): super(Ipv4FibTest, self).tearDown() @group("draft") class Ipv4DisableTest(L3InterfaceSimplifiedTestHelper): """ Verifies if IPv4 packets are dropped when admin_v4_state is false """ def setUp(self): super(Ipv4DisableTest, self).setUp() def runTest(self): print("\nipv4DisableTest()") 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) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 print("Disable IPv4 on ingress RIF") sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, admin_v4_state=False) time.sleep(3) initial_stats = query_counter( self, sai_thrift_get_port_stats, self.port1) if_in_discards_pre = initial_stats['SAI_PORT_STAT_IF_IN_DISCARDS'] print("Sending packet on port %d, discard" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=3) stats = query_counter( self, sai_thrift_get_port_stats, self.port1) if_in_discards = stats['SAI_PORT_STAT_IF_IN_DISCARDS'] self.assertTrue(if_in_discards_pre + 1 == if_in_discards) self.port1_rif_counter_in += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Enable IPv4 on ingress RIF") sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, admin_v4_state=True) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 def tearDown(self): super(Ipv4DisableTest, self).tearDown() @group("draft") class RifMyIPTest(L3InterfaceSimplifiedTestHelper): """ Verifies if MYIP works for subnet routes """ def setUp(self): super(RifMyIPTest, self).setUp() def runTest(self): print("\nrifMyIPTest()") try: sw_attr = sai_thrift_get_switch_attribute(self.client, cpu_port=True) cpu_port = sw_attr['cpu_port'] ip2me_route = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.20.1/32')) sai_thrift_create_route_entry( self.client, ip2me_route, next_hop_id=cpu_port) myip_trap_group = sai_thrift_create_hostif_trap_group( self.client, admin_state=True, queue=4) myip_trap = sai_thrift_create_hostif_trap( self.client, trap_group=myip_trap_group, packet_action=SAI_PACKET_ACTION_TRAP, trap_type=SAI_HOSTIF_TRAP_TYPE_IP2ME) self.assertTrue(myip_trap != 0) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.20.1', ip_src='30.30.0.1', ip_id=105, ip_ttl=64, pktlen=100) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) print("Sending MYIP packet") send_packet(self, self.dev_port1, 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) print("Forwarded to CPU") finally: sai_thrift_remove_hostif_trap(self.client, myip_trap) sai_thrift_remove_hostif_trap_group(self.client, myip_trap_group) sai_thrift_remove_route_entry(self.client, ip2me_route) def tearDown(self): super(RifMyIPTest, self).tearDown() @group("draft") class Ipv6DisableTest(L3InterfaceSimplifiedTestHelper): """ Verifies if IPv6 packets are dropped when admin_v6_state is False """ def setUp(self): super(Ipv6DisableTest, self).setUp() def runTest(self): print("\nipv6DisableTest()") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 print("Disable IPv6 on ingress RIF") sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, admin_v6_state=False) initial_stats = query_counter( self, sai_thrift_get_port_stats, self.port1) if_in_discards_pre = initial_stats['SAI_PORT_STAT_IF_IN_DISCARDS'] print("Sending packet on port %d, discard" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) stats = query_counter( self, sai_thrift_get_port_stats, self.port1) if_in_discards = stats['SAI_PORT_STAT_IF_IN_DISCARDS'] self.assertTrue(if_in_discards_pre + 1 == if_in_discards) self.port1_rif_counter_in += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Enable IPv6 on ingress RIF") sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, admin_v6_state=True) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 def tearDown(self): super(Ipv6DisableTest, self).tearDown() @group("draft") class Ipv6FibTest(L3InterfaceSimplifiedTestHelper): """ Verifies basic forwarding for IPv6 host """ def setUp(self): super(Ipv6FibTest, self).setUp() def runTest(self): print("\nipv6FibTest()") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63) print("Sending packet port %d -> port %d (2000::1 -> " "1234:5678:9abc:def0:4422:1133:5577:99aa)" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 def tearDown(self): super(Ipv6FibTest, self).tearDown() @group("draft") class Ipv6FibLpmTest(L3InterfaceSimplifiedTestHelper): """ Verifies basic forwarding for IPv6 LPM route """ def setUp(self): super(Ipv6FibLpmTest, self).setUp() def runTest(self): print("\nipv6FibLpmTest()") pkt = simple_tcpv6_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='4000::1', ipv6_src='2000::1', ipv6_hlim=64) exp_pkt = simple_tcpv6_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='4000::1', ipv6_src='2000::1', ipv6_hlim=63) print("Sending packet port %d -> port %d (2000::1 -> 4000::1) " "LPM entry 4000::0/65" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 def tearDown(self): super(Ipv6FibLpmTest, self).tearDown() @group("draft") class L3InterfaceAclTestHelper(PlatformSaiHelper): """ Configuration +----------+-----------+ | port0 | port0_rif | +----------+-----------+ | port1 | port1_rif | +----------+-----------+ """ def setUp(self): super(L3InterfaceAclTestHelper, self).setUp() dmac1 = '00:11:22:33:44:55' self.create_routing_interfaces(ports=[0, 1]) self.port1_rif_counter_in = 0 self.port0_rif_counter_out = 0 self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port0_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.port0_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry1, dst_mac_address=dmac1) self.route_entry0 = 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, self.route_entry0, next_hop_id=self.nhop1) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) self.destroy_routing_interfaces() super(L3InterfaceAclTestHelper, self).tearDown() @group("draft") class Ipv4IngressAclTest(L3InterfaceAclTestHelper): """ Verifies Ingress ACL table and group bind to RIF """ def setUp(self): super(Ipv4IngressAclTest, self).setUp() def runTest(self): print("\nipv4IngressAclTest()") stage = SAI_ACL_STAGE_INGRESS bind_points = [SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE] action_types = [SAI_ACL_ACTION_TYPE_PACKET_ACTION] action_drop = SAI_PACKET_ACTION_DROP dst_ip = '10.10.10.1' dst_ip_mask = '255.255.255.0' acl_bind_point_type_list = sai_thrift_s32_list_t( count=len(bind_points), int32list=bind_points) acl_action_type_list = sai_thrift_s32_list_t( count=len(action_types), int32list=action_types) acl_table = sai_thrift_create_acl_table( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, acl_action_type_list=acl_action_type_list, field_dst_ip=True) packet_action = sai_thrift_acl_action_data_t( parameter=sai_thrift_acl_action_parameter_t(s32=action_drop)) ip_addr = sai_thrift_acl_field_data_t( data=sai_thrift_acl_field_data_data_t(ip4=dst_ip), mask=sai_thrift_acl_field_data_mask_t(ip4=dst_ip_mask)) 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: acl_entry = sai_thrift_create_acl_entry( self.client, table_id=acl_table, action_packet_action=packet_action, field_dst_ip=ip_addr) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, ingress_acl=acl_table) print("Sending packet on port %d, drop" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, ingress_acl=0) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 acl_table_group = sai_thrift_create_acl_table_group( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, type=SAI_ACL_TABLE_GROUP_TYPE_PARALLEL) acl_group_member = sai_thrift_create_acl_table_group_member( self.client, acl_table_group_id=acl_table_group, acl_table_id=acl_table) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, ingress_acl=acl_table_group) print("Sending packet on port %d, drop" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 sai_thrift_set_router_interface_attribute( self.client, self.port1_rif, ingress_acl=0) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 finally: sai_thrift_remove_acl_table_group_member( self.client, acl_group_member) sai_thrift_remove_acl_table_group(self.client, acl_table_group) sai_thrift_remove_acl_entry(self.client, acl_entry) sai_thrift_remove_acl_table(self.client, acl_table) def tearDown(self): super(Ipv4IngressAclTest, self).tearDown() @group("draft") class Ipv4EgressAclTest(L3InterfaceAclTestHelper): # TODO: test requires additional verification """ Verifies Egress ACL table and group bind to RIF """ def setUp(self): super(Ipv4EgressAclTest, self).setUp() def runTest(self): print("\nipv4EgressAclTest()") stage = SAI_ACL_STAGE_EGRESS bind_points = [SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE] action_types = [SAI_ACL_ACTION_TYPE_PACKET_ACTION] action_drop = SAI_PACKET_ACTION_DROP dst_ip = '10.10.10.1' dst_ip_mask = '255.255.255.0' acl_bind_point_type_list = sai_thrift_s32_list_t( count=len(bind_points), int32list=bind_points) acl_action_type_list = sai_thrift_s32_list_t( count=len(action_types), int32list=action_types) acl_table = sai_thrift_create_acl_table( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, acl_action_type_list=acl_action_type_list, field_dst_ip=True) packet_action = sai_thrift_acl_action_data_t( parameter=sai_thrift_acl_action_parameter_t(s32=action_drop)) ip_addr = sai_thrift_acl_field_data_t( data=sai_thrift_acl_field_data_data_t(ip4=dst_ip), mask=sai_thrift_acl_field_data_mask_t(ip4=dst_ip_mask)) 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: acl_entry = sai_thrift_create_acl_entry( self.client, table_id=acl_table, action_packet_action=packet_action, field_dst_ip=ip_addr) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, egress_acl=acl_table) print("Sending packet on port %d, drop" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, egress_acl=0) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 acl_table_group = sai_thrift_create_acl_table_group( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, type=SAI_ACL_TABLE_GROUP_TYPE_PARALLEL) acl_group_member = sai_thrift_create_acl_table_group_member( self.client, acl_table_group_id=acl_table_group, acl_table_id=acl_table) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, egress_acl=acl_table_group) print("Sending packet on port %d, drop" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, egress_acl=0) print("Sending packet on port %d, forward" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 finally: sai_thrift_remove_acl_table_group_member( self.client, acl_group_member) sai_thrift_remove_acl_table_group(self.client, acl_table_group) sai_thrift_remove_acl_entry(self.client, acl_entry) sai_thrift_remove_acl_table(self.client, acl_table) def tearDown(self): super(Ipv4EgressAclTest, self).tearDown() @group("draft") class NegativeRifTest(PlatformSaiHelper): """ Verifies if creating fails when RIF type is port and port_id is 0, if getting, removal and setting of non existent RIF fails and if creating fails with invalid vrf_id """ def setUp(self): super(NegativeRifTest, self).setUp() def runTest(self): print("\nNegativeRifTest()") port0_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.port0, admin_v4_state=True) self.assertTrue(sai_thrift_remove_router_interface( self.client, port0_rif) == 0) self.assertTrue(sai_thrift_remove_router_interface( self.client, port0_rif) != 0) # Non existing RIF rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=port0_rif, mtu=True) self.assertEqual(self.status(), SAI_STATUS_ITEM_NOT_FOUND) self.assertEqual(rif_attr, None) self.assertNotEqual( sai_thrift_set_router_interface_attribute( self.client, router_interface_oid=port0_rif, mtu=200), SAI_STATUS_SUCCESS) rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=port0_rif, mtu=True) self.assertEqual(self.status(), SAI_STATUS_ITEM_NOT_FOUND) self.assertEqual(rif_attr, None) # Incorrect RIF attributes invalid_port = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=-1) self.assertTrue(invalid_port == 0) invalid_vrf = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=-1, port_id=self.port1) self.assertTrue(invalid_vrf == 0) def tearDown(self): super(NegativeRifTest, self).tearDown() @group("draft") class LoopbackRifTest(PlatformSaiHelper): """ Verifies multiple loopback RIF on same VRF is allowed """ def setUp(self): super(LoopbackRifTest, self).setUp() def runTest(self): print("\nLoopbackRifTest()") lbk_rif1 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK, virtual_router_id=self.default_vrf) self.assertTrue(lbk_rif1 != 0) lbk_rif2 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK, virtual_router_id=self.default_vrf) self.assertTrue(lbk_rif2 != 0) self.assertTrue(lbk_rif1 != lbk_rif2) sai_thrift_remove_router_interface(self.client, lbk_rif1) sai_thrift_remove_router_interface(self.client, lbk_rif2) def tearDown(self): super(LoopbackRifTest, self).tearDown() @group("draft") class RifCreateOrUpdateRmacTest(PlatformSaiHelper): """ Verifies RIF can be created or updated with custom rmac """ def setUp(self): super(RifCreateOrUpdateRmacTest, self).setUp() def runTest(self): print("rifCreateOrUpdateRmacTest()") irif = e1_rif = e2_rif = None iport_route = e1_port_route = e2_port_route = None iport_nbor = e1_port_nbor = e2_port_nbor = None iport_nbor_nhop = e1_port_nbor_nhop = e2_port_nbor_nhop = None iport = self.port0 dev_iport = self.dev_port0 iport_nbor_mac = '00:11:ab:ab:ab:ab' iport_ipv4_nbor = '10.1.1.2' iport_ipv4 = '10.1.1.1' e1_port = self.port1 dev_e1_port = self.dev_port1 e1_port_nbor_mac = '00:11:ac:ac:ac:ac' e1_port_ipv4 = '10.2.2.1' e1_port_ipv4_nbor = '10.2.2.2' e2_port = self.port2 dev_e2_port = self.dev_port2 e2_mac = '00:11:dd:dd:dd:dd' e2_new_mac = '00:11:ee:ee:ee:ee' e2_port_nbor_mac = '00:11:ad:ad:ad:ad' e2_port_ipv4 = '10.3.3.1' e2_port_ipv4_nbor = '10.3.3.2' try: irif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=iport, ) self.assertGreater(irif, 0) iport_nbor = sai_thrift_neighbor_entry_t( rif_id=irif, ip_address=sai_ipaddress(iport_ipv4_nbor), ) sai_thrift_create_neighbor_entry( self.client, iport_nbor, dst_mac_address=iport_nbor_mac, ) iport_nbor_nhop = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(iport_ipv4_nbor), router_interface_id=irif, type=SAI_NEXT_HOP_TYPE_IP, ) self.assertGreater(iport_nbor_nhop, 0) iport_route = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(iport_ipv4 + '/24'), ) sai_thrift_create_route_entry( self.client, iport_route, next_hop_id=iport_nbor_nhop, ) e1_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=e1_port, ) self.assertGreater(e1_rif, 0) e1_rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=e1_rif, src_mac_address=True, ) self.assertIsNotNone(e1_rif_attr) src_mac_address = e1_rif_attr.get('src_mac_address') self.assertEqual(src_mac_address, ROUTER_MAC) e1_port_nbor = sai_thrift_neighbor_entry_t( rif_id=e1_rif, ip_address=sai_ipaddress(e1_port_ipv4_nbor), ) sai_thrift_create_neighbor_entry( self.client, e1_port_nbor, dst_mac_address=e1_port_nbor_mac, ) e1_port_nbor_nhop = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(e1_port_ipv4_nbor), router_interface_id=e1_rif, type=SAI_NEXT_HOP_TYPE_IP, ) self.assertGreater(e1_port_nbor_nhop, 0) e1_port_route = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(e1_port_ipv4 + '/24'), ) sai_thrift_create_route_entry( self.client, e1_port_route, next_hop_id=e1_port_nbor_nhop, ) e2_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=e2_port, src_mac_address=e2_mac, ) self.assertGreater(e2_rif, 0) e2_rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=e2_rif, src_mac_address=True, ) self.assertIsNotNone(e2_rif_attr) src_mac_address = e2_rif_attr.get('src_mac_address') self.assertEqual(src_mac_address, e2_mac) e2_port_nbor = sai_thrift_neighbor_entry_t( rif_id=e2_rif, ip_address=sai_ipaddress(e2_port_ipv4_nbor), ) sai_thrift_create_neighbor_entry( self.client, e2_port_nbor, dst_mac_address=e2_port_nbor_mac, ) e2_port_nbor_nhop = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress(e2_port_ipv4_nbor), router_interface_id=e2_rif, type=SAI_NEXT_HOP_TYPE_IP, ) self.assertGreater(e2_port_nbor_nhop, 0) e2_port_route = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(e2_port_ipv4 + '/24'), ) sai_thrift_create_route_entry( self.client, e1_port_route, next_hop_id=e2_port_nbor_nhop, ) pkt_in1 = simple_udp_packet( eth_dst=ROUTER_MAC, eth_src=iport_nbor_mac, ip_dst=e1_port_ipv4_nbor, ip_src=iport_ipv4_nbor, ip_ttl=64, ) pkt_e1 = simple_udp_packet( eth_dst=e1_port_nbor_mac, eth_src=ROUTER_MAC, ip_dst=e1_port_ipv4_nbor, ip_src=iport_ipv4_nbor, ip_ttl=63, ) send_packet(self, dev_iport, pkt_in1) verify_packets(self, pkt_e1, [dev_e1_port]) verify_no_other_packets(self, timeout=1) pkt_in2 = simple_udp_packet( eth_dst=ROUTER_MAC, eth_src=iport_nbor_mac, ip_dst=e2_port_ipv4_nbor, ip_src=iport_ipv4_nbor, ip_ttl=64, ) pkt_e2 = simple_udp_packet( eth_dst=e2_port_nbor_mac, eth_src=e2_mac, ip_dst=e2_port_ipv4_nbor, ip_src=iport_ipv4_nbor, ip_ttl=63, ) send_packet(self, dev_iport, pkt_in2) verify_packets(self, pkt_e2, [dev_e2_port]) verify_no_other_packets(self, timeout=1) sai_thrift_set_router_interface_attribute( self.client, router_interface_oid=e2_rif, src_mac_address=e2_new_mac, ) e2_rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=e2_rif, src_mac_address=True, ) self.assertIsNotNone(e2_rif_attr) src_mac_address = e2_rif_attr.get('src_mac_address') self.assertEqual(src_mac_address, e2_new_mac) pkt_e2 = simple_udp_packet( eth_dst=e2_port_nbor_mac, eth_src=e2_new_mac, ip_dst=e2_port_ipv4_nbor, ip_src=iport_ipv4_nbor, ip_ttl=63, ) send_packet(self, dev_iport, pkt_in2) verify_packets(self, pkt_e2, [dev_e2_port]) verify_no_other_packets(self, timeout=1) finally: for route in iport_route, e1_port_route, e2_port_route: if route is not None: sai_thrift_remove_route_entry(self.client, route) for nbor in iport_nbor, e1_port_nbor, e2_port_nbor: if nbor is not None: sai_thrift_remove_neighbor_entry(self.client, nbor) for nhop in iport_nbor_nhop, e1_port_nbor_nhop, e2_port_nbor_nhop: if nhop is not None: sai_thrift_remove_next_hop(self.client, nhop) for rif in irif, e1_rif, e2_rif: if rif is not None: sai_thrift_remove_router_interface(self.client, rif) def tearDown(self): super(RifCreateOrUpdateRmacTest, self).tearDown() @group("draft") class L3InterfaceMtuTestHelper(PlatformSaiHelper): """ Configuration +----------+-----------+ | port0 | | +----------+-----------+ | port1 | | +----------+-----------+ | lag1 | port2 | | | port3 | | | port4 | +----------+-----------+ """ def setUp(self): super(L3InterfaceMtuTestHelper, self).setUp() dmac1 = '00:11:22:33:44:55' dmac3 = '00:33:22:33:44:55' self.port1_rif_counter_in = 0 self.port0_rif_counter_out = 0 self.lag1_rif_counter_out = 0 self.port0_rif_counter_out_octects = 0 self.port1_rif_counter_in_octects = 0 self.create_routing_interfaces(ports=[0, 1]) self.create_lag_with_members(lag_index=1, ports=[2, 3, 4]) self.create_routing_interfaces(lags=[1]) self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port0_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.port0_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry1, dst_mac_address=dmac1) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.lag1_rif, ip_address=sai_ipaddress('12.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry3, dst_mac_address=dmac3) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('12.10.10.2'), router_interface_id=self.lag1_rif, type=SAI_NEXT_HOP_TYPE_IP) self.route_entry0 = 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, self.route_entry0, next_hop_id=self.nhop1) self.route_lag0 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('12.10.10.1/32')) sai_thrift_create_route_entry( self.client, self.route_lag0, next_hop_id=self.nhop3) self.route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:99aa/128')) sai_thrift_create_route_entry( self.client, self.route_entry1, next_hop_id=self.nhop1) self.route_lag1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:1122:3344:5566:7788/128')) sai_thrift_create_route_entry( self.client, self.route_lag1, next_hop_id=self.nhop3) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_route_entry(self.client, self.route_lag0) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_route_entry(self.client, self.route_lag1) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) self.destroy_routing_interfaces() self.destroy_bridge_ports() self.destroy_lags_with_members() super(L3InterfaceMtuTestHelper, self).tearDown() @group("draft") class Ipv4MtuTest(L3InterfaceMtuTestHelper): """ Verifies if IPv4 packet is forwarded, dropped and punted to CPU depending on the MTU with and without a trap for regular L3 port """ def setUp(self): super(Ipv4MtuTest, self).setUp() def runTest(self): print("\nipv4MtuTest()") # set MTU to 200 for port 0 and lag 1 mtu_port0_rif = sai_thrift_get_router_interface_attribute( self.client, self.port0_rif, mtu=True) mtu_lag1_rif = sai_thrift_get_router_interface_attribute( self.client, self.lag1_rif, mtu=True) sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, mtu=200) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=200) try: print("Max MTU is 200, send pkt size 199, send to port/lag") 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, pktlen=199 + 14) 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, pktlen=199 + 14) print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IP'].dst = '12.10.10.1' exp_pkt['IP'].dst = '12.10.10.1' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d -> lag 1 (192.168.0.1 -> " "12.10.10.1)" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port2, self.dev_port3, self.dev_port4]) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Max MTU is 200, send pkt size 200, send to port/lag") 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, pktlen=200 + 14) 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, pktlen=200 + 14) print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IP'].dst = '12.10.10.1' exp_pkt['IP'].dst = '12.10.10.1' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d -> lag 1 (192.168.0.1 -> " "12.10.10.1)" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port2, self.dev_port3, self.dev_port4]) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Max MTU is 200, send pkt size 201, dropped") 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, pktlen=201 + 14) 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, pktlen=201 + 14) print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IP'].dst = '12.10.10.1' exp_pkt['IP'].dst = '12.10.10.1' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Changing MTU to 201, send pkt size 201, send to port/lag") sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, mtu=201) 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, pktlen=201 + 14) 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, pktlen=201 + 14) print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IP'].dst = '12.10.10.1' exp_pkt['IP'].dst = '12.10.10.1' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=201) print("Sending packet port %d -> lag 1 (192.168.0.1 -> " "12.10.10.1)" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port2, self.dev_port3, self.dev_port4]) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Max MTU is 201, send pkt size 202, dropped") 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, pktlen=202 + 14) 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, pktlen=202 + 14) print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IP'].dst = '12.10.10.1' exp_pkt['IP'].dst = '12.10.10.1' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 finally: sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, mtu=mtu_port0_rif['mtu']) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=mtu_lag1_rif['mtu']) def tearDown(self): super(Ipv4MtuTest, self).tearDown() @group("draft") class Ipv6MtuTest(L3InterfaceMtuTestHelper): """ Verifies if IPv6 packet is forwarded, dropped and punted to CPU depending on the MTU with and without a trap for regular L3 port """ def setUp(self): super(Ipv6MtuTest, self).setUp() def runTest(self): print("\nipv6MtuTest()") mtu_port0_rif = sai_thrift_get_router_interface_attribute( self.client, self.port0_rif, mtu=True) mtu_lag1_rif = sai_thrift_get_router_interface_attribute( self.client, self.lag1_rif, mtu=True) # set MTU to 200 for port 0 and lag 1 sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, mtu=200) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=200) try: print("Max MTU is 200, send pkt size 199, send to port/lag") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=199 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=199 + 14 + 40) print("Sending packet port %d -> port %d " "(2000::1 -> 1234:5678:9abc:def0:4422:1133:5577:99aa')" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d -> lag 1 (2000::1 -> " "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port2, self.dev_port3, self.dev_port4]) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Max MTU is 200, send pkt size 200, send to port/lag") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=200 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=200 + 14 + 40) print("Sending packet port %d -> port %d " "(2000::1 -> 1234:5678:9abc:def0:4422:1133:5577:99aa')" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d -> lag 1 (2000::1 -> " "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port2, self.dev_port3, self.dev_port4]) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Max MTU is 200, send pkt size 201, dropped") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=201 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=201 + 14 + 40) print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Changing MTU to 201, send pkt size 201, send to port/lag") sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, mtu=201) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=201 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=201 + 14 + 40) print("Sending packet port %d -> port %d " "(2000::1 -> 1234:5678:9abc:def0:4422:1133:5577:99aa')" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=201) print("Sending packet port %d -> lag 1 (2000::1 ->" "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port1) send_packet(self, self.dev_port1, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port2, self.dev_port3, self.dev_port4]) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 print("Max MTU is 201, send pkt size 202, dropped") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=202 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=202 + 14 + 40) print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.port0_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 self.port0_rif_counter_out_octects += len(exp_pkt) + 4 pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d" % self.dev_port1, " dropped") send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) self.port1_rif_counter_in += 1 self.lag1_rif_counter_out += 1 self.port1_rif_counter_in_octects += len(pkt) + 4 finally: sai_thrift_set_router_interface_attribute( self.client, self.port0_rif, mtu=mtu_port0_rif['mtu']) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=mtu_lag1_rif['mtu']) def tearDown(self): super(Ipv6MtuTest, self).tearDown() @group("draft") class L3SubPortTestHelper(PlatformSaiHelper): """ This class contains base router interface tests for L3 subport RIFs """ def setUp(self): super(L3SubPortTestHelper, self).setUp() self.port10_rif_in = 0 self.port10_rif_out = 0 self.port11_rif_in = 0 self.port11_rif_out = 0 self.port30_bp = 0 self.lag3_rif_in = 0 self.lag3_rif_out = 0 self.vlan600_rif_in = 0 self.vlan600_rif_out = 0 self.vlan700_rif_in = 0 self.vlan700_rif_out = 0 self.subport10_100_in = 0 self.subport10_200_in = 0 self.subport11_200_in = 0 self.subport11_300_in = 0 self.sublag3_400_in = 0 self.sublag3_500_in = 0 self.subport24_600_in = 0 self.subport25_400_in = 0 self.subport25_500_in = 0 self.subport10_100_out = 0 self.subport10_200_out = 0 self.subport11_200_out = 0 self.subport11_300_out = 0 self.sublag3_400_out = 0 self.sublag3_500_out = 0 self.subport24_600_out = 0 self.subport25_400_out = 0 self.subport25_500_out = 0 dmac0 = '00:11:22:33:44:55' dmac1 = '00:22:22:33:44:55' dmac2 = '00:33:22:33:44:55' dmac3 = '00:44:22:33:44:55' dmac4 = '00:55:22:33:44:55' mac_action = SAI_PACKET_ACTION_FORWARD # L3 RIF on port10, port11 and lag3 self.nhop0 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.1'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry0 = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('10.10.10.1')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry0, dst_mac_address=dmac0) self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.2'), router_interface_id=self.port11_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.port11_rif, ip_address=sai_ipaddress('10.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry1, dst_mac_address=dmac1) self.nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.3'), router_interface_id=self.lag3_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.lag3_rif, ip_address=sai_ipaddress('10.10.10.3')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry2, dst_mac_address=dmac2) 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, admin_state=True) 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, admin_state=True) # add SVI on vlan600, port24 and vlan700, port 25 self.vlan600 = sai_thrift_create_vlan(self.client, vlan_id=600) self.vlan_member601 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan600, bridge_port_id=self.port24_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan600_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=self.vlan600) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.4'), router_interface_id=self.vlan600_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.vlan600_rif, ip_address=sai_ipaddress('10.10.10.4')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry3, dst_mac_address=dmac3) self.fdb_entry3 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=dmac3, bv_id=self.vlan600) sai_thrift_create_fdb_entry(self.client, self.fdb_entry3, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) sai_thrift_set_port_attribute( self.client, self.port24, port_vlan_id=600) self.vlan700 = sai_thrift_create_vlan(self.client, vlan_id=700) self.vlan_member701 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan700, bridge_port_id=self.port25_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan700_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=self.vlan700) self.nhop4 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.10.5'), router_interface_id=self.vlan700_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry4 = sai_thrift_neighbor_entry_t( rif_id=self.vlan700_rif, ip_address=sai_ipaddress('10.10.10.5')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry4, dst_mac_address=dmac4) self.fdb_entry4 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=dmac4, bv_id=self.vlan700) sai_thrift_create_fdb_entry(self.client, self.fdb_entry4, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port25_bp, packet_action=mac_action) # add subport 100, 200 on port10 self.subport10_100 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port10, admin_v4_state=True, outer_vlan_id=100) self.nhop_sp10_100 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.0.10'), router_interface_id=self.subport10_100, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp10_100 = sai_thrift_neighbor_entry_t( rif_id=self.subport10_100, ip_address=sai_ipaddress('20.20.0.10')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp10_100, dst_mac_address="00:33:33:33:01:00") self.subport10_200 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port10, admin_v4_state=True, outer_vlan_id=200) self.nhop_sp10_200 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.0.20'), router_interface_id=self.subport10_200, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp10_200 = sai_thrift_neighbor_entry_t( rif_id=self.subport10_200, ip_address=sai_ipaddress('20.20.0.20')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp10_200, dst_mac_address="00:33:33:33:02:00") # add subport 200, 300 on port11 self.subport11_200 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port11, admin_v4_state=True, outer_vlan_id=200) self.nhop_sp11_200 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.1.20'), router_interface_id=self.subport11_200, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp11_200 = sai_thrift_neighbor_entry_t( rif_id=self.subport11_200, ip_address=sai_ipaddress('20.20.1.20')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp11_200, dst_mac_address="00:33:33:33:12:00") self.subport11_300 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port11, admin_v4_state=True, outer_vlan_id=300) self.nhop_sp11_300 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.1.30'), router_interface_id=self.subport11_300, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp11_300 = sai_thrift_neighbor_entry_t( rif_id=self.subport11_300, ip_address=sai_ipaddress('20.20.1.30')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp11_300, dst_mac_address="00:33:33:33:13:00") # add subport 400, 500 on lag3 self.sublag3_400 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.lag3, admin_v4_state=True, outer_vlan_id=400) self.nhop_sl3_400 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.0.40'), router_interface_id=self.sublag3_400, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sl3_400 = sai_thrift_neighbor_entry_t( rif_id=self.sublag3_400, ip_address=sai_ipaddress('20.20.0.40')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sl3_400, dst_mac_address="00:33:33:33:04:00") self.sublag3_500 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.lag3, admin_v4_state=True, outer_vlan_id=500) self.nhop_sl3_500 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.0.50'), router_interface_id=self.sublag3_500, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sl3_500 = sai_thrift_neighbor_entry_t( rif_id=self.sublag3_500, ip_address=sai_ipaddress('20.20.0.50')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sl3_500, dst_mac_address="00:33:33:33:05:00") # add subport 600 on port24, this port is untagged on vlan600 self.subport24_600 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port24, admin_v4_state=True, outer_vlan_id=600) self.nhop_sp24_600 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.3.60'), router_interface_id=self.subport24_600, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp24_600 = sai_thrift_neighbor_entry_t( rif_id=self.subport24_600, ip_address=sai_ipaddress('20.20.3.60')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp24_600, dst_mac_address="00:33:33:33:36:00") # add subport 400, 500 on port25, this port is tagged on vlan700 self.subport25_400 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port25, admin_v4_state=True, outer_vlan_id=400) self.nhop_sp25_400 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.4.40'), router_interface_id=self.subport25_400, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp25_400 = sai_thrift_neighbor_entry_t( rif_id=self.subport25_400, ip_address=sai_ipaddress('20.20.4.40')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp25_400, dst_mac_address="00:33:33:33:44:00") self.subport25_500 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port25, admin_v4_state=True, outer_vlan_id=500) self.nhop_sp25_500 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.4.50'), router_interface_id=self.subport25_500, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp25_500 = sai_thrift_neighbor_entry_t( rif_id=self.subport25_500, ip_address=sai_ipaddress('20.20.4.50')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp25_500, dst_mac_address="00:33:33:33:45:00") self.route_entry0 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.30.0.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry0, next_hop_id=self.nhop0) self.route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.30.1.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry1, next_hop_id=self.nhop1) self.route_entry1_ipv6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:99aa/128')) sai_thrift_create_route_entry( self.client, self.route_entry1_ipv6, next_hop_id=self.nhop0) self.route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.30.2.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry2, next_hop_id=self.nhop2) self.route_entry3 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.30.3.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry3, next_hop_id=self.nhop3) self.route_entry4 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.30.4.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry4, next_hop_id=self.nhop4) self.route_entry_sp10_100 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.10/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp10_100, next_hop_id=self.nhop_sp10_100) self.route_entry_sp10_100_ipv6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:8899/128')) sai_thrift_create_route_entry(self.client, self.route_entry_sp10_100_ipv6, next_hop_id=self.nhop_sp10_100) self.route_entry_sp10_200 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.20/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp10_200, next_hop_id=self.nhop_sp10_200) self.route_entry_sp11_200 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.1.20/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp11_200, next_hop_id=self.nhop_sp11_200) self.route_entry_sp11_300 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.1.30/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp11_300, next_hop_id=self.nhop_sp11_300) self.route_entry_sl3_400 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.40/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sl3_400, next_hop_id=self.nhop_sl3_400) self.route_entry_sl3_500 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.50/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sl3_500, next_hop_id=self.nhop_sl3_500) self.route_entry_sp24_600 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.3.60/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp24_600, next_hop_id=self.nhop_sp24_600) self.route_entry_sp25_400 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.4.40/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp25_400, next_hop_id=self.nhop_sp25_400) self.route_entry_sp25_500 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.4.50/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp25_500, next_hop_id=self.nhop_sp25_500) # ECMP self.nhop_group = sai_thrift_create_next_hop_group( self.client, type=SAI_NEXT_HOP_GROUP_TYPE_ECMP) self.nhop_group_member1 = sai_thrift_create_next_hop_group_member( self.client, next_hop_group_id=self.nhop_group, next_hop_id=self.nhop_sp10_200) self.nhop_group_member2 = sai_thrift_create_next_hop_group_member( self.client, next_hop_group_id=self.nhop_group, next_hop_id=self.nhop_sp11_200) self.nhop_group_member3 = sai_thrift_create_next_hop_group_member( self.client, next_hop_group_id=self.nhop_group, next_hop_id=self.nhop_sl3_400) self.nhop_group_member4 = sai_thrift_create_next_hop_group_member( self.client, next_hop_group_id=self.nhop_group, next_hop_id=self.nhop_sp24_600) self.nhop_group_member5 = sai_thrift_create_next_hop_group_member( self.client, next_hop_group_id=self.nhop_group, next_hop_id=self.nhop_sp25_500) self.route_entry_ecmp = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('60.60.60.0/16')) sai_thrift_create_route_entry( self.client, self.route_entry_ecmp, next_hop_id=self.nhop_group) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry_ecmp) sai_thrift_remove_next_hop_group_member( self.client, self.nhop_group_member1) sai_thrift_remove_next_hop_group_member( self.client, self.nhop_group_member2) sai_thrift_remove_next_hop_group_member( self.client, self.nhop_group_member3) sai_thrift_remove_next_hop_group_member( self.client, self.nhop_group_member4) sai_thrift_remove_next_hop_group_member( self.client, self.nhop_group_member5) sai_thrift_remove_next_hop_group(self.client, self.nhop_group) sai_thrift_remove_route_entry(self.client, self.route_entry_sp25_500) sai_thrift_remove_route_entry(self.client, self.route_entry_sp25_400) sai_thrift_remove_route_entry(self.client, self.route_entry_sp24_600) sai_thrift_remove_route_entry(self.client, self.route_entry_sp10_100) sai_thrift_remove_route_entry( self.client, self.route_entry_sp10_100_ipv6) sai_thrift_remove_route_entry(self.client, self.route_entry_sp10_200) sai_thrift_remove_route_entry(self.client, self.route_entry_sp11_200) sai_thrift_remove_route_entry(self.client, self.route_entry_sp11_300) sai_thrift_remove_route_entry(self.client, self.route_entry_sl3_400) sai_thrift_remove_route_entry(self.client, self.route_entry_sl3_500) sai_thrift_remove_route_entry(self.client, self.route_entry4) sai_thrift_remove_route_entry(self.client, self.route_entry3) sai_thrift_remove_route_entry(self.client, self.route_entry2) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_route_entry(self.client, self.route_entry1_ipv6) sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp24_600) sai_thrift_remove_next_hop(self.client, self.nhop_sp24_600) sai_thrift_remove_router_interface(self.client, self.subport24_600) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp25_500) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp25_400) sai_thrift_remove_next_hop(self.client, self.nhop_sp25_500) sai_thrift_remove_next_hop(self.client, self.nhop_sp25_400) sai_thrift_remove_router_interface(self.client, self.subport25_500) sai_thrift_remove_router_interface(self.client, self.subport25_400) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sl3_500) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sl3_400) sai_thrift_remove_next_hop(self.client, self.nhop_sl3_500) sai_thrift_remove_next_hop(self.client, self.nhop_sl3_400) sai_thrift_remove_router_interface(self.client, self.sublag3_500) sai_thrift_remove_router_interface(self.client, self.sublag3_400) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp11_300) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp11_200) sai_thrift_remove_next_hop(self.client, self.nhop_sp11_300) sai_thrift_remove_next_hop(self.client, self.nhop_sp11_200) sai_thrift_remove_router_interface(self.client, self.subport11_300) sai_thrift_remove_router_interface(self.client, self.subport11_200) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp10_200) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp10_100) sai_thrift_remove_next_hop(self.client, self.nhop_sp10_200) sai_thrift_remove_next_hop(self.client, self.nhop_sp10_100) sai_thrift_remove_router_interface(self.client, self.subport10_200) sai_thrift_remove_router_interface(self.client, self.subport10_100) sai_thrift_set_port_attribute(self.client, self.port24, port_vlan_id=1) sai_thrift_remove_fdb_entry(self.client, self.fdb_entry4) sai_thrift_remove_fdb_entry(self.client, self.fdb_entry3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry4) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry2) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry0) sai_thrift_remove_next_hop(self.client, self.nhop4) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_next_hop(self.client, self.nhop2) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_next_hop(self.client, self.nhop0) sai_thrift_remove_router_interface(self.client, self.vlan700_rif) sai_thrift_remove_router_interface(self.client, self.vlan600_rif) sai_thrift_remove_vlan_member(self.client, self.vlan_member701) sai_thrift_remove_vlan_member(self.client, self.vlan_member601) sai_thrift_remove_vlan(self.client, self.vlan700) sai_thrift_remove_vlan(self.client, self.vlan600) sai_thrift_remove_bridge_port(self.client, self.port25_bp) sai_thrift_remove_bridge_port(self.client, self.port24_bp) super(L3SubPortTestHelper, self).tearDown() @group("draft") class PvMissTest(L3SubPortTestHelper): """ Verifies packet dropped when invalid vlan tag on port """ def setUp(self): super(PvMissTest, self).setUp() def runTest(self): print("\npvMissTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='30.30.0.1', ip_ttl=64, dl_vlan_enable=True, vlan_vid=100, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='30.30.0.1', ip_ttl=63, pktlen=100) pkt[Dot1Q].vlan = 400 send_packet(self, self.dev_port25, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport25_400_in += 1 self.port10_rif_out += 1 pkt[Dot1Q].vlan = 500 send_packet(self, self.dev_port25, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport25_500_in += 1 self.port10_rif_out += 1 pkt[Dot1Q].vlan = 700 send_packet(self, self.dev_port25, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.vlan700_rif_in += 1 self.port10_rif_out += 1 pkt[Dot1Q].vlan = 40 send_packet(self, self.dev_port25, pkt) verify_no_other_packets(self, timeout=1) pkt[Dot1Q].vlan = 100 send_packet(self, self.dev_port25, pkt) verify_no_other_packets(self, timeout=1) pkt[Dot1Q].vlan = 200 send_packet(self, self.dev_port25, pkt) verify_no_other_packets(self, timeout=1) def tearDown(self): super(PvMissTest, self).tearDown() @group("draft") class SubPortToSubPortTest(L3SubPortTestHelper): """ Verifies routing between sub-ports and between sub-ports on the same physical port or LAG """ def setUp(self): super(SubPortToSubPortTest, self).setUp() def runTest(self): print("\nsubPortToSubPortTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_src='30.30.0.1', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=100, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_src='30.30.0.1', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=104) pkt_data = [ ['40.40.0.10', '00:33:33:33:01:00', 100, [10], self.subport10_100], ['40.40.0.20', '00:33:33:33:02:00', 200, [10], self.subport10_200], ['40.40.1.20', '00:33:33:33:12:00', 200, [11], self.subport11_200], ['40.40.1.30', '00:33:33:33:13:00', 300, [11], self.subport11_300], ['40.40.0.40', '00:33:33:33:04:00', 400, [14, 15, 16], self.sublag3_400], ['40.40.0.50', '00:33:33:33:05:00', 500, [14, 15, 16], self.sublag3_500], ['40.40.3.60', '00:33:33:33:36:00', 600, [24], self.subport24_600], ['40.40.4.40', '00:33:33:33:44:00', 400, [25], self.subport25_400], ['40.40.4.50', '00:33:33:33:45:00', 500, [25], self.subport25_500], ] for irif in pkt_data: for erif in pkt_data: if irif[4] == erif[4]: continue pkt[IP].dst = erif[0] pkt[Dot1Q].vlan = irif[2] exp_pkt[IP].dst = erif[0] exp_pkt[Ether].dst = erif[1] exp_pkt[Dot1Q].vlan = erif[2] iport = getattr(self, 'dev_port%s' % irif[3][0]) eport = [getattr(self, 'dev_port%s' % i) for i in erif[3]] send_packet(self, iport, pkt) verify_packet_any_port(self, exp_pkt, eport) self.subport10_100_in += 8 self.subport10_200_in += 8 self.subport11_200_in += 8 self.subport11_300_in += 8 self.sublag3_400_in += 8 self.sublag3_500_in += 8 self.subport24_600_in += 8 self.subport25_400_in += 8 self.subport25_500_in += 8 self.subport10_100_out += 8 self.subport10_200_out += 8 self.subport11_200_out += 8 self.subport11_300_out += 8 self.sublag3_400_out += 8 self.sublag3_500_out += 8 self.subport24_600_out += 8 self.subport25_400_out += 8 self.subport25_500_out += 8 def tearDown(self): super(SubPortToSubPortTest, self).tearDown() @group("draft") class SubPortToRifTest(L3SubPortTestHelper): """ Verifies routing between SVI and sub-port """ def setUp(self): super(SubPortToRifTest, self).setUp() def runTest(self): print("\nsubPortToRifTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='30.30.0.1', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=100, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='30.30.0.1', ip_id=105, ip_ttl=63, pktlen=100) exp_tagged_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='30.30.0.1', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=700, pktlen=104) pkt_data = [ ['30.30.0.1', '00:11:22:33:44:55', 10], ['30.30.1.1', '00:22:22:33:44:55', 11], ['30.30.2.1', '00:33:22:33:44:55', 15], ['30.30.3.1', '00:44:22:33:44:55', 24], ] ingress_rifs = [[10, 100], [10, 200], [11, 200], [11, 300], [14, 400], [14, 500], [24, 600], [25, 400], [25, 500]] for item in ingress_rifs: for content in pkt_data: pkt[IP].dst = content[0] pkt[Dot1Q].vlan = item[1] exp_pkt[IP].dst = content[0] exp_pkt[Ether].dst = content[1] iport = getattr(self, 'dev_port%s' % item[0]) eport = getattr(self, 'dev_port%s' % content[2]) send_packet(self, iport, pkt) verify_packet(self, exp_pkt, eport) pkt_data = [ ['30.30.4.1', '00:55:22:33:44:55', 25], ] for item in ingress_rifs: for content in pkt_data: pkt[IP].dst = content[0] pkt[Dot1Q].vlan = item[1] exp_tagged_pkt[IP].dst = content[0] exp_tagged_pkt[Ether].dst = content[1] iport = getattr(self, 'dev_port%s' % item[0]) eport = getattr(self, 'dev_port%s' % content[2]) send_packet(self, iport, pkt) verify_packet(self, exp_tagged_pkt, eport) self.subport10_100_in += 5 self.subport10_200_in += 5 self.subport11_200_in += 5 self.subport11_300_in += 5 self.sublag3_400_in += 5 self.sublag3_500_in += 5 self.subport24_600_in += 5 self.subport25_400_in += 5 self.subport25_500_in += 5 self.port10_rif_out += 9 self.port11_rif_out += 9 self.lag3_rif_out += 9 self.vlan600_rif_out += 9 self.vlan700_rif_out += 9 def tearDown(self): super(SubPortToRifTest, self).tearDown() @group("draft") class RifToSubPortTest(L3SubPortTestHelper): """ Verifies packet routed with valid vlan on sub-port and routing between L3 RIF and sub-port """ def setUp(self): super(RifToSubPortTest, self).setUp() def runTest(self): print("\nrifToSubPortTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_src='30.30.0.1', ip_id=105, ip_ttl=64, pktlen=100) tagged_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_src='30.30.0.1', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=700, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_src='30.30.0.1', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=104) pkt_data = [ ['40.40.0.10', '00:33:33:33:01:00', 100, [10], 'subport10_100'], ['40.40.0.20', '00:33:33:33:02:00', 200, [10], 'subport10_200'], ['40.40.1.20', '00:33:33:33:12:00', 200, [11], 'subport11_200'], ['40.40.1.30', '00:33:33:33:13:00', 300, [11], 'subport11_300'], ['40.40.0.40', '00:33:33:33:04:00', 400, [14, 15, 16], 'sublag3_400'], ['40.40.0.50', '00:33:33:33:05:00', 500, [14, 15, 16], 'sublag3_500'], ['40.40.3.60', '00:33:33:33:36:00', 600, [24], 'subport24_600'], ['40.40.4.40', '00:33:33:33:44:00', 400, [25], 'subport25_400'], ['40.40.4.50', '00:33:33:33:45:00', 500, [25], 'subport25_500'], ] ingress_rifs = [10, 11, 15, 24] for port in ingress_rifs: for content in pkt_data: pkt[IP].dst = content[0] exp_pkt[IP].dst = content[0] exp_pkt[Ether].dst = content[1] exp_pkt[Dot1Q].vlan = content[2] iport = getattr(self, 'dev_port%s' % port) eport = [getattr(self, 'dev_port%s' % i) for i in content[3]] send_packet(self, iport, pkt) verify_packet_any_port(self, exp_pkt, eport) for content in pkt_data: tagged_pkt[IP].dst = content[0] exp_pkt[IP].dst = content[0] exp_pkt[Ether].dst = content[1] exp_pkt[Dot1Q].vlan = content[2] eport = [getattr(self, 'dev_port%s' % i) for i in content[3]] send_packet(self, self.dev_port25, tagged_pkt) verify_packet_any_port(self, exp_pkt, eport) self.subport10_100_out += 5 self.subport10_200_out += 5 self.subport11_200_out += 5 self.subport11_300_out += 5 self.sublag3_400_out += 5 self.sublag3_500_out += 5 self.subport24_600_out += 5 self.subport25_400_out += 5 self.subport25_500_out += 5 self.port10_rif_in += 9 self.port11_rif_in += 9 self.lag3_rif_in += 9 self.vlan600_rif_in += 9 self.vlan700_rif_in += 9 def tearDown(self): super(RifToSubPortTest, self).tearDown() @group("draft") class NoFloodTest(L3SubPortTestHelper): """ Verifies if packet is not flooded on the tagged VLAN when no route hit """ def setUp(self): super(NoFloodTest, self).setUp() def runTest(self): print("\nnoFloodTest()") pkt = simple_tcp_packet(eth_dst='00:66:66:55:44:33', eth_src='00:22:22:22:22:22', ip_dst='50.50.0.1', ip_ttl=64) tagged_pkt = simple_tcp_packet(eth_dst='00:66:66:55:44:33', eth_src='00:22:22:22:22:22', ip_dst='50.50.0.1', ip_ttl=64, dl_vlan_enable=True, vlan_vid=600, pktlen=104) self.port30_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port30, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) port31_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port31, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member602 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan600, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member603 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan600, bridge_port_id=port31_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) try: # ingress on vlan rif 600 send_packet(self, self.dev_port24, pkt) verify_packets(self, pkt, [self.dev_port30, self.dev_port31]) self.vlan600_rif_in += 1 self.vlan600_rif_out += 2 # ingress on subport rif 600 with rmac send_packet(self, self.dev_port24, tagged_pkt) verify_no_other_packets(self, timeout=1) self.subport24_600_in += 1 # ingress on subport rif 600 with unknown unicast tagged_pkt[Ether].dst = '00:66:66:55:44:33' send_packet(self, self.dev_port24, tagged_pkt) verify_no_other_packets(self, timeout=1) self.subport24_600_in += 1 finally: sai_thrift_remove_vlan_member(self.client, vlan_member602) sai_thrift_remove_vlan_member(self.client, vlan_member603) sai_thrift_remove_bridge_port(self.client, self.port30_bp) sai_thrift_remove_bridge_port(self.client, port31_bp) def tearDown(self): super(NoFloodTest, self).tearDown() @group("draft") class VlanConflictTest(L3SubPortTestHelper): """ Verifies if deleting VLAN RIF affects sub-port RIF with same vlan number """ def setUp(self): super(VlanConflictTest, self).setUp() def runTest(self): print("\nvlanConflictTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='30.30.0.1', ip_ttl=64, pktlen=100) tagged_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='30.30.0.1', ip_ttl=64, dl_vlan_enable=True, vlan_vid=800, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='30.30.0.1', ip_ttl=63, pktlen=100) try: port29_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port29, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) print("Add vlan 800 on port 29") vlan800 = sai_thrift_create_vlan(self.client, vlan_id=800) vlan_member801 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan800, bridge_port_id=port29_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan800_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=vlan800) sai_thrift_set_port_attribute( self.client, self.port29, port_vlan_id=800) print("Send untagged pkt on vlan 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port29, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 print("Add subport 800 on port 25") subport8_800 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port25, admin_v4_state=True, outer_vlan_id=800) print("Send untagged pkt on vlan 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port29, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 print("Send tagged pkt on subport 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port25, tagged_pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 sai_thrift_remove_router_interface(self.client, subport8_800) print("Send untagged pkt on vlan 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port29, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 sai_thrift_set_port_attribute( self.client, self.port29, port_vlan_id=0) sai_thrift_remove_router_interface(self.client, vlan800_rif) sai_thrift_remove_vlan_member(self.client, vlan_member801) print("Add subport 800 on port 25") subport8_800 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port25, admin_v4_state=True, outer_vlan_id=800) print("Send tagged pkt on subport 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port25, tagged_pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 print("Add vlan 800 on port 29") vlan_member801 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan800, bridge_port_id=port29_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan800_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=vlan800) sai_thrift_set_port_attribute( self.client, self.port29, port_vlan_id=800) print("Send untagged pkt on vlan 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port29, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 print("Send tagged pkt on subport 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port25, tagged_pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 sai_thrift_set_port_attribute( self.client, self.port29, port_vlan_id=0) sai_thrift_remove_router_interface(self.client, vlan800_rif) sai_thrift_remove_vlan_member(self.client, vlan_member801) print("Send tagged pkt on subport 800 to port %d" % self.dev_port10) send_packet(self, self.dev_port25, tagged_pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port10_rif_out += 1 finally: sai_thrift_remove_bridge_port(self.client, port29_bp) sai_thrift_remove_vlan(self.client, vlan800) sai_thrift_remove_router_interface(self.client, subport8_800) def tearDown(self): super(VlanConflictTest, self).tearDown() @group("draft") class SubPortAdminV4StatusTest(L3SubPortTestHelper): """ Verifies if admin status DOWN disables packet forwarding on ingress and if IPv4 packets are dropped when admin_v4_state is False """ def setUp(self): super(SubPortAdminV4StatusTest, self).setUp() def runTest(self): print("\nsubPortAdminV4StatusTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='30.30.0.1', ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='30.30.0.1', ip_ttl=63, pktlen=100) print("Sending packet on sub port %d vlan 200, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.port10_rif_out += 1 print("Disable IPv4 on subport") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, admin_v4_state=False) print("Sending packet on sub port %d vlan 200, drop" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.subport11_200_in += 1 print("Enable IPv4 on subport") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, admin_v4_state=True) print("Sending packet on sub port %d vlan 200, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.port10_rif_out += 1 def tearDown(self): super(SubPortAdminV4StatusTest, self).tearDown() @group("draft") class SubPortAdminV6StatusTest(L3SubPortTestHelper): """ Verifies if admin status DOWN disables packet forwarding on ingress and if IPv6 packets are dropped when admin_v6_state is False """ def setUp(self): super(SubPortAdminV6StatusTest, self).setUp() def runTest(self): print("\nsubPortAdminV6StatusTest()") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=40 + 14) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=40 + 14) print("Sending packet on sub port %d vlan 200, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.port10_rif_out += 1 print("Disable IPv6 on subport") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, admin_v6_state=False) print("Sending packet on sub port %d vlan 200, drop" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.subport11_200_in += 1 print("Enable IPv6 on subport") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, admin_v6_state=True) print("Sending packet on sub port %d vlan 200, forward" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.port10_rif_out += 1 def tearDown(self): super(SubPortAdminV6StatusTest, self).tearDown() @group("draft") class SubPortV4MtuTest(L3SubPortTestHelper): """ Verifies if IPv4 packet is forwarded, dropped and punted to CPU depending on the MTU with and without a trap for L3 subport """ def setUp(self): super(SubPortV4MtuTest, self).setUp() def runTest(self): print("\nsubPortV4MtuTest()") # set MTU to 200 for subport 10_100 sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, mtu=200) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=199 + 18) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=199 + 18) print("Max MTU is 200, send pkt size 199, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=200 + 18) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=200 + 18) print("Max MTU is 200, send pkt size 200, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=201 + 18) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=201 + 18) print("Max MTU is 200, send pkt size 201, drop") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.subport11_200_in += 1 self.subport10_100_out += 1 print("Setting MTU to 201") sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, mtu=201) print("Max MTU is 201, send pkt size 201, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=202 + 18) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=202 + 18) print("Max MTU is 201, send pkt size 202, drop") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.subport11_200_in += 1 self.subport10_100_out += 1 def tearDown(self): super(SubPortV4MtuTest, self).tearDown() @group("draft") class SubPortV6MtuTest(L3SubPortTestHelper): """ Verifies if IPv6 packet is forwarded, dropped and punted to CPU depending on the MTU with and without a trap for L3 subport """ def setUp(self): super(SubPortV6MtuTest, self).setUp() def runTest(self): print("\nsubPortV6MtuTest()") # set MTU to 200 for subport 10_100 sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, mtu=200) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=199 + 40 + 18) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', ipv6_hlim=63, dl_vlan_enable=True, vlan_vid=100, pktlen=199 + 40 + 18) print("Max MTU is 200, send pkt size 199, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=200 + 40 + 18) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', ipv6_hlim=63, dl_vlan_enable=True, vlan_vid=100, pktlen=200 + 40 + 18) print("Max MTU is 200, send pkt size 200, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=201 + 40 + 18) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', ipv6_hlim=63, dl_vlan_enable=True, vlan_vid=100, pktlen=201 + 40 + 18) print("Max MTU is 200, send pkt size 201, drop") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.subport11_200_in += 1 self.subport10_100_out += 1 print("Setting MTU to 201") sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, mtu=201) print("Max MTU is 201, send pkt size 201, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=202 + 40 + 18) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', ipv6_hlim=63, dl_vlan_enable=True, vlan_vid=100, pktlen=202 + 40 + 18) print("Max MTU is 201, send pkt size 202, drop") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.subport11_200_in += 1 self.subport10_100_out += 1 def tearDown(self): super(SubPortV6MtuTest, self).tearDown() @group("draft") class SubPortIngressAclTest(L3SubPortTestHelper): """ Verifies ingress ACL table and group is bound correctly to sub-port """ def setUp(self): super(SubPortIngressAclTest, self).setUp() def runTest(self): print("\nsubPortIngressAclTest()") stage = SAI_ACL_STAGE_INGRESS bind_points = [SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE] action_types = [SAI_ACL_ACTION_TYPE_PACKET_ACTION] action_drop = SAI_PACKET_ACTION_DROP dst_ip = '40.40.1.20' dst_ip_mask = '255.255.255.0' acl_bind_point_type_list = sai_thrift_s32_list_t( count=len(bind_points), int32list=bind_points) acl_action_type_list = sai_thrift_s32_list_t( count=len(action_types), int32list=action_types) acl_table = sai_thrift_create_acl_table( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, acl_action_type_list=acl_action_type_list, field_dst_ip=True) packet_action = sai_thrift_acl_action_data_t( parameter=sai_thrift_acl_action_parameter_t(s32=action_drop)) ip_addr = sai_thrift_acl_field_data_t( data=sai_thrift_acl_field_data_data_t(ip4=dst_ip), mask=sai_thrift_acl_field_data_mask_t(ip4=dst_ip_mask)) acl_entry = sai_thrift_create_acl_entry( self.client, table_id=acl_table, action_packet_action=packet_action, field_dst_ip=ip_addr) try: pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.1.20', ip_ttl=64, dl_vlan_enable=True, vlan_vid=100) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:12:00', eth_src=ROUTER_MAC, ip_dst='40.40.1.20', ip_ttl=63, dl_vlan_enable=True, vlan_vid=200) print("Allow packet before binding ingress ACL to RIF") send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 print("Bind ACL to subport10_100") sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, ingress_acl=acl_table) send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=1) self.subport10_100_in += 1 print("Remove binding, packet should be forwarded") sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, ingress_acl=0) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 acl_table_group = sai_thrift_create_acl_table_group( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, type=SAI_ACL_TABLE_GROUP_TYPE_PARALLEL) acl_group_member = sai_thrift_create_acl_table_group_member( self.client, acl_table_group_id=acl_table_group, acl_table_id=acl_table) print("Allow packet before binding ingress ACL group to RIF") send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 print("Bind ACL group to subport10_100") sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, ingress_acl=acl_table_group) send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=1) self.subport10_100_in += 1 print("Remove binding, packet should be forwarded") sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, ingress_acl=0) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 finally: sai_thrift_remove_acl_table_group_member( self.client, acl_group_member) sai_thrift_remove_acl_table_group(self.client, acl_table_group) sai_thrift_remove_acl_entry(self.client, acl_entry) sai_thrift_remove_acl_table(self.client, acl_table) def tearDown(self): super(SubPortIngressAclTest, self).tearDown() @group("draft") class SubPortEgressAclTest(L3SubPortTestHelper): """ Verifies egress ACL table and group is bound correctly to sub-port """ def setUp(self): super(SubPortEgressAclTest, self).setUp() def runTest(self): print("\nsubPortEgressAclTest()") stage = SAI_ACL_STAGE_EGRESS bind_points = [SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE] action_types = [SAI_ACL_ACTION_TYPE_PACKET_ACTION] action_drop = SAI_PACKET_ACTION_DROP dst_ip = '40.40.1.20' dst_ip_mask = '255.255.255.0' acl_bind_point_type_list = sai_thrift_s32_list_t( count=len(bind_points), int32list=bind_points) acl_action_type_list = sai_thrift_s32_list_t( count=len(action_types), int32list=action_types) acl_table = sai_thrift_create_acl_table( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, acl_action_type_list=acl_action_type_list, field_dst_ip=True) packet_action = sai_thrift_acl_action_data_t( parameter=sai_thrift_acl_action_parameter_t(s32=action_drop)) ip_addr = sai_thrift_acl_field_data_t( data=sai_thrift_acl_field_data_data_t(ip4=dst_ip), mask=sai_thrift_acl_field_data_mask_t(ip4=dst_ip_mask)) acl_entry = sai_thrift_create_acl_entry( self.client, table_id=acl_table, action_packet_action=packet_action, field_dst_ip=ip_addr) try: pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.1.20', ip_ttl=64, dl_vlan_enable=True, vlan_vid=100) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:12:00', eth_src=ROUTER_MAC, ip_dst='40.40.1.20', ip_ttl=63, dl_vlan_enable=True, vlan_vid=200) print("Allow packet before binding ingress ACL to RIF") send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 print("Bind ACL to subport11_200") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, egress_acl=acl_table) send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=1) self.subport10_100_in += 1 self.subport11_200_out += 1 print("Remove binding, packet should be forwarded") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, egress_acl=0) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 acl_table_group = sai_thrift_create_acl_table_group( self.client, acl_stage=stage, acl_bind_point_type_list=acl_bind_point_type_list, type=SAI_ACL_TABLE_GROUP_TYPE_PARALLEL) acl_group_member = sai_thrift_create_acl_table_group_member( self.client, acl_table_group_id=acl_table_group, acl_table_id=acl_table) print("Allow packet before binding ingress ACL group to RIF") send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 print("Bind ACL group to subport0_100") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, egress_acl=acl_table_group) send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=1) self.subport10_100_in += 1 self.subport11_200_out += 1 print("Remove binding, packet should be forwarded") sai_thrift_set_router_interface_attribute( self.client, self.subport11_200, egress_acl=0) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port11) self.subport10_100_in += 1 self.subport11_200_out += 1 finally: sai_thrift_remove_acl_table_group_member( self.client, acl_group_member) sai_thrift_remove_acl_table_group(self.client, acl_table_group) sai_thrift_remove_acl_entry(self.client, acl_entry) sai_thrift_remove_acl_table(self.client, acl_table) def tearDown(self): super(SubPortEgressAclTest, self).tearDown() @group("draft") class SubPortECMPTest(L3SubPortTestHelper): """ Verifies load-balancing when sub-port is part of ECMP """ def setUp(self): super(SubPortECMPTest, self).setUp() def runTest(self): print("\nsubPortECMPTest()") count = [0, 0, 0, 0, 0, 0, 0] dst_ip = int(binascii.hexlify(socket.inet_aton('60.60.60.1')), 16) src_ip = int(binascii.hexlify(socket.inet_aton('192.168.8.1')), 16) max_itrs = 200 for i in range(0, max_itrs): dst_ip_addr = socket.inet_ntoa( binascii.unhexlify(format(dst_ip, 'x').zfill(8))) src_ip_addr = socket.inet_ntoa( binascii.unhexlify(format(src_ip, 'x').zfill(8))) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst=dst_ip_addr, ip_src=src_ip_addr, ip_ttl=64, pktlen=100) exp_pkt1 = simple_tcp_packet(eth_dst='00:33:33:33:02:00', eth_src=ROUTER_MAC, ip_dst=dst_ip_addr, ip_src=src_ip_addr, dl_vlan_enable=True, vlan_vid=200, ip_ttl=63, pktlen=104) exp_pkt2 = simple_tcp_packet(eth_dst='00:33:33:33:12:00', eth_src=ROUTER_MAC, ip_dst=dst_ip_addr, ip_src=src_ip_addr, dl_vlan_enable=True, vlan_vid=200, ip_ttl=63, pktlen=104) exp_pkt3 = simple_tcp_packet(eth_dst='00:33:33:33:04:00', eth_src=ROUTER_MAC, ip_dst=dst_ip_addr, ip_src=src_ip_addr, dl_vlan_enable=True, vlan_vid=400, ip_ttl=63, pktlen=104) exp_pkt4 = simple_tcp_packet(eth_dst='00:33:33:33:36:00', eth_src=ROUTER_MAC, ip_dst=dst_ip_addr, ip_src=src_ip_addr, dl_vlan_enable=True, vlan_vid=600, ip_ttl=63, pktlen=104) exp_pkt5 = simple_tcp_packet(eth_dst='00:33:33:33:45:00', eth_src=ROUTER_MAC, ip_dst=dst_ip_addr, ip_src=src_ip_addr, dl_vlan_enable=True, vlan_vid=500, ip_ttl=63, pktlen=104) send_packet(self, self.dev_port10, pkt) rcv_idx = verify_any_packet_any_port( self, [exp_pkt1, exp_pkt2, exp_pkt3, exp_pkt4, exp_pkt5], [self.dev_port10, self.dev_port11, self.dev_port24, self.dev_port25, self.dev_port14, self.dev_port15, self.dev_port16], timeout=2) count[rcv_idx] += 1 dst_ip += 1 src_ip += 1 print('count: ', count) ecmp_count = [count[0], count[1], count[2], count[3], count[4] + count[5] + count[6]] for i in range(0, 5): self.assertTrue((ecmp_count[i] >= ((max_itrs / 5) * 0.6)), "ECMP paths are not equally balanced") self.port10_rif_in += 200 self.subport10_200_out += ecmp_count[0] self.subport11_200_out += ecmp_count[1] self.subport24_600_out += ecmp_count[2] self.subport25_500_out += ecmp_count[3] self.sublag3_400_out += ecmp_count[4] def tearDown(self): super(SubPortECMPTest, self).tearDown() @group("draft") class SubPortMyIPTest(L3SubPortTestHelper): """ Verifies if MYIP works for subnet routes """ def setUp(self): super(SubPortMyIPTest, self).setUp() def runTest(self): print("\nsubPortMyIPTest()") try: # add IP2ME routes sw_attr = sai_thrift_get_switch_attribute( self.client, cpu_port=True) cpu_port = sw_attr['cpu_port'] ip2me_route0 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.11/32')) sai_thrift_create_route_entry( self.client, ip2me_route0, next_hop_id=cpu_port) ip2me_route1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.21/32')) sai_thrift_create_route_entry( self.client, ip2me_route1, next_hop_id=cpu_port) ip2me_route2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.1.21/32')) sai_thrift_create_route_entry( self.client, ip2me_route2, next_hop_id=cpu_port) ip2me_route3 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.1.31/32')) sai_thrift_create_route_entry( self.client, ip2me_route3, next_hop_id=cpu_port) ip2me_route4 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.41/32')) sai_thrift_create_route_entry( self.client, ip2me_route4, next_hop_id=cpu_port) ip2me_route5 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.51/32')) sai_thrift_create_route_entry( self.client, ip2me_route5, next_hop_id=cpu_port) ip2me_route6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.3.61/32')) sai_thrift_create_route_entry( self.client, ip2me_route6, next_hop_id=cpu_port) ip2me_route7 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.4.41/32')) sai_thrift_create_route_entry( self.client, ip2me_route7, next_hop_id=cpu_port) ip2me_route8 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.4.51/32')) sai_thrift_create_route_entry( self.client, ip2me_route8, next_hop_id=cpu_port) myip_trap_group = sai_thrift_create_hostif_trap_group( self.client, admin_state=True, queue=4) myip_trap = sai_thrift_create_hostif_trap( self.client, trap_group=myip_trap_group, packet_action=SAI_PACKET_ACTION_TRAP, trap_type=SAI_HOSTIF_TRAP_TYPE_IP2ME) self.assertTrue(myip_trap != 0) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.11', ip_src='30.30.0.1', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=100, pktlen=104) pkt_data = [ ['40.40.0.11', 100, 10], # self.subport10_100 ['40.40.0.21', 200, 10], # self.subport10_200 ['40.40.1.21', 200, 11], # self.subport11_200 ['40.40.1.31', 300, 11], # self.subport11_300 ['40.40.0.41', 400, 14], # self.sublag3_400 ['40.40.0.51', 500, 15], # self.sublag3_500 ['40.40.3.61', 600, 24], # self.subport24_600 ['40.40.4.41', 400, 25], # self.subport25_400 ['40.40.4.51', 500, 25] # self.subport25_500 ] pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) for data in pkt_data: ingress_port = getattr(self, 'dev_port%s' % data[2]) pkt[IP].dst = data[0] pkt[Dot1Q].vlan = data[1] send_packet(self, ingress_port, pkt) time.sleep(6) 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"] + len(pkt_data)) self.subport10_100_in += 1 self.subport10_200_in += 1 self.subport11_200_in += 1 self.subport11_300_in += 1 self.sublag3_400_in += 1 self.sublag3_500_in += 1 self.subport24_600_in += 1 self.subport25_400_in += 1 self.subport25_500_in += 1 self.subport10_100_out += 1 self.subport10_200_out += 1 self.subport11_200_out += 1 self.subport11_300_out += 1 self.sublag3_400_out += 1 self.sublag3_500_out += 1 self.subport24_600_out += 1 self.subport25_400_out += 1 self.subport25_500_out += 1 finally: sai_thrift_remove_hostif_trap(self.client, myip_trap) sai_thrift_remove_hostif_trap_group(self.client, myip_trap_group) sai_thrift_remove_route_entry(self.client, ip2me_route0) sai_thrift_remove_route_entry(self.client, ip2me_route1) sai_thrift_remove_route_entry(self.client, ip2me_route2) sai_thrift_remove_route_entry(self.client, ip2me_route3) sai_thrift_remove_route_entry(self.client, ip2me_route4) sai_thrift_remove_route_entry(self.client, ip2me_route5) sai_thrift_remove_route_entry(self.client, ip2me_route6) sai_thrift_remove_route_entry(self.client, ip2me_route7) sai_thrift_remove_route_entry(self.client, ip2me_route8) def tearDown(self): super(SubPortMyIPTest, self).tearDown() @group("draft") class SubPortNoTest(L3SubPortTestHelper): ''' SONiC enforces a minimum scalability requirement on the number of sub port interfaces that shall be supported on a SONiC switch. Scaling value for number of sub port interfaces per physical port or port channel is 250. ''' def setUp(self): super(SubPortNoTest, self).setUp() def runTest(self): print("\nsubPortNoTest()") req_sub_port_no = 256 test_port = self.port26 test_lag = self.lag1 try: vlan_id = 100 rif_port_sub_port_list = [] for _ in range(req_sub_port_no): sub_port_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=test_port, admin_v4_state=True, outer_vlan_id=vlan_id) self.assertTrue(sub_port_rif != 0) rif_port_sub_port_list.append(sub_port_rif) vlan_id += 1 rif_lag_sub_port_list = [] for _ in range(req_sub_port_no): sub_lag_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=test_lag, admin_v4_state=True, outer_vlan_id=vlan_id) self.assertTrue(sub_lag_rif != 0) rif_port_sub_port_list.append(sub_lag_rif) vlan_id += 1 finally: for sub_lag_rif in rif_lag_sub_port_list: sai_thrift_remove_router_interface(self.client, sub_lag_rif) for sub_port_rif in rif_port_sub_port_list: sai_thrift_remove_router_interface(self.client, sub_port_rif) def tearDown(self): super(SubPortNoTest, self).tearDown() @group("draft") class SubPortQosGroupTest(L3SubPortTestHelper): """ Verifies QoS group setting inherited from parent port or LAG """ def setUp(self): super(SubPortQosGroupTest, self).setUp() def runTest(self): print("\nsubPortQosGroupTest()") try: dscp_to_tc = sai_thrift_qos_map_t( key=sai_thrift_qos_map_params_t(dscp=1), value=sai_thrift_qos_map_params_t(tc=20)) ingr_qos_map_list = sai_thrift_qos_map_list_t( count=1, maplist=[dscp_to_tc]) ingr_qos_map = sai_thrift_create_qos_map( self.client, type=SAI_QOS_MAP_TYPE_DSCP_TO_TC, map_to_value_list=ingr_qos_map_list) tc_col_to_dscp = sai_thrift_qos_map_t( key=sai_thrift_qos_map_params_t(tc=20, color=0), value=sai_thrift_qos_map_params_t(dscp=9)) egr_qos_map_list = sai_thrift_qos_map_list_t( count=1, maplist=[tc_col_to_dscp]) egr_qos_map = sai_thrift_create_qos_map( self.client, type=SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DSCP, map_to_value_list=egr_qos_map_list) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:33:44:55', ip_dst='40.40.1.20', ip_src='30.30.1.1', ip_id=105, ip_tos=4, # dscp 1 ip_ttl=64, dl_vlan_enable=True, vlan_vid=200) qos_exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:12:00', eth_src=ROUTER_MAC, ip_dst='40.40.1.20', ip_src='30.30.1.1', ip_id=105, ip_tos=36, # dscp 9 ip_ttl=63, dl_vlan_enable=True, vlan_vid=200) no_qos_exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:12:00', eth_src=ROUTER_MAC, ip_dst='40.40.1.20', ip_src='30.30.1.1', ip_id=105, ip_tos=4, # dscp 1 ip_ttl=63, dl_vlan_enable=True, vlan_vid=200) # before setting QoS - packet routed without changes print("Sending packet before QoS settings") send_packet(self, self.dev_port10, pkt) verify_packets(self, no_qos_exp_pkt, [self.dev_port11]) print("OK") sai_thrift_set_port_attribute( self.client, self.port10, qos_dscp_to_tc_map=ingr_qos_map) sai_thrift_set_port_attribute( self.client, self.port11, qos_tc_and_color_to_dscp_map=egr_qos_map) # after setting QoS - DSCP rewrited print("Sending packet after QoS settings") send_packet(self, self.dev_port10, pkt) verify_packets(self, qos_exp_pkt, [self.dev_port11]) print("OK - DSCP value rewrited") finally: sai_thrift_set_port_attribute( self.client, self.port11, qos_tc_and_color_to_dscp_map=0) sai_thrift_remove_qos_map(self.client, egr_qos_map) sai_thrift_set_port_attribute( self.client, self.port10, qos_dscp_to_tc_map=0) sai_thrift_remove_qos_map(self.client, ingr_qos_map) def tearDown(self): super(SubPortQosGroupTest, self).tearDown() @group("draft") @group("tunnel") class SubPortTunnelTest(L3SubPortTestHelper): """ Verifies tunnel encap-decap over sub-port """ def setUp(self): super(SubPortTunnelTest, self).setUp() def runTest(self): print("\nsubPortTunnelTest()") iport = self.port26 iport_dev = self.dev_port26 eport = self.port27 eport_dev = self.dev_port27 vlan_id = 999 tun_vni = 2000 tun_ip = "30.30.30.1" lpb_ip = "30.30.30.10" vm_ip = "100.100.1.1" customer_ip = "100.100.2.1" tun_mac = "00:aa:aa:aa:aa:aa" tun_term_mac = "00:bb:bb:bb:bb:bb" customer_mac = "00:ee:ee:ee:ee:ee" try: # underlay configuration uvrf = sai_thrift_create_virtual_router(self.client) # overlay configuration ovrf = sai_thrift_create_virtual_router(self.client) # underlay loopback RIF for tunnel urif_lpb = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK, virtual_router_id=uvrf) # route to tunnel termination IP urif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=uvrf, port_id=eport, outer_vlan_id=vlan_id) # overlay RIF orif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=ovrf, port_id=iport) # encapsulation configuration encap_tunnel_map = sai_thrift_create_tunnel_map( self.client, type=SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI) decap_tunnel_map = sai_thrift_create_tunnel_map( self.client, type=SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID) encap_tunnel_map_entry = sai_thrift_create_tunnel_map_entry( self.client, tunnel_map=encap_tunnel_map, tunnel_map_type=SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI, virtual_router_id_key=ovrf, vni_id_value=tun_vni) decap_tunnel_map_entry = sai_thrift_create_tunnel_map_entry( self.client, tunnel_map=encap_tunnel_map, tunnel_map_type=SAI_TUNNEL_MAP_TYPE_VNI_TO_VIRTUAL_ROUTER_ID, virtual_router_id_value=ovrf, vni_id_key=tun_vni) encap_maps = sai_thrift_object_list_t( count=1, idlist=[encap_tunnel_map]) decap_maps = sai_thrift_object_list_t( count=1, idlist=[decap_tunnel_map]) tunnel = sai_thrift_create_tunnel( self.client, type=SAI_TUNNEL_TYPE_VXLAN, encap_src_ip=sai_ipaddress(lpb_ip), encap_mappers=encap_maps, decap_mappers=decap_maps, encap_ttl_mode=SAI_TUNNEL_TTL_MODE_PIPE_MODEL, decap_ttl_mode=SAI_TUNNEL_TTL_MODE_PIPE_MODEL, underlay_interface=urif_lpb) tunnel_term = sai_thrift_create_tunnel_term_table_entry( self.client, tunnel_type=SAI_TUNNEL_TYPE_VXLAN, action_tunnel_id=tunnel, vr_id=uvrf, type=SAI_TUNNEL_TERM_TABLE_ENTRY_TYPE_P2P, src_ip=sai_ipaddress(tun_ip), dst_ip=sai_ipaddress(lpb_ip)) # route from VM to customer onhop = sai_thrift_create_next_hop(self.client, ip=sai_ipaddress(customer_ip), router_interface_id=orif, type=SAI_NEXT_HOP_TYPE_IP) onbor = sai_thrift_neighbor_entry_t( rif_id=orif, ip_address=sai_ipaddress(customer_ip)) sai_thrift_create_neighbor_entry(self.client, onbor, dst_mac_address=customer_mac, no_host_route=True) customer_route = sai_thrift_route_entry_t( vr_id=ovrf, destination=sai_ipprefix(customer_ip + '/32')) sai_thrift_create_route_entry( self.client, customer_route, next_hop_id=onhop) # route from customer to VM tunnel_nhop = sai_thrift_create_next_hop( self.client, type=SAI_NEXT_HOP_TYPE_TUNNEL_ENCAP, tunnel_id=tunnel, ip=sai_ipaddress(tun_ip), tunnel_mac=tun_mac, tunnel_vni=tun_vni) vm_route = sai_thrift_route_entry_t( vr_id=ovrf, destination=sai_ipprefix(vm_ip + '/32')) sai_thrift_create_route_entry( self.client, vm_route, next_hop_id=tunnel_nhop) unhop = sai_thrift_create_next_hop(self.client, ip=sai_ipaddress(tun_ip), router_interface_id=urif, type=SAI_NEXT_HOP_TYPE_IP) unbor = sai_thrift_neighbor_entry_t( rif_id=urif, ip_address=sai_ipaddress(tun_ip)) sai_thrift_create_neighbor_entry(self.client, unbor, dst_mac_address=tun_term_mac, no_host_route=True) tunnel_route = sai_thrift_route_entry_t( vr_id=uvrf, destination=sai_ipprefix(tun_ip + '/32')) sai_thrift_create_route_entry( self.client, tunnel_route, next_hop_id=unhop) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src=customer_mac, ip_dst=vm_ip, ip_src=customer_ip, ip_id=108, ip_ttl=64) inner_pkt = simple_tcp_packet(eth_dst=tun_mac, eth_src=ROUTER_MAC, ip_dst=vm_ip, ip_src=customer_ip, ip_id=108, ip_ttl=63) vxlan_pkt = Mask( simple_vxlan_packet(eth_dst=tun_term_mac, eth_src=ROUTER_MAC, ip_dst=tun_ip, ip_src=lpb_ip, ip_id=0, ip_ttl=64, ip_flags=0x2, dl_vlan_enable=True, vlan_vid=vlan_id, with_udp_chksum=False, vxlan_vni=tun_vni, inner_frame=inner_pkt)) vxlan_pkt.set_do_not_care_scapy(UDP, 'sport') print("Sending packet to VM") send_packet(self, iport_dev, pkt) verify_packet(self, vxlan_pkt, eport_dev) print("\tOK") pkt = simple_tcp_packet(eth_dst=customer_mac, eth_src=ROUTER_MAC, ip_dst=customer_ip, ip_src=vm_ip, ip_id=108, ip_ttl=63) inner_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src=tun_mac, ip_dst=customer_ip, ip_src=vm_ip, ip_id=108, ip_ttl=64) vxlan_pkt = simple_vxlan_packet(eth_dst=ROUTER_MAC, eth_src=tun_term_mac, ip_dst=lpb_ip, ip_src=tun_ip, ip_id=0, ip_ttl=64, ip_flags=0x2, dl_vlan_enable=True, vlan_vid=vlan_id, with_udp_chksum=False, vxlan_vni=tun_vni, inner_frame=inner_pkt) print("Sending packet to customer") send_packet(self, eport_dev, vxlan_pkt) verify_packet(self, pkt, iport_dev) print("\tOK") finally: sai_thrift_remove_route_entry(self.client, tunnel_route) sai_thrift_remove_neighbor_entry(self.client, unbor) sai_thrift_remove_next_hop(self.client, unhop) sai_thrift_remove_route_entry(self.client, vm_route) sai_thrift_remove_next_hop(self.client, tunnel_nhop) sai_thrift_remove_route_entry(self.client, customer_route) sai_thrift_remove_neighbor_entry(self.client, onbor) sai_thrift_remove_next_hop(self.client, onhop) sai_thrift_remove_tunnel_term_table_entry(self.client, tunnel_term) sai_thrift_remove_tunnel(self.client, tunnel) sai_thrift_remove_tunnel_map_entry( self.client, decap_tunnel_map_entry) sai_thrift_remove_tunnel_map_entry( self.client, encap_tunnel_map_entry) sai_thrift_remove_tunnel_map(self.client, decap_tunnel_map) sai_thrift_remove_tunnel_map(self.client, encap_tunnel_map) sai_thrift_remove_router_interface(self.client, orif) sai_thrift_remove_router_interface(self.client, urif) sai_thrift_remove_router_interface(self.client, urif_lpb) sai_thrift_remove_virtual_router(self.client, ovrf) sai_thrift_remove_virtual_router(self.client, uvrf) def tearDown(self): super(SubPortTunnelTest, self).tearDown() @group("draft") class L3SviTestHelper(PlatformSaiHelper): """ This class contains base router interface tests for SVI RIFs Topology L3 intf - 10, 11 vlan 100 - 24, 25, 26 vlan 200 - lag10(30, 31), lag11(28, 29) 27 extra port used for testing """ def setUp(self): super(L3SviTestHelper, self).setUp() self.vlan100_rif_counter_in = 0 self.vlan100_rif_counter_out = 0 self.vlan200_rif_counter_in = 0 self.vlan200_rif_counter_out = 0 self.vlan100_bcast_in = 0 self.vlan100_bcast_out = 0 self.vlan200_bcast_in = 0 self.vlan200_bcast_out = 0 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, admin_state=True) 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, admin_state=True) self.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, admin_state=True) # vlan100 with members port24, port25 and port26 self.vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) self.vlan_member100 = 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.vlan_member101 = 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) self.vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=self.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 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) self.dmac1 = '00:11:22:33:44:55' # 10.10.10.1 self.dmac2 = '00:22:22:33:44:55' # 10.10.10.2 self.dmac3 = '00:33:22:33:44:55' # 10.10.10.3 self.dmac4 = '00:44:22:33:44:55' # 11.11.11.1 self.dmac5 = '00:11:33:33:44:55' # 20.10.10.1 self.dmac6 = '00:22:33:33:44:55' # 20.10.10.2 self.dmac7 = '00:44:33:33:44:55' # 20.11.11.1 # create nhop1, nhop2 & nhop3 on SVI self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.1'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.1')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry1, dst_mac_address=self.dmac1) self.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, self.route_entry1, next_hop_id=self.nhop1) self.route_entry1_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:0000/128')) sai_thrift_create_route_entry( self.client, self.route_entry1_v6, next_hop_id=self.nhop1) self.neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry2, dst_mac_address=self.dmac2) self.nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.2'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.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, self.route_entry2, next_hop_id=self.nhop2) self.route_entry2_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:2222/128')) sai_thrift_create_route_entry( self.client, self.route_entry2_v6, next_hop_id=self.nhop2) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.3'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.3')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry3, dst_mac_address=self.dmac3) self.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, self.route_entry3, next_hop_id=self.nhop3) # create nhop and route to L2 intf self.nhop4 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('11.11.0.2'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry4 = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('11.11.0.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry4, dst_mac_address=self.dmac4) self.route_entry4 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('11.11.11.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry4, next_hop_id=self.nhop4) self.route_entry4_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:1111/128')) sai_thrift_create_route_entry( self.client, self.route_entry4_v6, next_hop_id=self.nhop4) self.lag10 = sai_thrift_create_lag(self.client) self.lag10_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.lag10, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) self.lag10_member30 = sai_thrift_create_lag_member( self.client, lag_id=self.lag10, port_id=self.port30) self.lag10_member31 = sai_thrift_create_lag_member( self.client, lag_id=self.lag10, port_id=self.port31) self.lag11 = sai_thrift_create_lag(self.client) self.lag11_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.lag11, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) self.lag11_member28 = sai_thrift_create_lag_member( self.client, lag_id=self.lag11, port_id=self.port28) self.lag11_member29 = sai_thrift_create_lag_member( self.client, lag_id=self.lag11, port_id=self.port29) # vlan200 with members lag10 and lag11 self.vlan200 = sai_thrift_create_vlan(self.client, vlan_id=200) self.vlan_member200 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan200, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan_member201 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan200, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_lag_attribute(self.client, self.lag10, port_vlan_id=200) sai_thrift_set_lag_attribute(self.client, self.lag11, port_vlan_id=200) self.vlan200_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=self.vlan200) # Create nhop5 and nhop6 on SVI self.nhop5 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.10.0.1'), router_interface_id=self.vlan200_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry5 = sai_thrift_neighbor_entry_t( rif_id=self.vlan200_rif, ip_address=sai_ipaddress('20.10.0.1')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry5, dst_mac_address=self.dmac5) self.route_entry5 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('20.10.10.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry5, next_hop_id=self.nhop5) self.route_entry5_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:99aa/128')) sai_thrift_create_route_entry( self.client, self.route_entry5_v6, next_hop_id=self.nhop5) self.nhop6 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.10.0.2'), router_interface_id=self.vlan200_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry6 = sai_thrift_neighbor_entry_t( rif_id=self.vlan200_rif, ip_address=sai_ipaddress('20.10.0.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry6, dst_mac_address=self.dmac6) self.route_entry6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('20.10.10.2/32')) sai_thrift_create_route_entry( self.client, self.route_entry6, next_hop_id=self.nhop6) self.route_entry6_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:1122:3344:5566:7788/128')) sai_thrift_create_route_entry( self.client, self.route_entry6_v6, next_hop_id=self.nhop6) self.nhop7 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('21.11.0.2'), router_interface_id=self.port11_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry7 = sai_thrift_neighbor_entry_t( rif_id=self.port11_rif, ip_address=sai_ipaddress('21.11.0.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry7, dst_mac_address=self.dmac7) self.route_entry7 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('21.11.11.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry7, next_hop_id=self.nhop7) self.route_entry7_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:1122:3344:5566:6677/128')) sai_thrift_create_route_entry( self.client, self.route_entry7_v6, next_hop_id=self.nhop7) def tearDown(self): # When removing nhop, neighbor and route, calling api in this order: # route -> nhop -> neighbor # Related Issue: https://github.com/opencomputeproject/SAI/issues/1607 sai_thrift_remove_route_entry(self.client, self.route_entry5) sai_thrift_remove_route_entry(self.client, self.route_entry5_v6) sai_thrift_remove_route_entry(self.client, self.route_entry6) sai_thrift_remove_route_entry(self.client, self.route_entry6_v6) sai_thrift_remove_route_entry(self.client, self.route_entry7) sai_thrift_remove_route_entry(self.client, self.route_entry7_v6) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry5) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry6) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry7) sai_thrift_remove_next_hop(self.client, self.nhop5) sai_thrift_remove_next_hop(self.client, self.nhop6) sai_thrift_remove_next_hop(self.client, self.nhop7) sai_thrift_set_lag_attribute(self.client, self.lag10, port_vlan_id=0) sai_thrift_set_lag_attribute(self.client, self.lag11, port_vlan_id=0) sai_thrift_remove_router_interface(self.client, self.vlan200_rif) sai_thrift_remove_vlan_member(self.client, self.vlan_member200) sai_thrift_remove_vlan_member(self.client, self.vlan_member201) sai_thrift_remove_vlan(self.client, self.vlan200) sai_thrift_remove_lag_member(self.client, self.lag10_member30) sai_thrift_remove_lag_member(self.client, self.lag10_member31) sai_thrift_remove_lag_member(self.client, self.lag11_member28) sai_thrift_remove_lag_member(self.client, self.lag11_member29) sai_thrift_remove_bridge_port(self.client, self.lag10_bp) sai_thrift_remove_bridge_port(self.client, self.lag11_bp) sai_thrift_remove_lag(self.client, self.lag10) sai_thrift_remove_lag(self.client, self.lag11) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_route_entry(self.client, self.route_entry1_v6) sai_thrift_remove_route_entry(self.client, self.route_entry2) sai_thrift_remove_route_entry(self.client, self.route_entry2_v6) sai_thrift_remove_route_entry(self.client, self.route_entry3) sai_thrift_remove_route_entry(self.client, self.route_entry4) sai_thrift_remove_route_entry(self.client, self.route_entry4_v6) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry2) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry4) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_next_hop(self.client, self.nhop2) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_next_hop(self.client, self.nhop4) sai_thrift_remove_router_interface(self.client, self.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, self.vlan_member100) sai_thrift_remove_vlan_member(self.client, self.vlan_member101) sai_thrift_remove_vlan_member(self.client, self.vlan_member102) sai_thrift_remove_vlan(self.client, self.vlan100) sai_thrift_remove_bridge_port(self.client, self.port24_bp) sai_thrift_remove_bridge_port(self.client, self.port25_bp) sai_thrift_remove_bridge_port(self.client, self.port26_bp) super(L3SviTestHelper, self).tearDown() @group("draft") class SviRifIPv4DisableTest(L3SviTestHelper): """ Verifies if IPv4 packets are dropped when admin_v4_state is False """ def setUp(self): super(SviRifIPv4DisableTest, self).setUp() def runTest(self): print("\nsviRifIPv4DisableTest()") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, pktlen=100) exp_pkt = simple_tcp_packet(eth_dst='00:44:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63, pktlen=100) vlan_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', dl_vlan_enable=True, vlan_vid=100, ip_id=105, ip_ttl=64, pktlen=104) try: print("Sending packet on port %d, routed" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, routed" % self.dev_port25) send_packet(self, self.dev_port25, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, routed" % self.dev_port26) send_packet(self, self.dev_port26, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Disable IPv4 on ingress RIF") sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, admin_v4_state=False) print("Sending packet on port %d, dropped" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, dropped" % self.dev_port25) send_packet(self, self.dev_port25, pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, dropped" % self.dev_port26) send_packet(self, self.dev_port26, pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_in += 1 port27_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port27, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) print("Verify setting for new vlan member") vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) print("Sending packet on port %d, dropped" % self.dev_port27) send_packet(self, self.dev_port27, vlan_pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_in += 1 sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, admin_v4_state=True) print("Sending packet on port %d, routed" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, routed" % self.dev_port25) send_packet(self, self.dev_port25, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, routed" % self.dev_port26) send_packet(self, self.dev_port26, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Verify setting for new vlan member") vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) print("Sending packet on port %d, routed" % self.dev_port27) send_packet(self, self.dev_port27, vlan_pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 finally: sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_bridge_port(self.client, port27_bp) def tearDown(self): super(SviRifIPv4DisableTest, self).tearDown() @group("draft") class SviRifIPv6DisableTest(L3SviTestHelper): """ Verifies IPv6 packets are dropped when admin_v6_state is False """ def setUp(self): super(SviRifIPv6DisableTest, self).setUp() def runTest(self): print("\nsviRifIPv6DisableTest()") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111', ipv6_src='2000::1', ipv6_hlim=64, pktlen=100) vlan_pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=100, ipv6_hlim=64, pktlen=104) exp_pkt = simple_tcpv6_packet( eth_dst='00:44:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111', ipv6_src='2000::1', ipv6_hlim=63, pktlen=100) try: print("Sending packet on port %d, routed" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Disable IPv4 on ingress RIF") sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, admin_v6_state=False) print("Sending packet on port %d, dropped" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_in += 1 port27_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port27, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) print("Verify setting for new vlan member") vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) print("Sending packet on port %d, dropped" % self.dev_port27) send_packet(self, self.dev_port27, vlan_pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_in += 1 sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, admin_v6_state=True) print("Sending packet on port %d, routed" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Verify setting for new vlan member") vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) print("Sending packet on port %d, routed" % self.dev_port27) send_packet(self, self.dev_port27, vlan_pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 finally: sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_bridge_port(self.client, port27_bp) def tearDown(self): super(SviRifIPv6DisableTest, self).tearDown() @group("draft") class SviBridgingTest(L3SviTestHelper): """ Verifies L2 bridging on an SVI port if rmac miss and L2 flooding on an SVI if broadcast packet is received """ def setUp(self): super(SviBridgingTest, self).setUp() def runTest(self): print("\nsviBridgingTest()") sai_thrift_set_vlan_attribute( self.client, self.vlan100, learn_disable=True) mac_action = SAI_PACKET_ACTION_FORWARD pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:44:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) pkt2 = simple_tcp_packet(eth_dst='00:77:66:55:44:44', eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, pktlen=104) pkt3 = simple_tcp_packet(eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:22:22:22', ip_dst='255.255.225.255', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, pktlen=104) try: print("Sending packet on port %d to port %d, (192.168.0.1 -> " "11.11.11.1) Routed" % (self.dev_port24, self.dev_port10)) send_packet(self, self.dev_port24, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d to port %d, (192.168.0.1 -> " "11.11.11.1) Routed" % (self.dev_port25, self.dev_port10)) send_packet(self, self.dev_port25, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d to port %d, (192.168.0.1 -> " "11.11.11.1) Routed" % (self.dev_port26, self.dev_port10)) send_packet(self, self.dev_port26, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) self.vlan100_rif_counter_in += 1 print("Sending packet on port %d, (192.168.0.1 -> 11.11.11.1) " "flood (missed RMAC)" % (self.dev_port24)) send_packet(self, self.dev_port24, pkt2) verify_packets(self, pkt2, [self.dev_port25, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 print("Sending packet on port %d, (192.168.0.1 -> 11.11.11.1) " "flood (missed RMAC)" % (self.dev_port25)) send_packet(self, self.dev_port25, pkt2) verify_packets(self, pkt2, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 print("Sending packet on port %d, (192.168.0.1 -> 11.11.11.1) " "flood (missed RMAC)" % (self.dev_port26)) send_packet(self, self.dev_port26, pkt2) verify_packets(self, pkt2, [self.dev_port25, self.dev_port24]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:77:66:55:44:44', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) print("Sending packet on port %d to port %d, (192.168.0.1 -> " "11.11.11.1) Routed" % (self.dev_port25, self.dev_port24)) send_packet(self, self.dev_port25, pkt2) verify_packets(self, pkt2, [self.dev_port24]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 print("Sending packet on port %d to port %d, (192.168.0.1 -> " "11.11.11.1) Routed" % (self.dev_port26, self.dev_port24)) send_packet(self, self.dev_port26, pkt2) verify_packets(self, pkt2, [self.dev_port24]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 print("Sending broadcast packet on port %d, (192.168.0.1 -> " "255.255.255.255) flood" % (self.dev_port24)) send_packet(self, self.dev_port24, pkt3) verify_packets(self, pkt3, [self.dev_port25, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 print("Sending broadcast packet on port %d, (192.168.0.1 -> " "255.255.255.255) flood" % (self.dev_port25)) send_packet(self, self.dev_port25, pkt3) verify_packets(self, pkt3, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 print("Sending broadcast packet on port %d, (192.168.0.1 -> " "255.255.255.255) flood" % (self.dev_port26)) send_packet(self, self.dev_port26, pkt3) verify_packets(self, pkt3, [self.dev_port25, self.dev_port24]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) sai_thrift_set_vlan_attribute( self.client, self.vlan100, learn_disable=False) def tearDown(self): super(SviBridgingTest, self).tearDown() @group("draft") class SviHostTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via static MAC entry """ def setUp(self): super(SviHostTest, self).setUp() def runTest(self): print("\nsviHostTest()") mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry1 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry1, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) fdb_entry2 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:22:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry2, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port25_bp, packet_action=mac_action) 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) pkt1 = 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:22: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) pkt2 = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt2 = simple_tcp_packet(eth_dst='00:44:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending packet port %d to port %d, (192.168.0.1 -> " "10.10.10.1) Routed" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) self.vlan100_rif_counter_out += 1 print("Sending packet port %d to port %d, (192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt1) verify_packets(self, exp_pkt1, [self.dev_port25]) self.vlan100_rif_counter_out += 1 print("Sending packet port %d to port %d, (192.168.0.1 -> " "11.11.11.1) Routed" % (self.dev_port24, self.dev_port10)) send_packet(self, self.dev_port24, pkt2) verify_packets(self, exp_pkt2, [self.dev_port10]) self.vlan100_rif_counter_in += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry1) sai_thrift_remove_fdb_entry(self.client, fdb_entry2) def tearDown(self): super(SviHostTest, self).tearDown() @group("draft") class SviHostVlanTaggingTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via static MAC entry on tagged member """ def setUp(self): super(SviHostVlanTaggingTest, self).setUp() def runTest(self): print("\nsviHostVlanTaggingTest()") print("Test routing after NHOP resolved via static MAC entry") mac_action = SAI_PACKET_ACTION_FORWARD port27_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port27, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:33:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=port27_bp, packet_action=mac_action) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.3', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:33:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.3', ip_src='192.168.0.1', dl_vlan_enable=True, vlan_vid=100, ip_id=105, ip_ttl=63, pktlen=104) try: print("Sending packet port %d to port %d, (192.168.0.1 -> " "10.10.10.3)" % (self.dev_port10, self.dev_port27)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port27]) self.vlan100_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_bridge_port(self.client, port27_bp) def tearDown(self): super(SviHostVlanTaggingTest, self).tearDown() @group("draft") class SviToSviRoutingTest(L3SviTestHelper): ''' vlan100/24 -> vlan200/lag10 vlan100/27 -> vlan200/lag10 vlan200/lag10 -> vlan100/24 vlan200/lag10 -> vlan100/27 ''' def setUp(self): super(SviToSviRoutingTest, self).setUp() def runTest(self): print("\nsviToSviRoutingTest()") print("Test routing between SVI") mac_action = SAI_PACKET_ACTION_FORWARD port27_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port27, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) fdb_entry27 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address=self.dmac2, bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry27, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=port27_bp, packet_action=mac_action) fdb_entry24 = 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, fdb_entry24, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) fdb_entry_lag10 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address=self.dmac5, bv_id=self.vlan200) sai_thrift_create_fdb_entry(self.client, fdb_entry_lag10, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag10_bp, packet_action=mac_action) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src=self.dmac1, ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_ttl=64) tagged_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src=self.dmac2, ip_dst='20.10.10.1', ip_src='192.168.0.1', dl_vlan_enable=True, vlan_vid=100, ip_ttl=64, pktlen=104) exp_pkt = simple_tcp_packet(eth_dst=self.dmac5, eth_src=ROUTER_MAC, ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_ttl=63) tagged_exp_pkt = simple_tcp_packet(eth_dst=self.dmac2, eth_src=ROUTER_MAC, ip_dst='10.10.10.2', ip_src='192.168.0.1', dl_vlan_enable=True, vlan_vid=100, ip_ttl=63, pktlen=104) try: print("Sending packet port %d to LAG, (192.168.0.1 -> 20.10.10.1)" % (self.dev_port24)) send_packet(self, self.dev_port24, pkt) verify_packet_any_port(self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan100_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 print("Sending packet port %d to LAG, (192.168.0.1 -> 20.10.10.1)" % (self.dev_port27)) send_packet(self, self.dev_port27, tagged_pkt) verify_packet_any_port(self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan100_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 pkt['Ethernet'].src = self.dmac5 pkt['IP'].dst = '10.10.10.1' exp_pkt['Ethernet'].dst = self.dmac1 exp_pkt['IP'].dst = '10.10.10.1' tagged_exp_pkt['Ethernet'].dst = self.dmac1 tagged_exp_pkt['IP'].dst = '10.10.10.1' print("Sending packet LAG to port %d, (192.168.0.1 -> 10.10.10.1)" % (self.dev_port24)) send_packet(self, self.dev_port30, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) self.vlan200_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 pkt['Ethernet'].src = self.dmac5 pkt['IP'].dst = '10.10.10.2' tagged_exp_pkt['Ethernet'].dst = self.dmac2 tagged_exp_pkt['IP'].dst = '10.10.10.2' print("Sending packet LAG to port %d, (192.168.0.1 -> 10.10.10.2)" % (self.dev_port27)) send_packet(self, self.dev_port30, pkt) verify_packets(self, tagged_exp_pkt, [self.dev_port27]) self.vlan200_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry_lag10) sai_thrift_remove_fdb_entry(self.client, fdb_entry27) sai_thrift_remove_fdb_entry(self.client, fdb_entry24) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_bridge_port(self.client, port27_bp) sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviToSviRoutingTest, self).tearDown() @group("draft") class SviIPv4HostPostRoutedFloodTest(L3SviTestHelper): """ Verifies post routed flood when static mac entry is missing """ def setUp(self): super(SviIPv4HostPostRoutedFloodTest, self).setUp() def runTest(self): print("\nsviIPv4HostPostRoutedFloodTest()") print("Test post routed flood when static mac entry is missing") mac_action = SAI_PACKET_ACTION_FORWARD 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) print("Sending packet from port %d, (192.168.0.1 -> 10.10.10.1)" % self.dev_port10) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24, self.dev_port25, self.dev_port26]) self.vlan100_rif_counter_out += 3 print("Install static mac on port %d, should not flood now" % self.dev_port24) fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) print("Sending packet from port %d to port %d, (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) self.vlan100_rif_counter_out += 1 print("Removed static mac and now packet " "will be flooded after routed") sai_thrift_remove_fdb_entry(self.client, fdb_entry) print("Sending packet from port %d, (192.168.0.1 -> 10.10.10.1)" % self.dev_port10) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24, self.dev_port25, self.dev_port26]) self.vlan100_rif_counter_out += 3 def tearDown(self): super(SviIPv4HostPostRoutedFloodTest, self).tearDown() @group("draft") class SviIPv6HostPostRoutedFloodTest(L3SviTestHelper): """ Verifies IPv6 host post routed flood when static mac entry is missing """ def setUp(self): super(SviIPv6HostPostRoutedFloodTest, self).setUp() def runTest(self): print("\nsviIPv6HostPostRoutedFloodTest()") print("Test post routed flood when static mac entry is missing") mac_action = SAI_PACKET_ACTION_FORWARD pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=64) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=63) print("Sending packet from port %d" % self.dev_port10) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [ self.dev_port24, self.dev_port25, self.dev_port26]) self.vlan100_rif_counter_out += 3 print("Install static mac on port %d, " "should not flood now" % self.dev_port24) fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) print("Sending packet from port %d to port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) self.vlan100_rif_counter_out += 1 print("Removed static mac and now packet will be " "flooded after routed") sai_thrift_remove_fdb_entry(self.client, fdb_entry) print("Sending packet from port %d" % self.dev_port10) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [ self.dev_port24, self.dev_port25, self.dev_port26]) self.vlan100_rif_counter_out += 3 def tearDown(self): super(SviIPv6HostPostRoutedFloodTest, self).tearDown() @group("draft") class SviIPv4HostStaticMacMoveTest(L3SviTestHelper): """ Verifies static configuration of MAC address on port and change of this configuration """ def setUp(self): super(SviIPv4HostStaticMacMoveTest, self).setUp() def runTest(self): print("\nsviIPv4HostStaticMacMoveTest()") mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) 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("MAC installed on port %d" % (self.dev_port24)) print("Sending packet from port %d to port %d, (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) self.vlan100_rif_counter_out += 1 print("Move MAC to port %d from port %d" % (self.dev_port25, self.dev_port24)) sai_thrift_set_fdb_entry_attribute( self.client, fdb_entry, bridge_port_id=self.port25_bp) print("Sending packet from port %d to port %d, (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port25]) self.vlan100_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIPv4HostStaticMacMoveTest, self).tearDown() @group("draft") class SviIPv6HostStaticMacMoveTest(L3SviTestHelper): """ Verifies static configuration of MAC address on port and change of this configuration """ def setUp(self): super(SviIPv6HostStaticMacMoveTest, self).setUp() def runTest(self): print("\nsviIPv6HostStaticMacMoveTest()") mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=64,) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=63) try: print("MAC installed on port %d" % (self.dev_port24)) print("Sending packet from port %d to port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port24]) self.vlan100_rif_counter_out += 1 print("Move MAC to port %d from port %d" % (self.dev_port25, self.dev_port24)) sai_thrift_set_fdb_entry_attribute( self.client, fdb_entry, bridge_port_id=self.port25_bp) print("Sending packet from port %d to port %d" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port25]) self.vlan100_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIPv6HostStaticMacMoveTest, self).tearDown() @group("draft") class SviRouteDynamicMacTest(L3SviTestHelper): """ Verifies dynamic MAC address managment test for the VLAN router interface """ def setUp(self): super(SviRouteDynamicMacTest, self).setUp() def runTest(self): print("\nsviRouteDynamicMacTest()") arp_pkt = simple_arp_packet(eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:55', arp_op=1, ip_tgt='10.10.10.1', ip_snd='10.10.10.2', hw_snd='00:22:22:33:44:55', pktlen=100) arp_pkt2 = simple_arp_packet(eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:66', arp_op=1, ip_tgt='10.10.10.1', ip_snd='10.10.10.12', hw_snd='00:22:22:33:44:55', pktlen=100) pkt = 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_pkt = simple_tcp_packet(eth_dst='00:22: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) pkt2 = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.12', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt2 = simple_tcp_packet(eth_dst='00:22:22:33:44:66', eth_src=ROUTER_MAC, ip_dst='10.10.10.12', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending ARP request on port %d (10.10.10.2 -> " "10.10.10.1) Flood" % self.dev_port25) send_packet(self, self.dev_port25, arp_pkt) verify_packets(self, arp_pkt, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 time.sleep(3) print("Nexthop 2 resolved on port %d 00:22:22:33:44:55" % self.dev_port25) print("Sending packet port %d -> port %d192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port25]) self.vlan100_rif_counter_out += 1 print("Learn new MAC before creating neighbor") print("Sending ARP request on port %d (10.10.10.12 -> " "10.10.10.1) Flood" % self.dev_port25) send_packet(self, self.dev_port25, arp_pkt2) verify_packets(self, arp_pkt2, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 time.sleep(3) print("Create neighbor entry for new MAC") dmac = '00:22:22:33:44:66' neighbor_entry = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.12')) 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.0.12'), router_interface_id=self.vlan100_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.12/32')) sai_thrift_create_route_entry( self.client, route_entry, next_hop_id=nhop) print("Nexthop 2 resolved on port %d 00:22:22:33:44:66" % self.dev_port25) print("Sending packet port %d -> port %d 192.168.0.1 -> " "10.10.10.12) Routed" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt2) verify_packets(self, exp_pkt2, [self.dev_port25]) self.vlan100_rif_counter_out += 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) sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviRouteDynamicMacTest, self).tearDown() @group("draft") class SviRouteDynamicMacMoveTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via dynamically learn MAC entry is moved """ def setUp(self): super(SviRouteDynamicMacMoveTest, self).setUp() def runTest(self): print("\nsviRouteDynamicMacMoveTest()") arp_pkt = simple_arp_packet(eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:55', arp_op=1, ip_tgt='10.10.10.1', ip_snd='10.10.10.2', hw_snd='00:22:22:33:44:55', pktlen=100) pkt = 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_pkt = simple_tcp_packet(eth_dst='00:22: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 ARP request on port %d (10.10.10.2 -> " "10.10.10.1) Flood" % self.dev_port25) send_packet(self, self.dev_port25, arp_pkt) verify_packets(self, arp_pkt, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 time.sleep(3) print("Nexthop 2 resolved on port %d 00:22:22:33:44:55" % self.dev_port25) print("Sending packet port %d -> port %d 192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port25]) self.vlan100_rif_counter_out += 1 # Src MAC move to port 4 print("Sending ARP request on port %d (10.10.10.2 -> " "10.10.10.1) Flood" % self.dev_port26,) send_packet(self, self.dev_port26, arp_pkt) verify_packets(self, arp_pkt, [self.dev_port24, self.dev_port25]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 time.sleep(3) print("Nexthop 2 resolved on port %d 00:22:22:33:44:55" % self.dev_port25) print("Sending packet port %d -> port %d 192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port26)) pkt[IP].dst = '10.10.10.2' exp_pkt[IP].dst = '10.10.10.2' send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt, [self.dev_port26]) self.vlan100_rif_counter_out += 1 finally: sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviRouteDynamicMacMoveTest, self).tearDown() @group("draft") class SviIPv4ArpMoveTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via dynamically learn MAC entry for the IPv4 standard """ def setUp(self): super(SviIPv4ArpMoveTest, self).setUp() def runTest(self): print("\nsviIPv4ArpMoveTest()") print("Test routing after NHOP resolved via dynamically learn " "MAC entry") arp_pkt1 = simple_arp_packet(eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:55', arp_op=1, ip_tgt='10.10.10.1', ip_snd='10.10.10.2', hw_snd='00:22:22:33:44:55', pktlen=100) arp_pkt2 = simple_arp_packet(eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:66', arp_op=1, ip_tgt='10.10.10.1', ip_snd='10.10.10.2', hw_snd='00:22:22:33:44:66', pktlen=100) pkt = 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:22: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) exp_pkt2 = simple_tcp_packet(eth_dst='00:22:22:33:44:66', eth_src=ROUTER_MAC, ip_dst='10.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: # Learn 00:22:22:33:44:55 print("Sending ARP request on port %d (10.10.10.2 -> " "10.10.10.1) Flood" % self.dev_port25) send_packet(self, self.dev_port25, arp_pkt1) verify_packets(self, arp_pkt1, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 # Learn 00:22:22:33:44:66 print("Sending ARP request on port %d (10.10.10.2 -> " "10.10.10.1) Flood" % self.dev_port26,) send_packet(self, self.dev_port26, arp_pkt2) verify_packets(self, arp_pkt2, [self.dev_port24, self.dev_port25]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 time.sleep(3) print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt1, [self.dev_port25]) self.vlan100_rif_counter_out += 1 print("Update neighbor to 00:22:22:33:44:66") sai_thrift_set_neighbor_entry_attribute( self.client, self.neighbor_entry2, dst_mac_address="00:22:22:33:44:66") print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port26)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt2, [self.dev_port26]) self.vlan100_rif_counter_out += 1 print("Update neighbor back to 00:22:22:33:44:55") sai_thrift_set_neighbor_entry_attribute( self.client, self.neighbor_entry2, dst_mac_address="00:22:22:33:44:55") print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.2) Routed" % (self.dev_port10, self.dev_port25)) send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt1, [self.dev_port25]) self.vlan100_rif_counter_out += 1 finally: sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviIPv4ArpMoveTest, self).tearDown() @group("draft") class SviIPv6IcmpMoveTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via dynamically learn MAC entry for the IPv6 standard """ def setUp(self): super(SviIPv6IcmpMoveTest, self).setUp() def runTest(self): print("\nsviIPv6IcmpMoveTest()") print("Test routing after NHOP resolved via dynamically learn " "MAC entry") icmp_pkt1 = simple_icmpv6_packet( eth_dst='33:33:00:FF:FF:FF', eth_src='00:22:22:33:44:55', ipv6_src='1234:5678:9abc:def0:4422:1133:5577:2222', ipv6_dst='FF02::1', ipv6_hlim=64) icmp_pkt2 = simple_icmpv6_packet( eth_dst='33:33:00:FF:FF:FF', eth_src='00:22:22:33:44:66', ipv6_src='1234:5678:9abc:def0:4422:1133:5577:2222', ipv6_dst='FF02::1', ipv6_hlim=64) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:2222', ipv6_src='2000::1', ipv6_hlim=64,) exp_pkt1 = simple_tcpv6_packet( eth_dst='00:22:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:2222', ipv6_src='2000::1', ipv6_hlim=63) exp_pkt2 = simple_tcpv6_packet( eth_dst='00:22:22:33:44:66', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:2222', ipv6_src='2000::1', ipv6_hlim=63) try: # Learn 00:22:22:33:44:55 print("Sending ICMP request on port %d" % self.dev_port25, " Flood") send_packet(self, self.dev_port25, icmp_pkt1) verify_packets(self, icmp_pkt1, [self.dev_port24, self.dev_port26]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 # Learn 00:22:22:33:44:66 print("Sending ICMP request on port %d" % self.dev_port26, " Flood") send_packet(self, self.dev_port26, icmp_pkt2) verify_packets(self, icmp_pkt2, [self.dev_port24, self.dev_port25]) self.vlan100_rif_counter_in += 1 self.vlan100_rif_counter_out += 2 self.vlan100_bcast_in += 1 self.vlan100_bcast_out += 2 time.sleep(3) print("Sending packet port %d" % self.dev_port10, " -> port %d" % self.dev_port25, " Routed") send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt1, [self.dev_port25]) self.vlan100_rif_counter_out += 1 print("Update neighbor to 00:22:22:33:44:66") sai_thrift_set_neighbor_entry_attribute( self.client, self.neighbor_entry2, dst_mac_address="00:22:22:33:44:66") print("Sending packet port %d" % self.dev_port10, " -> port %d" % self.dev_port26, " Routed") send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt2, [self.dev_port26]) self.vlan100_rif_counter_out += 1 print("Update neighbor back to 00:22:22:33:44:55") sai_thrift_set_neighbor_entry_attribute( self.client, self.neighbor_entry2, dst_mac_address="00:22:22:33:44:55") print("Sending packet port %d" % self.dev_port10, " -> port %d" % self.dev_port25, " Routed") send_packet(self, self.dev_port10, pkt) verify_packets(self, exp_pkt1, [self.dev_port25]) self.vlan100_rif_counter_out += 1 finally: sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviIPv6IcmpMoveTest, self).tearDown() @group("draft") class SviLagHostTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via static MAC entry on LAG """ def setUp(self): super(SviLagHostTest, self).setUp() def runTest(self): print("\nsviLagHostTest()") print("Test routing after NHOP resolved via static MAC entry") mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry1 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:33:33:44:55', bv_id=self.vlan200) sai_thrift_create_fdb_entry(self.client, fdb_entry1, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag10_bp, packet_action=mac_action) fdb_entry2 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:22:33:33:44:55', bv_id=self.vlan200) sai_thrift_create_fdb_entry(self.client, fdb_entry2, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag11_bp, packet_action=mac_action) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) pkt1 = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='20.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt1 = simple_tcp_packet(eth_dst='00:22:33:33:44:55', eth_src=ROUTER_MAC, ip_dst='20.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) pkt2 = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='21.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt2 = simple_tcp_packet(eth_dst='00:44:33:33:44:55', eth_src=ROUTER_MAC, ip_dst='21.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending packet port %d to lag 3, (192.168.0.1 -> " "20.10.10.1) Routed" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 print("Sending packet port %d to lag 4, (192.168.0.1 -> " "20.10.10.2) Routed" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt1) verify_packet_any_port( self, exp_pkt1, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_out += 1 print("Sending packet port %d to port %d (192.168.0.1 -> " "21.11.11.1) Routed" % (self.dev_port15, self.dev_port11)) send_packet(self, self.dev_port30, pkt2) verify_packet(self, exp_pkt2, self.dev_port11) self.vlan200_rif_counter_in += 1 print("Sending packet port %d to port %d, (192.168.0.1 -> " "21.11.11.1) Routed" % (self.dev_port16, self.dev_port11)) send_packet(self, self.dev_port31, pkt2) verify_packet(self, exp_pkt2, self.dev_port11) self.vlan200_rif_counter_in += 1 finally: sai_thrift_flush_fdb_entries( self.client, entry_type=SAI_FDB_FLUSH_ENTRY_TYPE_ALL) def tearDown(self): super(SviLagHostTest, self).tearDown() @group("draft") class SviIPv4LagHostStaticMacMoveTest(L3SviTestHelper): """ Verifies moving MAC address between ports on LAG for the IPv4 """ def setUp(self): super(SviIPv4LagHostStaticMacMoveTest, self).setUp() def runTest(self): print("\nsviIPv4LagHostStaticMacMoveTest()") mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:33:33:44:55', bv_id=self.vlan200) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag10_bp, packet_action=mac_action) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ip_dst='20.10.10.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: print("Sending packet port %d to lag 10, (192.168.0.1 -> " "20.10.10.1) Routed" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 print("Move MAC to lag 11 from lag 10") sai_thrift_set_fdb_entry_attribute( self.client, fdb_entry, bridge_port_id=self.lag11_bp) print("Sending packet port %d to lag 11, (192.168.0.1 -> " "20.10.10.1) Routed" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIPv4LagHostStaticMacMoveTest, self).tearDown() @group("draft") class SviIPv6LagHostStaticMacMoveTest(L3SviTestHelper): """ Verfies moving MAC address between ports on LAG for the IPv6 """ def setUp(self): super(SviIPv6LagHostStaticMacMoveTest, self).setUp() def runTest(self): print("\nsviIPv6LagHostStaticMacMoveTest()") mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:33:33:44:55', bv_id=self.vlan200) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag10_bp, packet_action=mac_action) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64,) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63) try: print("Sending packet port %d to lag 10, Routed" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 print("Move MAC to lag 11 from lag 10") sai_thrift_set_fdb_entry_attribute( self.client, fdb_entry, bridge_port_id=self.lag11_bp) print("Sending packet port %d to lag 11, Routed" % (self.dev_port11)) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIPv6LagHostStaticMacMoveTest, self).tearDown() @group("draft") class SviLagHostDynamicMacTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via dynamically learn MAC entry for LAG """ def setUp(self): super(SviLagHostDynamicMacTest, self).setUp() def runTest(self): print("\nsviLagHostDynamicMacTest()") print("Test routing after NHOP resolved via dynamically learn" "MAC entry") arp_pkt = simple_arp_packet(eth_dst="FF:FF:FF:FF:FF:FF", eth_src='00:22:33:33:44:55', arp_op=1, ip_tgt='20.10.10.1', ip_snd='20.10.10.2', hw_snd='00:22:22:33:44:55', pktlen=100) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='20.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:22:33:33:44:55', eth_src=ROUTER_MAC, ip_dst='20.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: # src MAC learnt on port 2 resulting in nhop2 resolution print("Sending ARP request on port %d" % self.dev_port30, " (10.10.10.2 -> 20.10.10.1) Flood on lag 4") send_packet(self, self.dev_port30, arp_pkt) verify_packet_any_port( self, arp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 self.vlan200_bcast_in += 1 self.vlan200_bcast_out += 1 time.sleep(3) print("Nexthop 2 resolved on lag 10", "00:22:33:33:44:55") print("Sending ARP request on port %d" % self.dev_port11, " (10.10.10.2 -> 20.10.10.1) Flood on lag 3") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 finally: sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviLagHostDynamicMacTest, self).tearDown() @group("draft") class SviIPv4LagHostDynamicMacMoveTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via dynamically learn MAC entry is moved for the IPv4 on LAG """ def setUp(self): super(SviIPv4LagHostDynamicMacMoveTest, self).setUp() def runTest(self): print("\nSVIIPv4LagHostDynamicMacMoveTest()") print("Test routing after NHOP resolved via dynamically learn " "MAC entry") arp_pkt = simple_arp_packet(eth_dst="FF:FF:FF:FF:FF:FF", eth_src='00:22:33:33:44:55', arp_op=1, ip_tgt='20.10.10.1', ip_snd='20.10.10.2', hw_snd='00:22:22:33:44:55', pktlen=100) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='20.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:22:33:33:44:55', eth_src=ROUTER_MAC, ip_dst='20.10.10.2', ip_src='192.168.0.1', ip_id=105, ip_ttl=63) try: # src MAC learnt on port 14 resulting in nhop2 resolution print("Sending ARP request on port %d" % self.dev_port30, " (10.10.10.2 -> 20.10.10.1) Flood on lag 4") send_packet(self, self.dev_port30, arp_pkt) verify_packet_any_port( self, arp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 self.vlan200_bcast_in += 1 self.vlan200_bcast_out += 1 time.sleep(3) print("Nexthop 2 resolved on lag 10", "00:22:33:33:44:55") print("Sending ARP request on port %d" % self.dev_port11, " (10.10.10.2 -> 20.10.10.1) Flood on lag 3") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 # src MAC move to port 17 print("Sending ARP request on port %d" % self.dev_port28, " (10.10.10.2 -> 20.10.10.1) Flood on lag 3") send_packet(self, self.dev_port28, arp_pkt) verify_packet_any_port( self, arp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 self.vlan200_bcast_in += 1 self.vlan200_bcast_out += 1 time.sleep(3) print("Nexthop 2 resolved on lag 10", "00:22:33:33:44:55") print("Sending ARP request on port %d" % self.dev_port11, " (10.10.10.2 -> 20.10.10.1) Flood on lag 11") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_out += 1 finally: sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviIPv4LagHostDynamicMacMoveTest, self).tearDown() @group("draft") class SviIPv6LagHostDynamicMacMoveTest(L3SviTestHelper): """ Verifies routing after NHOP resolved via dynamically learn MAC entry is moved for the IPv6 on LAG """ def setUp(self): super(SviIPv6LagHostDynamicMacMoveTest, self).setUp() def runTest(self): print("\nsviIPv6LagHostDynamicMacMoveTest()") print("Test routing after NHOP resolved via dynamically learn" "MAC entry") icmp_pkt = simple_icmpv6_packet( eth_dst='33:33:00:FF:FF:FF', eth_src='00:22:33:33:44:55', ipv6_src='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_dst='FF02::1', ipv6_hlim=64) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_src='2000::1', ipv6_hlim=64,) exp_pkt = simple_tcpv6_packet( eth_dst='00:22:33:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:1122:3344:5566:7788', ipv6_src='2000::1', ipv6_hlim=63) try: # src MAC learnt on port 14 resulting in nhop2 resolution print("Sending ICMP request on port %d" % self.dev_port30, " Flood on lag 11") send_packet(self, self.dev_port30, icmp_pkt) verify_packet_any_port( self, icmp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 self.vlan200_bcast_in += 1 self.vlan200_bcast_out += 1 time.sleep(3) print("Nexthop 2 resolved on lag 10", "00:22:33:33:44:55") print("Sending ICMP request on port %d" % self.dev_port11, " Flood on lag 10") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 # src MAC move to port 17 print("Sending ICMP request on port %d" % self.dev_port28, " Flood on lag 10") send_packet(self, self.dev_port28, icmp_pkt) verify_packet_any_port( self, icmp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_in += 1 self.vlan200_rif_counter_out += 1 self.vlan200_bcast_in += 1 self.vlan200_bcast_out += 1 time.sleep(3) print("Nexthop 2 resolved on lag 10", "00:22:33:33:44:55") print("Sending ICMP request on port %d" % self.dev_port11, " Flood on lag 11") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port28, self.dev_port29]) self.vlan200_rif_counter_out += 1 finally: sai_thrift_flush_fdb_entries(self.client) def tearDown(self): super(SviIPv6LagHostDynamicMacMoveTest, self).tearDown() @group("draft") class SviIPv4MtuTest(L3SviTestHelper): """ Verifies if IPv4 packet is forwarded, dropped and punted to CPU depending on the MTU with and without a trap for SVI """ def setUp(self): super(SviIPv4MtuTest, self).setUp() def runTest(self): print("\nsviIPv4MtuTest()") # set MTU to 200 for vlan100_rif sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, mtu=200) try: mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) print("Max MTU is 200, send pkt size 199, send to port") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_id=105, ip_ttl=64, pktlen=199 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_id=105, ip_ttl=63, pktlen=199 + 14) print("Sending packet port %d -> port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.vlan100_rif_counter_out += 1 print("Max MTU is 200, send pkt size 200, send to port") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_id=105, ip_ttl=64, pktlen=200 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_id=105, ip_ttl=63, pktlen=200 + 14) print("Sending packet port %d -> port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.vlan100_rif_counter_out += 1 print("Max MTU is 200, send pkt size 201, drop") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_id=105, ip_ttl=64, pktlen=201 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_id=105, ip_ttl=63, pktlen=201 + 14) print("Sending packet port %d" % self.dev_port10, " dropped") send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_out += 1 # set MTU to 201 for vlan100_rif print("Setting MTU to 201, send pkt size 201, sent to port") sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, mtu=201) print("Sending packet port %d -> port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.vlan100_rif_counter_out += 1 print("Max MTU is 201, send pkt size 202, drop") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.10.1', ip_id=105, ip_ttl=64, pktlen=202 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_id=105, ip_ttl=63, pktlen=202 + 14) print("Sending packet port %d" % self.dev_port10, " dropped") send_packet(self, self.dev_port10, pkt) verify_no_other_packets(self, timeout=1) self.vlan100_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIPv4MtuTest, self).tearDown() @group("draft") class SviIPv6MtuTest(L3SviTestHelper): """ Verifies if IPv6 packet is forwarded, dropped and punted to CPU depending on the MTU with and without a trap for SVI """ def setUp(self): super(SviIPv6MtuTest, self).setUp() def runTest(self): print("\nsviIPv6MtuTest()") # set MTU to 200 for vlan200_rif sai_thrift_set_router_interface_attribute( self.client, self.vlan200_rif, mtu=200) try: mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:33:33:44:55', bv_id=self.vlan200) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag10_bp, packet_action=mac_action) print("Max MTU is 200, send pkt size 199, send to lag") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=199 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=199 + 14 + 40) print("Sending packet port %d" % self.dev_port11, " -> lag 10") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 print("Max MTU is 200, send pkt size 200, send to lag") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=200 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=200 + 14 + 40) print("Sending packet port %d" % self.dev_port11, " -> lag 10") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 print("Max MTU is 200, send pkt size 201, drop") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=201 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=201 + 14 + 40) print("Sending packet port %d" % self.dev_port11, " drop") send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.vlan200_rif_counter_out += 1 # set MTU to 200 for vlan200_rif sai_thrift_set_router_interface_attribute( self.client, self.vlan200_rif, mtu=201) print("Setting MTU to 201, send pkt size 201, sent to lag") print("Sending packet port %d" % self.dev_port11, " -> lag 10") send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port30, self.dev_port31]) self.vlan200_rif_counter_out += 1 print("Max MTU is 201, send pkt size 202, drop") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=202 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:33:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=202 + 14 + 40) print("Sending packet port %d" % self.dev_port11, " drop") send_packet(self, self.dev_port11, pkt) verify_no_other_packets(self, timeout=1) self.vlan200_rif_counter_out += 1 finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIPv6MtuTest, self).tearDown() @group("draft") class SviTaggingTest(L3SviTestHelper): """ Verifies if packet is not routed if tagged packet ingresses on untagged SVI and if packet is dropped if unknown vlan tagged packet ingresses on tagged SVI """ def setUp(self): super(SviTaggingTest, self).setUp() def runTest(self): print("\nsviTaggingTest()") vlan_id = 100 nhop_ip = "30.30.30.1" dst_ip = "30.30.30.10" src_ip = "10.10.10.10" dst_mac = "00:12:34:56:78:90" src_mac = "00:09:87:65:43:21" untagged_port = self.dev_port24 tagged_port = self.dev_port27 test_erif = self.port12_rif tag_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src=src_mac, ip_dst=dst_ip, ip_src=src_ip, dl_vlan_enable=True, vlan_vid=vlan_id + 1, ip_ttl=64, pktlen=104) try: # add tagged VLAN member port27_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port27, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) nbor = sai_thrift_neighbor_entry_t( rif_id=test_erif, ip_address=sai_ipaddress(nhop_ip)) sai_thrift_create_neighbor_entry( self.client, nbor, dst_mac_address=dst_mac) nhop = sai_thrift_create_next_hop(self.client, ip=sai_ipaddress(nhop_ip), router_interface_id=test_erif, type=SAI_NEXT_HOP_TYPE_IP) route_entry = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix(nhop_ip + '/24')) sai_thrift_create_route_entry( self.client, route_entry, next_hop_id=nhop) print("Sending tagged packet on untagged SVI port") send_packet(self, untagged_port, tag_pkt) verify_no_other_packets(self) print("Dropped") print("Sending unknown tagged packet on tagged SVI port") send_packet(self, tagged_port, tag_pkt) verify_no_other_packets(self) print("Dropped") 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, nbor) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_bridge_port(self.client, port27_bp) def tearDown(self): super(SviTaggingTest, self).tearDown() @group("draft") class SviMyIPTest(L3SviTestHelper): """ Verifies if MYIP works for subnet routes """ def setUp(self): super(SviMyIPTest, self).setUp() def runTest(self): print("\nsviMyIPTest()") vlan_id = 10 test_vlan = self.vlan10 untagged_port = self.dev_port0 tagged_port = self.dev_port1 try: # create SVI on VLAN 10 vlan10_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=test_vlan) sw_attr = sai_thrift_get_switch_attribute( self.client, cpu_port=True) cpu_port = sw_attr['cpu_port'] ip2me_route = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.20.1/32')) sai_thrift_create_route_entry( self.client, ip2me_route, next_hop_id=cpu_port) myip_trap_group = sai_thrift_create_hostif_trap_group( self.client, admin_state=True, queue=4) myip_trap = sai_thrift_create_hostif_trap( self.client, trap_group=myip_trap_group, packet_action=SAI_PACKET_ACTION_TRAP, trap_type=SAI_HOSTIF_TRAP_TYPE_IP2ME) self.assertTrue(myip_trap != 0) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.20.1', ip_src='30.30.0.1', ip_id=105, ip_ttl=64, pktlen=100) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) send_packet(self, untagged_port, 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) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.20.1', ip_src='30.30.0.1', dl_vlan_enable=True, vlan_vid=vlan_id, ip_id=105, ip_ttl=64, pktlen=100) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) send_packet(self, tagged_port, 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_hostif_trap(self.client, myip_trap) sai_thrift_remove_hostif_trap_group(self.client, myip_trap_group) sai_thrift_remove_route_entry(self.client, ip2me_route) sai_thrift_remove_router_interface(self.client, vlan10_rif) def tearDown(self): super(SviMyIPTest, self).tearDown() @group("draft") class SviStatsTest(L3SviTestHelper): """ Verifies Ingress and Egress SVI packets stats """ def setUp(self): super(SviStatsTest, self).setUp() def runTest(self): print("\nsviStatsTest()") vlan100_rif_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.vlan100_rif) vlan200_rif_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.vlan200_rif) vlan100_stats = query_counter( self, sai_thrift_get_vlan_stats, self.vlan100) vlan200_stats = query_counter( self, sai_thrift_get_vlan_stats, self.vlan200) self.assertTrue(self.vlan100_rif_counter_in == vlan100_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.vlan100_rif_counter_out == vlan100_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.vlan200_rif_counter_in == vlan200_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.vlan200_rif_counter_out == vlan200_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.vlan100_bcast_in == vlan100_stats[ 'SAI_VLAN_STAT_IN_NON_UCAST_PKTS']) self.assertTrue(self.vlan100_bcast_out == vlan100_stats[ 'SAI_VLAN_STAT_OUT_NON_UCAST_PKTS']) self.assertTrue((self.vlan100_rif_counter_in - self.vlan100_bcast_in) == vlan100_stats['SAI_VLAN_STAT_IN_UCAST_PKTS']) self.assertTrue((self.vlan100_rif_counter_out - self.vlan100_bcast_out) == vlan100_stats['SAI_VLAN_STAT_OUT_UCAST_PKTS']) self.assertTrue(self.vlan200_bcast_in == vlan200_stats['SAI_VLAN_STAT_IN_NON_UCAST_PKTS']) self.assertTrue(self.vlan200_bcast_out == vlan200_stats['SAI_VLAN_STAT_OUT_NON_UCAST_PKTS']) self.assertTrue((self.vlan200_rif_counter_in - self.vlan200_bcast_in) == vlan200_stats['SAI_VLAN_STAT_IN_UCAST_PKTS']) self.assertTrue((self.vlan200_rif_counter_out - self.vlan200_bcast_out) == vlan200_stats['SAI_VLAN_STAT_OUT_UCAST_PKTS']) def tearDown(self): super(SviStatsTest, self).tearDown() @group("draft") class IncorrectVlanIdTest(L3SviTestHelper): """ Verifies if RIF creation fails when TYPE is VLAN and vlan_id is 0 """ def setUp(self): super(IncorrectVlanIdTest, self).setUp() def runTest(self): print("\nincorrectVlanIdTest()") try: vlan_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=0) self.assertFalse(vlan_rif != 0) finally: if vlan_rif: sai_thrift_remove_router_interface(self.client, vlan_rif) def tearDown(self): super(IncorrectVlanIdTest, self).tearDown() @group("draft") class DuplicateVlanRifCreationTest(L3SviTestHelper): """ Verifies if duplicate VLAN interface creation fails """ def setUp(self): super(DuplicateVlanRifCreationTest, self).setUp() def runTest(self): print("duplicateVlanRifCreationTest") existing_rif_vlan = self.vlan30 try: dupl_vlan_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_VLAN, virtual_router_id=self.default_vrf, vlan_id=existing_rif_vlan) self.assertFalse(dupl_vlan_rif != 0) finally: if dupl_vlan_rif: sai_thrift_remove_router_interface(self.client, dupl_vlan_rif) def tearDown(self): super(DuplicateVlanRifCreationTest, self).tearDown() @group("draft") class SviArpReplyTest(L3SviTestHelper): """ Verifies ARP replies from linux interface on tagged and untagged RIF """ def setUp(self): super(SviArpReplyTest, self).setUp() def runTest(self): print("\nsviArpReplyTest()") untagged_port = self.port24 untagged_dev_port = self.dev_port24 utg_hostif_name = "utg_hostif" utg_port_ip = "20.20.0.10" utg_port_mac = "00:01:01:01:01:01" src_mac1 = "00:aa:aa:aa:aa:01" tagged_port = self.port27 tagged_dev_port = self.dev_port27 tg_hostif_name = "tg_hostif" tg_port_ip = "20.20.0.20" tg_port_mac = "00:02:02:02:02:02" src_mac2 = "00:aa:aa:aa:aa:02" src_ip = "20.20.0.1" arp_req_pkt = simple_arp_packet(arp_op=1, pktlen=100, eth_src=src_mac1, hw_snd=src_mac1, ip_snd=src_ip, ip_tgt=utg_port_ip) arp_resp_pkt = simple_arp_packet(arp_op=2, pktlen=42, eth_src=utg_port_mac, eth_dst=src_mac1, hw_snd=utg_port_mac, hw_tgt=src_mac1, ip_snd=utg_port_ip, ip_tgt=src_ip) tg_arp_req_pkt = simple_arp_packet(arp_op=1, pktlen=100, eth_src=src_mac2, hw_snd=src_mac2, ip_snd=src_ip, ip_tgt=tg_port_ip, vlan_vid=100) tg_arp_resp_pkt = simple_arp_packet(arp_op=2, pktlen=28, eth_src=tg_port_mac, eth_dst=src_mac2, hw_snd=tg_port_mac, hw_tgt=src_mac2, ip_snd=tg_port_ip, ip_tgt=src_ip) try: # add tagged VLAN member port27_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port27, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) arp_trap_group = sai_thrift_create_hostif_trap_group( self.client, admin_state=True, queue=4) arp_trap = sai_thrift_create_hostif_trap( self.client, packet_action=SAI_PACKET_ACTION_TRAP, trap_type=SAI_HOSTIF_TRAP_TYPE_ARP_REQUEST) self.assertTrue(arp_trap != 0) utg_hostif = sai_thrift_create_hostif(self.client, name=utg_hostif_name, obj_id=untagged_port, type=SAI_HOSTIF_TYPE_NETDEV) self.assertTrue(utg_hostif != 0) utg_hif_socket = open_packet_socket(utg_hostif_name) # set untagged port host interface IP address os.system("ifconfig %s %s/24" % (utg_hostif_name, utg_port_ip)) os.system("ifconfig %s hw ether %s" % (utg_hostif_name, utg_port_mac)) os.system("sudo ifconfig %s up" % utg_hostif_name) hostif_ip = os.popen("ifconfig %s | grep 'inet addr' | " "cut -d: -f2 | awk '{print $1}'" % utg_hostif_name).read() self.assertEqual(hostif_ip.rstrip(), utg_port_ip) tg_hostif = sai_thrift_create_hostif(self.client, name=tg_hostif_name, obj_id=tagged_port, type=SAI_HOSTIF_TYPE_NETDEV) self.assertTrue(tg_hostif != 0) tg_hif_socket = open_packet_socket(tg_hostif_name) # set tagged port host interface IP address os.system("ifconfig %s %s/24" % (tg_hostif_name, tg_port_ip)) os.system("ifconfig %s hw ether %s" % (tg_hostif_name, tg_port_mac)) os.system("sudo ifconfig %s up" % tg_hostif_name) hostif_ip = os.popen("ifconfig %s | grep 'inet addr' | " "cut -d: -f2 | awk '{print $1}'" % tg_hostif_name).read() self.assertEqual(hostif_ip.rstrip(), tg_port_ip) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) print("Sending ARP request on untagged port") send_packet(self, untagged_dev_port, arp_req_pkt) self.assertTrue(socket_verify_packet(arp_req_pkt, utg_hif_socket)) verify_packet(self, arp_resp_pkt, untagged_dev_port) print("Response received on the untagged port") 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) print("Request received on CPU port") pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue4) print("Sending ARP request on tagged port") send_packet(self, tagged_dev_port, tg_arp_req_pkt) self.assertTrue( socket_verify_packet(tg_arp_req_pkt, tg_hif_socket)) verify_packet(self, tg_arp_resp_pkt, tagged_dev_port) print("Response received on the tagged port") 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) print("Request received on CPU port") finally: sai_thrift_flush_fdb_entries(self.client) sai_thrift_remove_hostif(self.client, tg_hostif) sai_thrift_remove_hostif(self.client, utg_hostif) sai_thrift_remove_hostif_trap(self.client, arp_trap) sai_thrift_remove_hostif_trap_group(self.client, arp_trap_group) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_bridge_port(self.client, port27_bp) def tearDown(self): super(SviArpReplyTest, self).tearDown() @group("draft") @group("mtu-trap") class L3MtuTrapTestHelper(PlatformSaiHelper): """ This class contains router interface tests where packets are forwarded or punted to CPU depending on the MTU """ def setUp(self): super(L3MtuTrapTestHelper, self).setUp() self.port10_rif_counter_in = 0 self.port10_rif_counter_out = 0 self.port11_rif_counter_in = 0 self.port11_rif_counter_out = 0 self.lag1_rif_counter_in = 0 self.lag1_rif_counter_out = 0 self.subport10_100_in = 0 self.subport10_100_out = 0 self.subport11_200_in = 0 self.subport11_200_out = 0 self.vlan100_rif_counter_in = 0 self.vlan100_rif_counter_out = 0 dmac1 = '00:11:22:33:44:55' dmac3 = '00:33:22:33:44:55' self.lag1_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.lag1) self.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) self.neighbor_entry1 = 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, self.neighbor_entry1, dst_mac_address=dmac1) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.lag1_rif, ip_address=sai_ipaddress('12.10.10.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry3, dst_mac_address=dmac3) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('12.10.10.2'), router_interface_id=self.lag1_rif, type=SAI_NEXT_HOP_TYPE_IP) self.route_entry0 = 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, self.route_entry0, next_hop_id=self.nhop1) self.route_entry0_lpm = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('11.11.11.0/24')) sai_thrift_create_route_entry( self.client, self.route_entry0_lpm, next_hop_id=self.nhop1) self.route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:99aa/128')) sai_thrift_create_route_entry( self.client, self.route_entry1, next_hop_id=self.nhop1) self.route_entry1_lpm = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('4000::0/65')) sai_thrift_create_route_entry( self.client, self.route_entry1_lpm, next_hop_id=self.nhop1) self.route_lag0 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('12.10.10.1/32')) sai_thrift_create_route_entry( self.client, self.route_lag0, next_hop_id=self.nhop3) self.route_lag1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:1122:3344:5566:7788/128')) sai_thrift_create_route_entry( self.client, self.route_lag1, next_hop_id=self.nhop3) # add subport 100 on port10 self.subport10_100 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port10, admin_v4_state=True, outer_vlan_id=100) self.nhop_sp10_100 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.0.10'), router_interface_id=self.subport10_100, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp10_100 = sai_thrift_neighbor_entry_t( rif_id=self.subport10_100, ip_address=sai_ipaddress('20.20.0.10')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp10_100, dst_mac_address="00:33:33:33:01:00") # add subport 200 on port11 self.subport11_200 = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port11, admin_v4_state=True, outer_vlan_id=200) self.nhop_sp11_200 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.1.20'), router_interface_id=self.subport11_200, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry_sp11_200 = sai_thrift_neighbor_entry_t( rif_id=self.subport11_200, ip_address=sai_ipaddress('20.20.1.20')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry_sp11_200, dst_mac_address="00:33:33:33:12:00") # add subport routes self.route_entry_sp10_100 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.0.10/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp10_100, next_hop_id=self.nhop_sp10_100) self.route_entry_sp10_100_ipv6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:8899/128')) sai_thrift_create_route_entry(self.client, self.route_entry_sp10_100_ipv6, next_hop_id=self.nhop_sp10_100) self.route_entry_sp11_200 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('40.40.1.20/32')) sai_thrift_create_route_entry(self.client, self.route_entry_sp11_200, next_hop_id=self.nhop_sp11_200) 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, admin_state=True) 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, admin_state=True) # vlan100 with members port24 and port25 self.vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) self.vlan_member100 = 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.vlan_member101 = 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=100) sai_thrift_set_port_attribute( self.client, self.port25, port_vlan_id=100) # create vlan100_rif 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) # create nhop100 and routes on SVI self.nhop100 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.1'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry100 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.1')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry100, dst_mac_address=dmac1) self.route_entry100 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.0.100/32')) sai_thrift_create_route_entry( self.client, self.route_entry100, next_hop_id=self.nhop100) self.route_entry100_v6 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix( '1234:5678:9abc:def0:4422:1133:5577:0000/128')) sai_thrift_create_route_entry( self.client, self.route_entry100_v6, next_hop_id=self.nhop100) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry100) sai_thrift_remove_route_entry(self.client, self.route_entry100_v6) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry100) sai_thrift_remove_next_hop(self.client, self.nhop100) sai_thrift_remove_router_interface(self.client, self.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_remove_vlan_member(self.client, self.vlan_member100) sai_thrift_remove_vlan_member(self.client, self.vlan_member101) sai_thrift_remove_vlan(self.client, self.vlan100) sai_thrift_remove_bridge_port(self.client, self.port24_bp) sai_thrift_remove_bridge_port(self.client, self.port25_bp) sai_thrift_remove_route_entry(self.client, self.route_entry_sp10_100) sai_thrift_remove_route_entry( self.client, self.route_entry_sp10_100_ipv6) sai_thrift_remove_route_entry(self.client, self.route_entry_sp11_200) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp11_200) sai_thrift_remove_next_hop(self.client, self.nhop_sp11_200) sai_thrift_remove_router_interface(self.client, self.subport11_200) sai_thrift_remove_neighbor_entry( self.client, self.neighbor_entry_sp10_100) sai_thrift_remove_next_hop(self.client, self.nhop_sp10_100) sai_thrift_remove_router_interface(self.client, self.subport10_100) sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_route_entry(self.client, self.route_entry0_lpm) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_route_entry(self.client, self.route_entry1_lpm) sai_thrift_remove_route_entry(self.client, self.route_lag0) sai_thrift_remove_route_entry(self.client, self.route_lag1) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) sai_thrift_remove_router_interface(self.client, self.lag1_rif) super(L3MtuTrapTestHelper, self).tearDown() @group("draft") class Ipv4MtuTrapTest(L3MtuTrapTestHelper): """ Verifies if IPv4 packet is forwarded or punted to CPU as a trap, depending on the MTU """ def setUp(self): super(Ipv4MtuTrapTest, self).setUp() def runTest(self): print("\nipv4MtuTrapTest()") # set MTU to 200 for port 10 and lag 1 mtu_port10_rif = sai_thrift_get_router_interface_attribute( self.client, self.port10_rif, mtu=True) mtu_lag1_rif = sai_thrift_get_router_interface_attribute( self.client, self.lag1_rif, mtu=True) sai_thrift_set_router_interface_attribute( self.client, self.port10_rif, mtu=200) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=200) try: 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_L3_MTU_ERROR, packet_action=SAI_PACKET_ACTION_TRAP) print("Max MTU is 200, send pkt size 200, send to port/lag") 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, pktlen=200 + 14) 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, pktlen=200 + 14) print("Sending packet port %d -> port %d (192.168.0.1 -> " "10.10.10.1)" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port11_rif_counter_in += 1 self.port10_rif_counter_out += 1 pkt['IP'].dst = '12.10.10.1' exp_pkt['IP'].dst = '12.10.10.1' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d -> lag 1 (192.168.0.1 -> " "12.10.10.1)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 print("Max MTU is 200, send pkt size 201, punted to cpu") 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, pktlen=201 + 14) 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, pktlen=201 + 14) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port11, " -> cpu") send_packet(self, self.dev_port11, pkt) self.port11_rif_counter_in += 1 self.port10_rif_counter_out += 1 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 = '12.10.10.1' pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port11, " -> cpu") send_packet(self, self.dev_port11, pkt) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 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_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) sai_thrift_set_router_interface_attribute( self.client, self.port10_rif, mtu=mtu_port10_rif['mtu']) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=mtu_lag1_rif['mtu']) def tearDown(self): super(Ipv4MtuTrapTest, self).tearDown() @group("draft") class Ipv6MtuTrapTest(L3MtuTrapTestHelper): """ Verifies if IPv6 packet is forwarded or punted to CPU as a trap, depending on the MTU """ def setUp(self): super(Ipv6MtuTrapTest, self).setUp() def runTest(self): print("\nipv6MtuTrapTest()") mtu_port10_rif = sai_thrift_get_router_interface_attribute( self.client, self.port10_rif, mtu=True) mtu_lag1_rif = sai_thrift_get_router_interface_attribute( self.client, self.lag1_rif, mtu=True) # set MTU to 200 for port 10 and lag 1 sai_thrift_set_router_interface_attribute( self.client, self.port10_rif, mtu=200) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=200) try: 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_L3_MTU_ERROR, packet_action=SAI_PACKET_ACTION_TRAP) print("Max MTU is 200, send pkt size 200, send to port/lag") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=200 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=200 + 14 + 40) print("Sending packet port %d -> port %d " "(2000::1 -> 1234:5678:9abc:def0:4422:1133:5577:99aa')" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.port11_rif_counter_in += 1 self.port10_rif_counter_out += 1 pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' exp_pkt['Ethernet'].dst = '00:33:22:33:44:55' print("Sending packet port %d -> lag 1 (2000::1 -> " "1234:5678:9abc:def0:1122:3344:5566:7788)" % self.dev_port11) send_packet(self, self.dev_port11, pkt) verify_packet_any_port( self, exp_pkt, [self.dev_port4, self.dev_port5, self.dev_port6]) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 print("Max MTU is 200, send pkt size 201, punted to cpu") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=64, pktlen=201 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:99aa', ipv6_src='2000::1', ipv6_hlim=63, pktlen=201 + 14 + 40) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port11, " -> cpu") send_packet(self, self.dev_port11, pkt) self.port11_rif_counter_in += 1 self.port10_rif_counter_out += 1 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['IPv6'].dst = '1234:5678:9abc:def0:1122:3344:5566:7788' pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port11, " -> cpu") send_packet(self, self.dev_port11, pkt) self.port11_rif_counter_in += 1 self.lag1_rif_counter_out += 1 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_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) sai_thrift_set_router_interface_attribute( self.client, self.port10_rif, mtu=mtu_port10_rif['mtu']) sai_thrift_set_router_interface_attribute( self.client, self.lag1_rif, mtu=mtu_lag1_rif['mtu']) def tearDown(self): super(Ipv6MtuTrapTest, self).tearDown() @group("draft") class SubPortIpv4MtuTrapTest(L3MtuTrapTestHelper): """ Verifies if IPv4 packet is forwarded or punted to CPU as a trap, depending on the MTU """ def setUp(self): super(SubPortIpv4MtuTrapTest, self).setUp() def runTest(self): print("\nsubPortIpv4MtuTrapTest()") # set MTU to 200 for subport 10_100 sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, mtu=200) try: trap_group = sai_thrift_create_hostif_trap_group( self.client, admin_state=True, queue=0) trap = sai_thrift_create_hostif_trap( self.client, trap_group=trap_group, trap_type=SAI_HOSTIF_TRAP_TYPE_L3_MTU_ERROR, packet_action=SAI_PACKET_ACTION_TRAP) pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=200 + 18) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=200 + 18) print("Max MTU is 200, send pkt size 200, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='40.40.0.10', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=200, pktlen=201 + 18) exp_pkt = simple_tcp_packet(eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ip_dst='40.40.0.10', ip_id=105, ip_ttl=63, dl_vlan_enable=True, vlan_vid=100, pktlen=201 + 18) print("Max MTU is 200, send pkt size 201, punt to cpu") pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port11, " -> cpu") 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) self.subport11_200_in += 1 self.subport10_100_out += 1 finally: sai_thrift_remove_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) def tearDown(self): super(SubPortIpv4MtuTrapTest, self).tearDown() @group("draft") class SubPortIpv6MtuTrapTest(L3MtuTrapTestHelper): """ Verifies if IPv6 packet is forwarded or punted to CPU as a trap, depending on the MTU """ def setUp(self): super(SubPortIpv6MtuTrapTest, self).setUp() def runTest(self): print("\nsubPortIpv6MtuTrapTest()") # set MTU to 200 for subport 10_100 sai_thrift_set_router_interface_attribute( self.client, self.subport10_100, mtu=200) try: 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_L3_MTU_ERROR, packet_action=SAI_PACKET_ACTION_TRAP) pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=200 + 40 + 18) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', ipv6_hlim=63, dl_vlan_enable=True, vlan_vid=100, pktlen=200 + 40 + 18) print("Max MTU is 200, send pkt size 200, send to port") print("Sending packet port %d -> port %d" % (self.dev_port11, self.dev_port10)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) self.subport11_200_in += 1 self.subport10_100_out += 1 pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', dl_vlan_enable=True, vlan_vid=200, ipv6_hlim=64, pktlen=201 + 40 + 18) exp_pkt = simple_tcpv6_packet( eth_dst='00:33:33:33:01:00', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:8899', ipv6_src='2000::1', ipv6_hlim=63, dl_vlan_enable=True, vlan_vid=100, pktlen=201 + 40 + 18) print("Max MTU is 200, send pkt size 201, punt to cpu") pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port11, " -> cpu") 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) self.subport11_200_in += 1 self.subport10_100_out += 1 finally: sai_thrift_remove_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) def tearDown(self): super(SubPortIpv6MtuTrapTest, self).tearDown() @group("draft") class SviIpv4MtuTrapTest(L3MtuTrapTestHelper): """ Verifies if IPv4 packet is forwarded or punted to CPU as a trap, depending on the MTU """ def setUp(self): super(SviIpv4MtuTrapTest, self).setUp() def runTest(self): print("\nsviIpv4MtuTrapTest()") # set MTU to 200 for vlan100_rif sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, mtu=200) try: 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_L3_MTU_ERROR, packet_action=SAI_PACKET_ACTION_TRAP) mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) print("Max MTU is 200, send pkt size 200, send to port") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.0.100', ip_id=105, ip_ttl=64, pktlen=200 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.0.100', ip_id=105, ip_ttl=63, pktlen=200 + 14) print("Sending packet port %d -> port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.port10_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 print("Max MTU is 200, send pkt size 201, send to CPU") pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='10.10.0.100', ip_id=105, ip_ttl=64, pktlen=201 + 14) exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='10.10.0.100', ip_id=105, ip_ttl=63, pktlen=201 + 14) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port10, " -> cpu") send_packet(self, self.dev_port10, pkt) self.port10_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 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_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIpv4MtuTrapTest, self).tearDown() @group("draft") class SviIpv6MtuTrapTest(L3MtuTrapTestHelper): """ Verifies if IPv6 packet is forwarded or punted to CPU as a trap, depending on the MTU """ def setUp(self): super(SviIpv6MtuTrapTest, self).setUp() def runTest(self): print("\nsviIpv6MtuTrapTest()") # set MTU to 200 for vlan100_rif sai_thrift_set_router_interface_attribute( self.client, self.vlan100_rif, mtu=200) try: 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_L3_MTU_ERROR, packet_action=SAI_PACKET_ACTION_TRAP) mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address='00:11:22:33:44:55', bv_id=self.vlan100) sai_thrift_create_fdb_entry(self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) print("Max MTU is 200, send pkt size 200, send to port") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=64, pktlen=200 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=63, pktlen=200 + 14 + 40) print("Sending packet port %d -> port %d" % (self.dev_port10, self.dev_port24)) send_packet(self, self.dev_port10, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.port10_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 print("Max MTU is 200, send pkt size 201, send to cpu") pkt = simple_tcpv6_packet( eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=64, pktlen=201 + 14 + 40) exp_pkt = simple_tcpv6_packet( eth_dst='00:11:22:33:44:55', eth_src=ROUTER_MAC, ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:0000', ipv6_src='2000::1', ipv6_hlim=63, pktlen=201 + 14 + 40) pre_stats = query_counter( self, sai_thrift_get_queue_stats, self.cpu_queue0) print("Sending packet port %d" % self.dev_port10, " -> cpu") send_packet(self, self.dev_port10, pkt) self.port10_rif_counter_in += 1 self.vlan100_rif_counter_out += 1 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_hostif_trap(self.client, trap) sai_thrift_remove_hostif_trap_group(self.client, trap_group) sai_thrift_remove_fdb_entry(self.client, fdb_entry) def tearDown(self): super(SviIpv6MtuTrapTest, self).tearDown() @group("draft") class MtuPacketStatsTest(L3MtuTrapTestHelper): """ Verifies Ingress and Egress RIF stats for unicast packets """ def setUp(self): super(MtuPacketStatsTest, self).setUp() def runTest(self): print("\nmtuPacketStatsTest()") time.sleep(4) port10_rif_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.port10_rif) port11_rif_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.port11_rif) lag1_rif_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.lag1_rif) subport10_100_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.subport10_100) subport11_200_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.subport11_200) vlan100_rif_stats = query_counter( self, sai_thrift_get_router_interface_stats, self.vlan100_rif) self.assertTrue(self.port10_rif_counter_in == port10_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.port10_rif_counter_out == port10_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.port11_rif_counter_in == port11_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.port11_rif_counter_out == port11_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.lag1_rif_counter_in == lag1_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.lag1_rif_counter_out == lag1_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.subport10_100_in == subport10_100_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.subport10_100_out == subport10_100_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.subport11_200_in == subport11_200_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.subport11_200_out == subport11_200_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) self.assertTrue(self.vlan100_rif_counter_in == vlan100_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_IN_PACKETS']) self.assertTrue(self.vlan100_rif_counter_out == vlan100_rif_stats[ 'SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS']) def tearDown(self): super(MtuPacketStatsTest, self).tearDown() @group("draft") class VirtualInterfaceTestHelper(PlatformSaiHelper): """ This class contains virtual router interface tests """ def setUp(self): super(VirtualInterfaceTestHelper, self).setUp() dmac1 = '00:11:22:33:44:55' self.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) self.neighbor_entry1 = 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, self.neighbor_entry1, dst_mac_address=dmac1) self.route_entry0 = 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, self.route_entry0, next_hop_id=self.nhop1) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry0) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) super(VirtualInterfaceTestHelper, self).tearDown() @group("draft") class VirtualInterfaceType(VirtualInterfaceTestHelper): """ Verifies if packet is forwarded correctly before and after MAC address is updated for virtual RIF. """ def setUp(self): super(VirtualInterfaceType, self).setUp() def runTest(self): print("\nVirtualInterfaceType()") new_router_mac = "00:77:66:55:44:44" 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) pkt1 = simple_tcp_packet(eth_dst=new_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_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) try: print("Sending packet on port %d with mac %s, forward" % (self.dev_port11, ROUTER_MAC)) send_packet(self, self.dev_port11, pkt) verify_packet(self, exp_pkt, self.dev_port10) print("Updating src_mac_address to %s" % (new_router_mac)) port11_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.port11, is_virtual=True, src_mac_address=new_router_mac) port11_rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=port11_rif, src_mac_address=True, ) self.assertIsNotNone(port11_rif_attr) src_mac_address = port11_rif_attr.get('src_mac_address') self.assertEqual(src_mac_address, new_router_mac) print("Sending packet on port %d with mac %s, forwarded" % (self.dev_port11, new_router_mac)) send_packet(self, self.dev_port11, pkt1) verify_packet(self, exp_pkt1, self.dev_port10) self.assertTrue(sai_thrift_remove_router_interface( self.client, port11_rif) == 0) finally: pass def tearDown(self): super(VirtualInterfaceType, self).tearDown() @group("draft") class VirtualRIFType(VirtualInterfaceTestHelper): """ Verifies the type of RIF created. """ def setUp(self): super(VirtualRIFType, self).setUp() def runTest(self): print("\nVirtualRIFType()") try: new_router_mac = "00:77:66:55:44:44" v_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.port11, is_virtual=True, src_mac_address=new_router_mac) self.assertGreater(v_rif, 0) v_rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=v_rif, is_virtual=True) is_virtual = None if v_rif_attr is not None: is_virtual = v_rif_attr.get('is_virtual') self.assertEqual(is_virtual, True) self.assertTrue(sai_thrift_remove_router_interface( self.client, v_rif) == 0) finally: pass def tearDown(self): super(VirtualRIFType, self).tearDown() @group("draft") class EnumQueryCapabilityHelper(PlatformSaiHelper): """ This class contains tests that verify enum query capability for supported SAI RIF types. """ def setUp(self): super(EnumQueryCapabilityHelper, self).setUp() self.enum_capab = sai_thrift_query_attribute_enum_values_capability( self.client, SAI_OBJECT_TYPE_ROUTER_INTERFACE, SAI_ROUTER_INTERFACE_ATTR_TYPE) def tearDown(self): super(EnumQueryCapabilityHelper, self).tearDown() @group("draft") class RifTypePort(EnumQueryCapabilityHelper): """ Verifies enum query capability for RIF of type PORT. """ def setUp(self): super(RifTypePort, self).setUp() def runTest(self): print("\nrifTypePort()") rif = self.port10_rif rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=rif, type=True) rif_type = rif_attr.get('type') self.assertIn(rif_type, self.enum_capab) def tearDown(self): super(RifTypePort, self).tearDown() @group("draft") class RifTypeVlan(EnumQueryCapabilityHelper): """ Verifies enum query capability for RIF of type VLAN. """ def setUp(self): super(RifTypeVlan, self).setUp() def runTest(self): print("\nrifTypeVlan()") rif = self.vlan30_rif rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=rif, type=True) rif_type = rif_attr.get('type') self.assertIn(rif_type, self.enum_capab) def tearDown(self): super(RifTypeVlan, self).tearDown() @group("draft") class RifTypeLoopback(EnumQueryCapabilityHelper): """ Verifies enum query capability for RIF of type LOOPBACK. """ def setUp(self): super(RifTypeLoopback, self).setUp() def runTest(self): print("\nrifTypeLoopback()") try: rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_LOOPBACK, virtual_router_id=self.default_vrf) rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=rif, type=True) rif_type = rif_attr.get('type') self.assertIn(rif_type, self.enum_capab) finally: sai_thrift_remove_router_interface(self.client, rif) def tearDown(self): super(RifTypeLoopback, self).tearDown() @group("draft") class RifTypeSubPort(EnumQueryCapabilityHelper): """ Verifies enum query capability for RIF of type SUB_PORT. """ def setUp(self): super(RifTypeSubPort, self).setUp() def runTest(self): print("\nrifTypeSubPort()") try: rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_SUB_PORT, virtual_router_id=self.default_vrf, port_id=self.port24, outer_vlan_id=100) rif_attr = sai_thrift_get_router_interface_attribute( self.client, router_interface_oid=rif, type=True) rif_type = rif_attr.get('type') self.assertIn(rif_type, self.enum_capab) finally: sai_thrift_remove_router_interface(self.client, rif) def tearDown(self): super(RifTypeSubPort, self).tearDown() @group("draft") class SVIRifVlanTestHelper(PlatformSaiHelper): """ This class contains virtual router interface tests for SVIs """ def setUp(self): super(SVIRifVlanTestHelper, self).setUp() 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, admin_state=True) 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, admin_state=True) self.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, admin_state=True) self.vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) self.vlan_member100 = 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.vlan_member101 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=self.port25_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan100, bridge_port_id=self.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 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) self.dmac1 = '00:11:22:33:44:55' # 10.10.10.1 self.dmac2 = '00:22:22:33:44:55' # 10.10.10.2 self.dmac3 = '00:33:22:33:44:55' # 10.10.10.3 self.dmac4 = '00:44:22:33:44:55' # 11.11.11.1 self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.1'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.1')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry1, dst_mac_address=self.dmac1) self.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, self.route_entry1, next_hop_id=self.nhop1) self.neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry2, dst_mac_address=self.dmac2) self.nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.2'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.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, self.route_entry2, next_hop_id=self.nhop2) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.3'), router_interface_id=self.vlan100_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.vlan100_rif, ip_address=sai_ipaddress('10.10.0.3')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry3, dst_mac_address=self.dmac3) self.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, self.route_entry3, next_hop_id=self.nhop3) # create nhop and route to L2 intf self.nhop4 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('11.11.0.2'), router_interface_id=self.port10_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry4 = sai_thrift_neighbor_entry_t( rif_id=self.port10_rif, ip_address=sai_ipaddress('11.11.0.2')) sai_thrift_create_neighbor_entry( self.client, self.neighbor_entry4, dst_mac_address=self.dmac4) self.route_entry4 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('11.11.11.1/32')) sai_thrift_create_route_entry( self.client, self.route_entry4, next_hop_id=self.nhop4) def tearDown(self): sai_thrift_remove_route_entry(self.client, self.route_entry4) sai_thrift_remove_route_entry(self.client, self.route_entry3) sai_thrift_remove_route_entry(self.client, self.route_entry2) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry2) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry4) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_next_hop(self.client, self.nhop2) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_next_hop(self.client, self.nhop4) sai_thrift_remove_router_interface(self.client, self.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, self.vlan_member100) sai_thrift_remove_vlan_member(self.client, self.vlan_member101) sai_thrift_remove_vlan_member(self.client, self.vlan_member102) sai_thrift_remove_vlan(self.client, self.vlan100) sai_thrift_remove_bridge_port(self.client, self.port24_bp) sai_thrift_remove_bridge_port(self.client, self.port25_bp) sai_thrift_remove_bridge_port(self.client, self.port26_bp) super(SVIRifVlanTestHelper, self).tearDown() @group("draft") class SviRifIpv4Test(SVIRifVlanTestHelper): """ Verifies if packet is forwarded correctly before and after MAC address is updated for virtual RIF for SVI's. """ def setUp(self): super(SviRifIpv4Test, self).setUp() def runTest(self): print("\nsviRifIpv4Test()") new_router_mac = "00:77:66:55:44:44" pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, pktlen=100) exp_pkt = simple_tcp_packet(eth_dst='00:44:22:33:44:55', eth_src=ROUTER_MAC, ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=63, pktlen=100) tagged_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64, dl_vlan_enable=True, vlan_vid=100, pktlen=104) pkt1 = simple_tcp_packet(eth_dst=new_router_mac, eth_src='00:22:22:22:22:22', ip_dst='11.11.11.1', ip_src='192.168.0.1', ip_id=105, ip_ttl=64) try: print("Sending packet on port %d, routed" % self.dev_port24) send_packet(self, self.dev_port24, pkt) verify_packets(self, exp_pkt, [self.dev_port10]) print("Adding new virtual SVI rif with new ingress rif rmac") 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, is_virtual=True, src_mac_address=new_router_mac) print("Sending packet on port %d with mac %s, forwarded" % (self.dev_port24, new_router_mac)) send_packet(self, self.dev_port24, pkt1) verify_packet(self, exp_pkt, self.dev_port10) print("Sending tagged packet on port %d with mac %s, forwarded" % (self.dev_port25, new_router_mac)) send_packet(self, self.dev_port25, tagged_pkt) verify_packet(self, exp_pkt, self.dev_port10) print("Sending packet on port %d with mac %s, forwarded" % (self.dev_port26, new_router_mac)) send_packet(self, self.dev_port26, pkt1) verify_packet(self, exp_pkt, self.dev_port10) self.assertTrue(sai_thrift_remove_router_interface( self.client, vlan100_rif) == 0) finally: pass def tearDown(self): super(SviRifIpv4Test, self).tearDown()