ptf/saivlan.py (2,060 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 VLAN tests """ from sai_thrift.sai_headers import * from ptf.dataplane import DataPlane from sai_base_test import * def set_vlan_data(vlan_id=0, ports=None, untagged=None, large_port=0): """ Creates dictionary with vlan data Args: vlan_id (int): VLAN ID number ports (list): ports numbers untagged (list): list of untagged ports large_port (int): the largest port in vlan Return: dictionary: vlan_data_dict """ vlan_data_dict = { "vlan_id": vlan_id, "ports": ports, "untagged": untagged, "large_port": large_port } return vlan_data_dict @group("draft") class L2VlanTest(SaiHelper): """ The class runs VLAN test cases """ def setUp(self): super(L2VlanTest, self).setUp() self.pkt = 0 self.tagged_pkt = 0 self.arp_resp = 0 self.tagged_arp_resp = 0 self.i_pkt_count = 0 self.e_pkt_count = 0 self.mac0 = '00:11:11:11:11:11:11' self.mac1 = '00:22:22:22:22:22:22' self.mac2 = '00:33:33:33:33:33:33' self.mac3 = '00:44:44:44:44:44:44' mac_action = SAI_PACKET_ACTION_FORWARD self.port24_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port24, type=SAI_BRIDGE_PORT_TYPE_PORT, 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.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) self.port28_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=self.port28, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) self.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) 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) self.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) self.vlan10_member3 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=self.port24_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan10_member4 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=self.port25_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) sai_thrift_set_port_attribute( self.client, self.port24, port_vlan_id=10) self.fdb_entry0 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=self.mac0, bv_id=self.vlan10) sai_thrift_create_fdb_entry( self.client, self.fdb_entry0, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port0_bp, packet_action=mac_action) self.fdb_entry1 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=self.mac1, bv_id=self.vlan10) sai_thrift_create_fdb_entry( self.client, self.fdb_entry1, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port1_bp, packet_action=mac_action) self.fdb_entry24 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=self.mac2, bv_id=self.vlan10) sai_thrift_create_fdb_entry( self.client, self.fdb_entry24, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port24_bp, packet_action=mac_action) self.fdb_entry25 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=self.mac3, bv_id=self.vlan10) sai_thrift_create_fdb_entry( self.client, self.fdb_entry25, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port25_bp, packet_action=mac_action) self.lag10 = sai_thrift_create_lag(self.client) self.lag_mbr31 = sai_thrift_create_lag_member( self.client, lag_id=self.lag10, port_id=self.port28) self.lag11 = sai_thrift_create_lag(self.client) self.lag_mbr41 = sai_thrift_create_lag_member( self.client, lag_id=self.lag11, port_id=self.port29) 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.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) # vlan40 self.vlan40 = sai_thrift_create_vlan(self.client, vlan_id=40) self.vlan_member41 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan40, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan_member42 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan40, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member43 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan40, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member44 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan40, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) # vlan50 self.vlan50 = sai_thrift_create_vlan(self.client, vlan_id=50) self.vlan_member51 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan50, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member52 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan50, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan_member53 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan50, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member54 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan50, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) # vlan60 self.vlan60 = sai_thrift_create_vlan(self.client, vlan_id=60) self.vlan_member61 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan60, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member62 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan60, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member63 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan60, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan_member64 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan60, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) # vlan70 self.vlan70 = sai_thrift_create_vlan(self.client, vlan_id=70) self.vlan_member71 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan70, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member72 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan70, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member73 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan70, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member74 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan70, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) def runTest(self): self.forwardingTest() self.nativeVlanTest() self.priorityTaggingTest() self.pvDropTest() self.lagPVMissTest() self.vlanFloodTest() self.vlanFloodEnhancedTest() self.vlanFloodDisableTest() self.vlanStatsTest() self.vlanFloodPruneTest() self.countersClearTest() self.vlanMemberList() self.vlanNegativeTest() self.singleVlanMemberTest() self.vlanIngressAclTest() self.vlanEgressAclTest() self.vlanLearningTest() self.vlanMaxLearnedAddressesTest() def tearDown(self): sai_thrift_set_port_attribute(self.client, self.port24, port_vlan_id=1) sai_thrift_remove_fdb_entry(self.client, self.fdb_entry0) sai_thrift_remove_fdb_entry(self.client, self.fdb_entry1) sai_thrift_remove_fdb_entry(self.client, self.fdb_entry24) sai_thrift_remove_fdb_entry(self.client, self.fdb_entry25) sai_thrift_remove_vlan_member(self.client, self.vlan10_member3) sai_thrift_remove_vlan_member(self.client, self.vlan10_member4) sai_thrift_remove_vlan_member(self.client, self.vlan_member41) sai_thrift_remove_vlan_member(self.client, self.vlan_member42) sai_thrift_remove_vlan_member(self.client, self.vlan_member43) sai_thrift_remove_vlan_member(self.client, self.vlan_member44) sai_thrift_remove_vlan_member(self.client, self.vlan_member51) sai_thrift_remove_vlan_member(self.client, self.vlan_member52) sai_thrift_remove_vlan_member(self.client, self.vlan_member53) sai_thrift_remove_vlan_member(self.client, self.vlan_member54) sai_thrift_remove_vlan_member(self.client, self.vlan_member61) sai_thrift_remove_vlan_member(self.client, self.vlan_member62) sai_thrift_remove_vlan_member(self.client, self.vlan_member63) sai_thrift_remove_vlan_member(self.client, self.vlan_member64) sai_thrift_remove_vlan_member(self.client, self.vlan_member71) sai_thrift_remove_vlan_member(self.client, self.vlan_member72) sai_thrift_remove_vlan_member(self.client, self.vlan_member73) sai_thrift_remove_vlan_member(self.client, self.vlan_member74) sai_thrift_remove_lag_member(self.client, self.lag_mbr31) sai_thrift_remove_lag_member(self.client, self.lag_mbr41) 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_vlan(self.client, self.vlan40) sai_thrift_remove_vlan(self.client, self.vlan50) sai_thrift_remove_vlan(self.client, self.vlan60) sai_thrift_remove_vlan(self.client, self.vlan70) 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) sai_thrift_remove_bridge_port(self.client, self.port27_bp) sai_thrift_remove_bridge_port(self.client, self.port28_bp) sai_thrift_remove_bridge_port(self.client, self.port29_bp) super(L2VlanTest, self).tearDown() def forwardingTest(self): """ Forwarding between ports with different tagging mode """ print("\nforwardingTest()") print("\tAccessToAccessTest") print("Sending L2 packet port 0 -> port 24 [access vlan=10])") pkt = simple_tcp_packet(eth_dst='00:33:33:33:33:33', eth_src='00:11:11:11:11:11', ip_dst='172.16.0.1', ip_id=101, ip_ttl=64) send_packet(self, self.dev_port0, pkt) verify_packet(self, pkt, self.dev_port24) self.i_pkt_count += 1 self.e_pkt_count += 1 print("\tAccessToTrunkTest") print("Sending L2 packet - port 0 -> port 1 [trunk vlan=10])") pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='172.16.0.1', ip_id=102, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='172.16.0.1', dl_vlan_enable=True, vlan_vid=10, ip_id=102, ip_ttl=64, pktlen=104) send_packet(self, self.dev_port0, pkt) verify_packet(self, exp_pkt, self.dev_port1) self.i_pkt_count += 1 self.e_pkt_count += 1 print("\tTrunkToTrunkTest") print("Sending L2 packet - port 1 -> port 25 [trunk vlan=10])") pkt = simple_tcp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=10, ip_dst='172.16.0.1', ip_id=102, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', ip_dst='172.16.0.1', ip_id=102, dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 print("\tTrunkToAccessTest") print("Sending L2 packet - port 1 -> port 0 [trunk vlan=10])") pkt = simple_tcp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=10, ip_dst='172.16.0.1', ip_id=102, ip_ttl=64) exp_pkt = simple_tcp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_dst='172.16.0.1', ip_id=102, ip_ttl=64, pktlen=96) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.i_pkt_count += 1 self.e_pkt_count += 1 def nativeVlanTest(self): """ Verifies forwarding of native vlan on tagged port and on tagged LAG """ print("\nnativeVlanTest()") try: print("Configure vlan 10 with access/trunk members") tag_pkt = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64, pktlen=104) untag_pkt = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', ip_ttl=64, pktlen=100) print("Tx tag packet on trunk port %d -> trunk port %d" % ( self.dev_port1, self.dev_port25)) send_packet(self, self.dev_port1, tag_pkt) verify_packet(self, tag_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 tag_pkt1 = simple_udp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:33:33:33:33:33', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64, pktlen=104) untag_pkt1 = simple_udp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:33:33:33:33:33', ip_ttl=64, pktlen=100) print("Tx tag packet on trunk port %d -> access port %d" % ( self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, tag_pkt1) verify_packet(self, untag_pkt1, self.dev_port0) self.i_pkt_count += 1 self.e_pkt_count += 1 print("Tx untag packet on trunk port %d, " "drop because no native vlan is set" % ( self.dev_port1)) send_packet(self, self.dev_port1, untag_pkt) verify_no_other_packets(self, timeout=1) tag_pkt_40 = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:33:33:33:33:33', dl_vlan_enable=True, vlan_vid=40, ip_ttl=64, pktlen=104) print("Tx incorrect tag [i.e. vlan 40] packet on trunk port %d," "dropped" % (self.dev_port1)) send_packet(self, self.dev_port1, tag_pkt_40) verify_no_other_packets(self, timeout=1) # Enable port's native vlan as vlan 10, which is same as port's # trunk vlan sai_thrift_set_port_attribute( self.client, self.port1, port_vlan_id=10) print("Tx packet on trunk port %d -> trunk port %d" % ( self.dev_port1, self.dev_port25)) send_packet(self, self.dev_port1, tag_pkt) verify_packet(self, tag_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 print("Tx packet on trunk port %d -> access port %d" % ( self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, tag_pkt1) verify_packet(self, untag_pkt1, self.dev_port0) self.i_pkt_count += 1 self.e_pkt_count += 1 print("Tx packet on trunk port %d -> trunk port %d" % ( self.dev_port1, self.dev_port25)) send_packet(self, self.dev_port1, untag_pkt) verify_packet(self, tag_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 print("Tx packet on trunk port %d -> access port %d" % ( self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, untag_pkt1) verify_packet(self, untag_pkt1, self.dev_port0) self.i_pkt_count += 1 self.e_pkt_count += 1 print("Tx incorrect tag [i.e. vlan 40] packet on trunk port %d, " "dropped" % (self.dev_port1)) send_packet(self, self.dev_port1, tag_pkt_40) verify_no_other_packets(self, timeout=1) sai_thrift_set_vlan_attribute( self.client, self.vlan20, learn_disable=True) sai_thrift_set_port_attribute( self.client, self.port2, port_vlan_id=20) sai_thrift_set_port_attribute( self.client, self.port1, port_vlan_id=20) tag_pkt_20 = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=20, ip_ttl=64, pktlen=104) lag1_ports = [self.dev_port7, self.dev_port8, self.dev_port9] print("Tx untag packet on trunk port 2 -> " "Flood to all members of vlan 20 i.e. lag2, port2, port3") send_packet(self, self.dev_port1, untag_pkt) verify_each_packet_on_multiple_port_lists( self, [tag_pkt_20, untag_pkt, tag_pkt_20], [lag1_ports, [self.dev_port2], [self.dev_port3]]) mac = '00:55:55:55:55:55' mac_action = SAI_PACKET_ACTION_FORWARD fdb_entry = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac, bv_id=self.vlan20) sai_thrift_create_fdb_entry( self.client, fdb_entry, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag2_bp, packet_action=mac_action) sai_thrift_set_lag_attribute( self.client, self.lag2, port_vlan_id=20) tag_pkt_lag = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:55:55:55:55:55', dl_vlan_enable=True, vlan_vid=20, ip_ttl=64, pktlen=104) untag_pkt_lag = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:55:55:55:55:55', ip_ttl=64, pktlen=100) print("Tx untag packet on trunk lag2 -> " "Flood to all members of vlan 20 i.e. lag2, port2, port3") send_packet(self, self.dev_port7, untag_pkt_lag) verify_each_packet_on_multiple_port_lists( self, [untag_pkt_lag, tag_pkt_lag], [[self.dev_port2], [self.dev_port3]]) sai_thrift_set_lag_attribute( self.client, self.lag2, port_vlan_id=1) print("Tx tag [vlan 10] packet on trunk port %d -> " "trunk port %d of vlan 10" % ( self.dev_port1, self.dev_port25)) send_packet(self, self.dev_port1, tag_pkt) verify_packet(self, tag_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 print("Update native vlan of trunk port %d - reset to one" % ( self.dev_port1)) sai_thrift_set_port_attribute( self.client, self.port1, port_vlan_id=1) print("Tx untag packet on trunk port 1, " "drop because no native vlan is set") send_packet(self, self.dev_port1, untag_pkt) verify_no_other_packets(self, timeout=1) print("Tx tag [vlan 10] packet on trunk port %d -> " "trunk port %d of vlan 10" % ( self.dev_port1, self.dev_port25)) send_packet(self, self.dev_port1, tag_pkt) verify_packet(self, tag_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 finally: sai_thrift_set_port_attribute( self.client, self.port1, port_vlan_id=1) sai_thrift_remove_fdb_entry(self.client, fdb_entry) sai_thrift_set_vlan_attribute( self.client, self.vlan20, learn_disable=False) def priorityTaggingTest(self): """ Verifies forwarding of priority tagged packets on port and LAG """ print("\npriorityTaggingTest()") mac5 = '00:55:55:55:55:55' mac6 = '00:66:66:66:66:66' mac7 = '00:77:77:77:77:77' mac8 = '00:88:88:88:88:88' mac_action = SAI_PACKET_ACTION_FORWARD vlan_member1 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan20, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member2 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan20, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) fdb_entry1 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac5, bv_id=self.vlan10) sai_thrift_create_fdb_entry( self.client, fdb_entry1, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag1_bp, packet_action=mac_action) fdb_entry2 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac6, bv_id=self.vlan20) sai_thrift_create_fdb_entry( self.client, fdb_entry2, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag2_bp, packet_action=mac_action) fdb_entry3 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac7, bv_id=self.vlan20) sai_thrift_create_fdb_entry( self.client, fdb_entry3, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port26_bp, packet_action=mac_action) fdb_entry4 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac8, bv_id=self.vlan20) sai_thrift_create_fdb_entry( self.client, fdb_entry4, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port27_bp, packet_action=mac_action) try: # access port testing pkt = simple_udp_packet(eth_dst='00:33:33:33:33:33', eth_src='00:11:11:11:11:11', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64, pktlen=104) exp_pkt = simple_udp_packet(eth_dst='00:33:33:33:33:33', eth_src='00:11:11:11:11:11', ip_ttl=64, pktlen=100) print("Sending priority tagged packet on access port %d -> " "access port %d" % (self.dev_port0, self.dev_port24)) send_packet(self, self.dev_port0, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.i_pkt_count += 1 self.e_pkt_count += 1 pkt = simple_udp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) exp_pkt = simple_udp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) print("Sending priority tagged packet on access port %d -> " "trunk port %d" % (self.dev_port0, self.dev_port1)) send_packet(self, self.dev_port0, pkt) verify_packet(self, exp_pkt, self.dev_port1) self.i_pkt_count += 1 self.e_pkt_count += 1 # access port testing LAG pkt = simple_udp_packet(eth_dst='00:33:33:33:33:33', eth_src='00:55:55:55:55:55', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64, pktlen=104) exp_pkt = simple_udp_packet(eth_dst='00:33:33:33:33:33', eth_src='00:55:55:55:55:55', ip_ttl=64, pktlen=100) print("Sending priority tagged packet on access lag1 -> " "access port %d" % (self.dev_port24)) send_packet(self, self.dev_port4, pkt) verify_packet(self, exp_pkt, self.dev_port24) self.i_pkt_count += 1 self.e_pkt_count += 1 pkt = simple_udp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:55:55:55:55:55', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) exp_pkt = simple_udp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:55:55:55:55:55', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) print("Sending priority tagged packet on access lag1 -> " "trunk port %d" % (self.dev_port1)) send_packet(self, self.dev_port4, pkt) verify_packet(self, exp_pkt, self.dev_port1) self.i_pkt_count += 1 self.e_pkt_count += 1 # trunk port testing pkt = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) print("Sending priority tagged packet on trunk port %d to trunk, " "dropped" % (self.dev_port1)) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) pkt = simple_udp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) print("Sending priority tagged packet on trunk port %d to access, " "dropped" % (self.dev_port1)) send_packet(self, self.dev_port1, pkt) verify_no_other_packets(self, timeout=1) # trunk port testing LAG pkt = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:66:66:66:66:66', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) print("Sending priority tagged packet on trunk lag2 to trunk, " "dropped") send_packet(self, self.dev_port7, pkt) verify_no_other_packets(self, timeout=1) pkt = simple_udp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:66:66:66:66:66', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) print("Sending priority tagged packet on trunk lag2 to access, " "dropped") send_packet(self, self.dev_port7, pkt) verify_no_other_packets(self, timeout=1) print("Update native vlan of trunk lag2 with vlan 20") sai_thrift_set_lag_attribute( self.client, self.lag2, port_vlan_id=20) print("Update native vlan of trunk port %d with vlan 10" % ( self.dev_port1)) sai_thrift_set_port_attribute( self.client, self.port1, port_vlan_id=10) pkt = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) exp_pkt = simple_udp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) print("Sending priority tagged packet on trunk port %d -> " "trunk port %d" % (self.dev_port1, self.dev_port25)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port25) self.i_pkt_count += 1 self.e_pkt_count += 1 pkt = simple_udp_packet(eth_dst='00:77:77:77:77:77', eth_src='00:66:66:66:66:66', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64) exp_pkt = simple_udp_packet(eth_dst='00:77:77:77:77:77', eth_src='00:66:66:66:66:66', dl_vlan_enable=True, vlan_vid=20, ip_ttl=64) print("Sending priority tagged packet on trunk lag2 -> " "trunk port %d" % (self.dev_port26)) send_packet(self, self.dev_port7, pkt) verify_packet(self, exp_pkt, self.dev_port26) pkt = simple_udp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64, pktlen=104) exp_pkt = simple_udp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_ttl=64, pktlen=100) print("Sending priority tagged packet on trunk port %d -> " "access port %d" % (self.dev_port1, self.dev_port0)) send_packet(self, self.dev_port1, pkt) verify_packet(self, exp_pkt, self.dev_port0) self.i_pkt_count += 1 self.e_pkt_count += 1 pkt = simple_udp_packet(eth_dst='00:88:88:88:88:88', eth_src='00:66:66:66:66:66', dl_vlan_enable=True, vlan_vid=0, ip_ttl=64, pktlen=104) exp_pkt = simple_udp_packet(eth_dst='00:88:88:88:88:88', eth_src='00:66:66:66:66:66', ip_ttl=64, pktlen=100) print("Sending priority tagged packet on trunk lag2 -> " "access port %d" % (self.dev_port27)) send_packet(self, self.dev_port7, pkt) verify_packet(self, exp_pkt, self.dev_port27) finally: sai_thrift_set_port_attribute( self.client, self.port1, port_vlan_id=1) sai_thrift_set_lag_attribute( self.client, self.lag2, port_vlan_id=1) sai_thrift_remove_fdb_entry(self.client, fdb_entry1) sai_thrift_remove_fdb_entry(self.client, fdb_entry2) sai_thrift_remove_fdb_entry(self.client, fdb_entry3) sai_thrift_remove_fdb_entry(self.client, fdb_entry4) sai_thrift_remove_vlan_member(self.client, vlan_member1) sai_thrift_remove_vlan_member(self.client, vlan_member2) def pvDropTest(self): """ Verifies drops for invalid port-vlan packet on untagged port and tagged port """ print("\npvDropTest()") v100_pkt = simple_tcp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=100, ip_dst='10.0.0.1', ip_ttl=64) untagged_pkt = simple_tcp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_dst='10.0.0.1', ip_ttl=64) v10_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) exp_at_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) v11_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=11, ip_ttl=64) print("Sending L2 vlan100 tagged packet to vlan10 tagged port %d, " "dropped" % (self.dev_port1)) send_packet(self, self.dev_port1, v100_pkt) verify_no_other_packets(self, timeout=1) print("Sending L2 untagged packet to vlan10 tagged port %d, " "dropped" % (self.dev_port1)) send_packet(self, self.dev_port1, untagged_pkt) verify_no_other_packets(self, timeout=1) print("Sending L2 vlan10 tagged packet to vlan10 untagged " "port %d, forwarded" % (self.dev_port0)) send_packet(self, self.dev_port0, v10_pkt) verify_packet(self, exp_at_pkt, self.dev_port1) self.i_pkt_count += 1 self.e_pkt_count += 1 stats = query_counter( self, sai_thrift_get_port_stats, self.port0) if_in_vlan_discards_pre = \ stats['SAI_PORT_STAT_IF_IN_VLAN_DISCARDS'] print("Sending L2 vlan11 tagged packet to vlan 10 untagged" "port %d, dropped" % (self.dev_port0)) send_packet(self, self.dev_port0, v11_pkt) verify_no_other_packets(self, timeout=1) stats = query_counter( self, sai_thrift_get_port_stats, self.port0) if_in_vlan_discards = stats['SAI_PORT_STAT_IF_IN_VLAN_DISCARDS'] self.assertEqual(if_in_vlan_discards_pre + 1, if_in_vlan_discards) def lagPVMissTest(self): """ Verifies drops for invalid port-vlan packet on untagged LAG all members and tagged LAG all members """ print("\nlagPVMissTest()") mac_action = SAI_PACKET_ACTION_FORWARD mac7 = '00:77:77:77:77:77' mac8 = '00:88:88:88:88:88' mac9 = '00:99:99:99:99:99' fdb_entry1 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac7, bv_id=self.vlan20) sai_thrift_create_fdb_entry( self.client, fdb_entry1, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port26_bp, packet_action=mac_action) fdb_entry2 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac8, bv_id=self.vlan40) sai_thrift_create_fdb_entry( self.client, fdb_entry2, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port26_bp, packet_action=mac_action) fdb_entry3 = sai_thrift_fdb_entry_t( switch_id=self.switch_id, mac_address=mac9, bv_id=self.vlan20) sai_thrift_create_fdb_entry( self.client, fdb_entry3, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.lag2_bp, packet_action=mac_action) try: print("Send packet with vlan 20 from port %d to port %d, valid" % ( self.dev_port8, self.dev_port26)) pkt = simple_tcp_packet(eth_dst='00:77:77:77:77:77', eth_src='00:99:99:99:99:99', dl_vlan_enable=True, vlan_vid=20, ip_dst='10.0.0.1', ip_ttl=64) send_packet(self, self.dev_port8, pkt) verify_packet(self, pkt, self.dev_port26) print("Send packet with vlan 40 from port %d, dropped" % ( self.dev_port8)) pkt = simple_tcp_packet(eth_dst='00:88:88:88:88:88', eth_src='00:99:99:99:99:99', dl_vlan_enable=True, vlan_vid=40, ip_dst='10.0.0.1', ip_ttl=64) send_packet(self, self.dev_port8, pkt) verify_no_other_packets(self, timeout=1) print("Send packet with vlan 50 from port %d, dropped" % ( self.dev_port7)) pkt = simple_tcp_packet(eth_dst='00:88:88:88:88:88', eth_src='00:99:99:99:99:99', dl_vlan_enable=True, vlan_vid=50, ip_dst='10.0.0.1', ip_ttl=64) send_packet(self, self.dev_port7, pkt) verify_no_other_packets(self, timeout=1) finally: sai_thrift_remove_fdb_entry(self.client, fdb_entry1) sai_thrift_remove_fdb_entry(self.client, fdb_entry2) sai_thrift_remove_fdb_entry(self.client, fdb_entry3) def vlanIngressAclTest(self): ''' Test sai get vlan ingress ACL attribute ''' print("\nvlanIngressAclTest()") v10_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) exp_at_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) send_packet(self, self.dev_port0, v10_pkt) verify_packet(self, exp_at_pkt, self.dev_port1) try: # create ACL table table_stage = SAI_ACL_STAGE_INGRESS table_bind_points = [SAI_ACL_BIND_POINT_TYPE_VLAN] table_bind_point_type_list = sai_thrift_s32_list_t( count=len(table_bind_points), int32list=table_bind_points) acl_table = sai_thrift_create_acl_table( self.client, acl_stage=table_stage, acl_bind_point_type_list=table_bind_point_type_list) # create ACL table entry dst_ip = '10.0.0.1' dst_ip_mask = '255.255.255.255' dst_ip_t = 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)) packet_action = sai_thrift_acl_action_data_t( parameter=sai_thrift_acl_action_parameter_t( s32=SAI_PACKET_ACTION_DROP)) acl_entry = sai_thrift_create_acl_entry( self.client, table_id=acl_table, priority=10, field_dst_ip=dst_ip_t, action_packet_action=packet_action) # bind acl table to ingress vlan 10 sai_thrift_set_vlan_attribute(self.client, self.vlan10, ingress_acl=acl_table) id = sai_thrift_get_vlan_attribute(self.client, self.vlan10, ingress_acl=acl_table) self.assertEqual(acl_table, id.get('ingress_acl')) send_packet(self, self.dev_port0, v10_pkt) verify_no_other_packets(self, timeout=2) finally: sai_thrift_set_vlan_attribute(self.client, self.vlan10, ingress_acl=0) sai_thrift_remove_acl_entry(self.client, acl_entry) sai_thrift_remove_acl_table(self.client, acl_table) def vlanEgressAclTest(self): ''' Test sai get vlan egress ACL attribute ''' print("\nvlanEgressAclTest()") v10_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) exp_at_pkt = simple_tcp_packet(eth_dst='00:22:22:22:22:22', eth_src='00:11:11:11:11:11', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_ttl=64) send_packet(self, self.dev_port0, v10_pkt) verify_packet(self, exp_at_pkt, self.dev_port1) try: # create ACL table table_stage = SAI_ACL_STAGE_EGRESS table_bind_points = [SAI_ACL_BIND_POINT_TYPE_VLAN] table_bind_point_type_list = sai_thrift_s32_list_t( count=len(table_bind_points), int32list=table_bind_points) acl_table = sai_thrift_create_acl_table( self.client, acl_stage=table_stage, acl_bind_point_type_list=table_bind_point_type_list) # create ACL table entry dst_ip = '10.0.0.1' dst_ip_mask = '255.255.255.255' dst_ip_t = 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)) packet_action = sai_thrift_acl_action_data_t( parameter=sai_thrift_acl_action_parameter_t( s32=SAI_PACKET_ACTION_DROP)) acl_entry = sai_thrift_create_acl_entry( self.client, table_id=acl_table, priority=10, field_dst_ip=dst_ip_t, action_packet_action=packet_action) # bind acl table to egress vlan 20 sai_thrift_set_vlan_attribute(self.client, self.vlan10, egress_acl=acl_table) id = sai_thrift_get_vlan_attribute(self.client, self.vlan10, egress_acl=acl_table) self.assertEqual(acl_table, id.get('egress_acl')) send_packet(self, self.dev_port0, v10_pkt) verify_no_other_packets(self, timeout=2) finally: sai_thrift_set_vlan_attribute(self.client, self.vlan10, egress_acl=0) sai_thrift_remove_acl_entry(self.client, acl_entry) sai_thrift_remove_acl_table(self.client, acl_table) def vlanFloodTest(self): """ Verifies different cases of flooding """ print("\nvlanFloodTest()") sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=40) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=50) sai_thrift_set_lag_attribute(self.client, self.lag10, port_vlan_id=60) sai_thrift_set_lag_attribute(self.client, self.lag11, port_vlan_id=70) try: self.pkt = simple_arp_packet( eth_src='00:22:22:33:44:55', arp_op=1, # ARP request hw_snd='00:22:22:33:44:55', pktlen=100) self.tagged_pkt = simple_arp_packet( eth_src='00:22:22:33:44:55', arp_op=1, # ARP request hw_snd='00:22:22:33:44:55', vlan_vid=30, pktlen=104) self.arp_resp = simple_arp_packet( eth_dst='00:22:22:33:44:55', arp_op=2, # ARP request hw_tgt='00:22:22:33:44:55', pktlen=100) self.tagged_arp_resp = simple_arp_packet( eth_dst='00:22:22:33:44:55', arp_op=2, # ARP request hw_tgt='00:22:22:33:44:55', vlan_vid=30, pktlen=104) vlan_ports = [ self.dev_port26, self.dev_port27, self.dev_port28, self.dev_port29] vlan_data = { self.vlan40: set_vlan_data(40, vlan_ports, [ self.dev_port26], self.dev_port29), self.vlan50: set_vlan_data(50, vlan_ports, [ self.dev_port27], self.dev_port29), self.vlan60: set_vlan_data(60, vlan_ports, [ self.dev_port28], self.dev_port29), self.vlan70: set_vlan_data(70, vlan_ports, [ self.dev_port29], self.dev_port29)} self._basicVlanFloodTest(vlan_data) self.client.sai_thrift_remove_vlan_member(self.vlan_member44) self.client.sai_thrift_remove_vlan_member(self.vlan_member52) self.client.sai_thrift_remove_vlan_member(self.vlan_member63) self.client.sai_thrift_remove_vlan_member(self.vlan_member71) vlan_data = { self.vlan40: set_vlan_data(40, [ self.dev_port26, self.dev_port27, self.dev_port28], [ self.dev_port26], self.dev_port28), self.vlan50: set_vlan_data(50, [ self.dev_port26, self.dev_port28, self.dev_port29], [ self.dev_port0], self.dev_port29), self.vlan60: set_vlan_data(60, [ self.dev_port26, self.dev_port27, self.dev_port29], [ self.dev_port0], self.dev_port29), self.vlan70: set_vlan_data(70, [ self.dev_port27, self.dev_port28, self.dev_port29], [ self.dev_port29], self.dev_port29)} self._basicVlanFloodTest(vlan_data) self.vlan_member44 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan40, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.vlan_member52 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan50, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan_member63 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan60, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) self.vlan_member71 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan70, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_data = { self.vlan40: set_vlan_data( 40, vlan_ports, [ self.dev_port26], self.dev_port29), self.vlan50: set_vlan_data( 50, vlan_ports, [ self.dev_port27], self.dev_port29), self.vlan60: set_vlan_data( 60, vlan_ports, [ self.dev_port28], self.dev_port29), self.vlan70: set_vlan_data( 70, vlan_ports, [ self.dev_port29], self.dev_port29)} self._basicVlanFloodTest(vlan_data) finally: sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=1) sai_thrift_set_lag_attribute( self.client, self.lag10, port_vlan_id=1) sai_thrift_set_lag_attribute( self.client, self.lag11, port_vlan_id=1) def _basicVlanFloodTest(self, vlan_data): """ Checks flooding for the chosen vlan_data Args: vlan_data (dictionary): dictionary which contains dictionaries with VLANs data """ try: for vlan_key in vlan_data.keys(): vlan = vlan_data[vlan_key] print("#### Flooding on %s ####" % (str(vlan["vlan_id"]))) self.tagged_pkt[Dot1Q].vlan = vlan["vlan_id"] self.tagged_arp_resp[Dot1Q].vlan = vlan["vlan_id"] pkt_list = [None] * vlan["large_port"] arp_pkt_list = [None] * vlan["large_port"] for port in vlan["ports"]: if port not in vlan["untagged"]: pkt_list[port - 1] = self.tagged_pkt arp_pkt_list[port - 1] = self.tagged_arp_resp else: pkt_list[port - 1] = self.pkt arp_pkt_list[port - 1] = self.arp_resp for port in vlan["ports"]: print("Testing flooding and learning on port%d" % (port)) other_ports = [p for p in vlan["ports"] if p != port] verify_pkt_list = [pkt_list[pl - 1] for pl in other_ports] print("Sending arp request from port ", port, " flooding on ", other_ports) send_packet(self, port, pkt_list[port - 1]) verify_each_packet_on_each_port( self, verify_pkt_list, other_ports) time.sleep(2) for send_port in other_ports: print("Sending arp response from ", send_port, "->", port) send_packet(self, send_port, arp_pkt_list[send_port - 1]) verify_packets( self, arp_pkt_list[port - 1], [port]) sai_thrift_flush_fdb_entries( self.client, bv_id=vlan_key, entry_type=SAI_FDB_ENTRY_TYPE_DYNAMIC) finally: for vlan_key in vlan_data.keys(): sai_thrift_flush_fdb_entries( self.client, bv_id=vlan_key, entry_type=SAI_FDB_ENTRY_TYPE_DYNAMIC) def vlanFloodEnhancedTest(self): """ Verifies flooding for the vlan which contains ports and LAGs """ print("\nvlanFloodEnhancedTest()") print("Flood test on ports 1,2, lag 1 and 2") vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) vlan_member101 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member104 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member105 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan200 = sai_thrift_create_vlan(self.client, vlan_id=200) vlan_member201 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member202 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member203 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.lag10_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member204 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.lag11_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_vlan_attribute(self.client, vlan100, learn_disable=True) sai_thrift_set_vlan_attribute(self.client, vlan200, learn_disable=True) sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=200) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=200) 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) pkt200 = simple_arp_packet( eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:55', arp_op=1, # ARP request ip_tgt='10.10.10.1', ip_snd='10.10.10.2', hw_snd='00:22:22:33:44:55', pktlen=100) pkt100 = simple_arp_packet( eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:33:44:55', arp_op=1, # ARP request ip_tgt='10.10.10.1', ip_snd='10.10.10.2', hw_snd='00:22:22:33:44:55', vlan_vid=100, pktlen=100) try: print("Add ports 24 and 25 to lag10 and lag11") lag_mbr32 = sai_thrift_create_lag_member( self.client, lag_id=self.lag10, port_id=self.port24) lag_mbr42 = sai_thrift_create_lag_member( self.client, lag_id=self.lag11, port_id=self.port25) lag1_ports = [self.dev_port28, self.dev_port24] lag2_ports = [self.dev_port29, self.dev_port25] send_packet(self, self.dev_port26, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [lag1_ports, lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port28, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port29, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag1_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port30, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag1_ports, lag2_ports, [self.dev_port27]]) print("Remove ports 24 and 25 from lag10 and lag11") sai_thrift_remove_lag_member(self.client, lag_mbr32) sai_thrift_remove_lag_member(self.client, lag_mbr42) lag1_ports = [self.dev_port28] lag2_ports = [self.dev_port29] send_packet(self, self.dev_port26, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [lag1_ports, lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port28, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port29, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag1_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port30, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag1_ports, lag2_ports, [self.dev_port27]]) print("Add ports 24 and 25 to lag10 and lag11") lag_mbr32 = sai_thrift_create_lag_member( self.client, lag_id=self.lag10, port_id=self.port24) lag_mbr42 = sai_thrift_create_lag_member( self.client, lag_id=self.lag11, port_id=self.port25) lag1_ports = [self.dev_port28, self.dev_port24] lag2_ports = [self.dev_port29, self.dev_port25] send_packet(self, self.dev_port26, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [lag1_ports, lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port28, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port29, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag1_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port30, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 4, [[self.dev_port26], lag1_ports, lag2_ports, [self.dev_port27]]) print("Remove port 30 from vlan 100") sai_thrift_remove_vlan_member(self.client, vlan_member105) send_packet(self, self.dev_port26, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 3, [lag1_ports, lag2_ports, [self.dev_port27]]) send_packet(self, self.dev_port28, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 3, [[self.dev_port26], lag2_ports, [self.dev_port27]]) send_packet(self, self.dev_port29, pkt100) verify_each_packet_on_multiple_port_lists( self, [pkt100] * 3, [[self.dev_port26], lag1_ports, [self.dev_port27]]) send_packet(self, self.dev_port27, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 3, [lag1_ports, lag2_ports, [self.dev_port26]]) send_packet(self, self.dev_port24, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 3, [[self.dev_port26], lag2_ports, [self.dev_port27]]) send_packet(self, self.dev_port25, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 3, [[self.dev_port26], lag1_ports, [self.dev_port27]]) print("Add port 30 to vlan 200") vlan_member205 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_port_attribute( self.client, self.port30, port_vlan_id=200) send_packet(self, self.dev_port27, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 4, [lag1_ports, lag2_ports, [self.dev_port26], [self.dev_port30]]) send_packet(self, self.dev_port24, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 4, [[self.dev_port26], lag2_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port25, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 4, [[self.dev_port26], lag1_ports, [self.dev_port27], [self.dev_port30]]) send_packet(self, self.dev_port30, pkt200) verify_each_packet_on_multiple_port_lists( self, [pkt200] * 4, [[self.dev_port26], lag1_ports, lag2_ports, [self.dev_port27]]) finally: sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port30, port_vlan_id=1) sai_thrift_set_lag_attribute( self.client, self.lag10, port_vlan_id=1) sai_thrift_set_lag_attribute( self.client, self.lag11, port_vlan_id=1) sai_thrift_set_vlan_attribute( self.client, vlan100, learn_disable=False) sai_thrift_set_vlan_attribute( self.client, vlan200, learn_disable=False) sai_thrift_remove_vlan_member(self.client, vlan_member101) sai_thrift_remove_vlan_member(self.client, vlan_member102) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_vlan_member(self.client, vlan_member104) sai_thrift_remove_vlan_member(self.client, vlan_member201) sai_thrift_remove_vlan_member(self.client, vlan_member202) sai_thrift_remove_vlan_member(self.client, vlan_member203) sai_thrift_remove_vlan_member(self.client, vlan_member204) sai_thrift_remove_vlan_member(self.client, vlan_member205) sai_thrift_remove_vlan(self.client, vlan100) sai_thrift_remove_vlan(self.client, vlan200) sai_thrift_remove_lag_member(self.client, lag_mbr32) sai_thrift_remove_lag_member(self.client, lag_mbr42) def vlanFloodDisableTest(self): """ Verifies disable flooding for unknown_unicast/unknown_multicast/broadcast """ print("\nvlanFloodDisableTest()") vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) vlan_member101 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port24_bp) vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port25_bp) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port26_bp) vlan_member104 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port27_bp) sai_thrift_set_vlan_attribute(self.client, vlan100, learn_disable=True) 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) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=100) try: flood_control_type_none = SAI_VLAN_FLOOD_CONTROL_TYPE_NONE ucast_pkt = simple_tcp_packet( eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_dst='10.0.0.1', ip_id=107, ip_ttl=64) mcast_pkt = simple_tcp_packet( eth_dst='01:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_dst='231.0.0.1', ip_id=107, ip_ttl=64) bcast_pkt = simple_tcp_packet( eth_dst='FF:FF:FF:FF:FF:FF', eth_src='00:22:22:22:22:22', ip_dst='10.0.0.1', ip_id=107, ip_ttl=64) send_packet(self, self.dev_port26, ucast_pkt) verify_packets( self, ucast_pkt, [ self.dev_port24, self.dev_port25, self.dev_port27]) send_packet(self, self.dev_port26, mcast_pkt) verify_packets( self, mcast_pkt, [ self.dev_port24, self.dev_port25, self.dev_port27]) send_packet(self, self.dev_port26, bcast_pkt) verify_packets( self, bcast_pkt, [ self.dev_port24, self.dev_port25, self.dev_port27]) print("Disable unknown unicast flooding on vlan 100") sai_thrift_set_vlan_attribute( self.client, vlan100, unknown_unicast_flood_control_type=flood_control_type_none) send_packet(self, self.dev_port26, ucast_pkt) verify_no_other_packets(self, timeout=1) print("Disable unknown multicast flooding on vlan 100") sai_thrift_set_vlan_attribute( self.client, vlan100, unknown_multicast_flood_control_type=flood_control_type_none) send_packet(self, self.dev_port26, mcast_pkt) verify_no_other_packets(self, timeout=1) print("Disable broadcast flooding on vlan 100") sai_thrift_set_vlan_attribute( self.client, vlan100, broadcast_flood_control_type=flood_control_type_none) send_packet(self, self.dev_port26, bcast_pkt) verify_no_other_packets(self, timeout=1) finally: sai_thrift_set_port_attribute( self.client, self.port24, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port25, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=1) sai_thrift_set_vlan_attribute( self.client, vlan100, learn_disable=False) sai_thrift_remove_vlan_member(self.client, vlan_member101) sai_thrift_remove_vlan_member(self.client, vlan_member102) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_vlan_member(self.client, vlan_member104) sai_thrift_remove_vlan(self.client, vlan100) def countersClearTest(self): """ Verifies clear statistics for VLAN """ print("\ncountersClearTest()") pkt = simple_tcp_packet(eth_dst='00:33:33:33:33:33', eth_src='00:11:11:11:11:11', ip_dst='172.16.0.1', ip_id=101, ip_ttl=64) stats = query_counter( self, sai_thrift_get_vlan_stats, self.vlan10) in_bytes_pre = stats["SAI_VLAN_STAT_IN_OCTETS"] out_bytes_pre = stats["SAI_VLAN_STAT_OUT_OCTETS"] in_packets_pre = stats["SAI_VLAN_STAT_IN_PACKETS"] in_ucast_packets_pre = stats["SAI_VLAN_STAT_IN_UCAST_PKTS"] out_packets_pre = stats["SAI_VLAN_STAT_OUT_PACKETS"] out_ucast_packets_pre = stats["SAI_VLAN_STAT_OUT_UCAST_PKTS"] print("Sending L2 packet port 0 -> port 24 [access vlan=10])") send_packet(self, self.dev_port0, pkt) verify_packet(self, pkt, self.dev_port24) # Check counters stats = query_counter( self, sai_thrift_get_vlan_stats, self.vlan10) in_bytes = stats["SAI_VLAN_STAT_IN_OCTETS"] out_bytes = stats["SAI_VLAN_STAT_OUT_OCTETS"] in_packets = stats["SAI_VLAN_STAT_IN_PACKETS"] in_ucast_packets = stats["SAI_VLAN_STAT_IN_UCAST_PKTS"] out_packets = stats["SAI_VLAN_STAT_OUT_PACKETS"] out_ucast_packets = stats["SAI_VLAN_STAT_OUT_UCAST_PKTS"] self.assertEqual((in_packets, in_packets_pre + 1), 'vlan IN packets counter {} != {}'.format( in_packets, in_packets_pre + 1)) self.assertEqual((in_ucast_packets, in_ucast_packets_pre + 1), 'vlan IN unicats packets counter {} != {}'.format( in_ucast_packets, in_ucast_packets_pre + 1)) self.assertNotEqual(((in_bytes - in_bytes_pre), 0), 'vlan IN bytes counter is 0') self.assertEqual((out_packets, out_packets_pre + 1), 'vlan OUT packets counter {} != {}'.format( out_packets, out_packets_pre + 1)) self.assertEqual((out_ucast_packets, out_ucast_packets_pre + 1), 'vlan OUT unicats packets counter {} != {}'.format( out_ucast_packets, out_ucast_packets_pre + 1)) self.assertEqual(((out_bytes - out_bytes_pre), 0), 'vlan OUT bytes counter is 0') print("Sending L2 packet port 0 -> port 24 [access vlan=10])") send_packet(self, self.dev_port0, pkt) verify_packet(self, pkt, self.dev_port24) # Clear bytes and packets counter clear_counter( self, sai_thrift_clear_vlan_stats, self.vlan10) # Check counters stats = query_counter( self, sai_thrift_get_vlan_stats, self.vlan10) in_bytes = stats["SAI_VLAN_STAT_IN_OCTETS"] out_bytes = stats["SAI_VLAN_STAT_OUT_OCTETS"] in_packets = stats["SAI_VLAN_STAT_IN_PACKETS"] in_ucast_packets = stats["SAI_VLAN_STAT_IN_UCAST_PKTS"] out_packets = stats["SAI_VLAN_STAT_OUT_PACKETS"] out_ucast_packets = stats["SAI_VLAN_STAT_OUT_UCAST_PKTS"] self.assertEqual(in_packets, 0, 'vlan IN packets counter is not 0') self.assertEqual(in_ucast_packets, 0, 'vlan IN unicast packets counter is not 0') self.assertEqual(in_bytes, 0, 'vlan IN bytes counter is not 0') self.assertEqual(out_packets, 0, 'vlan OUT packets counter is not 0') self.assertEqual(out_ucast_packets, 0, 'vlan OUT unicast packets counter is not 0') self.assertEqual(out_bytes, 0, 'vlan OUT bytes counter is not 0') def vlanFloodPruneTest(self): """ Verifies ingress port pruning on ports and LAG when flooding """ print("\nvlanFloodPruneTest()") sai_thrift_set_vlan_attribute( self.client, self.vlan10, learn_disable=True) print("Mac Learning disabled on vlan 10") self.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) lag = sai_thrift_create_lag(self.client) lag_mbr1 = sai_thrift_create_lag_member( self.client, lag_id=lag, port_id=self.port26) lag_mbr2 = sai_thrift_create_lag_member( self.client, lag_id=lag, port_id=self.port27) lag_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=lag, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=lag_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_lag_attribute(self.client, lag, port_vlan_id=10) pkt = simple_tcp_packet(eth_dst='00:66:66:66:66:66', ip_dst='10.0.0.1', ip_id=107, ip_ttl=64, pktlen=96) exp_pkt = simple_tcp_packet(eth_dst='00:66:66:66:66:66', ip_dst='10.0.0.1', ip_id=107, ip_ttl=64, pktlen=96) exp_pkt_tag = simple_tcp_packet(eth_dst='00:66:66:66:66:66', ip_dst='10.0.0.1', dl_vlan_enable=True, vlan_vid=10, ip_id=107, ip_ttl=64, pktlen=100) try: lag0_ports = [self.dev_port4, self.dev_port5, self.dev_port6] lag1_ports = [self.dev_port26, self.dev_port27] print("Sending packet from port30 -> " "lag1, lag, port1, port24, port25") send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, [exp_pkt] * 3 + [exp_pkt_tag] * 2, [lag0_ports, lag1_ports, [self.dev_port24], [self.dev_port1], [self.dev_port25]]) print("Add a new lag with no memmbers to vlan 10. " "Packet output will not change") lag2 = sai_thrift_create_lag(self.client) lag2_bp = sai_thrift_create_bridge_port( self.client, bridge_id=self.default_1q_bridge, port_id=lag2, type=SAI_BRIDGE_PORT_TYPE_PORT, admin_state=True) vlan_member2 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=lag2_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_lag_attribute(self.client, lag2, port_vlan_id=10) send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 3 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, [self.dev_port24], [self.dev_port1], [self.dev_port25]]) print("Add port %d to the new lag" % (self.dev_port30)) lag_mbr3 = sai_thrift_create_lag_member( self.client, lag_id=lag2, port_id=self.port30) lag2_ports = [self.dev_port30] print("Sending packet from port0 -> " "lag1, lag, new lag, port1, port24, port25") send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 4 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, lag2_ports, [self.dev_port24], [self.dev_port1], [self.dev_port25]]) print("Sending packet from port30 -> " "lag1, lag, port1, port0, port24, port25") send_packet(self, self.dev_port30, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 4 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, [self.dev_port0], [self.dev_port24], [self.dev_port1], [self.dev_port25]]) lag_mbr4 = sai_thrift_create_lag_member( self.client, lag_id=lag2, port_id=self.port31) lag2_ports = [self.dev_port30, self.dev_port31] print("Sending packet from port0 -> " "lag1, lag, new lag, port1, port24, port25") send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 4 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, lag2_ports, [self.dev_port24], [self.dev_port1], [self.dev_port25]]) print("Sending packet from port31 -> " "lag1, lag, port1, port0, port24, port25") send_packet(self, self.dev_port31, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 4 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, [self.dev_port0], [self.dev_port24], [self.dev_port1], [self.dev_port25]]) print("Remove port %d from new lag" % (self.dev_port31)) sai_thrift_remove_lag_member(self.client, lag_mbr4) lag2_ports = [self.dev_port30] print("Sending packet from port0 -> " "lag1, lag, new lag, port1, port24, port25") send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 4 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, lag2_ports, [self.dev_port24], [self.dev_port1], [self.dev_port25]]) print("Add port %d to vlan 10. Verify if it is now part of flood " "list" % (self.dev_port31)) vlan_member3 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=self.port31_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_port_attribute( self.client, self.port31, port_vlan_id=10) print("Sending packet from port0 -> " "lag1, lag, new lag, port1, port24, port25, port31") send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 5 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, lag2_ports, [self.dev_port24], [self.dev_port31], [self.dev_port1], [self.dev_port25]]) print("Sending packet from port31 -> " "lag1, lag, new lag, port1, port0, port24, port25") send_packet(self, self.dev_port31, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 5 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, lag2_ports, [self.dev_port0], [self.dev_port24], [self.dev_port1], [self.dev_port25]]) sai_thrift_set_port_attribute( self.client, self.port31, port_vlan_id=1) self.client.sai_thrift_remove_vlan_member( vlan_member3) # Remove port 31 from vlan 10 sai_thrift_remove_lag_member( self.client, lag_mbr3) # Remove port 30 from new lag print("Remove port %d from new lag. " "No more packets should be seen now" % (self.dev_port30)) print("Sending packet from port 0 -> " "lag0, lag, port1, port24, port25") send_packet(self, self.dev_port0, pkt) verify_each_packet_on_multiple_port_lists( self, exp_pkt * 3 + exp_pkt_tag * 2, [lag0_ports, lag1_ports, [self.dev_port24], [self.dev_port1], [self.dev_port25]]) finally: sai_thrift_set_lag_attribute(self.client, lag, port_vlan_id=1) sai_thrift_set_lag_attribute(self.client, lag2, port_vlan_id=1) self.client.sai_thrift_remove_vlan_member(vlan_member) self.client.sai_thrift_remove_vlan_member(vlan_member2) sai_thrift_remove_lag_member(self.client, lag_mbr1) sai_thrift_remove_lag_member(self.client, lag_mbr2) sai_thrift_remove_bridge_port(self.client, lag_bp) sai_thrift_remove_bridge_port(self.client, lag2_bp) sai_thrift_remove_lag(self.client, lag) sai_thrift_remove_lag(self.client, lag2) sai_thrift_set_vlan_attribute( self.client, self.vlan10, learn_disable=False) sai_thrift_remove_bridge_port(self.client, self.port31_bp) def vlanStatsTest(self): """ Verifies ingress and egress Unicast/Multicast/Broadcast statistics for VLAN """ print("\nvlanStatsTest()") stats = query_counter( self, sai_thrift_get_vlan_stats, self.vlan10) in_bytes = stats["SAI_VLAN_STAT_IN_OCTETS"] out_bytes = stats["SAI_VLAN_STAT_OUT_OCTETS"] in_packets = stats["SAI_VLAN_STAT_IN_PACKETS"] in_ucast_packets = stats["SAI_VLAN_STAT_IN_UCAST_PKTS"] out_packets = stats["SAI_VLAN_STAT_OUT_PACKETS"] out_ucast_packets = stats["SAI_VLAN_STAT_OUT_UCAST_PKTS"] self.assertEqual((in_packets, self.i_pkt_count), 'vlan IN packets counter {} != {}'.format( in_packets, self.i_pkt_count)) self.assertEqual((in_ucast_packets, self.i_pkt_count), 'vlan IN unicast packets counter {} != {}'.format( in_ucast_packets, self.i_pkt_count)) self.assertNotEqual((in_bytes, 0), 'vlan IN bytes counter is 0') self.assertEqual((out_packets, self.e_pkt_count), 'vlan OUT packets counter {} != {}'.format( out_packets, self.e_pkt_count)) self.assertEqual((out_ucast_packets, self.e_pkt_count), 'vlan OUT unicast packets counter {} != {}'.format( out_ucast_packets, self.e_pkt_count)) self.assertNotEqual((out_bytes, 0), 'vlan OUT bytes counter is 0') def vlanMemberList(self): """ Verifies VLAN member list using SAI_VLAN_ATTR_MEMBER_LIST """ print("vlanMemberList") vlan_member_list = sai_thrift_object_list_t(count=100) mbr_list = sai_thrift_get_vlan_attribute( self.client, self.vlan10, member_list=vlan_member_list) vlan_members = mbr_list['SAI_VLAN_ATTR_MEMBER_LIST'].idlist count = mbr_list['SAI_VLAN_ATTR_MEMBER_LIST'].count self.assertEqual(count, 5) self.assertEqual(self.vlan10_member0, vlan_members[0]) self.assertEqual(self.vlan10_member1, vlan_members[1]) self.assertEqual(self.vlan10_member2, vlan_members[2]) self.assertEqual(self.vlan10_member3, vlan_members[3]) self.assertEqual(self.vlan10_member4, vlan_members[4]) # Adding vlan members and veryfing vlan member list vlan10_member5 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan10_member6 = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member_list = sai_thrift_object_list_t(count=100) mbr_list = sai_thrift_get_vlan_attribute( self.client, self.vlan10, member_list=vlan_member_list) vlan_members = mbr_list['SAI_VLAN_ATTR_MEMBER_LIST'].idlist count = mbr_list['SAI_VLAN_ATTR_MEMBER_LIST'].count self.assertEqual(count, 7) self.assertEqual(self.vlan10_member0, vlan_members[0]) self.assertEqual(self.vlan10_member1, vlan_members[1]) self.assertEqual(self.vlan10_member2, vlan_members[2]) self.assertEqual(self.vlan10_member3, vlan_members[3]) self.assertEqual(self.vlan10_member4, vlan_members[4]) self.assertEqual(vlan10_member5, vlan_members[5]) self.assertEqual(vlan10_member6, vlan_members[6]) # Removing vlan members and veryfing vlan member list sai_thrift_remove_vlan_member(self.client, vlan10_member5) sai_thrift_remove_vlan_member(self.client, vlan10_member6) vlan_member_list = sai_thrift_object_list_t(count=100) mbr_list = sai_thrift_get_vlan_attribute( self.client, self.vlan10, member_list=vlan_member_list) vlan_members = mbr_list['SAI_VLAN_ATTR_MEMBER_LIST'].idlist count = mbr_list['SAI_VLAN_ATTR_MEMBER_LIST'].count self.assertEqual(count, 5) self.assertEqual(self.vlan10_member0, vlan_members[0]) self.assertEqual(self.vlan10_member1, vlan_members[1]) self.assertEqual(self.vlan10_member2, vlan_members[2]) self.assertEqual(self.vlan10_member3, vlan_members[3]) self.assertEqual(self.vlan10_member4, vlan_members[4]) def vlanNegativeTest(self): """ Verifies VLAN fails under inappropriate conditions """ print("\nvlanNegativeTest()") # Create duplicate vlan duplicate_vlan = sai_thrift_create_vlan(self.client, vlan_id=10) self.assertNotEqual(self.vlan10, duplicate_vlan) self.assertEqual(duplicate_vlan, 0) # Non existing vlan - attribute not set vlan_attr = sai_thrift_get_vlan_attribute( self.client, vlan_oid=11, vlan_id=True) self.assertEqual(self.status(), SAI_STATUS_INVALID_OBJECT_TYPE) self.assertEqual(vlan_attr, None) self.assertNotEqual(sai_thrift_set_vlan_attribute( self.client, vlan_oid=11, learn_disable=True), 0) vlan_attr = sai_thrift_get_vlan_attribute( self.client, vlan_oid=11, learn_disable=True) self.assertEqual(self.status(), SAI_STATUS_INVALID_OBJECT_TYPE) self.assertEqual(vlan_attr, None) self.assertNotEqual(sai_thrift_remove_vlan(self.client, vlan_oid=11), 0) # Adding incorrect vlan members incorrect_member = sai_thrift_create_vlan_member( self.client, vlan_id=11, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.assertEqual(incorrect_member, 0) incorrect_member = sai_thrift_create_vlan_member( self.client, vlan_id=self.vlan10, bridge_port_id=self.port0, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) self.assertEqual(incorrect_member, 0) def singleVlanMemberTest(self): """ Verifies packet is dropped when ingress on single vlan member """ print("\nsingleVlanMemberTest()") vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100) vlan_member = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port0_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) try: # Single port in vlan pkt = simple_tcp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=100, ip_dst='172.16.0.1', ip_id=102, ip_ttl=64) send_packet(self, self.dev_port0, pkt) verify_no_other_packets(self, timeout=1) # Removing port and adding lag to vlan sai_thrift_remove_vlan_member(self.client, vlan_member) vlan_member = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.lag1_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) # Single LAG in vlan pkt = simple_tcp_packet(eth_dst='00:44:44:44:44:44', eth_src='00:22:22:22:22:22', dl_vlan_enable=True, vlan_vid=100, ip_dst='172.16.0.1', ip_id=102, ip_ttl=64) send_packet(self, self.dev_port4, pkt) verify_no_other_packets(self, timeout=1) finally: sai_thrift_remove_vlan_member(self.client, vlan_member) sai_thrift_remove_vlan(self.client, vlan100) def vlanLearningTest(self): """ Verifies disable learn on vlan """ print("\nvlanLearningTest()") vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100, learn_disable=True) vlan_member101 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan200 = sai_thrift_create_vlan(self.client, vlan_id=200, learn_disable=True) vlan_member201 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member202 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member203 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=200) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=200) pkt = simple_arp_packet( eth_src='00:22:22:33:44:55', arp_op=1, # ARP request hw_snd='00:22:22:33:44:55', pktlen=100) arp_resp = simple_arp_packet( eth_dst='00:22:22:33:44:55', arp_op=2, # ARP request hw_tgt='00:22:22:33:44:55', pktlen=100) try: send_packet(self, self.dev_port26, pkt) verify_packets(self, pkt, [self.dev_port27, self.dev_port30]) send_packet(self, self.dev_port27, arp_resp) verify_packets(self, arp_resp, [self.dev_port26, self.dev_port30]) lan_attr = sai_thrift_get_vlan_attribute( self.client, vlan100, learn_disable=True) self.assertTrue(lan_attr.get('learn_disable')) sai_thrift_set_vlan_attribute(self.client, vlan100, learn_disable=False) sai_thrift_set_vlan_attribute(self.client, vlan200, learn_disable=False) lan_attr = sai_thrift_get_vlan_attribute( self.client, vlan100, learn_disable=True) self.assertFalse(lan_attr.get('learn_disable')) finally: sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port30, port_vlan_id=1) sai_thrift_remove_vlan_member(self.client, vlan_member101) sai_thrift_remove_vlan_member(self.client, vlan_member102) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_vlan_member(self.client, vlan_member201) sai_thrift_remove_vlan_member(self.client, vlan_member202) sai_thrift_remove_vlan_member(self.client, vlan_member203) sai_thrift_remove_vlan(self.client, vlan100) sai_thrift_remove_vlan(self.client, vlan200) def vlanMaxLearnedAddressesTest(self): """ Verifies disable learn on vlan if mac entries in fdb table equals or more then MaxLearnedAddresses attribute """ print("\nvlanMaxLearnedAddressesTest()") vlan100 = sai_thrift_create_vlan(self.client, vlan_id=100, max_learned_addresses=3) vlan_member101 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member102 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan_member103 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan100, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED) vlan200 = sai_thrift_create_vlan(self.client, vlan_id=200, max_learned_addresses=3) vlan_member201 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port26_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member202 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port27_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) vlan_member203 = sai_thrift_create_vlan_member( self.client, vlan_id=vlan200, bridge_port_id=self.port30_bp, vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_UNTAGGED) sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=200) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=200) pkt = simple_arp_packet( eth_src='00:22:22:33:44:55', arp_op=1, # ARP request hw_snd='00:22:22:33:44:55', pktlen=100) pkt_2 = simple_arp_packet( eth_src='00:33:22:33:44:55', arp_op=1, # ARP request hw_snd='00:33:22:33:44:55', pktlen=100) pkt_3 = simple_arp_packet( eth_src='00:44:22:33:44:55', arp_op=1, # ARP request hw_snd='00:44:22:33:44:55', pktlen=100) arp_resp = simple_arp_packet( eth_dst='00:22:22:33:44:55', arp_op=2, # ARP response hw_tgt='00:22:22:33:44:55', pktlen=100) arp_resp_2 = simple_arp_packet( eth_dst='00:33:22:33:44:55', arp_op=2, # ARP response hw_tgt='00:33:22:33:44:55', pktlen=100) arp_resp_3 = simple_arp_packet( eth_dst='00:44:22:33:44:55', arp_op=2, # ARP response hw_tgt='00:44:22:33:44:55', pktlen=100) try: send_packet(self, self.dev_port26, pkt) verify_packets(self, pkt, [self.dev_port27, self.dev_port30]) send_packet(self, self.dev_port27, arp_resp) verify_packet(self, arp_resp, self.dev_port26) send_packet(self, self.dev_port26, pkt_2) verify_packets(self, pkt_2, [self.dev_port27, self.dev_port30]) send_packet(self, self.dev_port27, arp_resp_2) verify_packet(self, arp_resp_2, self.dev_port26) mac_fdb28 = '00:44:22:33:44:55' fdb_entry28 = sai_thrift_fdb_entry_t(switch_id=self.switch_id, mac_address=mac_fdb28, bv_id=vlan200) sai_thrift_create_fdb_entry( self.client, fdb_entry28, type=SAI_FDB_ENTRY_TYPE_STATIC, bridge_port_id=self.port26_bp, packet_action=SAI_PACKET_ACTION_FORWARD) send_packet(self, self.dev_port26, pkt_3) verify_packets(self, pkt_3, [self.dev_port27, self.dev_port30]) send_packet(self, self.dev_port27, arp_resp_3) verify_packets( self, arp_resp_3, [self.dev_port26, self.dev_port30]) sai_thrift_set_vlan_attribute(self.client, vlan100, max_learned_addresses=0) sai_thrift_set_vlan_attribute(self.client, vlan200, max_learned_addresses=0) send_packet(self, self.dev_port26, pkt_3) verify_packets(self, pkt_3, [self.dev_port27, self.dev_port30]) send_packet(self, self.dev_port27, arp_resp_3) verify_packet(self, arp_resp_3, self.dev_port26) finally: sai_thrift_flush_fdb_entries( self.client, bv_id=vlan200, entry_type=SAI_FDB_ENTRY_TYPE_DYNAMIC) sai_thrift_flush_fdb_entries( self.client, bv_id=vlan100, entry_type=SAI_FDB_ENTRY_TYPE_DYNAMIC) sai_thrift_set_port_attribute( self.client, self.port26, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port27, port_vlan_id=1) sai_thrift_set_port_attribute( self.client, self.port30, port_vlan_id=1) sai_thrift_remove_vlan_member(self.client, vlan_member101) sai_thrift_remove_vlan_member(self.client, vlan_member102) sai_thrift_remove_vlan_member(self.client, vlan_member103) sai_thrift_remove_vlan_member(self.client, vlan_member201) sai_thrift_remove_vlan_member(self.client, vlan_member202) sai_thrift_remove_vlan_member(self.client, vlan_member203) sai_thrift_remove_vlan(self.client, vlan200) sai_thrift_remove_vlan(self.client, vlan100)