From 36cf18b94382241247fa37800314b64d12003065 Mon Sep 17 00:00:00 2001 From: richardyu-ms Date: Thu, 19 May 2022 16:31:04 +0000 Subject: [PATCH] Add VLAN and PortChannel test plan For vlan, it includes: 1. Vlan functionalities - Flooding - Forwarding - Trunk/Access - Tagging/Untagging(802.1Q) - VLAN interface (RIF/SVI) 2. SAI APIs operations - Vlan Counters - Vlan and member list operations For PortChannel, it includes: 1. Lag functionalities - Loadbalance 2. Lag SAI APIs - create/check/remove lag and lag member --- doc/sai-ptf/img/Component_topology.jpg | Bin 0 -> 39862 bytes doc/sai-ptf/img/Device_topology.jpg | Bin 0 -> 17549 bytes doc/sai-ptf/img/SAI_PTF_Topology.jpg | Bin 0 -> 11474 bytes doc/sai-ptf/lag_test_plan.md | 140 +++++++++ doc/sai-ptf/vlan_test_plan.md | 403 +++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 doc/sai-ptf/img/Component_topology.jpg create mode 100644 doc/sai-ptf/img/Device_topology.jpg create mode 100644 doc/sai-ptf/img/SAI_PTF_Topology.jpg create mode 100644 doc/sai-ptf/lag_test_plan.md create mode 100644 doc/sai-ptf/vlan_test_plan.md diff --git a/doc/sai-ptf/img/Component_topology.jpg b/doc/sai-ptf/img/Component_topology.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a51295929bab78355ba2fe1ec7e657f92932e983 GIT binary patch literal 39862 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 literal 0 HcmV?d00001 diff --git a/doc/sai-ptf/img/Device_topology.jpg b/doc/sai-ptf/img/Device_topology.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77a1d7761d6979788a7243ab961260cdae1a92b0 GIT binary patch literal 17549 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 l842PV7@W`R-bdn8O~582j!TQ7c + + + + +``` +Convert to config_db.json +```json + "VLAN": { + "Vlan608": { + "members": [ + "Ethernet6/1", + "Ethernet7/1", + "Ethernet8/1", + ], + "vlanid": "608" + } + }, + "VLAN_INTERFACE": { + "Vlan608": {}, + "Vlan608|10.95.88.209/28": {}, + "Vlan608|2603:10a0:31c:8144::1/64": {} + }, + "VLAN_MEMBER": { + "Vlan608|Ethernet6/1": { + "tagging_mode": "untagged" + }, + "Vlan608|Ethernet7/1": { + "tagging_mode": "untagged" + }, + + "Vlan608|Ethernet8/1": { + "tagging_mode": "untagged" + }, + } +``` + +Need the APIs as below + +- Create Router Interface for a vlan interface + ```Python + sai_thrift_create_router_interface( + self.client, + type=SAI_ROUTER_INTERFACE_TYPE_VLAN, + virtual_router_id=self.default_vrf, + vlan_id=self.vlan10) + ``` +- Create next hop to a IP address '10.10.0.1' and mac + ```python + 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) + sai_thrift_create_neighbor_entry( + self.client, self.neighbor_entry1, dst_mac_address=self.dmac1) + sai_thrift_route_entry_t( + vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) + ``` + +Below is the test for checking this. +| Steps/Cases | Goal | Expect | +|-|-|-| +| Create VLAN 10, add port1 and port3 as ``trunk``, add port2, port4 as ``access``. Set VLAN 10 as ports' native vlan| create native VLAN and its members| Vlan and members created| +| Create route entry and next hop for vlan 10, with [IP1] and [mac5].| Create vlan interface. | Vlan interface created.| +| Add FDB entries for RIF. MAC is [mac5], and map it to Port5 in fdb entry. |Simulate the mac learning.| Set up forwarding table| +| Send ``tagged`` packet with dest mac3 on port1. | Forwarding from trunk to trunk port on native vlan.| ``tagged`` packet received on ``port5``.| +| Send ``tagged`` packet with dest mac4 on port1. | Forwarding from trunk to access port.| ``Untagged`` packet received on ``port5``.| +| Send ``Untagged`` packet with dest mac3 on port1. | Forwarding from trunk to Trunk port.| ``tagged`` packet received on ``port5``.| +| Send ``Untagged`` packet with dest mac4 on port1. | Forwarding from trunk to access port.| ``Untagged`` packet received on ``port5``.| +| Send ``tagged`` packet with a not-exiting dest mac on port1. | Dropping incorrect VLAN packet on ``trunk``.| Drop packet.| + +## SAI APIs operations + +### Test suite #7: Test VLAN related counters. +#### Testing Objective +For VLAN related counters, SAI should be able to get the counter and clear them. + +Below are the sample API to operate those data + +Check counters +```Python + stats = sai_thrift_get_vlan_stats(self.client, 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"] + +``` +Clear counters +```Python +sai_thrift_clear_vlan_stats(self.client, self.vlan10) +``` + +| Steps/Cases | Goal | Expect | +|-|-|-| +| Create VLAN 10, add port1 and port3 as ``trunk``| create VLAN and its members| Vlan and members created| +| Add FDB entries, each port with its own mac.|Simulate the mac learning.| Set up forwarding table| +| Use the SAI API to check the counters | Related counter should be changed | Counter changed.| +| Use the SAI API to clear the counters.| Related counter is reset to zero. | Counter reset.| + + +### Test suite #8: Test VLAN related counters. +#### Testing Objective +Test Vlan and member list operations + +Sample APIs + +Get VLAN member list +```Python + 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) +``` + +nagtive test +```python + vlan_attr = sai_thrift_get_vlan_attribute( + self.client, vlan_oid=11, learn_disable=True) + + 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) +``` +| Steps/Cases | Goal | Expect | +|-|-|-| +| Create VLAN 10, add port1 and port3 as ``trunk``| create VLAN and its members| Vlan and members created| +| Use the SAI API to check VLAN member | VLAN member list and member count is right. | Vlan member list.| +| Remove the VLAN member from VLAN 10 and remove vlan. | VLAN and its member removed.| VLAN and its member removed.| +| Use the SAI API to check VLAN member | return 0. | Vlan member is 0.| +| Use the SAI API to create a VLAN member on VLAN 10 | return 0. | Vlan attribute is 0.|