From a8a6ad8dc3078be89e2d687e45519e9b995bfe09 Mon Sep 17 00:00:00 2001 From: Anton Putria Date: Mon, 6 Mar 2023 21:54:02 +0200 Subject: [PATCH 01/75] Fix image link for test docs (#349) Signed-off-by: Anton Putria --- .../scale/saic => docs}/images/outbound_scenario_explained.svg | 0 .../saic => docs}/images/vnet2vnet_outbound_traffic_scaling.svg | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename test/{test-cases/scale/saic => docs}/images/outbound_scenario_explained.svg (100%) rename test/{test-cases/scale/saic => docs}/images/vnet2vnet_outbound_traffic_scaling.svg (100%) diff --git a/test/test-cases/scale/saic/images/outbound_scenario_explained.svg b/test/docs/images/outbound_scenario_explained.svg similarity index 100% rename from test/test-cases/scale/saic/images/outbound_scenario_explained.svg rename to test/docs/images/outbound_scenario_explained.svg diff --git a/test/test-cases/scale/saic/images/vnet2vnet_outbound_traffic_scaling.svg b/test/docs/images/vnet2vnet_outbound_traffic_scaling.svg similarity index 100% rename from test/test-cases/scale/saic/images/vnet2vnet_outbound_traffic_scaling.svg rename to test/docs/images/vnet2vnet_outbound_traffic_scaling.svg From 2ec75fcf54f88a009ac2a81368e5b0e28d6cb3ce Mon Sep 17 00:00:00 2001 From: desaimg1 <53219646+desaimg1@users.noreply.github.com> Date: Wed, 8 Mar 2023 23:39:24 +0530 Subject: [PATCH 02/75] committing outbound testcases (#326) * committing outbound testcases * committing outbound testcases (#12) * pushing vnet hepler file to utils folder * Added dependency * Adding xfail with issue 236 * Addressed Anton comment --- .../saic/config_outbound_setup_commands.json | 217 ++++++++++++++++++ .../saic/test_vm_to_vm_commn_acl_outbound.py | 186 +++++++++++++++ .../saic/test_vm_to_vm_commn_udp_outbound.py | 199 ++++++++++++++++ .../saic/test_sai_vnet_outbound_scale.py | 4 +- .../saic/test_sai_vnet_outbound_simple.py | 4 +- test/test-cases/utils/snappi_utils.py | 62 +++++ .../dash_helper => utils}/vnet2vnet_helper.py | 0 7 files changed, 670 insertions(+), 2 deletions(-) create mode 100644 test/test-cases/functional/saic/config_outbound_setup_commands.json create mode 100644 test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py create mode 100644 test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py create mode 100644 test/test-cases/utils/snappi_utils.py rename test/test-cases/{scale/saic/dash_helper => utils}/vnet2vnet_helper.py (100%) diff --git a/test/test-cases/functional/saic/config_outbound_setup_commands.json b/test/test-cases/functional/saic/config_outbound_setup_commands.json new file mode 100644 index 000000000..ddaf81518 --- /dev/null +++ b/test/test-cases/functional/saic/config_outbound_setup_commands.json @@ -0,0 +1,217 @@ +[ + { + "name": "vpe_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": "221.0.0.2" + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "del_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "11" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "del_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "101" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + + { + "name": "in_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "out_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "vnet", + "op": "create", + "type": "SAI_OBJECT_TYPE_VNET", + "attributes": [ + "SAI_VNET_ATTR_VNI", "1000" + ] + }, + { + "name": "eni_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", "10000", + "SAI_ENI_ATTR_PPS", "100000", + "SAI_ENI_ATTR_FLOWS", "100000", + "SAI_ENI_ATTR_ADMIN_STATE", "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "221.0.1.11", + "SAI_ENI_ATTR_VM_VNI", "9", + "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + ] + }, + { + "name": "eni_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", "10000", + "SAI_ENI_ATTR_PPS", "100000", + "SAI_ENI_ATTR_FLOWS", "100000", + "SAI_ENI_ATTR_ADMIN_STATE", "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "221.0.2.101", + "SAI_ENI_ATTR_VM_VNI", "9", + "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + ] + }, + + { + "name": "eam_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": "00:1A:C5:00:00:01" + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", "$eni_#1" + ] + }, + { + "name": "eam_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": "00:1b:6e:00:00:01" + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", "$eni_#2" + ] + }, + { + "name": "ore_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#1", + "destination": "1.0.0.0/8" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + ] + }, + { + "name": "ore_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#2", + "destination": "1.0.0.0/8" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + ] + }, + + { + "name": "ocpe_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "1.128.0.1" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "221.0.2.101", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:1b:6e:00:00:01", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + ] + }, + { + "name": "ocpe_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "1.1.0.1" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "221.0.1.11", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:1A:C5:00:00:01", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + ] + } +] + + diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py new file mode 100644 index 000000000..888ef138e --- /dev/null +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py @@ -0,0 +1,186 @@ +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +import sys +sys.path.append("../utils") +import snappi_utils as su + +current_file_dir = Path(__file__).parent + +""" +This covers following scenario : + +Test vnet to vnet communication with ACL on outbound direction: +1. Configure DUT to deny and allow traffic +2. Configure TGEN traffic flow as one vnet to another vnet of two OpenTrafficGenerator ports +3. Verify Traffic denied through deny traffic IPs + +Topology Used : + + -------- ------- -------- + | | | | | | + | | | | | | + | TGEN |--------| DUT |--------| TGEN | + | | | | | | + | | | | | | + -------- ------- -------- + +""" + +############################################################### +# Declaring Global variables +############################################################### + +TOTALPACKETS = 1000 +PPS = 100 +TRAFFIC_SLEEP_TIME = (TOTALPACKETS / PPS) + 2 +PACKET_LENGTH = 128 +ENI_IP = "1.1.0.1" +NETWORK_IP2 = "1.128.0.2" +NETWORK_IP1 = "1.128.0.1" +DPU_VTEP_IP = "221.0.0.2" +ENI_VTEP_IP = "221.0.1.11" +NETWORK_VTEP_IP = "221.0.2.101" +OUTER_SRC_MAC = "80:09:02:01:00:01" +OUTER_DST_MAC = "c8:2c:2b:00:d1:30" +INNER_SRC_MAC = "00:1A:C5:00:00:01" +INNER_DST_MAC = "00:1b:6e:14:00:02" + + +############################################################### +# Start of the testcase +############################################################### + +class TestAclOutbound: + + @pytest.fixture(scope="class") + def setup_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + current_file_dir = Path(__file__).parent + with (current_file_dir / 'config_outbound_setup_commands.json').open(mode='r') as config_file: + setup_commands = json.load(config_file) + return setup_commands + + @pytest.mark.dependency() + def test_setup(self, dpu, setup_config): + results = [*dpu.process_commands(setup_config)] + print("\n======= SAI setup commands RETURN values =======") + pprint(results) + assert all(results), "Setup error" + + + @pytest.mark.dependency(depends=['TestAclOutbound::test_setup']) + @pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/236") + def test_vm_to_vm_commn_acl_outbound(self, dataplane): + + # Configure TGEN + + # Flow1 settings + f1 = dataplane.configuration.flows.flow(name="OUTBOUND")[-1] + f1.tx_rx.port.tx_name = dataplane.configuration.ports[0].name + f1.tx_rx.port.rx_name = dataplane.configuration.ports[1].name + f1.size.fixed = PACKET_LENGTH + # send n packets and stop + f1.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f1.rate.pps = PPS + f1.metrics.enable = True + + outer_eth1, ip1, udp1, vxlan1, inner_eth1, inner_ip1, inner_udp1= ( + f1.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth1.src.value = OUTER_SRC_MAC + outer_eth1.dst.value = OUTER_DST_MAC + outer_eth1.ether_type.value = 2048 + + ip1.src.value = ENI_VTEP_IP #ENI - VTEP + ip1.dst.value = DPU_VTEP_IP #DPU - VTEP + + udp1.src_port.value = 11638 + udp1.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan1.vni.value = 11 + vxlan1.reserved0.value = 0 + vxlan1.reserved1.value = 0 + + inner_eth1.src.value = INNER_SRC_MAC + inner_eth1.dst.value = INNER_DST_MAC + inner_ip1.src.value = ENI_IP #ENI + inner_ip1.dst.value = NETWORK_IP1 #world + + inner_udp1.src_port.value = 10000 + inner_udp1.dst_port.value = 20000 + + dataplane.set_config() + + # Verify traffic + print("\n======= Verify traffic with allowed packets passing =======") + print("\n======= Start traffic =======") + su.start_traffic(dataplane, f1.name) + time.sleep(TRAFFIC_SLEEP_TIME) + print("\n======= Stop traffic =======") + dataplane.stop_traffic() + + #Packets should be allowed now + print("\n======= Verify packet TX and RX matching =======") + acl_traffic_result = su.check_flow_tx_rx_frames_stats(dataplane, f1.name) + # Print Result of the test + print("Final Result : {}".format(acl_traffic_result)) + + # Validate test result + print("\n======= Assert if traffic allow failure =======") + assert acl_traffic_result, "Traffic test allow failure" + + print("\n======= Configure deny IP =======") + inner_eth1.src.value = INNER_SRC_MAC + inner_eth1.dst.value = INNER_DST_MAC + inner_ip1.src.value = ENI_IP #ENI + inner_ip1.dst.value = NETWORK_IP2 #world + + inner_udp1.src_port.value = 10000 + inner_udp1.dst_port.value = 20000 + + dataplane.set_config() + + + # Verify traffic + print("\n======= Verify packet drops with DUT for denied traffic =======") + print("\n======= Start traffic =======") + su.start_traffic(dataplane, f1.name) + time.sleep(TRAFFIC_SLEEP_TIME) + print("\n======= Stop traffic =======") + dataplane.stop_traffic() + + #Packets should be denied + print("\n======= verify packets dropedin DUT with deny IPs =======") + acl_traffic_result = su.check_flow_tx_rx_frames_stats(dataplane, f1.name) + print("Traffic Result : {}".format(acl_traffic_result)) + + dataplane.teardown() + + print("\n======= Assert if traffic does not dropped =======") + # Validate test result + assert acl_traffic_result==False, "Traffic test Deny failure" + + @pytest.mark.dependency(depends=['TestAclOutbound::test_setup']) + def test_cleanup(self, dpu, setup_config): + + cleanup_commands = [] + for command in reversed(setup_config): + command['op'] = 'remove' + cleanup_commands.append(command) + + results = [] + for command in cleanup_commands: + results.append(dpu.command_processor.process_command(command)) + print (results) + print("\n======= SAI teardown commands RETURN values =======") + assert all([x==0 for x in results]), "Teardown Error" + diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py new file mode 100644 index 000000000..f49283b71 --- /dev/null +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py @@ -0,0 +1,199 @@ +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +import sys +sys.path.append("../utils") +import snappi_utils as su + +current_file_dir = Path(__file__).parent + +""" +This covers following scenario : + +vnet to vnet communication with UDP traffic flow : + +Configure DUT +Configure TGEN UDP traffic flow as one vnet to another vnet of two OpenTrafficGenerator ports +Verify Traffic flow between vnet to vnet through DUT + + +Topology Used : + + -------- ------- -------- + | | | | | | + | | | | | | + | TGEN |--------| DUT |--------| TGEN | + | | | | | | + | | | | | | + -------- ------- -------- + +""" + +############################################################### +# Declaring Global variables +############################################################### + +TOTALPACKETS = 1000 +PPS = 100 +TRAFFIC_SLEEP_TIME = (TOTALPACKETS / PPS) + 2 +PACKET_LENGTH = 128 +ENI_IP = "1.1.0.1" +NETWORK_IP1 = "1.128.0.1" +NETWORK_IP2 = "1.128.0.3" +DPU_VTEP_IP = "221.0.0.2" +ENI_VTEP_IP = "221.0.1.11" +NETWORK_VTEP_IP = "221.0.2.101" + +OUTER_SRC_MAC = "80:09:02:01:00:01" +OUTER_DST_MAC = "c8:2c:2b:00:d1:30" +INNER_SRC_MAC = "00:1A:C5:00:00:01" +INNER_DST_MAC = "00:1b:6e:00:00:01" +OUTER_SRC_MAC_F2 = "80:09:02:02:00:01" +OUTER_DST_MAC_F2 = "c8:2c:2b:00:d1:34" + +############################################################### +# Start of the testcase +############################################################### + +class TestUdpOutbound: + + @pytest.fixture(scope="class") + def setup_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + current_file_dir = Path(__file__).parent + with (current_file_dir / 'config_outbound_setup_commands.json').open(mode='r') as config_file: + setup_commands = json.load(config_file) + return setup_commands + + @pytest.mark.dependency() + def test_setup(self, dpu, setup_config): + results = [*dpu.process_commands(setup_config)] + print("\n======= SAI setup commands RETURN values =======") + pprint(results) + assert all(results), "Setup error" + + @pytest.mark.dependency(depends=['TestUdpOutbound::test_setup']) + @pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/236") + def test_vm_to_vm_commn_udp_outbound(self, dataplane): + # Configure TGEN + + # Flow1 settings + f1 = dataplane.configuration.flows.flow(name="ENI_TO_NETWORK")[-1] + f1.tx_rx.port.tx_name = dataplane.configuration.ports[0].name + f1.tx_rx.port.rx_name = dataplane.configuration.ports[1].name + f1.size.fixed = PACKET_LENGTH + # send n packets and stop + f1.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f1.rate.pps = PPS + f1.metrics.enable = True + + outer_eth1, ip1, udp1, vxlan1, inner_eth1, inner_ip1, inner_udp1= ( + f1.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth1.src.value = OUTER_SRC_MAC + outer_eth1.dst.value = OUTER_DST_MAC + outer_eth1.ether_type.value = 2048 + + ip1.src.value = ENI_VTEP_IP #ENI - VTEP + ip1.dst.value = DPU_VTEP_IP #DPU - VTEP + + udp1.src_port.value = 11638 + udp1.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan1.vni.value = 11 + vxlan1.reserved0.value = 0 + vxlan1.reserved1.value = 0 + + inner_eth1.src.value = INNER_SRC_MAC + inner_eth1.dst.value = INNER_DST_MAC + + inner_ip1.src.value = ENI_IP #ENI + inner_ip1.dst.value = NETWORK_IP1 #world + + inner_udp1.src_port.value = 10000 + inner_udp1.dst_port.value = 20000 + + # Flow2 settings + f2 = dataplane.configuration.flows.flow(name="NETWORK_TO_ENI")[-1] + f2.tx_rx.port.tx_name = dataplane.configuration.ports[1].name + f2.tx_rx.port.rx_name = dataplane.configuration.ports[0].name + f2.size.fixed = PACKET_LENGTH + # send n packets and stop + f2.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f2.rate.pps = PPS + f2.metrics.enable = True + + outer_eth, ip, udp, vxlan, inner_eth, inner_ip , inner_udp= ( + f2.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth.src.value = OUTER_SRC_MAC_F2 + outer_eth.dst.value = OUTER_DST_MAC_F2 + outer_eth.ether_type.value = 2048 + + ip.src.value = NETWORK_VTEP_IP + ip.dst.value = DPU_VTEP_IP + + udp.src_port.value = 11638 + udp.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan.vni.value = 101 + vxlan.reserved0.value = 0 + vxlan.reserved1.value = 0 + + inner_eth.src.value = INNER_DST_MAC + inner_eth.dst.value = INNER_SRC_MAC + + inner_ip.src.value = NETWORK_IP1 #world + inner_ip.dst.value = ENI_IP # ENI + + inner_udp.src_port.value = 20000 + inner_udp.dst_port.value = 10000 + + dataplane.set_config() + + # Verify Traffic flow + print("\n======= Start traffic =======") + su.start_traffic(dataplane, f1.name) + time.sleep(0.5) + su.start_traffic(dataplane, f2.name) + time.sleep(TRAFFIC_SLEEP_TIME) + print("\n======= Stop traffic =======") + dataplane.stop_traffic() + + print("\n======= Verify traffic TX and RX packets matching =======") + res1 = su.check_flow_tx_rx_frames_stats(dataplane, f1.name) + res2 = su.check_flow_tx_rx_frames_stats(dataplane, f2.name) + + dataplane.teardown() + + # Validate test result + print("\n======= Assert if traffic fails =======") + assert res1, "Traffic test failure" + assert res2, "Traffic test failure" + + @pytest.mark.dependency(depends=['TestUdpOutbound::test_setup']) + def test_cleanup(self, dpu, setup_config): + + cleanup_commands = [] + for command in reversed(setup_config): + command['op'] = 'remove' + cleanup_commands.append(command) + + results = [] + for command in cleanup_commands: + results.append(dpu.command_processor.process_command(command)) + print (results) + print("\n======= SAI teardown commands RETURN values =======") + assert all([x==0 for x in results]), "Teardown Error" + diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py index d282fb4b2..49f390c49 100755 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py @@ -30,7 +30,9 @@ import pytest import saichallenger.common.sai_dataplane.snappi.snappi_traffic_utils as stu -import dash_helper.vnet2vnet_helper as dh +import sys +sys.path.append("../utils") +import vnet2vnet_helper as dh current_file_dir = Path(__file__).parent import dpugen diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py index effc17dfe..1a77ef25b 100644 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py @@ -11,7 +11,9 @@ verify_no_other_packets, verify_packet) -import dash_helper.vnet2vnet_helper as dh +import sys +sys.path.append("../utils") +import vnet2vnet_helper as dh current_file_dir = Path(__file__).parent diff --git a/test/test-cases/utils/snappi_utils.py b/test/test-cases/utils/snappi_utils.py new file mode 100644 index 000000000..1579be95a --- /dev/null +++ b/test/test-cases/utils/snappi_utils.py @@ -0,0 +1,62 @@ +def config_l1_properties(dataplane, usd_speed): + ly = dataplane.configuration.layer1.layer1(name="ly")[-1] + ly.port_names = [p.name for p in dataplane.configuration.ports] + val = getattr(ly , usd_speed ) + setattr(ly , "speed", val) + ly.ieee_media_defaults = False + ly.auto_negotiation.rs_fec = True + ly.auto_negotiation.link_training = False + ly.auto_negotiate = False + +def check_flow_tx_rx_frames_stats(dataplane, flow_name): + req = dataplane.api.metrics_request() + req.flow.flow_names = [flow_name] + flow_stats = dataplane.api.get_metrics(req) + print("statistics : {}".format(flow_stats)) + frames_tx = sum([m.frames_tx for m in flow_stats.flow_metrics]) + frames_rx = sum([m.frames_rx for m in flow_stats.flow_metrics]) + return frames_tx == frames_rx + +def check_port_tx_rx_frames_stats(dataplane, port_name): + req = dataplane.api.metrics_request() + req.port.port_names = [port_name] + req.port.column_names = [req.port.FRAMES_TX, req.port.FRAMES_RX] + port_stats = dataplane.api.get_metrics(req) + print("statistics : {}".format(port_stats)) + frames_tx = sum([m.frames_tx for m in port_stats.port_metrics]) + frames_rx = sum([m.frames_rx for m in port_stats.port_metrics]) + return frames_tx == frames_rx + +def check_bgp_neighborship_established(dataplane): + req =dataplane.api.metrics_request() + req.bgpv4.column_names = ["session_state"] + results = dataplane.api.get_metrics(req) + ok = [] + for r in results.bgpv4_metrics: + ok.append(r.session_state == "up") + return all(ok) + +def check_ping(dataplane, ip_obj_name, ip, ip_type="ipv4"): + req = dataplane.api.ping_request() + if ip_type == "ipv4": + p1 = req.endpoints.ipv4() + else: + p1 = req.endpoints.ipv6() + p1.src_name = ip_obj_name + p1.dst_ip = ip + responses = dataplane.api.send_ping(req).responses + for resp in responses : + if resp.src_name == ip1.name and resp.dst_ip == ip: + return True + else: + return False + +def start_traffic(dataplane, flow_name=None): + """ Start traffic flow(s) which are already configured. + """ + ts = dataplane.api.transmit_state() + ts.state = ts.START + if flow_name != None: + ts.flow_names = [flow_name] + res = dataplane.api.set_transmit_state(ts) + assert dataplane.api_results_ok(res), res \ No newline at end of file diff --git a/test/test-cases/scale/saic/dash_helper/vnet2vnet_helper.py b/test/test-cases/utils/vnet2vnet_helper.py similarity index 100% rename from test/test-cases/scale/saic/dash_helper/vnet2vnet_helper.py rename to test/test-cases/utils/vnet2vnet_helper.py From 40b77975a68061f029ecdbdb7a65a8fa9e702593 Mon Sep 17 00:00:00 2001 From: Vijay Srinivasan <8528272+vijasrin@users.noreply.github.com> Date: Wed, 15 Mar 2023 11:59:03 -0700 Subject: [PATCH 03/75] Add DASH outbound metering to Sonic HLD (#296) - Metering Policy, rule and meter schemas - Adding pipeline diagram for outbound meter --- .wordlist.txt | 2 + documentation/general/dash-sonic-hld.md | 238 ++++++++++++++++-- .../dash-hld-outbound-meter-pipeline.png | Bin 0 -> 206505 bytes ...ld-outbound-packet-processing-pipeline.png | Bin 0 -> 221291 bytes ...ld-outbound-packet-processing-pipeline.svg | 4 - 5 files changed, 226 insertions(+), 18 deletions(-) create mode 100644 documentation/general/images/dash-hld-outbound-meter-pipeline.png create mode 100644 documentation/general/images/dash-hld-outbound-packet-processing-pipeline.png delete mode 100644 documentation/general/images/dash-hld-outbound-packet-processing-pipeline.svg diff --git a/.wordlist.txt b/.wordlist.txt index 006b579dd..613bd0c23 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -670,3 +670,5 @@ Velayudhan deparsing testability autogeneration +Srinivasan +Vijay diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 4e71430eb..33b06fc96 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -41,6 +41,7 @@ | 0.8 | 09/30/2022 | Prabhat Aravind | Update APP_DB table names | | 1.0 | 10/10/2022 | Prince Sunny | ST and PL scenarios | | 1.1 | 01/09/2023 | Prince Sunny | Underlay Routing and ST/PL clarifications | +| 1.2 | 02/12/2023 | Vijay Srinivasan | Metering schema and description | # About this Manual This document provides more detailed design of DASH APIs, DASH orchestration agent, Config and APP DB Schemas and other SONiC buildimage changes required to bring up SONiC image on an appliance card. General DASH HLD can be found at [dash_hld](./dash-high-level-design.md). @@ -176,7 +177,7 @@ The following section captures at a high-level on the VNET packet flow. Detailed ## 2.1 Outbound packet processing pipeline - ![dash-outbound](./images/dash-hld-outbound-packet-processing-pipeline.svg) + ![dash-outbound](./images/dash-hld-outbound-packet-processing-pipeline.png) Based on the incoming packet's VNI matched against the reserved VNI assigned for VM->Appliance, the pipeline shall set the direction as TX(Outbound) and using the inner src-mac, maps to the corresponding ENI.The incoming packet will always be VXLAN encapsulated and outer dst-ip is the appliance VIP. The pipeline shall parse the VNI, and for VM traffic, the VNI shall be a special reserved VNI. Everything else shall be treated as as network traffic(RX). Pipeline shall use VNI to differentiate the traffic to be VM (Inbound) or Network (Outbound). @@ -201,6 +202,32 @@ It is worth noting that CA-PA mapping table shall be used for both encap and dec ST/PL is employed for scenarios like multiple different customers want to access a common shared resource (e.g storage). This shall not fall into the regular Vnet packet path or Vnet peering path and hence a Private Endpoint is assigned for such accesses, as part of ENI routing or VNET's mapping tables. The lookup happens as described in the above sections, but actions are different. For ST/PL, actions include IPv4 to IPv6 transpositions and special routing/mapping lookups for encapsulation. By having packet transpositions, Service Tunnel feature provides the capability of encoding “region id”, “vnet id”, “subnet id” etc via packet transformation. IPv6 transformation includes last 32 bits of the IPv6 packet as IPv4 address, while the remaining 96 bits of the IPv6 packet is used for encoding. Private Link feature is an extension to Service Tunnel feature and enables customers to access public facing shared services via their private IP addresses within their vnet. More details on traffic flow is captured in the example section. **ST/PL Inbound flow**: Using the outbound unified flow, the reverse transposition (inbound unified flow) is created. If no inbound flow is created, the packet shall be dropped if it does not match any existing inbound routing rule. There is no inbound policy based lookup expected for ST/PL scenarios. When FastPath kicks in, the respective outbound and inbound unified flows shall be modified accordingly. +## 2.4 Metering + +- Network traffic is metered through configuration of route table entries, mapping entries, and meter policy rules with metering class IDs +- An (ENI, meter-class-id) entry is created to associate a specific ENI with a meter class ID +- The (ENI, meter-class-id) entry must be deleted when traffic is no longer metered OR the ENI is deleted +- Meter statistics for each ENI can be obtained through GET request on (ENI, meter-class-id) or (ENI, *) +- Each (ENI, meter-class-id) is mapped to a meter bucket counter in the pipeline +- The meter bucket counter tracks the number of transmitted and received bytes (number of packets is optional) + +### 2.4.1 Meter Policy + +- A meter policy consists of a set of metering rules +- Each meter rule consists of an IP prefix mapped to meter-class-id +- Each meter rule can have a priority configured and the priority will be used to break the tie in case of prefix overlap across the rules +- Meter policy is applied to an ENI and can be shared across ENIs + +### 2.4.2 Outbound Traffic metering behavior + +It is possible that a given packet can get a hit in route table and/or mapping table and/or meter policy. Described below is the scheme to pick the final metering class: +- If the route table entry has the metering policy lookup enabled and if an entry in meter policy is a hit (based on priority of the rule), then the corresponding policy metering class is picked over the route table entry's. If subsequent mapping lookup also gives a metering class then the mapping metering class takes precedence ONLY if the override flag is set on the mapping entry. +- If the route table entry has the metering policy lookup disabled then the metering policy lookup is skipped and the route table entry metering class is picked. If subsequent mapping lookup also gives a metering class then the mapping metering class takes precedence ONLY if the override flag is set on the mapping entry. + + + ![dash-outbound-meter](./images/dash-hld-outbound-meter-pipeline.png) + + # 3 Modules Design The following are the schema changes. The NorthBound APIs shall be defined as sonic-yang in compliance to [yang-guideline](https://github.com/Azure/SONiC/blob/master/doc/mgmt/SONiC_YANG_Model_Guidelines.md). @@ -269,6 +296,8 @@ DASH_ENI_TABLE:{{eni}} "vnet": {{vnet_name}} "pl_sip_encoding": {{string}} (OPTIONAL) "pl_underlay_sip": {{ip_addr}} (OPTIONAL) + "v4_meter_policy_id": {{string}} (OPTIONAL) + "v6_meter_policy_id": {{string}} (OPTIONAL) ``` ``` key = DASH_ENI_TABLE:eni ; ENI MAC as key @@ -281,7 +310,10 @@ vnet = Vnet that ENI belongs to pl_sip_encoding = Private Link encoding for IPv6 SIP transpositions; Format "0xfield_value/0xfull_mask". field_value must be used as a replacement to the first len(full_mask) bits of pl_sip. Last 32 bits are reserved for the IPv4 CA. Logic: ((pl_sip & !full_mask) | field_value). pl_underlay_sip = Underlay SIP (ST GW VIP) to be used for all private link transformation for this ENI +v4_meter_policy_id = IPv4 meter policy ID +v6_meter_policy_id = IPv6 meter policy ID ``` + ### 3.2.4 ACL ``` @@ -378,7 +410,8 @@ DASH_ROUTE_TABLE:{{eni}}:{{prefix}} "overlay_dip":{{ip_address}} (OPTIONAL) "underlay_sip":{{ip_address}} (OPTIONAL) "underlay_dip":{{ip_address}} (OPTIONAL) - "metering_bucket": {{bucket_id}} (OPTIONAL) + "metering_policy_en": {{bool}} (OPTIONAL) + "metering_class": {{class_id}} (OPTIONAL) ``` ``` @@ -392,7 +425,8 @@ overlay_sip = ip_address ; overlay ipv6 src ip if ro overlay_dip = ip_address ; overlay ipv6 dst ip if routing_type is {servicetunnel}, transform last 32 bits from packet (dst ip) underlay_sip = ip_address ; underlay ipv4 src ip if routing_type is {servicetunnel}; this is the ST GW VIP (for ST traffic) or custom VIP underlay_dip = ip_address ; underlay ipv4 dst ip to override if routing_type is {servicetunnel}, use dst ip from packet if not specified -metering_bucket = bucket_id ; metering and counter +metering_policy_en = bool ; Metering policy lookup enable (optional), default = false +metering_class = class_id ; Metering class-id, used if metering policy lookup is not enabled ``` ### 3.2.8 ROUTE RULE TABLE - INBOUND @@ -404,7 +438,7 @@ DASH_ROUTE_RULE_TABLE:{{eni}}:{{vni}}:{{prefix}} "protocol": {{protocol_value}} (OPTIONAL) "vnet":{{vnet_name}} (OPTIONAL) "pa_validation": {{bool}} (OPTIONAL) - "metering_bucket": {{bucket_id}} (OPTIONAL) + "metering_class": {{class_id}} (OPTIONAL) "region": {{region_id}} (OPTIONAL) ``` @@ -416,7 +450,7 @@ priority = INT32 value ; priority of the rule, low protocol = INT32 value ; protocol value of incoming packet to match; 0 (any) vnet = vnet name ; mapped VNET for the key vni/pa pa_validation = true/false ; perform PA validation in the mapping table belonging to vnet_name. Default is set to true -metering_bucket = bucket_id ; metering and counter +metering_class = class_id ; Metering class-id region = region_id ; optional region_id which the vni/prefix belongs to as a string for any vendor optimizations ``` @@ -427,7 +461,8 @@ DASH_VNET_MAPPING_TABLE:{{vnet}}:{{ip_address}} "routing_type": {{routing_type}} "underlay_ip":{{ip_address}} "mac_address":{{mac_address}} (OPTIONAL) - "metering_bucket": {{bucket_id}} (OPTIONAL) + "metering_class": {{class_id}} (OPTIONAL) + "override_meter": {{bool}} (OPTIONAL) "use_dst_vni": {{bool}} (OPTIONAL) "use_pl_sip_eni": {{bool}} (OPTIONAL) "overlay_sip":{{ip_address}} (OPTIONAL) @@ -439,13 +474,59 @@ key = DASH_VNET_MAPPING_TABLE:vnet:ip_address ; CA-PA mappi action_type = routing_type ; reference to routing type underlay_ip = ip_address ; PA address for the CA mac_address = MAC address as string ; Inner dst mac -metering_bucket = bucket_id ; metering and counter +metering_class = class_id ; metering class-id +override_meter = bool ; override the metering class-id coming from the route table use_dst_vni = bool ; if true, use the destination VNET VNI for encap. If false or not specified, use source VNET's VNI overlay_sip = ip_address ; overlay src ip if routing_type is {privatelink}, transform last 32 bits from packet overlay_dip = ip_address ; overlay dst ip if routing_type is {privatelink} ``` -### 3.2.10 DASH orchagent (Overlay) +### 3.2.10 METER + +``` +DASH_METER_POLICY:{{meter_policy_id}} + "ip_version": {{ipv4/ipv6}} +``` + +``` +key = DASH_METER_POLICY:meter_policy_id ; policy_id as key +; field = value +ip_version = IP version (IPv4/IPv6) +``` + + +``` +DASH_METER_RULE:{{meter_policy_id}}:{{rule_num}} + "priority": {{priority}} + "ip_prefix":{{ip_prefix}} + "metering_class": {{class_id}} +``` + +``` +key = DASH_METER_RULE:meter_policy_id:rule_num ; unique rule num within the policy. +; field = value +priority = INT32 value ; priority of the rule: lower the value, higher the priority +ip_prefix = ip_prefix ; ip prefix for matching +metering_class = class_id ; metering class-id +``` + + +``` +DASH_METER:{{eni}}:{{metering_class_id}} + “metadata”: {{string}} (OPTIONAL) + "tx_counter": {{bytes}} + "rx_counter": {{bytes}} +``` + +``` +key = DASH_METER:eni:metering_class_id ; metering class id table per (ENI) +; field = value +metadata = string ; Optional metadata string +tx_counter = bytes ; Number of transmitted bytes (read-only) +rx_counter = bytes ; Number of received bytes (read-only) +``` + +### 3.2.11 DASH orchagent (Overlay) | APP_DB Table | Key | Field | SAI Attributes/*objects* | Comment | |-----------------------|---------------|------------------|---------------------------------------------------|-------------------------------------------------| @@ -723,7 +804,8 @@ Refer DASH documentation for the test plan. "mac_address": "F4-93-9F-EF-C4-7E", "underlay_ip": "25.1.1.1", "admin_state": "enabled", - "vnet": "Vnet1" + "vnet": "Vnet1", + "v4_meter_policy_id": "245bea34-1000-0000-0000-0000082764ac" }, "OP": "SET" }, @@ -751,6 +833,7 @@ Refer DASH documentation for the test plan. }, { "DASH_ROUTE_TABLE:F4939FEFC47E:10.1.0.0/16": { + "prefix":"10.1.0.0/16", "action_type":"vnet", "vnet":"Vnet1" }, @@ -764,6 +847,24 @@ Refer DASH documentation for the test plan. }, "OP": "SET" }, + { + "DASH_ROUTE_TABLE:F4939FEFC47E:30.0.0.0/16": { + "action_type":"direct", + "vnet":"Vnet1", + "metering_policy_en":"false", + "metering_class":"1000" + }, + "OP": "SET" + }, + { + "DASH_ROUTE_TABLE:F4939FEFC47E:40.0.0.0/16": { + "action_type":"direct", + "vnet":"Vnet1", + "metering_policy_en":"true", + "metering_class":"1000" + }, + "OP": "SET" + }, { "DASH_ROUTE_TABLE:F4939FEFC47E:10.2.5.0/24": { "action_type":"drop" @@ -775,6 +876,7 @@ Refer DASH documentation for the test plan. "routing_type":"vnet_encap", "underlay_ip":"2601:12:7a:1::1234", "mac_address":"F9-22-83-99-22-A2" + "metering_class":"1002" }, "OP": "SET" }, @@ -790,7 +892,8 @@ Refer DASH documentation for the test plan. "DASH_VNET_MAPPING_TABLE:Vnet1:10.1.1.1": { "routing_type":"vnet_encap", "underlay_ip":"101.1.2.3", - "mac_address":"F9-22-83-99-22-A2" + "mac_address":"F9-22-83-99-22-A2", + "metering_class":"1001" }, "OP": "SET" }, @@ -811,7 +914,55 @@ Refer DASH documentation for the test plan. "vnet":"Vnet2", "pa_validation": true } - } + }, + { + "DASH_METER_POLICY: { + "meter_policy_id": "245bea34-1000-0000-0000-0000082764ac", + "ip_version": "ipv4" + } + }, + { + "DASH_METER_RULE: { + "meter_policy_id": "245bea34-1000-0000-0000-0000082764ac", + "rule_num": "1", + "prioirty": "0", + "ip_prefix": "40.0.0.1/32", + "metering_class":"20000" + } + "OP": "SET" + }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"ROUTE_DIRECT_VNET1", + "metering_class": "1000" + } + "OP": "SET" + }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"MAPPING_VNET1_10010101", + "metering_class": "1001" + } + "OP": "SET" + }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"MAPPING_VNET1_10000006", + "metering_class": "1002" + } + "OP": "SET" + }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"ROUTE_DIRECT_POLICY_40000001", + "metering_class": "20000" + } + "OP": "SET" + }, ] ``` @@ -823,21 +974,42 @@ For the example configuration above, the following is a brief explanation of loo b. The action in this case is "vnet" and the routing type for "vnet" is "maprouting" c. Next lookup shall happen on the "mapping" table for Vnet "Vnet1" d. Mapping table for 10.1.1.1 shall be hit and it takes the action "vnet_encap". - e. Encap action shall be performed and use PA address as specified by "underlay_ip" + e. Encap action shall be performed and use PA address as specified by "underlay_ip + f. Metering: + - LPM route does not have a metering bucket configured + - Metering policy lookup is not enabled + - Metering class 1001 from mapping entry 10.1.1.1 is used for accounting the traffic 2. Packet destined to 10.1.0.1: a. LPM lookup hits for entry 10.1.0.0/24 b. The action in this case is "vnet_direct" and the routing type for "vnet" is "maprouting", with overlay_ip specified c. Next lookup shall happen on the "mapping" table for Vnet "Vnet1", but for overlay_ip 10.0.0.6 d. Mapping table for 10.0.0.6 shall be hit and it takes the action "vnet_encap". e. Encap action shall be performed and use PA address as specified by "underlay_ip" + f. Metering: + - LPM route does not have a metering bucket configured + - Metering policy lookup is not enabled + - Metering class 1002 from mapping entry 10.0.0.6 is used for accounting the traffic 3. Packet destined to 30.0.0.1 a. LPM lookup hits for entry 30.0.0.0/16 b. The action in this case is "direct". c. Direct routing happens without any further encapsulation + d. Metering: + - LPM route has metering class 1000 configured + - Metering policy lookup is not enabled + - Metering class 1000 from routing entry 30.0.0.0/16 is used for accounting the traffic 4. Packet destined to 10.2.5.1 a. LPM lookup hits for entry 10.2.5.0/24 b. The action in this case is "drop". c. Packets gets dropped + 5. Packet destined to 40.0.0.1 + a. LPM lookup hits for entry 40.0.0.0/16 + b. The action in this case is "direct" + c. Direct routing happens without any further encapsulation + d. Metering: + - LPM route has metering class 1000 configured + - Metering policy lookup is enabled + - Metering policy 245bea34-1000-0000-0000-0000082764ac is looked up. Metering rule_num 1 is hit + - Metering class 20000 from metering rule_num 1 is used for accounting the traffic For the inbound direction, after Route/ACL lookup, pipeline shall use the "underlay_ip" as specified in the ENI table to VXLAN encapsulate the packet and VNI shall be the ```vm_vni``` specified in the APPLIANCE table @@ -872,6 +1044,8 @@ For the inbound direction, after Route/ACL lookup, pipeline shall use the "under "overlay_sip":"fd00:108:0:d204:0:200::0", "overlay_dip":"2603:10e1:100:2::0", "underlay_sip":"40.1.2.1" + "metering_policy_en":"false", + "metering_class":"50000" }, "OP": "SET" }, @@ -894,6 +1068,14 @@ For the inbound direction, after Route/ACL lookup, pipeline shall use the "under }, "OP": "SET" }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"SERVICE_TUNNEL_ROUTE_50010200", + "metering_class": "50000" + } + "OP": "SET" + }, ] ``` @@ -907,6 +1089,10 @@ For the example configuration above, the following is a brief explanation of loo d. Packet gets transformed as: Overlay SIP fd00:108:0:d204:0:200::a01:101, Overlay DIP 2603:10e1:100:2::3201:201 e. Second Action is Static NVGRE encap. f. Since underlay dip is not specified in the LPM table, It shall use Dst IP (overlay) from packet, i.e 50.1.2.1 and underlay Src IP as 40.1.2.1 + g. Metering: + - LPM route has metering bucket 50000 configured + - Metering policy lookup is not enabled + - Metering class 50000 from the route entry is used for accounting the traffic 2. Packet destined to 60.1.2.1 from 10.1.1.1: a. LPM lookup hits for entry 60.1.2.1/32 @@ -958,6 +1144,8 @@ For the example configuration above, the following is a brief explanation of loo "DASH_ROUTE_TABLE:F4939FEFC47E:10.1.0.8/32": { "action_type":"vnet", "vnet":"Vnet1" + "metering_policy_en":"false", + "metering_class":"60000" }, "OP": "SET" }, @@ -968,6 +1156,8 @@ For the example configuration above, the following is a brief explanation of loo "underlay_ip":"50.1.2.3", "overlay_sip":"fd40:108:0:d204:0:200::0", "overlay_dip":"2603:10e1:100:2::3401:203", + "metering_class":"60001", + "override_meter":"true" }, "OP": "SET" }, @@ -987,7 +1177,23 @@ For the example configuration above, the following is a brief explanation of loo "overlay_dip":"2603:10e1:100:2::3402:206", }, "OP": "SET" - } + }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"ROUTE_VNET1_10010008", + "metering_class": "60000" + } + "OP": "SET" + }, + { + "DASH_METER: { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "metadata":"PRIVATE_LINK_VNET1_10010008", + "metering_class": "60001" + } + "OP": "SET" + }, ] ``` @@ -1006,6 +1212,11 @@ For the example configuration above, the following is a brief explanation of loo Overlay DIP 2603:10e1:100:2::3401:203 (No transformation, provided as part of mapping) f. Second Action is Static NVGRE encap with GRE key '100'. g. Underlay DIP shall be 50.1.2.3 (from mapping), Underlay SIP shall be 55.1.2.3 (from ENI) + h. Metering: + - LPM route has metering bucket 60000 configured + - Metering policy lookup is not enabled + - Override meter is enabled for the mapping entry 10.1.0.8 + - Metering class 60001 from mapping entry 10.1.0.8 is used for accounting the traffic 2. Packet destined to 10.2.0.6 from 10.1.1.2: a. LPM lookup hits for entry 10.2.0.6/32 @@ -1017,4 +1228,3 @@ For the example configuration above, the following is a brief explanation of loo Overlay DIP 2603:10e1:100:2::3402:206 (No transformation, provided as part of mapping) f. Second Action is Static NVGRE encap with GRE key '100'. g. Underlay DIP shall be 50.2.2.6 (from mapping), Underlay SIP shall be 55.1.2.3 (from ENI) - diff --git a/documentation/general/images/dash-hld-outbound-meter-pipeline.png b/documentation/general/images/dash-hld-outbound-meter-pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a348306d8af8f415b9d3a0b7ae37ab4a9fe8e6 GIT binary patch literal 206505 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

A_O@~r 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 O5O})!xvX - - -
VNI Lookup
(set direction)
VNI Lookup...
ENI Lookup
ENI Lookup
Conntrack Lookup
Conntrack Lookup
ACLs
ACLs
Routing
Routing
Metering
Metering
Conntrack Update
Conntrack Update
VM
VM
Network
Network
Text is not SVG - cannot display
\ No newline at end of file From 19999a2b3f843e3de3e902f994b6d68cb99ad146 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Fri, 24 Mar 2023 10:07:26 -0700 Subject: [PATCH 04/75] [Sonic] PL on NSG and Inbound flows (#341) * [Sonic] PL on NSG and Inbound flows --- .wordlist.txt | 2 + documentation/general/dash-sonic-hld.md | 93 +++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/.wordlist.txt b/.wordlist.txt index 613bd0c23..da2380fc9 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -356,6 +356,8 @@ num NumberOfFlowResimulated NVA NVidia +nvgre +Nvgre NVMe observability OCP diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 33b06fc96..860864cfc 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -201,6 +201,8 @@ It is worth noting that CA-PA mapping table shall be used for both encap and dec ST/PL is employed for scenarios like multiple different customers want to access a common shared resource (e.g storage). This shall not fall into the regular Vnet packet path or Vnet peering path and hence a Private Endpoint is assigned for such accesses, as part of ENI routing or VNET's mapping tables. The lookup happens as described in the above sections, but actions are different. For ST/PL, actions include IPv4 to IPv6 transpositions and special routing/mapping lookups for encapsulation. By having packet transpositions, Service Tunnel feature provides the capability of encoding “region id”, “vnet id”, “subnet id” etc via packet transformation. IPv6 transformation includes last 32 bits of the IPv6 packet as IPv4 address, while the remaining 96 bits of the IPv6 packet is used for encoding. Private Link feature is an extension to Service Tunnel feature and enables customers to access public facing shared services via their private IP addresses within their vnet. More details on traffic flow is captured in the example section. **ST/PL Inbound flow**: Using the outbound unified flow, the reverse transposition (inbound unified flow) is created. If no inbound flow is created, the packet shall be dropped if it does not match any existing inbound routing rule. There is no inbound policy based lookup expected for ST/PL scenarios. When FastPath kicks in, the respective outbound and inbound unified flows shall be modified accordingly. + +ST encap shall be either nvgre or vxlan. The same encapsulation is expected on the inbound flow. ## 2.4 Metering @@ -383,6 +385,24 @@ encap_type = encap type depends on the action_type - {vxlan, nvgre vni = vni value associated with the corresponding action. Applicable if encap_type is specified. ``` +### 3.2.5.1 ROUTING APPLIANCE + +``` +DASH_ROUTING_APPLIANCE_TABLE:{{appliance_id}}: + "appliance_guid":{{string}} + "addresses": {{list of addresses}} + "encap_type": {{encap type}} + "vni": {{vni}} +``` + +``` +key = DASH_ROUTING_APPLIANCE_TABLE:appliance_id; Used for PL NSG +; field = value +addresses = list of addresses used for ECMP across appliances +encap_type = encap type depends on the action_type - {vxlan, nvgre} +vni = vni value associated with the corresponding action. +``` + ### 3.2.6 APPLIANCE ``` @@ -739,16 +759,19 @@ Underlay attributes on a DASH appliance shall be programmed similar to Sonic swi Note that *only* default route is expected from the peer BGP and appliance is _not_ expected to allocate an LPM resource for underlay. Implementation can choose whether to forward the packet on the same port it is received or do forwarding based on route and next-hop entry. Same is applicable for ECMP where the implementation can perform 5-tuple hashing or forward the "return" traffic on the same port it has received the original packet. -### 3.3.6 Memory footprints +### 3.3.6 Encap behavior +Default DSCP behavior for vxlan or nvgre encap shall be "uniform" model (similar to SAI_TUNNEL_DSCP_MODE_UNIFORM_MODEL) and TTL behavior for encap shall be "pipe" model (similar to SAI_TUNNEL_TTL_MODE_PIPE_MODEL). However for DSCP, pipeline must copy the DSCP value to the new encap outer header from the original incoming packet *before* decap was done and not from the customer packet header. Appliance shall not modify the DSCP or TTL values in the inner packet (customer packet) during an encap and shall ensure outer header values are independent of the customer generated headers. Similarly, for routing action type "direct", for e.g internet traffic, the DSCP value shall be reset to original header's DSCP value even-if original packet arrives with a non-zero value effectively ensuring all outbound traffic from the appliance is transmitted with same value that is received in the original outer header. Outer TTL value shall be default set to 64. + +### 3.3.7 Memory footprints -#### 3.3.6.1 SONiC memory usage +#### 3.3.7.1 SONiC memory usage | Running components | Memory usage | |--|--| |Base Debian OS | 159MB | |Base Debian OS + docker containers | 1.3GB | -#### 3.3.6.2 SONiC docker containers memory usage +#### 3.3.7.2 SONiC docker containers memory usage |Container| Memory usage | |--|--| @@ -1101,6 +1124,15 @@ For the example configuration above, the following is a brief explanation of loo d. Packet gets transformed as: Overlay SIP fd00:108:0:d204:0:200::0a01:101, Overlay DIP 2603:10e1:100:2::3c01:201 e. Second Action is Static NVGRE encap. f. Since underlay sip/dip is specified in the LPM table, It shall use Dst IP (25.1.2.1), Src IP (30.1.2.1) + g. Thus the packet is sent with two headers - One Inner IPv6 and another Outer IPv4 + h. Inbound packet for this flow: + h.1 The return packet for the above flow shall land on an SLB MUX (30.1.2.1) as NVGRE packet + h.2 SLB MUX (30.1.2.1) shall encapsulate this to another header with standard GRE key, say 100 and forwards to Appliance PA + h.3 Appliance PA is the unique IP advertised by the Appliance card, say via BGP for reachability. + h.4 Appliance shall first decapsulate the outer header and map it to a flow + h.5 Second header's dst mac shall correspond to ENI MAC, as overwritten by SLB MUX + h.6 Third header shall be the transpositioned IPv6 header + i. Note: This flow fixup shall be done when Fastpath kicks in with ICMP Redirect, and packets ingress with two headers. 3. Packet destined to 70.1.2.1 from 10.1.1.1: a. LPM lookup hits for entry 70.1.2.0/24 @@ -1126,8 +1158,33 @@ For the example configuration above, the following is a brief explanation of loo "encap_type": "nvgre" "key":"100" } ], + "OP": "SET", + "DASH_ROUTING_TYPE_TABLE:privatelinknsg": [ + { + "name": "action1", + "action_type": "4to6", + }, + { + "name": "action2", + "action_type": "staticencap", + "encap_type": "nvgre" + "key":"100" + }, + { + "name": "action3", + "action_type": "appliance", + } ], "OP": "SET" }, + { + DASH_ROUTING_APPLIANCE_TABLE:22: { + "appliance_guid":"497f23d7-f0ac-4c99", + "addresses": "100.8.1.2", + "encap_type": "vxlan", + "vni": 101 + }, + "OP": "SET" + }, { "DASH_ENI_TABLE:F4939FEFC47E": { "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", @@ -1162,7 +1219,7 @@ For the example configuration above, the following is a brief explanation of loo "OP": "SET" }, { - "DASH_ROUTE_TABLE:F4939FEFC47E:10.2.0.6/32": { + "DASH_ROUTE_TABLE:F4939FEFC47E:10.2.0.6/24": { "action_type":"vnet", "vnet":"Vnet1" }, @@ -1179,6 +1236,16 @@ For the example configuration above, the following is a brief explanation of loo "OP": "SET" }, { + "DASH_VNET_MAPPING_TABLE:Vnet1:10.2.0.9": { + "routing_type":"privatelinknsg", + "mac_address":"F9-22-83-99-22-A2", + "underlay_ip":"50.2.2.6", + "overlay_sip":"fd40:108:0:d204:0:200::0", + "overlay_dip":"2603:10e1:100:2::3402:206", + "routing_appliance_id":22 + }, + "OP": "SET" + }, "DASH_METER: { "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", "metadata":"ROUTE_VNET1_10010008", @@ -1208,7 +1275,7 @@ For the example configuration above, the following is a brief explanation of loo For Overlay SIP, using ENI's "pl_sip_encoding": "0x0020000000000a0b0c0d0a0b/0x002000000000ffffffffffff" -> Overlay SIP fd30:108:0:0a0b:0c0d:0a0b:a01:101 using the following logic: 1. fv = (fd40:108:0:d204:0:200::0 & !0x002000000000ffffffffffff) (first 96 bits based on provided mask length) 2. result = fv | 0x0020000000000a0b0c0d0a0b (first 96 bits based on the provided mask length) - 3. result = result | ca (last 32 bits if its set to 0 in mapping, implicit conversion) + 3. result = result | source CA (last 32 bits if its set to 0 in mapping, implicit conversion) Overlay DIP 2603:10e1:100:2::3401:203 (No transformation, provided as part of mapping) f. Second Action is Static NVGRE encap with GRE key '100'. g. Underlay DIP shall be 50.1.2.3 (from mapping), Underlay SIP shall be 55.1.2.3 (from ENI) @@ -1219,7 +1286,7 @@ For the example configuration above, the following is a brief explanation of loo - Metering class 60001 from mapping entry 10.1.0.8 is used for accounting the traffic 2. Packet destined to 10.2.0.6 from 10.1.1.2: - a. LPM lookup hits for entry 10.2.0.6/32 + a. LPM lookup hits for entry 10.2.0.6/24 b. The action in this case is "vnet" c. Next lookup is in the mapping table and mapping table action here is "privatelink" d. First Action for "privatelink" is 4to6 transposition @@ -1228,3 +1295,17 @@ For the example configuration above, the following is a brief explanation of loo Overlay DIP 2603:10e1:100:2::3402:206 (No transformation, provided as part of mapping) f. Second Action is Static NVGRE encap with GRE key '100'. g. Underlay DIP shall be 50.2.2.6 (from mapping), Underlay SIP shall be 55.1.2.3 (from ENI) + + 3. Packet destined to 10.2.0.9 from 10.1.1.2: + a. LPM lookup hits for entry 10.2.0.6/24 + b. The action in this case is "vnet" + c. Next lookup is in the mapping table and mapping table action here is "privatelinknsg" + d. First Action for "privatelink" is 4to6 transposition + e. Packet gets transformed as: + For Overlay SIP, using ENI's "pl_sip_encoding": "0x0020000000000a0b0c0d0a0b/0x002000000000ffffffffffff" -> Overlay SIP fd30:108:0:0a0b:0c0d:0a0b:a01:102; + Overlay DIP 2603:10e1:100:2::3402:206 (No transformation, provided as part of mapping) + f. Second Action is Static NVGRE encap with GRE key '100'. + g. Underlay DIP shall be 50.2.2.6 (from mapping), Underlay SIP shall be 55.1.2.3 (from ENI) + h. Third Action is Appliance Encap for id 22 + i. Packet shall be encapsulated with Outer DIP as 100.8.1.2 and SIP as VIP of this originating appliance card with VNI of 101. + j. Inbound flow shall be similar to PL and outer encap shall be of the SLB MUX and not of the NSG appliance. From 6b258452709dc5eb1e44c3751da0500a422ef825 Mon Sep 17 00:00:00 2001 From: vincent-xs <114104889+vincent-xs@users.noreply.github.com> Date: Sat, 25 Mar 2023 13:47:25 -0400 Subject: [PATCH 05/75] minor fixes (passed value and removal ordering) in testcases (#352) --- test/test-cases/functional/ptf/saidasheni.py | 2 +- .../sai-api/test_sai_api_vnet_out_route.py | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/test-cases/functional/ptf/saidasheni.py b/test/test-cases/functional/ptf/saidasheni.py index ce50b473a..9c521b612 100644 --- a/test/test-cases/functional/ptf/saidasheni.py +++ b/test/test-cases/functional/ptf/saidasheni.py @@ -114,7 +114,7 @@ def createDirectionLookupTest(self): """ Verifies Direction Lookup creation """ - self.dir_lookup = self.direction_lookup_create(vni=self.outbound_vnet) + self.dir_lookup = self.direction_lookup_create(vni=self.vm_vni) def createEniTest(self): """ diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py index 859e3d203..bbbfff01b 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py @@ -181,6 +181,18 @@ def test_vnet_outbound_routing_entry_get2(self, dpu): assert all( [result == 0 for result in results]), "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET Get error" def test_vnet_outbound_routing_entry_remove(self, dpu): + commands = [ + { + "name": "ore", + "op": "remove", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + }, + ] + results = [*dpu.process_commands(commands)] + print("\n======= SAI commands RETURN values create =======") + pprint(results) + + assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY Remove error" # Remove ENI commands = [ @@ -212,15 +224,3 @@ def test_vnet_outbound_routing_entry_remove(self, dpu): assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Remove error" - commands = [ - { - "name": "ore", - "op": "remove", - "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", - }, - ] - results = [*dpu.process_commands(commands)] - print("\n======= SAI commands RETURN values create =======") - pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY Remove error" From d555fd355e61b76072d46ae5ba5843d2feff8560 Mon Sep 17 00:00:00 2001 From: Anton Putria Date: Wed, 29 Mar 2023 19:45:24 +0300 Subject: [PATCH 06/75] Added more Vnet-to-Vnet PTF test cases (#315) * Added more Vnet-to-Vnet PTF test cases - Added Vnet-to-Vnet test plan - Added more Vnet-to-Vnet PTF test cases - Updated sai_dash_utils Signed-off-by: Yuriy Harhas * Added new words for the spellchecker. Signed-off-by: Anton Putria * Fix links in the VNET testplan document Signed-off-by: Anton Putria * Vnet2Vnet Functional PTF test cases extend and refactor Update functional/ptf test cases - sai_dash_utils - update packet drop verification - saidashvnet - add new test scenarios and refactor existing test cases - saidasheni - minor fix - VNET test plan updated Signed-off-by: Yuriy Harhas --------- Signed-off-by: Yuriy Harhas Signed-off-by: Anton Putria Co-authored-by: Yuriy Harhas --- .wordlist.txt | 2 + test/docs/testplans/vnet.md | 162 + .../functional/ptf/sai_dash_utils.py | 1089 ++++- test/test-cases/functional/ptf/saidashvnet.py | 3929 +++++++++++++++-- 4 files changed, 4826 insertions(+), 356 deletions(-) create mode 100644 test/docs/testplans/vnet.md diff --git a/.wordlist.txt b/.wordlist.txt index da2380fc9..1bd1ea9e4 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -309,6 +309,7 @@ LOOKUPs loopback LPM lts +MACs Macsec makefile Makefile @@ -638,6 +639,7 @@ Vnic vnic vnics VNID +VNIs VPC vpc vport diff --git a/test/docs/testplans/vnet.md b/test/docs/testplans/vnet.md new file mode 100644 index 000000000..fa487a097 --- /dev/null +++ b/test/docs/testplans/vnet.md @@ -0,0 +1,162 @@ +# Table of content + +1. [Objectives](#objectives) +2. [Requirements](#requirements) +3. [Automation](#automation) +4. [Test Suites](#test-suites) + - [Outbound VNET routing](#outbound-vnet-routing) + - [Inbound VNET routing](#inbound-vnet-routing) + - [Integration](#integration) + - [Negative](#negative) + - [Scaling & Performance](#scaling--performance) + - [To clarify / Future](#to-clarify--future) + +--- + +# Objectives + +The VNET-to-VNET scenario is the starting point to design, implement and test the core DASH mechanisms in VM to VM communication in VNET, using an Appliance for rules and routing offload. + +The scenario allows the following: +- Route/LPM support +- Underlay IPv4 and IPv6 +- Stateful ACL support +- TCP state tracking on flows +- Telemetry and Monitoring + +## Requirements + +### Scale +| Item | Expected value | +|------------------------|:--------------------:| +| VNETs | 1024 | +| ENI per card | 64 | +| Routes per ENI | 100k | +| NSGs per ENI | 5 in + 5 out | +| ACLs per ENI | 10x100K prefixes | +| ACLs per ENI | 10x10K SRC/DST ports | +| CA-PA Mappings per ENI | 160k | +| Active Connections/ENI | 1M (Bidirectional) | + +### Performance +| Item | Expected value | +|---------------------|:--------------:| +| CPS per 200G | 3.75M | +| Flows per ENI | 1M | +| Flows per 200G card | 64M | +| Flows per 400G card | 128M | + + +### Other + +1. Bulk update of LPM and CA-PA Mapping tables. +2. Mapping updates can occur as much as 100 mappings/sec +3. ACL operations (rules adding/deleting) per group for a stage must be handled atomically. +4. Support ability to get all ACL rules/groups based on guid. +5. During VNET or ENI delete, implementation must support ability to delete all mappings or routes in a single API call. +6. Add and Delete APIs are idempotent. +7. During a delete operation, if there is a dependency, implementation shall return error and shall not perform any force-deletions or delete dependencies implicitly. +8. During a bulk operation, if any part/subset of API fails, implementation shall return error for the entire API. +9. Implementation must have flexible memory allocation for ENI and not reserve max scale during initial create (e.g 100k routes). This is to allow oversubscription. +10. Implementation must not have silent failures for APIs. + +More details may be found in [DASH SONiC HLD](https://github.com/sonic-net/DASH/blob/main/documentation/general/dash-sonic-hld.md#16-design-considerations). + + +# Automation + +Test cases are automated using SAI PTF test framework, except scale and performance tests. +Scale and performance tests automation approach - to be defined. + +# Test suites + +**Overall comments** +1. Each scenario should be executed with and without underlay route table configuration: + - without underlay route table entries - no default or static routes defines. Same rx/tx port are used for traffic send and receive. + - with underlay route table entries - Add static or default route entries to forward packets from one port to another. Use two different ports for traffic send/receive forwarding verification. +1. Each test should send multiple traffic types: + - Traffic that matches applied configuration (positive case) + - Traffic that doesn't match applied configuration for each applied attribute (negative case). +1. Each scenario should be verified in the following combinations: + - IPv4 underlay + IPv4 overlay + - IPv4 underlay + IPv6 overlay + +### **Outbound VNET routing** +| # | Test case purpose | Test Class.Method | Test description | +|:-----:|:----------------|:--------------|:----------| +| 1-2 | Verify route action ROUTE_VNET | `Vnet2VnetOutboundRouteVnetSinglePortTest.`
`vnet2VnetOutboundRoutingTest`

`Vnet2VnetOutboundRouteVnetTwoPortsTest.`
`vnet2VnetOutboundRoutingTest` | Creates single ENI outbound (SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET) overlay configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 3-4 | Verify route action ROUTE_VNET_DIRECT | `Vnet2VnetOutboundRouteVnetDirectSinglePortTest.`
`vnet2VnetOutboundRoutingTest`

`Vnet2VnetOutboundRouteVnetDirectTwoPortsTest.`
`vnet2VnetOutboundRoutingTest` | Creates single ENI outbound (SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT) overlay configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 5 | Verify route action ROUTE_DIRECT | `Vnet2VnetOutboundRouteDirectTwoPortsTest`
`outboundRouteDirectTest` | Creates single ENI outbound (SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT) overlay configuration with underlay rote configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic. | +| 6 | (**Clarify no-underlay scenario**) | `Vnet2VnetOutboundRouteDirectSinglePortTest.`
`outboundRouteDirectTest` | Creates single ENI outbound (SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT) overlay configuration without underlay route configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic. | +| 7 | dst_vnet_id True/False in OUTBOUND_CA_TO_PA_ENTRY | `Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest.`
`vnet2VnetOutboundDstVnetIdTrueTest`
`vnet2VnetOutboundDstVnetIdFalseTest`

`Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsTest.`
`vnet2VnetOutboundDstVnetIdTrueTest`
`vnet2VnetOutboundDstVnetIdFalseTest` | Creates single ENI with two outbound routing entries (with SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action) and ca_to_pa entries (with use_dst_vnet_vni attribute True and False values).
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 8 | Verify route action ROUTE_VNET_DIRECT with CA to PA mappings | `Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest.`
`vnet2VnetOutboundDstVnetIdTrueTest`
`vnet2VnetOutboundDstVnetIdFalseTest`

`Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortsTest.`
`vnet2VnetOutboundDstVnetIdTrueTest`
`vnet2VnetOutboundDstVnetIdFalseTest` | Creates single ENI with two outbound routing entries (with SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action) and ca_to_pa entries (with use_dst_vnet_vni attribute True and False values).
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 9-10 | Use same CA prefixes in different outbound routing tables (different ENIs) | `Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest.`
`outboundEni0Test`
`outboundEni1Test`
`outboundEni2Test`

`Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsTest.`
`outboundEni0Test`
`outboundEni1Test`
`outboundEni2Test` | Creates three ENI with the same Customer and Physical IP addresses but with different MACs and VNIs.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 11-12 | Use multiple overlapping routing prefixes in the same outbound routing table. | `Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest.`
`singleEniToOutboundVm1Test`
`singleEniToOutboundVm2Test`
`singleEniToOutboundVm3Test`

`Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsTest.`
`singleEniToOutboundVm1Test`
`singleEniToOutboundVm2Test`
`singleEniToOutboundVm3Test` | Creates single ENI with three outbound routing entries with overlapping IP prefixes (ENI 9.0.0.1 <--> 10.5.4.4/8, 10.0.1.2/24, 10.1.1.1/32).
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 13-14 | Use same prefixes in CA and PA networks. | `Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest.`
`vnet2VnetOutboundRouteVnetTest`

`Vnet2VnetOutboundSameCaPaIpPrefixesTwoPortsTest.`
`vnet2VnetOutboundRouteVnetTest` | Creates single ENI with the same Customer and Physical IP address outbound configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 15-16 | Verify VNET2VNET outbound routing with single ENI admin state UP/DOWN | `Vnet2VnetOutboundEniSetUpDownSinglePortTest.`
`vnet2VnetEniUpTrafficTest`
`setEniStateTest`
`vnet2VnetEniDownTrafficTest`

`Vnet2VnetOutboundEniSetUpDownTwoPortsTest.`
`vnet2VnetEniUpTrafficTest`
`setEniStateTest`
`vnet2VnetEniDownTrafficTest` | Creates single ENI and Outbound routing entry and verifies packet routing during ENI admin state setting UP/DOWN.
1. With underlay route
2. Without underlay route | + | 17-18 | Verify VNET2VNET outbound routing with single Outbound route and multiple Ca2Pa entries | `Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest.`
`vnet2VnetOutboundRoutingTest`
`vnet2VnetOutboundNegativeTest`

`Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsTest.`
`vnet2VnetOutboundRoutingTest`
`vnet2VnetOutboundNegativeTest`
| Creates single ENI and Outbound routing entry with multiple Ca2Pa entries.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | + + +Original table [link](https://github.com/sonic-net/DASH/blob/main/documentation/general/sdn-features-packet-transforms.md#routing-routes-and-route-action). + +### **Inbound VNET routing** + +| # | Test case purpose | Test Class.Method | Test description | +|:------:|:-----------|:---|:------| +| 1-2 | Verify VNET2VNET routing with PA validation entry PERMIT.
SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE
SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT | `Vnet2VnetInboundDecapPaValidateSinglePortTest.`
`vnet2VnetInboundRoutingTest`

`Vnet2VnetInboundDecapPaValidateTwoPortsTest.`
`vnet2VnetInboundRoutingTest` | Creates single ENI inbound (SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE) overlay configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 3-4 | Verify VNET2VNET routing without PA validation entry
SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP | `Vnet2VnetInboundDecapSinglePortTest.`
`vnet2VnetInboundRoutingTest`

`Vnet2VnetInboundDecapTwoPortsTest.`
`vnet2VnetInboundRoutingTest` | Creates single ENI inbound (SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP) overlay configuration.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 5-6 | Verify VNET2VNET routing when multiple Inbound routing entries and multiple PA validate exist with single ENI | `Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest.`
`vnet2VnetInboundRoutingPositiveTest`

`Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsTest.`
`vnet2VnetInboundRoutingPositiveTest` | Creates single ENI with multiple Inbound routing entries.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 7-8 | Verify VNET2VNET routing when multiple Inbound routing entries and multiple PA validate exist with multiple ENI | `Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest.`
`vnet2VnetInboundRoutingPositiveTest`

`Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsTest.`
`vnet2VnetInboundRoutingPositiveTest` | Creates 2 ENI: 1st ENI with 2 Inbound routes (with and without PA Validate), 2nd ENI with 1 Inbound route and 1 PA validation.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | + | 9-10 | Verify VNET2VNET routing when single ENI and single Inbound routing entry exist with multiple PA validation entries | `Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest.`
`vnet2VnetInboundRoutingTest`

`Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsTest.`
`vnet2VnetInboundRoutingTest` | Creates single ENI with single Inbound routing entry and with multiple PA validation entries.
Verifies configuration with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | + | 11-12 | Verify VNET2VNET inbound routing with single ENI admin state UP/DOWN | `Vnet2VnetInboundEniSetUpDownSinglePortTest.`
`vnet2VnetEniUpTrafficTest`
`setEniStateTest`
`vnet2VnetEniDownTrafficTest`

`Vnet2VnetInboundEniSetUpDownTwoPortsTest.`
`vnet2VnetEniUpTrafficTest`
`setEniStateTest`
`vnet2VnetEniDownTrafficTest` | Creates single ENI and Inbound routing entry and verifies packet routing during ENI admin state setting UP/DOWN.
1. With underlay route
2. Without underlay route | + + +### **Integration** + +| # | Test case purpose | Test Class.Method | Test description | +|:---:|:---|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---| +| 1-2 | Multiple inbound and outbound configurations at the same time. Send multiple allowed and forbidden traffic types. | `Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest.`
`outboundHost0toHost2Test`
`inboundHost2toHost0Test`
`outboundHost3toHost1Test`
`inboundHost1toHost3Test`

`Vnet2VnetInboundOutboundMultipleConfigsTwoPortsTest.`
`outboundHost0toHost2Test`
`inboundHost2toHost0Test`
`outboundHost3toHost1Test`
`inboundHost1toHost3Test` | Creates two ENIs, each with Inbound and Outbound configuration.
Verifies configurations with mono/bidirectional VXLAN TCP traffic.
1. With underlay route
2. Without underlay route | +| 3 | Send non VXLAN traffic. | `UnderlayRouteTest.`
`l3UnderlayHost1toHost2RoutingTest`
`l3UnderlayHost2toHost1RoutingTest` | Creates single ENI with outbound configuration and underlay configuration.
Verifies regular L3 Underlay routing with mono/bidirectional simple TCP packets sending. | +| 3 | Use multiple VIPs | - | | +| 4 | Use same prefixes in CA and PA networks for outbound and inbound VNET at the same time | - | (**to clarify**) VNI configuration for Inbound. | + +### **Negative** + +| # | Test case purpose | Test Class.Method | Test description | +|:---:|:---|:---|:---| +| 1-4 | Inbound/Outbound: Verify packet drop with invalid VIP | `Vnet2VnetInboundDecapPaValidateTest.vnet2VnetInboundNegativeTest`
`Vnet2VnetInboundDecapTest.vnet2VnetInboundNegativeTest`

`Vnet2VnetOutboundRouteVnetDirectTest.vnet2VnetOutboundNegativeTest`
`Vnet2VnetOutboundRouteVnetTest.vnet2VnetOutboundNegativeTest`
`Vnet2VnetOutboundRouteDirectTest.outboundRouteDirectNegativeTest` | Creates single ENI.
Sends VXLAN TCP packet with wrong VIP address and verifies packet drop.
1. Inbound routing without underlay default route
2. Outbound routing without default underlay route | +| 2 | Outbound: Verify packer drop with valid VNI but no match to any ENI MAC (CA SMAC) | `Vnet2VnetOutboundRouteVnetDirectTest.vnet2VnetOutboundNegativeTest`
`Vnet2VnetOutboundRouteVnetTest.vnet2VnetOutboundNegativeTest`
`Vnet2VnetOutboundRouteDirectTest.outboundRouteDirectNegativeTest` | Creates single ENI outbound configuration.
Sends VXLAN TCP packet with VNI matches direction lookup entry but wrong Customer SMAC (ENI MAC) address and verifies packet drop. | +| 3 | Outbound: Verify packet drop if CA Dst IP does not match any routing entry (routing drop) | `Vnet2VnetOutboundRouteVnetDirectTest.vnet2VnetOutboundNegativeTest`
`Vnet2VnetOutboundRouteVnetTest.vnet2VnetOutboundNegativeTest`
`Vnet2VnetOutboundRouteDirectTest.outboundRouteDirectNegativeTest` | Creates single ENI outbound configuration.
Sends VXLAN TCP packet with wrong Customer DIP address (does not match any routing entry) and verifies packet drop. | +| 4 | Outbound: Verify packet drop if CA Dst IP matches routing entry prefix but drops by ca_to_pa (mapping drop) | `Vnet2VnetOutboundRouteVnetTest.vnet2VnetOutboundNegativeTest` | Creates single ENI outbound configuration.
Sends VXLAN TCP packet with Customer DIP address that matches routing entry but does not match any ca_to_pa entry and verifies packet drop. | +| 5 | Inbound: Verify packet drop if ENI MAC (CA DMAC) does not match | `Vnet2VnetInboundDecapPaValidateTest.vnet2VnetInboundNegativeTest`
`Vnet2VnetInboundDecapTest.vnet2VnetInboundNegativeTest` | Creates single ENI inbound configuration.
Sends VXLAN TCP packet with wrong Customer DMAC (ENI MAC) and verifies packet drop. | +| 6 | Inbound: Verify packet drop if PA SIP match Inbound routing entry but does not match on PA validation | `Vnet2VnetInboundDecapPaValidateTest.vnet2VnetInboundNegativeTest` | Creates single ENI inbound configuration.
Sends VXLAN TCP packet with Physical SIP address that matches inbound routing entry but does not match any PA validation entry and verifies packet drop. | +| 7 | Inbound: Verify packet drop if PA SIP does not match any Inbound routing entry | `Vnet2VnetInboundDecapPaValidateTest.vnet2VnetInboundNegativeTest`
`Vnet2VnetInboundDecapTest.vnet2VnetInboundNegativeTest` | Creates single ENI inbound configuration.
Sends VXLAN TCP packet with Physical SIP address that does not matches any inbound routing entry and verifies packet drop. | +| 8 | Inbound: Verify packet drop if VNI does not match any ENI | `Vnet2VnetInboundDecapPaValidateTest.vnet2VnetInboundNegativeTest`
`Vnet2VnetInboundDecapTest.vnet2VnetInboundNegativeTest` | Creates single ENI inbound configuration.
Sends VXLAN TCP packet with wrong VNI (does not match any inbound routing entry) and verifies packet drop. | +| 9 | Verify invalid configurations:
- Multiple MACs for same ENI
- All different VNIs in ENI, direction lookup, vnet configuration.
- Add same VNI for different direction lookup entries. | - | - | + +### **Scaling & Performance** + +To be defined. + + +### **To clarify / Future** + +1. Items 5 and 7 in [other requirements](#other) are conflicting to each other. +2. What is relation between vm_vni and vnet_id in ENI create? +3. The lookup table is per ENI, but could be Global, or multiple Global lookup tables per ENIs. How to configure global lookup? Multiple lookups? +4. In Encap and Decap rules we have: + - static rule + - based on mapping lookup + - inner packet SRC/DEST IP calculated based on part of outer packet SRC/DEST IP
+Question: What is static rule and calculated values? +5. How to test - Inbound (priority) route rules processing: + - Most Outer Source IP Prefix + - Most Outer Destination IP Prefix + - VXLAN/GRE key +6. Need examples: Transpositions. + - Direct traffic – pass through with static SNAT/DNAT (IP, IP+Port) + - Packet upcasting (IPv4 -> IPv6 packet transformation) + - Packet downcasting (IPv6 -> IPv4 packet transformation) +7. Need example: Up to 3 level of routing transforms (example: decap + decap + transpose). +8. LB on outbound VNET scenario (different PAs) +9. TODO: Example: Lookup between CA (inside Cx own VNET) and PA (Provider Address) using lookup table (overwrite destination IP and MAC before encap) diff --git a/test/test-cases/functional/ptf/sai_dash_utils.py b/test/test-cases/functional/ptf/sai_dash_utils.py index 803fe5abb..333adc995 100644 --- a/test/test-cases/functional/ptf/sai_dash_utils.py +++ b/test/test-cases/functional/ptf/sai_dash_utils.py @@ -25,6 +25,49 @@ from dataclasses import dataclass +@dataclass +class DutNetworkParameters: + """ + Data class for storing basic network parameters of DUT + """ + + port: str + mac: str + ip: str + + +@dataclass +class ClientNetworkParameters: + """ + Data class for storing basic VNET client network parameters + """ + + mac: str + ip: str + vni: int + + +@dataclass +class DutNeighborNetworkParameters: + """ + Data class for storing basic network parameters of DUT Neighbors + + port: Neighbor port (Traffic generator port) + mac: Neighbor port MAC address + ip: Neighbor port IP address + ip_prefix: Neighbor port IP prefix (e.g. 10.1.1.0/24) + peer: DutNetworkParameters object + client: ClientNetworkParameters object + """ + + port: object + mac: str + ip: str + ip_prefix: str + peer: DutNetworkParameters + client: ClientNetworkParameters = None + + class VnetObjects(SaiHelperSimplified): def setUp(self): super(VnetObjects, self).setUp() @@ -143,7 +186,6 @@ def direction_lookup_create(self, vni): direction_lookup_entry = sai_thrift_direction_lookup_entry_t(switch_id=self.switch_id, vni=vni) sai_thrift_create_direction_lookup_entry(self.client, direction_lookup_entry, action=act) - self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.direction_lookup_remove, direction_lookup_entry) @@ -360,23 +402,1040 @@ def route_create(self, prefix, nhop): def route_remove(self, entry): sai_thrift_remove_route_entry(self.client, entry) - def configure_underlay(self, neighbor1, neighbor2=None, add_routes=True): + def configure_underlay(self, *neighbors, add_routes=True): """ Configure L3 underlay network based on neighbors network configuration """ - rif0 = self.router_interface_create(neighbor1.peer.port, - src_mac=neighbor1.peer.mac) - nhop1 = self.nexthop_create(rif0, neighbor1.ip) - self.neighbor_create(rif0, neighbor1.ip, neighbor1.mac) + for neighbor in neighbors: + rif = self.router_interface_create(neighbor.peer.port, + src_mac=neighbor.peer.mac) + nhop = self.nexthop_create(rif, neighbor.ip) + self.neighbor_create(rif, neighbor.ip, neighbor.mac) + if add_routes is True: + self.route_create(neighbor.ip_prefix, nhop) + + +class VnetApiEndpoints(VnetAPI): + """ + Base class to define test network configuration + Configuration types: + - underlay and overlay IPv4 + - underlay and overlay IPv6 + - underlay IPv4 and overlay IPv6 + - underlay IPv6 and overlay IPv4 + Configuration: + +--------------------------------------------------+ + | DUT | + +--------------------------------------------------+ + | VIP - 10.1.1.1 / 1000:cafe::10 | + | port0 port1 | + | 00:66:55:44:33:00 00:77:66:55:44:00 | + +--------------------------------------------------+ + / \ + / \ + / \ + +------------------------------+ +------------------------------+ + | host1 | | host2 | + | port: dev_port0 | | port: dev_port1 | + | mac: 10:22:33:aa:bb:cc | | mac: aa:bb:cc:11:22:33 | + | ip: 10.10.1.10/2000:cafe::20 | | ip: 10.10.2.10/3000:cafe::30 | + | ip_prefix: 10.10.1.0/24 / | | ip_prefix: 10.10.2.0/24 / | + | 2000:cafe::0/112 | | 3000:cafe::0/112 | + +------------------------------+ +------------------------------+ + | Peer (DUT) | | Peer (DUT) | + | port: port0 | | port: port1 | + | mac: 00:66:55:44:33:00 | | mac: 00:77:66:55:44:00 | + | ip: 10.1.1.1/1000:cafe::10 | | ip: 10.1.1.1/1000:cafe::10 | + +------------------------------+ +------------------------------+ + | Client | | Client | + | mac: 00:01:00:00:03:14 | | mac: 00:02:00:00:04:15 | + | ip: 192.168.0.1/aaaa::10 | | ip: 192.168.1.1/bbbb::20 | + | VNI: 1 | | VNI: 2 | + +------------------------------+ +------------------------------+ + """ + + def setUp(self, underlay_ipv6=False, overlay_ipv6=False): + super(VnetApiEndpoints, self).setUp() + + self.underlay_ipv6 = underlay_ipv6 + self.overlay_ipv6 = overlay_ipv6 + + if self.underlay_ipv6 is True: + vip = "1000:cafe::10" + tx_host_ip = "2000:cafe::20" + tx_host_ip_prefix = "2000:cafe::0/112" + rx_host_ip = "3000:cafe::30" + rx_host_ip_prefix = "3000:cafe::0/112" + else: + vip = "10.1.1.1" + tx_host_ip = "10.10.1.10" + tx_host_ip_prefix = "10.10.1.0/24" + rx_host_ip = "10.10.2.10" + rx_host_ip_prefix = "10.10.2.0/24" + + if self.overlay_ipv6 is True: + tx_host_client_ip = "aaaa::10" + rx_host_client_ip = "bbbb::20" + else: + tx_host_client_ip = "192.168.0.1" + rx_host_client_ip = "192.168.1.1" + + self.tx_host = self.define_neighbor_network(port=self.dev_port0, + mac="10:22:33:aa:bb:cc", + ip=tx_host_ip, + ip_prefix=tx_host_ip_prefix, + peer_port=self.port0, + peer_mac="00:66:55:44:33:00", + peer_ip=vip, + client_mac="00:01:00:00:03:14", + client_ip=tx_host_client_ip, + client_vni=1) + + self.rx_host = self.define_neighbor_network(port=self.dev_port1, + mac="aa:bb:cc:11:22:33", + ip=rx_host_ip, + ip_prefix=rx_host_ip_prefix, + peer_port=self.port1, + peer_mac="00:77:66:55:44:00", + peer_ip=vip, + client_mac="00:02:00:00:04:15", + client_ip=rx_host_client_ip, + client_vni=2) + + def update_configuration_for_tx_equal_to_rx(self): + """ + Update rx_host network info for use cases + when the packet is expected to be received on the port from which it was sent + (tx_equal_to_rx=True) + """ + + self.rx_host.port = self.tx_host.port + self.rx_host.mac = self.tx_host.mac + self.rx_host.ip = self.tx_host.ip + self.rx_host.ip_prefix = self.tx_host.ip_prefix + + self.rx_host.peer.port = self.tx_host.peer.port + self.rx_host.peer.mac = self.tx_host.peer.mac + self.rx_host.peer.ip = self.tx_host.peer.ip + + @staticmethod + def define_neighbor_network(port, mac, ip, ip_prefix, + peer_port, peer_mac, peer_ip, + client_mac=None, client_ip=None, client_vni=None): + """ + Host (DUT neighbor) fields hierarchy + ├── port + ├── mac + ├── ip + ├── ip_prefix + ├── peer [DUT] + │ ├ port + │ ├ mac + │ └ ip + └── client + ├── mac + ├── ip + └── vni + """ + + dut = DutNetworkParameters(port=peer_port, + mac=peer_mac, + ip=peer_ip) + + client = None + # checks only mac is not None and assume that ip and vni are not None + if client_mac is not None: + client = ClientNetworkParameters(mac=client_mac, + ip=client_ip, + vni=client_vni) + + host = DutNeighborNetworkParameters(port=port, + mac=mac, + ip=ip, + ip_prefix=ip_prefix, + peer=dut, + client=client) + + return host + + +class VnetTrafficMixin: + """ + Mixin class with methods dedicated for Vnet use cases traffic verification + """ + + # TCP flags + SYN = "S" + SYN_ACK = "SA" + ACK = "A" + FIN_ACK = "FA" + + ip_src_inner_pkt = 'ip_src' + ip_dst_inner_pkt = 'ip_dst' + ip_src_outer_pkt = 'ip_src' + ip_dst_outer_pkt = 'ip_dst' + + def define_pkts_creation_func(self, connection): + conn_type = connection.lower() + + if conn_type == 'tcp': + inner_pkt = simple_tcp_packet + inner_pkt_v6 = simple_tcpv6_packet + elif conn_type == 'udp': + inner_pkt = simple_udp_packet + inner_pkt_v6 = simple_udpv6_packet + elif conn_type == 'icmp': + inner_pkt = simple_icmp_packet + inner_pkt_v6 = simple_icmpv6_packet + else: + types = ['tcp', 'udp', 'icmp'] + raise AttributeError(f"Wrong connection type: {connection}.\n" + f"Supported connection types: {types}") + + if self.overlay_ipv6 is True: + create_inner_pkt = inner_pkt_v6 + self.ip_src_inner_pkt = 'ipv6_src' + self.ip_dst_inner_pkt = 'ipv6_dst' + else: + create_inner_pkt = inner_pkt + + if self.underlay_ipv6 is True: + create_outer_packet = simple_vxlanv6_packet + self.ip_src_outer_pkt = 'ipv6_src' + self.ip_dst_outer_pkt = 'ipv6_dst' + else: + create_outer_packet = simple_vxlan_packet + + return create_inner_pkt, create_outer_packet + + def verify_traffic_scenario(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + connection: str, + fake_mac=True, + tx_equal_to_rx=True, + terminate_tcp_session=True, + route_direct=False, + pkt_drop=False): + """ + Traffic check based on --test-params traffic_check parameter + no - no traffic check + monodir - mono-directional traffic verification + bidir (default) - bidirectional traffic verification + """ + + if test_param_get('traffic_check') == 'no': + pass + elif test_param_get('traffic_check') == 'monodir': + self.verify_oneway_connection(client=client, + server=server, + connection=connection, + fake_mac=fake_mac, + route_direct=route_direct, + pkt_drop=pkt_drop) + else: + self.verify_bidirectional_connection(client=client, + server=server, + connection=connection, + fake_mac=fake_mac, + tx_equal_to_rx=tx_equal_to_rx, + terminate_tcp_session=terminate_tcp_session, + route_direct=route_direct) + + def verify_bidirectional_connection(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + connection: str, + fake_mac=True, + tx_equal_to_rx=True, + terminate_tcp_session=True, + route_direct=False): + """ + Verify Inbound/Outbound overlay configuration with traffic. + Traffic types: tcp, udp or icmp + Notes: + - The words "Client" and "Server" are used only for + better understanding of the sequence of sending packets + - Only one traffic type can be selected + Parameters: + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + connection (str): connection type str (e.g. 'tcp', 'UDP', 'icmp') + fake_mac (bool): If True requests for Inner client packets Ether Dst MAC (CA MAC) set to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + tx_equal_to_rx (bool): If True sends and verifies pkts on the same TG port + terminate_tcp_session (bool): If True send and verify packets for tcp session termination + else only send and verify pkts for tcp session start + route_direct (bool): For scenarios when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT + and decapsulated packets expected on the server side + TCP scenario: + Start session + 1) Client -> Server: SYN pkt + 2) Client <- Server: SYN_ACK pkt + 3) Client -> Server: ACK pkt + Terminate session + 4) Client -> Server: FIN_ACK pkt + 5) Client <- Server: ACK ptk + 6) Client <- Server: FIN_ACK ptk + 7) Client -> Server: ACK pkt + UDP scenario: + Start session + 1) Client -> Server + 2) Client <- Server + ICMP scenario: + 1) Client -> Server: echo request + 2) Client <- Server: echo reply + """ + + conn_type = connection.lower() + + if conn_type == 'tcp' and route_direct: + send_packets, exp_client_packets, exp_server_packets = \ + self.create_vxlan_tcp_session_route_direct_packets( + client, server, + fake_mac=fake_mac, + terminate_tcp_session=terminate_tcp_session) + + elif conn_type == 'tcp': + send_packets, exp_client_packets, exp_server_packets = \ + self.create_vxlan_tcp_session_packets(client, server, + fake_mac=fake_mac, + terminate_tcp_session=terminate_tcp_session) + elif conn_type == 'udp': + send_packets, exp_client_packets, exp_server_packets = \ + self.create_vxlan_udp_session_packets(client, server, + fake_mac=fake_mac) + + elif conn_type == 'icmp': + send_packets, exp_client_packets, exp_server_packets = \ + self.create_vxlan_icmp_session_packets(client, server, + fake_mac=fake_mac) + + else: + types = ['tcp', 'udp', 'icmp'] + raise AttributeError(f"Wrong connection type: {connection}.\n" + f"Supported connection types: {types}") + + # packets sending + for name, pkt in send_packets.items(): + src_port = client.port if "client" in name else server.port + direction = "-->" if "client" in name else "<--" + + print(f"\nSending {name},", client.port, direction, server.port) + send_packet(self, src_port, pkt) + + # packets verification + if tx_equal_to_rx: + exp_packets = {**exp_client_packets, **exp_server_packets} + + print(f"\nVerify that all packets are received on {server.port}:\n") + for name, pkt in exp_packets.items(): + print(f"Verifying {name}") + verify_packet(self, pkt, server.port) + print(f"{name} - OK") + else: + print(f"\nVerify 'clients' packets are received on {server.port}:\n") + for name, pkt in exp_client_packets.items(): + print(f"Verifying {name}") + verify_packet(self, pkt, server.port) + print(f"{name} - OK") + + print(f"\nVerify 'server' packets are received on {client.port}:\n") + for name, pkt in exp_server_packets.items(): + print(f"Verifying {name}") + verify_packet(self, pkt, client.port) + print(f"{name} - OK") + + def verify_oneway_connection(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + connection: str, + fake_mac=False, + route_direct=False, + pkt_drop=False): + """ + Sends and verifies VxLAN encapsulated TCP, UDP or ICMP packet + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + connection (str): connection type str (e.g. 'tcp', 'UDP', 'icmp') + fake_mac (bool): If True requests for Inner client packets Ether Dst MAC (CA MAC) set to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + route_direct (bool): For scenarios when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT + and decapsulated packets expected on the server side + """ + + send_pkt, exp_pkt = self.create_vxlan_oneway_pkts(client=client, + server=server, + connection=connection, + fake_mac=fake_mac, + route_direct=route_direct) + + print(f"\nSending VxLAN {connection.lower()} packet:", client.port, "-->", server.port) + send_packet(self, client.port, send_pkt) + + if pkt_drop: + verify_no_other_packets(self, timeout=1) + + else: + print(f"Verifying VxLAN {connection.lower()} packet on {server.port}") + verify_packet(self, exp_pkt, server.port) + print(f"VxLAN {connection.lower()} packet - OK") + + def verify_negative_traffic_scenario(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + fake_mac=True, + udp: bool = False, + invalid_vni=None, + invalid_vip=None, + invalid_inner_src_mac=None, + invalid_inner_dst_mac=None, + invalid_inner_dst_ip=None, + invalid_outer_src_ip=None, + valid_pkt_drop=False): + """ + Verifies packets drop + By default uses TCP packets. If udp True uses UDP packets. + """ + + if udp: + send_packets, exp_client_packets, _ = \ + self.create_vxlan_udp_session_packets(client=client, + server=server, + fake_mac=fake_mac) + vxlan_pkt = send_packets["client_udp_vxlan_pkt"] + else: + send_packets, exp_client_packets, _ = \ + self.create_vxlan_tcp_session_packets(client=client, + server=server, + fake_mac=fake_mac) + vxlan_pkt = send_packets["client_syn_pkt"] + + def send_verify(pkt): + send_packet(self, client.port, pkt) + verify_no_other_packets(self, timeout=1) + + if invalid_vni is not None: + # Verify drop with invalid VNI + vxlan_pkt_invalid_vni = deepcopy(vxlan_pkt) + vxlan_pkt_invalid_vni.getlayer('VXLAN').vni = invalid_vni + + print("Sending VxLAN IPv4 packet with invalid VNI, expect drop") + send_verify(vxlan_pkt_invalid_vni) + print("\nInvalid VNI OK\n") + + if invalid_vip is not None: + # Verify drop with invalid VIP + vxlan_pkt_invalid_vip = deepcopy(vxlan_pkt) + vxlan_pkt_invalid_vip.getlayer('IP').dst = invalid_vip + + print("Sending VxLAN IPv4 packet with invalid VIP, expect drop") + send_verify(vxlan_pkt_invalid_vip) + print("\nInvalid VIP OK\n") + + if invalid_inner_src_mac is not None: + # Verify drop with invalid inner Src MAC + vxlan_pkt_invalid_src_mac = deepcopy(vxlan_pkt) + vxlan_pkt_invalid_src_mac.getlayer('VXLAN').getlayer('Ether').src = invalid_inner_src_mac + + print("Sending VxLAN IPv4 packet with invalid Inner Src MAC, expect drop") + send_verify(vxlan_pkt_invalid_src_mac) + print("\nInvalid Inner Src MAC OK\n") + + if invalid_inner_dst_mac is not None: + # Verify drop with invalid inner Dst MAC + vxlan_pkt_invalid_dst_mac = deepcopy(vxlan_pkt) + vxlan_pkt_invalid_dst_mac.getlayer('VXLAN').getlayer('Ether').dst = invalid_inner_dst_mac + + print("Sending VxLAN IPv4 packet with invalid Inner Dst MAC, expect drop") + send_verify(vxlan_pkt_invalid_dst_mac) + print("\nInvalid Inner Dst MAC OK\n") + + if invalid_inner_dst_ip is not None: + # Verify drop with invalid inner Dst IP + vxlan_pkt_invalid_inner_dst_ip = deepcopy(vxlan_pkt) + vxlan_pkt_invalid_inner_dst_ip.getlayer('VXLAN').getlayer('IP').dst = invalid_inner_dst_ip + + print("Sending VxLAN IPv4 packet with invalid Inner Dst MAC, expect drop") + send_verify(vxlan_pkt_invalid_inner_dst_ip) + print("\nInvalid Inner Dst IP OK\n") + + if invalid_outer_src_ip is not None: + # Verify drop with invalid outer Src IP + vxlan_pkt_invalid_outer_src_ip = deepcopy(vxlan_pkt) + vxlan_pkt_invalid_outer_src_ip.getlayer('IP').src = invalid_outer_src_ip + + print("Sending VxLAN IPv4 packet with invalid Outer Src IP, expect drop") + send_verify(vxlan_pkt_invalid_outer_src_ip) + print("\nInvalid Outer Src IP OK\n") + + if valid_pkt_drop: + print("Sending valid VxLAN IPv4 packet, expect drop") + send_verify(vxlan_pkt) + print("\nValid packet drop OK\n") + + def create_vxlan_tcp_session_packets(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + fake_mac: bool, terminate_tcp_session=True): + """ + Creates TCP VxLAN encapsulated packets needed for TCP session establishment + Parameters: + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + fake_mac (bool): If True sets in client Inner packets Ether Dst MAC (CA MAC) to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + terminate_tcp_session (bool): If True return packets for tcp session termination else + return only packets for session start + """ - if neighbor2 is not None: - rif1 = self.router_interface_create(neighbor2.peer.port, - src_mac=neighbor2.peer.mac) - nhop2 = self.nexthop_create(rif1, neighbor2.ip) - self.neighbor_create(rif1, neighbor2.ip, neighbor2.mac) + client_tcp_port = randint(1024, 49151) + http_port = 80 + + fake_ca_dst_mac = "AA:12:44:69:05:AA" + + create_inner_pkt, create_outer_pkt = self.define_pkts_creation_func('tcp') + + # Client (host1) packets + # create tcp SYN pkt encapsulated in VxLAN packet + client_inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + tcp_sport=client_tcp_port, + tcp_dport=http_port, + tcp_flags=self.SYN) + self.update_tcp_pkt(client_inner_pkt, seq=1, ack=0) + + exp_client_inner_pkt = create_inner_pkt(eth_dst=server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + tcp_sport=client_tcp_port, + tcp_dport=http_port, + tcp_flags=self.SYN) + self.update_tcp_pkt(exp_client_inner_pkt, seq=1, ack=0) + + client_tcp_syn_vxlan_pkt = create_outer_pkt(eth_dst=client.peer.mac, + eth_src=client.mac, + **{self.ip_dst_outer_pkt: client.peer.ip}, # VIP + **{self.ip_src_outer_pkt: client.ip}, + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=client_inner_pkt) + + exp_client_tcp_syn_vxlan_pkt = create_outer_pkt(eth_dst=server.mac, + eth_src=server.peer.mac, + **{self.ip_dst_outer_pkt: server.ip}, + **{self.ip_src_outer_pkt: server.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=exp_client_inner_pkt) + + # create tcp ACK pkt encapsulated in VxLAN packet + client_tcp_ack_vxlan_pkt = deepcopy(client_tcp_syn_vxlan_pkt) + self.update_tcp_pkt(client_tcp_ack_vxlan_pkt, tcp_flag=self.ACK, + seq=2, ack=11) + + exp_client_tcp_ack_vxlan_pkt = deepcopy(exp_client_tcp_syn_vxlan_pkt) + self.update_tcp_pkt(exp_client_tcp_ack_vxlan_pkt, tcp_flag=self.ACK, + seq=2, ack=11) + + # create tcp FIN ACK pkt encapsulated in VxLAN packet + client_tcp_fin_vxlan_pkt = deepcopy(client_tcp_syn_vxlan_pkt) + self.update_tcp_pkt(client_tcp_fin_vxlan_pkt, tcp_flag=self.FIN_ACK, + seq=2, ack=11) + + exp_client_tcp_fin_vxlan_pkt = deepcopy(exp_client_tcp_syn_vxlan_pkt) + self.update_tcp_pkt(exp_client_tcp_fin_vxlan_pkt, tcp_flag=self.FIN_ACK, + seq=2, ack=11) + + # create last client tcp ACK pkt encapsulated in VxLAN packet + client_tcp_ack_vxlan_pkt_close = deepcopy(client_tcp_ack_vxlan_pkt) + self.update_tcp_pkt(client_tcp_ack_vxlan_pkt_close, seq=3, ack=12) + + exp_client_tcp_ack_vxlan_pkt_close = deepcopy(exp_client_tcp_ack_vxlan_pkt) + self.update_tcp_pkt(exp_client_tcp_ack_vxlan_pkt_close, seq=3, ack=12) + + # Server (host2) packets + # create tcp SYN ACK pkt encapsulated in VxLAN packet + server_inner_pkt = create_inner_pkt(eth_dst=client.client.mac, + eth_src=server.client.mac, + **{self.ip_dst_inner_pkt: client.client.ip}, + **{self.ip_src_inner_pkt: server.client.ip}, + tcp_sport=http_port, + tcp_dport=client_tcp_port, + tcp_flags=self.SYN_ACK) + self.update_tcp_pkt(server_inner_pkt, seq=10, ack=2) + + server_tcp_synack_vxlan_pkt = create_outer_pkt(eth_dst=server.peer.mac, + eth_src=server.mac, + **{self.ip_dst_outer_pkt: server.peer.ip}, # VIP + **{self.ip_src_outer_pkt: server.ip}, + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=server_inner_pkt) + + exp_server_tcp_synack_vxlan_pkt = create_outer_pkt(eth_dst=client.mac, + eth_src=client.peer.mac, + **{self.ip_dst_outer_pkt: client.ip}, + **{self.ip_src_outer_pkt: client.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=server_inner_pkt) + + # create tcp ACK pkt encapsulated in VxLAN packet + server_tcp_ack_vxlan_pkt = deepcopy(server_tcp_synack_vxlan_pkt) + self.update_tcp_pkt(server_tcp_ack_vxlan_pkt, tcp_flag=self.ACK, + seq=11, ack=3) + + exp_server_tcp_ack_vxlan_pkt = deepcopy(exp_server_tcp_synack_vxlan_pkt) + self.update_tcp_pkt(exp_server_tcp_ack_vxlan_pkt, tcp_flag=self.ACK, + seq=11, ack=3) + + # create tcp FIN ACK pkt encapsulated in VxLAN packet + server_tcp_finack_vxlan_pkt = deepcopy(server_tcp_synack_vxlan_pkt) + self.update_tcp_pkt(server_tcp_finack_vxlan_pkt, tcp_flag=self.FIN_ACK, + seq=11, ack=3) + + exp_server_tcp_finack_vxlan_pkt = deepcopy(exp_server_tcp_synack_vxlan_pkt) + self.update_tcp_pkt(exp_server_tcp_finack_vxlan_pkt, tcp_flag=self.FIN_ACK, + seq=11, ack=3) + + send_packets = OrderedDict() + + # packets for starting tcp session + send_packets["client_syn_pkt"] = client_tcp_syn_vxlan_pkt + send_packets["server_syn_ack_pkt"] = server_tcp_synack_vxlan_pkt + send_packets["client_ack_pkt"] = client_tcp_ack_vxlan_pkt + + exp_client_packets = {"exp_client_syn_pkt": exp_client_tcp_syn_vxlan_pkt, + "exp_client_ack_pkt": exp_client_tcp_ack_vxlan_pkt} + + exp_server_packets = {"exp_server_syn_ack_pkt": exp_server_tcp_synack_vxlan_pkt} + + if terminate_tcp_session: + # packets for termination tcp session + send_packets["client_fin_ack_pkt"] = client_tcp_fin_vxlan_pkt + send_packets["server_ack_pkt"] = server_tcp_ack_vxlan_pkt + send_packets["server_fin_ack_pkt"] = server_tcp_finack_vxlan_pkt + send_packets["client_ack_pkt_close"] = client_tcp_ack_vxlan_pkt_close + + exp_client_packets["exp_client_fin_ack_pkt"] = exp_client_tcp_fin_vxlan_pkt + exp_client_packets["exp_client_ack_pkt_close"] = exp_client_tcp_ack_vxlan_pkt_close + + exp_server_packets["exp_server_ack_pkt"] = exp_server_tcp_ack_vxlan_pkt + exp_server_packets["exp_server_fin_ack_pkt"] = exp_server_tcp_finack_vxlan_pkt + + return send_packets, exp_client_packets, exp_server_packets + + def create_vxlan_tcp_session_route_direct_packets(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + fake_mac: bool, terminate_tcp_session=True): + """ + Creates TCP VxLAN encapsulated packets needed for TCP session establishment + when action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT + Parameters: + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + fake_mac (bool): If True sets in client Inner packets Ether Dst MAC (CA MAC) to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + terminate_tcp_session (bool): If True return packets for tcp session termination else + return only packets for session start + """ + + client_tcp_port = randint(1024, 49151) + http_port = 80 + + fake_ca_dst_mac = "AA:12:44:69:05:AA" + + create_inner_pkt, create_outer_pkt = self.define_pkts_creation_func('tcp') + + # Client (host1) packets + # create tcp SYN pkt encapsulated in VxLAN packet + client_inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + tcp_sport=client_tcp_port, + tcp_dport=http_port, + tcp_flags=self.SYN) + self.update_tcp_pkt(client_inner_pkt, seq=1, ack=0) + + client_tcp_syn_vxlan_pkt = create_outer_pkt(eth_dst=client.peer.mac, + eth_src=client.mac, + **{self.ip_dst_outer_pkt: client.peer.ip}, # VIP + **{self.ip_src_outer_pkt: client.ip}, + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=client_inner_pkt) + + exp_client_tcp_syn_pkt = create_inner_pkt(eth_dst=server.mac, + eth_src=server.peer.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.peer.ip}, + tcp_sport=client_tcp_port, + tcp_dport=http_port, + tcp_flags=self.SYN) + self.update_tcp_pkt(exp_client_tcp_syn_pkt, seq=1, ack=0) + + # create tcp ACK pkt encapsulated in VxLAN packet + client_tcp_ack_vxlan_pkt = deepcopy(client_tcp_syn_vxlan_pkt) + self.update_tcp_pkt(client_tcp_ack_vxlan_pkt, tcp_flag=self.ACK, + seq=2, ack=11) + + exp_client_tcp_ack_pkt = deepcopy(exp_client_tcp_syn_pkt) + self.update_tcp_pkt(exp_client_tcp_ack_pkt, tcp_flag=self.ACK, + seq=2, ack=11) + + # create tcp FIN ACK pkt encapsulated in VxLAN packet + client_tcp_fin_vxlan_pkt = deepcopy(client_tcp_syn_vxlan_pkt) + self.update_tcp_pkt(client_tcp_fin_vxlan_pkt, tcp_flag=self.FIN_ACK, + seq=2, ack=11) + + exp_client_tcp_fin_pkt = deepcopy(exp_client_tcp_syn_pkt) + self.update_tcp_pkt(exp_client_tcp_fin_pkt, tcp_flag=self.FIN_ACK, + seq=2, ack=11) + + # create last client tcp ACK pkt encapsulated in VxLAN packet + client_tcp_ack_vxlan_pkt_close = deepcopy(client_tcp_ack_vxlan_pkt) + self.update_tcp_pkt(client_tcp_ack_vxlan_pkt_close, seq=3, ack=12) + + exp_client_tcp_ack_pkt_close = deepcopy(exp_client_tcp_syn_pkt) + self.update_tcp_pkt(exp_client_tcp_ack_pkt_close, seq=3, ack=12) + + # Server (host2) packets + # create tcp SYN ACK pkt encapsulated in VxLAN packet + server_tcp_synack_pkt = create_inner_pkt(eth_dst=client.peer.mac, + eth_src=server.client.mac, + **{self.ip_dst_inner_pkt: client.peer.ip}, # VIP + **{self.ip_src_inner_pkt: server.client.ip}, + tcp_sport=http_port, + tcp_dport=client_tcp_port, + tcp_flags=self.SYN_ACK) + self.update_tcp_pkt(server_tcp_synack_pkt, seq=10, ack=2) + + exp_server_inner_pkt = create_inner_pkt(eth_dst=client.client.mac, + eth_src=server.client.mac, + **{self.ip_dst_inner_pkt: client.client.ip}, + **{self.ip_src_inner_pkt: server.client.ip}, + tcp_sport=http_port, + tcp_dport=client_tcp_port, + tcp_flags=self.SYN_ACK) + self.update_tcp_pkt(exp_server_inner_pkt, seq=10, ack=2) + + exp_server_tcp_synack_vxlan_pkt = create_outer_pkt(eth_dst=client.mac, + eth_src=client.peer.mac, + **{self.ip_dst_inner_pkt: client.ip}, + **{self.ip_src_inner_pkt: client.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=exp_server_inner_pkt) + + # create tcp ACK pkt encapsulated in VxLAN packet + server_tcp_ack_pkt = deepcopy(server_tcp_synack_pkt) + self.update_tcp_pkt(server_tcp_ack_pkt, tcp_flag=self.ACK, + seq=11, ack=3) + + exp_server_tcp_ack_vxlan_pkt = deepcopy(exp_server_tcp_synack_vxlan_pkt) + self.update_tcp_pkt(exp_server_tcp_ack_vxlan_pkt, tcp_flag=self.ACK, + seq=11, ack=3) + + # create tcp FIN ACK pkt encapsulated in VxLAN packet + server_tcp_finack_pkt = deepcopy(server_tcp_synack_pkt) + self.update_tcp_pkt(server_tcp_finack_pkt, tcp_flag=self.FIN_ACK, + seq=11, ack=3) + + exp_server_tcp_finack_vxlan_pkt = deepcopy(exp_server_tcp_synack_vxlan_pkt) + self.update_tcp_pkt(exp_server_tcp_finack_vxlan_pkt, tcp_flag=self.FIN_ACK, + seq=11, ack=3) + + send_packets = OrderedDict() + + # packets for starting tcp session + send_packets["client_syn_pkt"] = client_tcp_syn_vxlan_pkt + send_packets["server_syn_ack_pkt"] = server_tcp_synack_pkt + send_packets["client_ack_pkt"] = client_tcp_ack_vxlan_pkt + + exp_client_packets = {"exp_client_syn_pkt": exp_client_tcp_syn_pkt, + "exp_client_ack_pkt": exp_client_tcp_ack_pkt} + + exp_server_packets = {"exp_server_syn_ack_pkt": exp_server_tcp_synack_vxlan_pkt} + + if terminate_tcp_session: + # packets for termination tcp session + send_packets["client_fin_ack_pkt"] = client_tcp_fin_vxlan_pkt + send_packets["server_ack_pkt"] = server_tcp_ack_pkt + send_packets["server_fin_ack_pkt"] = server_tcp_finack_pkt + send_packets["client_ack_pkt_close"] = client_tcp_ack_vxlan_pkt_close + + exp_client_packets["exp_client_fin_ack_pkt"] = exp_client_tcp_fin_pkt + exp_client_packets["exp_client_ack_pkt_close"] = exp_client_tcp_ack_pkt_close + + exp_server_packets["exp_server_ack_pkt"] = exp_server_tcp_ack_vxlan_pkt + exp_server_packets["exp_server_fin_ack_pkt"] = exp_server_tcp_finack_vxlan_pkt + + return send_packets, exp_client_packets, exp_server_packets + + def create_vxlan_udp_session_packets(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + fake_mac: bool): + """ + Creates UDP VxLAN encapsulated packets needed for UDP session establishment + Parameters: + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + fake_mac (bool): If True sets in client Inner packets Ether Dst MAC (CA MAC) to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + """ + + client_udp_port = randint(1024, 49151) + http_port = 80 + + fake_ca_dst_mac = "AA:12:44:69:05:AA" + + create_inner_pkt, create_outer_pkt = self.define_pkts_creation_func('udp') + + client_inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + udp_sport=client_udp_port, + udp_dport=http_port) + + exp_client_inner_pkt = create_inner_pkt(eth_dst=server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + udp_sport=client_udp_port, + udp_dport=http_port) + + server_inner_pkt = create_inner_pkt(eth_dst=client.client.mac, + eth_src=server.client.mac, + **{self.ip_dst_inner_pkt: client.client.ip}, + **{self.ip_src_inner_pkt: server.client.ip}, + udp_sport=http_port, + udp_dport=client_udp_port) + + client_vxlan_pkt = create_outer_pkt(eth_dst=client.peer.mac, + eth_src=client.mac, + **{self.ip_dst_outer_pkt: client.peer.ip}, # VIP + **{self.ip_src_outer_pkt: client.ip}, + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=client_inner_pkt) + + exp_client_vxlan_pkt = create_outer_pkt(eth_dst=server.mac, + eth_src=server.peer.mac, + **{self.ip_dst_outer_pkt: server.ip}, + **{self.ip_src_outer_pkt: server.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=exp_client_inner_pkt) + + server_vxlan_pkt = create_outer_pkt(eth_dst=server.peer.mac, + eth_src=server.mac, + **{self.ip_dst_outer_pkt: server.peer.ip}, # VIP + **{self.ip_src_outer_pkt: server.ip}, + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=server_inner_pkt) + + exp_server_vxlan_pkt = create_outer_pkt(eth_dst=client.mac, + eth_src=client.peer.mac, + **{self.ip_dst_outer_pkt: client.ip}, + **{self.ip_src_outer_pkt: client.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=server_inner_pkt) + send_packets = OrderedDict() + + # packets for starting udp session + send_packets["client_udp_vxlan_pkt"] = client_vxlan_pkt + send_packets["server_udp_vxlan_pkt"] = server_vxlan_pkt + + exp_client_packets = {"exp_client_udp_vxlan_pkt": exp_client_vxlan_pkt} + exp_server_packets = {"exp_server_udp_vxlan_pkt": exp_server_vxlan_pkt} + + return send_packets, exp_client_packets, exp_server_packets + + def create_vxlan_icmp_session_packets(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + fake_mac: bool): + """ + Creates ICMP VxLAN encapsulated packets needed for + echo request and reply + Parameters: + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + fake_mac (bool): If True sets in client Inner packets Ether Dst MAC (CA MAC) to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + """ + + fake_ca_dst_mac = "AA:12:44:69:05:AA" + + create_inner_pkt, create_outer_pkt = self.define_pkts_creation_func('icmp') + + client_inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + icmp_type=8) + + exp_client_inner_pkt = create_inner_pkt(eth_dst=server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + icmp_type=8) + + server_inner_pkt = create_inner_pkt(eth_dst=client.client.mac, + eth_src=server.client.mac, + **{self.ip_dst_inner_pkt: client.client.ip}, + **{self.ip_src_inner_pkt: server.client.ip}, + icmp_type=0) + + client_vxlan_pkt = create_outer_pkt(eth_dst=client.peer.mac, + eth_src=client.mac, + **{self.ip_dst_outer_pkt: client.peer.ip}, # VIP + **{self.ip_src_outer_pkt: client.ip}, + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=client_inner_pkt) + + exp_client_vxlan_pkt = create_outer_pkt(eth_dst=server.mac, + eth_src=server.peer.mac, + **{self.ip_dst_outer_pkt: server.ip}, + **{self.ip_src_outer_pkt: server.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=exp_client_inner_pkt) + + server_vxlan_pkt = create_outer_pkt(eth_dst=server.peer.mac, + eth_src=server.mac, + **{self.ip_dst_outer_pkt: server.peer.ip}, # VIP + **{self.ip_src_outer_pkt: server.ip}, + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=server_inner_pkt) + + exp_server_vxlan_pkt = create_outer_pkt(eth_dst=client.mac, + eth_src=client.peer.mac, + **{self.ip_dst_outer_pkt: client.ip}, + **{self.ip_src_outer_pkt: client.peer.ip}, + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=server_inner_pkt) + send_packets = OrderedDict() + + # packets for starting udp session + send_packets["client_echo_request_vxlan_pkt"] = client_vxlan_pkt + send_packets["server_echo_reply_vxlan_pkt"] = server_vxlan_pkt + + exp_client_packets = {"exp_client_echo_request_pkt": exp_client_vxlan_pkt} + exp_server_packets = {"exp_server_echo_reply_pkt": exp_server_vxlan_pkt} + + return send_packets, exp_client_packets, exp_server_packets + + def create_vxlan_oneway_pkts(self, + client: DutNeighborNetworkParameters, + server: DutNeighborNetworkParameters, + connection: str, + fake_mac=False, + route_direct=False): + """ + Creates VxLAN encapsulated TCP, UDP or ICMP packet + client: DutNeighborNetworkParameters object with src network config + server: DutNeighborNetworkParameters object with dst network config + connection (str): connection type str (e.g. 'tcp', 'UDP', 'icmp') + fake_mac (bool): If True requests for Inner client packets Ether Dst MAC (CA MAC) set to fake mac, + (default Outbound scenario) else to Dst CA MAC (Inbound scenario) + TODO: route_direct (bool): For scenarios when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT + and decapsulated packets expected on the server side + """ + client_port = randint(1024, 49151) + http_port = 80 + fake_ca_dst_mac = "AA:12:44:69:05:AA" + + conn_type = connection.lower() + + create_inner_pkt, create_outer_pkt = self.define_pkts_creation_func(conn_type) + + if conn_type == 'tcp': + inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + tcp_sport=client_port, + tcp_dport=http_port, + tcp_flags=self.SYN) + self.update_tcp_pkt(inner_pkt, seq=1, ack=0) + + exp_inner_pkt = create_inner_pkt(eth_dst=server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + tcp_sport=client_port, + tcp_dport=http_port, + tcp_flags=self.SYN) + self.update_tcp_pkt(exp_inner_pkt, seq=1, ack=0) + + elif conn_type == 'udp': + inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + udp_sport=client_port, + udp_dport=http_port) + + exp_inner_pkt = create_inner_pkt(eth_dst=server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + udp_sport=client_port, + udp_dport=http_port) + + elif conn_type == 'icmp': + inner_pkt = create_inner_pkt(eth_dst=fake_ca_dst_mac if fake_mac else server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + icmp_type=8) + + exp_inner_pkt = create_inner_pkt(eth_dst=server.client.mac, + eth_src=client.client.mac, + **{self.ip_dst_inner_pkt: server.client.ip}, + **{self.ip_src_inner_pkt: client.client.ip}, + icmp_type=8) + + vxlan_pkt = create_outer_pkt(eth_dst=client.peer.mac, + eth_src=client.mac, + **{self.ip_dst_outer_pkt: client.peer.ip}, # VIP + **{self.ip_src_outer_pkt: client.ip}, + with_udp_chksum=True, + vxlan_vni=client.client.vni, + inner_frame=inner_pkt) + + exp_vxlan_pkt = create_outer_pkt(eth_dst=server.mac, + eth_src=server.peer.mac, + **{self.ip_dst_outer_pkt: server.ip}, + **{self.ip_src_outer_pkt: server.peer.ip}, # VIP + with_udp_chksum=True, + vxlan_vni=server.client.vni, + inner_frame=exp_inner_pkt) + + return vxlan_pkt, exp_vxlan_pkt + + @staticmethod + def update_tcp_pkt(pkt, seq, ack, tcp_flag=None): + """ + Update Flag, Sequence and Acknowledgement fields in given TCP packet + """ + if tcp_flag is not None: + pkt.getlayer("TCP").flags = tcp_flag - if add_routes is True: - self.route_create(neighbor1.ip_prefix, nhop1) - if neighbor2 is not None: - self.route_create(neighbor2.ip_prefix, nhop2) + pkt.getlayer("TCP").seq = seq + pkt.getlayer("TCP").ack = ack diff --git a/test/test-cases/functional/ptf/saidashvnet.py b/test/test-cases/functional/ptf/saidashvnet.py index 8845e9afb..e137ebaa4 100644 --- a/test/test-cases/functional/ptf/saidashvnet.py +++ b/test/test-cases/functional/ptf/saidashvnet.py @@ -13,471 +13,3718 @@ # limitations under the License. """ -Thrift SAI interface VNet tests +Thrift SAI interface VNET tests """ -from copy import copy from unittest import skipIf -from sai_base_test import * from sai_thrift.sai_headers import * from sai_dash_utils import * @group("draft") -@disabled # This is a Demo test. It should not be executed on CI -class Vnet2VnetCTTest(VnetAPI): +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class UnderlayRouteTest(VnetApiEndpoints, VnetTrafficMixin): + """ + L3 Underlay bidirectional routing test case + Verifies correct L3 underlay routing when overlay configuration exist + """ + + def runTest(self): + self.configureTest() + + self.verifyOverlayOutboundConfigTest() + + self.l3UnderlayHost1toHost2RoutingTest() + self.l3UnderlayHost2toHost1RoutingTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + # configure overlay outbound + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # configure underlay + self.host_1 = self.tx_host + self.host_2 = self.rx_host + + self.configure_underlay(self.host_1, self.host_2) + + def verifyOverlayOutboundConfigTest(self): + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=False) + print("Overlay config OK\n") + + def l3UnderlayHost1toHost2RoutingTest(self): + + host_1_pkt = simple_udp_packet(eth_src=self.host_1.mac, + eth_dst=self.host_1.peer.mac, + ip_dst=self.host_2.ip, + ip_src=self.host_1.ip, + ip_ttl=64) + host_1_exp_pkt = simple_udp_packet(eth_src=self.host_2.peer.mac, + eth_dst=self.host_2.mac, + ip_dst=self.host_2.ip, + ip_src=self.host_1.ip, + ip_ttl=63) + + print("Sending simple UDP packet host_1 -> host_2, expecting routed packet") + send_packet(self, self.host_1.port, host_1_pkt) + verify_packet(self, host_1_exp_pkt, self.host_2.port) + print("Underlay Host 1 to Host 2 OK\n") + + def l3UnderlayHost2toHost1RoutingTest(self): + + host_2_pkt = simple_udp_packet(eth_src=self.host_2.mac, + eth_dst=self.host_2.peer.mac, + ip_dst=self.host_1.ip, + ip_src=self.host_2.ip, + ip_ttl=64) + host_2_exp_pkt = simple_udp_packet(eth_src=self.host_1.peer.mac, + eth_dst=self.host_1.mac, + ip_dst=self.host_1.ip, + ip_src=self.host_2.ip, + ip_ttl=63) + + print("Sending simple UDP packet host_2 -> host_1, expecting routed packet") + send_packet(self, self.host_2.port, host_2_pkt) + verify_packet(self, host_2_exp_pkt, self.host_1.port) + print("Underlay Host 2 to Host 1 OK\n") + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetInboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host.client.vni, + sip=self.tx_host.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host.ip, src_vnet) + + def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetInboundRoutingTest.__name__, ' OK') + + def vnet2VnetInboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong CA Dst MAC + - wrong PA Validation IP: pa validation missmatch + - wrong Physical SIP: routing missmatch + - wrong VIP + - wrong VNI + """ + + invalid_vni = 1000 + invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" + invalid_pa_sip = "10.10.5.1" # routing missmatch + invalid_vip = "10.10.10.10" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, + invalid_vni=invalid_vni, + invalid_outer_src_ip=invalid_pa_sip, + invalid_inner_dst_mac=invalid_ca_dst_mac, + invalid_vip=invalid_vip) + + invalid_pa_valid_ip = "10.10.1.25" # pa validation missmatch + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, + invalid_outer_src_ip=invalid_pa_valid_ip) + + print('\n', self.vnet2VnetInboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test(Vnet2VnetInboundDecapPaValidateSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def setUp(self): + super(Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateTwoPortsTest(Vnet2VnetInboundDecapPaValidateSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateTwoPortsOverlayIpv6Test(Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapSinglePortTest(Vnet2VnetInboundDecapPaValidateSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def configureTest(self): + """ + Setup DUT overlay in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_create(eni_id, vni=self.tx_host.client.vni, + sip=self.tx_host.ip, sip_mask="255.255.255.0") + + def vnet2VnetInboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong CA Dst MAC + - wrong VIP + - wrong VNI + - wrong Physical SIP: routing missmatch + """ + + invalid_vni = 1000 + invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" + invalid_vip = "10.10.10.10" + invalid_pa_sip = "10.10.3.22" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, + invalid_vni=invalid_vni, + invalid_inner_dst_mac=invalid_ca_dst_mac, + invalid_vip=invalid_vip, + invalid_outer_src_ip=invalid_pa_sip) + + print('\n', self.vnet2VnetInboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapSinglePortOverlayIpv6Test(Vnet2VnetInboundDecapSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def setUp(self): + super(Vnet2VnetInboundDecapSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapTwoPortsTest(Vnet2VnetInboundDecapSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapTwoPortsOverlayIpv6Test(Vnet2VnetInboundDecapSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + Negative scenarios: + tx_host_0 -> rx_host invalid VNI + tx_host_1 -> rx_host Invalid ENI mac + tx_host_2 -> rx_host Invalid PA IP + tx_host_3 -> rx_host invalid VIP + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + self.vnet2VnetInboundRoutingNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="8.0.0.1", + ip_prefix="8.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="192.168.3.1", + client_vni=30) + + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="11.0.0.1", + ip_prefix="11.0.0.1/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="192.168.4.1", + client_vni=40) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + # ENI configuration + eni_id = self.eni_create(vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id, vni=self.tx_host_3.client.vni, + sip=self.tx_host_3.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate tx_host_0 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action tx_host_0 + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # Inbound routing decap PA Validate tx_host_1 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action tx_host_1 + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + # Inbound routing decap PA Validate tx_host_2 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_2) + # PA validation entry with Permit action tx_host_2 + self.pa_validation_create(self.tx_host_2.ip, src_vnet_2) + + def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + print("\nVerifying Inbound pkt send tx_host_0 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_1 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_2 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_3 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_3, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') + + def vnet2VnetInboundRoutingNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + tx_host_0 -> rx_host invalid VNI + tx_host_1 -> rx_host Invalid ENI mac + tx_host_2 -> rx_host Invalid PA IP + tx_host_3 -> rx_host invalid VIP + """ + + invalid_vni = 200 + invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" + invalid_pa_sip = "10.10.5.1" # routing missmatch + invalid_vip = "10.10.10.10" + + print("\nVerifying Inbound pkt drop with invalid VNI tx_host_0 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_0, server=self.rx_host, + fake_mac=False, + invalid_vni=invalid_vni) + print("OK") + + print("\nVerifying Inbound pkt drop with invalid ENI mac tx_host_1 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_1, server=self.rx_host, + fake_mac=False, + invalid_inner_dst_mac=invalid_ca_dst_mac) + print("OK") + + print("\nVerifying Inbound pkt drop with invalid PA IP tx_host_2 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_2, server=self.rx_host, + fake_mac=False, + invalid_outer_src_ip=invalid_pa_sip) + print("OK") + + print("\nVerifying Inbound pkt drop with invalid VIP tx_host_3 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, + fake_mac=False, + invalid_vip=invalid_vip) + print("OK") + + print('\n', self.vnet2VnetInboundRoutingNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + def setUp(self): + super(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="8.0.0.1", + ip_prefix="8.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::60", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="dddd::14", + client_vni=30) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="11.0.0.1", + ip_prefix="11.0.0.1/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="eeee::80", + client_vni=40) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + # ENI configuration + eni_id = self.eni_create(vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id, vni=self.tx_host_3.client.vni, + sip=self.tx_host_3.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate tx_host_0 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action tx_host_0 + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # Inbound routing decap PA Validate tx_host_1 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action tx_host_1 + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + # Inbound routing decap PA Validate tx_host_2 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_2) + # PA validation entry with Permit action tx_host_2 + self.pa_validation_create(self.tx_host_2.ip, src_vnet_2) + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsTest(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 5 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_1.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + self.route_create(self.tx_host_3.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host.peer.port, + src_mac=self.rx_host.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host.ip) + self.neighbor_create(rif_1, self.rx_host.ip, self.rx_host.mac) + self.route_create(self.rx_host.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 5 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_1.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + self.route_create(self.tx_host_3.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host_0.peer.port, + src_mac=self.rx_host_0.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) + self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) + self.route_create(self.rx_host_1.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + Negative scenarios: + tx_host_0 -> rx_host_1 + tx_host_1 -> rx_host_0 + tx_host_2 -> rx_host_1 + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + self.vnet2VnetInboundRoutingNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="192.168.3.1", + client_vni=30) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="192.168.4.1", + client_vni=20) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host_0.client.vni) + self.direction_lookup_create(self.rx_host_1.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + # ENI 0 configuration + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_0.ip), + vm_vni=self.rx_host_0.client.vni, + vnet_id=dst_vnet_0) + self.eni_mac_map_create(eni_id_0, self.rx_host_0.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id_0, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate + self.inbound_routing_decap_validate_create(eni_id_0, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # ENI 1 configuration + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_1.ip), + vm_vni=self.rx_host_1.client.vni, + vnet_id=dst_vnet_1) + self.eni_mac_map_create(eni_id_1, self.rx_host_1.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id_1, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + """ + + print("\nVerifying Inbound pkt send tx_host_0 -> rx_host_0 ...") + self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host_0, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_1 -> rx_host_1 ...") + self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host_1, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_2 -> rx_host_0 ...") + self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host_0, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + + print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') + + def vnet2VnetInboundRoutingNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + tx_host_0 -> rx_host_1 + tx_host_1 -> rx_host_0 + tx_host_2 -> rx_host_1 + """ + + print("\nVerifying Inbound pkt drop tx_host_0 -> rx_host_1 ...") + self.verify_negative_traffic_scenario(client=self.tx_host_0, server=self.rx_host_1, + fake_mac=False, valid_pkt_drop=True) + print("OK") + + print("\nVerifying Inbound pkt drop tx_host_1 -> rx_host_0 ...") + self.verify_negative_traffic_scenario(client=self.tx_host_1, server=self.rx_host_0, + fake_mac=False, valid_pkt_drop=True) + print("OK") + + print("\nVerifying Inbound pkt drop tx_host_2 -> rx_host_1 ...") + self.verify_negative_traffic_scenario(client=self.tx_host_2, server=self.rx_host_1, + fake_mac=False, valid_pkt_drop=True) + print("OK") + + print('\n', self.vnet2VnetInboundRoutingNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + Negative scenarios: + tx_host_0 -> rx_host_1 + tx_host_1 -> rx_host_0 + tx_host_2 -> rx_host_1 + """ + + def setUp(self): + super(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="dddd::40", + client_vni=30) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="eeee::50", + client_vni=20) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host_0.client.vni) + self.direction_lookup_create(self.rx_host_1.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + # ENI 0 configuration + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_0.ip), + vm_vni=self.rx_host_0.client.vni, + vnet_id=dst_vnet_0) + self.eni_mac_map_create(eni_id_0, self.rx_host_0.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id_0, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate + self.inbound_routing_decap_validate_create(eni_id_0, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # ENI 1 configuration + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_1.ip), + vm_vni=self.rx_host_1.client.vni, + vnet_id=dst_vnet_1) + self.eni_mac_map_create(eni_id_1, self.rx_host_1.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id_1, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsTest(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 3 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host_0.peer.port, + src_mac=self.rx_host_0.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) + self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) + self.route_create(self.rx_host_1.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 3 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host_0.peer.port, + src_mac=self.rx_host_0.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) + self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) + self.route_create(self.rx_host_1.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host_0, add_routes=False) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.20", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.189", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="192.168.3.1", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.200", # for PA validate missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="192.168.4.1", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_4 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.2.20", # for Inbound route missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:BB:00:00:AC:A0", + client_ip="192.168.4.1", + client_vni=self.tx_host_0.client.vni) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host_0.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet) + # PA validation entries with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet) + self.pa_validation_create(self.tx_host_1.ip, src_vnet) + self.pa_validation_create(self.tx_host_2.ip, src_vnet) + + def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing + """ + + print(f"\nPA validate {self.tx_host_0.ip} verification, expect pass") + self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nPA validate {self.tx_host_1.ip} verification, expect pass") + self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nPA validate {self.tx_host_2.ip} verification, expect pass") + self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nPA validate {self.tx_host_3.ip} verification, expect drop - PA validation missmatch") + self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, + fake_mac=False, valid_pkt_drop=True) + + print(f"\nPA validate {self.tx_host_4.ip} verification, expect drop - Inbound route missmatch") + self.verify_negative_traffic_scenario(client=self.tx_host_4, server=self.rx_host, + fake_mac=False, valid_pkt_drop=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def setUp(self): + super(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test, self).setUp(overlay_ipv6=True) + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host_0, add_routes=False) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.15", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::40", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.100", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="dddd::50", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.3", # for PA validate missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="eeee::60", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_4 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.12.20", # for Inbound route missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:BB:00:00:AC:A0", + client_ip="2603::10", + client_vni=self.tx_host_0.client.vni) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host_0.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet) + # PA validation entries with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet) + self.pa_validation_create(self.tx_host_1.ip, src_vnet) + self.pa_validation_create(self.tx_host_2.ip, src_vnet) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsTest(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with full underlay config (2 neighbours + 2 next hops + 2 routes) + + Verifies positive and negative scenarios + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsIpv6Test(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with underlay config (2 neighbours + 2 next hops + 2 routes) + + Verifies positive and negative scenarios + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundEniSetUpDownSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.setEniStateTest(state="down") + self.vnet2VnetEniDownTrafficTest() + self.setEniStateTest(state="up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT overlay in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_create(eni_id, vni=self.tx_host.client.vni, + sip=self.tx_host.ip, sip_mask="255.255.255.0") + + def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): + """ + Verifies inbound packet routing when ENI admin state is UP + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') + + def setEniStateTest(self, state): + """ + Verifies ENI admin state setting + """ + if state == "up": + sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=True) + else: # down + sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=False) + + self.assertEqual(self.status(), SAI_STATUS_SUCCESS) + + print('\n', self.setEniStateTest.__name__, state, ' OK') + + def vnet2VnetEniDownTrafficTest(self): + """ + Verifies inbound packet drop when ENI admin state is DOWN + """ + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, valid_pkt_drop=True) + + print('\n', self.vnet2VnetEniDownTrafficTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundEniSetUpDownTwoPortsTest(Vnet2VnetInboundEniSetUpDownSinglePortTest): + """ + Inbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.setEniStateTest(state="down") + self.vnet2VnetEniDownTrafficTest() + self.setEniStateTest(state="up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + # outbound routing + self.outbound_routing_vnet_direct_create(eni_id, "192.168.1.0/24", dst_vnet, + overlay_ip="192.168.1.10") + self.outbound_ca_to_pa_create(dst_vnet, # DST vnet id + "192.168.1.10", # DST IP addr + self.rx_host.ip, # Underlay DIP + overlay_dmac=self.rx_host.client.mac) + + def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): + """ + Outbound VNET to VNET test + Verifies correct packet routing + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + # outbound routing + self.outbound_routing_vnet_direct_create(eni_id, "bbbb::0/64", dst_vnet, + overlay_ip="bbbb::bc") + self.outbound_ca_to_pa_create(dst_vnet, # DST vnet id + "bbbb::bc", # DST IP addr + self.rx_host.ip, # Underlay DIP + overlay_dmac=self.rx_host.client.mac) + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "dddd::dc" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectWithTwoPortsTest(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectWithTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): + """ + Outbound VNET to VNET test + Verifies correct packet routing + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') + + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "192.168.1.200" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteVnetSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with underlay config (neighbour + next hop) but without underlay routes + """ + def setUp(self): + super(Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "dddd::dc" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "bbbb::dc" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, + invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetTwoPortsTest(Vnet2VnetOutboundRouteVnetSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundEniSetUpDownSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.setEniStateTest(state="down") + self.vnet2VnetEniDownTrafficTest() + self.setEniStateTest(state="up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + self.eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(self.eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=self.eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): + """ + Verifies correct outbound packet routing when ENI admin state is UP + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') + + def setEniStateTest(self, state): + """ + Verifies ENI admin state setting + """ + if state == "up": + sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=True) + else: # down + sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=False) + + self.assertEqual(self.status(), SAI_STATUS_SUCCESS) + + print('\n', self.setEniStateTest.__name__, state, ' OK') + + def vnet2VnetEniDownTrafficTest(self): + """ + Verifies outbound packet drop when ENI admin state is DOWN + """ + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, valid_pkt_drop=True) + + print('\n', self.vnet2VnetEniDownTrafficTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundEniSetUpDownTwoPortsTest(Vnet2VnetOutboundEniSetUpDownSinglePortTest): + """ + Outbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.setEniStateTest(state="down") + self.vnet2VnetEniDownTrafficTest() + self.setEniStateTest(state="up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.outboundRouteDirectTest(tx_equal_to_rx=True) + self.outboundRouteDirectNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.client.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) + + # outbound routing + self.outbound_routing_direct_create(eni_id, "192.168.1.0/24") + + def outboundRouteDirectTest(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection='tcp', fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx, + route_direct=True) + + def outboundRouteDirectNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "192.168.1.200" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, + invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.outboundRouteDirectNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteDirectSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.client.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) + + # outbound routing + self.outbound_routing_direct_create(eni_id, "bbbb::0/64") + + def outboundRouteDirectNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "dddd::dc" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "bbbb::dc" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, + invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.outboundRouteDirectNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectTwoPortsTest(Vnet2VnetOutboundRouteDirectSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.outboundRouteDirectTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.outboundRouteDirectTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.1.17", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:08:18", + client_ip="192.168.1.199", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_3 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:10:00:00:AA:E1", + client_ip="192.168.1.77", + client_vni=self.rx_host_0.client.vni) + + self.vip_create(self.tx_host.peer.ip) + + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host_0.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_3.client.ip, + underlay_dip=self.rx_host_3.ip, + overlay_dmac=self.rx_host_3.client.mac, + use_dst_vnet_vni=False) + + def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): + """ + Outbound VNET to VNET test + Verifies correct packet routing + """ + + print(f"\nVerify outbound route to CA {self.rx_host_0.client.ip}, expect pass") + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nVerify outbound route to CA {self.rx_host_1.client.ip}, expect pass") + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nVerify outbound route to CA {self.rx_host_2.client.ip}, expect pass") + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_2, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nVerify outbound route to CA {self.rx_host_3.client.ip} and use_dst_vnet=False, expect pass") + self.rx_host_3.client.vni = self.tx_host.client.vni + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_3, + connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "192.168.1.200" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="bbbb:0000:0000:0000:1234::00", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:08:18", + client_ip="bbbb:0000:0000:0000:0000:ab12::00", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_3 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:10:00:00:AA:E1", + client_ip="bbbb::40", + client_vni=self.rx_host_0.client.vni) + + self.vip_create(self.tx_host.peer.ip) + + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host_0.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_3.client.ip, + underlay_dip=self.rx_host_3.ip, + overlay_dmac=self.rx_host_3.client.mac, + use_dst_vnet_vni=False) + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "bbbb:0000:0000:1111::00" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "bbbb::33" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsTest(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with full underlay config (2 neighbours + 2 next hops + 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsIpv6Test(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.2.0/24", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + def vnet2VnetOutboundDstVnetIdTrueTest(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, + connection="tcp", fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundDstVnetIdTrueTest.__name__, ' OK') + + def vnet2VnetOutboundDstVnetIdFalseTest(self, tx_equal_to_rx): + + # For use_dst_vnet_vni=False verification change rx client vni to tx client vni + self.rx_host_1.client.vni = self.tx_host.client.vni + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, + connection="tcp", fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundDstVnetIdFalseTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="cccc::0/64", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsTest(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): """ - Vnet to Vnet scenario test case Inbound + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with underlay config (neighbour + next hop) but without underlay routes """ def runTest(self): + self.update_configuration_for_tx_equal_to_rx() self.configureTest() - import pdb - pdb.set_trace() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=True) def configureTest(self): """ Setup DUT in accordance with test purpose """ - self.vip_create("10.10.1.1") # Appliance VIP - self.direction_lookup_create(1) # direction lookup VNI, reserved VNI assigned to the VM->Appliance - eni_id = self.eni_create(vm_vni=1) # VM VNI = 1 - self.eni_mac_map_create(eni_id, "00:01:00:00:03:14") # ENI MAC address - vnet_id_2 = self.vnet_create(2) # VNET VNI = 2 - # inbound routing - self.inbound_routing_decap_validate_create(eni_id, 2, # routing VNI lookup = 2 - "10.10.2.0", "255.255.255.0", vnet_id_2) - self.pa_validation_create("10.10.2.10", vnet_id_2) - # outbound routing - self.outbound_routing_vnet_direct_create(eni_id, "192.168.1.0/24", vnet_id_2, "192.168.1.1") - self.outbound_ca_to_pa_create(vnet_id_2, # DST vnet id - "192.168.1.1", # DST IP addr - "10.10.2.10") # Underlay DIP - # underlay routing - self.router_interface_create(self.port0) - rif1 = self.router_interface_create(self.port1, src_mac="00:77:66:55:44:00") - nhop = self.nexthop_create(rif1, "10.10.2.10") - self.neighbor_create(rif1, "10.10.2.10", "aa:bb:cc:11:22:33") - self.route_create("10.10.2.0/24", nhop) + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_0, + overlay_ip="192.168.1.111") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip="192.168.1.111", + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="192.168.2.0/24", + dst_vnet_id=dst_vnet_1, + overlay_ip="192.168.2.222") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip="192.168.2.222", + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) @group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked by Issue #233. Inbound Routing is not supported in BMv2.") -class Vnet2VnetInboundTest(VnetAPI): +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest): """ - Inbound Vnet to Vnet scenario test case + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with underlay config (neighbour + next hop) but without underlay routes """ def setUp(self): - super(Vnet2VnetInboundTest, self).setUp() + super(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): """ - Configuration - +----------+-----------+ - | port0 | port0_rif | - +----------+-----------+ - | port1 | port1_rif | - +----------+-----------+ + Setup DUT in accordance with test purpose """ - self.PA_VALIDATION_SIP = "10.10.2.10" # PA validation PERMIT - self.ENI_MAC = "00:01:00:00:03:14" # ENI MAC address - self.VM_VNI = 1 # DST VM VNI (Inbound VNI) - self.ROUTE_VNI = 2 # Inbound route VNI - self.VIP_ADDRESS = "10.1.1.1" # Appliance IP address + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_0, + overlay_ip="bbbb::bc") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip="bbbb::bc", + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="cccc::0/64", + dst_vnet_id=dst_vnet_1, + overlay_ip="cccc::bc") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip="cccc::bc", + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortsTest(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + - self.OUTER_DMAC = "aa:bb:cc:dd:ee:11" # DST MAC for outer VxLAN pkt and Neighbor MAC - self.OUTER_DIP = "10.10.1.10" # DST IP for outer IP pkt and Next-hop/Neighbor IP +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortstOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) - # SDN Appliance rif`s MAC addresses - self.RIF0_RIF_MAC = "00:77:66:55:44:00" - self.RIF1_RIF_MAC = "00:88:77:66:55:00" + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with underlay config (neighbour + next hop) but without underlay routes + """ def runTest(self): + self.update_configuration_for_tx_equal_to_rx() self.configureTest() - self.vnet2VnetInboundPaValidatePermitTest() - self.vnet2VnetInboundRouteInvalidVniTest() - self.vnet2VnetInboundInvalidEniMacTest() - self.vnet2VnetInboundInvalidPaSrcIpTest() + self.configure_underlay(self.host_0, self.host_2, add_routes=False) + + self.outboundHost0toHost2Test(tx_equal_to_rx=True) + self.inboundHost2toHost0Test(tx_equal_to_rx=True) + + self.outboundHost3toHost1Test(tx_equal_to_rx=True) + self.inboundHost1toHost3Test(tx_equal_to_rx=True) def configureTest(self): """ Setup DUT in accordance with test purpose - """ - # Underlay routing - self.router_interface_create(self.port0, src_mac=self.RIF0_RIF_MAC) - rif1 = self.router_interface_create(self.port1, src_mac=self.RIF1_RIF_MAC) - nhop = self.nexthop_create(rif1, self.OUTER_DIP) - self.neighbor_create(rif1, self.OUTER_DIP, self.OUTER_DMAC) - self.route_create("10.10.1.0/24", nhop) + host_0.client (vni 1) ca ip: 192.168.0.1 (eni_0) <---> host_2.client (vni 2) ca ip: 192.168.1.1 + host_1.client (vni 10) ca ip: 192.168.2.1 <---> (eni_3) host_3.client (vni 20) ca ip: 192.168.3.1 + """ + self.host_0 = self.tx_host + + self.host_1 = self.define_neighbor_network(port=self.host_0.port, + mac=self.host_0.mac, + ip=self.host_0.ip, + ip_prefix=self.host_0.ip_prefix, + peer_port=self.host_0.peer.port, + peer_mac=self.host_0.peer.mac, + peer_ip=self.host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=10) + self.host_2 = self.rx_host + + self.host_3 = self.define_neighbor_network(port=self.host_2.port, + mac=self.host_2.mac, + ip=self.host_2.ip, + ip_prefix=self.host_2.ip_prefix, + peer_port=self.host_2.peer.port, + peer_mac=self.host_2.peer.mac, + peer_ip=self.host_2.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip="192.168.3.1", + client_vni=20) # Overlay routing - self.vip_create(self.VIP_ADDRESS) # Appliance VIP + self.vip_create(self.host_0.peer.ip) # Appliance VIP # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.VM_VNI) + self.direction_lookup_create(self.host_0.client.vni) + self.direction_lookup_create(self.host_3.client.vni) - vnet1 = self.vnet_create(self.VM_VNI) - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.OUTER_DIP), - vm_vni=self.VM_VNI, - vnet_id=vnet1) - self.eni_mac_map_create(eni_id, self.ENI_MAC) + host_0_vnet = self.vnet_create(vni=self.host_0.client.vni) + host_1_vnet = self.vnet_create(vni=self.host_1.client.vni) - vnet2 = self.vnet_create(self.ROUTE_VNI) + host_2_vnet = self.vnet_create(vni=self.host_2.client.vni) + host_3_vnet = self.vnet_create(vni=self.host_3.client.vni) - # Inbound routing PA Validate - self.inbound_routing_decap_validate_create(eni_id, vni=self.ROUTE_VNI, # routing VNI lookup = 2 - sip="10.10.2.0", sip_mask="255.255.255.0", src_vnet_id=vnet2) - # PA validation entry with Permit action - self.pa_validation_create(self.PA_VALIDATION_SIP, vnet2) - - # Create VxLAN packets - self.inner_pkt = simple_tcp_packet(eth_dst=self.ENI_MAC, - eth_src="20:30:40:50:60:70", - ip_dst="192.168.0.1", - ip_src="192.168.1.1", - ip_id=108, - ip_ttl=64) - - self.vxlan_pkt = simple_vxlan_packet(eth_dst=self.RIF0_RIF_MAC, - eth_src="aa:bb:cc:11:22:33", - ip_dst=self.VIP_ADDRESS, - ip_src=self.PA_VALIDATION_SIP, - ip_id=0, - ip_ttl=64, - ip_flags=0x2, - with_udp_chksum=False, - vxlan_vni=self.ROUTE_VNI, - inner_frame=self.inner_pkt) - - self.exp_vxlan_pkt = simple_vxlan_packet(eth_dst=self.OUTER_DMAC, - eth_src=self.RIF1_RIF_MAC, - ip_dst=self.OUTER_DIP, - ip_src=self.VIP_ADDRESS, - ip_id=0, - ip_ttl=64, - ip_flags=0x2, - with_udp_chksum=False, - vxlan_vni=self.VM_VNI, - inner_frame=self.inner_pkt) - - # Create Eth packets for verify_no_packet method - self.inner_eth_packet = simple_eth_packet(eth_dst=self.inner_pkt.getlayer('Ether').dst, - eth_src=self.inner_pkt.getlayer('Ether').src, eth_type=0x800) - self.outer_eth_packet = simple_eth_packet(eth_dst=self.exp_vxlan_pkt.getlayer('Ether').dst, - eth_src=self.exp_vxlan_pkt.getlayer('Ether').src, eth_type=0x800) - - def vnet2VnetInboundPaValidatePermitTest(self): - """ - Inbound VNET to VNET test with PA validation entry Permit action - Verifies correct packet routing - """ + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_0.ip), + vm_vni=self.host_0.client.vni, + vnet_id=host_0_vnet) + self.eni_mac_map_create(eni_id_0, self.host_0.client.mac) - print("Sending VxLAN IPv4 packet, expect VxLAN packet routed") + eni_id_3 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_3.ip), + vm_vni=self.host_3.client.vni, + vnet_id=host_3_vnet) + self.eni_mac_map_create(eni_id_3, self.host_3.client.mac) - send_packet(self, self.dev_port0, self.vxlan_pkt) - verify_packet(self, self.exp_vxlan_pkt, self.dev_port1, timeout=1) + # ENI 0 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_0, vni=self.host_2.client.vni, + sip=self.host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=host_2_vnet) + self.pa_validation_create(sip=self.host_2.ip, + vnet_id=host_2_vnet) - print('\n', self.vnet2VnetInboundPaValidatePermitTest.__name__, ' OK') + self.outbound_routing_vnet_create(eni_id_0, lpm="192.168.1.0/24", + dst_vnet_id=host_2_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_2_vnet, + dip=self.host_2.client.ip, + underlay_dip=self.host_2.ip, + overlay_dmac=self.host_2.client.mac) - def vnet2VnetInboundInvalidEniMacTest(self): - """ - Inbound VNET to VNET test - Verifies packet drop in case of invalid ENI MAC address - """ + # ENI 3 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_3, vni=self.host_1.client.vni, + sip=self.host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=host_1_vnet) + self.pa_validation_create(sip=self.host_1.ip, + vnet_id=host_1_vnet) + + self.outbound_routing_vnet_create(eni_id_3, lpm="192.168.2.0/24", + dst_vnet_id=host_1_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_1_vnet, + dip=self.host_1.client.ip, + underlay_dip=self.host_1.ip, + overlay_dmac=self.host_1.client.mac) + + def outboundHost0toHost2Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.host_0, + server=self.host_2, + connection='tcp', + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundHost0toHost2Test.__name__, ' OK') + + def inboundHost2toHost0Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.host_2, + server=self.host_0, + connection='tcp', + fake_mac=False, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.inboundHost2toHost0Test.__name__, ' OK') - # Invalid CA (ENI) DST MAC - vxlan_pkt_invalid_dmac = copy(self.vxlan_pkt) - vxlan_pkt_invalid_dmac.getlayer('VXLAN').getlayer('Ether').dst = "9e:ba:ce:98:d9:e2" + def outboundHost3toHost1Test(self, tx_equal_to_rx): - print("Sending VxLAN IPv4 packet with invalid destination mac, expect drop") + self.verify_traffic_scenario(client=self.host_3, + server=self.host_1, + connection='tcp', + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) - send_packet(self, self.dev_port0, vxlan_pkt_invalid_dmac) - verify_no_packet(self, self.inner_eth_packet, self.dev_port1, timeout=1) - verify_no_packet(self, self.outer_eth_packet, self.dev_port1, timeout=1) + print('\n', self.outboundHost3toHost1Test.__name__, ' OK') - print('\n', self.vnet2VnetInboundInvalidEniMacTest.__name__, ' OK') + def inboundHost1toHost3Test(self, tx_equal_to_rx): - def vnet2VnetInboundInvalidPaSrcIpTest(self): + self.verify_traffic_scenario(client=self.host_1, + server=self.host_3, + connection='tcp', + fake_mac=False, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.inboundHost1toHost3Test.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsSinglePortOverlayIpv6Test(Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with underlay config (neighbour + next hop) but without underlay routes + """ + + def configureTest(self): """ - Inbound VNET to VNET test - Verifies packet drop in case of invalid Physical source IP address + Setup DUT in accordance with test purpose + + host_0.client (vni 1) ca ipv6: aaaa::10 (eni_0) <---> host_2.client (vni 2) ca ipv6: bbbb::20 + host_1.client (vni 10) ca ipv6: cccc::30 <---> (eni_3) host_3.client (vni 20) ca ipv6: dddd::40 """ - # Invalid PA IP - vxlan_pkt_invalid_pa_ip = copy(self.vxlan_pkt) - vxlan_pkt_invalid_pa_ip.getlayer('IP').src = "192.168.56.12" + self.host_0 = self.tx_host + + self.host_1 = self.define_neighbor_network(port=self.host_0.port, + mac=self.host_0.mac, + ip=self.host_0.ip, + ip_prefix=self.host_0.ip_prefix, + peer_port=self.host_0.peer.port, + peer_mac=self.host_0.peer.mac, + peer_ip=self.host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=10) + self.host_2 = self.rx_host + + self.host_3 = self.define_neighbor_network(port=self.host_2.port, + mac=self.host_2.mac, + ip=self.host_2.ip, + ip_prefix=self.host_2.ip_prefix, + peer_port=self.host_2.peer.port, + peer_mac=self.host_2.peer.mac, + peer_ip=self.host_2.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip="dddd::40", + client_vni=20) + # Overlay routing + self.vip_create(self.host_0.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.host_0.client.vni) + self.direction_lookup_create(self.host_3.client.vni) + + host_0_vnet = self.vnet_create(vni=self.host_0.client.vni) + host_1_vnet = self.vnet_create(vni=self.host_1.client.vni) + + host_2_vnet = self.vnet_create(vni=self.host_2.client.vni) + host_3_vnet = self.vnet_create(vni=self.host_3.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_0.ip), + vm_vni=self.host_0.client.vni, + vnet_id=host_0_vnet) + self.eni_mac_map_create(eni_id_0, self.host_0.client.mac) + + eni_id_3 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_3.ip), + vm_vni=self.host_3.client.vni, + vnet_id=host_3_vnet) + self.eni_mac_map_create(eni_id_3, self.host_3.client.mac) + + # ENI 0 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_0, vni=self.host_2.client.vni, + sip=self.host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=host_2_vnet) + self.pa_validation_create(sip=self.host_2.ip, + vnet_id=host_2_vnet) + + self.outbound_routing_vnet_create(eni_id_0, lpm="bbbb::0/64", + dst_vnet_id=host_2_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_2_vnet, + dip=self.host_2.client.ip, + underlay_dip=self.host_2.ip, + overlay_dmac=self.host_2.client.mac) + + # ENI 3 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_3, vni=self.host_1.client.vni, + sip=self.host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=host_1_vnet) + self.pa_validation_create(sip=self.host_1.ip, + vnet_id=host_1_vnet) + + self.outbound_routing_vnet_create(eni_id_3, lpm="cccc::0/64", + dst_vnet_id=host_1_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_1_vnet, + dip=self.host_1.client.ip, + underlay_dip=self.host_1.ip, + overlay_dmac=self.host_1.client.mac) + - print("Sending VxLAN IPv4 packet with invalid pa validation ip, expect drop") +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsTwoPortsTest(Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest): + """ + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ - send_packet(self, self.dev_port0, vxlan_pkt_invalid_pa_ip) - verify_no_packet(self, self.inner_eth_packet, self.dev_port1, timeout=1) - verify_no_packet(self, self.outer_eth_packet, self.dev_port1, timeout=1) + def runTest(self): + self.configureTest() + self.configure_underlay(self.host_0, self.host_2, + add_routes=True) - print('\n', self.vnet2VnetInboundInvalidPaSrcIpTest.__name__, ' OK') + self.outboundHost0toHost2Test(tx_equal_to_rx=False) + self.inboundHost2toHost0Test(tx_equal_to_rx=False) - def vnet2VnetInboundRouteInvalidVniTest(self): - """ - Inbound VNET to VNET test scenario - Verifies packet drop in case of invalid routing VNI lookup + self.outboundHost3toHost1Test(tx_equal_to_rx=False) + self.inboundHost1toHost3Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsTwoPortsOverlayIpv6Test(Vnet2VnetInboundOutboundMultipleConfigsSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.host_0, self.host_2, + add_routes=True) + + self.outboundHost0toHost2Test(tx_equal_to_rx=False) + self.inboundHost2toHost0Test(tx_equal_to_rx=False) + + self.outboundHost3toHost1Test(tx_equal_to_rx=False) + self.inboundHost1toHost3Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host_0, add_routes=False) + + self.outboundEni0Test(tx_equal_to_rx=True) + self.outboundEni1Test(tx_equal_to_rx=True) + self.outboundEni2Test(tx_equal_to_rx=True) + + def configureTest(self): """ + Setup DUT in accordance with test purpose - vxlan_pkt_invalid_vni = copy(self.vxlan_pkt) - vxlan_pkt_invalid_vni.getlayer('VXLAN').vni = 1000 + 192.168.0.1 -> 192.168.1.1 + tx_host_0 (vni 1) -> rx_host_0 (vni 2) + tx_host_1 (vni 10) -> rx_host_1 (vni 20) + tx_host_2 (vni 100) -> rx_host_2 (vni 200) + """ - print("Sending VxLAN IPv4 packet with invalid routing VNI lookup, expect drop") + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip=self.tx_host_0.client.ip, + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip=self.tx_host_0.client.ip, + client_vni=100) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip=self.rx_host.client.ip, + client_vni=20) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip=self.rx_host.client.ip, + client_vni=200) - send_packet(self, self.dev_port0, vxlan_pkt_invalid_vni) - verify_no_packet(self, self.inner_eth_packet, self.dev_port1, timeout=1) - verify_no_packet(self, self.outer_eth_packet, self.dev_port1, timeout=1) + # Overlay routing + self.vip_create(self.tx_host_0.peer.ip) # Appliance VIP - print('\n', self.vnet2VnetInboundRouteInvalidVniTest.__name__, ' OK') + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host_0.client.vni) + self.direction_lookup_create(self.tx_host_1.client.vni) + self.direction_lookup_create(self.tx_host_2.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_0.ip), + vm_vni=self.tx_host_0.client.vni, + vnet_id=src_vnet_0) + self.eni_mac_map_create(eni_id=eni_id_0, mac=self.tx_host_0.client.mac) + + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_1.ip), + vm_vni=self.tx_host_1.client.vni, + vnet_id=src_vnet_1) + self.eni_mac_map_create(eni_id=eni_id_1, mac=self.tx_host_1.client.mac) + + eni_id_2 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_2.ip), + vm_vni=self.tx_host_2.client.vni, + vnet_id=src_vnet_2) + self.eni_mac_map_create(eni_id=eni_id_2, mac=self.tx_host_2.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id_0, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id_1, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + self.outbound_routing_vnet_direct_create(eni_id=eni_id_2, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_2, + overlay_ip="192.168.1.111") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip="192.168.1.111", + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + def outboundEni0Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host_0, + server=self.rx_host_0, + connection='tcp', + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundEni0Test.__name__, ' OK') + + def outboundEni1Test(self, tx_equal_to_rx): + + # For use_dst_vnet_vni=False verification change rx client vni to tx client vni + self.rx_host_1.client.vni = self.tx_host_1.client.vni + + self.verify_traffic_scenario(client=self.tx_host_1, + server=self.rx_host_1, + connection='tcp', + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundEni1Test.__name__, ' OK') + + def outboundEni2Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host_2, + server=self.rx_host_2, + connection='tcp', + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundEni2Test.__name__, ' OK') @group("draft") @skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectTest(VnetAPI): +class Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest): """ - Outbound VNet to VNet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes """ def setUp(self): - super(Vnet2VnetOutboundRouteVnetDirectTest, self).setUp() + super(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): """ - Configuration - +----------+-----------+ - | port0 | port0_rif | - +----------+-----------+ - | port1 | port1_rif | - +----------+-----------+ + Setup DUT in accordance with test purpose + + CA: aaaa::10 -> bbbb::20 + tx_host_0 (vni 1) -> rx_host_0 (vni 2) + tx_host_1 (vni 10) -> rx_host_1 (vni 20) + tx_host_2 (vni 100) -> rx_host_2 (vni 200) """ - self.VIP_ADDRESS = "10.1.1.1" # Appliance IP address - self.ENI_MAC = "00:01:00:00:03:14" - self.SRC_VM_VNI = 1 - self.DST_VM_VNI = 2 + + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip=self.tx_host_0.client.ip, + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip=self.tx_host_0.client.ip, + client_vni=100) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip=self.rx_host.client.ip, + client_vni=20) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip=self.rx_host.client.ip, + client_vni=200) + + # Overlay routing + self.vip_create(self.tx_host_0.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host_0.client.vni) + self.direction_lookup_create(self.tx_host_1.client.vni) + self.direction_lookup_create(self.tx_host_2.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_0.ip), + vm_vni=self.tx_host_0.client.vni, + vnet_id=src_vnet_0) + self.eni_mac_map_create(eni_id=eni_id_0, mac=self.tx_host_0.client.mac) + + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_1.ip), + vm_vni=self.tx_host_1.client.vni, + vnet_id=src_vnet_1) + self.eni_mac_map_create(eni_id=eni_id_1, mac=self.tx_host_1.client.mac) + + eni_id_2 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_2.ip), + vm_vni=self.tx_host_2.client.vni, + vnet_id=src_vnet_2) + self.eni_mac_map_create(eni_id=eni_id_2, mac=self.tx_host_2.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id_0, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id_1, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + self.outbound_routing_vnet_direct_create(eni_id=eni_id_2, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_2, + overlay_ip="bbbb::bc") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip="bbbb::bc", + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsTest(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest): + """ + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host_0) + + self.outboundEni0Test(tx_equal_to_rx=False) + self.outboundEni1Test(tx_equal_to_rx=False) + self.outboundEni2Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsOverlayIpv6Test(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host_0) + + self.outboundEni0Test(tx_equal_to_rx=False) + self.outboundEni1Test(tx_equal_to_rx=False) + self.outboundEni2Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.singleEniToOutboundVm1Test(tx_equal_to_rx=True) + self.singleEniToOutboundVm2Test(tx_equal_to_rx=True) + self.singleEniToOutboundVm3Test(tx_equal_to_rx=True) def configureTest(self): """ Setup DUT in accordance with test purpose + + CA: + tx_host (vni 1) 9.0.0.1 -> 10.5.4.4/8 rx_host_0 (vni 2) + tx_host (vni 1) 9.0.0.1 -> 10.0.1.2/24 rx_host_1 (vni 20) + tx_host (vni 1) 9.0.0.1 -> 10.1.1.1/32 rx_host_2 (vni 200) """ - self.vip_create(self.VIP_ADDRESS) # Appliance VIP + # Update VIP + self.tx_host.peer.ip = "12.1.1.1" + self.rx_host.peer.ip = "12.1.1.1" + + # Update some network parameters for ip prefixes overlapping + self.tx_host.ip = "192.168.0.1" + self.tx_host.ip_prefix = "192.168.0.0/24" + self.tx_host.client.ip = "9.0.0.1" + + self.rx_host_0 = self.rx_host + self.rx_host_0.ip = "192.168.1.1" + self.rx_host_0.ip_prefix = "192.168.1.0/24" + self.rx_host_0.client.ip = "10.5.4.4" + rx_host_0_client_ip_prefix = "10.0.0.0/8" + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="10.0.1.2", + client_vni=20) + rx_host_1_client_ip_prefix = "10.0.1.0/24" + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip="10.1.1.1", + client_vni=200) + rx_host_2_client_ip_prefix = "10.1.1.1/32" + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.SRC_VM_VNI) - vnet_id_1 = self.vnet_create(self.SRC_VM_VNI) + self.direction_lookup_create(self.tx_host.client.vni) - eni_id = self.eni_create(vm_vni=self.SRC_VM_VNI, - vm_underlay_dip=sai_ipaddress("10.10.1.10"), - vnet_id=vnet_id_1) - self.eni_mac_map_create(eni_id, self.ENI_MAC) # ENI MAC address + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - vnet_id_2 = self.vnet_create(self.DST_VM_VNI) # VNET VNI = 2 - # outbound routing - self.outbound_routing_vnet_direct_create(eni_id, "192.168.1.0/24", vnet_id_2, - overlay_ip="192.168.1.10") - self.outbound_ca_to_pa_create(vnet_id_2, # DST vnet id - "192.168.1.10", # DST IP addr - "10.10.2.10") # Underlay DIP - # underlay routing - self.router_interface_create(self.port1) - rif0 = self.router_interface_create(self.port0, src_mac="00:77:66:55:44:00") - nhop = self.nexthop_create(rif0, "10.10.2.10") - self.neighbor_create(rif0, "10.10.2.10", "aa:bb:cc:11:22:33") - self.route_create("10.10.2.0/24", nhop) - - def runTest(self): - self.configureTest() - - # send packet and check - inner_pkt = simple_udp_packet(eth_src=self.ENI_MAC, - eth_dst="20:30:40:50:60:70", - ip_dst="192.168.1.1", - ip_src="192.168.0.1", - ip_ttl=64, - ip_ihl=5, - with_udp_chksum=True) - - vxlan_pkt = simple_vxlan_packet(eth_dst="00:00:cc:11:22:33", - eth_src="00:00:66:00:44:00", - ip_dst=self.VIP_ADDRESS, - ip_src="10.10.1.10", - with_udp_chksum=True, - vxlan_vni=self.SRC_VM_VNI, - ip_ttl=0, - ip_ihl=5, - ip_id=0, - udp_sport=5000, - vxlan_flags=0x8, - vxlan_reserved0=None, - vxlan_reserved1=0, - vxlan_reserved2=0, - ip_flags=0x2, - inner_frame=inner_pkt) - - exp_vxlan_pkt = simple_vxlan_packet(eth_dst="aa:bb:cc:11:22:33", - eth_src="00:77:66:55:44:00", - ip_dst="10.10.2.10", - ip_src=self.VIP_ADDRESS, - with_udp_chksum=True, - vxlan_vni=self.DST_VM_VNI, - ip_ttl=0, - ip_ihl=5, - ip_id=0, - udp_sport=5000, - vxlan_flags=0x8, - vxlan_reserved0=None, - vxlan_reserved1=0, - vxlan_reserved2=0, - ip_flags=0x2, - inner_frame=inner_pkt) - - print("Sending VxLAN IPv4 packet, expect VxLAN IPv4 packet forwarded") - send_packet(self, self.dev_port1, vxlan_pkt) - verify_packet(self, exp_vxlan_pkt, self.dev_port0) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteDirectTest(VnetAPI): - """ - Outbound VNet to VNet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action - """ + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) - def setUp(self): - super(Vnet2VnetOutboundRouteDirectTest, self).setUp() + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_0_client_ip_prefix, + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_1_client_ip_prefix, + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_2_client_ip_prefix, + dst_vnet_id=dst_vnet_2) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + def singleEniToOutboundVm1Test(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 9.0.0.1 -> 10.5.4.4/8 + VNET: 1 -> 2 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host_0, + connection="tcp", + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.singleEniToOutboundVm1Test.__name__, ' OK') + + def singleEniToOutboundVm2Test(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 9.0.0.1 -> 10.0.1.2/24 + VNET: 1 -> 20 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host_1, + connection="tcp", + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.singleEniToOutboundVm2Test.__name__, ' OK') + + def singleEniToOutboundVm3Test(self, tx_equal_to_rx): """ - Configuration - +----------+-----------+ - | port0 | port0_rif | - +----------+-----------+ - | port1 | port1_rif | - +----------+-----------+ + Packet sending: + CA IP: 9.0.0.1 -> 10.1.1.1/32 + VNET: 1 -> 200 """ - self.VIP_ADDRESS = "10.1.1.1" # Appliance VIP address - self.ENI_MAC = "00:01:00:00:03:14" - self.SRC_VM_VNI = 1 + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host_2, + connection="tcp", + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.singleEniToOutboundVm3Test.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + def setUp(self): + super(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) def configureTest(self): """ Setup DUT in accordance with test purpose + + CA: + tx_host (vni 1) aaaa::10 -> 2001:db8:cad::1/48 rx_host_0 (vni 2) + tx_host (vni 1) aaaa::10 -> 2001:db8:cad:800::1/53 rx_host_1 (vni 20) + tx_host (vni 1) aaaa::10 -> 2001:db8:cad:810::1/62 rx_host_2 (vni 200) """ - self.vip_create(self.VIP_ADDRESS) # Appliance VIP + # Update some network parameters for ip prefixes overlapping + self.tx_host.ip = "192.168.0.1" + self.tx_host.ip_prefix = "192.168.0.0/24" + + self.rx_host_0 = self.rx_host + self.rx_host_0.ip = "192.168.1.1" + self.rx_host_0.ip_prefix = "192.168.1.0/24" + self.rx_host_0.client.ip = "2001:db8:cad::1" + rx_host_0_client_ip_prefix = "2001:db8:cad::0/48" + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="2001:db8:cad:800::1", + client_vni=20) + rx_host_1_client_ip_prefix = "2001:db8:cad:800::0/53" + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip="2001:db8:cad:810::1", + client_vni=200) + rx_host_2_client_ip_prefix = "2001:db8:cad:810::0/62" + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.SRC_VM_VNI) + self.direction_lookup_create(self.tx_host.client.vni) - vnet_id_1 = self.vnet_create(self.SRC_VM_VNI) + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - eni_id = self.eni_create(vm_vni=self.SRC_VM_VNI, - vm_underlay_dip=sai_ipaddress("10.10.1.10"), - vnet_id=vnet_id_1) - self.eni_mac_map_create(eni_id, self.ENI_MAC) # ENI MAC address + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) - # outbound routing - self.outbound_routing_direct_create(eni_id, "192.168.1.0/24") + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_0_client_ip_prefix, + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_1_client_ip_prefix, + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_2_client_ip_prefix, + dst_vnet_id=dst_vnet_2) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) - # underlay routing - self.router_interface_create(self.port1) - rif0 = self.router_interface_create(self.port0, src_mac="00:77:66:55:44:00") - nhop = self.nexthop_create(rif0, "10.10.2.10") - self.neighbor_create(rif0, "10.10.2.10", "aa:bb:cc:11:22:33") - self.route_create("10.10.2.0/24", nhop) + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsTest(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ def runTest(self): self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.singleEniToOutboundVm1Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm2Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm3Test(tx_equal_to_rx=False) - # send packet and check - inner_pkt = simple_udp_packet(eth_src=self.ENI_MAC, - eth_dst="20:30:40:50:60:70", - ip_dst="192.168.1.1", - ip_src="192.168.0.1", - ip_ttl=64, - ip_ihl=5, - with_udp_chksum=True) - vxlan_pkt = simple_vxlan_packet(eth_dst="00:00:cc:11:22:33", - eth_src="00:00:66:00:44:00", - ip_dst=self.VIP_ADDRESS, - ip_src="10.10.1.10", - with_udp_chksum=True, - vxlan_vni=self.SRC_VM_VNI, - ip_ttl=0, - ip_ihl=5, - ip_id=0, - udp_sport=5000, - vxlan_flags=0x8, - vxlan_reserved0=None, - vxlan_reserved1=0, - vxlan_reserved2=0, - ip_flags=0x2, - inner_frame=inner_pkt) +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsOverlayIpv6Test(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) - direct_pkt = simple_udp_packet(eth_src="00:77:66:55:44:00", - eth_dst="aa:bb:cc:11:22:33", - ip_dst="192.168.1.1", - ip_src="192.168.0.1", - ip_ttl=63, - ip_ihl=5, - with_udp_chksum=True) + self.singleEniToOutboundVm1Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm2Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm3Test(tx_equal_to_rx=False) - print("Sending VxLAN IPv4 packet, expected UDP packet forwarded") - send_packet(self, self.dev_port1, vxlan_pkt) - verify_packet(self, direct_pkt, self.dev_port0) @group("draft") @skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class VnetRouteTest(VnetAPI): +class Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): """ - Vnet to Vnet scenario test case Outbound + Outbound Vnet to Vnet test scenario with the same + CA and PA IP prefixes with underlay config (neighbour + next hop) but without underlay routes """ - def setUp(self): - super(VnetRouteTest, self).setUp() - """ - Configuration - +----------+-----------+ - | port0 | port0_rif | - +----------+-----------+ - | port1 | port1_rif | - +----------+-----------+ - """ - self.RIF_SRC_MAC = "44:33:33:22:55:66" - self.NEIGH_DMAC = "aa:bb:cc:11:22:33" + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRouteVnetTest(tx_equal_to_rx=True) def configureTest(self): """ Setup DUT in accordance with test purpose """ - # underlay routing - self.router_interface_create(self.port1) - rif0 = self.router_interface_create(self.port0, src_mac=self.RIF_SRC_MAC) - nhop = self.nexthop_create(rif0, "10.10.2.10") - self.neighbor_create(rif0, "10.10.2.10", self.NEIGH_DMAC) - self.route_create("10.10.2.2/24", nhop) + # Update network parameters with the same provider and client ip addresses + self.tx_host.ip = self.tx_host.client.ip # 192.168.0.1 + self.tx_host.ip_prefix = "192.168.0.0/24" + + self.rx_host.ip = self.rx_host.client.ip # 192.168.1.1 + self.rx_host.ip_prefix = "192.168.1.0/24" + + # Configure overlay routing + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetOutboundRouteVnetTest(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 192.168.0.1/24 -> 192.168.1.1/24 + PA IP: 192.168.0.1/24 -> VIP -> 192.168.1.1/24 + VNET: 1 -> 2 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host, + connection="tcp", + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSameCaPaIpPrefixesTwoPortsTest(Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with the same + CA and PA IP prefixes with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ def runTest(self): self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) - out_pkt = simple_udp_packet(eth_src="00:00:00:01:03:14", - eth_dst="20:30:40:50:60:70", - ip_dst="10.10.2.2", - ip_src="10.10.20.20", - ip_ttl=64) - exp_pkt = simple_udp_packet(eth_src=self.RIF_SRC_MAC, - eth_dst=self.NEIGH_DMAC, - ip_dst="10.10.2.2", - ip_src="10.10.20.20", - ip_ttl=64) - - print("Sending simple UDP packet, expecting routed packet") - send_packet(self, self.dev_port1, out_pkt) - verify_packet(self, exp_pkt, self.dev_port0) + self.vnet2VnetOutboundRouteVnetTest(tx_equal_to_rx=False) From e79d8b0bae1bd02c16fe147cbeaa1273c8668475 Mon Sep 17 00:00:00 2001 From: desaimg1 <53219646+desaimg1@users.noreply.github.com> Date: Wed, 29 Mar 2023 22:16:28 +0530 Subject: [PATCH 07/75] Inbound and Bidirectional functional cases (#339) * committing bidirictional testcase (#13) * committing bidirictional testcase * adding xfail as bidirectionalcase failing in bmv2 * Review func bidir (#15) * committing bidirictional testcase * adding xfail as bidirectionalcase failing in bmv2 * Adding inbound case and comments addressed from PR#326 * Review func bidir (#16) * committing bidirictional testcase * adding xfail as bidirectionalcase failing in bmv2 * Adding inbound case and comments addressed from PR#326 * updated latest issue id * Review func bidir (#17) * committing bidirictional testcase * adding xfail as bidirectionalcase failing in bmv2 * Adding inbound case and comments addressed from PR#326 * updated latest issue id * comments addressed * Addressing comments from Anton * comments from Anton addressed * Added comment for dpu config --- .../saic/config_bidir_setup_commands.py | 373 ++++++++++++++++++ .../saic/config_inbound_setup_commands.py | 308 +++++++++++++++ .../saic/test_vm_to_vm_commn_acl_inbound.py | 169 ++++++++ .../saic/test_vm_to_vm_commn_udp_bidir.py | 277 +++++++++++++ .../saic/test_vm_to_vm_commn_udp_inbound.py | 174 ++++++++ test/test-cases/utils/snappi_utils.py | 42 +- 6 files changed, 1339 insertions(+), 4 deletions(-) create mode 100644 test/test-cases/functional/saic/config_bidir_setup_commands.py create mode 100644 test/test-cases/functional/saic/config_inbound_setup_commands.py create mode 100644 test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py create mode 100644 test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py create mode 100644 test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py diff --git a/test/test-cases/functional/saic/config_bidir_setup_commands.py b/test/test-cases/functional/saic/config_bidir_setup_commands.py new file mode 100644 index 000000000..e61db1a01 --- /dev/null +++ b/test/test-cases/functional/saic/config_bidir_setup_commands.py @@ -0,0 +1,373 @@ +############################################################### +# Declaring Global variables +############################################################### + +TOTALPACKETS = 1000 +PPS = 100 +PACKET_LENGTH = 128 +ENI_IP = "1.1.0.1" +NETWORK_IP1 = "1.128.0.1" +NETWORK_IP2 = "1.128.0.3" + +DPU_VTEP_IP = "221.0.0.2" +ENI_VTEP_IP = "221.0.1.11" +NETWORK_VTEP_IP = "221.0.2.101" + +OUTER_SRC_MAC = "80:09:02:01:00:01" +OUTER_DST_MAC = "c8:2c:2b:00:d1:30" +INNER_SRC_MAC = "00:1A:C5:00:00:01" +INNER_DST_MAC = "00:1b:6e:00:00:01" +INNER_DST_MAC2= "00:1b:6e:00:00:03" +OUTER_SRC_MAC_F2 = "80:09:02:02:00:01" +OUTER_DST_MAC_F2 = "c8:2c:2b:00:d1:34" + +############################################################### +# DPU Config +############################################################### +dpu_config = [ + { + "name": "vpe_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": DPU_VTEP_IP + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "dle_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "11" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "dle_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "101" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + + { + "name": "in_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "out_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "vnet", + "op": "create", + "type": "SAI_OBJECT_TYPE_VNET", + "attributes": [ + "SAI_VNET_ATTR_VNI", "1000" + ] + }, + { + "name": "eni_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", "10000", + "SAI_ENI_ATTR_PPS", "100000", + "SAI_ENI_ATTR_FLOWS", "100000", + "SAI_ENI_ATTR_ADMIN_STATE", "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", ENI_VTEP_IP, + "SAI_ENI_ATTR_VM_VNI", "9", + "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + ] + }, + { + "name": "eni_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", "10000", + "SAI_ENI_ATTR_PPS", "100000", + "SAI_ENI_ATTR_FLOWS", "100000", + "SAI_ENI_ATTR_ADMIN_STATE", "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", NETWORK_VTEP_IP, + "SAI_ENI_ATTR_VM_VNI", "9", + "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + ] + }, + { + "name": "eni_#3", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", "10000", + "SAI_ENI_ATTR_PPS", "100000", + "SAI_ENI_ATTR_FLOWS", "100000", + "SAI_ENI_ATTR_ADMIN_STATE", "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", NETWORK_VTEP_IP, + "SAI_ENI_ATTR_VM_VNI", "9", + "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + ] + }, + + { + "name": "eam", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": INNER_SRC_MAC + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", "$eni_#1" + ] + }, + { + "name": "eam2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": INNER_DST_MAC + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", "$eni_#2" + ] + }, + { + "name": "eam3", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": INNER_DST_MAC2 + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", "$eni_#3" + ] + }, + { + "name": "ore", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#1", + "destination": "1.0.0.0/8" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + ] + }, + { + "name": "ore2", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#2", + "destination": "1.0.0.0/8" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + ] + }, + { + "name": "ore3", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#3", + "destination": "1.0.0.0/8" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + ] + }, + { + "name": "inbound_routing_entry", + "op": "create", + "type": "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#1", + "vni": "11", + "sip": "1.1.0.0", + "sip_mask": "255.255.255.0", + "priority": 0 + }, + "attributes": [ + "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE", + "SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID", + "$vnet" + ] + }, + { + "name": "inbound_routing_entry2", + "op": "create", + "type": "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#2", + "vni": "101", + "sip": "1.128.0.0", + "sip_mask": "255.255.255.0", + "priority": 0 + }, + "attributes": [ + "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE", + "SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID", + "$vnet" + ] + }, + { + "name": "inbound_routing_entry3", + "op": "create", + "type": "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#3", + "vni": "101", + "sip": "1.128.0.0", + "sip_mask": "255.255.255.0", + "priority": 0 + }, + "attributes": [ + "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE", + "SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID", + "$vnet" + ] + }, + { + "name": "ocpe", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": NETWORK_IP1 + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", NETWORK_VTEP_IP, + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", INNER_DST_MAC, + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + ] + }, + { + "name": "ocpe1", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": NETWORK_IP2 + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", NETWORK_VTEP_IP, + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", INNER_DST_MAC2, + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + ] + }, + { + "name": "ocpe2", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": ENI_IP + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", ENI_VTEP_IP, + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", INNER_SRC_MAC, + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + ] + } +] + diff --git a/test/test-cases/functional/saic/config_inbound_setup_commands.py b/test/test-cases/functional/saic/config_inbound_setup_commands.py new file mode 100644 index 000000000..8862a16f2 --- /dev/null +++ b/test/test-cases/functional/saic/config_inbound_setup_commands.py @@ -0,0 +1,308 @@ +############################################################### +# Declaring Global variables +############################################################### + +TOTALPACKETS = 1000 +PPS = 100 +PACKET_LENGTH = 128 +ENI_IP = "1.1.0.1" +NETWORK_IP1 = "1.128.0.1" +NETWORK_IP2 = "1.128.0.2" + +DPU_VTEP_IP = "221.0.0.2" +ENI_VTEP_IP = "221.0.1.11" +NETWORK_VTEP_IP = "221.0.2.101" +OUTER_SRC_MAC = "80:09:02:01:00:01" +OUTER_DST_MAC = "c8:2c:2b:00:d1:30" #MAC from DUT +INNER_SRC_MAC = "00:1A:C5:00:00:01" +INNER_DST_MAC = "00:1b:6e:00:00:01" +OUTER_SRC_MAC_F2 = "80:09:02:02:00:01" +OUTER_DST_MAC_F2 = "c8:2c:2b:00:d1:34" + + +############################################################### +# DPU Config +############################################################### +dpu_config = [ + { + "name": "vip_entry", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": DPU_VTEP_IP + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", + "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "dle_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "11" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", + "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "dle_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "101" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", + "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "acl_in_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", + "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "acl_out_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", + "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "vnet_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_VNET", + "attributes": [ + "SAI_VNET_ATTR_VNI", + "1000" + ] + }, + { + "name": "eni_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + ENI_VTEP_IP, + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet_#1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0" + ] + }, + { + "name": "eni_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + NETWORK_VTEP_IP, + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet_#1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "$acl_in_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "$acl_out_1", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0" + ] + }, + + { + "name": "eni_ether_address_map_entry", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": INNER_SRC_MAC + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", + "$eni_#1" + ] + }, + { + "name": "eni_ether_address_map_entry2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": INNER_DST_MAC + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", + "$eni_#2" + ] + }, + { + "name": "inbound_routing_entry_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#1", + "vni": "11", + "sip": "1.1.0.0", + "sip_mask": "255.255.255.0", + "priority": 0 + }, + "attributes": [ + "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE", + "SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID", + "$vnet_#1" + ] + }, + { + "name": "inbound_routing_entry_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni_#2", + "vni": "101", + "sip": "1.128.0.0", + "sip_mask": "255.255.255.0", + "priority": 0 + }, + "attributes": [ + "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE", + "SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID", + "$vnet_#1" + ] + }, + { + "name": "pa_validation_entry_#1", + "op": "create", + "type": "SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "sip": ENI_IP, + "vnet_id": "$vnet_#1" + }, + "attributes": [ + "SAI_PA_VALIDATION_ENTRY_ATTR_ACTION", + "SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT" + ] + }, + { + "name": "pa_validation_entry_#2", + "op": "create", + "type": "SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "sip": NETWORK_IP1, + "vnet_id": "$vnet_#1" + }, + "attributes": [ + "SAI_PA_VALIDATION_ENTRY_ATTR_ACTION", + "SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT" + ] + } +] diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py new file mode 100644 index 000000000..97d130fa8 --- /dev/null +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py @@ -0,0 +1,169 @@ +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +import sys +sys.path.append("../utils") +import snappi_utils as su + +current_file_dir = Path(__file__).parent + +#import global variables and dpu config +from config_inbound_setup_commands import * + +""" +This covers following scenario : + +Test vnet to vnet communication with ACL on inbound direction: +1. Configure DUT on inbound routing direction to deny and allow traffic +2. Configure TGEN vxlan traffic flow as one vnet to another vnet of two OpenTrafficGenerator ports +3. Verify Traffic denied through deny IPs + + +Topology Used : + + -------- ------- -------- + | | | | | | + | | | | | | + | TGEN |--------| DUT |--------| TGEN | + | | | | | | + | | | | | | + -------- ------- -------- + +""" + +############################################################### +# Start of the testcase +############################################################### + + +@pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/345") +class TestAclInbound: + @pytest.fixture(scope="class") + def setup_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + return dpu_config + + @pytest.mark.dependency() + def test_setup(self, dpu, setup_config): + results = [*dpu.process_commands(setup_config)] + print("\n======= SAI setup commands RETURN values =======") + pprint(results) + assert all(results), "Setup error" + + @pytest.mark.dependency(depends=['TestAclInbound::test_setup']) + def test_vm_to_vm_commn_acl_inbound(self, dataplane): + + # configure Tgen properties + + # inbound Flow settings + f2 = dataplane.configuration.flows.flow(name="INBOUND")[-1] + f2.tx_rx.port.tx_name = dataplane.configuration.ports[1].name + f2.tx_rx.port.rx_name = dataplane.configuration.ports[0].name + f2.size.fixed = PACKET_LENGTH + # send n packets and stop + f2.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f2.rate.pps = PPS + f2.metrics.enable = True + + outer_eth, ip, udp, vxlan, inner_eth, inner_ip , inner_udp= ( + f2.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth.src.value = "80:09:02:02:00:01" + outer_eth.dst.value = "c8:2c:2b:00:d1:34" + outer_eth.ether_type.value = 2048 + + ip.src.value = NETWORK_VTEP_IP + ip.dst.value = DPU_VTEP_IP + + udp.src_port.value = 11638 + udp.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan.vni.value = 101 + vxlan.reserved0.value = 0 + vxlan.reserved1.value = 0 + + inner_eth.dst.value = "00:1A:C5:00:00:01" + inner_eth.src.value = "00:1b:6e:00:00:02" + + inner_ip.src.value = NETWORK_IP1 #world + inner_ip.dst.value = ENI_IP # ENI + + inner_udp.src_port.value = 20000 + inner_udp.dst_port.value = 10000 + + dataplane.set_config() + + # Verify traffic + print("\n======= Verify traffic with allowed packets passing =======") + print("\n======= Start traffic =======") + su.start_traffic(dataplane, f2.name) + flow_names=[f2.name] + while(True): + if (dataplane.is_traffic_stopped(flow_names)): + break + print("\n======= Stop traffic =======") + dataplane.stop_traffic() + + #Packets should be allowed now + print("\n======= Verify packet TX and RX matching =======") + acl_traffic_result1 = su.check_flow_tx_rx_frames_stats(dataplane, f2.name) + # Print Result of the test + print("Tx and Rx packet match result of flow {} is {}".format(f2.name, acl_traffic_result1)) + + inner_ip.src.value = NETWORK_IP2 #world + inner_ip.dst.value = ENI_IP # ENI + + inner_udp.src_port.value = 20000 + inner_udp.dst_port.value = 10000 + + dataplane.set_config() + + # Verify Traffic + print("\n======= Verify traffic with denied packets failing =======") + print("\n======= Start traffic =======") + su.start_traffic(dataplane, f2.name) + flow_names=[f1.name, f2.name, f3.name, f4.name] + while(True): + if (dataplane.is_traffic_stopped(flow_names)): + break + print("\n======= Stop traffic =======") + dataplane.stop_traffic() + + #Packets should be denied + print("\n======= Verify packet TX and RX not matching =======") + acl_traffic_result2 = su.check_flow_tx_rx_frames_stats(dataplane, f2.name) + # Print Result of the test + print("Tx and Rx packet match result of flow {} is {}".format(f2.name, acl_traffic_result2)) + + dataplane.teardown() + + # Validate test result + assert acl_traffic_result1==True, "Traffic test packets Allow failure" + assert acl_traffic_result2==False, "Traffic test packets Deny failure" + + @pytest.mark.skip(reason="TODO: validate acl drop from DPU stats when stats api becomes available") + def test_check_dpu_drop_reason_is_acl(): + pass + + @pytest.mark.dependency(depends=['TestAclInbound::test_setup']) + def test_cleanup(self, dpu, setup_config): + + cleanup_commands = [] + for command in reversed(setup_config): + command['op'] = 'remove' + cleanup_commands.append(command) + + results = [] + for command in cleanup_commands: + results.append(dpu.command_processor.process_command(command)) + print (results) + print("\n======= SAI teardown commands RETURN values =======") + assert all([x==0 for x in results]), "Teardown Error" diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py new file mode 100644 index 000000000..29d3155aa --- /dev/null +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py @@ -0,0 +1,277 @@ +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +import sys +sys.path.append("../utils") +import snappi_utils as su + +current_file_dir = Path(__file__).parent + +#import global variables and dpu config +from config_bidir_setup_commands import * + +""" +This covers following scenario : + +vnet to vnet communication with UDP traffic flow on bidirectional traffic : + +Configure DUT on bidirectional routing direction +Configure TGEN vxlan UDP traffic flow as one vnet to another vnet of two OpenTrafficGenerator ports +Verify Traffic flow between vnet to vnet through DPU + + +Topology Used : + + -------- ------- -------- + | | | | | | + | | | | | | + | TGEN |--------| DUT |--------| TGEN | + | | | | | | + | | | | | | + -------- ------- -------- + +""" + + +############################################################### +# Start of the testcase +############################################################### + + +@pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/345") +class TestUdpBidir: + + @pytest.fixture(scope="class") + def setup_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + return dpu_config + + @pytest.mark.dependency() + def test_setup(self, dpu, setup_config): + results = [*dpu.process_commands(setup_config)] + print("\n======= SAI setup commands RETURN values =======") + pprint(results) + assert all(results), "Setup error" + + + @pytest.mark.dependency(depends=['TestUdpBidir::test_setup']) + def test_vm_to_vm_commn_udp_bidir(self, dataplane): + + # Configure TGEN + + print("\n======= Configure Flow1 from ENI to NETWORK =======") + # Flow1 settings + f1 = dataplane.configuration.flows.flow(name="ENI_TO_NETWORK")[-1] + f1.tx_rx.port.tx_name = dataplane.configuration.ports[0].name + f1.tx_rx.port.rx_name = dataplane.configuration.ports[1].name + f1.size.fixed = PACKET_LENGTH + # send n packets and stop + f1.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f1.rate.pps = PPS + f1.metrics.enable = True + + outer_eth1, ip1, udp1, vxlan1, inner_eth1, inner_ip1, inner_udp1= ( + f1.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth1.src.value = OUTER_SRC_MAC + outer_eth1.dst.value = OUTER_DST_MAC + outer_eth1.ether_type.value = 2048 + + ip1.src.value = ENI_VTEP_IP #ENI - VTEP + ip1.dst.value = DPU_VTEP_IP #DPU - VTEP + + udp1.src_port.value = 11638 + udp1.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan1.vni.value = 11 + vxlan1.reserved0.value = 0 + vxlan1.reserved1.value = 0 + + inner_eth1.src.value = INNER_SRC_MAC + inner_eth1.dst.value = INNER_DST_MAC + + inner_ip1.src.value = ENI_IP #ENI + inner_ip1.dst.value = NETWORK_IP1 #world + + inner_udp1.src_port.value = 10000 + inner_udp1.dst_port.value = 20000 + + print("\n======= Configure Flow2 from NETWORK to ENI =======") + # Flow2 settings + f2 = dataplane.configuration.flows.flow(name="NETWORK_TO_ENI")[-1] + f2.tx_rx.port.tx_name = dataplane.configuration.ports[1].name + f2.tx_rx.port.rx_name = dataplane.configuration.ports[0].name + f2.size.fixed = PACKET_LENGTH + # send n packets and stop + f2.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f2.rate.pps = PPS + f2.metrics.enable = True + + outer_eth, ip, udp, vxlan, inner_eth, inner_ip , inner_udp= ( + f2.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth.src.value = OUTER_SRC_MAC_F2 + outer_eth.dst.value = OUTER_DST_MAC_F2 + outer_eth.ether_type.value = 2048 + + ip.src.value = NETWORK_VTEP_IP + ip.dst.value = DPU_VTEP_IP + + udp.src_port.value = 11638 + udp.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan.vni.value = 101 + vxlan.reserved0.value = 0 + vxlan.reserved1.value = 0 + + inner_eth.src.value = INNER_DST_MAC + inner_eth.dst.value = INNER_SRC_MAC + + inner_ip.src.value = NETWORK_IP1 #world + inner_ip.dst.value = ENI_IP # ENI + + inner_udp.src_port.value = 20000 + inner_udp.dst_port.value = 10000 + + print("\n======= Configure Flow3 from ENI to NETWORK2 =======") + + # Flow3 settings + f3 = dataplane.configuration.flows.flow(name="ENI_TO_NETWORK2")[-1] + f3.tx_rx.port.tx_name = dataplane.configuration.ports[0].name + f3.tx_rx.port.rx_name = dataplane.configuration.ports[1].name + f3.size.fixed = PACKET_LENGTH + # send n packets and stop + f3.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f3.rate.pps = PPS + f3.metrics.enable = True + + outer_eth, ip, udp, vxlan, inner_eth, inner_ip , inner_udp= ( + f3.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth.src.value = OUTER_SRC_MAC + outer_eth.dst.value = OUTER_DST_MAC + outer_eth.ether_type.value = 2048 + + ip.src.value = ENI_VTEP_IP #ENI - VTEP + ip.dst.value = DPU_VTEP_IP #DPU - VTEP + + udp.src_port.value = 11638 + udp.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan.vni.value = 11 + vxlan.reserved0.value = 0 + vxlan.reserved1.value = 0 + + inner_eth.src.value = INNER_SRC_MAC + inner_eth.dst.value = INNER_DST_MAC2 + + + inner_ip.src.value = ENI_IP #ENI + inner_ip.dst.value = NETWORK_IP2 #world + + inner_udp.src_port.value = 10000 + inner_udp.dst_port.value = 20000 + + print("\n======= Configure Flow4 from NETWORK2 to ENI =======") + # Flow4 settings + f4 = dataplane.configuration.flows.flow(name="NETWORK2_TO_ENI")[-1] + f4.tx_rx.port.tx_name = dataplane.configuration.ports[1].name + f4.tx_rx.port.rx_name = dataplane.configuration.ports[0].name + f4.size.fixed = PACKET_LENGTH + # send n packets and stop + f4.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f4.rate.pps = PPS + f4.metrics.enable = True + + outer_eth, ip, udp, vxlan, inner_eth, inner_ip , inner_udp= ( + f4.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth.src.value = OUTER_SRC_MAC_F2 + outer_eth.dst.value = OUTER_DST_MAC_F2 + outer_eth.ether_type.value = 2048 + + ip.src.value = NETWORK_VTEP_IP + ip.dst.value = DPU_VTEP_IP + + udp.src_port.value = 11638 + udp.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan.vni.value = 101 + vxlan.reserved0.value = 0 + vxlan.reserved1.value = 0 + + inner_eth.src.value = INNER_DST_MAC2 + inner_eth.dst.value = INNER_SRC_MAC + + inner_ip.src.value = NETWORK_IP2 #world + inner_ip.dst.value = ENI_IP # ENI + + inner_udp.src_port.value = 20000 + inner_udp.dst_port.value = 10000 + dataplane.set_config() + + # Verify Traffic + print("\n======= Start Traffic =======") + su.start_traffic(dataplane, f1.name) + su.start_traffic(dataplane, f3.name) + time.sleep(0.5) + su.start_traffic(dataplane, f2.name) + su.start_traffic(dataplane, f4.name) + flow_names=[f1.name, f2.name, f3.name, f4.name] + while(True): + if (dataplane.is_traffic_stopped(flow_names)): + break + print("\n======= Stop Traffic =======") + dataplane.stop_traffic() + + print("\n======= Verify Traffic flows =======") + res1 = su.check_flow_tx_rx_frames_stats(dataplane, f1.name) + res2 = su.check_flow_tx_rx_frames_stats(dataplane, f2.name) + res3 = su.check_flow_tx_rx_frames_stats(dataplane, f3.name) + res4 = su.check_flow_tx_rx_frames_stats(dataplane, f4.name) + + dataplane.teardown() + + # Validate test result + print("\n======= Print Test Results =======") + print("Tx and Rx packet match result of flow {} is {}".format(f1.name, res1)) + print("Tx and Rx packet match result of flow {} is {}".format(f2.name, res2)) + print("Tx and Rx packet match result of flow {} is {}".format(f3.name, res3)) + print("Tx and Rx packet match result of flow {} is {}".format(f4.name, res4)) + assert res1, "Traffic test failure" + assert res2, "Traffic test failure" + assert res3, "Traffic test failure" + assert res4, "Traffic test failure" + + @pytest.mark.dependency(depends=['TestUdpBidir::test_setup']) + def test_cleanup(self, dpu, setup_config): + + cleanup_commands = [] + for command in reversed(setup_config): + command['op'] = 'remove' + cleanup_commands.append(command) + + results = [] + for command in cleanup_commands: + results.append(dpu.command_processor.process_command(command)) + print (results) + print("\n======= SAI teardown commands RETURN values =======") + assert all([x==0 for x in results]), "Teardown Error" + diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py new file mode 100644 index 000000000..296d3bfbd --- /dev/null +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py @@ -0,0 +1,174 @@ +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +import sys +sys.path.append("../utils") +import snappi_utils as su + +current_file_dir = Path(__file__).parent + +#import global variables and dpu config +from config_inbound_setup_commands import * + +""" +This covers following scenario : +vnet to vnet communication with UDP traffic flow with inbound direction : +Configure DUT on inbound routing direction +Configure TGEN vxlan UDP traffic flow as one vnet to another vnet of two OpenTrafficGenerator ports +Verify Traffic flow between vnet to vnet through DUT + +Topology Used : + -------- ------- -------- + | | | | | | + | | | | | | + | TGEN |--------| DUT |--------| TGEN | + | | | | | | + | | | | | | + -------- ------- -------- + +""" + + +############################################################### +# Start of the testcase +############################################################### + + +@pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/345") +class TestUdpInbound: + @pytest.fixture(scope="class") + def setup_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + return dpu_config + + @pytest.mark.dependency() + def test_setup(self, dpu, setup_config): + results = [*dpu.process_commands(setup_config)] + print("\n======= SAI setup commands RETURN values =======") + pprint(results) + assert all(results), "Setup error" + + @pytest.mark.dependency(depends=['TestUdpInbound::test_setup']) + def test_vm_to_vm_commn_udp_inbound(self, dataplane): + # Configure TGEN + # Flow1 settings + f1 = dataplane.configuration.flows.flow(name="ENI_TO_NETWORK")[-1] + f1.tx_rx.port.tx_name = dataplane.configuration.ports[0].name + f1.tx_rx.port.rx_name = dataplane.configuration.ports[1].name + f1.size.fixed = PACKET_LENGTH + # send n packets and stop + f1.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f1.rate.pps = PPS + f1.metrics.enable = True + + outer_eth1, ip1, udp1, vxlan1, inner_eth1, inner_ip1, inner_udp1= ( + f1.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth1.src.value = OUTER_SRC_MAC + outer_eth1.dst.value = OUTER_DST_MAC + outer_eth1.ether_type.value = 2048 + + ip1.src.value = ENI_VTEP_IP #ENI - VTEP + ip1.dst.value = DPU_VTEP_IP #DPU - VTEP + + udp1.src_port.value = 11638 + udp1.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan1.vni.value = 11 + vxlan1.reserved0.value = 0 + vxlan1.reserved1.value = 0 + + inner_eth1.src.value = INNER_SRC_MAC + inner_eth1.dst.value = INNER_DST_MAC + + inner_ip1.src.value = ENI_IP #ENI + inner_ip1.dst.value = NETWORK_IP1 #world + + inner_udp1.src_port.value = 10000 + inner_udp1.dst_port.value = 20000 + + # Flow2 settings + f2 = dataplane.configuration.flows.flow(name="NETWORK_TO_ENI")[-1] + f2.tx_rx.port.tx_name = dataplane.configuration.ports[1].name + f2.tx_rx.port.rx_name = dataplane.configuration.ports[0].name + f2.size.fixed = PACKET_LENGTH + # send n packets and stop + f2.duration.fixed_packets.packets = TOTALPACKETS + # send n packets per second + f2.rate.pps = PPS + f2.metrics.enable = True + + outer_eth, ip, udp, vxlan, inner_eth, inner_ip , inner_udp= ( + f2.packet.ethernet().ipv4().udp().vxlan().ethernet().ipv4().udp() + ) + + outer_eth.src.value = OUTER_SRC_MAC_F2 + outer_eth.dst.value = OUTER_DST_MAC_F2 + outer_eth.ether_type.value = 2048 + + ip.src.value = NETWORK_VTEP_IP + ip.dst.value = DPU_VTEP_IP + + udp.src_port.value = 11638 + udp.dst_port.value = 4789 + + #vxlan.flags.value = + vxlan.vni.value = 101 + vxlan.reserved0.value = 0 + vxlan.reserved1.value = 0 + + inner_eth.src.value = INNER_DST_MAC + inner_eth.dst.value = INNER_SRC_MAC + + inner_ip.src.value = NETWORK_IP1 #world + inner_ip.dst.value = ENI_IP # ENI + + inner_udp.src_port.value = 20000 + inner_udp.dst_port.value = 10000 + + dataplane.set_config() + + # Verify Traffic + su.start_traffic(dataplane, f2.name) + time.sleep(0.5) + su.start_traffic(dataplane, f1.name) + flow_names=[f1.name, f2.name] + while(True): + if (dataplane.is_traffic_stopped(flow_names)): + break + dataplane.stop_traffic() + + res1 = su.check_flow_tx_rx_frames_stats(dataplane, f1.name) + res2 = su.check_flow_tx_rx_frames_stats(dataplane, f2.name) + print("Tx and Rx packet match result of flow {} is {}".format(f1.name, res1)) + print("Tx and Rx packet match result of flow {} is {}".format(f2.name, res2)) + + dataplane.teardown() + + # Validate test result + assert res1, "Traffic test failure" + assert res2, "Traffic test failure" + + @pytest.mark.dependency(depends=['TestUdpInbound::test_setup']) + def test_cleanup(self, dpu, setup_config): + + cleanup_commands = [] + for command in reversed(setup_config): + command['op'] = 'remove' + cleanup_commands.append(command) + + results = [] + for command in cleanup_commands: + results.append(dpu.command_processor.process_command(command)) + print (results) + print("\n======= SAI teardown commands RETURN values =======") + assert all([x==0 for x in results]), "Teardown Error" + \ No newline at end of file diff --git a/test/test-cases/utils/snappi_utils.py b/test/test-cases/utils/snappi_utils.py index 1579be95a..6fbaf4836 100644 --- a/test/test-cases/utils/snappi_utils.py +++ b/test/test-cases/utils/snappi_utils.py @@ -1,4 +1,11 @@ def config_l1_properties(dataplane, usd_speed): + + """ + This function used to configure L1 properties such as speed of the ports + Sometimes enabling auto_negotiation would fail to bring the ports up + So we are disabling auto_nagotiation when setting speed + """ + ly = dataplane.configuration.layer1.layer1(name="ly")[-1] ly.port_names = [p.name for p in dataplane.configuration.ports] val = getattr(ly , usd_speed ) @@ -9,6 +16,12 @@ def config_l1_properties(dataplane, usd_speed): ly.auto_negotiate = False def check_flow_tx_rx_frames_stats(dataplane, flow_name): + + """ + This function used to check tx and rx packet values of a given flow + This matches the tx and rx packet and if matches returns true + """ + req = dataplane.api.metrics_request() req.flow.flow_names = [flow_name] flow_stats = dataplane.api.get_metrics(req) @@ -18,6 +31,11 @@ def check_flow_tx_rx_frames_stats(dataplane, flow_name): return frames_tx == frames_rx def check_port_tx_rx_frames_stats(dataplane, port_name): + """ + This function used to check tx and rx packet values of a given port + This matches the tx and rx packet and if matches returns true + """ + req = dataplane.api.metrics_request() req.port.port_names = [port_name] req.port.column_names = [req.port.FRAMES_TX, req.port.FRAMES_RX] @@ -28,6 +46,12 @@ def check_port_tx_rx_frames_stats(dataplane, port_name): return frames_tx == frames_rx def check_bgp_neighborship_established(dataplane): + """ + This function used to verify BGP neighborships Established. + It Verifies all the configured BGP protocol sessions are up. + If any one of the BGP protocol session down, it returs false + """ + req =dataplane.api.metrics_request() req.bgpv4.column_names = ["session_state"] results = dataplane.api.get_metrics(req) @@ -36,9 +60,17 @@ def check_bgp_neighborship_established(dataplane): ok.append(r.session_state == "up") return all(ok) -def check_ping(dataplane, ip_obj_name, ip, ip_type="ipv4"): + +def check_ping(dataplane, ip_obj_name, ip, addr_family="ipv4"): + """ + This function will verify ping connectivity between TGEN and DUT + Ping request would be sent from TGEN + ip_obj_name is source ip stack name from where we wanted to send ping + ip is DUT ip address which connectivity to be tested from TGEN + """ req = dataplane.api.ping_request() - if ip_type == "ipv4": + if addr_family == "ipv4": + p1 = req.endpoints.ipv4() else: p1 = req.endpoints.ipv6() @@ -46,7 +78,7 @@ def check_ping(dataplane, ip_obj_name, ip, ip_type="ipv4"): p1.dst_ip = ip responses = dataplane.api.send_ping(req).responses for resp in responses : - if resp.src_name == ip1.name and resp.dst_ip == ip: + if resp.src_name == ip_obj_name and resp.dst_ip == ip: return True else: return False @@ -59,4 +91,6 @@ def start_traffic(dataplane, flow_name=None): if flow_name != None: ts.flow_names = [flow_name] res = dataplane.api.set_transmit_state(ts) - assert dataplane.api_results_ok(res), res \ No newline at end of file + assert dataplane.api_results_ok(res), res + + From 7dd0ba0085e54a623a141efe8cb4d9d19c3a9b34 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan Date: Wed, 29 Mar 2023 19:47:19 +0300 Subject: [PATCH 08/75] Update SAI-C client docker (#353) Signed-off-by: Andriy Kokhan --- .../Dockerfile.saichallenger-client-bldr | 1 + .../saic/sai-api/test_sai_api_vnet_acl_in.py | 10 ------- .../saic/sai-api/test_sai_api_vnet_acl_out.py | 10 ------- .../test_sai_api_vnet_direction_lookup.py | 10 ------- .../saic/sai-api/test_sai_api_vnet_eni.py | 14 --------- .../sai-api/test_sai_api_vnet_eni_addr.py | 10 ------- .../sai-api/test_sai_api_vnet_in_route.py | 29 +++++-------------- .../sai-api/test_sai_api_vnet_inbound_vpe.py | 10 ------- .../sai-api/test_sai_api_vnet_out_route.py | 19 ------------ .../sai-api/test_sai_api_vnet_pa_entry.py | 15 ---------- .../saic/sai-api/test_sai_api_vnet_vni.py | 10 ------- .../saic/test_vm_to_vm_commn_acl_outbound.py | 2 -- .../saic/test_vm_to_vm_commn_udp_outbound.py | 3 -- .../functional/saic/tutorial/README.md | 2 -- ..._outbound_small_scale_config_via_dpugen.py | 2 -- ...und_small_scale_config_via_dpugen_files.py | 1 - ...est_sai_vnet_vips_config_via_custom_gen.py | 2 -- ...i_vnet_vips_config_via_custom_gen_files.py | 2 -- ...vnet_vips_config_via_list_comprehension.py | 2 -- ...ips_config_via_list_comprehension_files.py | 2 -- .../test_sai_vnet_vips_config_via_literal.py | 2 -- .../scale/saic/test_config_vnet_inbound.py | 1 + .../scale/saic/test_sai_vnet_inbound.py | 1 + 23 files changed, 10 insertions(+), 150 deletions(-) diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr index ce25999f3..742ce9f6a 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr @@ -1,4 +1,5 @@ # Requires or something +# sc-client:230216 FROM sc-client ADD tests/ /tests/ diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_in.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_in.py index 4c13ecd02..508899531 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_in.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_in.py @@ -25,8 +25,6 @@ def test_vnet_acl_in_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_DASH_ACL_GROUP Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_acl_in_get1(self, dpu): @@ -41,8 +39,6 @@ def test_vnet_acl_in_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DASH_ACL_GROUP GET error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_acl_in_set(self, dpu): @@ -61,8 +57,6 @@ def test_vnet_acl_in_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DASH_ACL_GROUP Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_acl_in_get2(self, dpu): @@ -77,8 +71,6 @@ def test_vnet_acl_in_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DASH_ACL_GROUP GET error" - def test_vnet_acl_in_remove(self, dpu): commands = [ @@ -92,5 +84,3 @@ def test_vnet_acl_in_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DASH_ACL_GROUP Remove error" diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_out.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_out.py index 557d78e64..f800004c8 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_out.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_acl_out.py @@ -25,8 +25,6 @@ def test_vnet_acl_out_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_IP_ADDR_FAMILY_IPV4 Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_acl_out_get1(self, dpu): @@ -41,8 +39,6 @@ def test_vnet_acl_out_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_IP_ADDR_FAMILY_IPV4 GET error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_acl_out_set(self, dpu): @@ -61,8 +57,6 @@ def test_vnet_acl_out_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_IP_ADDR_FAMILY_IPV4 Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_acl_out_get2(self, dpu): @@ -77,8 +71,6 @@ def test_vnet_acl_out_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_IP_ADDR_FAMILY_IPV4 GET error" - def test_vnet_acl_out_remove(self, dpu): commands = [ @@ -92,5 +84,3 @@ def test_vnet_acl_out_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_IP_ADDR_FAMILY_IPV4 Remove error" diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_direction_lookup.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_direction_lookup.py index 81278226e..3228d7857 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_direction_lookup.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_direction_lookup.py @@ -32,8 +32,6 @@ def test_direction_lookup_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_direction_lookup_get1(self, dpu): @@ -48,8 +46,6 @@ def test_direction_lookup_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY Get error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_direction_lookup_set(self, dpu): @@ -73,8 +69,6 @@ def test_direction_lookup_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_direction_lookup_get2(self, dpu): @@ -89,8 +83,6 @@ def test_direction_lookup_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY Get error" - def test_direction_lookup_remove(self, dpu): commands = [ @@ -104,5 +96,3 @@ def test_direction_lookup_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY Remove error" diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py index 1d2d1265d..e80491573 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py @@ -24,8 +24,6 @@ def test_vnet_eni_create(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values create =======") pprint(results) - - assert all(results), "SAI_OBJECT_TYPE_VNET Create error" commands = [ { @@ -94,8 +92,6 @@ def test_vnet_eni_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_ENI Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_eni_get1(self, dpu): @@ -111,8 +107,6 @@ def test_vnet_eni_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "10.10.2.10" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_eni_set(self, dpu): @@ -132,8 +126,6 @@ def test_vnet_eni_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_ENI Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_eni_get2(self, dpu): @@ -150,8 +142,6 @@ def test_vnet_eni_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "20.10.2.10" - def test_vnet_eni_remove(self, dpu): commands = [ @@ -165,8 +155,6 @@ def test_vnet_eni_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_ENI Remove error" commands = [ { @@ -179,5 +167,3 @@ def test_vnet_eni_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Remove error" diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni_addr.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni_addr.py index 9c40e170b..4618311bd 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni_addr.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni_addr.py @@ -32,8 +32,6 @@ def test_vnet_eni_ether_address_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_eni_ether_address_get1(self, dpu): @@ -48,8 +46,6 @@ def test_vnet_eni_ether_address_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "eni_id" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_eni_ether_address_set(self, dpu): @@ -72,8 +68,6 @@ def test_vnet_eni_ether_address_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_eni_ether_address_get2(self, dpu): @@ -88,8 +82,6 @@ def test_vnet_eni_ether_address_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "eni_id" - def test_vnet_eni_ether_address_remove(self, dpu): commands = [ @@ -103,5 +95,3 @@ def test_vnet_eni_ether_address_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY Remove error" diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py index 5aa6503e4..b0c21cf4d 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py @@ -11,7 +11,8 @@ class TestSaiVnetInboundRoutingEntry: - def test_vnet_inbound_routing_entry_create(self, dpu): + @pytest.mark.dependency() + def test_vnet_inbound_routing_entry_create_setup(self, dpu): # Create VNET commands = [ @@ -29,8 +30,6 @@ def test_vnet_inbound_routing_entry_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_VNET Create error" - # Create ENI commands = [ { @@ -99,8 +98,9 @@ def test_vnet_inbound_routing_entry_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_ENI Create error" - + @pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345 [P4Runtime] Invalid match type") + def test_vnet_inbound_routing_entry_create(self, dpu): + commands = [ { "name": "inbound_routing_entry", @@ -126,8 +126,6 @@ def test_vnet_inbound_routing_entry_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_inbound_routing_entry_get1(self, dpu): @@ -143,8 +141,6 @@ def test_vnet_inbound_routing_entry_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY Get error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_inbound_routing_entry_set(self, dpu): @@ -171,8 +167,6 @@ def test_vnet_inbound_routing_entry_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_inbound_routing_entry_get2(self, dpu): @@ -188,9 +182,7 @@ def test_vnet_inbound_routing_entry_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY Get error" - - @pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/233 [P4Runtime] Invalid match type") + @pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345 [P4Runtime] Invalid match type") def test_vnet_inbound_routing_entry_remove(self, dpu): commands = [ @@ -205,8 +197,7 @@ def test_vnet_inbound_routing_entry_remove(self, dpu): print("\n======= SAI commands RETURN values remove =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY Remove error" - + @pytest.mark.dependency(depends=['TestSaiVnetInboundRoutingEntry::test_vnet_inbound_routing_entry_create_setup']) def test_vnet_inbound_routing_entry_remove_cleanup(self, dpu): # Remove VNET @@ -221,8 +212,6 @@ def test_vnet_inbound_routing_entry_remove_cleanup(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Remove error" # Remove ENI commands = [ @@ -236,7 +225,3 @@ def test_vnet_inbound_routing_entry_remove_cleanup(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_ENI Remove error" - - \ No newline at end of file diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_inbound_vpe.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_inbound_vpe.py index 9e1421d7a..8717fe8d0 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_inbound_vpe.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_inbound_vpe.py @@ -31,8 +31,6 @@ def test_vnet_inbound_simple_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_VIP_ENTRY Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_inbound_simple_get1(self, dpu): @@ -48,8 +46,6 @@ def test_vnet_inbound_simple_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_VIP_ENTRY_ACTION_ACCEPT" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_inbound_simple_set(self, dpu): @@ -71,8 +67,6 @@ def test_vnet_inbound_simple_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VIP_ENTRY Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_inbound_simple_get2(self, dpu): @@ -88,8 +82,6 @@ def test_vnet_inbound_simple_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_VIP_ENTRY_ACTION_REJECT" - def test_vnet_inbound_simple_remove(self, dpu): commands = [ @@ -103,5 +95,3 @@ def test_vnet_inbound_simple_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VIP_ENTRY Remove error" diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py index bbbfff01b..d42a7b5a1 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py @@ -28,8 +28,6 @@ def test_vnet_outbound_routing_entry_create(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values create =======") pprint(results) - - assert all(results), "SAI_OBJECT_TYPE_VNET Create error" # Create ENI commands = [ @@ -98,8 +96,6 @@ def test_vnet_outbound_routing_entry_create(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values create =======") pprint(results) - - assert all(results), "SAI_OBJECT_TYPE_ENI Create error" commands = [ { @@ -121,8 +117,6 @@ def test_vnet_outbound_routing_entry_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_outbound_routing_entry_get1(self, dpu): @@ -137,8 +131,6 @@ def test_vnet_outbound_routing_entry_get1(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET Get error" - @ pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_outbound_routing_entry_set(self, dpu): @@ -161,8 +153,6 @@ def test_vnet_outbound_routing_entry_set(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values create =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET Set error" @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_outbound_routing_entry_get2(self, dpu): @@ -178,8 +168,6 @@ def test_vnet_outbound_routing_entry_get2(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET Get error" - def test_vnet_outbound_routing_entry_remove(self, dpu): commands = [ { @@ -192,8 +180,6 @@ def test_vnet_outbound_routing_entry_remove(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY Remove error" - # Remove ENI commands = [ { @@ -207,8 +193,6 @@ def test_vnet_outbound_routing_entry_remove(self, dpu): print("\n======= SAI commands RETURN values remove =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_ENI Remove error" - # Remove VNET commands = [ { @@ -221,6 +205,3 @@ def test_vnet_outbound_routing_entry_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Remove error" - diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py index 641deaa8b..37367a49f 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py @@ -28,8 +28,6 @@ def test_vnet_pa_validation_entry_create(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values create =======") pprint(results) - - assert all(results), "SAI_OBJECT_TYPE_VNET Create error" commands = [ { @@ -51,8 +49,6 @@ def test_vnet_pa_validation_entry_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_pa_validation_entry_get1(self, dpu): @@ -68,8 +64,6 @@ def test_vnet_pa_validation_entry_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all([result == 0 for result in results]), "SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT Get error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_pa_validation_entry_set(self, dpu): @@ -93,8 +87,6 @@ def test_vnet_pa_validation_entry_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all([result == 0 for result in results]), "SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_pa_validation_entry_get2(self, dpu): @@ -110,8 +102,6 @@ def test_vnet_pa_validation_entry_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all([result == 0 for result in results]), "SAI_PA_VALIDATION_ENTRY_ACTION_DENY Get error" - def test_vnet_pa_validation_entry_remove(self, dpu): commands = [ @@ -125,8 +115,6 @@ def test_vnet_pa_validation_entry_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all([result == 0 for result in results]), "SAI_PA_VALIDATION_ENTRY_ACTION_DENY Get error" commands = [ { @@ -139,6 +127,3 @@ def test_vnet_pa_validation_entry_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Remove error" - diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py index 1ff5adfdb..cd2154bbf 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py @@ -26,8 +26,6 @@ def test_vnet_vni_create(self, dpu): print("\n======= SAI commands RETURN values create =======") pprint(results) - assert all(results), "SAI_OBJECT_TYPE_VNET Create error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_vni_get1(self, dpu): @@ -44,8 +42,6 @@ def test_vnet_vni_get1(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Get error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_vni_set(self, dpu): @@ -65,8 +61,6 @@ def test_vnet_vni_set(self, dpu): print("\n======= SAI commands RETURN values set =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Set error" - @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_vni_get2(self, dpu): @@ -83,8 +77,6 @@ def test_vnet_vni_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Get error" - def test_vnet_vni_remove(self, dpu): commands = [ @@ -98,5 +90,3 @@ def test_vnet_vni_remove(self, dpu): results = [*dpu.process_commands(commands)] print("\n======= SAI commands RETURN values remove =======") pprint(results) - - assert all( [result == 0 for result in results]), "SAI_OBJECT_TYPE_VNET Remove error" diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py index 888ef138e..605462847 100644 --- a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py @@ -71,7 +71,6 @@ def test_setup(self, dpu, setup_config): results = [*dpu.process_commands(setup_config)] print("\n======= SAI setup commands RETURN values =======") pprint(results) - assert all(results), "Setup error" @pytest.mark.dependency(depends=['TestAclOutbound::test_setup']) @@ -182,5 +181,4 @@ def test_cleanup(self, dpu, setup_config): results.append(dpu.command_processor.process_command(command)) print (results) print("\n======= SAI teardown commands RETURN values =======") - assert all([x==0 for x in results]), "Teardown Error" diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py index f49283b71..d6b943b92 100644 --- a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_outbound.py @@ -75,7 +75,6 @@ def test_setup(self, dpu, setup_config): results = [*dpu.process_commands(setup_config)] print("\n======= SAI setup commands RETURN values =======") pprint(results) - assert all(results), "Setup error" @pytest.mark.dependency(depends=['TestUdpOutbound::test_setup']) @pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/236") @@ -195,5 +194,3 @@ def test_cleanup(self, dpu, setup_config): results.append(dpu.command_processor.process_command(command)) print (results) print("\n======= SAI teardown commands RETURN values =======") - assert all([x==0 for x in results]), "Teardown Error" - diff --git a/test/test-cases/functional/saic/tutorial/README.md b/test/test-cases/functional/saic/tutorial/README.md index e24c20bb4..96261200b 100644 --- a/test/test-cases/functional/saic/tutorial/README.md +++ b/test/test-cases/functional/saic/tutorial/README.md @@ -460,7 +460,6 @@ def test_sai_vnet_vips_config_create_file(dpu): results = [*dpu.process_commands(setup_commands)] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all(results), "Create error" def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): with (current_file_dir / f'test_sai_vnet_vips_config_via_list_comprehension_remove.json').open(mode='r') as config_file: @@ -468,7 +467,6 @@ def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): results = [*dpu.process_commands(teardown_commands)] print("\n======= SAI commands RETURN values =======") print(results) - assert all(results), "Create error" ``` The behavior of `process_commands()` is described in [Pattern: The magic of dpu.process\_commands()](#pattern-the-magic-of-dpuprocess_commands). diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py index 77f6cc99d..a2eb8bc48 100755 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py @@ -71,7 +71,6 @@ def test_create_vnet_scale_config_generated(self, dpu): results = [*dpu.process_commands( (self.make_create_commands()) )] print("\n======= SAI commands RETURN values =======") pprint.pprint(results) - assert all(results), "Create error" @pytest.mark.ptf @@ -83,7 +82,6 @@ def test_remove_vnet_scale_config_generated(self, dpu): """ results = [*dpu.process_commands( (self.make_remove_commands()) )] print("\n======= SAI commands RETURN values =======") - assert all( [result == 0 for result in results]), "Remove error" print(results) diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_files.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_files.py index 8ef05d929..4cf288696 100644 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_files.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_files.py @@ -39,5 +39,4 @@ def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): teardown_commands = json.load(config_file) results = [*dpu.process_commands(teardown_commands)] print("\n======= SAI commands RETURN values =======") - assert all( [result == 0 for result in results]), "Remove error" print(results) diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen.py index ec650dd4f..e85684270 100755 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen.py @@ -90,7 +90,6 @@ def test_many_vips_create_via_generator(self, dpu): results = [*dpu.process_commands( (make_create_cmds()) )] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all(results), "Create error" @pytest.mark.ptf @pytest.mark.snappi @@ -99,7 +98,6 @@ def test_many_vips_remove_via_generator(self, dpu): """ results = [*dpu.process_commands(make_remove_cmds())] print("\n======= SAI commands RETURN values =======") - assert all( [result == 0 for result in results]), "Remove error" print(results) if __name__ == '__main__': diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen_files.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen_files.py index 77954a390..946807dea 100644 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen_files.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_custom_gen_files.py @@ -33,7 +33,6 @@ def test_sai_vnet_vips_config_create_file(dpu): results = [*dpu.process_commands(setup_commands)] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all(results), "Create error" def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): @@ -41,5 +40,4 @@ def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): teardown_commands = json.load(config_file) results = [*dpu.process_commands(teardown_commands)] print("\n======= SAI commands RETURN values =======") - assert all( [result == 0 for result in results]), "Remove error" print(results) diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension.py index a69eb0069..f89a28c88 100755 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension.py @@ -57,7 +57,6 @@ def test_many_vips_create_via_list_comprehension(self, dpu): results = [*dpu.process_commands( (make_create_cmds()) )] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all(results), "Create error" @pytest.mark.ptf @pytest.mark.snappi @@ -66,7 +65,6 @@ def test_many_vips_remove_via_list_comprehension(self, dpu): """ results = [*dpu.process_commands(make_remove_cmds())] print("\n======= SAI commands RETURN values =======") - assert all( [result == 0 for result in results]), "Remove error" print(results) if __name__ == '__main__': diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension_files.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension_files.py index d646e3af8..76c307d97 100644 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension_files.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_list_comprehension_files.py @@ -32,7 +32,6 @@ def test_sai_vnet_vips_config_create_file(dpu): results = [*dpu.process_commands(setup_commands)] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all(results), "Create error" def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): with (current_file_dir / f'test_sai_vnet_vips_config_via_list_comprehension_remove.json').open(mode='r') as config_file: @@ -40,4 +39,3 @@ def test_sai_vnet_outbound_small_scale_config_remove_file(dpu): results = [*dpu.process_commands(teardown_commands)] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all( [result == 0 for result in results]), "Remove error" diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_literal.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_literal.py index 3c489574e..9787484de 100644 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_literal.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_vips_config_via_literal.py @@ -66,7 +66,6 @@ def test_many_vips_create_via_literal(self, dpu): results = [*dpu.process_commands( (make_create_cmds()) )] print("\n======= SAI commands RETURN values =======") pprint(results) - assert all(results), "Create error" @pytest.mark.ptf @pytest.mark.snappi @@ -75,7 +74,6 @@ def test_many_vips_remove_via_literal(self, dpu): """ results = [*dpu.process_commands(make_remove_cmds())] print("\n======= SAI commands RETURN values =======") - assert all( [result == 0 for result in results]), "Remove error" print(results) if __name__ == '__main__': diff --git a/test/test-cases/scale/saic/test_config_vnet_inbound.py b/test/test-cases/scale/saic/test_config_vnet_inbound.py index 22b4c74f9..300f421f8 100644 --- a/test/test-cases/scale/saic/test_config_vnet_inbound.py +++ b/test/test-cases/scale/saic/test_config_vnet_inbound.py @@ -8,6 +8,7 @@ import pytest +@pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345 [P4Runtime] Invalid match type") class TestConfigVnetInboundRouting: @pytest.fixture(scope="class") diff --git a/test/test-cases/scale/saic/test_sai_vnet_inbound.py b/test/test-cases/scale/saic/test_sai_vnet_inbound.py index 733ad8dd6..02f553ff3 100644 --- a/test/test-cases/scale/saic/test_sai_vnet_inbound.py +++ b/test/test-cases/scale/saic/test_sai_vnet_inbound.py @@ -112,6 +112,7 @@ } +@pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345 [P4Runtime] Invalid match type") class TestSaiVnetInbound: def test_vnet_inbound_create(self, dpu): From 00dde8cc146e4a68ce28da815a8194b497990153 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan Date: Thu, 30 Mar 2023 20:02:23 +0300 Subject: [PATCH 09/75] Skipping SAI-C TCs affected by issues/345 (#355) Signed-off-by: Andriy Kokhan --- .../functional/saic/test_vm_to_vm_commn_acl_inbound.py | 4 +--- .../functional/saic/test_vm_to_vm_commn_acl_outbound.py | 2 +- .../functional/saic/test_vm_to_vm_commn_udp_bidir.py | 5 +---- .../functional/saic/test_vm_to_vm_commn_udp_inbound.py | 6 ++---- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py index 97d130fa8..be68da357 100644 --- a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_inbound.py @@ -38,7 +38,7 @@ ############################################################### -@pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/345") +@pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345") class TestAclInbound: @pytest.fixture(scope="class") def setup_config(self): @@ -53,7 +53,6 @@ def test_setup(self, dpu, setup_config): results = [*dpu.process_commands(setup_config)] print("\n======= SAI setup commands RETURN values =======") pprint(results) - assert all(results), "Setup error" @pytest.mark.dependency(depends=['TestAclInbound::test_setup']) def test_vm_to_vm_commn_acl_inbound(self, dataplane): @@ -166,4 +165,3 @@ def test_cleanup(self, dpu, setup_config): results.append(dpu.command_processor.process_command(command)) print (results) print("\n======= SAI teardown commands RETURN values =======") - assert all([x==0 for x in results]), "Teardown Error" diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py index 605462847..dc091713e 100644 --- a/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_acl_outbound.py @@ -181,4 +181,4 @@ def test_cleanup(self, dpu, setup_config): results.append(dpu.command_processor.process_command(command)) print (results) print("\n======= SAI teardown commands RETURN values =======") - + diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py index 29d3155aa..be167367d 100644 --- a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_bidir.py @@ -40,7 +40,7 @@ ############################################################### -@pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/345") +@pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345") class TestUdpBidir: @pytest.fixture(scope="class") @@ -56,8 +56,6 @@ def test_setup(self, dpu, setup_config): results = [*dpu.process_commands(setup_config)] print("\n======= SAI setup commands RETURN values =======") pprint(results) - assert all(results), "Setup error" - @pytest.mark.dependency(depends=['TestUdpBidir::test_setup']) def test_vm_to_vm_commn_udp_bidir(self, dataplane): @@ -273,5 +271,4 @@ def test_cleanup(self, dpu, setup_config): results.append(dpu.command_processor.process_command(command)) print (results) print("\n======= SAI teardown commands RETURN values =======") - assert all([x==0 for x in results]), "Teardown Error" diff --git a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py index 296d3bfbd..dfb571126 100644 --- a/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py +++ b/test/test-cases/functional/saic/test_vm_to_vm_commn_udp_inbound.py @@ -36,7 +36,7 @@ ############################################################### -@pytest.mark.xfail(reason="https://github.com/sonic-net/DASH/issues/345") +@pytest.mark.skip(reason="https://github.com/sonic-net/DASH/issues/345") class TestUdpInbound: @pytest.fixture(scope="class") def setup_config(self): @@ -51,7 +51,6 @@ def test_setup(self, dpu, setup_config): results = [*dpu.process_commands(setup_config)] print("\n======= SAI setup commands RETURN values =======") pprint(results) - assert all(results), "Setup error" @pytest.mark.dependency(depends=['TestUdpInbound::test_setup']) def test_vm_to_vm_commn_udp_inbound(self, dataplane): @@ -170,5 +169,4 @@ def test_cleanup(self, dpu, setup_config): results.append(dpu.command_processor.process_command(command)) print (results) print("\n======= SAI teardown commands RETURN values =======") - assert all([x==0 for x in results]), "Teardown Error" - \ No newline at end of file + From 62eb1a956cb1de68da1e3399fae02035feb2f504 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Wed, 12 Apr 2023 23:41:13 +0800 Subject: [PATCH 10/75] [ACL]: Optimize DASH ACL by introducing cluster tag (#336) * [ACL]: Optimize DASH ACL by introducing cluster tag (#336) --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 6 + dash-pipeline/SAI/templates/saiapi.h.j2 | 16 + dash-pipeline/SAI/templates/utils.cpp.j2 | 19 + dash-pipeline/SAI/templates/utils.h.j2 | 63 ++- dash-pipeline/bmv2/dash_acl.p4 | 3 + dash-pipeline/bmv2/dash_metadata.p4 | 4 + dash-pipeline/bmv2/dash_pipeline.p4 | 32 ++ documentation/general/dash-sonic-hld.md | 497 +++++++++--------- test/test-cases/functional/ptf/saidashacl.py | 160 +++++- .../saic/test_sai_vnet_outbound_simple.py | 2 + 10 files changed, 545 insertions(+), 257 deletions(-) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 8c3544bf3..483c86d87 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -100,6 +100,12 @@ sai_status_t sai_create_{{ table.name }}( {% elif key.match_type == 'optional' %} auto mf_optional = mf->mutable_optional(); {{key.sai_key_field}}SetVal(attr_list[i].value, mf_optional, {{key.bitwidth}}); + {% elif key.match_type == 'ternary' %} + auto mf_ternary = mf->mutable_ternary(); + {{key.sai_key_field}}SetVal(attr_list[i].value, mf_ternary, {{key.bitwidth}}); + auto mask = getMaskAttr(SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK, attr_count, attr_list); + assert(mask && "SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK isn't provided"); + {{key.sai_key_field}}SetMask(mask->value, mf_ternary, {{key.bitwidth}}); {% endif %} {% if 'v4_or_v6_id' in key %} { diff --git a/dash-pipeline/SAI/templates/saiapi.h.j2 b/dash-pipeline/SAI/templates/saiapi.h.j2 index 61d2c3181..5ada95ffb 100644 --- a/dash-pipeline/SAI/templates/saiapi.h.j2 +++ b/dash-pipeline/SAI/templates/saiapi.h.j2 @@ -155,6 +155,22 @@ typedef enum _sai_{{ table.name }}_attr_t SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}, {% endif %} +{% if key.match_type == 'ternary' %} + /** + * @brief Ternary matched mask {{ key.sai_key_name }} + * +{% if key.match_type == 'list' %} + * @type {{ key.sai_list_type }} +{% elif key.match_type == 'range_list' %} + * @type {{ key.sai_range_list_type }} +{% else %} + * @type {{ key.sai_key_type }} +{% endif %} + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + */ + SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK, + +{% endif %} {% endfor %} {% endif %} {% endif %} diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index 0d0d454ed..9fbe9f9f2 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -40,6 +40,16 @@ static std::mutex tableLock; static atomic nextId; static std::unique_ptr stub; +void correctIpPrefix(void *ip, const void *mask, size_t length) +{ + auto _ip = reinterpret_cast(ip); + auto _mask = reinterpret_cast(mask); + for (size_t i = 0; i < length; i++) + { + _ip[i] = _ip[i] & _mask[i]; + } +} + int leadingNonZeroBits(const uint32_t ipv4) { auto firstSetBit = __builtin_ffs(ipv4); if (0==firstSetBit) { @@ -137,6 +147,15 @@ string updateTypeStr(p4::v1::Update_Type updateType) { return descriptor->FindValueByNumber(updateType)->name(); } +const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) { + for (uint32_t i = 0; i < attr_count; i++) { + if (attr_list[i].id == id) { + return &attr_list[i]; + } + } + return nullptr; +} + grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType) { p4::v1::WriteRequest request; diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/templates/utils.h.j2 index c3e2f8b9e..8746c6ad5 100644 --- a/dash-pipeline/SAI/templates/utils.h.j2 +++ b/dash-pipeline/SAI/templates/utils.h.j2 @@ -140,6 +140,8 @@ void macSetVal(const sai_mac_t &value, T &t, int bits = -1){ t->set_value(const_cast(&value[0]), 6); } +void correctIpPrefix(void *ip, const void *mask, size_t length); + int leadingNonZeroBits(const uint32_t ipv4); int leadingNonZeroBits(const sai_ip6_t ipv6); @@ -154,14 +156,20 @@ void ipPrefixSetVal(const sai_ip_prefix_t &value, T &t, int bits = -1){ switch(value.addr_family) { case SAI_IP_ADDR_FAMILY_IPV4: { uint32_t val = value.addr.ip4; + correctIpPrefix(&val, &value.mask.ip4, 4); t->set_value(&val, 4); - val = htonl(val); + val = htonl(value.mask.ip4); + // LPM entry match field prefix length calculation needs to be fixed to accomodate 128 bit size. + // So the 96 is added to the prefix length. t->set_prefix_len(leadingNonZeroBits(val)+96); } break; case SAI_IP_ADDR_FAMILY_IPV6: { - t->set_value(const_cast(&value.addr.ip6[0]), 16); - t->set_prefix_len(leadingNonZeroBits(value.addr.ip6)); + uint8_t ip[16]; + std::copy(const_cast(&value.addr.ip6[0]), const_cast(&value.addr.ip6[0])+16, ip); + correctIpPrefix(ip, value.mask.ip6, 16); + t->set_value(ip, 16); + t->set_prefix_len(leadingNonZeroBits(value.mask.ip6)); } break; default: assert(0 && "unrecognzed value.ipaddr.addr_family"); @@ -218,6 +226,55 @@ void ipaddrrangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = assert (0 && "NYI"); } +const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list); + +template +void u32SetMask(const sai_attribute_value_t &value, T &t, int bits = 32){ + assert(bits <= 32); + uint32_t val = value.u32; + val = htonl(val); + val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_mask(&val, bytes); +} + +template +void u32SetMask(const sai_uint32_t &value, T &t, int bits = 32){ + assert(bits <= 32); + uint32_t val = value; + val = htonl(val); + val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_mask(&val, bytes); +} + +template +void u64SetMask(const sai_attribute_value_t &value, T &t, int bits = 64){ + assert(bits <= 64); + uint64_t val = value.u64; + if (*reinterpret_cast("\0\x01") == 0) { // Little Endian + const uint32_t high_part = htonl(static_cast(val >> 32)); + const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); + val = (static_cast(low_part) << 32) | high_part; + val = val >> (64-bits); + } + int bytes = (bits + 7) / 8; + t->set_value(&val, bytes);} + +template +void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) { + assert(bits <= 64); + uint64_t val = value; + if (*reinterpret_cast("\0\x01") == 0) { // Little Endian + const uint32_t high_part = htonl(static_cast(val >> 32)); + const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); + val = (static_cast(low_part) << 32) | high_part; + val = val >> (64-bits); + } + int bytes = (bits + 7) / 8; + t->set_mask(&val, bytes); +} + grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType); sai_object_id_t NextObjIndex(); diff --git a/dash-pipeline/bmv2/dash_acl.p4 b/dash-pipeline/bmv2/dash_acl.p4 index efc80e395..5e6f618a1 100644 --- a/dash-pipeline/bmv2/dash_acl.p4 +++ b/dash-pipeline/bmv2/dash_acl.p4 @@ -13,6 +13,7 @@ match_kind { range_list } +// #define DASH_MATCH #ifdef DASH_MATCH #define LIST_MATCH list #define RANGE_LIST_MATCH range_list @@ -36,6 +37,8 @@ match_kind { table table_name { \ key = { \ meta. ## table_name ##_dash_acl_group_id : exact @name("meta.dash_acl_group_id:dash_acl_group_id"); \ + meta.dst_tag_map : ternary @name("meta.dst_tag_map:dst_tag"); \ + meta.src_tag_map : ternary @name("meta.src_tag_map:src_tag"); \ meta.dst_ip_addr : LIST_MATCH @name("meta.dst_ip_addr:dip"); \ meta.src_ip_addr : LIST_MATCH @name("meta.src_ip_addr:sip"); \ meta.ip_protocol : LIST_MATCH @name("meta.ip_protocol:protocol"); \ diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index 3d2f2e1c0..e68f1c080 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -3,6 +3,8 @@ #include "dash_headers.p4" +typedef bit<32> tag_map_t; + struct encap_data_t { bit<24> vni; bit<24> dest_vnet_vni; @@ -56,6 +58,8 @@ struct metadata_t { bit<16> stage3_dash_acl_group_id; bit<16> stage4_dash_acl_group_id; bit<16> stage5_dash_acl_group_id; + tag_map_t src_tag_map; + tag_map_t dst_tag_map; } #endif /* _SIRIUS_METADATA_P4_ */ diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index 138e18dd9..ea878e111 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -268,6 +268,34 @@ control dash_ingress( } } + action set_src_tag(tag_map_t tag_map) { + meta.src_tag_map = tag_map; + } + + @name("src_tag|dash_tag") + table src_tag { + key = { + meta.src_ip_addr : lpm @name("meta.src_ip_addr:sip"); + } + actions = { + set_src_tag; + } + } + + action set_dst_tag(tag_map_t tag_map) { + meta.dst_tag_map = tag_map; + } + + @name("dst_tag|dash_tag") + table dst_tag { + key = { + meta.dst_ip_addr : lpm @name("meta.dst_ip_addr:dip"); + } + actions = { + set_dst_tag; + } + } + apply { /* Send packet on same port it arrived (echo) by default */ @@ -348,6 +376,10 @@ control dash_ingress( } acl_group.apply(); + src_tag.apply(); + dst_tag.apply(); + + if (meta.direction == direction_t.OUTBOUND) { outbound.apply(hdr, meta); } else if (meta.direction == direction_t.INBOUND) { diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 860864cfc..c009d795f 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -28,37 +28,37 @@ ###### Revision -| Rev | Date | Author | Change Description | -|:---:|:-----------:|:---------------------:|:------------------------------------| -| 0.1 | 02/01/2022 | Prince Sunny | Initial version | -| 0.2 | 03/09/2022 | Prince Sunny | Packet Flows/DB Objects | -| 0.3 | 05/24/2022 | Oleksandr | Memory Footprints | -| 0.4 | 06/01/2022 | Prince Sunny | Design Considerations | -| 0.5 | 06/13/2022 | Chris Sommers | Schema Relationships | -| 0.6 | 08/05/2022 | Mukesh M Velayudhan | Outbound VNI derivation in pipeline | -| 0.7 | 08/09/2022 | Prince Sunny | Add Inbound Routing rules | -| 0.6 | 04/20/2022 | Marian Pritsak | APP_DB to SAI mapping | -| 0.8 | 09/30/2022 | Prabhat Aravind | Update APP_DB table names | -| 1.0 | 10/10/2022 | Prince Sunny | ST and PL scenarios | -| 1.1 | 01/09/2023 | Prince Sunny | Underlay Routing and ST/PL clarifications | -| 1.2 | 02/12/2023 | Vijay Srinivasan | Metering schema and description | +| Rev | Date | Author | Change Description | +| :---: | :--------: | :-----------------: | :---------------------------------------- | +| 0.1 | 02/01/2022 | Prince Sunny | Initial version | +| 0.2 | 03/09/2022 | Prince Sunny | Packet Flows/DB Objects | +| 0.3 | 05/24/2022 | Oleksandr | Memory Footprints | +| 0.4 | 06/01/2022 | Prince Sunny | Design Considerations | +| 0.5 | 06/13/2022 | Chris Sommers | Schema Relationships | +| 0.6 | 08/05/2022 | Mukesh M Velayudhan | Outbound VNI derivation in pipeline | +| 0.7 | 08/09/2022 | Prince Sunny | Add Inbound Routing rules | +| 0.6 | 04/20/2022 | Marian Pritsak | APP_DB to SAI mapping | +| 0.8 | 09/30/2022 | Prabhat Aravind | Update APP_DB table names | +| 1.0 | 10/10/2022 | Prince Sunny | ST and PL scenarios | +| 1.1 | 01/09/2023 | Prince Sunny | Underlay Routing and ST/PL clarifications | +| 1.2 | 02/12/2023 | Vijay Srinivasan | Metering schema and description | # About this Manual This document provides more detailed design of DASH APIs, DASH orchestration agent, Config and APP DB Schemas and other SONiC buildimage changes required to bring up SONiC image on an appliance card. General DASH HLD can be found at [dash_hld](./dash-high-level-design.md). # Definitions/Abbreviation ###### Table 1: Abbreviations -| | | -|--------------------------|--------------------------------| -| DASH | Disaggregated APIs for SONiC Hosts | -| VNI | Vxlan Network Identifier | -| VTEP | Vxlan Tunnel End Point | -| VNET | Virtual Network | -| ENI | Elastic Network Interface | -| gNMI | gRPC Network Management Interface | -| vPORT | VM's NIC. Eni, Vnic, VPort are used interchangeably | -| ST | Service Tunnel | -| PL | Private Link | +| | | +| ----- | --------------------------------------------------- | +| DASH | Disaggregated APIs for SONiC Hosts | +| VNI | Vxlan Network Identifier | +| VTEP | Vxlan Tunnel End Point | +| VNET | Virtual Network | +| ENI | Elastic Network Interface | +| gNMI | gRPC Network Management Interface | +| vPORT | VM's NIC. Eni, Vnic, VPort are used interchangeably | +| ST | Service Tunnel | +| PL | Private Link | # 1 Requirements Overview @@ -95,22 +95,25 @@ Warm-restart support is not considered in Phase 1. TBD ## 1.4 Scaling requirements Following are the minimal scaling requirements -| Item | Expected value | -|--------------------------|-----------------------------| -| VNETs | 1024* | -| ENI | 64 Per Card | -| Outbound Routes per ENI | 100k | -| Inbound Routes per ENI | 10k** | -| NSGs per ENI | 10*** | -| ACL rules per NSG | 1000 | -| ACL prefixes per ENI | 10x100k | -| Max prefixes per rule | 8k | -| ACL ports per ENI | 10x10k SRC/DST ports | -| CA-PA Mappings | 10M Per Card | -| Active Connections/ENI | 1M (Bidirectional TCP or UDP) | -| Total active connections | 32M (Bidirectional) | -| Metering Buckets per ENI | 4000 | -| CPS | 1.5M | +| Item | Expected value | +| ----------------------------- | ----------------------------- | +| VNETs | 1024* | +| ENI | 64 Per Card | +| Outbound Routes per ENI | 100k | +| Inbound Routes per ENI | 10k** | +| NSGs per ENI | 10*** | +| ACL rules per NSG | 1000 | +| ACL prefixes per ENI | 10x100k | +| Max prefixes per rule | 8k | +| ACL ports per ENI | 10x10k SRC/DST ports | +| Total tags per ENI | 4k | +| Max prefixes per tag | 24k | +| Max tags one prefix belong to | 512 | +| CA-PA Mappings | 10M Per Card | +| Active Connections/ENI | 1M (Bidirectional TCP or UDP) | +| Total active connections | 32M (Bidirectional) | +| Metering Buckets per ENI | 4000 | +| CPS | 1.5M | \* Number of VNET is a software limit as VNET by itself does not take hardware resources. This shall be limited to number of VNI hardware can support @@ -316,8 +319,22 @@ v4_meter_policy_id = IPv4 meter policy ID v6_meter_policy_id = IPv6 meter policy ID ``` -### 3.2.4 ACL - +### 3.2.4 TAG + +``` +DASH_PREFIX_TAG_TABLE:{{tag_name}} + "ip_version": {{ipv4/ipv6}} + "prefix_list": {{list of prefix}} +``` + +``` +tag_name = STRING; unique tag name +addresses = list of ip prefixes ',' separated. valid to have empty list of prefixes. + If the prefix is empty, no packet will be assigned to this TAG. +``` + +### 3.2.5 ACL + ``` DASH_ACL_IN_TABLE:{{eni}}:{{stage}} "acl_group_id": {{group_id}} @@ -344,11 +361,13 @@ DASH_ACL_RULE_TABLE:{{group_id}}:{{rule_num}} "priority": {{priority}} "action": {{action}} "terminating": {{bool}} - "protocol": {{list of protocols}} - "src_addr": {{list of address}} - "dst_addr": {{list of address}} - "src_port": {{list of range of ports}} - "dst_port": {{list of range of ports}} + "protocol": {{list of protocols}} (OPTIONAL) + "src_tag": {{list of tag name}} (OPTIONAL) + "dst_tag": {{list of tag name}} (OPTIONAL) + "src_addr": {{list of prefix}} (OPTIONAL) + "dst_addr": {{list of prefix}} (OPTIONAL) + "src_port": {{list of range of ports}} (OPTIONAL) + "dst_port": {{list of range of ports}} (OPTIONAL) ``` @@ -359,13 +378,15 @@ priority = INT32 value ; priority of the rule, lower the value, action = allow/deny terminating = true/false ; if true, stop processing further rules protocols = list of INT ',' separated; E.g. 6-tcp, 17-udp; if not provided, match on all protocols -src_addr = list of source ip prefixes ',' separated -dst_addr = list of destination ip prefixes ',' separated -src_port = list of range of source ports ',' separated -dst_port = list of range of destination ports ',' separated +src_tag = list of source tag name ',' separated; if not provided, match on all source TAGs or no TAG. +dst_tag = list of destination tag name ',' separated; if not provided, match on all destination TAGs or no TAG. +src_addr = list of source ip prefixes ',' separated; if not provided, match on all source IPs. +dst_addr = list of destination ip prefixes ',' separated; if not provided, match on all destination IPs. +src_port = list of range of source ports ',' separated; if not provided, match on all source ports. +dst_port = list of range of destination ports ',' separated; if not provided, match on all destination ports. ``` -### 3.2.5 ROUTING TYPE +### 3.2.6 ROUTING TYPE ``` DASH_ROUTING_TYPE_TABLE:{{routing_type}}: [ @@ -418,7 +439,7 @@ sip = source ip address, to be used in encap vm_vni = VM VNI that is used for setting direction. Also used for inbound encap to VM ``` -### 3.2.7 ROUTE LPM TABLE - OUTBOUND +### 3.2.8 ROUTE LPM TABLE - OUTBOUND ``` DASH_ROUTE_TABLE:{{eni}}:{{prefix}} @@ -449,7 +470,7 @@ metering_policy_en = bool ; Metering policy lookup enable metering_class = class_id ; Metering class-id, used if metering policy lookup is not enabled ``` -### 3.2.8 ROUTE RULE TABLE - INBOUND +### 3.2.9 ROUTE RULE TABLE - INBOUND ``` DASH_ROUTE_RULE_TABLE:{{eni}}:{{vni}}:{{prefix}} @@ -474,7 +495,7 @@ metering_class = class_id ; Metering class-id region = region_id ; optional region_id which the vni/prefix belongs to as a string for any vendor optimizations ``` -### 3.2.9 VNET MAPPING TABLE +### 3.2.10 VNET MAPPING TABLE ``` DASH_VNET_MAPPING_TABLE:{{vnet}}:{{ip_address}} @@ -548,81 +569,81 @@ rx_counter = bytes ; Number of received bytes (read-only) ### 3.2.11 DASH orchagent (Overlay) -| APP_DB Table | Key | Field | SAI Attributes/*objects* | Comment | -|-----------------------|---------------|------------------|---------------------------------------------------|-------------------------------------------------| -| DASH_APPLIANCE_TABLE | | | | | -| | appliance_id | | | | -| | | sip | sai_vip_entry_t.vip | | -| | | vm_vni | sai_direction_lookup_entry_t.VNI | | -| DASH_VNET_TABLE | | | *SAI_OBJECT_TYPE_VNET* | | -| | vnet_name | | | | -| | | vxlan_tunnel | | VxLAN tunnel won't be used | -| | | vni | SAI_VNET_ATTR_VNI | | -| | | guid | | Not relevant | -| | | address_spaces | | | -| | | peer_list | | | -| DASH_QOS_TABLE | | | | | -| | qos_name | | | | -| | | qos_id | | | -| | | bw | SAI_ENI_ATTR_PPS | | -| | | cps | SAI_ENI_ATTR_CPS | | -| | | flows | SAI_ENI_ATTR_FLOWS | | -| DASH_ENI_TABLE | | | *SAI_OBJECT_TYPE_ENI* | | -| | eni | | | | -| | | eni_id* | SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID | | -| | | mac_address* | sai_eni_ether_address_map_entry_t.address | | -| | | eni_id** | sai_outbound_eni_to_vni_entry_t.ENI | | -| | | qos | | | -| | | vnet** | SAI_ENI_ATTR_VNET_ID | VNET object ID | -| DASH_ACL_V4_IN_TABLE | | | | Same for V6 | -| | eni | | | | -| | | stage | SAI_ENI_ATTR_INBOUND_V4_stage_DASH_ACL_GROUP_ID | STAGE1..STAGE5 | -| | | acl_group_id | SAI_ENI_ATTR_INBOUND_V4_stage_DASH_ACL_GROUP_ID | | -| DASH_ACL_GROUP_TABLE | | | *SAI_OBJECT_TYPE_DASH_ACL_GROUP* | | -| | group_id | | | | -| | | ip_version | SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY | | -| DASH_ACL_RULE_TABLE | | | *SAI_OBJECT_TYPE_DASH_ACL_RULE* | | -| | group_id | | SAI_DASH_ACL_RULE_ATTR_GROUP_ID | | -| | rule_num | | | | -| | | priority | SAI_DASH_ACL_RULE_ATTR_PRIORITY | | -| | | action | SAI_DASH_ACL_RULE_ATTR_ACTION | | -| | | terminating | SAI_DASH_ACL_RULE_ATTR_ACTION | AND_CONTINUE if not terminating | -| | | protocol | SAI_DASH_ACL_RULE_ATTR_PROTOCOL | | -| | | src_addr | SAI_DASH_ACL_RULE_ATTR_SIP | | -| | | dst_addr | SAI_DASH_ACL_RULE_ATTR_DIP | | -| | | dst_port | SAI_DASH_ACL_RULE_ATTR_DST_PORT | | -| | | src_port | SAI_DASH_ACL_RULE_ATTR_SRC_PORT | | -| DASH_ROUTE_TABLE | | | | | -| | eni | | sai_outbound_routing_entry_t.ENI | | -| | prefix | | sai_outbound_routing_entry_t.destination | | -| | | action_type | | Need action type for future cases | -| | | vnet | SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DEST_VNET_VNI | VNI value taken from DASH_VNET table | -| | | appliance | | Not supported yet | -| | | overlay_ip | SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP | | -| | | underlay_ip | | Not supported yet | -| | | overlay_sip | | Not supported yet | -| | | underlay_dip | | Not supported yet | -| | | customer_addr | | Not supported yet | -| | | metering_bucket | SAI_OUTBOUND_ROUTING_ENTRY_ATTR_COUNTER_ID | | -| DASH_MAPPING_TABLE | | | | | -| | vnet | | sai_outbound_ca_to_pa_entry_t.dest_vni | VNET's VNI | -| | ip_address | | sai_outbound_ca_to_pa_entry_t.dip | | -| | | routing_type | | | -| | | underlay_ip | SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP | | -| | | mac_address | SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC | | -| | | metering_bucket | SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_COUNTER_ID | | -| | vnet* | | sai_pa_validation_entry_t.vnet_id | VNET's VNI | -| | | underlay_ip* | sai_pa_validation_entry_t.sip | SAI_PA_VALIDATION_ENTRY_ATTR_ACTION is permit | -| DASH_ROUTE_RULE_TABLE | | | | | -| | eni | | sai_inbound_routing_entry_t.eni_id | | -| | vni | | sai_inbound_routing_entry_t.vni | | -| | prefix | | sai_inbound_routing_entry_t.prefix | | -| | | action_type | | | -| | | priority | sai_inbound_routing_entry_t.priority | | -| | | protocol | | | -| | | vnet | SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID | | -| | | pa_validation | SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION | use PA_VALIDATE if true | -| | | metering_bucket | | | +| APP_DB Table | Key | Field | SAI Attributes/*objects* | Comment | +| --------------------- | ------------ | --------------- | ----------------------------------------------- | --------------------------------------------- | +| DASH_APPLIANCE_TABLE | | | | | +| | appliance_id | | | | +| | | sip | sai_vip_entry_t.vip | | +| | | vm_vni | sai_direction_lookup_entry_t.VNI | | +| DASH_VNET_TABLE | | | *SAI_OBJECT_TYPE_VNET* | | +| | vnet_name | | | | +| | | vxlan_tunnel | | VxLAN tunnel won't be used | +| | | vni | SAI_VNET_ATTR_VNI | | +| | | guid | | Not relevant | +| | | address_spaces | | | +| | | peer_list | | | +| DASH_QOS_TABLE | | | | | +| | qos_name | | | | +| | | qos_id | | | +| | | bw | SAI_ENI_ATTR_PPS | | +| | | cps | SAI_ENI_ATTR_CPS | | +| | | flows | SAI_ENI_ATTR_FLOWS | | +| DASH_ENI_TABLE | | | *SAI_OBJECT_TYPE_ENI* | | +| | eni | | | | +| | | eni_id* | SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID | | +| | | mac_address* | sai_eni_ether_address_map_entry_t.address | | +| | | eni_id** | sai_outbound_eni_to_vni_entry_t.ENI | | +| | | qos | | | +| | | vnet** | SAI_ENI_ATTR_VNET_ID | VNET object ID | +| DASH_ACL_V4_IN_TABLE | | | | Same for V6 | +| | eni | | | | +| | | stage | SAI_ENI_ATTR_INBOUND_V4_stage_DASH_ACL_GROUP_ID | STAGE1..STAGE5 | +| | | acl_group_id | SAI_ENI_ATTR_INBOUND_V4_stage_DASH_ACL_GROUP_ID | | +| DASH_ACL_GROUP_TABLE | | | *SAI_OBJECT_TYPE_DASH_ACL_GROUP* | | +| | group_id | | | | +| | | ip_version | SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY | | +| DASH_ACL_RULE_TABLE | | | *SAI_OBJECT_TYPE_DASH_ACL_RULE* | | +| | group_id | | SAI_DASH_ACL_RULE_ATTR_GROUP_ID | | +| | rule_num | | | | +| | | priority | SAI_DASH_ACL_RULE_ATTR_PRIORITY | | +| | | action | SAI_DASH_ACL_RULE_ATTR_ACTION | | +| | | terminating | SAI_DASH_ACL_RULE_ATTR_ACTION | AND_CONTINUE if not terminating | +| | | protocol | SAI_DASH_ACL_RULE_ATTR_PROTOCOL | | +| | | src_addr | SAI_DASH_ACL_RULE_ATTR_SIP | | +| | | dst_addr | SAI_DASH_ACL_RULE_ATTR_DIP | | +| | | dst_port | SAI_DASH_ACL_RULE_ATTR_DST_PORT | | +| | | src_port | SAI_DASH_ACL_RULE_ATTR_SRC_PORT | | +| DASH_ROUTE_TABLE | | | | | +| | eni | | sai_outbound_routing_entry_t.ENI | | +| | prefix | | sai_outbound_routing_entry_t.destination | | +| | | action_type | | Need action type for future cases | +| | | vnet | SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DEST_VNET_VNI | VNI value taken from DASH_VNET table | +| | | appliance | | Not supported yet | +| | | overlay_ip | SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP | | +| | | underlay_ip | | Not supported yet | +| | | overlay_sip | | Not supported yet | +| | | underlay_dip | | Not supported yet | +| | | customer_addr | | Not supported yet | +| | | metering_bucket | SAI_OUTBOUND_ROUTING_ENTRY_ATTR_COUNTER_ID | | +| DASH_MAPPING_TABLE | | | | | +| | vnet | | sai_outbound_ca_to_pa_entry_t.dest_vni | VNET's VNI | +| | ip_address | | sai_outbound_ca_to_pa_entry_t.dip | | +| | | routing_type | | | +| | | underlay_ip | SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP | | +| | | mac_address | SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC | | +| | | metering_bucket | SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_COUNTER_ID | | +| | vnet* | | sai_pa_validation_entry_t.vnet_id | VNET's VNI | +| | | underlay_ip* | sai_pa_validation_entry_t.sip | SAI_PA_VALIDATION_ENTRY_ATTR_ACTION is permit | +| DASH_ROUTE_RULE_TABLE | | | | | +| | eni | | sai_inbound_routing_entry_t.eni_id | | +| | vni | | sai_inbound_routing_entry_t.vni | | +| | prefix | | sai_inbound_routing_entry_t.prefix | | +| | | action_type | | | +| | | priority | sai_inbound_routing_entry_t.priority | | +| | | protocol | | | +| | | vnet | SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID | | +| | | pa_validation | SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION | use PA_VALIDATE if true | +| | | metering_bucket | | | ## 3.3 Module Interaction @@ -650,24 +671,24 @@ For testing purposes, it is convenient to express test configurations in a singl The following containers shall be enabled for SONiC host and part of the image. Switch specific containers shall be disabled for the image built for the appliance card. -| Container/Feature Name | Is Enabled? | -|--------------------------|-----------------| -| SNMP | Yes | -| Telemetry | Yes | -| LLDP | Yes | -| Syncd | Yes | -| Swss | Yes | -| Database | Yes | -| BGP | Yes | -| Teamd | No | -| Pmon | Yes | -| Nat | No | -| Sflow | No | -| DHCP Relay | No | -| Radv | No | -| Macsec | No | -| Resttapi | No | -| gNMI | Yes | +| Container/Feature Name | Is Enabled? | +| ---------------------- | ----------- | +| SNMP | Yes | +| Telemetry | Yes | +| LLDP | Yes | +| Syncd | Yes | +| Swss | Yes | +| Database | Yes | +| BGP | Yes | +| Teamd | No | +| Pmon | Yes | +| Nat | No | +| Sflow | No | +| DHCP Relay | No | +| Radv | No | +| Macsec | No | +| Resttapi | No | +| gNMI | Yes | ### 3.3.3 DASHOrch (Overlay) A new orchestration agent "dashorch" shall be implemented that subscribes to DASH APP DB objects and programs the ASIC_DB via the SAI DASH API. DASHOrch shall have sub-orchestrations to handle ACLs, Routes, CA-PA mappings. DASH orchestration agent shall write the state of each tables to STATEDB that applications shall utilize to fetch the programmed status of configured objects. @@ -677,81 +698,81 @@ DASH APIs shall be exposed as gNMI interface and part of the SONiC gNMI containe ### 3.3.4 SWSS Lite (Underlay) SONiC for DASH shall have a lite swss initialization without the heavy-lift of existing switch based orchestration agents that SONiC currently have. The initialization shall be based on switch_type "dpu". For the underlay support, the following SAI APIs are expected to be supported: -| Component | SAI attribute | -|--------------------------|-------------------------------------------------------| -| Host Interface | SAI_HOSTIF_ATTR_NAME | -| | SAI_HOSTIF_ATTR_OBJ_ID | -| | SAI_HOSTIF_ATTR_TYPE | -| | SAI_HOSTIF_ATTR_OPER_STATUS | -| | SAI_HOSTIF_TABLE_ENTRY_ATTR_CHANNEL_TYPE | -| | SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF | -| | SAI_HOSTIF_TABLE_ENTRY_ATTR_TRAP_ID | -| | SAI_HOSTIF_TABLE_ENTRY_ATTR_TYPE | -| | SAI_HOSTIF_TRAP_ATTR_PACKET_ACTION | -| | SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP | -| | SAI_HOSTIF_TRAP_ATTR_TRAP_PRIORITY | -| | SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE | -| | SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER | -| | SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE | -| Neighbor | SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS | -| Nexthop | SAI_NEXT_HOP_ATTR_IP | -| | SAI_NEXT_HOP_ATTR_ROUTER_INTERFACE_ID | -| | SAI_NEXT_HOP_ATTR_TYPE | -| Nexthop Group | SAI_NEXT_HOP_GROUP_TYPE_ECMP | -| | SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID | -| | SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID | -| Packet | SAI_PACKET_ACTION_FORWARD | -| | SAI_PACKET_ACTION_TRAP | -| | SAI_PACKET_ACTION_DROP | -| Policer | SAI_POLICER_ATTR_CBS | -| | SAI_POLICER_ATTR_CIR | -| | SAI_POLICER_ATTR_COLOR_SOURCE | -| | SAI_POLICER_ATTR_GREEN_PACKET_ACTION | -| | SAI_POLICER_ATTR_METER_TYPE | -| | SAI_POLICER_ATTR_MODE | -| | SAI_POLICER_ATTR_PBS | -| | SAI_POLICER_ATTR_PIR | -| | SAI_POLICER_ATTR_RED_PACKET_ACTION | -| | SAI_POLICER_ATTR_YELLOW_PACKET_ACTION | -| Port | SAI_PORT_ATTR_ADMIN_STATE | -| | SAI_PORT_ATTR_ADVERTISED_AUTO_NEG_MODE | -| | SAI_PORT_ATTR_ADVERTISED_FEC_MODE | -| | SAI_PORT_ATTR_ADVERTISED_INTERFACE_TYPE | -| | SAI_PORT_ATTR_ADVERTISED_MEDIA_TYPE | -| | SAI_PORT_ATTR_ADVERTISED_SPEED -| | SAI_PORT_ATTR_AUTO_NEG_MODE | -| | SAI_PORT_ATTR_FEC_MODE | -| | SAI_PORT_ATTR_HW_LANE_LIST | -| | SAI_PORT_ATTR_INTERFACE_TYPE | -| | SAI_PORT_ATTR_MTU | -| | SAI_PORT_ATTR_OPER_SPEED | -| | SAI_PORT_ATTR_OPER_STATUS | -| | SAI_PORT_ATTR_SPEED | -| | SAI_PORT_ATTR_SUPPORTED_SPEED | -| RIF | SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_STATE | -| | SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_STATE | -| | SAI_ROUTER_INTERFACE_ATTR_MTU | -| | SAI_ROUTER_INTERFACE_ATTR_PORT_ID | -| | SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS | -| | SAI_ROUTER_INTERFACE_ATTR_TYPE | -| | SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID | -| Route | SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID | -| | SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION | -| Switch | SAI_SWITCH_ATTR_CPU_PORT | -| | SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP | -| | SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID | -| | SAI_SWITCH_ATTR_DEFAULT_VLAN_ID | -| | SAI_SWITCH_ATTR_ECMP_DEFAULT_HASH_SEED | -| | SAI_SWITCH_ATTR_INIT_SWITCH | -| | SAI_SWITCH_ATTR_PORT_LIST | -| | SAI_SWITCH_ATTR_PORT_NUMBER | -| | SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY | -| | SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY | -| | SAI_SWITCH_ATTR_SRC_MAC_ADDRESS | -| | SAI_SWITCH_ATTR_SWITCH_ID | -| | SAI_SWITCH_ATTR_TYPE | -| | SAI_SWITCH_ATTR_VXLAN_DEFAULT_PORT | -| | SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC | +| Component | SAI attribute | +| -------------- | ------------------------------------------------ | +| Host Interface | SAI_HOSTIF_ATTR_NAME | +| | SAI_HOSTIF_ATTR_OBJ_ID | +| | SAI_HOSTIF_ATTR_TYPE | +| | SAI_HOSTIF_ATTR_OPER_STATUS | +| | SAI_HOSTIF_TABLE_ENTRY_ATTR_CHANNEL_TYPE | +| | SAI_HOSTIF_TABLE_ENTRY_ATTR_HOST_IF | +| | SAI_HOSTIF_TABLE_ENTRY_ATTR_TRAP_ID | +| | SAI_HOSTIF_TABLE_ENTRY_ATTR_TYPE | +| | SAI_HOSTIF_TRAP_ATTR_PACKET_ACTION | +| | SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP | +| | SAI_HOSTIF_TRAP_ATTR_TRAP_PRIORITY | +| | SAI_HOSTIF_TRAP_ATTR_TRAP_TYPE | +| | SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER | +| | SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE | +| Neighbor | SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS | +| Nexthop | SAI_NEXT_HOP_ATTR_IP | +| | SAI_NEXT_HOP_ATTR_ROUTER_INTERFACE_ID | +| | SAI_NEXT_HOP_ATTR_TYPE | +| Nexthop Group | SAI_NEXT_HOP_GROUP_TYPE_ECMP | +| | SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID | +| | SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID | +| Packet | SAI_PACKET_ACTION_FORWARD | +| | SAI_PACKET_ACTION_TRAP | +| | SAI_PACKET_ACTION_DROP | +| Policer | SAI_POLICER_ATTR_CBS | +| | SAI_POLICER_ATTR_CIR | +| | SAI_POLICER_ATTR_COLOR_SOURCE | +| | SAI_POLICER_ATTR_GREEN_PACKET_ACTION | +| | SAI_POLICER_ATTR_METER_TYPE | +| | SAI_POLICER_ATTR_MODE | +| | SAI_POLICER_ATTR_PBS | +| | SAI_POLICER_ATTR_PIR | +| | SAI_POLICER_ATTR_RED_PACKET_ACTION | +| | SAI_POLICER_ATTR_YELLOW_PACKET_ACTION | +| Port | SAI_PORT_ATTR_ADMIN_STATE | +| | SAI_PORT_ATTR_ADVERTISED_AUTO_NEG_MODE | +| | SAI_PORT_ATTR_ADVERTISED_FEC_MODE | +| | SAI_PORT_ATTR_ADVERTISED_INTERFACE_TYPE | +| | SAI_PORT_ATTR_ADVERTISED_MEDIA_TYPE | +| | SAI_PORT_ATTR_ADVERTISED_SPEED | +| | SAI_PORT_ATTR_AUTO_NEG_MODE | +| | SAI_PORT_ATTR_FEC_MODE | +| | SAI_PORT_ATTR_HW_LANE_LIST | +| | SAI_PORT_ATTR_INTERFACE_TYPE | +| | SAI_PORT_ATTR_MTU | +| | SAI_PORT_ATTR_OPER_SPEED | +| | SAI_PORT_ATTR_OPER_STATUS | +| | SAI_PORT_ATTR_SPEED | +| | SAI_PORT_ATTR_SUPPORTED_SPEED | +| RIF | SAI_ROUTER_INTERFACE_ATTR_ADMIN_V4_STATE | +| | SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_STATE | +| | SAI_ROUTER_INTERFACE_ATTR_MTU | +| | SAI_ROUTER_INTERFACE_ATTR_PORT_ID | +| | SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS | +| | SAI_ROUTER_INTERFACE_ATTR_TYPE | +| | SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID | +| Route | SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID | +| | SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION | +| Switch | SAI_SWITCH_ATTR_CPU_PORT | +| | SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP | +| | SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID | +| | SAI_SWITCH_ATTR_DEFAULT_VLAN_ID | +| | SAI_SWITCH_ATTR_ECMP_DEFAULT_HASH_SEED | +| | SAI_SWITCH_ATTR_INIT_SWITCH | +| | SAI_SWITCH_ATTR_PORT_LIST | +| | SAI_SWITCH_ATTR_PORT_NUMBER | +| | SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY | +| | SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY | +| | SAI_SWITCH_ATTR_SRC_MAC_ADDRESS | +| | SAI_SWITCH_ATTR_SWITCH_ID | +| | SAI_SWITCH_ATTR_TYPE | +| | SAI_SWITCH_ATTR_VXLAN_DEFAULT_PORT | +| | SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC | ### 3.3.5 Underlay Routing DASH Appliance shall establish BGP session with the connected Peer and advertise the prefixes (VIP PA). In turn, the Peer (e.g, Network device or SmartSwitches) shall advertise default route to appliance. With two Peers connected, the appliance shall have route with gateway towards both Peers and does ECMP routing. Orchagent install the route and resolves the neighbor (GW) mac and programs the underlay route/nexthop and neighbor. @@ -766,23 +787,23 @@ Default DSCP behavior for vxlan or nvgre encap shall be "uniform" model (similar #### 3.3.7.1 SONiC memory usage -| Running components | Memory usage | -|--|--| -|Base Debian OS | 159MB | -|Base Debian OS + docker containers | 1.3GB | +| Running components | Memory usage | +| ---------------------------------- | ------------ | +| Base Debian OS | 159MB | +| Base Debian OS + docker containers | 1.3GB | #### 3.3.7.2 SONiC docker containers memory usage -|Container| Memory usage | -|--|--| -| snmp | 52.5MB | -| telemetry | 88.38MB | -| lldp | 57.07MB | -| syncd\* | 36.36MB | -| swss | 53.5MB | -| bgp | 74.66MB | -| pmon\* | 108.1MB | -| database | 83.56MB | +| Container | Memory usage | +| --------- | ------------ | +| snmp | 52.5MB | +| telemetry | 88.38MB | +| lldp | 57.07MB | +| syncd\* | 36.36MB | +| swss | 53.5MB | +| bgp | 74.66MB | +| pmon\* | 108.1MB | +| database | 83.56MB | \* These containers have vendor-specific components. Their memory usage will vary from vendor to vendor. diff --git a/test/test-cases/functional/ptf/saidashacl.py b/test/test-cases/functional/ptf/saidashacl.py index 88ee23c16..9249d6c51 100644 --- a/test/test-cases/functional/ptf/saidashacl.py +++ b/test/test-cases/functional/ptf/saidashacl.py @@ -6,8 +6,39 @@ from sai_dash_utils import VnetAPI +class Tag(object): + def __init__(self, saithrift, ip, mask, tag): + self.saithrift = saithrift + self.ip = ip + self.mask = mask + self.tag = tag + self.prefix = sai_thrift_ip_prefix_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4=self.ip), + mask=sai_thrift_ip_addr_t(ip4=self.mask)) + self.src_tag_entry = sai_thrift_src_tag_entry_t(switch_id=self.saithrift.switch_id, sip=self.prefix) + self.saithrift.create_entry(sai_thrift_create_src_tag_entry, + sai_thrift_remove_src_tag_entry, self.src_tag_entry, tag_map=self.tag) + self.dst_tag_entry = sai_thrift_dst_tag_entry_t(switch_id=self.saithrift.switch_id, dip=self.prefix) + self.saithrift.create_entry(sai_thrift_create_dst_tag_entry, + sai_thrift_remove_dst_tag_entry, self.dst_tag_entry, tag_map=self.tag) + + class AclRuleTest(object): - def __init__(self, saithrift, acl_group, protocol, sip, dip, priority, action, exp_receive): + def __init__(self, + saithrift, + acl_group, + protocol = 17, + stag = None, + dtag = None, + sip = None, + dip = None, + src_port = 1234, + dst_port = 80, + priority = 1, + action = SAI_DASH_ACL_RULE_ACTION_DENY, + exp_receive = False, + test_sip = None, + test_dip = None): self.saithrift = saithrift self.acl_group = acl_group self.protocol = protocol @@ -16,19 +47,50 @@ def __init__(self, saithrift, acl_group, protocol, sip, dip, priority, action, e self.priority = priority self.action = action self.exp_receive = exp_receive - dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, - addr=sai_thrift_ip_addr_t(ip4=self.dip)) - sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, - addr=sai_thrift_ip_addr_t(ip4=self.sip)) - self.saithrift.create_obj(sai_thrift_create_dash_acl_rule, sai_thrift_remove_dash_acl_rule, - dash_acl_group_id=self.acl_group, protocol=self.protocol, sip=sip, dip=dip, priority=self.priority, action=self.action) + self.stag = stag + self.dtag = dtag + self.src_port = src_port + self.dst_port = dst_port + if self.dip: + dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4=self.dip)) + if self.sip: + sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4=self.sip)) + if self.acl_group is not None: + self.saithrift.create_obj(sai_thrift_create_dash_acl_rule, + sai_thrift_remove_dash_acl_rule, + dash_acl_group_id=self.acl_group, + protocol=self.protocol, + src_tag=self.stag, + src_tag_mask=self.stag, + dst_tag=self.dtag, + dst_tag_mask=self.dtag, + sip=sip, + dip=dip, + src_port = self.src_port, + dst_port = self.dst_port, + priority=self.priority, + action=self.action) + if test_sip: + self.test_sip = test_sip + else: + self.test_sip = self.sip + if test_dip: + self.test_dip = test_dip + else: + self.test_dip = self.dip self.meta = copy.copy(self.__dict__) del self.meta["saithrift"] def runTest(self): - inner_pkt = simple_udp_packet(eth_src=self.saithrift.eni_mac, - ip_dst=self.saithrift.dst_ca_ip, - ip_src=self.sip) + inner_pkt = simple_udp_packet(eth_dst=self.saithrift.dst_ca_mac, + eth_src=self.saithrift.eni_mac, + ip_dst=self.test_dip, + ip_src=self.test_sip, + udp_sport=self.src_port, + udp_dport=self.dst_port + ) vxlan_pkt = simple_vxlan_packet(eth_dst=self.saithrift.our_mac, ip_dst=self.saithrift.vip, ip_src=self.saithrift.src_vm_pa_ip, @@ -38,8 +100,10 @@ def runTest(self): inner_frame=inner_pkt) inner_exp_pkt = simple_udp_packet(eth_dst=self.saithrift.dst_ca_mac, eth_src=self.saithrift.eni_mac, - ip_dst=self.saithrift.dst_ca_ip, - ip_src=self.sip) + ip_dst=self.test_dip, + ip_src=self.test_sip, + udp_sport=self.src_port, + udp_dport=self.dst_port) vxlan_exp_pkt = simple_vxlan_packet(eth_dst="00:00:00:00:00:00", eth_src="00:00:00:00:00:00", ip_dst=self.saithrift.dst_pa_ip, @@ -194,10 +258,74 @@ def setUpSwitch(self): self.ocpe, underlay_dip=underlay_dip, overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni=True) def setupTest(self): - self.tests.append(AclRuleTest(self, acl_group=self.out_v4_stage1_acl_group_id, protocol=17, sip="10.1.1.1", - dip=self.dst_ca_ip, priority=1, action=SAI_DASH_ACL_RULE_ACTION_PERMIT, exp_receive=True)) - self.tests.append(AclRuleTest(self, acl_group=self.out_v4_stage1_acl_group_id, protocol=17, sip="10.1.1.2", - dip=self.dst_ca_ip, priority=2, action=SAI_DASH_ACL_RULE_ACTION_DENY, exp_receive=False)) + self.tests.append(AclRuleTest(self, + acl_group=self.out_v4_stage1_acl_group_id, + protocol=17, + sip="10.1.1.1", + dip=self.dst_ca_ip, + priority=1, + action=SAI_DASH_ACL_RULE_ACTION_PERMIT, + exp_receive=True)) + self.tests.append(AclRuleTest(self, + acl_group=self.out_v4_stage1_acl_group_id, + protocol=17, + sip="10.1.1.2", + dip=self.dst_ca_ip, + priority=2, + action=SAI_DASH_ACL_RULE_ACTION_DENY, + exp_receive=False)) + + self.tag1 = Tag(self, ip = "10.1.2.4", mask = "255.255.255.254", tag = 0x11) + self.tests.append(AclRuleTest(self, + acl_group=self.out_v4_stage1_acl_group_id, + protocol=17, + stag = 0x1, + priority=3, + src_port=1234, + action=SAI_DASH_ACL_RULE_ACTION_PERMIT, + exp_receive=True, + test_sip = "10.1.2.4", + test_dip = self.dst_ca_ip)) + self.tests.append(AclRuleTest(self, + acl_group=None, + exp_receive=True, + src_port=1234, + test_sip = "10.1.2.5", + test_dip = self.dst_ca_ip)) + self.tests.append(AclRuleTest(self, + acl_group=self.out_v4_stage1_acl_group_id, + protocol=17, + stag = 0x10, + priority=3, + src_port=4321, + action=SAI_DASH_ACL_RULE_ACTION_DENY, + exp_receive=False, + test_sip = "10.1.2.4", + test_dip = self.dst_ca_ip)) + self.tests.append(AclRuleTest(self, + acl_group=None, + exp_receive=False, + src_port=4321, + test_sip = "10.1.2.5", + test_dip = self.dst_ca_ip)) + self.tests.append(AclRuleTest(self, + acl_group=None, + exp_receive=False, + src_port=1111, + test_sip = "10.1.2.4", + test_dip = self.dst_ca_ip)) + + self.tag2 = Tag(self, ip = self.dst_ca_ip, mask = "255.255.255.255", tag = 0x100) + self.tests.append(AclRuleTest(self, + acl_group=self.out_v4_stage1_acl_group_id, + protocol=17, + dtag = 0x100, + priority=3, + src_port=2222, + action=SAI_DASH_ACL_RULE_ACTION_PERMIT, + exp_receive=True, + test_sip = "10.1.2.6", + test_dip = self.dst_ca_ip)) def setUp(self): super(SaiThriftDashAclTest, self).setUp() diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py index 1a77ef25b..073a17389 100644 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py @@ -139,6 +139,8 @@ def test_vnet_inbound_simple_create(self, dpu): def test_vnet_inbound_simple_packet_modification(self, dpu, dataplane): """Verify proper packet transformation.""" + dataplane.set_config() + SRC_VM_IP = "10.1.1.10" OUTER_SMAC = "00:00:05:06:06:06" OUR_MAC = "00:00:02:03:04:05" From d50a995525e7f028323af53163e922204bc8a2b6 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 12 Apr 2023 12:18:13 -0700 Subject: [PATCH 11/75] Support SAi attr generation from annotattions (#358) * Support SAi attr generation from annotattions Add support for @sai[] structured annotations for table keys and action parameters. If not available, the old way is still valid till all params and keys will be annotated. Signed-off-by: Marian Pritsak * Create README.md * Update README.md * Update .wordlist.txt * Update saiapi.h.j2 --------- Signed-off-by: Marian Pritsak --- .wordlist.txt | 1 + dash-pipeline/SAI/sai_api_gen.py | 68 +++++++++++++++++------ dash-pipeline/SAI/templates/saiapi.cpp.j2 | 32 +++++------ dash-pipeline/SAI/templates/saiapi.h.j2 | 44 +++++---------- dash-pipeline/bmv2/README.md | 12 ++++ dash-pipeline/bmv2/dash_acl.p4 | 5 +- dash-pipeline/bmv2/dash_pipeline.p4 | 3 +- 7 files changed, 99 insertions(+), 66 deletions(-) create mode 100644 dash-pipeline/bmv2/README.md diff --git a/.wordlist.txt b/.wordlist.txt index 1bd1ea9e4..6d04e5ee9 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -276,6 +276,7 @@ IPv irrespectively ish iso +isresourcetype ISSU iteratively IxExplorer diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index ff67d913d..b7b32992d 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -27,6 +27,36 @@ PARAM_ACTIONS = 'paramActions' OBJECT_NAME_TAG = 'objectName' SCOPE_TAG = 'scope' +STRUCTURED_ANNOTATIONS_TAG = 'structuredAnnotations' +KV_PAIRS_TAG = 'kvPairs' +KV_PAIR_LIST_TAG = 'kvPairList' +SAI_TAG = 'Sai' + +sai_type_to_field = { + 'bool': 'booldata', + 'sai_uint8_t': 'u8', + 'sai_object_id_t': 'u16', + 'sai_uint16_t': 'u16', + 'sai_ip_address_t': 'ipaddr', + 'sai_ip_addr_family_t': 'u32', + 'sai_uint32_t': 'u32', + 'sai_mac_t': 'mac' +} + +def p4_annotation_to_sai_attr(p4rt, sai_attr): + for anno in p4rt[STRUCTURED_ANNOTATIONS_TAG]: + if anno[NAME_TAG] == SAI_TAG: + for kv in anno[KV_PAIR_LIST_TAG][KV_PAIRS_TAG]: + if kv['key'] == 'type': + sai_attr['type'] = kv['value']['stringValue'] + elif kv['key'] == 'isresourcetype': + sai_attr['isresourcetype'] = kv['value']['stringValue'] + elif kv['key'] == 'objects': + sai_attr['objectName'] = kv['value']['stringValue'] + else: + print("Unknown attr annotation " + kv['key']) + exit(1) + sai_attr['field'] = sai_type_to_field[sai_attr['type']] def get_sai_key_type(key_size, key_header, key_field): if key_size == 1: @@ -111,16 +141,19 @@ def get_sai_key_data(key): else: raise ValueError(f'No valid match tag found') - if sai_key_data['match_type'] == 'exact' or sai_key_data['match_type'] == 'optional' or sai_key_data['match_type'] == 'ternary': - sai_key_data['sai_key_type'], sai_key_data['sai_key_field'] = get_sai_key_type(key_size, key_header, key_field) - elif sai_key_data['match_type'] == 'lpm': - sai_key_data['sai_lpm_type'], sai_key_data['sai_lpm_field'] = get_sai_lpm_type(key_size, key_header, key_field) - elif sai_key_data['match_type'] == 'list': - sai_key_data['sai_list_type'], sai_key_data['sai_list_field'] = get_sai_list_type(key_size, key_header, key_field) - elif sai_key_data['match_type'] == 'range_list': - sai_key_data['sai_range_list_type'], sai_key_data['sai_range_list_field'] = get_sai_range_list_type(key_size, key_header, key_field) + if STRUCTURED_ANNOTATIONS_TAG in key: + p4_annotation_to_sai_attr(key, sai_key_data) else: - raise ValueError(f"match_type={sai_key_data['match_type']} is not supported") + if sai_key_data['match_type'] == 'exact' or sai_key_data['match_type'] == 'optional' or sai_key_data['match_type'] == 'ternary': + sai_key_data['type'], sai_key_data['field'] = get_sai_key_type(key_size, key_header, key_field) + elif sai_key_data['match_type'] == 'lpm': + sai_key_data['type'], sai_key_data['field'] = get_sai_lpm_type(key_size, key_header, key_field) + elif sai_key_data['match_type'] == 'list': + sai_key_data['type'], sai_key_data['field'] = get_sai_list_type(key_size, key_header, key_field) + elif sai_key_data['match_type'] == 'range_list': + sai_key_data['type'], sai_key_data['field'] = get_sai_range_list_type(key_size, key_header, key_field) + else: + raise ValueError(f"match_type={sai_key_data['match_type']} is not supported") sai_key_data['bitwidth'] = key_size return sai_key_data @@ -138,7 +171,10 @@ def extract_action_data(program): param = dict() param['id'] = p['id'] param[NAME_TAG] = p[NAME_TAG] - param['type'], param['field'] = get_sai_key_type(int(p[BITWIDTH_TAG]), p[NAME_TAG], p[NAME_TAG]) + if STRUCTURED_ANNOTATIONS_TAG in p: + p4_annotation_to_sai_attr(p, param) + else: + param['type'], param['field'] = get_sai_key_type(int(p[BITWIDTH_TAG]), p[NAME_TAG], p[NAME_TAG]) param['bitwidth'] = p[BITWIDTH_TAG] params.append(param) action_data[id] = {'id': id, NAME_TAG: name, PARAMS_TAG: params} @@ -223,10 +259,10 @@ def generate_sai_apis(program, ignore_tables): break for key in sai_table_data['keys']: - if (key['match_type'] == 'exact' and key['sai_key_type'] == 'sai_ip_address_t') or \ - (key['match_type'] == 'ternary' and key['sai_key_type'] == 'sai_ip_address_t') or \ - (key['match_type'] == 'lpm' and key['sai_lpm_type'] == 'sai_ip_prefix_t') or \ - (key['match_type'] == 'list' and key['sai_list_type'] == 'sai_ip_prefix_list_t'): + if (key['match_type'] == 'exact' and key['type'] == 'sai_ip_address_t') or \ + (key['match_type'] == 'ternary' and key['type'] == 'sai_ip_address_t') or \ + (key['match_type'] == 'lpm' and key['type'] == 'sai_ip_prefix_t') or \ + (key['match_type'] == 'list' and key['type'] == 'sai_ip_prefix_list_t'): sai_table_data['ipaddr_family_attr'] = 'true' param_names = [] @@ -418,8 +454,8 @@ def write_sai_files(sai_api): # Update object name reference for keys for table in sai_api[TABLES_TAG]: for key in table['keys']: - if 'sai_key_type' in key: - if key['sai_key_type'] == 'sai_object_id_t': + if 'type' in key: + if key['type'] == 'sai_object_id_t': table_ref = key['sai_key_name'][:-len("_id")] for table_name in all_table_names: if table_ref.endswith(table_name): diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 483c86d87..92c3edffb 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -70,7 +70,7 @@ sai_status_t sai_create_{{ table.name }}( mf->set_field_id({{table['keys'][0].id}}); objId = NextObjIndex(); auto mf_exact = mf->mutable_exact(); - {{table['keys'][0].sai_key_field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); + {{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); {% else %} // SAI object table with multiple P4 table keys // Copy P4 table keys from appropriate SAI attributes @@ -82,30 +82,30 @@ sai_status_t sai_create_{{ table.name }}( mf->set_field_id({{key.id}}); {% if key.match_type == 'exact' %} auto mf_exact = mf->mutable_exact(); - {{key.sai_key_field}}SetVal(attr_list[i].value, mf_exact, {{key.bitwidth}}); + {{key.field}}SetVal(attr_list[i].value, mf_exact, {{key.bitwidth}}); {% elif key.match_type == 'lpm' %} auto mf_lpm = mf->mutable_lpm(); - {{key.sai_lpm_field}}SetVal(attr_list[i].value, mf_lpm, {{key.bitwidth}}); + {{key.field}}SetVal(attr_list[i].value, mf_lpm, {{key.bitwidth}}); {% elif key.match_type == 'list' %} assert(0 && "mutable_list is not supported"); goto ErrRet; // auto mf1_list = mf1->mutable_xxx(); - //{{key.sai_list_field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); + //{{key.field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); {% elif key.match_type == 'range_list' %} goto ErrRet; assert(0 && "range_list is not supported"); // TODO: if it is ternary, need to set the mask // auto mf1_list = mf1->mutable_xxx(); - //{{key.sai_range_list_field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); + //{{key.field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); {% elif key.match_type == 'optional' %} auto mf_optional = mf->mutable_optional(); - {{key.sai_key_field}}SetVal(attr_list[i].value, mf_optional, {{key.bitwidth}}); + {{key.field}}SetVal(attr_list[i].value, mf_optional, {{key.bitwidth}}); {% elif key.match_type == 'ternary' %} auto mf_ternary = mf->mutable_ternary(); - {{key.sai_key_field}}SetVal(attr_list[i].value, mf_ternary, {{key.bitwidth}}); + {{key.field}}SetVal(attr_list[i].value, mf_ternary, {{key.bitwidth}}); auto mask = getMaskAttr(SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK, attr_count, attr_list); assert(mask && "SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK isn't provided"); - {{key.sai_key_field}}SetMask(mask->value, mf_ternary, {{key.bitwidth}}); + {{key.field}}SetMask(mask->value, mf_ternary, {{key.bitwidth}}); {% endif %} {% if 'v4_or_v6_id' in key %} { @@ -247,21 +247,21 @@ sai_status_t sai_create_{{ table.name }}( mf->set_field_id({{key.id}}); {% if key.match_type == 'exact' %} auto mf_exact = mf->mutable_exact(); - {{key.sai_key_field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); {% elif key.match_type == 'lpm' %} auto mf_lpm = mf->mutable_lpm(); - {{key.sai_lpm_field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_lpm, {{key.bitwidth}}); + {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_lpm, {{key.bitwidth}}); {% elif key.match_type == 'list' %} assert(0 && "mutable_list is not supported"); goto ErrRet; // auto mf1_list = mf1->mutable_xxx(); - //{{key.sai_list_field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); + //{{key.field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); {% elif key.match_type == 'range_list' %} assert(0 && "range_list is not supported"); goto ErrRet; // TODO: if it is ternary, need to set the mask // auto mf1_list = mf1->mutable_xxx(); - //{{key.sai_range_list_field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); + //{{key.field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); {% endif %} } {% if 'v4_or_v6_id' in key %} @@ -352,20 +352,20 @@ sai_status_t sai_remove_{{ table.name }}( mf->set_field_id({{key.id}}); {% if key.match_type == 'exact' %} auto mf_exact = mf->mutable_exact(); - {{key.sai_key_field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); {% elif key.match_type == 'lpm' %} auto mf_lpm = mf->mutable_lpm(); - {{key.sai_lpm_field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_lpm, {{key.bitwidth}}); + {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_lpm, {{key.bitwidth}}); {% elif key.match_type == 'list' %} assert(0 && "mutable_list is not supported"); goto ErrRet; // auto mf1_list = mf1->mutable_xxx(); - //{{key.sai_list_field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); + //{{key.field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); {% elif key.match_type == 'range_list' %} assert(0 && "range_list is not supported"); goto ErrRet; // auto mf1_list = mf1->mutable_xxx(); - //{{key.sai_range_list_field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); + //{{key.field}}SetVal(attr_list[i].value, mf1_list, {{key.bitwidth}}); {% endif %} } {% if 'v4_or_v6_id' in key %} diff --git a/dash-pipeline/SAI/templates/saiapi.h.j2 b/dash-pipeline/SAI/templates/saiapi.h.j2 index 5ada95ffb..fb35c4a41 100644 --- a/dash-pipeline/SAI/templates/saiapi.h.j2 +++ b/dash-pipeline/SAI/templates/saiapi.h.j2 @@ -65,28 +65,18 @@ typedef struct _sai_{{ table.name }}_t {% for key in table['keys'] %} /** * @brief {{ key.match_type | capitalize | replace('Lpm', 'LPM') }} matched key {{ key.sai_key_name }} -{% if key.sai_key_type == 'sai_object_id_t' %} +{% if key.type == 'sai_object_id_t' %} * * @objects SAI_OBJECT_TYPE_{{ key.objectName | upper }} {% endif %} */ -{% if key.match_type == 'lpm' %} - {{ key.sai_lpm_type }} {{ key.sai_key_name | lower }}; -{% elif key.match_type == 'list' %} - {{ key.sai_list_type }} {{ key.sai_key_name | lower }}; -{% elif key.match_type == 'range_list' %} - {{ key.sai_range_list_type }} {{ key.sai_key_name | lower }}; -{% elif key.match_type == 'optional' %} - {{ key.sai_key_type }} {{ key.sai_key_name | lower }}; -{% else %} - {{ key.sai_key_type }} {{ key.sai_key_name | lower }}; -{% endif %} + {{ key.type }} {{ key.sai_key_name | lower }}; {% if key.match_type == 'ternary' %} /** * @brief Ternary key {{ key.sai_key_name }} mask */ - {{ key.sai_key_type }} {{ key.sai_key_name | lower }}_mask; + {{ key.type }} {{ key.sai_key_name | lower }}_mask; {% endif %} {% endfor %} @@ -131,21 +121,16 @@ typedef enum _sai_{{ table.name }}_attr_t /** * @brief {{ key.match_type | capitalize | replace('Lpm', 'LPM') }} matched key {{ key.sai_key_name }} * -{% if key.match_type == 'lpm' %} - * @type {{ key.sai_lpm_type }} -{% elif key.match_type == 'list' %} - * @type {{ key.sai_list_type }} -{% elif key.match_type == 'range_list' %} - * @type {{ key.sai_range_list_type }} -{% else %} - * @type {{ key.sai_key_type }} -{% endif %} + * @type {{ key.type }} * @flags MANDATORY_ON_CREATE | CREATE_ONLY -{% if key.sai_key_type == 'sai_uint16_t' %} +{% if key.type == 'sai_uint16_t' %} * @isvlan false {% endif %} -{% if key.sai_key_type == 'sai_object_id_t' %} +{% if key.type == 'sai_object_id_t' %} * @objects SAI_OBJECT_TYPE_{{ key.sai_key_name | replace('_id', '') | upper }} +{% endif %} +{% if key.isresourcetype == 'true' %} + * @isresourcetype true {% endif %} */ {% if not ns.firstattr %} @@ -159,13 +144,7 @@ typedef enum _sai_{{ table.name }}_attr_t /** * @brief Ternary matched mask {{ key.sai_key_name }} * -{% if key.match_type == 'list' %} - * @type {{ key.sai_list_type }} -{% elif key.match_type == 'range_list' %} - * @type {{ key.sai_range_list_type }} -{% else %} - * @type {{ key.sai_key_type }} -{% endif %} + * @type {{ key.type }} * @flags MANDATORY_ON_CREATE | CREATE_ONLY */ SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK, @@ -203,6 +182,9 @@ typedef enum _sai_{{ table.name }}_attr_t * @validonly {% for action in param.paramActions %}SAI_{{ table.name | upper }}_ATTR_ACTION == SAI_{{ table.name | upper }}_ACTION_{{ action | upper }}{{ " or " if not loop.last else "" }}{% endfor %} {% endif %} +{% endif %} +{% if param.isresourcetype == 'true' %} + * @isresourcetype true {% endif %} */ {% if not ns.firstattr %} diff --git a/dash-pipeline/bmv2/README.md b/dash-pipeline/bmv2/README.md new file mode 100644 index 000000000..8ecf246f4 --- /dev/null +++ b/dash-pipeline/bmv2/README.md @@ -0,0 +1,12 @@ +### P4 annotations for SAI code generation + +SAI API generation now supports P4 annotations for documenting/providing necessary metadata to keys and action parameters. + +Use `@Sai["tag"="value", ...]` format for annotating attributes. Old mode, where `sai_api_gen.py` is guessing this information, is still supported. + +Available tags are: +* type - SAI type +* isresourcetype - generates a corresponding SAI tag +* objects - space separated list of SAI object types this attribute accepts + +More annotations may be added in the future. The infrastructure is extendable. diff --git a/dash-pipeline/bmv2/dash_acl.p4 b/dash-pipeline/bmv2/dash_acl.p4 index 5e6f618a1..6b89958c8 100644 --- a/dash-pipeline/bmv2/dash_acl.p4 +++ b/dash-pipeline/bmv2/dash_acl.p4 @@ -13,7 +13,7 @@ match_kind { range_list } -// #define DASH_MATCH +/* #define DASH_MATCH */ #ifdef DASH_MATCH #define LIST_MATCH list #define RANGE_LIST_MATCH range_list @@ -36,7 +36,8 @@ match_kind { @name(str(table_name##:dash_acl_rule|dash_acl)) \ table table_name { \ key = { \ - meta. ## table_name ##_dash_acl_group_id : exact @name("meta.dash_acl_group_id:dash_acl_group_id"); \ + meta. ## table_name ##_dash_acl_group_id : exact @name("meta.dash_acl_group_id:dash_acl_group_id") \ + @Sai[type="sai_object_id_t", isresourcetype="true", objects="SAI_OBJECT_TYPE_DASH_ACL_GROUP"]; \ meta.dst_tag_map : ternary @name("meta.dst_tag_map:dst_tag"); \ meta.src_tag_map : ternary @name("meta.src_tag_map:src_tag"); \ meta.dst_ip_addr : LIST_MATCH @name("meta.dst_ip_addr:dip"); \ diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index ea878e111..a449b84d8 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -109,6 +109,7 @@ control dash_ingress( bit<32> flows, bit<1> admin_state, IPv4Address vm_underlay_dip, + @Sai[type="sai_uint32_t"] bit<24> vm_vni, bit<16> vnet_id, ACL_GROUPS_PARAM(inbound_v4), @@ -246,7 +247,7 @@ control dash_ingress( const default_action = deny; } - action set_acl_group_attrs(bit<32> ip_addr_family) { + action set_acl_group_attrs(@Sai[type="sai_ip_addr_family_t", isresourcetype="true"] bit<32> ip_addr_family) { if (ip_addr_family == 0) /* SAI_IP_ADDR_FAMILY_IPV4 */ { if (meta.is_overlay_ip_v6 == 1) { meta.dropped = true; From f7edeb1dba52322bf80a46df10fb812737af0622 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 12 Apr 2023 12:53:46 -0700 Subject: [PATCH 12/75] Add ST route type (#308) * Add ST route type, behavioral model. --- dash-pipeline/SAI/sai_api_gen.py | 56 ++++++++++++++++- dash-pipeline/SAI/templates/saiapi.h.j2 | 2 + dash-pipeline/SAI/templates/saienums.j2 | 10 +++ dash-pipeline/SAI/templates/utils.h.j2 | 10 +++ dash-pipeline/bmv2/dash_conntrack.p4 | 25 +++++--- dash-pipeline/bmv2/dash_headers.p4 | 18 ++++++ dash-pipeline/bmv2/dash_inbound.p4 | 6 ++ dash-pipeline/bmv2/dash_metadata.p4 | 8 ++- dash-pipeline/bmv2/dash_nvgre.p4 | 77 +++++++++++++++++++++++ dash-pipeline/bmv2/dash_outbound.p4 | 59 +++++++++++++++++ dash-pipeline/bmv2/dash_parser.p4 | 2 + dash-pipeline/bmv2/dash_pipeline.p4 | 19 +++--- dash-pipeline/bmv2/dash_service_tunnel.p4 | 16 +++-- 13 files changed, 279 insertions(+), 29 deletions(-) create mode 100644 dash-pipeline/SAI/templates/saienums.j2 create mode 100644 dash-pipeline/bmv2/dash_nvgre.p4 diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index b7b32992d..6502a2cd8 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -27,6 +27,9 @@ PARAM_ACTIONS = 'paramActions' OBJECT_NAME_TAG = 'objectName' SCOPE_TAG = 'scope' +TYPE_INFO_TAG = 'typeInfo' +SERIALIZABLE_ENUMS_TAG = 'serializableEnums' +MEMBERS_TAG = 'members' STRUCTURED_ANNOTATIONS_TAG = 'structuredAnnotations' KV_PAIRS_TAG = 'kvPairs' KV_PAIR_LIST_TAG = 'kvPairList' @@ -161,6 +164,7 @@ def get_sai_key_data(key): def extract_action_data(program): action_data = {} + sai_enums = get_sai_enums(program) for action in program[ACTIONS_TAG]: preable = action[PREAMBLE_TAG] id = preable['id'] @@ -175,6 +179,11 @@ def extract_action_data(program): p4_annotation_to_sai_attr(p, param) else: param['type'], param['field'] = get_sai_key_type(int(p[BITWIDTH_TAG]), p[NAME_TAG], p[NAME_TAG]) + for sai_enum in sai_enums: + if param[NAME_TAG] == sai_enum['name']: + param['type'] = 'sai_' + param[NAME_TAG] + '_t' + param['field'] = 's32' + param['default'] = 'SAI_' + param[NAME_TAG].upper() + '_INVALID' param['bitwidth'] = p[BITWIDTH_TAG] params.append(param) action_data[id] = {'id': id, NAME_TAG: name, PARAMS_TAG: params} @@ -212,10 +221,29 @@ def fill_action_params(table_params, param_names, action): param2["v4_or_v6_id"] = param['id'] break + +def get_sai_enums(program): + all_enums = program[TYPE_INFO_TAG][SERIALIZABLE_ENUMS_TAG] + sai_enums = [] + for enum_name in all_enums: + sai_enum = dict() + sai_enum['name'] = enum_name[:-2] + sai_enum['members'] = [] + print(enum_name) + for enum_member in all_enums[enum_name][MEMBERS_TAG]: + member = dict() + member['sai_name'] = enum_member['name'] + member['p4rt_value'] = enum_member['value'] + sai_enum['members'].append(member) + sai_enums.append(sai_enum) + + return sai_enums + def generate_sai_apis(program, ignore_tables): sai_apis = [] table_names = [] all_actions = extract_action_data(program) + sai_enums = get_sai_enums(program) tables = sorted(program[TABLES_TAG], key=lambda k: k[PREAMBLE_TAG][NAME_TAG]) for table in tables: sai_table_data = dict() @@ -294,7 +322,7 @@ def generate_sai_apis(program, ignore_tables): new_api[TABLES_TAG] = [sai_table_data] sai_apis.append(new_api) - return sai_apis, table_names + return sai_apis, table_names, sai_enums def get_uniq_sai_api(sai_api): """ Only keep one table per group(with same table name) """ @@ -419,7 +447,6 @@ def write_sai_files(sai_api): f.write(''.join(new_lines)) - # CLI parser = argparse.ArgumentParser(description='P4 SAI API generator') parser.add_argument('filepath', type=str, help='Path to P4 program RUNTIME JSON file') @@ -438,7 +465,7 @@ def write_sai_files(sai_api): with open(args.filepath) as json_program_file: json_program = json.load(json_program_file) -sai_apis, all_table_names = generate_sai_apis(json_program, args.ignore_tables.split(',')) +sai_apis, all_table_names, sai_enums = generate_sai_apis(json_program, args.ignore_tables.split(',')) sai_api_name_list = [] sai_api_full_name_list = [] @@ -466,6 +493,29 @@ def write_sai_files(sai_api): sai_api_name_list.append(sai_api['app_name'].replace('_', '')) sai_api_full_name_list.append(sai_api['app_name']) +env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) +env.add_extension('jinja2.ext.loopcontrols') +env.add_extension('jinja2.ext.do') +sai_enums_tm = env.get_template('templates/saienums.j2') +sai_enums_str = sai_enums_tm.render(sai_enums = sai_enums) +sai_enums_lines = sai_enums_str.split('\n') + +# The SAI object struct for entries +with open('./SAI/experimental/saitypesextensions.h', 'r') as f: + lines = f.readlines() + +new_lines = [] +for line in lines: + if '/* __SAITYPESEXTENSIONS_H_ */' in line: + for enum_line in sai_enums_lines: + new_lines.append(enum_line + '\n') + new_lines = new_lines[:-1] + new_lines.append(line) + +with open('./SAI/experimental/saitypesextensions.h', 'w') as f: + f.write(''.join(new_lines)) + + write_sai_makefile(sai_api_name_list, sai_api_full_name_list) write_sai_fixed_api_files(sai_api_full_name_list) diff --git a/dash-pipeline/SAI/templates/saiapi.h.j2 b/dash-pipeline/SAI/templates/saiapi.h.j2 index fb35c4a41..71e4adf7c 100644 --- a/dash-pipeline/SAI/templates/saiapi.h.j2 +++ b/dash-pipeline/SAI/templates/saiapi.h.j2 @@ -174,6 +174,8 @@ typedef enum _sai_{{ table.name }}_attr_t * @objects SAI_OBJECT_TYPE_{{ param.objectName | upper }} * @allownull true * @default SAI_NULL_OBJECT_ID +{% elif param.field == 's32' %} + * @default {{ param.default }} {% else %} * @default 0 {% endif %} diff --git a/dash-pipeline/SAI/templates/saienums.j2 b/dash-pipeline/SAI/templates/saienums.j2 new file mode 100644 index 000000000..fd47e261c --- /dev/null +++ b/dash-pipeline/SAI/templates/saienums.j2 @@ -0,0 +1,10 @@ +{% for enum in sai_enums %} +typedef enum _sai_{{ enum.name }}_t +{ +{% for member in enum.members %} + SAI_{{ enum.name | upper }}_{{ member.sai_name | upper }}, + +{% endfor %} +} sai_{{ enum.name }}_t; + +{% endfor %} diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/templates/utils.h.j2 index 8746c6ad5..3cd47d08e 100644 --- a/dash-pipeline/SAI/templates/utils.h.j2 +++ b/dash-pipeline/SAI/templates/utils.h.j2 @@ -72,6 +72,16 @@ void u32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32){ t->set_value(&val, bytes); } +template +void s32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32){ + assert(bits <= 32); + uint32_t val = value.u32; + val = htonl(val); + val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_value(&val, bytes); +} + template void u32SetVal(const sai_uint32_t &value, T &t, int bits = 32){ assert(bits <= 32); diff --git a/dash-pipeline/bmv2/dash_conntrack.p4 b/dash-pipeline/bmv2/dash_conntrack.p4 index 132373951..09b43054f 100644 --- a/dash-pipeline/bmv2/dash_conntrack.p4 +++ b/dash-pipeline/bmv2/dash_conntrack.p4 @@ -11,11 +11,11 @@ const ExpireTimeProfileId_t EXPIRE_TIME_PROFILE_NOW = (ExpireTimeProfileId_t) const ExpireTimeProfileId_t EXPIRE_TIME_PROFILE_LONG = (ExpireTimeProfileId_t) 2; IPv4Address directionNeutralAddr ( - in direction_t direction, + in dash_direction_t direction, in IPv4Address outbound_address, in IPv4Address inbound_address) { - if (direction == direction_t.OUTBOUND) { + if (direction == dash_direction_t.OUTBOUND) { return outbound_address; } else { return inbound_address; @@ -23,11 +23,11 @@ IPv4Address directionNeutralAddr ( } bit<16> directionNeutralPort ( - in direction_t direction, + in dash_direction_t direction, in bit<16> outbound_port, in bit<16> inbound_port) { - if (direction == direction_t.OUTBOUND) { + if (direction == dash_direction_t.OUTBOUND) { return outbound_port; } else { return inbound_port; @@ -38,7 +38,8 @@ bit<16> directionNeutralPort ( control ConntrackIn(inout headers_t hdr, inout metadata_t meta) { - action conntrackIn_allow () { + + action conntrackIn_allow (IPv4Address original_overlay_sip, IPv4Address original_overlay_dip) { /* Invalidate entry based on TCP flags */ // If FIN is 1 (0b000001), or if RST is 1 (0b000100): if ((hdr.tcp.flags & 0b000101 /* FIN/RST */) != 0) { @@ -47,14 +48,18 @@ control ConntrackIn(inout headers_t hdr, } restart_expire_timer(); // reset expiration timer for entry meta.conntrack_data.allow_in = true; + meta.encap_data.original_overlay_sip = original_overlay_sip; + meta.encap_data.original_overlay_dip = original_overlay_dip; } action conntrackIn_miss() { // TODO: Should this be ((hdr.tcp.flags & 0x2) != 0) instead? if (hdr.tcp.flags == 0x2 /* SYN */) { - if (meta.direction == direction_t.OUTBOUND) { + if (meta.direction == dash_direction_t.OUTBOUND) { // New PNA Extern - add_entry("conntrackIn_allow", {}, EXPIRE_TIME_PROFILE_LONG); + add_entry("conntrackIn_allow", + {meta.encap_data.original_overlay_sip, meta.encap_data.original_overlay_dip}, + EXPIRE_TIME_PROFILE_LONG); //adding failure to be eventually handled } } @@ -105,7 +110,7 @@ control ConntrackOut(inout headers_t hdr, action conntrackOut_miss() { // TODO: Should this be ((hdr.tcp.flags & 0x2) != 0) instead? if (hdr.tcp.flags == 0x2 /* SYN */) { - if (meta.direction == direction_t.INBOUND) { + if (meta.direction == dash_direction_t.INBOUND) { // New PNA Extern add_entry("conntrackOut_allow", {}, EXPIRE_TIME_PROFILE_LONG); //adding failure to be eventually handled @@ -158,7 +163,7 @@ state_graph ConnGraphOut(inout state_context flow_ctx, return; } - if (meta.direction == direction_t.INBOUND) { + if (meta.direction == dash_direction_t.INBOUND) { transition ALLOW; } } @@ -184,7 +189,7 @@ state_graph ConnGraphIn(inout state_context flow_ctx, return; } - if (meta.direction == direction_t.OUTBOUND) { + if (meta.direction == dash_direction_t.OUTBOUND) { transition ALLOW; } } diff --git a/dash-pipeline/bmv2/dash_headers.p4 b/dash-pipeline/bmv2/dash_headers.p4 index 686dcaa3b..7ac84b14b 100644 --- a/dash-pipeline/bmv2/dash_headers.p4 +++ b/dash-pipeline/bmv2/dash_headers.p4 @@ -53,6 +53,17 @@ header vxlan_t { const bit<16> VXLAN_HDR_SIZE=64/8; +header nvgre_t { + bit<4> flags; + bit<9> reserved; + bit<3> version; + bit<16> protocol_type; + bit<24> vsid; + bit<8> flow_id; +} + +const bit<16> NVGRE_HDR_SIZE=64/8; + header tcp_t { bit<16> src_port; bit<16> dst_port; @@ -90,6 +101,7 @@ struct headers_t { udp_t udp; tcp_t tcp; vxlan_t vxlan; + nvgre_t nvgre; ethernet_t inner_ethernet; ipv4_t inner_ipv4; ipv6_t inner_ipv6; @@ -97,4 +109,10 @@ struct headers_t { tcp_t inner_tcp; } +enum bit<16> dash_encapsulation_t { + INVALID = 0, + VXLAN = 1, + NVGRE = 2 +} + #endif /* _SIRIUS_HEADERS_P4_ */ diff --git a/dash-pipeline/bmv2/dash_inbound.p4 b/dash-pipeline/bmv2/dash_inbound.p4 index a7f37da6f..9e69f6097 100644 --- a/dash-pipeline/bmv2/dash_inbound.p4 +++ b/dash-pipeline/bmv2/dash_inbound.p4 @@ -16,6 +16,12 @@ control inbound(inout headers_t hdr, #endif /* STATEFUL_P4 */ #ifdef PNA_CONNTRACK ConntrackIn.apply(hdr, meta); + + if (meta.encap_data.original_overlay_sip != 0) { + service_tunnel_decode(hdr, + meta.encap_data.original_overlay_sip, + meta.encap_data.original_overlay_dip); + } #endif // PNA_CONNTRACK /* ACL */ diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index e68f1c080..444ed5153 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -13,9 +13,13 @@ struct encap_data_t { EthernetAddress underlay_smac; EthernetAddress underlay_dmac; EthernetAddress overlay_dmac; + dash_encapsulation_t dash_encapsulation; + bit<24> service_tunnel_key; + IPv4Address original_overlay_sip; + IPv4Address original_overlay_dip; } -enum bit<16> direction_t { +enum bit<16> dash_direction_t { INVALID = 0, OUTBOUND = 1, INBOUND = 2 @@ -35,7 +39,7 @@ struct eni_data_t { struct metadata_t { bool dropped; - direction_t direction; + dash_direction_t direction; encap_data_t encap_data; EthernetAddress eni_addr; bit<16> vnet_id; diff --git a/dash-pipeline/bmv2/dash_nvgre.p4 b/dash-pipeline/bmv2/dash_nvgre.p4 new file mode 100644 index 000000000..add4b65f4 --- /dev/null +++ b/dash-pipeline/bmv2/dash_nvgre.p4 @@ -0,0 +1,77 @@ +#ifndef _DASH_NVGRE_P4_ +#define _DASH_NVGRE_P4_ + +#include "dash_headers.p4" + +action nvgre_encap(inout headers_t hdr, + in EthernetAddress underlay_dmac, + in EthernetAddress underlay_smac, + in IPv4Address underlay_dip, + in IPv4Address underlay_sip, + in EthernetAddress overlay_dmac, + in bit<24> vsid) { + hdr.inner_ethernet = hdr.ethernet; + hdr.inner_ethernet.dst_addr = overlay_dmac; + hdr.ethernet.setInvalid(); + + hdr.inner_ipv4 = hdr.ipv4; + hdr.ipv4.setInvalid(); + hdr.inner_ipv6 = hdr.ipv6; + hdr.ipv6.setInvalid(); + hdr.inner_tcp = hdr.tcp; + hdr.tcp.setInvalid(); + hdr.inner_udp = hdr.udp; + hdr.udp.setInvalid(); + + hdr.ethernet.setValid(); + hdr.ethernet.dst_addr = underlay_dmac; + hdr.ethernet.src_addr = underlay_smac; + hdr.ethernet.ether_type = IPV4_ETHTYPE; + + hdr.ipv4.setValid(); + hdr.ipv4.version = 4; + hdr.ipv4.ihl = 5; + hdr.ipv4.diffserv = 0; +#ifdef TARGET_BMV2_V1MODEL + hdr.ipv4.total_len = hdr.inner_ipv4.total_len*(bit<16>)(bit<1>)hdr.inner_ipv4.isValid() + \ + hdr.inner_ipv6.payload_length*(bit<16>)(bit<1>)hdr.inner_ipv6.isValid() + \ + IPV6_HDR_SIZE*(bit<16>)(bit<1>)hdr.inner_ipv6.isValid() + \ + ETHER_HDR_SIZE + \ + IPV4_HDR_SIZE + \ + NVGRE_HDR_SIZE; +#endif // TARGET_BMV2_V1MODEL +#ifdef TARGET_DPDK_PNA + // p4c-dpdk as of 2023-Jan-26 does not support multplication of + // run-time variable values. It does support 'if' statements + // inside of P4 action bodies. + bit<16> inner_ip_len = 0; + if (hdr.inner_ipv4.isValid()) { + inner_ip_len = inner_ip_len + hdr.inner_ipv4.total_len; + } + if (hdr.inner_ipv6.isValid()) { + inner_ip_len = (inner_ip_len + IPV6_HDR_SIZE + + hdr.inner_ipv6.payload_length); + } + hdr.ipv4.total_len = (ETHER_HDR_SIZE + IPV4_HDR_SIZE + UDP_HDR_SIZE + + NVGRE_HDR_SIZE + inner_ip_len); +#endif // TARGET_DPDK_PNA + hdr.ipv4.identification = 1; + hdr.ipv4.flags = 0; + hdr.ipv4.frag_offset = 0; + hdr.ipv4.ttl = 64; + hdr.ipv4.protocol = NVGRE_PROTO; + hdr.ipv4.dst_addr = underlay_dip; + hdr.ipv4.src_addr = underlay_sip; + hdr.ipv4.hdr_checksum = 0; + + hdr.nvgre.setValid(); + hdr.nvgre.flags = 4; + hdr.nvgre.reserved = 0; + hdr.nvgre.version = 0; + hdr.nvgre.protocol_type = 0x6558; + hdr.nvgre.vsid = vsid; + hdr.nvgre.flow_id = 0; + +} + +#endif /* _DASH_NVGRE_P4_ */ diff --git a/dash-pipeline/bmv2/dash_outbound.p4 b/dash-pipeline/bmv2/dash_outbound.p4 index d2bb3b3d4..05857c5ea 100644 --- a/dash-pipeline/bmv2/dash_outbound.p4 +++ b/dash-pipeline/bmv2/dash_outbound.p4 @@ -4,6 +4,7 @@ #include "dash_headers.p4" #include "dash_acl.p4" #include "dash_conntrack.p4" +#include "dash_service_tunnel.p4" control outbound(inout headers_t hdr, inout metadata_t meta) @@ -28,7 +29,43 @@ control outbound(inout headers_t hdr, meta.dropped = true; } + action route_service_tunnel(bit<1> is_overlay_dip_v4_or_v6, + IPv4ORv6Address overlay_dip, + bit<1> is_overlay_dip_mask_v4_or_v6, + IPv4ORv6Address overlay_dip_mask, + bit<1> is_overlay_sip_v4_or_v6, + IPv4ORv6Address overlay_sip, + bit<1> is_overlay_sip_mask_v4_or_v6, + IPv4ORv6Address overlay_sip_mask, + bit<1> is_underlay_dip_v4_or_v6, + IPv4ORv6Address underlay_dip, + bit<1> is_underlay_sip_v4_or_v6, + IPv4ORv6Address underlay_sip, + dash_encapsulation_t dash_encapsulation, + bit<24> tunnel_key) { + /* Assume the overlay addresses provided are always IPv6 and the original are IPv4 */ + /* assert(is_overlay_dip_v4_or_v6 == 1 && is_overlay_sip_v4_or_v6 == 1); + assert(is_overlay_dip_mask_v4_or_v6 == 1 && is_overlay_sip_mask_v4_or_v6 == 1); + assert(is_underlay_dip_v4_or_v6 != 1 && is_underlay_sip_v4_or_v6 != 1); */ + meta.encap_data.original_overlay_dip = hdr.ipv4.src_addr; + meta.encap_data.original_overlay_sip = hdr.ipv4.dst_addr; + + service_tunnel_encode(hdr, + overlay_dip, + overlay_dip_mask, + overlay_sip, + overlay_sip_mask); + + /* encapsulation will be done in apply block based on dash_encapsulation */ + meta.encap_data.underlay_dip = underlay_dip == 0 ? meta.encap_data.original_overlay_dip : (IPv4Address)underlay_dip; + meta.encap_data.underlay_sip = underlay_sip == 0 ? meta.encap_data.original_overlay_sip : (IPv4Address)underlay_sip; + meta.encap_data.overlay_dmac = hdr.ethernet.dst_addr; + meta.encap_data.dash_encapsulation = dash_encapsulation; + meta.encap_data.service_tunnel_key = tunnel_key; + } + #ifdef TARGET_BMV2_V1MODEL + direct_counter(CounterType.packets_and_bytes) routing_counter; #endif // TARGET_BMV2_V1MODEL #ifdef TARGET_DPDK_PNA @@ -50,6 +87,7 @@ control outbound(inout headers_t hdr, route_vnet; /* for expressroute - ecmp of overlay */ route_vnet_direct; route_direct; + route_service_tunnel; drop; } const default_action = drop; @@ -161,6 +199,27 @@ control outbound(inout headers_t hdr, meta.encap_data.overlay_dmac, meta.encap_data.vni); } + route_service_tunnel: { + if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + vxlan_encap(hdr, + meta.encap_data.underlay_dmac, + meta.encap_data.underlay_smac, + meta.encap_data.underlay_dip, + meta.encap_data.underlay_sip, + meta.encap_data.overlay_dmac, + meta.encap_data.service_tunnel_key); + } else if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) { + nvgre_encap(hdr, + meta.encap_data.underlay_dmac, + meta.encap_data.underlay_smac, + meta.encap_data.underlay_dip, + meta.encap_data.underlay_sip, + meta.encap_data.overlay_dmac, + meta.encap_data.service_tunnel_key); + } else { + drop(); + } + } } } } diff --git a/dash-pipeline/bmv2/dash_parser.p4 b/dash-pipeline/bmv2/dash_parser.p4 index ec2101aab..8e4d07ba2 100644 --- a/dash-pipeline/bmv2/dash_parser.p4 +++ b/dash-pipeline/bmv2/dash_parser.p4 @@ -12,6 +12,7 @@ error { #define UDP_PORT_VXLAN 4789 #define UDP_PROTO 17 #define TCP_PROTO 6 +#define NVGRE_PROTO 0x2f #define IPV4_ETHTYPE 0x0800 #define IPV6_ETHTYPE 0x86dd @@ -144,6 +145,7 @@ control dash_deparser( packet.emit(hdr.udp); packet.emit(hdr.tcp); packet.emit(hdr.vxlan); + packet.emit(hdr.nvgre); packet.emit(hdr.inner_ethernet); packet.emit(hdr.inner_ipv4); packet.emit(hdr.inner_ipv6); diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index a449b84d8..24fa1052f 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -5,6 +5,7 @@ #include "dash_metadata.p4" #include "dash_parser.p4" #include "dash_vxlan.p4" +#include "dash_nvgre.p4" #include "dash_outbound.p4" #include "dash_inbound.p4" #include "dash_conntrack.p4" @@ -52,11 +53,11 @@ control dash_ingress( } action set_outbound_direction() { - meta.direction = direction_t.OUTBOUND; + meta.direction = dash_direction_t.OUTBOUND; } action set_inbound_direction() { - meta.direction = direction_t.INBOUND; + meta.direction = dash_direction_t.INBOUND; } @name("direction_lookup|dash_direction_lookup") @@ -127,13 +128,13 @@ control dash_ingress( meta.vnet_id = vnet_id; if (meta.is_overlay_ip_v6 == 1) { - if (meta.direction == direction_t.OUTBOUND) { + if (meta.direction == dash_direction_t.OUTBOUND) { ACL_GROUPS_COPY_TO_META(outbound_v6); } else { ACL_GROUPS_COPY_TO_META(inbound_v6); } } else { - if (meta.direction == direction_t.OUTBOUND) { + if (meta.direction == dash_direction_t.OUTBOUND) { ACL_GROUPS_COPY_TO_META(outbound_v4); } else { ACL_GROUPS_COPY_TO_META(inbound_v4); @@ -330,9 +331,9 @@ control dash_ingress( /* Outer header processing */ - if (meta.direction == direction_t.OUTBOUND) { + if (meta.direction == dash_direction_t.OUTBOUND) { vxlan_decap(hdr); - } else if (meta.direction == direction_t.INBOUND) { + } else if (meta.direction == dash_direction_t.INBOUND) { switch (inbound_routing.apply().action_run) { vxlan_decap_pa_validate: { pa_validation.apply(); @@ -367,7 +368,7 @@ control dash_ingress( /* At this point the processing is done on customer headers */ /* Put VM's MAC in the direction agnostic metadata field */ - meta.eni_addr = meta.direction == direction_t.OUTBOUND ? + meta.eni_addr = meta.direction == dash_direction_t.OUTBOUND ? hdr.ethernet.src_addr : hdr.ethernet.dst_addr; eni_ether_address_map.apply(); @@ -381,9 +382,9 @@ control dash_ingress( dst_tag.apply(); - if (meta.direction == direction_t.OUTBOUND) { + if (meta.direction == dash_direction_t.OUTBOUND) { outbound.apply(hdr, meta); - } else if (meta.direction == direction_t.INBOUND) { + } else if (meta.direction == dash_direction_t.INBOUND) { inbound.apply(hdr, meta); } diff --git a/dash-pipeline/bmv2/dash_service_tunnel.p4 b/dash-pipeline/bmv2/dash_service_tunnel.p4 index 21a27210f..6ab72fd2b 100644 --- a/dash-pipeline/bmv2/dash_service_tunnel.p4 +++ b/dash-pipeline/bmv2/dash_service_tunnel.p4 @@ -5,8 +5,10 @@ /* Encodes V4 in V6 */ action service_tunnel_encode(inout headers_t hdr, - in IPv6Address st_dst_prefix, - in IPv6Address st_src_prefix) { + in IPv6Address st_dst, + in IPv6Address st_dst_mask, + in IPv6Address st_src, + in IPv6Address st_src_mask) { hdr.ipv6.setValid(); hdr.ipv6.version = 6; hdr.ipv6.traffic_class = 0; @@ -14,15 +16,17 @@ action service_tunnel_encode(inout headers_t hdr, hdr.ipv6.payload_length = hdr.ipv4.total_len - IPV4_HDR_SIZE; hdr.ipv6.next_header = hdr.ipv4.protocol; hdr.ipv6.hop_limit = hdr.ipv4.ttl; - hdr.ipv6.dst_addr = (IPv6Address)hdr.ipv4.dst_addr + st_dst_prefix; - hdr.ipv6.src_addr = (IPv6Address)hdr.ipv4.src_addr + st_src_prefix; + hdr.ipv6.dst_addr = ((IPv6Address)hdr.ipv4.dst_addr & ~st_dst_mask) | (st_dst & st_dst_mask); + hdr.ipv6.src_addr = ((IPv6Address)hdr.ipv4.src_addr & ~st_src_mask) | (st_src & st_src_mask); hdr.ipv4.setInvalid(); hdr.ethernet.ether_type = IPV6_ETHTYPE; } /* Decodes V4 from V6 */ -action service_tunnel_decode(inout headers_t hdr) { +action service_tunnel_decode(inout headers_t hdr, + in IPv4Address src, + in IPv4Address dst) { hdr.ipv4.setValid(); hdr.ipv4.version = 4; hdr.ipv4.ihl = 5; @@ -34,6 +38,8 @@ action service_tunnel_decode(inout headers_t hdr) { hdr.ipv4.protocol = hdr.ipv6.next_header; hdr.ipv4.ttl = hdr.ipv6.hop_limit; hdr.ipv4.hdr_checksum = 0; + hdr.ipv4.dst_addr = dst; + hdr.ipv4.src_addr = src; hdr.ipv6.setInvalid(); hdr.ethernet.ether_type = IPV4_ETHTYPE; From d82407b48b89a301aa4dd062832f56b259f772db Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 13 Apr 2023 23:43:12 +0800 Subject: [PATCH 13/75] [Sonic hld] Update for tag behavior, drop routing type (#359) * Reword the description for no tag behavior, add missed type for routing type --- documentation/general/dash-sonic-hld.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index c009d795f..ed7e10c2d 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -378,8 +378,8 @@ priority = INT32 value ; priority of the rule, lower the value, action = allow/deny terminating = true/false ; if true, stop processing further rules protocols = list of INT ',' separated; E.g. 6-tcp, 17-udp; if not provided, match on all protocols -src_tag = list of source tag name ',' separated; if not provided, match on all source TAGs or no TAG. -dst_tag = list of destination tag name ',' separated; if not provided, match on all destination TAGs or no TAG. +src_tag = list of source tag name ',' separated; if not provided, match on ANY tag or NO tag. +dst_tag = list of destination tag name ',' separated; if not provided, match on ANY tag or NO tag. src_addr = list of source ip prefixes ',' separated; if not provided, match on all source IPs. dst_addr = list of destination ip prefixes ',' separated; if not provided, match on all destination IPs. src_port = list of range of source ports ',' separated; if not provided, match on all source ports. @@ -398,7 +398,7 @@ DASH_ROUTING_TYPE_TABLE:{{routing_type}}: [ ``` ``` -key = DASH_ROUTING_TYPE_TABLE:routing_type; routing type can be {direct, vnet, vnet_direct, vnet_encap, appliance, privatelink, privatelinknsg, servicetunnel}; actions can be a list of action_types +key = DASH_ROUTING_TYPE_TABLE:routing_type; routing type can be {direct, vnet, vnet_direct, vnet_encap, appliance, privatelink, privatelinknsg, servicetunnel, drop}; actions can be a list of action_types ; field = value action_name = action name as string action_type = action_type can be {maprouting, direct, staticencap, appliance, 4to6, mapdecap, decap, drop} From 3e5efc987a8ba7b6b175d705b354b4b1c13b52d9 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sat, 29 Apr 2023 00:53:33 +0800 Subject: [PATCH 14/75] [doc]: Add protobuf description for dash app_db (#350) * add protobuf description for dash app_db --- .wordlist.txt | 10 +++ documentation/general/dash-sonic-hld.md | 84 ++++++++++++++++++ .../general/data/AppDBMemoryEstimation.xlsx | Bin 0 -> 16016 bytes 3 files changed, 94 insertions(+) create mode 100644 documentation/general/data/AppDBMemoryEstimation.xlsx diff --git a/.wordlist.txt b/.wordlist.txt index 6d04e5ee9..cdbd9ffdc 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -675,5 +675,15 @@ Velayudhan deparsing testability autogeneration +IpAddress +IpPrefix +bool +uint +AclRule +RangeOrValue Srinivasan Vijay +AppDB +Gan +Ze +AppDBMemoryEstimation diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index ed7e10c2d..2f6833386 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -42,6 +42,7 @@ | 1.0 | 10/10/2022 | Prince Sunny | ST and PL scenarios | | 1.1 | 01/09/2023 | Prince Sunny | Underlay Routing and ST/PL clarifications | | 1.2 | 02/12/2023 | Vijay Srinivasan | Metering schema and description | +| 1.3 | 04/12/2023 | Ze Gan | AppDB protobuf design | # About this Manual This document provides more detailed design of DASH APIs, DASH orchestration agent, Config and APP DB Schemas and other SONiC buildimage changes required to bring up SONiC image on an appliance card. General DASH HLD can be found at [dash_hld](./dash-high-level-design.md). @@ -95,6 +96,7 @@ Warm-restart support is not considered in Phase 1. TBD ## 1.4 Scaling requirements Following are the minimal scaling requirements + | Item | Expected value | | ----------------------------- | ----------------------------- | | VNETs | 1024* | @@ -645,6 +647,88 @@ rx_counter = bytes ; Number of received bytes (read-only) | | | pa_validation | SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION | use PA_VALIDATE if true | | | | metering_bucket | | | +### 3.2.11 Protobuf encoding + +For saving memory consumption([AppDBMemoryEstimation.xlsx](data/AppDBMemoryEstimation.xlsx)), the DASH table of APP_DB could be encoded as protobuf. + +``` text +key: text, Same as the original design +field_name: fixed text "pb" +field_value: binary array of protobuf message + +E.G. + +127.0.0.1:6379> hgetall "DASH_VNET_TABLE:vnet1" +1) "pb" +2) "\n\x010\x12$b6d54023-5d24-47de-ae94-8afe693dd1fc\x1a\x17\n\x12\x12\x10\r\xc0-\xdd\x82\xa3\x88;\x0fP\x84<\xaakc\x16\x10\x80\x01\x1a\x17\n\x12\x12\x10-\x0e\xf2\x7f\n~c_\xd8\xb7\x10\x84\x81\xd6'|\x10\x80\x01\x1a\x17\n\x12\x12\x10\x1bV\x89\xc8JW\x06\xfb\xad\b*fN\x9e(\x17\x10\x80\x01\x1a\x17\n\x12\x12\x107\xf9\xbc\xc0\x8d!s\xccVT\x88\x00\xf8\x9c\xce\x90\x10\x80\x01\x1a\x17\n\x12\x12\x10\tEb\x11Mf]\x12\x17x\x99\x80\xea\xd1u\xb4\x10\x80\x01\x1a\x17\n\x12\x12\x10\x1f\xd3\x1c\x89\x99\x16\xe7\x18\x91^0\x81\xb1\x04\x8c\x1e\x10\x80\x01\x1a\x17\n\x12\x12\x10\x06\x9e55\xdb\xb5&\x93\x99\xfaC\x81\x16P\xdc\x1d\x10\x80\x01\x1a\x17\n\x12\x12\x10&]U\x96e4\xf4\xd2'&\x04i\xdf\x8dA\x9f\x10\x80\x01\x1a\x17\n\x12\x12\x108\xd5\xa3*\xe7\x80\xdc\x1e\x80f\x94\xb7\xb6\x86~\xcd\x10\x80\x01\x1a\x17\n\x12\x12\x101\xf0@F\nu+}\x1e\"\\\\\xdb\x01\xe3\x82\x10\x80\x01\"\x05vnet1\"\x05vnet2\"\x05vnet1\"\x05vnet2\"\x05vnet2\"\x05vnet1\"\x05vnet2\"\x05vnet2\"\x05vnet1\"\x05vnet1" +``` + +* Pre-defined Type + +```protobuf +message IpAddress { + oneof ip { + fixed32 ipv4 = 1; // Network byte order (big-endian) + bytes ipv6 = 2; // Network byte order (big-endian) + } +} + +message IpPrefix { + IpAddress ip = 1; + IpAddress mask = 2; +} + +message Range { + uint32 min = 1; + uint32 max = 2; +} + +message ValueOrRange { +oneof value_or_range { + uint32 value = 1; + Range range = 2; +} +} + +enum IpVersion { + IP_VERSION_IPV4 = 0; + IP_VERSION_IPV6 = 1; +} +``` + +* Type mapping + +| Table type | Protobuf type | +| ------------ | ------------- | +| bool | bool | +| string | string | +| int | uint32 | +| object id | string | +| mac address | bytes | +| ip address | IpAddress | +| ip prefix | IpPrefix | +| vni | uint32 | +| l4 protocol | RangeOrValue | +| l4 port | RangeOrValue | +| Enumerations | enum | +| list * | repeated * | + +* Here is an example for AclRule + +```protobuf +message AclRule { + uint32 priority = 1; + acl.Action action = 2; + bool terminating = 3; + repeated uint32 protocol = 4; + repeated string src_tag = 9; + repeated string dst_tag = 10; + repeated types.IpPrefix src_addr = 5; + repeated types.IpPrefix dst_addr = 6; + repeated types.ValueOrRange src_port = 7; + repeated types.ValueOrRange dst_port = 8; +} +``` ## 3.3 Module Interaction diff --git a/documentation/general/data/AppDBMemoryEstimation.xlsx b/documentation/general/data/AppDBMemoryEstimation.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f616ba4b4ad2075283b934366edcda4bc02180fa GIT binary patch literal 16016 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 Date: Thu, 11 May 2023 05:16:06 +0800 Subject: [PATCH 15/75] GNMI design for DASH (#356) * GNMI interface for DASH project, add support for DASH table with protobuf encoding. --- .wordlist.txt | 8 + documentation/gnmi/dash-gnmi-design.md | 140 +++++ documentation/gnmi/images/gnmi-arch.svg | 131 +++++ documentation/gnmi/images/gnmi-get-flow.svg | 472 +++++++++++++++++ documentation/gnmi/images/gnmi-reboot.svg | 299 +++++++++++ documentation/gnmi/images/gnmi-set-flow.svg | 534 ++++++++++++++++++++ 6 files changed, 1584 insertions(+) create mode 100644 documentation/gnmi/dash-gnmi-design.md create mode 100644 documentation/gnmi/images/gnmi-arch.svg create mode 100644 documentation/gnmi/images/gnmi-get-flow.svg create mode 100644 documentation/gnmi/images/gnmi-reboot.svg create mode 100644 documentation/gnmi/images/gnmi-set-flow.svg diff --git a/.wordlist.txt b/.wordlist.txt index cdbd9ffdc..6ccf0b02a 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -14,6 +14,8 @@ adaptor adaptors ADDR addr +ae +afe agnostically amd apache @@ -128,6 +130,7 @@ dataplanes datastore DBs DDoS +de deallocating Decap decap @@ -210,6 +213,7 @@ failover failovers fakesai FastPath +fc FEC ffe FINPackets @@ -247,6 +251,7 @@ HSL https hw HW +IETF ICLA ICMP idempotency @@ -420,6 +425,7 @@ Pritsak PrivateAddress programmability programmatically +proto protobuf provids PRs @@ -494,6 +500,7 @@ SDK SDKs SDN sdn +SetRequest Sflow SHA sharding @@ -669,6 +676,7 @@ xsight YAML yaml yml +ZMQ ZTVN Mukesh Velayudhan diff --git a/documentation/gnmi/dash-gnmi-design.md b/documentation/gnmi/dash-gnmi-design.md new file mode 100644 index 000000000..dcf0b820c --- /dev/null +++ b/documentation/gnmi/dash-gnmi-design.md @@ -0,0 +1,140 @@ +# GNMI Interface for DASH + +## Overview + +SONiC should provide a gNMI server interface for DASH project. +Below diagram shows the architecture of the DASH project, the host server and DPU card are connected through PCIE, and together they form a smart switch. + +![dash-arch](./images/gnmi-arch.svg) + +Both host server and DPU card are running SONiC image. GNMI server and redis for APPL_DB are on host server, orchagent is on DPU card, GNMI server will use ZMQ over TCP to communicate with orchagent and redis. + +### Requirements + +* Set and get RPCs must be supported. Customers will use get RPC to retrieve DASH configurations and use set PRC to apply new DASH configurations. +* Need to configure huge DASH table entries to APPL_DB, with high speed. +* Minimal redis table scaling requirements: [scaling requirement](../general/dash-sonic-hld.md#14-scaling-requirements) + +### Design considerations + +* For set RPC, GNMI calls the ZMQ interface, and ZMQ updates redis asynchronously. +* For get RPC, GNMI reads from redis db directly. +* The DASH table of APPL_DB would be encoded as protobuf to save memory consumption, and then GNMI needs to support protobuf encoding for DASH table. + +``` +127.0.0.1:6379> hgetall "DASH_VNET_TABLE:vnet1" +1\) "pb" +2\) "\n\x010\x12$b6d54023-5d24-47de-ae94-8afe693dd1fc…" +``` + +And proto message for DASH_VNET_TABLE is: + +``` +message Vnet { + uint32 vni = 1; + string guid = 2; + repeated types.IpPrefix address_space = 3; + repeated string peer_list = 4; +} +``` + +Protobuf encoding message would be: "\n\x010\x12$b6d54023-5d24-47de-ae94-8afe693dd1fc…" +IETF JSON encoding message would be: "{'vni':'1000', 'guid':'b6d54023-5d24-47de-ae94-8afe693dd1fc'}" + +* GNMI would not run Yang validation for protobuf encoding data. + * GNMI server can check ENI and VNET if necessary. + +# Design +## Set RPC +### Work flow +![gnmi-set-flow](./images/gnmi-set-flow.svg) + +GNMI server would not run Yang validation, and it would invoke ZMQ interface to update. +ZMQ would update APPL_DB asynchronously, so client needs to wait for a few seconds to get latest update from APPL_DB. +### Message schema +Below table shows message example for SetRequest, including delete operation, replace operation and update operation: +SetRequest Message: +``` +delete { + path { + origin: "sonic_db" + elem {name: “APPL_DB”} elem {name: “DASH_VNET_TABLE”} elem {name: “vnet1”} + } +} +replace { + path { + origin: "sonic_db" + elem {name: “APPL_DB”} elem {name: “DASH_VNET_TABLE”} elem {name: “vnet2”} + } +} +replace { + path { + origin: “sonic_db" + elem {name: “APPL_DB”} elem {name: “DASH_VNET_TABLE”} elem {name: “vnet3”} + } + val { + proto_bytes: “\n\x010\x12$b6d54023-5d24-47de-ae94-8afe693dd1fc…” + } +} +update { + path { + origin: "sonic_db" + elem {name: “APPL_DB”} elem {name: “DASH_VNET_TABLE”} elem {name: “vnet4”} + } + val { + proto_bytes: “\n\x010\x12$b6d54023-5d24-47de-ae94-8afe693dd1fc…” + } +} +``` + +GNMI message has below constraints for DASH table: +* Path origin must be “sonic_db”. +* Path length must be 3, the first element must be “APPL_DB”, the second element must be DASH table name like “DASH_VNET_TABLE”, the third element must be DASH table key. And GNMI does not support wildcards for SetRequest. +* Value must use protobuf encoding. + +## Get RPC +### Work flow +![gnmi-get-flow](./images/gnmi-get-flow.svg) + +GNMI reads from APPL_DB directly. +### Message schema + +``` +++++++++ Sending get request: ++++++++ +path { + origin: "sonic_db" + elem {name: "APPL_DB"} elem {name: "DASH_VNET_TABLE"} elem {name: "vnet1"} +} +encoding: PROTO +++++++++ Recevied get response: ++++++++ +notification { + update { + path { + origin: "sonic_db" + elem {name: "APPL_DB"} elem {name: "DASH_VNET_TABLE"} elem {name: "vnet1"} + } + val { + proto_bytes: "\n\x010\x12$b6d54023-5d24-47de-ae94-8afe693dd1fc…" + } + } +} +``` + +## GNMI Server Restart + +DASH configuration is not persistent, if device rebooted, GNMI client needs to reconfigure DASH tables. +GNMI will add DASH_RESET_STATUS table to detect GNMI server restart. + +![gnmi-reboot](./images/gnmi-reboot.svg) + +GNMI client must write DASH_RESET_STATUS before any other DASH configurations, and GNMI client should periodically check the DASH_RESET_STATUS table. If DASH_RESET_STATUS table does not exist, GNMI client needs to reprogram all the DASH tables. + + +# References + +- [SONiC GNMI Server Interface Design](https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/gnmi/SONiC_GNMI_Server_Interface_Design.md) +- [SONiC-DASH HLD](https://github.com/sonic-net/DASH/blob/main/documentation/general/dash-sonic-hld.md) +- [Proto for DASH table](https://github.com/Pterosaur/DASH-benchmark/tree/master/memory/proto) + + + diff --git a/documentation/gnmi/images/gnmi-arch.svg b/documentation/gnmi/images/gnmi-arch.svg new file mode 100644 index 000000000..5c90c39fd --- /dev/null +++ b/documentation/gnmi/images/gnmi-arch.svg @@ -0,0 +1,131 @@ + + + + + + + + + + Page-1 + + + Rectangle.1000 + Smart switch + + + + + + + Smart switch + + Rectangle.1001 + Host server + + + + + + + Host server + + Rectangle.1002 + DPU + + + + + + + DPU + + Simple Double Arrow.1003 + Ethernet over PCIE + + + + + + + + Ethernet over PCIE + + Rectangle.1004 + GNMI server + + + + + + + GNMI server + + Rectangle.1005 + Orchagent + + + + + + + Orchagent + + + + + Can.1006 + Redis + + Sheet.1007 + + + + + + + + + + + + + Redis + + + Simple Double Arrow.1008 + ZMQ over TCP + + + + + + + + ZMQ over TCP + + Bent Arrow.1009 + + + + + + + diff --git a/documentation/gnmi/images/gnmi-get-flow.svg b/documentation/gnmi/images/gnmi-get-flow.svg new file mode 100644 index 000000000..8f5839e8b --- /dev/null +++ b/documentation/gnmi/images/gnmi-get-flow.svg @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI server + + + Activation + + + + + + + Message + GetRequest + + + + + + + + + + + GetRequest + + Return Message + GetResponse + + + + + + + + + + + GetResponse + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.30 + ZMQ + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + Sheet.34 + + + + + + + ZMQ + + + + + + + + + Script.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + Sheet.44 + + + + + Activation.45 + + + + + + + Message.46 + Read from redis + + + + + + + + + + + Read from redis + + Return Message.47 + Return result + + + + + + + + + + + Return result + + + + + + + Object lifeline.51 + Orchagent + + Sheet.52 + + + + Sheet.53 + + + + Sheet.54 + + + Sheet.55 + + + + + + + Orchagent + + + + + + + + Object lifeline.76 + APPL_DB + + Sheet.77 + + + + Sheet.78 + + + + Sheet.79 + + + Sheet.80 + + + + + + + APPL_DB + + + + + + + + + Database + + Sheet.98 + + Sheet.99 + + + + Sheet.100 + + + + Sheet.101 + + + + Sheet.102 + + + + + + + + + + + + Script.132 + + Sheet.133 + + + + Sheet.134 + + + + Sheet.135 + + + + Sheet.136 + + + + Sheet.137 + + + + Sheet.138 + + + + Sheet.139 + + + + Sheet.140 + + + + Sheet.141 + + + + + diff --git a/documentation/gnmi/images/gnmi-reboot.svg b/documentation/gnmi/images/gnmi-reboot.svg new file mode 100644 index 000000000..4b3cde793 --- /dev/null +++ b/documentation/gnmi/images/gnmi-reboot.svg @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI server + + + Message + Write DASH_RESET_STATUS + + + + + + + + + + + Write DASH_RESET_STATUS + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + Message.30 + Write DASH configurations + + + + + + + + + + + Write DASH configurations + + Single arrowhead + Read DASH_RESET_STATUS table + + + + + + + + + + + + + Read DASH_RESET_STATUS table + + Single arrowhead.38 + Read DASH_RESET_STATUS table + + + + + + + + + + + + + Read DASH_RESET_STATUS table + + Single arrowhead.39 + Read DASH_RESET_STATUS table + + + + + + + + + + + + + Read DASH_RESET_STATUS table + + Self Message + + + + + + + + + + Sheet.41 + If DASH_RESET_STATUS table is lost, GNMI client needs to repr... + + + + If DASH_RESET_STATUS table is lost, GNMI client needs to reprogram + + Message.45 + Write DASH_RESET_STATUS + + + + + + + + + + + Write DASH_RESET_STATUS + + Message.48 + Write DASH configurations + + + + + + + + + + + Write DASH configurations + + diff --git a/documentation/gnmi/images/gnmi-set-flow.svg b/documentation/gnmi/images/gnmi-set-flow.svg new file mode 100644 index 000000000..29d808d24 --- /dev/null +++ b/documentation/gnmi/images/gnmi-set-flow.svg @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI server + + + Activation + + + + + + + Message + SetRequest + + + + + + + + + + + SetRequest + + Return Message + SetResponse + + + + + + + + + + + SetResponse + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.30 + ZMQ + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + Sheet.34 + + + + + + + ZMQ + + + + + + + + + Script.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + Sheet.44 + + + + + Activation.45 + + + + + + + Message.46 + Invoke ZMQ interface + + + + + + + + + + + Invoke ZMQ interface + + Return Message.47 + Return result + + + + + + + + + + + Return result + + Sheet.49 + Enqueue + + + + Enqueue + + Self Message.50 + + + + + + + + + + + + + + + Object lifeline.51 + Orchagent + + Sheet.52 + + + + Sheet.53 + + + + Sheet.54 + + + Sheet.55 + + + + + + + Orchagent + + + + + + + + Object lifeline.76 + APPL_DB + + Sheet.77 + + + + Sheet.78 + + + + Sheet.79 + + + Sheet.80 + + + + + + + APPL_DB + + + Message.82 + Notify + + + + + + + + + + + Notify + + Activation.83 + + + + + + + Activation.92 + + + + + + + Message.93 + Update APPL_DB asynchronously + + + + + + + + + + + Update APPL_DB asynchronously + + + + + + + + Database + + Sheet.98 + + Sheet.99 + + + + Sheet.100 + + + + Sheet.101 + + + + Sheet.102 + + + + + + + + + + + + Script.132 + + Sheet.133 + + + + Sheet.134 + + + + Sheet.135 + + + + Sheet.136 + + + + Sheet.137 + + + + Sheet.138 + + + + Sheet.139 + + + + Sheet.140 + + + + Sheet.141 + + + + + From 94518d2fa8a74bf5a796216d3b04fe508bb0791b Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 18 May 2023 00:08:11 +0800 Subject: [PATCH 16/75] [doc]: Allow two ACL groups (v4 and v6) for each ENI/Stage (#364) * Allow two ACL groups(v4 and v6) for each ENI/Stage --- documentation/general/dash-sonic-hld.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 2f6833386..08d5c1c45 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -339,17 +339,20 @@ addresses = list of ip prefixes ',' separated. valid to have emp ``` DASH_ACL_IN_TABLE:{{eni}}:{{stage}} - "acl_group_id": {{group_id}} + "v4_acl_group_id": {{group_id}} (OPTIONAL) + "v6_acl_group_id": {{group_id}} (OPTIONAL) ``` ``` DASH_ACL_OUT_TABLE:{{eni}}:{{stage}} - "acl_group_id": {{group_id}} + "v4_acl_group_id": {{group_id}} (OPTIONAL) + "v6_acl_group_id": {{group_id}} (OPTIONAL) ``` ``` key = DASH_ACL_IN_TABLE:eni:stage ; ENI name and stage as key; ACL stage can be {1, 2, 3 ..} -; field = value -acl_group_id = ACL group ID +; field = value +v4_acl_group_id = IPv4 ACL group ID +v6_acl_group_id = IPv6 ACL group ID ``` ``` From 1274a460f13a6665e0901b032b3d216b27132944 Mon Sep 17 00:00:00 2001 From: taras-keryk-plv <124700928+taras-keryk-plv@users.noreply.github.com> Date: Wed, 17 May 2023 19:49:49 +0300 Subject: [PATCH 17/75] Updated SAI-Challenger to latest main (#367) Signed-off-by: Taras Keryk --- .../dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env | 2 +- dash-pipeline/dockerfiles/Dockerfile.saichallenger-client | 2 +- dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr | 2 +- test/SAI-Challenger | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env b/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env index 0e9924208..e50b6e49d 100644 --- a/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env +++ b/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env @@ -2,4 +2,4 @@ # Changing this will cause build/publish to occur in CI actions export DASH_ACR_REGISTRY=sonicdash.azurecr.io export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_NAME=${DASH_ACR_REGISTRY}/dash-saichallenger-client-bldr -export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_CTAG?=230216 +export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_CTAG?=230515 diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client index d5a7c0a74..79934a595 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client @@ -1,4 +1,4 @@ -FROM sonicdash.azurecr.io/dash-saichallenger-client-bldr:230216 +FROM sonicdash.azurecr.io/dash-saichallenger-client-bldr:230515 ENV SAI_CHALLENGER_PATH /sai-challenger ENV DASH_PATH /dash diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr index 742ce9f6a..6e5ad7959 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr @@ -1,5 +1,5 @@ # Requires or something -# sc-client:230216 +# sc-client:230515 FROM sc-client ADD tests/ /tests/ diff --git a/test/SAI-Challenger b/test/SAI-Challenger index 4afa76c55..44458c9d0 160000 --- a/test/SAI-Challenger +++ b/test/SAI-Challenger @@ -1 +1 @@ -Subproject commit 4afa76c55ccb466a7a21d6fac733a0e0eb1908db +Subproject commit 44458c9d0f8147cf696204ad700bf46f8738180f From 88620767c05e5705f6fa2537114f20499246bb22 Mon Sep 17 00:00:00 2001 From: MirceaDan Date: Wed, 24 May 2023 13:27:02 -0700 Subject: [PATCH 18/75] update to scale numbers (#369) - background tcp flows 15M (was 1M) - background udp flows 15M (was 1M) - background traffic packet size reduced to 500B from 1500B - total flow capacity reduced by half (down to 32M from 64M) - Signed-off-by: Mircea Dan --- ...rogram-scale-testing-requirements-draft.md | 1320 ++++++++--------- 1 file changed, 650 insertions(+), 670 deletions(-) diff --git a/documentation/general/program-scale-testing-requirements-draft.md b/documentation/general/program-scale-testing-requirements-draft.md index 3f7e1f0f3..c3c32b5a5 100644 --- a/documentation/general/program-scale-testing-requirements-draft.md +++ b/documentation/general/program-scale-testing-requirements-draft.md @@ -1,670 +1,650 @@ -# Program Scale Testing Requirements for LAB Validation - ->**NOTE**: This prelimiary document includes a text description of a so-called **"Hero Test"** to establish minimum performance requirements and screen captures of Layer 2/3 packet generator stream configurations for IXIA IxExplorer packet tester device. These L23 streams simulate L4 connection establishment. This document, and the testing methodology, will be replaced by a more formal, complete requirements specification and automated testing scripts in due time. - -## Table of Contents - -[Introduction](#introduction) - -[Test Methodology and Definitions](#test-methodology-and-definitions) - -[Feature Requirements](#feature-requirements) - -[Policy and Route Requirements](#policy-and-route-requirements) - -[MSFT LAB IXIA Configuration](#msft-lab-ixia-configuration) - -- [Module Configuration](#module-configuration) - -- [Streams](#streams) - - - [Learning Streams](#learning-streams) - - - [Traffic Streams](#traffic-streams) - - - [Bandwidth Streams](#bandwidth-streams) - - - [CPS Streams](#cps-streams) - -[Sample Policy Configuration](#sample-policy-configuration) - -- [Device](#device) - -- [TEP](#tep) - -- [Route Table](#route-table) - -- [Security Policy](#security-policy) - -- [VPC](#vpc) - -- [VNIC](#vnic) - -- [Mappings](#mappings) - -- [Policer](#policer) - -- [UDR](#udr) - -- [Meter Policy](#meter-policy) - -


- -## Introduction - -This document summarizes scale testing requirements for validating program deliverables. - -This document will refer to Connection Per Second (CPS) capability as 5M -which correlates to 10M flow operations. This capability is a -placeholder for reference and the specific hardware supported value will -be used to evaluate different firmware drops. - -What we are looking for in a series of testing is how well the NIC -handles: - -1. Connections/sec per ENI and per NIC -2. Number of active connections per ENI and per NIC -3. Number of flows per ENI and per NIC -4. ENIs' connection pool can be oversubscribed. An oversubscription of 2:1 would be expected, so the connection pool can be more optimal if executed as one large table where ENI can be apart of the key. The connection table would be the most appropriate table for oversubscription scenarios. -5. Throughput under max connections per second load with the remaining - bandwidth is filled with pre-learned connections that receive at - least one packet per second while driving the links to near 100% - utilization. This requires some work up front to get the right mix - of CPS and active connections with zero drops. **We do not accept - results with drops as we cannot use that test to measure latency and - jitter**. We therefore also run the test sufficiently long to see if - there were any queue build-ups which would eventually lead to drops - and distort both latency and jitter results. -6. Aging of (TCP bi-directional connections) and (UDP bi-directional flows) such that - after the test is complete all connections are aged within the 1 - second interval or any other interval we program. -7. We are expecting to cover below scenarios as follow-on tests: - - a. Age arbitrary connections to verify that aging is also working - properly under maximum load. - - b. Download new policies and delete old policies at a significant - rate to ensure that CPS, Active Connections, Aging, and new - Policies are properly handled with the external memory, which is - often the bottleneck for performance. - -Why are we running these tests? - -1. Many NICs require software to inspect the SYN/ACK/ACK and - FIN/ACK/ACK packets of a connection. The software is responsible for - the formation, deletion connection and forwarding table entries - after significant and complex cloud policy enforcement along with - any associated accounting. Software based connection management - often results in poor connections/second with limits in the 10s of - thousands/sec. The set of test and associated table parameters found - in this document are designed to find the maximum CPS with the - maximum number of connections all actively receiving packets every - second. The more that is done in specialized hardware the more we - expect the CPS to increase. **Any NIC for the application that - cannot achieve millions of connections/sec will automatically be - disqualified from further testing.** -2. Many NICs can create (a large number) of connections simply by - adding more external memory for the connection table. For example, a - NIC can create 1M connections in its external table, however if - packets arrive across the entire connection set in a random order, - it forces the NIC out of its internal **connection cache** and to - use the external connection table instead. Under this condition we - have measured some NICs to achieve 10% advertised link throughput. - The testing below will ensure this condition is exercised and - provide the true worst-case throughput that is reflective of some - real-world conditions like firewalls, load balancers, DDoS, - v-routers etc. **It should also be noted that creating a connection - in a table that never receives a subsequent packet (other than - keepalives once every few minutes) is referred to as an idle - connection and is a useless parameter that should never be - advertised and will not be tested other than for conformance.** -3. Aging is also a vital component of tracking connections. Even under - the worst load the system must be able to age connections. All - packets will require either connection setup/teardown or policy - lookups/updates involving external memory and hence the memory - management of the connection table is extremely important. The tests - in this document will ensure that no matter what processing is going - on, the connection table will be maintained providing the proper - aging intervals to each connection. -4. We need to be able to enter/delete many new policies at any time - regardless of load. For this reason, we will run the test without - updates to policy to get a baseline and then again with some - extensive policies being added/deleted during the same test. We will - look for any regressions while adding/deleting policies at a - significant rate. This matches the real-world requirement of adding - and deleting VMs to a node or to the VNET. - -In the end we are looking for total invisibility for the end customer. -Customers are used to their NICs in the enterprise forwarding at -Layer-3. Most NICs and switches can do this at wire rate under a wide -variety of conditions. When the customer enters the cloud, they expect -the same behavior. When they setup their solution for the first time, -often, they will not see the same performance and in the worst case will -have to totally re-architect their already working solutions with a -scale-out model. This means that their hybrid and cloud architectures -will diverge and create a large amount of extra work for IT or solution -integrators to track and test the designs in a common manner. - -## Test Methodology and Definitions - -- **CPS**: Sustained Connections Per Second. 5M and 10M flows are only - placeholders and will be determined by the supplier as each - implementation will vary depending on the maturity of the DASH - design. - - - 5M CPS means that 5M new connections are established and - destroyed over a one second interval. - - - Every connection consists of two flows hence 5M new connections - mean: - - - 10M flow additions every second to insert connections. - - - 10M flow deletions every second because of expiry of old - connections which will also allow capacity for new - connections to be formed in the next second. - - - 20M total flow operations every second - - - 5M CPS is a "per card" goal. Card must be able to sustainably - handle 5M CPS irrespectively if either single ENI is configured - on a card or multiple ENIs are configured. Total CPS per card - must always be reaching same 5M goal, and this goal must not be - degraded if card will have multiple ENIs programmed with - different policy each. Same goes for total flows supported on a - card. - -- **Test Runtime**: 100 seconds. We feel this is sufficient time to - pick up any anomalies the NIC may have running interval tasks - unknown to the tester. - -- **Effective CPS**: CPS results over 100 seconds by the Ixia - setup/teardown rates, however, will not be accepted if there are any - drops for any reason. Drops end up deviating the true latency and - jitter numbers. - -- **Performance Testing Methodology**: - - - 2M TCP background connections setup before testing. - - - 2M UDP background bi-directional flows setup before testing. - - - We use an equal mix of TCP and UDP although in the real world we - expect more TCP and in fact in some cases we meter UDP as a - potential source of DoS. - - - Connection aging set to 1 sec and requires each connection or - bi-directional flow to receive one packet every second in each - direction at a size that will fill up the links to near 100% in - conjunction with the dynamically setup connection traffic. For - this to be run successfully it may take a few runs as each TCP - connection setup and teardown takes 6 packets. - - - For UDP a bidirectional flow is created for the first packet - seen that meets the policy for the bi-directional flow setup. - When using this in CPS testing, we will send a total of 6 - packets to match TCP to make things more balanced. UDP - bi-directional flows will be aged within 1 second after - receiving the last packet. I would set all UDP bi-directional - flows to 0.5 - 1.0 second aging to ensure that we do not inflate - the connection table over time. - - - One packet should be sent in each direction to be able to keep - connections active in the flow table. Packet size should be set - to a minimum that allows 6 CPS packets at maximum rate and at - least one packet on each of the active connections in both - directions that also allows for close to 100% link utilization - while not exceeding the TCP aging time of 1 sec. - - - TCP connection is established and terminated without any data - packets. - - Real use case - - 6 packets: SYN, SYN-ACK, ACK, FIN, FIN-ACK, ACK - - Flow Table Size: (2 \* CPS) + 2M + 2M - //For 5M CPS, Flow Table Size: (2 \* 5M) +2M +2M = 14M - - Effective PPS: Sustained CPS \* 6 + PPS for background flows. - -- CPS and flow results will be measured while channel bandwidth is - saturated at 100Gbps for the duration of test runtime. At the same - time we want as close to 100Gbps without losing packets. - -- Inactivity based aging timer of 1 second. - - - All TCP connections should be deleted from the table after the - test completes. - - - The connection table should therefore be zero. - - - All UDP bi-directional flows need to age out before the 1 second - interval to allow for new UDP bi-directional flows to be - established. If everything works as advertised, we should never - see the connection table go above the 8M connections. If we do - then it is likely that UDP bi-directional flows were not aged - within the 1 second interval. To check this, we need to see a - high water counter for maximum connection table size. - -## Feature Requirements - -The following features are required to be enabled during scale testing: - -- VNET - - VXLAN-IN and VXLAN-OUT - - Encap based on lookup table, which can change/be updated - similarly as ENI policy - -- UDR - - - 200k routes per ENI with: - - MAC rewrite - - VNID rewrite - - DSCP rewrite - -- ACL - - 3-level NSG on connection (receive/transmit) in accordance with - the Packet Transformation document detailing our unique NSG - requirements. - - - For clarity, the first NSG is used by Azure to set policy for - the connection while the next two NSGs are set by the customer. - Think of it as a customer building their own firewall rules to - control which VMs can communicate with any other VM with a - unique set of policies. This allows the customer to setup the - VMs with similar control they would have in their own - enterprise. We cannot prevent the customer from forming complex - policy sets. They will likely use similar policies they use in - their own environment. - - - NSG on VNET, vport, subnet both on ingress and egress - traffic - - 100k SIP prefixes/ranges per policy - - 100k DIP prefixes/ranges per policy - -- Metering - - - Enabled on all routes in all v-ports (Currently 15 classes are - supported). - -- QoS per ENI BW - -- VNET Peering - -## Policy and Route Requirements - -The following scale of policies and routes are at minimum required to be -configured during validation and test plan needs to be executed covering -both scenarios: - -**NEW Values Start** ################################################### - -| | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | -|---------------|------------|--------------|-------|-------|-------| -| VNETs | | 1024 | 2048 | 4096 | 8192 | -| ENIs | | 64 | 128 | 256 | 512 | -| Routes | 100K | 6.4M | 12.8M | 25.6M | 51.2M | -| NSGs | 5in + 5out | 640 | 1280 | 2560 | 5120 | -| ACLs prefixes | 10x100K | 64M | 128M | 256M | 512M | -| ACLs Ports | 10x10K | 6.4M | 12.8M | 25.6M | 51.2M | -| Mappings (CA to PA) | 160K | 10M | 20M | 40M | 80M | -| Act Con | 1M (bidir w/ connection pool capable of oversubscription) | 64M | 128M | 256M | 512M | -| CPS | | 3.75M | 7.5M | 15M | 30M | -| bg flows TCP | | 1M (bidir w/ connection pool capable of oversubscription) | 2M | 4M | 8M | -| bg flows UDP | | 1M (bidir w/ connection pool capable of oversubscription) | 2M | 4M | 8M | - -- ACL rules per NSG = 1000 -- Prefixes per ACL rule = 100 -- Prefixes mapped per ACL rule = 16 -- Prefixes routed per ACL rule = 84 -- Routes per ACL rule = 10 -- -> Change Above: NSG per ENI changed since 5 Inbound & 5 Outbound stages are required - -**NEW Values End** #################################################### - - -## MSFT LAB IXIA Configuration - -### Module Configuration - -IXIA module: NOVUS100GE8Q28 - -![msft-lab-ixia-config-01](images/req/msft-lab-ixia-config-01.png) - -![msft-lab-ixia-config-02](images/req/msft-lab-ixia-config-02.png) - -### Streams - -TX: Local vnic to remote vnic - -RX: Remote vnic to local vnic - -#### Learning Streams - -Learning Streams will be used to establish 2M CPS connections and 2M UDP -background bi-directional flows prior to test execution. These 2M flows -will be split across 8 vnics that are pre-configured. - -![learning-streams](images/req/learning-streams.png) - -- MSFT-8V-1M-TX-PPS-Learning - -![msft-8v-1m-tx-pps-learning-01](images/req/msft-8v-1m-tx-pps-learning-01.png) - -![msft-8v-1m-tx-pps-learning-02](images/req/msft-8v-1m-tx-pps-learning-02.png) - -**Packet view** - -``` cmd -MAC: ------ MAC Header ------ -MAC: -MAC: Destination Address : 00 AE CD 01 CD 26 -MAC: Source Address : 00 AE CD 20 00 01 -MAC: Type : 0x0800 (Ethernet II) -MAC: -IP: ------ IP Header ----------- -IP: -IP: Version = 04 (0x04) -IP: Header Length = 20 (0x14) -IP: Differentiated Services Field = 0 (0x00) -IP: 000000.. = DSCP: Default(0x00) -IP: ......0. = ECN Capable Transport (ECT): 0 -IP: .......0 = ECN-CE: 0 -IP: Type of Service = 00 (0x00) -IP: 000..... = Routine -IP: ...0.... = Normal Delay -IP: ....0... = Normal Throughput -IP: .....0.. = Normal Reliability -IP: ......0. = Normal Cost -IP: .......0 = Reserved -IP: Total Length = 100 (0x0064) -IP: Identification = 0 (0x0000) -IP: Flags Bit1 .0. May Fragment -IP: Flags Bit2 ..0 Last Fragment -IP: Fragment Offset = 0 -IP: Time to Live = 64 (0x40) -IP: Protocol = UDP -IP: Checksum = 0x7885 -IP: Source Address = 1.0.0.3 -IP: Destination Address = 1.0.0.2 -IP: -UDP: ------ UDP Header ----------- -UDP: -UDP: Source Port = 50686 (0xC5FE) -UDP: Destination Port = 4789 (0x12B5) -UDP: Length = 80 (0x0050) -UDP: Checksum = 1770 (0x06EA) -UDP: - -``` -- MSFT-8V-1M-RX-PPS-Learning - -![msft-8v-1m-rx-pps-learning-01](images/req/msft-8v-1m-rx-pps-learning-01.png) - -![msft-8v-1m-rx-pps-learning-02](images/req/msft-8v-1m-rx-pps-learning-02.png) - -#### Traffic Streams - -Traffic streams will be used for running the learning flows with 64 -packets per flow. Traffic streams simulating 1/8/16 packets per flow -need to be created individually. - -- MSFT-8V-1M-TX-PPS-64Pkt/Flow-100Sec - -![msft-8v-1m-tx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-01.png) - -![msft-8v-1m-tx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-02.png) - -- MSFT-8V-1M-RX-PPS-64Pkt/Flow-100Sec - -![msft-8v-1m-rx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-01.png) - -![msft-8v-1m-rx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-02.png) - -#### Bandwidth Streams - -Bandwidth streams runs with a higher packet size -- 1500 byte -- and -will be used to verify the total 100Gbps bandwidth. - -- MSFT-8V-1M-TX-BW-Port1-100Sec - -![msft-8v-1m-tx-bw-port1-100sec-01](images/req/msft-8v-1m-tx-bw-port1-100sec-01.png) - -![msft-8v-1m-tx-bw-port1-100sec-02](images/req/msft-8v-1m-tx-bw-port1-100sec-02.png) - -**Packet view** - -```cmd -MAC: ------ MAC Header ------ -MAC: -MAC: Destination Address : 00 AE CD 01 CD 26 -MAC: Source Address : 00 AE CD 20 00 01 -MAC: Type : 0x0800 (Ethernet II) -MAC: -IP: ------ IP Header ----------- -IP: -IP: Version = 04 (0x04) -IP: Header Length = 20 (0x14) -IP: Differentiated Services Field = 0 (0x00) -IP: 000000.. = DSCP: Default(0x00) -IP: ......0. = ECN Capable Transport (ECT): 0 -IP: .......0 = ECN-CE: 0 -IP: Type of Service = 00 (0x00) -IP: 000..... = Routine -IP: ...0.... = Normal Delay -IP: ....0... = Normal Throughput -IP: .....0.. = Normal Reliability -IP: ......0. = Normal Cost -IP: .......0 = Reserved -IP: Total Length = 1482 (0x05CA) -IP: Identification = 0 (0x0000) -IP: Flags Bit1 .0. May Fragment -IP: Flags Bit2 ..0 Last Fragment -IP: Fragment Offset = 0 -IP: Time to Live = 64 (0x40) -IP: Protocol = UDP -IP: Checksum = 0x731F -IP: Source Address = 1.0.0.3 -IP: Destination Address = 1.0.0.2 -IP: -UDP: ------ UDP Header ----------- -UDP: -UDP: Source Port = 50686 (0xC5FE) -UDP: Destination Port = 4789 (0x12B5) -UDP: Length = 80 (0x0050) -UDP: Checksum = 1770 (0x06EA) -UDP: - -``` - -- MSFT-8V-1M-RX-BW-Port1-100Sec - -![msft-8v-1m-rx-bw-port1-100sec-01](images/req/msft-8v-1m-rx-bw-port1-100sec-01.png) - -![msft-8v-1m-rx-bw-port1-100sec-02](images/req/msft-8v-1m-rx-bw-port1-100sec-02.png) - -### CPS Streams - -CPS streams will be used to simulate TCP connection establishment and termination. - -![cps-streams](images/req/cps-streams.png) - -- MSFT-8V-4M-Stream 1-Syn-TX-CPS-100Sec - -![msft-8v-4m-stream-1-syn-tx-cps-100sec-01](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-01.png) - -![msft-8v-4m-stream-1-syn-tx-cps-100sec-02](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 2-Syn-Ack-RX-CPS-100Sec - -![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01.png) - -![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 3-Ack-TX-CPS-100Sec - -![msft-8v-4m-stream-3-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-01.png) - -![msft-8v-4m-stream-3-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 4-Fin-Ack-RX-CPS-100Sec - -![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01.png) - -![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 4-Fin-Ack-TX-CPS-100Sec - -![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01.png) - -![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 6-Ack-for-Fin-RX-CPS-100Sec - -![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01](images/req/[msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01.png) - -![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02](images/req/msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02.png) - -### Sample Policy Configuration - -#### Device - -```cmd -\"gw-ip-addr\": \"1.0.0.1\", - -\"kind\" : \"device\", - -\"gw-ip-addr\": \"1.0.0.1\", - -\"ip-addr\" : \"1.0.0.2\", - -\"mac-addr\" : \"\", - -\"dual-stack\": \"false\", - -\"encap\": \"vxlan\", - -\"oper-mode\": \"bitw-smart-switch\" -``` - -#### TEP - -```cmd -\"kind\" : \"tep\", - -\"count\" : \"2046\", - -\"prefix\": \"1.0.0.0/8\" - -``` - -#### Route Table - -```cmd -\"kind\" : \"route-table\", - -\"count\" : \"204800\", - -\"prefix-start\" : \"4.0.0.0/8\", - -\"meter\" : \"true\" - -#### Security Policy - -\"kind\" : \"security-policy\", - -\"v4-count\" : \"1023\" -``` - -#### VPC - -```cmd -\"kind\" : \"vpc\", - -\"count\" : \"16\", - -\"prefix\" : \"192.0.0.0/8\", - -\"subnets\" : \"1\" -``` -> [!NOTE] -> All VPCs will be configured with the same prefix. - -#### VNIC - -```cmd -\"kind\" : \"vnic\", - -\"count\" : \"1\", - -\"vlan-tagged\": \"false\" - -Note: VNIC configuration per vpc, subnet - -``` - -#### Mappings - -```cmd -\"kind\" : \"mappings\", - -\"remotes\" : \"64\", - -\"locals\" : \"8\", - -\"nat-prefix\" : \"3.0.0.0/8\" - -``` -> [!NOTE] -> Remotes are per subnet, tep. - -#### Policer - -```cmd -\"kind\" : \"policer\", - -\"count\" : \"16\", - -\"tx_policer_en\" : \"true\", - -\"rx_policer_en\" : \"true\" - -#### UDR - -\"kind\" : \"udr\", - -\"route-prefix\" : \"5.0.0.0/8\", - -\"overlay-mac\" : \"\", - -\"encap\" : \"\", - -\"tos\" : \"\" - -``` - -#### Meter Policy - -```cmd -\"kind\" : \"meter-policy\", - -\"count-xl\" : \"16383\", - -\"count-m\" : \"1023\", - -\"prefix\" : \"4.0.0.0/8\" - -``` +# Program Scale Testing Requirements for LAB Validation + +>**NOTE**: This prelimiary document includes a text description of a so-called **"Hero Test"** to establish minimum performance requirements and screen captures of Layer 2/3 packet generator stream configurations for IXIA IxExplorer packet tester device. These L23 streams simulate L4 connection establishment. This document, and the testing methodology, will be replaced by a more formal, complete requirements specification and automated testing scripts in due time. + +## Table of Contents + +[Introduction](#introduction) + +[Test Methodology and Definitions](#test-methodology-and-definitions) + +[Feature Requirements](#feature-requirements) + +[Policy and Route Requirements](#policy-and-route-requirements) + +[MSFT LAB IXIA Configuration](#msft-lab-ixia-configuration) + +- [Module Configuration](#module-configuration) + +- [Streams](#streams) + + - [Learning Streams](#learning-streams) + + - [Traffic Streams](#traffic-streams) + + - [Bandwidth Streams](#bandwidth-streams) + + - [CPS Streams](#cps-streams) + +[Sample Policy Configuration](#sample-policy-configuration) + +- [Device](#device) + +- [TEP](#tep) + +- [Route Table](#route-table) + +- [Security Policy](#security-policy) + +- [VPC](#vpc) + +- [VNIC](#vnic) + +- [Mappings](#mappings) + +- [Policer](#policer) + +- [UDR](#udr) + +- [Meter Policy](#meter-policy) + +
+ +## Introduction + +This document summarizes scale testing requirements for validating program deliverables. + +This document will refer to Connection Per Second (CPS) capability as 5M +which correlates to 10M flow operations. This capability is a +placeholder for reference and the specific hardware supported value will +be used to evaluate different firmware drops. + +What we are looking for in a series of testing is how well the NIC +handles: + +1. Connections/sec per ENI and per NIC +2. Number of active connections per ENI and per NIC +3. Number of flows per ENI and per NIC +4. ENIs' connection pool can be oversubscribed. An oversubscription of 2:1 would be expected, so the connection pool can be more optimal if executed as one large table where ENI can be apart of the key. The connection table would be the most appropriate table for oversubscription scenarios. +5. Throughput under max connections per second load with the remaining + bandwidth is filled with pre-learned connections that receive at + least one packet per second while driving the links to near 100% + utilization. This requires some work up front to get the right mix + of CPS and active connections with zero drops. **We do not accept + results with drops as we cannot use that test to measure latency and + jitter**. We therefore also run the test sufficiently long to see if + there were any queue build-ups which would eventually lead to drops + and distort both latency and jitter results. +6. Aging of (TCP bi-directional connections) and (UDP bi-directional flows) such that + after the test is complete all connections are aged within the 1 + second interval or any other interval we program. +7. We are expecting to cover below scenarios as follow-on tests: + + a. Age arbitrary connections to verify that aging is also working + properly under maximum load. + + b. Download new policies and delete old policies at a significant + rate to ensure that CPS, Active Connections, Aging, and new + Policies are properly handled with the external memory, which is + often the bottleneck for performance. + +Why are we running these tests? + +1. Many NICs require software to inspect the SYN/ACK/ACK and + FIN/ACK/ACK packets of a connection. The software is responsible for + the formation, deletion connection and forwarding table entries + after significant and complex cloud policy enforcement along with + any associated accounting. Software based connection management + often results in poor connections/second with limits in the 10s of + thousands/sec. The set of test and associated table parameters found + in this document are designed to find the maximum CPS with the + maximum number of connections all actively receiving packets every + second. The more that is done in specialized hardware the more we + expect the CPS to increase. **Any NIC for the application that + cannot achieve millions of connections/sec will automatically be + disqualified from further testing.** +2. Many NICs can create (a large number) of connections simply by + adding more external memory for the connection table. For example, a + NIC can create 1M connections in its external table, however if + packets arrive across the entire connection set in a random order, + it forces the NIC out of its internal **connection cache** and to + use the external connection table instead. Under this condition we + have measured some NICs to achieve 10% advertised link throughput. + The testing below will ensure this condition is exercised and + provide the true worst-case throughput that is reflective of some + real-world conditions like firewalls, load balancers, DDoS, + v-routers etc. **It should also be noted that creating a connection + in a table that never receives a subsequent packet (other than + keepalives once every few minutes) is referred to as an idle + connection and is a useless parameter that should never be + advertised and will not be tested other than for conformance.** +3. Aging is also a vital component of tracking connections. Even under + the worst load the system must be able to age connections. All + packets will require either connection setup/teardown or policy + lookups/updates involving external memory and hence the memory + management of the connection table is extremely important. The tests + in this document will ensure that no matter what processing is going + on, the connection table will be maintained providing the proper + aging intervals to each connection. +4. We need to be able to enter/delete many new policies at any time + regardless of load. For this reason, we will run the test without + updates to policy to get a baseline and then again with some + extensive policies being added/deleted during the same test. We will + look for any regressions while adding/deleting policies at a + significant rate. This matches the real-world requirement of adding + and deleting VMs to a node or to the VNET. + +In the end we are looking for total invisibility for the end customer. +Customers are used to their NICs in the enterprise forwarding at +Layer-3. Most NICs and switches can do this at wire rate under a wide +variety of conditions. When the customer enters the cloud, they expect +the same behavior. When they setup their solution for the first time, +often, they will not see the same performance and in the worst case will +have to totally re-architect their already working solutions with a +scale-out model. This means that their hybrid and cloud architectures +will diverge and create a large amount of extra work for IT or solution +integrators to track and test the designs in a common manner. + +## Test Methodology and Definitions + +- **CPS**: Sustained Connections Per Second. 5M and 10M flows are only + placeholders and will be determined by the supplier as each + implementation will vary depending on the maturity of the DASH + design. + + - 5M CPS means that 5M new connections are established and + destroyed over a one second interval. + + - Every connection consists of two flows hence 5M new connections + mean: + + - 10M flow additions every second to insert connections. + + - 10M flow deletions every second because of expiry of old + connections which will also allow capacity for new + connections to be formed in the next second. + + - 20M total flow operations every second + + - 5M CPS is a "per card" goal. Card must be able to sustainably + handle 5M CPS irrespectively if either single ENI is configured + on a card or multiple ENIs are configured. Total CPS per card + must always be reaching same 5M goal, and this goal must not be + degraded if card will have multiple ENIs programmed with + different policy each. Same goes for total flows supported on a + card. + +- **Test Runtime**: 100 seconds. We feel this is sufficient time to + pick up any anomalies the NIC may have running interval tasks + unknown to the tester. + +- **Effective CPS**: CPS results over 100 seconds by the Ixia + setup/teardown rates, however, will not be accepted if there are any + drops for any reason. Drops end up deviating the true latency and + jitter numbers. + +- **Performance Testing Methodology**: + + - 15M TCP background connections setup before testing. + + - 15M UDP background bi-directional flows setup before testing. + + - We use an equal mix of TCP and UDP although in the real world we + expect more TCP and in fact in some cases we meter UDP as a + potential source of DoS. + + - Connection aging set to 1 sec and requires each connection or + bi-directional flow to receive one packet every second in each + direction at a size that will fill up the links to near 100% in + conjunction with the dynamically setup connection traffic. For + this to be run successfully it may take a few runs as each TCP + connection setup and teardown takes 6 packets. + + - For UDP a bidirectional flow is created for the first packet + seen that meets the policy for the bi-directional flow setup. + When using this in CPS testing, we will send a total of 6 + packets to match TCP to make things more balanced. UDP + bi-directional flows will be aged within 1 second after + receiving the last packet. I would set all UDP bi-directional + flows to 0.5 - 1.0 second aging to ensure that we do not inflate + the connection table over time. + + - One packet should be sent in each direction to be able to keep + connections active in the flow table. Packet size should be set + to a minimum that allows 6 CPS packets at maximum rate and at + least one packet on each of the active connections in both + directions that also allows for close to 100% link utilization + while not exceeding the TCP aging time of 1 sec. + + - TCP connection is established and terminated without any data + packets. + - Real use case + - 6 packets: SYN, SYN-ACK, ACK, FIN, FIN-ACK, ACK + - Flow Table Size: (2 \* CPS) + 15M + 15M + //For 5M CPS, Flow Table Size: (2 \* 1000) + 15M + 15M = ~30M + - Effective PPS: Sustained CPS \* 6 + PPS for background flows. + +- CPS and flow results will be measured while channel bandwidth is + saturated at 100Gbps for the duration of test runtime. At the same + time we want as close to 100Gbps without losing packets. + +- Inactivity based aging timer of 1 second. + + - All TCP connections should be deleted from the table after the + test completes. + + - The connection table should therefore be zero. + + - All UDP bi-directional flows need to age out before the 1 second + interval to allow for new UDP bi-directional flows to be + established. If everything works as advertised, we should never + see the connection table go above the 8M connections. If we do + then it is likely that UDP bi-directional flows were not aged + within the 1 second interval. To check this, we need to see a + high water counter for maximum connection table size. + +## Feature Requirements + +The following features are required to be enabled during scale testing: + +- VNET + - VXLAN-IN and VXLAN-OUT + - Encap based on lookup table, which can change/be updated + similarly as ENI policy + +- UDR + + - 200k routes per ENI with: + - MAC rewrite + - VNID rewrite + - DSCP rewrite + +- ACL + - 3-level NSG on connection (receive/transmit) in accordance with + the Packet Transformation document detailing our unique NSG + requirements. + + - For clarity, the first NSG is used by Azure to set policy for + the connection while the next two NSGs are set by the customer. + Think of it as a customer building their own firewall rules to + control which VMs can communicate with any other VM with a + unique set of policies. This allows the customer to setup the + VMs with similar control they would have in their own + enterprise. We cannot prevent the customer from forming complex + policy sets. They will likely use similar policies they use in + their own environment. + + - NSG on VNET, vport, subnet both on ingress and egress + traffic + - 100k SIP prefixes/ranges per policy + - 100k DIP prefixes/ranges per policy + +- Metering + + - Enabled on all routes in all v-ports (Currently 15 classes are + supported). + +- QoS per ENI BW + +- VNET Peering + +## Policy and Route Requirements + +The following scale of policies and routes are at minimum required to be +configured during validation and test plan needs to be executed covering +both scenarios: + +| | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | +|---------------|------------|--------------|-------|-------|-------| +| VNETs | | 1024 | 2048 | 4096 | 8192 | +| ENIs | | 64 | 128 | 256 | 512 | +| Routes | 100K | 6.4M | 12.8M | 25.6M | 51.2M | +| NSGs | 5in + 5out | 640 | 1280 | 2560 | 5120 | +| ACLs prefixes | 10x100K | 64M | 128M | 256M | 512M | +| ACLs Ports | 10x10K | 6.4M | 12.8M | 25.6M | 51.2M | +| Mappings (CA to PA) | 160K | 10M | 20M | 40M | 80M | +| Act Con | 500K (bidir w/ connection pool capable of oversubscription) | 32M | 64M | 128M | 256M | +| CPS | | 3.75M | 7.5M | 15M | 30M | +| bg flows TCP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | +| bg flows UDP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | + +- ACL rules per NSG = 1000 +- Prefixes per ACL rule = 100 +- Prefixes mapped per ACL rule = 16 +- Prefixes routed per ACL rule = 84 +- Routes per ACL rule = 10 +- -> Change Above: NSG per ENI changed since 5 Inbound & 5 Outbound stages are required + + +## MSFT LAB IXIA Configuration + +### Module Configuration + +IXIA module: NOVUS100GE8Q28 + +![msft-lab-ixia-config-01](images/req/msft-lab-ixia-config-01.png) + +![msft-lab-ixia-config-02](images/req/msft-lab-ixia-config-02.png) + +### Streams + +TX: Local vnic to remote vnic + +RX: Remote vnic to local vnic + +#### Learning Streams + +Learning Streams will be used to establish 15M CPS connections and 15M UDP +background bi-directional flows prior to test execution. These 15M flows +will be split across 64 vnics that are pre-configured. + +![learning-streams](images/req/learning-streams.png) + +- MSFT-8V-1M-TX-PPS-Learning + +![msft-8v-1m-tx-pps-learning-01](images/req/msft-8v-1m-tx-pps-learning-01.png) + +![msft-8v-1m-tx-pps-learning-02](images/req/msft-8v-1m-tx-pps-learning-02.png) + +**Packet view** + +``` cmd +MAC: ------ MAC Header ------ +MAC: +MAC: Destination Address : 00 AE CD 01 CD 26 +MAC: Source Address : 00 AE CD 20 00 01 +MAC: Type : 0x0800 (Ethernet II) +MAC: +IP: ------ IP Header ----------- +IP: +IP: Version = 04 (0x04) +IP: Header Length = 20 (0x14) +IP: Differentiated Services Field = 0 (0x00) +IP: 000000.. = DSCP: Default(0x00) +IP: ......0. = ECN Capable Transport (ECT): 0 +IP: .......0 = ECN-CE: 0 +IP: Type of Service = 00 (0x00) +IP: 000..... = Routine +IP: ...0.... = Normal Delay +IP: ....0... = Normal Throughput +IP: .....0.. = Normal Reliability +IP: ......0. = Normal Cost +IP: .......0 = Reserved +IP: Total Length = 100 (0x0064) +IP: Identification = 0 (0x0000) +IP: Flags Bit1 .0. May Fragment +IP: Flags Bit2 ..0 Last Fragment +IP: Fragment Offset = 0 +IP: Time to Live = 64 (0x40) +IP: Protocol = UDP +IP: Checksum = 0x7885 +IP: Source Address = 1.0.0.3 +IP: Destination Address = 1.0.0.2 +IP: +UDP: ------ UDP Header ----------- +UDP: +UDP: Source Port = 50686 (0xC5FE) +UDP: Destination Port = 4789 (0x12B5) +UDP: Length = 80 (0x0050) +UDP: Checksum = 1770 (0x06EA) +UDP: + +``` +- MSFT-8V-1M-RX-PPS-Learning + +![msft-8v-1m-rx-pps-learning-01](images/req/msft-8v-1m-rx-pps-learning-01.png) + +![msft-8v-1m-rx-pps-learning-02](images/req/msft-8v-1m-rx-pps-learning-02.png) + +#### Traffic Streams + +Traffic streams will be used for running the learning flows with 64 +packets per flow. Traffic streams simulating 1/8/16 packets per flow +need to be created individually. + +- MSFT-8V-1M-TX-PPS-64Pkt/Flow-100Sec + +![msft-8v-1m-tx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-01.png) + +![msft-8v-1m-tx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-02.png) + +- MSFT-8V-1M-RX-PPS-64Pkt/Flow-100Sec + +![msft-8v-1m-rx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-01.png) + +![msft-8v-1m-rx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-02.png) + +#### Bandwidth Streams + +Bandwidth streams runs with a higher packet size -- 500 byte -- and +will be used to verify the total 100Gbps bandwidth. + +- MSFT-8V-1M-TX-BW-Port1-100Sec + +![msft-8v-1m-tx-bw-port1-100sec-01](images/req/msft-8v-1m-tx-bw-port1-100sec-01.png) + +![msft-8v-1m-tx-bw-port1-100sec-02](images/req/msft-8v-1m-tx-bw-port1-100sec-02.png) + +**Packet view** + +```cmd +MAC: ------ MAC Header ------ +MAC: +MAC: Destination Address : 00 AE CD 01 CD 26 +MAC: Source Address : 00 AE CD 20 00 01 +MAC: Type : 0x0800 (Ethernet II) +MAC: +IP: ------ IP Header ----------- +IP: +IP: Version = 04 (0x04) +IP: Header Length = 20 (0x14) +IP: Differentiated Services Field = 0 (0x00) +IP: 000000.. = DSCP: Default(0x00) +IP: ......0. = ECN Capable Transport (ECT): 0 +IP: .......0 = ECN-CE: 0 +IP: Type of Service = 00 (0x00) +IP: 000..... = Routine +IP: ...0.... = Normal Delay +IP: ....0... = Normal Throughput +IP: .....0.. = Normal Reliability +IP: ......0. = Normal Cost +IP: .......0 = Reserved +IP: Total Length = 1482 (0x05CA) +IP: Identification = 0 (0x0000) +IP: Flags Bit1 .0. May Fragment +IP: Flags Bit2 ..0 Last Fragment +IP: Fragment Offset = 0 +IP: Time to Live = 64 (0x40) +IP: Protocol = UDP +IP: Checksum = 0x731F +IP: Source Address = 1.0.0.3 +IP: Destination Address = 1.0.0.2 +IP: +UDP: ------ UDP Header ----------- +UDP: +UDP: Source Port = 50686 (0xC5FE) +UDP: Destination Port = 4789 (0x12B5) +UDP: Length = 80 (0x0050) +UDP: Checksum = 1770 (0x06EA) +UDP: + +``` + +- MSFT-8V-1M-RX-BW-Port1-100Sec + +![msft-8v-1m-rx-bw-port1-100sec-01](images/req/msft-8v-1m-rx-bw-port1-100sec-01.png) + +![msft-8v-1m-rx-bw-port1-100sec-02](images/req/msft-8v-1m-rx-bw-port1-100sec-02.png) + +### CPS Streams + +CPS streams will be used to simulate TCP connection establishment and termination. + +![cps-streams](images/req/cps-streams.png) + +- MSFT-8V-4M-Stream 1-Syn-TX-CPS-100Sec + +![msft-8v-4m-stream-1-syn-tx-cps-100sec-01](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-01.png) + +![msft-8v-4m-stream-1-syn-tx-cps-100sec-02](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 2-Syn-Ack-RX-CPS-100Sec + +![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01.png) + +![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 3-Ack-TX-CPS-100Sec + +![msft-8v-4m-stream-3-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-01.png) + +![msft-8v-4m-stream-3-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 4-Fin-Ack-RX-CPS-100Sec + +![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01.png) + +![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 4-Fin-Ack-TX-CPS-100Sec + +![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01.png) + +![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 6-Ack-for-Fin-RX-CPS-100Sec + +![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01](images/req/[msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01.png) + +![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02](images/req/msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02.png) + +### Sample Policy Configuration + +#### Device + +```cmd +\"gw-ip-addr\": \"1.0.0.1\", + +\"kind\" : \"device\", + +\"gw-ip-addr\": \"1.0.0.1\", + +\"ip-addr\" : \"1.0.0.2\", + +\"mac-addr\" : \"\", + +\"dual-stack\": \"false\", + +\"encap\": \"vxlan\", + +\"oper-mode\": \"bitw-smart-switch\" +``` + +#### TEP + +```cmd +\"kind\" : \"tep\", + +\"count\" : \"2046\", + +\"prefix\": \"1.0.0.0/8\" + +``` + +#### Route Table + +```cmd +\"kind\" : \"route-table\", + +\"count\" : \"204800\", + +\"prefix-start\" : \"4.0.0.0/8\", + +\"meter\" : \"true\" + +#### Security Policy + +\"kind\" : \"security-policy\", + +\"v4-count\" : \"1023\" +``` + +#### VPC + +```cmd +\"kind\" : \"vpc\", + +\"count\" : \"16\", + +\"prefix\" : \"192.0.0.0/8\", + +\"subnets\" : \"1\" +``` +> [!NOTE] +> All VPCs will be configured with the same prefix. + +#### VNIC + +```cmd +\"kind\" : \"vnic\", + +\"count\" : \"1\", + +\"vlan-tagged\": \"false\" + +Note: VNIC configuration per vpc, subnet + +``` + +#### Mappings + +```cmd +\"kind\" : \"mappings\", + +\"remotes\" : \"64\", + +\"locals\" : \"8\", + +\"nat-prefix\" : \"3.0.0.0/8\" + +``` +> [!NOTE] +> Remotes are per subnet, tep. + +#### Policer + +```cmd +\"kind\" : \"policer\", + +\"count\" : \"16\", + +\"tx_policer_en\" : \"true\", + +\"rx_policer_en\" : \"true\" + +#### UDR + +\"kind\" : \"udr\", + +\"route-prefix\" : \"5.0.0.0/8\", + +\"overlay-mac\" : \"\", + +\"encap\" : \"\", + +\"tos\" : \"\" + +``` + +#### Meter Policy + +```cmd +\"kind\" : \"meter-policy\", + +\"count-xl\" : \"16383\", + +\"count-m\" : \"1023\", + +\"prefix\" : \"4.0.0.0/8\" + +``` From 34bd3612aac478d5a8715368be7a3f9a0afef92a Mon Sep 17 00:00:00 2001 From: vincent-xs <114104889+vincent-xs@users.noreply.github.com> Date: Wed, 24 May 2023 18:59:24 -0400 Subject: [PATCH 19/75] update saithrift-bld Dockerfile to accept the ubuntu image SHA as ARG (#368) when libsai.so is created with a compiler version that is newer than what is run within the saithrift builder docker container, we may run into unresolved linkage error (such as unresolved __libc_single_threaded). however, if the compiler is older, we are fine. so we need to upgrade the distro used within the saithrift build docker image. more generically, this change allows to provide the ubuntu SHA to be used by docker to build the image from the calling Makefile. by default, we'll use a 22.04 ubuntu version, but this can be overridden by setting AMD64_UBUNTU_SHA256 to the wanted hash. --- dash-pipeline/Makefile | 33 +++++++++++++------ .../dockerfiles/Dockerfile.saithrift-bldr | 12 ++++--- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index f8d065320..95f2b5991 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -73,6 +73,8 @@ DOCKER_RUN := docker run \ --rm \ $(DOCKER_FLAGS) +SHA1SUM := sha1sum | awk '{print substr($$1,0,11);}' + SAI/SAI: sai-submodule sai-submodule: @@ -163,7 +165,7 @@ DOCKER_RUN_SAITHRIFT_BLDR =\ sai: sai-clean sai-headers sai-meta libsai -sai-headers: p4 | SAI/SAI +sai-headers: p4 docker-saithrift-bldr-image-exists | SAI/SAI @echo "Generate SAI library headers and implementation..." mkdir -p SAI/lib && chmod -R o+w SAI && \ $(DOCKER_RUN) \ @@ -238,7 +240,7 @@ kill-switch: # SAI-THRIFT SERVER TARGETS ############################### -saithrift-server: +saithrift-server: docker-saithrift-bldr-image-exists $(DOCKER_RUN_SAITHRIFT_BLDR) \ make $@ @@ -267,7 +269,7 @@ run-saithrift-server-bash: $(DOCKER_RUN_SAITHRIFT_SRVR) \ /bin/bash -saithrift-server-clean: +saithrift-server-clean: docker-saithrift-bldr-image-exists $(DOCKER_RUN_SAITHRIFT_BLDR) \ make $@ rm -rf SAI/rpc @@ -328,7 +330,7 @@ init-switch: # DOCKER BUILD/PUBLISH TARGETS ############################### -DOCKER_BMV2_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.bmv2-bldr | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_BMV2_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.bmv2-bldr | $(SHA1SUM)) DOCKER_BMV2_BLDR_IMG = $(DOCKER_BMV2_BLDR_IMG_NAME):$(DOCKER_BMV2_BLDR_IMG_TAG) docker-bmv2-bldr: @@ -363,15 +365,26 @@ docker-publish-bmv2-bldr: docker push $(DOCKER_BMV2_BLDR_IMG_NAME):$(DOCKER_BMV2_BLDR_IMG_CTAG) ############################### +# Ubuntu docker image SHA +# amd64/ubuntu:20.04 on 2022-07-03 +AMD64_UBUNTU_20_04 := b2339eee806d44d6a8adc0a790f824fb71f03366dd754d400316ae5a7e3ece3e +# amd64/ubuntu:22.04 on 2023-05-16 +AMD64_UBUNTU_22_04 := ca5534a51dd04bbcebe9b23ba05f389466cf0c190f1f8f182d7eea92a9671d00 + +AMD64_UBUNTU_SHA256 ?= $(AMD64_UBUNTU_22_04) -DOCKER_SAITHRIFT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saithrift-bldr | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_SAITHRIFT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saithrift-bldr | sed 's/ubuntu_image_sha/$(AMD64_UBUNTU_SHA256)/g' | $(SHA1SUM)) DOCKER_SAITHRIFT_BLDR_IMG = $(DOCKER_SAITHRIFT_BLDR_IMG_NAME):$(DOCKER_SAITHRIFT_BLDR_IMG_TAG) +docker-saithrift-bldr-image-exists: + docker images --format "{{.Repository}}:{{.Tag}}" | grep $(DOCKER_SAITHRIFT_BLDR_IMG) || make docker-saithrift-bldr + docker-saithrift-bldr: { [ x$(ENABLE_DOCKER_PULL) == xy ] && docker pull $(DOCKER_SAITHRIFT_BLDR_IMG); } || \ docker build \ -f dockerfiles/Dockerfile.saithrift-bldr \ -t $(DOCKER_SAITHRIFT_BLDR_IMG) \ + --build-arg ubuntu_image_sha=$(AMD64_UBUNTU_SHA256) \ --build-arg user=$(DASH_USER) \ --build-arg group=$(DASH_GROUP) \ --build-arg uid=$(DASH_UID) \ @@ -395,7 +408,7 @@ docker-publish-saithrift-bldr: ############################### # Builder, has base packages to make client docker -DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saithrift-client-bldr | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saithrift-client-bldr | $(SHA1SUM)) DOCKER_SAITHRIFT_CLIENT_BLDR_IMG = $(DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_NAME):$(DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_TAG) docker-saithrift-client-bldr: @@ -483,7 +496,7 @@ run-saithrift-client-bash: ############################### -DOCKER_P4C_BMV2_IMG_TAG = $(shell cat dockerfiles/Dockerfile.p4c-bmv2 | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_P4C_BMV2_IMG_TAG = $(shell cat dockerfiles/Dockerfile.p4c-bmv2 | $(SHA1SUM)) DOCKER_P4C_BMV2_IMG = $(DOCKER_P4C_BMV2_IMG_NAME):$(DOCKER_P4C_BMV2_IMG_TAG) docker-dash-p4c: @@ -512,7 +525,7 @@ docker-publish-dash-p4c: ############################### -DOCKER_P4C_DPDK_IMG_TAG = $(shell cat dockerfiles/Dockerfile.p4c-dpdk | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_P4C_DPDK_IMG_TAG = $(shell cat dockerfiles/Dockerfile.p4c-dpdk | $(SHA1SUM)) DOCKER_P4C_DPDK_IMG = $(DOCKER_P4C_DPDK_IMG_NAME):$(DOCKER_P4C_DPDK_IMG_TAG) docker-dash-p4c-dpdk: @@ -541,7 +554,7 @@ docker-publish-dash-p4c-dpdk: ############################### -DOCKER_GRPC_IMG_TAG = $(shell cat dockerfiles/Dockerfile.grpc1.43.2 | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_GRPC_IMG_TAG = $(shell cat dockerfiles/Dockerfile.grpc1.43.2 | $(SHA1SUM)) DOCKER_GRPC_IMG = $(DOCKER_GRPC_IMG_NAME):$(DOCKER_GRPC_IMG_TAG) docker-dash-grpc: @@ -639,7 +652,7 @@ ifeq ($(SAI_CHALLENGER_TEST),) SAI_CHALLENGER_TEST := . endif -DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saichallenger-client-bldr | sha1sum | awk '{print substr($$1,0,11);}') +DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saichallenger-client-bldr | $(SHA1SUM)) DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG = $(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_NAME):$(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_TAG) docker-saichallenger-client-bldr: diff --git a/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr b/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr index 7f91a7098..46b90b77f 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr @@ -1,13 +1,15 @@ +ARG ubuntu_image_sha + FROM sonicdash.azurecr.io/dash-grpc:1.43.2 as grpc FROM sonicdash.azurecr.io/dash-bmv2-bldr:220819 as bmv2 -# amd64/ubuntu:20.04 on 2022-07-03 -FROM amd64/ubuntu@sha256:b2339eee806d44d6a8adc0a790f824fb71f03366dd754d400316ae5a7e3ece3e as builder + +FROM amd64/ubuntu@sha256:$ubuntu_image_sha as builder + LABEL maintainer="SONiC-DASH Community " LABEL description="This Docker image contains the toolchain to build \ the saithrift client & server + sai-P4Runtime adaptor layer, for DASH." - # Configure make to run as many parallel jobs as cores available ARG available_processors ARG MAKEFLAGS=-j$available_processors @@ -17,7 +19,7 @@ ENV TZ=America/Los_Angeles RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ENV GIT_SSL_NO_VERIFY=true -ENV SAI_PTF_DEPS sudo git python wget doxygen graphviz aspell-en \ +ENV SAI_PTF_DEPS sudo git python3 wget doxygen graphviz aspell-en \ libgetopt-long-descriptive-perl libconst-fast-perl \ libtemplate-perl libnamespace-autoclean-perl libmoose-perl libmoosex-aliases-perl @@ -42,7 +44,7 @@ RUN wget http://archive.apache.org/dist/thrift/0.11.0/thrift-0.11.0.tar.gz && \ make && \ make install && \ cd lib/py && \ - python setup.py sdist && \ + python3 setup.py sdist && \ sudo cp dist/* /usr/lib && \ cd / && \ rm -rf thrift-0.11.0 thrift-0.11.0.tar.gz From b60a8197cfb8e964c333c29dfa24c0528c233982 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Wed, 24 May 2023 16:05:24 -0700 Subject: [PATCH 20/75] Revert "update to scale numbers (#369)" This reverts commit 88620767c05e5705f6fa2537114f20499246bb22. --- ...rogram-scale-testing-requirements-draft.md | 1320 +++++++++-------- 1 file changed, 670 insertions(+), 650 deletions(-) diff --git a/documentation/general/program-scale-testing-requirements-draft.md b/documentation/general/program-scale-testing-requirements-draft.md index c3c32b5a5..3f7e1f0f3 100644 --- a/documentation/general/program-scale-testing-requirements-draft.md +++ b/documentation/general/program-scale-testing-requirements-draft.md @@ -1,650 +1,670 @@ -# Program Scale Testing Requirements for LAB Validation - ->**NOTE**: This prelimiary document includes a text description of a so-called **"Hero Test"** to establish minimum performance requirements and screen captures of Layer 2/3 packet generator stream configurations for IXIA IxExplorer packet tester device. These L23 streams simulate L4 connection establishment. This document, and the testing methodology, will be replaced by a more formal, complete requirements specification and automated testing scripts in due time. - -## Table of Contents - -[Introduction](#introduction) - -[Test Methodology and Definitions](#test-methodology-and-definitions) - -[Feature Requirements](#feature-requirements) - -[Policy and Route Requirements](#policy-and-route-requirements) - -[MSFT LAB IXIA Configuration](#msft-lab-ixia-configuration) - -- [Module Configuration](#module-configuration) - -- [Streams](#streams) - - - [Learning Streams](#learning-streams) - - - [Traffic Streams](#traffic-streams) - - - [Bandwidth Streams](#bandwidth-streams) - - - [CPS Streams](#cps-streams) - -[Sample Policy Configuration](#sample-policy-configuration) - -- [Device](#device) - -- [TEP](#tep) - -- [Route Table](#route-table) - -- [Security Policy](#security-policy) - -- [VPC](#vpc) - -- [VNIC](#vnic) - -- [Mappings](#mappings) - -- [Policer](#policer) - -- [UDR](#udr) - -- [Meter Policy](#meter-policy) - -
- -## Introduction - -This document summarizes scale testing requirements for validating program deliverables. - -This document will refer to Connection Per Second (CPS) capability as 5M -which correlates to 10M flow operations. This capability is a -placeholder for reference and the specific hardware supported value will -be used to evaluate different firmware drops. - -What we are looking for in a series of testing is how well the NIC -handles: - -1. Connections/sec per ENI and per NIC -2. Number of active connections per ENI and per NIC -3. Number of flows per ENI and per NIC -4. ENIs' connection pool can be oversubscribed. An oversubscription of 2:1 would be expected, so the connection pool can be more optimal if executed as one large table where ENI can be apart of the key. The connection table would be the most appropriate table for oversubscription scenarios. -5. Throughput under max connections per second load with the remaining - bandwidth is filled with pre-learned connections that receive at - least one packet per second while driving the links to near 100% - utilization. This requires some work up front to get the right mix - of CPS and active connections with zero drops. **We do not accept - results with drops as we cannot use that test to measure latency and - jitter**. We therefore also run the test sufficiently long to see if - there were any queue build-ups which would eventually lead to drops - and distort both latency and jitter results. -6. Aging of (TCP bi-directional connections) and (UDP bi-directional flows) such that - after the test is complete all connections are aged within the 1 - second interval or any other interval we program. -7. We are expecting to cover below scenarios as follow-on tests: - - a. Age arbitrary connections to verify that aging is also working - properly under maximum load. - - b. Download new policies and delete old policies at a significant - rate to ensure that CPS, Active Connections, Aging, and new - Policies are properly handled with the external memory, which is - often the bottleneck for performance. - -Why are we running these tests? - -1. Many NICs require software to inspect the SYN/ACK/ACK and - FIN/ACK/ACK packets of a connection. The software is responsible for - the formation, deletion connection and forwarding table entries - after significant and complex cloud policy enforcement along with - any associated accounting. Software based connection management - often results in poor connections/second with limits in the 10s of - thousands/sec. The set of test and associated table parameters found - in this document are designed to find the maximum CPS with the - maximum number of connections all actively receiving packets every - second. The more that is done in specialized hardware the more we - expect the CPS to increase. **Any NIC for the application that - cannot achieve millions of connections/sec will automatically be - disqualified from further testing.** -2. Many NICs can create (a large number) of connections simply by - adding more external memory for the connection table. For example, a - NIC can create 1M connections in its external table, however if - packets arrive across the entire connection set in a random order, - it forces the NIC out of its internal **connection cache** and to - use the external connection table instead. Under this condition we - have measured some NICs to achieve 10% advertised link throughput. - The testing below will ensure this condition is exercised and - provide the true worst-case throughput that is reflective of some - real-world conditions like firewalls, load balancers, DDoS, - v-routers etc. **It should also be noted that creating a connection - in a table that never receives a subsequent packet (other than - keepalives once every few minutes) is referred to as an idle - connection and is a useless parameter that should never be - advertised and will not be tested other than for conformance.** -3. Aging is also a vital component of tracking connections. Even under - the worst load the system must be able to age connections. All - packets will require either connection setup/teardown or policy - lookups/updates involving external memory and hence the memory - management of the connection table is extremely important. The tests - in this document will ensure that no matter what processing is going - on, the connection table will be maintained providing the proper - aging intervals to each connection. -4. We need to be able to enter/delete many new policies at any time - regardless of load. For this reason, we will run the test without - updates to policy to get a baseline and then again with some - extensive policies being added/deleted during the same test. We will - look for any regressions while adding/deleting policies at a - significant rate. This matches the real-world requirement of adding - and deleting VMs to a node or to the VNET. - -In the end we are looking for total invisibility for the end customer. -Customers are used to their NICs in the enterprise forwarding at -Layer-3. Most NICs and switches can do this at wire rate under a wide -variety of conditions. When the customer enters the cloud, they expect -the same behavior. When they setup their solution for the first time, -often, they will not see the same performance and in the worst case will -have to totally re-architect their already working solutions with a -scale-out model. This means that their hybrid and cloud architectures -will diverge and create a large amount of extra work for IT or solution -integrators to track and test the designs in a common manner. - -## Test Methodology and Definitions - -- **CPS**: Sustained Connections Per Second. 5M and 10M flows are only - placeholders and will be determined by the supplier as each - implementation will vary depending on the maturity of the DASH - design. - - - 5M CPS means that 5M new connections are established and - destroyed over a one second interval. - - - Every connection consists of two flows hence 5M new connections - mean: - - - 10M flow additions every second to insert connections. - - - 10M flow deletions every second because of expiry of old - connections which will also allow capacity for new - connections to be formed in the next second. - - - 20M total flow operations every second - - - 5M CPS is a "per card" goal. Card must be able to sustainably - handle 5M CPS irrespectively if either single ENI is configured - on a card or multiple ENIs are configured. Total CPS per card - must always be reaching same 5M goal, and this goal must not be - degraded if card will have multiple ENIs programmed with - different policy each. Same goes for total flows supported on a - card. - -- **Test Runtime**: 100 seconds. We feel this is sufficient time to - pick up any anomalies the NIC may have running interval tasks - unknown to the tester. - -- **Effective CPS**: CPS results over 100 seconds by the Ixia - setup/teardown rates, however, will not be accepted if there are any - drops for any reason. Drops end up deviating the true latency and - jitter numbers. - -- **Performance Testing Methodology**: - - - 15M TCP background connections setup before testing. - - - 15M UDP background bi-directional flows setup before testing. - - - We use an equal mix of TCP and UDP although in the real world we - expect more TCP and in fact in some cases we meter UDP as a - potential source of DoS. - - - Connection aging set to 1 sec and requires each connection or - bi-directional flow to receive one packet every second in each - direction at a size that will fill up the links to near 100% in - conjunction with the dynamically setup connection traffic. For - this to be run successfully it may take a few runs as each TCP - connection setup and teardown takes 6 packets. - - - For UDP a bidirectional flow is created for the first packet - seen that meets the policy for the bi-directional flow setup. - When using this in CPS testing, we will send a total of 6 - packets to match TCP to make things more balanced. UDP - bi-directional flows will be aged within 1 second after - receiving the last packet. I would set all UDP bi-directional - flows to 0.5 - 1.0 second aging to ensure that we do not inflate - the connection table over time. - - - One packet should be sent in each direction to be able to keep - connections active in the flow table. Packet size should be set - to a minimum that allows 6 CPS packets at maximum rate and at - least one packet on each of the active connections in both - directions that also allows for close to 100% link utilization - while not exceeding the TCP aging time of 1 sec. - - - TCP connection is established and terminated without any data - packets. - - Real use case - - 6 packets: SYN, SYN-ACK, ACK, FIN, FIN-ACK, ACK - - Flow Table Size: (2 \* CPS) + 15M + 15M - //For 5M CPS, Flow Table Size: (2 \* 1000) + 15M + 15M = ~30M - - Effective PPS: Sustained CPS \* 6 + PPS for background flows. - -- CPS and flow results will be measured while channel bandwidth is - saturated at 100Gbps for the duration of test runtime. At the same - time we want as close to 100Gbps without losing packets. - -- Inactivity based aging timer of 1 second. - - - All TCP connections should be deleted from the table after the - test completes. - - - The connection table should therefore be zero. - - - All UDP bi-directional flows need to age out before the 1 second - interval to allow for new UDP bi-directional flows to be - established. If everything works as advertised, we should never - see the connection table go above the 8M connections. If we do - then it is likely that UDP bi-directional flows were not aged - within the 1 second interval. To check this, we need to see a - high water counter for maximum connection table size. - -## Feature Requirements - -The following features are required to be enabled during scale testing: - -- VNET - - VXLAN-IN and VXLAN-OUT - - Encap based on lookup table, which can change/be updated - similarly as ENI policy - -- UDR - - - 200k routes per ENI with: - - MAC rewrite - - VNID rewrite - - DSCP rewrite - -- ACL - - 3-level NSG on connection (receive/transmit) in accordance with - the Packet Transformation document detailing our unique NSG - requirements. - - - For clarity, the first NSG is used by Azure to set policy for - the connection while the next two NSGs are set by the customer. - Think of it as a customer building their own firewall rules to - control which VMs can communicate with any other VM with a - unique set of policies. This allows the customer to setup the - VMs with similar control they would have in their own - enterprise. We cannot prevent the customer from forming complex - policy sets. They will likely use similar policies they use in - their own environment. - - - NSG on VNET, vport, subnet both on ingress and egress - traffic - - 100k SIP prefixes/ranges per policy - - 100k DIP prefixes/ranges per policy - -- Metering - - - Enabled on all routes in all v-ports (Currently 15 classes are - supported). - -- QoS per ENI BW - -- VNET Peering - -## Policy and Route Requirements - -The following scale of policies and routes are at minimum required to be -configured during validation and test plan needs to be executed covering -both scenarios: - -| | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | -|---------------|------------|--------------|-------|-------|-------| -| VNETs | | 1024 | 2048 | 4096 | 8192 | -| ENIs | | 64 | 128 | 256 | 512 | -| Routes | 100K | 6.4M | 12.8M | 25.6M | 51.2M | -| NSGs | 5in + 5out | 640 | 1280 | 2560 | 5120 | -| ACLs prefixes | 10x100K | 64M | 128M | 256M | 512M | -| ACLs Ports | 10x10K | 6.4M | 12.8M | 25.6M | 51.2M | -| Mappings (CA to PA) | 160K | 10M | 20M | 40M | 80M | -| Act Con | 500K (bidir w/ connection pool capable of oversubscription) | 32M | 64M | 128M | 256M | -| CPS | | 3.75M | 7.5M | 15M | 30M | -| bg flows TCP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | -| bg flows UDP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | - -- ACL rules per NSG = 1000 -- Prefixes per ACL rule = 100 -- Prefixes mapped per ACL rule = 16 -- Prefixes routed per ACL rule = 84 -- Routes per ACL rule = 10 -- -> Change Above: NSG per ENI changed since 5 Inbound & 5 Outbound stages are required - - -## MSFT LAB IXIA Configuration - -### Module Configuration - -IXIA module: NOVUS100GE8Q28 - -![msft-lab-ixia-config-01](images/req/msft-lab-ixia-config-01.png) - -![msft-lab-ixia-config-02](images/req/msft-lab-ixia-config-02.png) - -### Streams - -TX: Local vnic to remote vnic - -RX: Remote vnic to local vnic - -#### Learning Streams - -Learning Streams will be used to establish 15M CPS connections and 15M UDP -background bi-directional flows prior to test execution. These 15M flows -will be split across 64 vnics that are pre-configured. - -![learning-streams](images/req/learning-streams.png) - -- MSFT-8V-1M-TX-PPS-Learning - -![msft-8v-1m-tx-pps-learning-01](images/req/msft-8v-1m-tx-pps-learning-01.png) - -![msft-8v-1m-tx-pps-learning-02](images/req/msft-8v-1m-tx-pps-learning-02.png) - -**Packet view** - -``` cmd -MAC: ------ MAC Header ------ -MAC: -MAC: Destination Address : 00 AE CD 01 CD 26 -MAC: Source Address : 00 AE CD 20 00 01 -MAC: Type : 0x0800 (Ethernet II) -MAC: -IP: ------ IP Header ----------- -IP: -IP: Version = 04 (0x04) -IP: Header Length = 20 (0x14) -IP: Differentiated Services Field = 0 (0x00) -IP: 000000.. = DSCP: Default(0x00) -IP: ......0. = ECN Capable Transport (ECT): 0 -IP: .......0 = ECN-CE: 0 -IP: Type of Service = 00 (0x00) -IP: 000..... = Routine -IP: ...0.... = Normal Delay -IP: ....0... = Normal Throughput -IP: .....0.. = Normal Reliability -IP: ......0. = Normal Cost -IP: .......0 = Reserved -IP: Total Length = 100 (0x0064) -IP: Identification = 0 (0x0000) -IP: Flags Bit1 .0. May Fragment -IP: Flags Bit2 ..0 Last Fragment -IP: Fragment Offset = 0 -IP: Time to Live = 64 (0x40) -IP: Protocol = UDP -IP: Checksum = 0x7885 -IP: Source Address = 1.0.0.3 -IP: Destination Address = 1.0.0.2 -IP: -UDP: ------ UDP Header ----------- -UDP: -UDP: Source Port = 50686 (0xC5FE) -UDP: Destination Port = 4789 (0x12B5) -UDP: Length = 80 (0x0050) -UDP: Checksum = 1770 (0x06EA) -UDP: - -``` -- MSFT-8V-1M-RX-PPS-Learning - -![msft-8v-1m-rx-pps-learning-01](images/req/msft-8v-1m-rx-pps-learning-01.png) - -![msft-8v-1m-rx-pps-learning-02](images/req/msft-8v-1m-rx-pps-learning-02.png) - -#### Traffic Streams - -Traffic streams will be used for running the learning flows with 64 -packets per flow. Traffic streams simulating 1/8/16 packets per flow -need to be created individually. - -- MSFT-8V-1M-TX-PPS-64Pkt/Flow-100Sec - -![msft-8v-1m-tx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-01.png) - -![msft-8v-1m-tx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-02.png) - -- MSFT-8V-1M-RX-PPS-64Pkt/Flow-100Sec - -![msft-8v-1m-rx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-01.png) - -![msft-8v-1m-rx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-02.png) - -#### Bandwidth Streams - -Bandwidth streams runs with a higher packet size -- 500 byte -- and -will be used to verify the total 100Gbps bandwidth. - -- MSFT-8V-1M-TX-BW-Port1-100Sec - -![msft-8v-1m-tx-bw-port1-100sec-01](images/req/msft-8v-1m-tx-bw-port1-100sec-01.png) - -![msft-8v-1m-tx-bw-port1-100sec-02](images/req/msft-8v-1m-tx-bw-port1-100sec-02.png) - -**Packet view** - -```cmd -MAC: ------ MAC Header ------ -MAC: -MAC: Destination Address : 00 AE CD 01 CD 26 -MAC: Source Address : 00 AE CD 20 00 01 -MAC: Type : 0x0800 (Ethernet II) -MAC: -IP: ------ IP Header ----------- -IP: -IP: Version = 04 (0x04) -IP: Header Length = 20 (0x14) -IP: Differentiated Services Field = 0 (0x00) -IP: 000000.. = DSCP: Default(0x00) -IP: ......0. = ECN Capable Transport (ECT): 0 -IP: .......0 = ECN-CE: 0 -IP: Type of Service = 00 (0x00) -IP: 000..... = Routine -IP: ...0.... = Normal Delay -IP: ....0... = Normal Throughput -IP: .....0.. = Normal Reliability -IP: ......0. = Normal Cost -IP: .......0 = Reserved -IP: Total Length = 1482 (0x05CA) -IP: Identification = 0 (0x0000) -IP: Flags Bit1 .0. May Fragment -IP: Flags Bit2 ..0 Last Fragment -IP: Fragment Offset = 0 -IP: Time to Live = 64 (0x40) -IP: Protocol = UDP -IP: Checksum = 0x731F -IP: Source Address = 1.0.0.3 -IP: Destination Address = 1.0.0.2 -IP: -UDP: ------ UDP Header ----------- -UDP: -UDP: Source Port = 50686 (0xC5FE) -UDP: Destination Port = 4789 (0x12B5) -UDP: Length = 80 (0x0050) -UDP: Checksum = 1770 (0x06EA) -UDP: - -``` - -- MSFT-8V-1M-RX-BW-Port1-100Sec - -![msft-8v-1m-rx-bw-port1-100sec-01](images/req/msft-8v-1m-rx-bw-port1-100sec-01.png) - -![msft-8v-1m-rx-bw-port1-100sec-02](images/req/msft-8v-1m-rx-bw-port1-100sec-02.png) - -### CPS Streams - -CPS streams will be used to simulate TCP connection establishment and termination. - -![cps-streams](images/req/cps-streams.png) - -- MSFT-8V-4M-Stream 1-Syn-TX-CPS-100Sec - -![msft-8v-4m-stream-1-syn-tx-cps-100sec-01](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-01.png) - -![msft-8v-4m-stream-1-syn-tx-cps-100sec-02](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 2-Syn-Ack-RX-CPS-100Sec - -![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01.png) - -![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 3-Ack-TX-CPS-100Sec - -![msft-8v-4m-stream-3-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-01.png) - -![msft-8v-4m-stream-3-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 4-Fin-Ack-RX-CPS-100Sec - -![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01.png) - -![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 4-Fin-Ack-TX-CPS-100Sec - -![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01.png) - -![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02.png) - -- MSFT-8V-4M-Stream 6-Ack-for-Fin-RX-CPS-100Sec - -![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01](images/req/[msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01.png) - -![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02](images/req/msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02.png) - -### Sample Policy Configuration - -#### Device - -```cmd -\"gw-ip-addr\": \"1.0.0.1\", - -\"kind\" : \"device\", - -\"gw-ip-addr\": \"1.0.0.1\", - -\"ip-addr\" : \"1.0.0.2\", - -\"mac-addr\" : \"\", - -\"dual-stack\": \"false\", - -\"encap\": \"vxlan\", - -\"oper-mode\": \"bitw-smart-switch\" -``` - -#### TEP - -```cmd -\"kind\" : \"tep\", - -\"count\" : \"2046\", - -\"prefix\": \"1.0.0.0/8\" - -``` - -#### Route Table - -```cmd -\"kind\" : \"route-table\", - -\"count\" : \"204800\", - -\"prefix-start\" : \"4.0.0.0/8\", - -\"meter\" : \"true\" - -#### Security Policy - -\"kind\" : \"security-policy\", - -\"v4-count\" : \"1023\" -``` - -#### VPC - -```cmd -\"kind\" : \"vpc\", - -\"count\" : \"16\", - -\"prefix\" : \"192.0.0.0/8\", - -\"subnets\" : \"1\" -``` -> [!NOTE] -> All VPCs will be configured with the same prefix. - -#### VNIC - -```cmd -\"kind\" : \"vnic\", - -\"count\" : \"1\", - -\"vlan-tagged\": \"false\" - -Note: VNIC configuration per vpc, subnet - -``` - -#### Mappings - -```cmd -\"kind\" : \"mappings\", - -\"remotes\" : \"64\", - -\"locals\" : \"8\", - -\"nat-prefix\" : \"3.0.0.0/8\" - -``` -> [!NOTE] -> Remotes are per subnet, tep. - -#### Policer - -```cmd -\"kind\" : \"policer\", - -\"count\" : \"16\", - -\"tx_policer_en\" : \"true\", - -\"rx_policer_en\" : \"true\" - -#### UDR - -\"kind\" : \"udr\", - -\"route-prefix\" : \"5.0.0.0/8\", - -\"overlay-mac\" : \"\", - -\"encap\" : \"\", - -\"tos\" : \"\" - -``` - -#### Meter Policy - -```cmd -\"kind\" : \"meter-policy\", - -\"count-xl\" : \"16383\", - -\"count-m\" : \"1023\", - -\"prefix\" : \"4.0.0.0/8\" - -``` +# Program Scale Testing Requirements for LAB Validation + +>**NOTE**: This prelimiary document includes a text description of a so-called **"Hero Test"** to establish minimum performance requirements and screen captures of Layer 2/3 packet generator stream configurations for IXIA IxExplorer packet tester device. These L23 streams simulate L4 connection establishment. This document, and the testing methodology, will be replaced by a more formal, complete requirements specification and automated testing scripts in due time. + +## Table of Contents + +[Introduction](#introduction) + +[Test Methodology and Definitions](#test-methodology-and-definitions) + +[Feature Requirements](#feature-requirements) + +[Policy and Route Requirements](#policy-and-route-requirements) + +[MSFT LAB IXIA Configuration](#msft-lab-ixia-configuration) + +- [Module Configuration](#module-configuration) + +- [Streams](#streams) + + - [Learning Streams](#learning-streams) + + - [Traffic Streams](#traffic-streams) + + - [Bandwidth Streams](#bandwidth-streams) + + - [CPS Streams](#cps-streams) + +[Sample Policy Configuration](#sample-policy-configuration) + +- [Device](#device) + +- [TEP](#tep) + +- [Route Table](#route-table) + +- [Security Policy](#security-policy) + +- [VPC](#vpc) + +- [VNIC](#vnic) + +- [Mappings](#mappings) + +- [Policer](#policer) + +- [UDR](#udr) + +- [Meter Policy](#meter-policy) + +
+ +## Introduction + +This document summarizes scale testing requirements for validating program deliverables. + +This document will refer to Connection Per Second (CPS) capability as 5M +which correlates to 10M flow operations. This capability is a +placeholder for reference and the specific hardware supported value will +be used to evaluate different firmware drops. + +What we are looking for in a series of testing is how well the NIC +handles: + +1. Connections/sec per ENI and per NIC +2. Number of active connections per ENI and per NIC +3. Number of flows per ENI and per NIC +4. ENIs' connection pool can be oversubscribed. An oversubscription of 2:1 would be expected, so the connection pool can be more optimal if executed as one large table where ENI can be apart of the key. The connection table would be the most appropriate table for oversubscription scenarios. +5. Throughput under max connections per second load with the remaining + bandwidth is filled with pre-learned connections that receive at + least one packet per second while driving the links to near 100% + utilization. This requires some work up front to get the right mix + of CPS and active connections with zero drops. **We do not accept + results with drops as we cannot use that test to measure latency and + jitter**. We therefore also run the test sufficiently long to see if + there were any queue build-ups which would eventually lead to drops + and distort both latency and jitter results. +6. Aging of (TCP bi-directional connections) and (UDP bi-directional flows) such that + after the test is complete all connections are aged within the 1 + second interval or any other interval we program. +7. We are expecting to cover below scenarios as follow-on tests: + + a. Age arbitrary connections to verify that aging is also working + properly under maximum load. + + b. Download new policies and delete old policies at a significant + rate to ensure that CPS, Active Connections, Aging, and new + Policies are properly handled with the external memory, which is + often the bottleneck for performance. + +Why are we running these tests? + +1. Many NICs require software to inspect the SYN/ACK/ACK and + FIN/ACK/ACK packets of a connection. The software is responsible for + the formation, deletion connection and forwarding table entries + after significant and complex cloud policy enforcement along with + any associated accounting. Software based connection management + often results in poor connections/second with limits in the 10s of + thousands/sec. The set of test and associated table parameters found + in this document are designed to find the maximum CPS with the + maximum number of connections all actively receiving packets every + second. The more that is done in specialized hardware the more we + expect the CPS to increase. **Any NIC for the application that + cannot achieve millions of connections/sec will automatically be + disqualified from further testing.** +2. Many NICs can create (a large number) of connections simply by + adding more external memory for the connection table. For example, a + NIC can create 1M connections in its external table, however if + packets arrive across the entire connection set in a random order, + it forces the NIC out of its internal **connection cache** and to + use the external connection table instead. Under this condition we + have measured some NICs to achieve 10% advertised link throughput. + The testing below will ensure this condition is exercised and + provide the true worst-case throughput that is reflective of some + real-world conditions like firewalls, load balancers, DDoS, + v-routers etc. **It should also be noted that creating a connection + in a table that never receives a subsequent packet (other than + keepalives once every few minutes) is referred to as an idle + connection and is a useless parameter that should never be + advertised and will not be tested other than for conformance.** +3. Aging is also a vital component of tracking connections. Even under + the worst load the system must be able to age connections. All + packets will require either connection setup/teardown or policy + lookups/updates involving external memory and hence the memory + management of the connection table is extremely important. The tests + in this document will ensure that no matter what processing is going + on, the connection table will be maintained providing the proper + aging intervals to each connection. +4. We need to be able to enter/delete many new policies at any time + regardless of load. For this reason, we will run the test without + updates to policy to get a baseline and then again with some + extensive policies being added/deleted during the same test. We will + look for any regressions while adding/deleting policies at a + significant rate. This matches the real-world requirement of adding + and deleting VMs to a node or to the VNET. + +In the end we are looking for total invisibility for the end customer. +Customers are used to their NICs in the enterprise forwarding at +Layer-3. Most NICs and switches can do this at wire rate under a wide +variety of conditions. When the customer enters the cloud, they expect +the same behavior. When they setup their solution for the first time, +often, they will not see the same performance and in the worst case will +have to totally re-architect their already working solutions with a +scale-out model. This means that their hybrid and cloud architectures +will diverge and create a large amount of extra work for IT or solution +integrators to track and test the designs in a common manner. + +## Test Methodology and Definitions + +- **CPS**: Sustained Connections Per Second. 5M and 10M flows are only + placeholders and will be determined by the supplier as each + implementation will vary depending on the maturity of the DASH + design. + + - 5M CPS means that 5M new connections are established and + destroyed over a one second interval. + + - Every connection consists of two flows hence 5M new connections + mean: + + - 10M flow additions every second to insert connections. + + - 10M flow deletions every second because of expiry of old + connections which will also allow capacity for new + connections to be formed in the next second. + + - 20M total flow operations every second + + - 5M CPS is a "per card" goal. Card must be able to sustainably + handle 5M CPS irrespectively if either single ENI is configured + on a card or multiple ENIs are configured. Total CPS per card + must always be reaching same 5M goal, and this goal must not be + degraded if card will have multiple ENIs programmed with + different policy each. Same goes for total flows supported on a + card. + +- **Test Runtime**: 100 seconds. We feel this is sufficient time to + pick up any anomalies the NIC may have running interval tasks + unknown to the tester. + +- **Effective CPS**: CPS results over 100 seconds by the Ixia + setup/teardown rates, however, will not be accepted if there are any + drops for any reason. Drops end up deviating the true latency and + jitter numbers. + +- **Performance Testing Methodology**: + + - 2M TCP background connections setup before testing. + + - 2M UDP background bi-directional flows setup before testing. + + - We use an equal mix of TCP and UDP although in the real world we + expect more TCP and in fact in some cases we meter UDP as a + potential source of DoS. + + - Connection aging set to 1 sec and requires each connection or + bi-directional flow to receive one packet every second in each + direction at a size that will fill up the links to near 100% in + conjunction with the dynamically setup connection traffic. For + this to be run successfully it may take a few runs as each TCP + connection setup and teardown takes 6 packets. + + - For UDP a bidirectional flow is created for the first packet + seen that meets the policy for the bi-directional flow setup. + When using this in CPS testing, we will send a total of 6 + packets to match TCP to make things more balanced. UDP + bi-directional flows will be aged within 1 second after + receiving the last packet. I would set all UDP bi-directional + flows to 0.5 - 1.0 second aging to ensure that we do not inflate + the connection table over time. + + - One packet should be sent in each direction to be able to keep + connections active in the flow table. Packet size should be set + to a minimum that allows 6 CPS packets at maximum rate and at + least one packet on each of the active connections in both + directions that also allows for close to 100% link utilization + while not exceeding the TCP aging time of 1 sec. + + - TCP connection is established and terminated without any data + packets. + - Real use case + - 6 packets: SYN, SYN-ACK, ACK, FIN, FIN-ACK, ACK + - Flow Table Size: (2 \* CPS) + 2M + 2M + //For 5M CPS, Flow Table Size: (2 \* 5M) +2M +2M = 14M + - Effective PPS: Sustained CPS \* 6 + PPS for background flows. + +- CPS and flow results will be measured while channel bandwidth is + saturated at 100Gbps for the duration of test runtime. At the same + time we want as close to 100Gbps without losing packets. + +- Inactivity based aging timer of 1 second. + + - All TCP connections should be deleted from the table after the + test completes. + + - The connection table should therefore be zero. + + - All UDP bi-directional flows need to age out before the 1 second + interval to allow for new UDP bi-directional flows to be + established. If everything works as advertised, we should never + see the connection table go above the 8M connections. If we do + then it is likely that UDP bi-directional flows were not aged + within the 1 second interval. To check this, we need to see a + high water counter for maximum connection table size. + +## Feature Requirements + +The following features are required to be enabled during scale testing: + +- VNET + - VXLAN-IN and VXLAN-OUT + - Encap based on lookup table, which can change/be updated + similarly as ENI policy + +- UDR + + - 200k routes per ENI with: + - MAC rewrite + - VNID rewrite + - DSCP rewrite + +- ACL + - 3-level NSG on connection (receive/transmit) in accordance with + the Packet Transformation document detailing our unique NSG + requirements. + + - For clarity, the first NSG is used by Azure to set policy for + the connection while the next two NSGs are set by the customer. + Think of it as a customer building their own firewall rules to + control which VMs can communicate with any other VM with a + unique set of policies. This allows the customer to setup the + VMs with similar control they would have in their own + enterprise. We cannot prevent the customer from forming complex + policy sets. They will likely use similar policies they use in + their own environment. + + - NSG on VNET, vport, subnet both on ingress and egress + traffic + - 100k SIP prefixes/ranges per policy + - 100k DIP prefixes/ranges per policy + +- Metering + + - Enabled on all routes in all v-ports (Currently 15 classes are + supported). + +- QoS per ENI BW + +- VNET Peering + +## Policy and Route Requirements + +The following scale of policies and routes are at minimum required to be +configured during validation and test plan needs to be executed covering +both scenarios: + +**NEW Values Start** ################################################### + +| | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | +|---------------|------------|--------------|-------|-------|-------| +| VNETs | | 1024 | 2048 | 4096 | 8192 | +| ENIs | | 64 | 128 | 256 | 512 | +| Routes | 100K | 6.4M | 12.8M | 25.6M | 51.2M | +| NSGs | 5in + 5out | 640 | 1280 | 2560 | 5120 | +| ACLs prefixes | 10x100K | 64M | 128M | 256M | 512M | +| ACLs Ports | 10x10K | 6.4M | 12.8M | 25.6M | 51.2M | +| Mappings (CA to PA) | 160K | 10M | 20M | 40M | 80M | +| Act Con | 1M (bidir w/ connection pool capable of oversubscription) | 64M | 128M | 256M | 512M | +| CPS | | 3.75M | 7.5M | 15M | 30M | +| bg flows TCP | | 1M (bidir w/ connection pool capable of oversubscription) | 2M | 4M | 8M | +| bg flows UDP | | 1M (bidir w/ connection pool capable of oversubscription) | 2M | 4M | 8M | + +- ACL rules per NSG = 1000 +- Prefixes per ACL rule = 100 +- Prefixes mapped per ACL rule = 16 +- Prefixes routed per ACL rule = 84 +- Routes per ACL rule = 10 +- -> Change Above: NSG per ENI changed since 5 Inbound & 5 Outbound stages are required + +**NEW Values End** #################################################### + + +## MSFT LAB IXIA Configuration + +### Module Configuration + +IXIA module: NOVUS100GE8Q28 + +![msft-lab-ixia-config-01](images/req/msft-lab-ixia-config-01.png) + +![msft-lab-ixia-config-02](images/req/msft-lab-ixia-config-02.png) + +### Streams + +TX: Local vnic to remote vnic + +RX: Remote vnic to local vnic + +#### Learning Streams + +Learning Streams will be used to establish 2M CPS connections and 2M UDP +background bi-directional flows prior to test execution. These 2M flows +will be split across 8 vnics that are pre-configured. + +![learning-streams](images/req/learning-streams.png) + +- MSFT-8V-1M-TX-PPS-Learning + +![msft-8v-1m-tx-pps-learning-01](images/req/msft-8v-1m-tx-pps-learning-01.png) + +![msft-8v-1m-tx-pps-learning-02](images/req/msft-8v-1m-tx-pps-learning-02.png) + +**Packet view** + +``` cmd +MAC: ------ MAC Header ------ +MAC: +MAC: Destination Address : 00 AE CD 01 CD 26 +MAC: Source Address : 00 AE CD 20 00 01 +MAC: Type : 0x0800 (Ethernet II) +MAC: +IP: ------ IP Header ----------- +IP: +IP: Version = 04 (0x04) +IP: Header Length = 20 (0x14) +IP: Differentiated Services Field = 0 (0x00) +IP: 000000.. = DSCP: Default(0x00) +IP: ......0. = ECN Capable Transport (ECT): 0 +IP: .......0 = ECN-CE: 0 +IP: Type of Service = 00 (0x00) +IP: 000..... = Routine +IP: ...0.... = Normal Delay +IP: ....0... = Normal Throughput +IP: .....0.. = Normal Reliability +IP: ......0. = Normal Cost +IP: .......0 = Reserved +IP: Total Length = 100 (0x0064) +IP: Identification = 0 (0x0000) +IP: Flags Bit1 .0. May Fragment +IP: Flags Bit2 ..0 Last Fragment +IP: Fragment Offset = 0 +IP: Time to Live = 64 (0x40) +IP: Protocol = UDP +IP: Checksum = 0x7885 +IP: Source Address = 1.0.0.3 +IP: Destination Address = 1.0.0.2 +IP: +UDP: ------ UDP Header ----------- +UDP: +UDP: Source Port = 50686 (0xC5FE) +UDP: Destination Port = 4789 (0x12B5) +UDP: Length = 80 (0x0050) +UDP: Checksum = 1770 (0x06EA) +UDP: + +``` +- MSFT-8V-1M-RX-PPS-Learning + +![msft-8v-1m-rx-pps-learning-01](images/req/msft-8v-1m-rx-pps-learning-01.png) + +![msft-8v-1m-rx-pps-learning-02](images/req/msft-8v-1m-rx-pps-learning-02.png) + +#### Traffic Streams + +Traffic streams will be used for running the learning flows with 64 +packets per flow. Traffic streams simulating 1/8/16 packets per flow +need to be created individually. + +- MSFT-8V-1M-TX-PPS-64Pkt/Flow-100Sec + +![msft-8v-1m-tx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-01.png) + +![msft-8v-1m-tx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-tx-pps-64pkt-flow-100sec-02.png) + +- MSFT-8V-1M-RX-PPS-64Pkt/Flow-100Sec + +![msft-8v-1m-rx-pps-64pkt-flow-100sec-01](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-01.png) + +![msft-8v-1m-rx-pps-64pkt-flow-100sec-02](images/req/msft-8v-1m-rx-pps-64pkt-flow-100sec-02.png) + +#### Bandwidth Streams + +Bandwidth streams runs with a higher packet size -- 1500 byte -- and +will be used to verify the total 100Gbps bandwidth. + +- MSFT-8V-1M-TX-BW-Port1-100Sec + +![msft-8v-1m-tx-bw-port1-100sec-01](images/req/msft-8v-1m-tx-bw-port1-100sec-01.png) + +![msft-8v-1m-tx-bw-port1-100sec-02](images/req/msft-8v-1m-tx-bw-port1-100sec-02.png) + +**Packet view** + +```cmd +MAC: ------ MAC Header ------ +MAC: +MAC: Destination Address : 00 AE CD 01 CD 26 +MAC: Source Address : 00 AE CD 20 00 01 +MAC: Type : 0x0800 (Ethernet II) +MAC: +IP: ------ IP Header ----------- +IP: +IP: Version = 04 (0x04) +IP: Header Length = 20 (0x14) +IP: Differentiated Services Field = 0 (0x00) +IP: 000000.. = DSCP: Default(0x00) +IP: ......0. = ECN Capable Transport (ECT): 0 +IP: .......0 = ECN-CE: 0 +IP: Type of Service = 00 (0x00) +IP: 000..... = Routine +IP: ...0.... = Normal Delay +IP: ....0... = Normal Throughput +IP: .....0.. = Normal Reliability +IP: ......0. = Normal Cost +IP: .......0 = Reserved +IP: Total Length = 1482 (0x05CA) +IP: Identification = 0 (0x0000) +IP: Flags Bit1 .0. May Fragment +IP: Flags Bit2 ..0 Last Fragment +IP: Fragment Offset = 0 +IP: Time to Live = 64 (0x40) +IP: Protocol = UDP +IP: Checksum = 0x731F +IP: Source Address = 1.0.0.3 +IP: Destination Address = 1.0.0.2 +IP: +UDP: ------ UDP Header ----------- +UDP: +UDP: Source Port = 50686 (0xC5FE) +UDP: Destination Port = 4789 (0x12B5) +UDP: Length = 80 (0x0050) +UDP: Checksum = 1770 (0x06EA) +UDP: + +``` + +- MSFT-8V-1M-RX-BW-Port1-100Sec + +![msft-8v-1m-rx-bw-port1-100sec-01](images/req/msft-8v-1m-rx-bw-port1-100sec-01.png) + +![msft-8v-1m-rx-bw-port1-100sec-02](images/req/msft-8v-1m-rx-bw-port1-100sec-02.png) + +### CPS Streams + +CPS streams will be used to simulate TCP connection establishment and termination. + +![cps-streams](images/req/cps-streams.png) + +- MSFT-8V-4M-Stream 1-Syn-TX-CPS-100Sec + +![msft-8v-4m-stream-1-syn-tx-cps-100sec-01](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-01.png) + +![msft-8v-4m-stream-1-syn-tx-cps-100sec-02](images/req/msft-8v-4m-stream-1-syn-tx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 2-Syn-Ack-RX-CPS-100Sec + +![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-01.png) + +![msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-2-syn-ack-rx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 3-Ack-TX-CPS-100Sec + +![msft-8v-4m-stream-3-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-01.png) + +![msft-8v-4m-stream-3-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-3-ack-tx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 4-Fin-Ack-RX-CPS-100Sec + +![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-01.png) + +![msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-rx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 4-Fin-Ack-TX-CPS-100Sec + +![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-01.png) + +![msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02](images/req/msft-8v-4m-stream-4-fin-ack-tx-cps-100sec-02.png) + +- MSFT-8V-4M-Stream 6-Ack-for-Fin-RX-CPS-100Sec + +![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01](images/req/[msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-01.png) + +![msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02](images/req/msft-8v-4m-stream-6-ack-fin-rx-cps-100sec-02.png) + +### Sample Policy Configuration + +#### Device + +```cmd +\"gw-ip-addr\": \"1.0.0.1\", + +\"kind\" : \"device\", + +\"gw-ip-addr\": \"1.0.0.1\", + +\"ip-addr\" : \"1.0.0.2\", + +\"mac-addr\" : \"\", + +\"dual-stack\": \"false\", + +\"encap\": \"vxlan\", + +\"oper-mode\": \"bitw-smart-switch\" +``` + +#### TEP + +```cmd +\"kind\" : \"tep\", + +\"count\" : \"2046\", + +\"prefix\": \"1.0.0.0/8\" + +``` + +#### Route Table + +```cmd +\"kind\" : \"route-table\", + +\"count\" : \"204800\", + +\"prefix-start\" : \"4.0.0.0/8\", + +\"meter\" : \"true\" + +#### Security Policy + +\"kind\" : \"security-policy\", + +\"v4-count\" : \"1023\" +``` + +#### VPC + +```cmd +\"kind\" : \"vpc\", + +\"count\" : \"16\", + +\"prefix\" : \"192.0.0.0/8\", + +\"subnets\" : \"1\" +``` +> [!NOTE] +> All VPCs will be configured with the same prefix. + +#### VNIC + +```cmd +\"kind\" : \"vnic\", + +\"count\" : \"1\", + +\"vlan-tagged\": \"false\" + +Note: VNIC configuration per vpc, subnet + +``` + +#### Mappings + +```cmd +\"kind\" : \"mappings\", + +\"remotes\" : \"64\", + +\"locals\" : \"8\", + +\"nat-prefix\" : \"3.0.0.0/8\" + +``` +> [!NOTE] +> Remotes are per subnet, tep. + +#### Policer + +```cmd +\"kind\" : \"policer\", + +\"count\" : \"16\", + +\"tx_policer_en\" : \"true\", + +\"rx_policer_en\" : \"true\" + +#### UDR + +\"kind\" : \"udr\", + +\"route-prefix\" : \"5.0.0.0/8\", + +\"overlay-mac\" : \"\", + +\"encap\" : \"\", + +\"tos\" : \"\" + +``` + +#### Meter Policy + +```cmd +\"kind\" : \"meter-policy\", + +\"count-xl\" : \"16383\", + +\"count-m\" : \"1023\", + +\"prefix\" : \"4.0.0.0/8\" + +``` From f0517f92b70d05a3b3d55268bec1795c4434f684 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 24 May 2023 16:19:05 -0700 Subject: [PATCH 21/75] SAI bulk add/remove implementation (#246) Signed-off-by: Marian Pritsak --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 102 ++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 92c3edffb..a23e14260 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -9,6 +9,7 @@ #include "utils.h" #include "saiexperimental{{ app_name | replace('_', '') }}.h" #include "saitypes.h" +#include "saistatus.h" #include #include #include @@ -203,6 +204,31 @@ ErrRet: return -1; } +sai_status_t sai_create_{{ table.name }}s( + _In_ sai_object_id_t switch_id, + _In_ uint32_t object_count, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_object_id_t *object_id, + _Out_ sai_status_t *object_statuses) { + sai_status_t agg_status = SAI_STATUS_SUCCESS; + + for (uint32_t i = 0; i < object_count; i++) { + object_statuses[i] = sai_create_{{ table.name }}(&object_id[i], switch_id, attr_count[i], attr_list[i]); + + if (object_statuses[i] != SAI_STATUS_SUCCESS) { + agg_status = SAI_STATUS_FAILURE; + } + + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + return agg_status; + } + } + + return agg_status; +} + sai_status_t sai_remove_{{ table.name }}(_In_ sai_object_id_t {{ table.name }}_id) { if (RemoveFromTable({{ table.name }}_id)) { return 0; @@ -210,6 +236,28 @@ sai_status_t sai_remove_{{ table.name }}(_In_ sai_object_id_t {{ table.name }}_i return -1; } +sai_status_t sai_remove_{{ table.name }}s( + _In_ uint32_t object_count, + _In_ const sai_object_id_t *object_id, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) { + sai_status_t agg_status = SAI_STATUS_SUCCESS; + + for (uint32_t i = 0; i < object_count; i++) { + object_statuses[i] = sai_remove_{{ table.name }}(object_id[i]); + + if (object_statuses[i] != SAI_STATUS_SUCCESS) { + agg_status = SAI_STATUS_FAILURE; + } + + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + return agg_status; + } + } + + return agg_status; +} + sai_status_t sai_set_{{ table.name }}_attribute ( _In_ sai_object_id_t {{ table.name }}_id, _In_ const sai_attribute_t *attr) { @@ -338,6 +386,31 @@ ErrRet: return -1; } +sai_status_t sai_create_{{ table.name | replace("entry", "entries") }}( + _In_ uint32_t object_count, + _In_ const sai_{{ table.name }}_t *{{ table.name }}, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) { + sai_status_t agg_status = SAI_STATUS_SUCCESS; + + for (uint32_t i = 0; i < object_count; i++) { + object_statuses[i] = sai_create_{{ table.name }}(&{{ table.name }}[i], attr_count[i], attr_list[i]); + + if (object_statuses[i] != SAI_STATUS_SUCCESS) { + agg_status = SAI_STATUS_FAILURE; + } + + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + return agg_status; + } + } + + return agg_status; + +} + sai_status_t sai_remove_{{ table.name }}( _In_ const sai_{{ table.name }}_t *{{ table.name }}) { p4::v1::TableEntry * matchActionEntry = new p4::v1::TableEntry(); @@ -391,6 +464,28 @@ ErrRet: return -1; } +sai_status_t sai_remove_{{ table.name | replace("entry", "entries") }}( + _In_ uint32_t object_count, + _In_ const sai_{{ table.name }}_t *{{ table.name }}, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) { + sai_status_t agg_status = SAI_STATUS_SUCCESS; + + for (uint32_t i = 0; i < object_count; i++) { + object_statuses[i] = sai_remove_{{ table.name }}(&{{ table.name }}[i]); + + if (object_statuses[i] != SAI_STATUS_SUCCESS) { + agg_status = SAI_STATUS_FAILURE; + } + + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + return agg_status; + } + } + + return agg_status; +} + sai_status_t sai_set_{{ table.name }}_attribute( _In_ const sai_{{ table.name }}_t *{{ table.name }}, _In_ const sai_attribute_t *attr) { @@ -418,5 +513,12 @@ sai_{{ app_name }}_api_t sai_{{app_name }}_api_impl = { .remove_{{ table.name }} = sai_remove_{{ table.name }}, .set_{{ table.name }}_attribute = sai_set_{{ table.name }}_attribute, .get_{{ table.name }}_attribute = sai_get_{{ table.name }}_attribute, +{% if table.is_object == 'true' %} + .create_{{ table.name }}s = sai_create_{{ table.name }}s, + .remove_{{ table.name }}s = sai_remove_{{ table.name }}s, +{% else %} + .create_{{ table.name | replace("entry", "entries") }} = sai_create_{{ table.name | replace("entry", "entries") }}, + .remove_{{ table.name | replace("entry", "entries") }} = sai_remove_{{ table.name | replace("entry", "entries") }}, +{% endif %} {% endfor %} }; From 759ab36092c0d3baee0ccba12f5b08a271142df7 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Thu, 25 May 2023 10:44:27 -0700 Subject: [PATCH 22/75] [Sonic] ACL tagging and requirements (#363) * [Sonic] Update dash-sonic-hld.md for ACL tagging and requirements (#363) --- documentation/general/dash-sonic-hld.md | 32 ++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 08d5c1c45..669616b91 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -1,6 +1,6 @@ # SONiC-DASH HLD ## High Level Design Document -### Rev 1.1 +### Rev 1.4 # Table of Contents @@ -17,6 +17,7 @@ * [1.4 Scaling requirements ](#14-scaling-requirements) * [1.5 Metering requirements ](#15-metering-requirements) * [1.6 Design considerations ](#16-design-considerations) + * [1.7 ACL requirements ](#17-acl-requirements) * [2 Packet Flows](#2-packet-flows) * [3 Modules Design](#3-modules-design) * [3.1 Config DB](#31-config-db) @@ -43,6 +44,7 @@ | 1.1 | 01/09/2023 | Prince Sunny | Underlay Routing and ST/PL clarifications | | 1.2 | 02/12/2023 | Vijay Srinivasan | Metering schema and description | | 1.3 | 04/12/2023 | Ze Gan | AppDB protobuf design | +| 1.4 | 05/03/2023 | Prince Sunny | ACL Tagging, ACL Requirements | # About this Manual This document provides more detailed design of DASH APIs, DASH orchestration agent, Config and APP DB Schemas and other SONiC buildimage changes required to bring up SONiC image on an appliance card. General DASH HLD can be found at [dash_hld](./dash-high-level-design.md). @@ -111,6 +113,7 @@ Following are the minimal scaling requirements | Total tags per ENI | 4k | | Max prefixes per tag | 24k | | Max tags one prefix belong to | 512 | +| Max tags in an ACL rule | 4k | | CA-PA Mappings | 10M Per Card | | Active Connections/ENI | 1M (Bidirectional TCP or UDP) | | Total active connections | 32M (Bidirectional) | @@ -176,6 +179,33 @@ DASH Sonic implementation is targeted for appliance scenarios and must handles m 15. Implementation must have flexible memory allocation for ENI and not reserve max scale during initial create (e.g 100k routes). This is to allow oversubscription. 16. Implementation must not have silent failures for APIs. E.g accepting an API from controller, returning success and failing in the backend. This is orthogonal to the idempotency of APIs described above for ADD and Delete operations. Intent is to ensure SDN controller and Sonic implementation is in-sync +## 1.7 ACL requirements + +ACL is essential for NSGs and have different stages. In the current model, there are two stages for Azure and VNET level and another three stages for customer. The following are some of the key requirements and considerations: +- ACL binding to ENI must be atomic. +- User can add/remove rules in a group as long as it is not currently bound to an ENI +- It is not permitted to modify rules within a group that is currently bound to an ENI. For such scenario, a new group shall be created by application with the modified set of rules which could then be bind to ENI. An exception is if tags are expanded to individual prefixes in an ACL rule. In such cases, if tags are modified, application shall update the corresponding rule by adding/removing a prefix. +- No requirement to modify an existing rule except for the case above. For e.g change action of a rule from permit to deny or vice-versa +- ACL Tagging + - Mapping a prefix to a tag can reduce the repetition of prefixes across different ACL rules and optimize memory usage + - Tagging is implemented as a bitmap in Orchagent and SAI layers + - A prefix can belong to multiple tags + - Prefixes can be added or removed from a tag at any time + - SAI implementation shall return a capability for the bitmap size. A '0' return value shall be treated as no-tag support. + - An example tag bitmap is as below. Assume tag bitmap size of 8 (a capability returned by SAI implementation). + - Tag1 - 10.1.1.0/24, 20.1.1.0/24 + - Tag2 - 10.1.0.0/8, 20.1.1.0/24, 50.1.1.1/32 + - Tag8 - Empty + - SAI_SRC_TAG_ENTRY_ATTR_TAG_MAP: 10.1.1.0/24 -> "0000 0011", 20.1.1.0/24 -> "0000 0011", 10.1.0.0/8 -> "0000 0010". Note that orchagent shall extend the tag map to include all subnet to allow an LPM based lookup. In this case, tags for 10.1.1.0/24 shall also include the tag for 10.1.0.0/8. + - SAI_DASH_ACL_RULE_ATTR_SRC_TAG: Assume there is a rule with src tag bitmap as "0001 0010", it is a rule hit if the derived tag has at least 1 bit that matches the bitmap in the rule. + - If a packet arrives with src ip of 10.1.1.1, the corresponding derived src tag shall be "0000 0011" (say HW_DERIVED_TAG_MAP, matching entry for 10.1.1.0/24) + - Ternary operation shall be => HW_DERIVED_TAG_MAP | (SAI_DASH_ACL_RULE_ATTR_SRC_TAG & SAI_DASH_ACL_RULE_ATTR_SRC_TAG_MASK). If any bit is set, it is treated as a match. In order to achieve this functionality, SAI implementation can expand the ACL rules to multiple rules that has only ONE tag set. + - If the tag field is empty, ACL rule must match ANY tag or NO tag. + - The bitmap size depends on the SAI implementation capability. It is fixed during initialization based on the capability value returned by SAI implementation. This same bitmap size shall be later used for ACL rules and prefix-tag mapping. Orchagent shall implement the logic to chose the tags with largest number of prefixes, based on the capability value. Say 8 biggest tags in the above example. Rest of the tags shall be expanded to include prefixes in the ACL rules. +- Deleting ACL group is permitted as long as it is not bind to an ENI. It is not expected for application to delete individual rules prior to deleting a group. Implementation is expected to delete/free all resources when application triggers an ACL group delete. +- ACL rules are not expected to have both tags and prefixes configured in the same rule. In case NorthBound configures with both tags and prefix, orchagent shall split this to separate rules. At high-level, requirement is an `OR` operation when there is both tag and prefix. +- Counters can be attached to ACL rules optionally for retrieving the number of connections/flows. It is not required to get the packet/byte counter as in the traditional model. A new SAI counter type shall be required for this. + # 2 Packet Flows The following section captures at a high-level on the VNET packet flow. Detailed lookup and pipeline behavior can be referenced *here*. From d71ccbeeab9dcaa67481a975758be20e2cc137db Mon Sep 17 00:00:00 2001 From: Yuriy Harhas Date: Wed, 31 May 2023 18:14:28 +0200 Subject: [PATCH 23/75] [UPSTREAM CANDIDATE] DASH VNET PTF test cases update (#44) (#373) * Updated saidashvnet tests and sai_dash_utils Updated sai_dash_utils class VnetApiEndpoints with connection variable Updated saidashvnet tests to use connection variable for dynamic connection protocol selection Updated ptf/run-test.sh to support connection var Updated ENI setting UP/DOWN method Signed-off-by: Yuriy Harhas --- test/test-cases/functional/ptf/run-tests.sh | 9 +- .../functional/ptf/sai_dash_utils.py | 14 +- test/test-cases/functional/ptf/saidashvnet.py | 131 ++++++++---------- 3 files changed, 73 insertions(+), 81 deletions(-) diff --git a/test/test-cases/functional/ptf/run-tests.sh b/test/test-cases/functional/ptf/run-tests.sh index 6fb1edc20..ae0dd0b7f 100755 --- a/test/test-cases/functional/ptf/run-tests.sh +++ b/test/test-cases/functional/ptf/run-tests.sh @@ -4,6 +4,7 @@ SCRIPT=$(basename $0) TARGET="bmv2" # TODO: add no target by default and remove -H TRAFFIC="bidir" +CONNECTION="tcp" TEST_DIR="$(dirname $0)" EXTRA_PARAMETERS="" INTERFACES="veth1,veth3" @@ -23,6 +24,7 @@ function show_help_and_exit() echo " -H : specify if tests are run on real hardware" echo " -T : specify any specific target platform (default: bmv2)" echo " -b : specify traffic type for verification: bidir|monodir|no (default: bidir)" + echo " -C : specify connection type protocol for traffic verification: tcp|udp|icmp" echo " -e : specify extra parameter(s) (default: none)" echo -e " -t : specify timeout for test case execution\n" @@ -44,7 +46,7 @@ function validate_parameters() fi } -while getopts "h?UHT:I:s:p:c:b:e:t:" opt; do +while getopts "h?UHT:I:s:p:c:b:C:e:t:" opt; do case ${opt} in h|\? ) show_help_and_exit 0 @@ -73,6 +75,9 @@ while getopts "h?UHT:I:s:p:c:b:e:t:" opt; do b ) TRAFFIC=${OPTARG} ;; + C ) + CONNECTION=${OPTARG} + ;; e ) EXTRA_PARAMETERS="${EXTRA_PARAMETERS} ${OPTARG}" ;; @@ -92,5 +97,5 @@ ptf \ --interface 0@${iface_array[0]} \ --interface 1@${iface_array[1]} \ --test-case-timeout=${TIMEOUT} \ - --test-params="target='${TARGET}';traffic_check='${TRAFFIC}';${TEST_PARAMS}" \ + --test-params="connection='${CONNECTION}';target='${TARGET}';traffic_check='${TRAFFIC}';${TEST_PARAMS}" \ ${EXTRA_PARAMETERS} diff --git a/test/test-cases/functional/ptf/sai_dash_utils.py b/test/test-cases/functional/ptf/sai_dash_utils.py index 333adc995..a93f4025b 100644 --- a/test/test-cases/functional/ptf/sai_dash_utils.py +++ b/test/test-cases/functional/ptf/sai_dash_utils.py @@ -173,6 +173,12 @@ def eni_create(self, **kwargs): self.add_teardown_obj(self.eni_remove, eni_id) return eni_id + + def eni_set_admin_state(self, eni_oid, state): + sai_thrift_set_eni_attribute(self.client, eni_oid, admin_state=(state == "up")) + self.assertEqual(self.status(), SAI_STATUS_SUCCESS) + + print(f"ENI oid: {eni_oid} setting admin state {state} - OK") def eni_remove(self, eni_id): sai_thrift_remove_eni(self.client, eni_id) @@ -458,6 +464,12 @@ class VnetApiEndpoints(VnetAPI): def setUp(self, underlay_ipv6=False, overlay_ipv6=False): super(VnetApiEndpoints, self).setUp() + # Set connection type for traffic verification methods + self.assertTrue(test_param_get("connection").lower() in ["tcp", "udp", "icmp"], + "Unknown connection protocol! Supported protocols: tcp|udp|icmp") + self.connection = test_param_get("connection").lower() + print(f"{self.connection.upper()} protocol is used for traffic verification.") + self.underlay_ipv6 = underlay_ipv6 self.overlay_ipv6 = overlay_ipv6 @@ -512,8 +524,6 @@ def update_configuration_for_tx_equal_to_rx(self): self.rx_host.port = self.tx_host.port self.rx_host.mac = self.tx_host.mac - self.rx_host.ip = self.tx_host.ip - self.rx_host.ip_prefix = self.tx_host.ip_prefix self.rx_host.peer.port = self.tx_host.peer.port self.rx_host.peer.mac = self.tx_host.peer.mac diff --git a/test/test-cases/functional/ptf/saidashvnet.py b/test/test-cases/functional/ptf/saidashvnet.py index e137ebaa4..354480966 100644 --- a/test/test-cases/functional/ptf/saidashvnet.py +++ b/test/test-cases/functional/ptf/saidashvnet.py @@ -75,7 +75,7 @@ def configureTest(self): def verifyOverlayOutboundConfigTest(self): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=False) + connection=self.connection, fake_mac=False, tx_equal_to_rx=False) print("Overlay config OK\n") def l3UnderlayHost1toHost2RoutingTest(self): @@ -168,7 +168,7 @@ def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): """ self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetInboundRoutingTest.__name__, ' OK') @@ -234,6 +234,7 @@ def runTest(self): self.configure_underlay(self.tx_host, self.rx_host) self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetInboundNegativeTest() @group("draft") @@ -344,6 +345,7 @@ def runTest(self): self.configure_underlay(self.tx_host, self.rx_host) self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetInboundNegativeTest() @group("draft") @@ -488,22 +490,22 @@ def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): print("\nVerifying Inbound pkt send tx_host_0 -> rx_host ...") self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") print("\nVerifying Inbound pkt send tx_host_1 -> rx_host ...") self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") print("\nVerifying Inbound pkt send tx_host_2 -> rx_host ...") self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") print("\nVerifying Inbound pkt send tx_host_3 -> rx_host ...") self.verify_traffic_scenario(client=self.tx_host_3, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') @@ -865,17 +867,17 @@ def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): print("\nVerifying Inbound pkt send tx_host_0 -> rx_host_0 ...") self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host_0, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") print("\nVerifying Inbound pkt send tx_host_1 -> rx_host_1 ...") self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host_1, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") print("\nVerifying Inbound pkt send tx_host_2 -> rx_host_0 ...") self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host_0, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print("OK") @@ -1197,15 +1199,15 @@ def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): print(f"\nPA validate {self.tx_host_0.ip} verification, expect pass") self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print(f"\nPA validate {self.tx_host_1.ip} verification, expect pass") self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print(f"\nPA validate {self.tx_host_2.ip} verification, expect pass") self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print(f"\nPA validate {self.tx_host_3.ip} verification, expect drop - PA validation missmatch") self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, @@ -1365,9 +1367,9 @@ def runTest(self): self.configure_underlay(self.tx_host, add_routes=False) self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.setEniStateTest(state="down") + self.eni_set_admin_state(self.eni_id, "down") self.vnet2VnetEniDownTrafficTest() - self.setEniStateTest(state="up") + self.eni_set_admin_state(self.eni_id, "up") self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) def configureTest(self): @@ -1382,14 +1384,14 @@ def configureTest(self): dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + self.eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(self.eni_id, self.rx_host.client.mac) # ENI MAC # Inbound routing PA Validate - self.inbound_routing_decap_create(eni_id, vni=self.tx_host.client.vni, + self.inbound_routing_decap_create(self.eni_id, vni=self.tx_host.client.vni, sip=self.tx_host.ip, sip_mask="255.255.255.0") def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): @@ -1398,23 +1400,10 @@ def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): """ self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') - def setEniStateTest(self, state): - """ - Verifies ENI admin state setting - """ - if state == "up": - sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=True) - else: # down - sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=False) - - self.assertEqual(self.status(), SAI_STATUS_SUCCESS) - - print('\n', self.setEniStateTest.__name__, state, ' OK') - def vnet2VnetEniDownTrafficTest(self): """ Verifies inbound packet drop when ENI admin state is DOWN @@ -1439,9 +1428,9 @@ def runTest(self): self.configure_underlay(self.tx_host, self.rx_host) self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.setEniStateTest(state="down") + self.eni_set_admin_state(self.eni_id, "down") self.vnet2VnetEniDownTrafficTest() - self.setEniStateTest(state="up") + self.eni_set_admin_state(self.eni_id, "up") self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) @@ -1496,7 +1485,7 @@ def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): """ self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') @@ -1581,7 +1570,7 @@ def vnet2VnetOutboundNegativeTest(self): @group("draft") @skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectWithTwoPortsTest(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): +class Vnet2VnetOutboundRouteVnetDirectTwoPortsTest(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): """ Outbound Vnet to Vnet test scenario with Outbound routing entry SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action @@ -1593,11 +1582,12 @@ def runTest(self): self.configure_underlay(self.tx_host, self.rx_host) self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundNegativeTest() @group("draft") @skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectWithTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test): +class Vnet2VnetOutboundRouteVnetDirectTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test): """ Underlay IPv4 and Overlay IPv6 configs Outbound Vnet to Vnet test scenario with Outbound routing entry @@ -1664,7 +1654,7 @@ def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): """ self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') @@ -1773,7 +1763,7 @@ def runTest(self): self.configure_underlay(self.tx_host, self.rx_host) self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - + self.vnet2VnetOutboundNegativeTest() @group("draft") @@ -1808,9 +1798,9 @@ def runTest(self): self.configure_underlay(self.tx_host, add_routes=False) self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.setEniStateTest(state="down") + self.eni_set_admin_state(self.eni_id, "down") self.vnet2VnetEniDownTrafficTest() - self.setEniStateTest(state="up") + self.eni_set_admin_state(self.eni_id, "up") self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) def configureTest(self): @@ -1846,23 +1836,10 @@ def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): """ self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') - def setEniStateTest(self, state): - """ - Verifies ENI admin state setting - """ - if state == "up": - sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=True) - else: # down - sai_thrift_set_eni_attribute(self.client, self.eni_id, admin_state=False) - - self.assertEqual(self.status(), SAI_STATUS_SUCCESS) - - print('\n', self.setEniStateTest.__name__, state, ' OK') - def vnet2VnetEniDownTrafficTest(self): """ Verifies outbound packet drop when ENI admin state is DOWN @@ -1887,9 +1864,9 @@ def runTest(self): self.configure_underlay(self.tx_host, self.rx_host) self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.setEniStateTest(state="down") + self.eni_set_admin_state(self.eni_id, "down") self.vnet2VnetEniDownTrafficTest() - self.setEniStateTest(state="up") + self.eni_set_admin_state(self.eni_id, "up") self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) @@ -1935,7 +1912,7 @@ def configureTest(self): def outboundRouteDirectTest(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection='tcp', fake_mac=True, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx, route_direct=True) @@ -2161,20 +2138,20 @@ def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): print(f"\nVerify outbound route to CA {self.rx_host_0.client.ip}, expect pass") self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print(f"\nVerify outbound route to CA {self.rx_host_1.client.ip}, expect pass") self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print(f"\nVerify outbound route to CA {self.rx_host_2.client.ip}, expect pass") self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_2, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print(f"\nVerify outbound route to CA {self.rx_host_3.client.ip} and use_dst_vnet=False, expect pass") self.rx_host_3.client.vni = self.tx_host.client.vni self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_3, - connection='tcp', fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') @@ -2424,7 +2401,7 @@ def configureTest(self): def vnet2VnetOutboundDstVnetIdTrueTest(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, - connection="tcp", fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetOutboundDstVnetIdTrueTest.__name__, ' OK') @@ -2434,7 +2411,7 @@ def vnet2VnetOutboundDstVnetIdFalseTest(self, tx_equal_to_rx): self.rx_host_1.client.vni = self.tx_host.client.vni self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, - connection="tcp", fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) print('\n', self.vnet2VnetOutboundDstVnetIdFalseTest.__name__, ' OK') @@ -2834,7 +2811,7 @@ def outboundHost0toHost2Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.host_0, server=self.host_2, - connection='tcp', + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -2844,7 +2821,7 @@ def inboundHost2toHost0Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.host_2, server=self.host_0, - connection='tcp', + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) @@ -2854,7 +2831,7 @@ def outboundHost3toHost1Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.host_3, server=self.host_1, - connection='tcp', + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -2864,7 +2841,7 @@ def inboundHost1toHost3Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.host_1, server=self.host_3, - connection='tcp', + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) @@ -3152,7 +3129,7 @@ def outboundEni0Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host_0, - connection='tcp', + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -3165,7 +3142,7 @@ def outboundEni1Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host_1, - connection='tcp', + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -3175,7 +3152,7 @@ def outboundEni2Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host_2, - connection='tcp', + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -3474,7 +3451,7 @@ def singleEniToOutboundVm1Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, - connection="tcp", + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -3489,7 +3466,7 @@ def singleEniToOutboundVm2Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, - connection="tcp", + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -3504,7 +3481,7 @@ def singleEniToOutboundVm3Test(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_2, - connection="tcp", + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) @@ -3710,7 +3687,7 @@ def vnet2VnetOutboundRouteVnetTest(self, tx_equal_to_rx): self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection="tcp", + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) From d72eb6640ca07adaf889e93e8b9e97c4a7b7ba48 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 31 May 2023 19:24:24 +0200 Subject: [PATCH 24/75] [doc] Update configuration example for "DASH_ROUTE_TABLE" entries with action "direct" (#371) - "vnet" is not needed when the action "direct" is configured. --- .wordlist.txt | 1 + documentation/general/dash-sonic-hld.md | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.wordlist.txt b/.wordlist.txt index 6ccf0b02a..01f374392 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -695,3 +695,4 @@ AppDB Gan Ze AppDBMemoryEstimation +Ivantsiv diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 669616b91..8cb169479 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -45,6 +45,7 @@ | 1.2 | 02/12/2023 | Vijay Srinivasan | Metering schema and description | | 1.3 | 04/12/2023 | Ze Gan | AppDB protobuf design | | 1.4 | 05/03/2023 | Prince Sunny | ACL Tagging, ACL Requirements | +| 1.5 | 05/22/2023 | Oleksandr Ivantsiv | Update configuration examples | # About this Manual This document provides more detailed design of DASH APIs, DASH orchestration agent, Config and APP DB Schemas and other SONiC buildimage changes required to bring up SONiC image on an appliance card. General DASH HLD can be found at [dash_hld](./dash-high-level-design.md). @@ -1011,18 +1012,16 @@ Refer DASH documentation for the test plan. { "DASH_ROUTE_TABLE:F4939FEFC47E:30.0.0.0/16": { "action_type":"direct", - "vnet":"Vnet1", - "metering_policy_en":"false", - "metering_class":"1000" + "metering_policy_en":"false", + "metering_class":"1000" }, "OP": "SET" }, { "DASH_ROUTE_TABLE:F4939FEFC47E:40.0.0.0/16": { "action_type":"direct", - "vnet":"Vnet1", - "metering_policy_en":"true", - "metering_class":"1000" + "metering_policy_en":"true", + "metering_class":"1000" }, "OP": "SET" }, From a3edde379e33d7c3b0a0308aa31a6f950e316409 Mon Sep 17 00:00:00 2001 From: MirceaDan Date: Wed, 31 May 2023 11:51:33 -0700 Subject: [PATCH 25/75] update to dash scale numbers (#377) * update to scale numbers - background tcp flows 15M (was 1M) - background udp flows 15M (was 1M) - background traffic packet size reduced to 500B from 1500B - total flow capacity reduced by half (down to 32M from 64M) - Signed-off-by: Mircea Dan * preliminary spellcheck * Update program-scale-testing-requirements-draft.md * unix line endings --- ...rogram-scale-testing-requirements-draft.md | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/documentation/general/program-scale-testing-requirements-draft.md b/documentation/general/program-scale-testing-requirements-draft.md index 3f7e1f0f3..8ed1a7a6b 100644 --- a/documentation/general/program-scale-testing-requirements-draft.md +++ b/documentation/general/program-scale-testing-requirements-draft.md @@ -1,6 +1,6 @@ # Program Scale Testing Requirements for LAB Validation ->**NOTE**: This prelimiary document includes a text description of a so-called **"Hero Test"** to establish minimum performance requirements and screen captures of Layer 2/3 packet generator stream configurations for IXIA IxExplorer packet tester device. These L23 streams simulate L4 connection establishment. This document, and the testing methodology, will be replaced by a more formal, complete requirements specification and automated testing scripts in due time. +>**NOTE**: This preliminary document includes a text description of a so-called **"Hero Test"** to establish minimum performance requirements and screen captures of Layer 2/3 packet generator stream configurations for IXIA IxExplorer packet tester device. These L23 streams simulate L4 connection establishment. This document, and the testing methodology, will be replaced by a more formal, complete requirements specification and automated testing scripts in due time. ## Table of Contents @@ -185,9 +185,9 @@ integrators to track and test the designs in a common manner. - **Performance Testing Methodology**: - - 2M TCP background connections setup before testing. + - 15M TCP background connections setup before testing. - - 2M UDP background bi-directional flows setup before testing. + - 15M UDP background bi-directional flows setup before testing. - We use an equal mix of TCP and UDP although in the real world we expect more TCP and in fact in some cases we meter UDP as a @@ -220,8 +220,8 @@ integrators to track and test the designs in a common manner. packets. - Real use case - 6 packets: SYN, SYN-ACK, ACK, FIN, FIN-ACK, ACK - - Flow Table Size: (2 \* CPS) + 2M + 2M - //For 5M CPS, Flow Table Size: (2 \* 5M) +2M +2M = 14M + - Flow Table Size: (2 \* CPS) + 15M + 15M + //For 5M CPS, Flow Table Size: (2 \* 1000) + 15M + 15M = ~30M - Effective PPS: Sustained CPS \* 6 + PPS for background flows. - CPS and flow results will be measured while channel bandwidth is @@ -294,8 +294,6 @@ The following scale of policies and routes are at minimum required to be configured during validation and test plan needs to be executed covering both scenarios: -**NEW Values Start** ################################################### - | | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | |---------------|------------|--------------|-------|-------|-------| | VNETs | | 1024 | 2048 | 4096 | 8192 | @@ -305,10 +303,10 @@ both scenarios: | ACLs prefixes | 10x100K | 64M | 128M | 256M | 512M | | ACLs Ports | 10x10K | 6.4M | 12.8M | 25.6M | 51.2M | | Mappings (CA to PA) | 160K | 10M | 20M | 40M | 80M | -| Act Con | 1M (bidir w/ connection pool capable of oversubscription) | 64M | 128M | 256M | 512M | +| Act Con | 500K (bidir w/ connection pool capable of oversubscription) | 32M | 64M | 128M | 256M | | CPS | | 3.75M | 7.5M | 15M | 30M | -| bg flows TCP | | 1M (bidir w/ connection pool capable of oversubscription) | 2M | 4M | 8M | -| bg flows UDP | | 1M (bidir w/ connection pool capable of oversubscription) | 2M | 4M | 8M | +| bg flows TCP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | +| bg flows UDP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | - ACL rules per NSG = 1000 - Prefixes per ACL rule = 100 @@ -317,24 +315,6 @@ both scenarios: - Routes per ACL rule = 10 - -> Change Above: NSG per ENI changed since 5 Inbound & 5 Outbound stages are required -**NEW Values End** #################################################### - ## MSFT LAB IXIA Configuration @@ -354,9 +334,9 @@ RX: Remote vnic to local vnic #### Learning Streams -Learning Streams will be used to establish 2M CPS connections and 2M UDP -background bi-directional flows prior to test execution. These 2M flows -will be split across 8 vnics that are pre-configured. +Learning Streams will be used to establish 15M CPS connections and 15M UDP +background bi-directional flows prior to test execution. These 15M flows +will be split across 64 vnics that are pre-configured. ![learning-streams](images/req/learning-streams.png) @@ -436,7 +416,7 @@ need to be created individually. #### Bandwidth Streams -Bandwidth streams runs with a higher packet size -- 1500 byte -- and +Bandwidth streams runs with a higher packet size -- 500 byte -- and will be used to verify the total 100Gbps bandwidth. - MSFT-8V-1M-TX-BW-Port1-100Sec From 3d45b5f30714c0270295e619370d48f86bdaf2d5 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan Date: Wed, 31 May 2023 22:28:00 +0300 Subject: [PATCH 26/75] Updated SAI-Challenger to latest main as of May 30 (#378) * Updated SAI-Challenger to latest main, May 30 Signed-off-by: Andriy Kokhan * Updated pytest requirements to >=6.0.1 Signed-off-by: Andriy Kokhan --------- Signed-off-by: Andriy Kokhan --- .../dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env | 2 +- dash-pipeline/dockerfiles/Dockerfile.saichallenger-client | 2 +- dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr | 2 +- dash-pipeline/tests/requirements.txt | 2 +- test/SAI-Challenger | 2 +- test/requirements.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env b/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env index e50b6e49d..a379a0ae3 100644 --- a/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env +++ b/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env @@ -2,4 +2,4 @@ # Changing this will cause build/publish to occur in CI actions export DASH_ACR_REGISTRY=sonicdash.azurecr.io export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_NAME=${DASH_ACR_REGISTRY}/dash-saichallenger-client-bldr -export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_CTAG?=230515 +export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_CTAG?=230530 diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client index 79934a595..d6e52055d 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client @@ -1,4 +1,4 @@ -FROM sonicdash.azurecr.io/dash-saichallenger-client-bldr:230515 +FROM sonicdash.azurecr.io/dash-saichallenger-client-bldr:230530 ENV SAI_CHALLENGER_PATH /sai-challenger ENV DASH_PATH /dash diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr index 6e5ad7959..67a1d6f19 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr @@ -1,5 +1,5 @@ # Requires or something -# sc-client:230515 +# sc-client:230530 FROM sc-client ADD tests/ /tests/ diff --git a/dash-pipeline/tests/requirements.txt b/dash-pipeline/tests/requirements.txt index 7db3f16dd..34cd8841c 100644 --- a/dash-pipeline/tests/requirements.txt +++ b/dash-pipeline/tests/requirements.txt @@ -1,2 +1,2 @@ snappi==0.9.4 -pytest==6.0.1 +pytest>=6.0.1 diff --git a/test/SAI-Challenger b/test/SAI-Challenger index 44458c9d0..8fe5256fe 160000 --- a/test/SAI-Challenger +++ b/test/SAI-Challenger @@ -1 +1 @@ -Subproject commit 44458c9d0f8147cf696204ad700bf46f8738180f +Subproject commit 8fe5256feadcf28742445a2f6121b7dc38ac73b4 diff --git a/test/requirements.txt b/test/requirements.txt index 7db3f16dd..34cd8841c 100644 --- a/test/requirements.txt +++ b/test/requirements.txt @@ -1,2 +1,2 @@ snappi==0.9.4 -pytest==6.0.1 +pytest>=6.0.1 From de161a287ecb910c35b2a33f89a827519417cb75 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan Date: Thu, 1 Jun 2023 21:11:00 +0300 Subject: [PATCH 27/75] Updated SAI-C to enable SaiObjType autogen (#381) Signed-off-by: Andriy Kokhan --- .../dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env | 2 +- dash-pipeline/dockerfiles/Dockerfile.saichallenger-client | 2 +- .../dockerfiles/Dockerfile.saichallenger-client-bldr | 2 +- test/SAI-Challenger | 2 +- test/test-cases/functional/saic/conftest.py | 7 +++++++ test/test-cases/scale/saic/conftest.py | 7 +++++++ 6 files changed, 18 insertions(+), 4 deletions(-) diff --git a/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env b/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env index a379a0ae3..09edddf07 100644 --- a/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env +++ b/dash-pipeline/dockerfiles/DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG.env @@ -2,4 +2,4 @@ # Changing this will cause build/publish to occur in CI actions export DASH_ACR_REGISTRY=sonicdash.azurecr.io export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_NAME=${DASH_ACR_REGISTRY}/dash-saichallenger-client-bldr -export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_CTAG?=230530 +export DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_CTAG?=230601 diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client index d6e52055d..1a308d570 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client @@ -1,4 +1,4 @@ -FROM sonicdash.azurecr.io/dash-saichallenger-client-bldr:230530 +FROM sonicdash.azurecr.io/dash-saichallenger-client-bldr:230601 ENV SAI_CHALLENGER_PATH /sai-challenger ENV DASH_PATH /dash diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr index 67a1d6f19..6b2c2aa48 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr @@ -1,5 +1,5 @@ # Requires or something -# sc-client:230530 +# sc-client:230601 FROM sc-client ADD tests/ /tests/ diff --git a/test/SAI-Challenger b/test/SAI-Challenger index 8fe5256fe..1cb47c2a8 160000 --- a/test/SAI-Challenger +++ b/test/SAI-Challenger @@ -1 +1 @@ -Subproject commit 8fe5256feadcf28742445a2f6121b7dc38ac73b4 +Subproject commit 1cb47c2a8704a37f94d33f4f133471a89178d0b5 diff --git a/test/test-cases/functional/saic/conftest.py b/test/test-cases/functional/saic/conftest.py index e5b67b19d..adfdefe56 100644 --- a/test/test-cases/functional/saic/conftest.py +++ b/test/test-cases/functional/saic/conftest.py @@ -6,6 +6,13 @@ from saichallenger.common.sai_dpu import SaiDpu from saichallenger.common.sai_testbed import SaiTestbed +from saichallenger.common.sai_data import SaiObjType + + +def pytest_sessionstart(session): + SaiObjType.generate_from_thrift() + SaiObjType.generate_from_json() + def pytest_addoption(parser): parser.addoption("--traffic", action="store_true", default=False, help="run tests with traffic") diff --git a/test/test-cases/scale/saic/conftest.py b/test/test-cases/scale/saic/conftest.py index e5b67b19d..adfdefe56 100644 --- a/test/test-cases/scale/saic/conftest.py +++ b/test/test-cases/scale/saic/conftest.py @@ -6,6 +6,13 @@ from saichallenger.common.sai_dpu import SaiDpu from saichallenger.common.sai_testbed import SaiTestbed +from saichallenger.common.sai_data import SaiObjType + + +def pytest_sessionstart(session): + SaiObjType.generate_from_thrift() + SaiObjType.generate_from_json() + def pytest_addoption(parser): parser.addoption("--traffic", action="store_true", default=False, help="run tests with traffic") From b32c2097b60aff21d85237b83b57e04b22f20096 Mon Sep 17 00:00:00 2001 From: MirceaDan Date: Wed, 7 Jun 2023 11:25:37 -0700 Subject: [PATCH 28/75] all files changed to linux line endings (#379) --- SECURITY.md | 2 +- assets/cloud-icon.svg | 2 +- assets/dash-specs-flow.svg | 2 +- assets/express-route-icon.svg | 2 +- assets/on-prem-gateway.svg | 2 +- assets/vm-icon.svg | 2 +- dash-pipeline/.dockerignore | 2 +- dash-pipeline/README-common-errors.md | 2 +- dash-pipeline/README-dash-as-submodule.md | 2 +- dash-pipeline/README-dash-ci.md | 2 +- dash-pipeline/README-pytests.md | 2 +- dash-pipeline/README-saithrift.md | 2 +- dash-pipeline/SAI/README.md | 2 +- dash-pipeline/dockerfiles/.dockerignore | 2 +- dash-pipeline/dockerfiles/README.md | 2 +- .../images/dash-docker-branch-workflow.svg | 2 +- .../dash-docker-fork-dockerhub-workflow.svg | 2 +- .../images/dash-docker-fork-workflow.svg | 2 +- .../images/dash-p4-bmv2-thrift-workflow.svg | 2 +- .../images/dash-submodule-git-hierarchy.svg | 2 +- .../images/dash-submodule-workflow.svg | 2 +- .../images/dev-workflow-p4-libsai.svg | 2 +- .../images/dev-workflow-p4-saithrift.svg | 2 +- dash-pipeline/images/dev-workflow-p4.svg | 2 +- dash-pipeline/images/docker-volume-mounts.svg | 2 +- dash-pipeline/tests/libsai/README.md | 2 +- dash-pipeline/tests/saithrift/README.md | 2 +- dash-pipeline/tests/saithrift/ptf/README.md | 2 +- doc-github-rules.md | 2 +- documentation/dataplane/README.md | 2 +- .../dataplane/dash-config-schema-json.md | 2 +- documentation/encrypt-gw-service/README.md | 2 +- documentation/express-route-service/README.md | 2 +- documentation/general/README.md | 2 +- .../general/images/dash-hld-eni-objects.svg | 2 +- ...hld-inbound-packet-processing-pipeline.svg | 2 +- .../general/images/dash-hld-vnet-objects.svg | 2 +- ...simplified-physical-deployment-example.svg | 2 +- .../hld/dash-appliance-architecture.svg | 2 +- .../images/hld/dash-high-level-appliance.svg | 2 +- .../hld/dash-high-level-design-schema.svg | 2 +- .../images/hld/dash-high-level-design.svg | 2 +- .../hld/dash-high-level-smart-switch.svg | 2 +- .../images/hld/dash-hld-project-ecosystem.svg | 2 +- .../images/hld/dash-hld-software-stack.svg | 2 +- .../hld/dash-single-dpu-architecture.svg | 2 +- .../hld/dash-smart-switch-architecture.svg | 2 +- .../images/packet-flow-in-flow-match.svg | 2 +- .../general/images/sdn-appliance.svg | 2 +- documentation/general/images/sdn-high-cps.svg | 2 +- .../images/sdn/eni-match-flow-direction.svg | 2 +- .../images/sdn/inbound-fast-path-flow.svg | 2 +- .../images/sdn/inbound-slow-path-flow.svg | 2 +- .../images/sdn/outbound-fast-path-flow.svg | 2 +- .../images/sdn/outbound-slow-path-flow.svg | 2 +- .../sdn-packet-transforms-inbound-from-lb.svg | 2 +- .../sdn-packet-transforms-outbound-nat-l4.svg | 2 +- ...packet-transforms-private-link-service.svg | 2 +- .../sdn-packet-transforms-private-link.svg | 2 +- ...dn-packet-transforms-service-tunneling.svg | 2 +- ...t-transforms-vm-internal-load-balancer.svg | 2 +- .../sdn/sdn-packet-transforms-vm-to-vm.svg | 2 +- .../general/images/sdn/sdn-virtual-port.svg | 2 +- .../general/images/tcp-connection-abort.svg | 2 +- .../general/images/tcp-connection-create.svg | 2 +- .../general/images/tcp-connection-delete.svg | 2 +- documentation/gnmi/README.md | 2 +- documentation/high-avail/README.md | 2 +- .../high-avail/images/dash-ha-appliance.svg | 2 +- .../images/dash-ha-smart-switch.svg | 2 +- .../high-avail/images/ha-functional-diag.svg | 2 +- .../images/ha-state-sync-packet-format.svg | 2 +- .../high-avail/images/ha-sync-operations.svg | 2 +- .../images/general/dash-specs-flow.svg | 2 +- .../general/github-project-workflow.svg | 2 +- .../images/icons/dash-icon-large.svg | 2 +- .../images/icons/dash-icon-medium.svg | 2 +- .../images/icons/dash-icon-small.svg | 2 +- .../images/icons/dash-icon-xlarge.svg | 2 +- documentation/load-bal-service/README.md | 2 +- documentation/sai/README.md | 2 +- documentation/stpl-service/README.md | 2 +- documentation/vnet-peering-service/README.md | 2 +- documentation/vnet2vnet-service/README.md | 2 +- ...et-pipeline-processing-per-eni-inbound.svg | 2 +- ...t-pipeline-processing-per-eni-outbound.svg | 2 +- ...ket-processing-pipeline-tables-example.svg | 2 +- ...ansforms-vm-to-vm-in-vnet-without-dash.svg | 2 +- .../images/routing-packet-10.1.0.1.svg | 2 +- .../images/routing-packet-10.1.1.1.svg | 2 +- .../images/routing-packet-10.2.5.1.svg | 2 +- .../images/routing-packet-30.0.0.1.svg | 2 +- .../images/vm-to-vm-communication-vnet.svg | 2 +- images/github-project-workflow.svg | 2 +- images/sdn-packet-transforms-vm-to-vm.svg | 2 +- test/.gitignore | 2 +- test/docs/README.md | 2 +- test/docs/dash-ptf-testbed.md | 2 +- test/docs/dash-test-sai-challenger.md | 2 +- .../vnet2vnet_outbound_traffic_scaling.svg | 2 +- test/images/dash-gnmi-api.svg | 2 +- test/images/dash-sai-challenger.svg | 2 +- test/images/dash-saichallenger-enhanced.svg | 2 +- test/images/dash-test-wflow-p4-saithrift.svg | 2 +- test/images/dash-test-wflow-saithrift.svg | 2 +- .../images/dash-testbed-inband-via-switch.svg | 2 +- test/images/dash-testbed-inband-via-tgen.svg | 2 +- test/images/dash-testbed-out-of-band-mgmt.svg | 2 +- .../dash-testbed-out-of-band-via-iface.svg | 2 +- .../dash-testbed-out-of-band-via-proxy.svg | 2 +- test/images/dash-testbed-ref-arch.svg | 2 +- test/images/dash-testbed-tests.svg | 2 +- test/images/dash-thrift-sai-api.svg | 2 +- test/images/ixia-c.dut.svg | 2 +- test/images/test_vxlan_1vpc_1ip.svg | 2 +- test/targets/README.md | 2 +- test/test-cases/functional/ptf/saidashvnet.py | 7414 ++++++++--------- test/test-cases/functional/saic/empty_test.py | 2 +- test/test-cases/functional/saic/pytest.ini | 2 +- .../images/dut-config-custom-gen-files.svg | 2 +- .../tutorial/images/dut-config-custom-gen.svg | 2 +- .../images/dut-config-dpugen-files.svg | 2 +- .../tutorial/images/dut-config-dpugen.svg | 2 +- .../dut-config-list-comprehension-files.svg | 2 +- .../images/dut-config-list-comprehension.svg | 2 +- .../tutorial/images/dut-config-literal.svg | 2 +- test/test-cases/scale/saic/pytest.ini | 2 +- .../scale/vnet2vnet/48K-ips/README.md | 2 +- .../48K-ips/test_vxlan_8vpc_48K-ips.py | 2884 +++---- .../48K-ips/testdata_vxlan_8vpc_48K-ips.py | 274 +- test/test-cases/scale/vnet2vnet/README.md | 202 +- .../vnet2vnet/one-ip/dash_1vpc_1ip_peer.json | 2 +- test/test-cases/utils/README.md | 2 +- test/third-party/traffic_gen/README.md | 2 +- .../traffic_gen/deployment/README.md | 2 +- .../traffic_gen/deployment/ixia-c.drawio.svg | 2 +- 136 files changed, 5519 insertions(+), 5519 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index f7b89984f..926b8ae40 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -38,4 +38,4 @@ We prefer all communications to be in English. Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). - \ No newline at end of file + diff --git a/assets/cloud-icon.svg b/assets/cloud-icon.svg index 182ca6ea5..c72209392 100644 --- a/assets/cloud-icon.svg +++ b/assets/cloud-icon.svg @@ -10,4 +10,4 @@ Icon-Cloud-other-357 - \ No newline at end of file + diff --git a/assets/dash-specs-flow.svg b/assets/dash-specs-flow.svg index 2645f7051..315f24fe9 100644 --- a/assets/dash-specs-flow.svg +++ b/assets/dash-specs-flow.svg @@ -1,4 +1,4 @@ -
Test Cases
Test Cases
Detailed test cases which reference hard compliance requirements by ID so can be traced back. A single test case can cover multiple requirements.
Detailed test cases which reference hard compliance r...
HLDs
HLDs
High-level descriptions & requirements  - architecture, services, features, encapsulations and transformations, , etc.
High-level descriptions & requirements  - arch...
Compliance Requirements
Compliance...
Precise numeric and/or behavioral requirements, each requirement well-specified and assigned an ID. Should refer back to an associated HLD as applicable. Each requirement should be assigned an ID which can be referenced in test cases. Emphasis on human-readability and maintainability but may be expressed in machine-readable form (e.g. yaml file) so can be consumed by test cases.

Example:
Reqmt. ID 1.21.3.4.5
10M connections per second <under some specified condition>
Precise numeric and/or behavioral requirements, each...
P4 Behavioral Model
P4 Behavior...
Dataplane behavioral model
Dataplane behavioral model
Test Scripts
Test Scrip...
Detailed test results in report form, including all metadata required to reproduce the test exactly (all GitHub commit/branch info, DUT details, SW versions, etc.). Results can refer back to the HLDs and compliance requirements.
Detailed test results in report form, including all m...
DASH/Documentation
DASH/Documentation
DASH/test
DASH/test
Reports
Reports
Test Results
Test Results
Actual testing scripts which implement the test cases. Data-driven to the extent possible, using values  from test cases and compliance requirements. Test results should refer back to original compliance requirements including measured results, pass/fail, and ID numbers.
Actual testing scripts which implement the test cases...
reference/consume
reference/...
reference/consume
reference/...
reference
reference
reference
reference
Viewer does not support full SVG 1.1
\ No newline at end of file +
Test Cases
Test Cases
Detailed test cases which reference hard compliance requirements by ID so can be traced back. A single test case can cover multiple requirements.
Detailed test cases which reference hard compliance r...
HLDs
HLDs
High-level descriptions & requirements  - architecture, services, features, encapsulations and transformations, , etc.
High-level descriptions & requirements  - arch...
Compliance Requirements
Compliance...
Precise numeric and/or behavioral requirements, each requirement well-specified and assigned an ID. Should refer back to an associated HLD as applicable. Each requirement should be assigned an ID which can be referenced in test cases. Emphasis on human-readability and maintainability but may be expressed in machine-readable form (e.g. yaml file) so can be consumed by test cases.

Example:
Reqmt. ID 1.21.3.4.5
10M connections per second <under some specified condition>
Precise numeric and/or behavioral requirements, each...
P4 Behavioral Model
P4 Behavior...
Dataplane behavioral model
Dataplane behavioral model
Test Scripts
Test Scrip...
Detailed test results in report form, including all metadata required to reproduce the test exactly (all GitHub commit/branch info, DUT details, SW versions, etc.). Results can refer back to the HLDs and compliance requirements.
Detailed test results in report form, including all m...
DASH/Documentation
DASH/Documentation
DASH/test
DASH/test
Reports
Reports
Test Results
Test Results
Actual testing scripts which implement the test cases. Data-driven to the extent possible, using values  from test cases and compliance requirements. Test results should refer back to original compliance requirements including measured results, pass/fail, and ID numbers.
Actual testing scripts which implement the test cases...
reference/consume
reference/...
reference/consume
reference/...
reference
reference
reference
reference
Viewer does not support full SVG 1.1
diff --git a/assets/express-route-icon.svg b/assets/express-route-icon.svg index e4990a2ad..eb3bd9319 100644 --- a/assets/express-route-icon.svg +++ b/assets/express-route-icon.svg @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/assets/on-prem-gateway.svg b/assets/on-prem-gateway.svg index a0b72deb3..e11e5e58d 100644 --- a/assets/on-prem-gateway.svg +++ b/assets/on-prem-gateway.svg @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/assets/vm-icon.svg b/assets/vm-icon.svg index 95de7f4b2..adef913fe 100644 --- a/assets/vm-icon.svg +++ b/assets/vm-icon.svg @@ -17,4 +17,4 @@ - \ No newline at end of file + diff --git a/dash-pipeline/.dockerignore b/dash-pipeline/.dockerignore index 4a1624118..cb174d15e 100644 --- a/dash-pipeline/.dockerignore +++ b/dash-pipeline/.dockerignore @@ -2,4 +2,4 @@ *.log *.pcap __pycache__/ -.pytest_cache/ \ No newline at end of file +.pytest_cache/ diff --git a/dash-pipeline/README-common-errors.md b/dash-pipeline/README-common-errors.md index 7c74dea29..01674d46c 100644 --- a/dash-pipeline/README-common-errors.md +++ b/dash-pipeline/README-common-errors.md @@ -20,4 +20,4 @@ You will need to logout and log back in to obtain the group membership. To check ``` $ id uid=1001(dash) gid=1001(dash) groups=1001(dash),27(sudo),998(docker) -``` \ No newline at end of file +``` diff --git a/dash-pipeline/README-dash-as-submodule.md b/dash-pipeline/README-dash-as-submodule.md index 6bfcedc83..7cf54f3f3 100644 --- a/dash-pipeline/README-dash-as-submodule.md +++ b/dash-pipeline/README-dash-as-submodule.md @@ -143,4 +143,4 @@ If test ports other than `veth0/1` and `veth2/3` are used, some modifications of ## Custom Tests You can use the tests under DASH by calling the appropriate DASH make targets from the parent project. You can also have private tests in your own project repository which you invoke from your Makefiles. We recommend if you write new tests which are generally applicable that you consider upstreaming to the Community repository. ## Third-Party CI Pipeline Automation (Git Actions) -You should be able to adapt the CI automation files from the dash project as located under [.github/workflows](../.github/workflows). You will need to modify them to suit your project by changing the trigger conditions (e.g. file system paths) and steps. \ No newline at end of file +You should be able to adapt the CI automation files from the dash project as located under [.github/workflows](../.github/workflows). You will need to modify them to suit your project by changing the trigger conditions (e.g. file system paths) and steps. diff --git a/dash-pipeline/README-dash-ci.md b/dash-pipeline/README-dash-ci.md index 7e2275053..cf6bf6f25 100644 --- a/dash-pipeline/README-dash-ci.md +++ b/dash-pipeline/README-dash-ci.md @@ -50,4 +50,4 @@ Let's drill down into the Build P4 step which failed. We see a a bad statement. The main README for this repository shows the CI failing badge: -![CI-fail-README-badge](../assets/CI-fail-README-badge.png) \ No newline at end of file +![CI-fail-README-badge](../assets/CI-fail-README-badge.png) diff --git a/dash-pipeline/README-pytests.md b/dash-pipeline/README-pytests.md index c9035e3a2..c8e64ce26 100644 --- a/dash-pipeline/README-pytests.md +++ b/dash-pipeline/README-pytests.md @@ -130,4 +130,4 @@ listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes * Launch Wireshark * Enter the following filter: `tcp.dstport==9092` -* You can see RPC calls being made in the packet data view, the ASCII string names of methods are displayed \ No newline at end of file +* You can see RPC calls being made in the packet data view, the ASCII string names of methods are displayed diff --git a/dash-pipeline/README-saithrift.md b/dash-pipeline/README-saithrift.md index 8f3d7ee20..c869faf07 100644 --- a/dash-pipeline/README-saithrift.md +++ b/dash-pipeline/README-saithrift.md @@ -427,4 +427,4 @@ Continuing. Starting SAI RPC server on port 9092 [New Thread 0x7f2b4b7fe700 (LWP 18)] [New Thread 0x7f2b4affd700 (LWP 19)] -``` \ No newline at end of file +``` diff --git a/dash-pipeline/SAI/README.md b/dash-pipeline/SAI/README.md index 0ab5f8dfa..08b253d89 100644 --- a/dash-pipeline/SAI/README.md +++ b/dash-pipeline/SAI/README.md @@ -37,4 +37,4 @@ In this example, the input is a dash_pipeline.json, which is a result of a P4 co # requirements.txt This is used for installing python modules, in particular for [snappi](https://github.com/open-traffic-generator/snappi) and [pytest](https://docs.pytest.org/en/7.1.x/index.html). ->**NOTE:** This file is a **hardlink** pointing to a single source of truth for test infrastructure. Take care accordingly. Modifying its contents will impact other collections of test scripts. It's a hardlink for convenience in order to pass the Docker context when building the `saithrift-client` images. We can't use a symlink because Docker cannot dereference symlinks in the context passed to it, see https://stackoverflow.com/questions/31881904/docker-follow-symlink-outside-context and https://medium.com/@307/hard-links-and-symbolic-links-a-comparison-7f2b56864cdd. \ No newline at end of file +>**NOTE:** This file is a **hardlink** pointing to a single source of truth for test infrastructure. Take care accordingly. Modifying its contents will impact other collections of test scripts. It's a hardlink for convenience in order to pass the Docker context when building the `saithrift-client` images. We can't use a symlink because Docker cannot dereference symlinks in the context passed to it, see https://stackoverflow.com/questions/31881904/docker-follow-symlink-outside-context and https://medium.com/@307/hard-links-and-symbolic-links-a-comparison-7f2b56864cdd. diff --git a/dash-pipeline/dockerfiles/.dockerignore b/dash-pipeline/dockerfiles/.dockerignore index 4a1624118..cb174d15e 100644 --- a/dash-pipeline/dockerfiles/.dockerignore +++ b/dash-pipeline/dockerfiles/.dockerignore @@ -2,4 +2,4 @@ *.log *.pcap __pycache__/ -.pytest_cache/ \ No newline at end of file +.pytest_cache/ diff --git a/dash-pipeline/dockerfiles/README.md b/dash-pipeline/dockerfiles/README.md index c2c107f02..fd9e553f1 100644 --- a/dash-pipeline/dockerfiles/README.md +++ b/dash-pipeline/dockerfiles/README.md @@ -1,2 +1,2 @@ # dockerfiles directory -Dockerfiles are placed here in part to avoid exporting the entire environment of the dash-pipeline directory to the docker builder, `.dockerignore` files notwithstanding. \ No newline at end of file +Dockerfiles are placed here in part to avoid exporting the entire environment of the dash-pipeline directory to the docker builder, `.dockerignore` files notwithstanding. diff --git a/dash-pipeline/images/dash-docker-branch-workflow.svg b/dash-pipeline/images/dash-docker-branch-workflow.svg index 057fc666c..c81780b33 100644 --- a/dash-pipeline/images/dash-docker-branch-workflow.svg +++ b/dash-pipeline/images/dash-docker-branch-workflow.svg @@ -1,4 +1,4 @@ -
sonic-net/DASH/main
sonic-net/DASH/main
create branch
create branch
sonic-net/DASH/featureX
sonic-net/DASH/featureX
(role permissions required)
(role permissions r...
modify/create docker images
modify/create...
git push
git push
Local
Local
sonic-net/DASH/featureX
sonic-net/DASH/featureX
code/make/test
code/make/test
ACR
ACR
push
push
pull fails
pull fails
re-run failed job
re-run failed job
ACR
ACR
push
push
pull
pull
pull request
pull request
ACR
ACR
push
push
pull
pull
sonic-net/DASH/main
sonic-net/DASH/main
1
1
2
2
3
3
4
4
5
5
sonic-net/DASH/featureX
sonic-net/DASH/featureX
Text is not SVG - cannot display
\ No newline at end of file +
sonic-net/DASH/main
sonic-net/DASH/main
create branch
create branch
sonic-net/DASH/featureX
sonic-net/DASH/featureX
(role permissions required)
(role permissions r...
modify/create docker images
modify/create...
git push
git push
Local
Local
sonic-net/DASH/featureX
sonic-net/DASH/featureX
code/make/test
code/make/test
ACR
ACR
push
push
pull fails
pull fails
re-run failed job
re-run failed job
ACR
ACR
push
push
pull
pull
pull request
pull request
ACR
ACR
push
push
pull
pull
sonic-net/DASH/main
sonic-net/DASH/main
1
1
2
2
3
3
4
4
5
5
sonic-net/DASH/featureX
sonic-net/DASH/featureX
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dash-docker-fork-dockerhub-workflow.svg b/dash-pipeline/images/dash-docker-fork-dockerhub-workflow.svg index f0a940df3..6ce1c3c63 100644 --- a/dash-pipeline/images/dash-docker-fork-dockerhub-workflow.svg +++ b/dash-pipeline/images/dash-docker-fork-dockerhub-workflow.svg @@ -1,4 +1,4 @@ -
sonic-net/DASH/main
sonic-net/DASH/main
modify/create docker images
modify/create...
Local
Local
Azure/DASH/main (staged)
sonic-net/DASH/main (staged)
code/make/test
code/make/test
ACR
ACR
push
push
pull
pull
merge
merge
ACR
ACR
push
push
pull
pull
sonic-net/DASH/main
sonic-net/DASH/main
1
1
3
3
4
4
5
5
fork devel/DASH/
fork devel/DASH/
create branch
create branch
fork
devel/DASH/
featureX
fork...
git push
git push
6
6
fork
devel/DASH/
featureX
fork...
Parent repo
Parent repo
Forked repo
"devel"
Forked repo...
Dockerhub
(dev's account)
Dockerhub...
docker push
docker push
create or update (pull) fork
create or update (pull) fork
2
2
pull
pull
push
push
git push
git push
fork
devel/DASH/
featureX
fork...
pull
pull
push
push

rename image 
to use ACR
rename image...
7
7
pull request
pull request
10
10
ACR
ACR
push
push
re-run failed job
re-run failed job
9
9
sonic-net/DASH/featureX
sonic-net/DASH/featureX
pull fails (first time)
pull fails...
8
8
ACR
ACR
Text is not SVG - cannot display
\ No newline at end of file +
sonic-net/DASH/main
sonic-net/DASH/main
modify/create docker images
modify/create...
Local
Local
Azure/DASH/main (staged)
sonic-net/DASH/main (staged)
code/make/test
code/make/test
ACR
ACR
push
push
pull
pull
merge
merge
ACR
ACR
push
push
pull
pull
sonic-net/DASH/main
sonic-net/DASH/main
1
1
3
3
4
4
5
5
fork devel/DASH/
fork devel/DASH/
create branch
create branch
fork
devel/DASH/
featureX
fork...
git push
git push
6
6
fork
devel/DASH/
featureX
fork...
Parent repo
Parent repo
Forked repo
"devel"
Forked repo...
Dockerhub
(dev's account)
Dockerhub...
docker push
docker push
create or update (pull) fork
create or update (pull) fork
2
2
pull
pull
push
push
git push
git push
fork
devel/DASH/
featureX
fork...
pull
pull
push
push

rename image 
to use ACR
rename image...
7
7
pull request
pull request
10
10
ACR
ACR
push
push
re-run failed job
re-run failed job
9
9
sonic-net/DASH/featureX
sonic-net/DASH/featureX
pull fails (first time)
pull fails...
8
8
ACR
ACR
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dash-docker-fork-workflow.svg b/dash-pipeline/images/dash-docker-fork-workflow.svg index 77816579f..40684fb0a 100644 --- a/dash-pipeline/images/dash-docker-fork-workflow.svg +++ b/dash-pipeline/images/dash-docker-fork-workflow.svg @@ -1,4 +1,4 @@ -
sonic-net/DASH/main
sonic-net/DASH/main
create branch
create branch
sonic-net/DASH/featureX
sonic-net/DASH/featureX
(role permissions required)
(role permissions r...
modify/create docker images
modify/create...
Local
Local
sonic-net/DASH/featureX
sonic-net/DASH/featureX
code/make/test
code/make/test
ACR
ACR
push
push
re-run failed job
re-run failed job
ACR
ACR
push
push
pull
pull
pull request
pull request
ACR
ACR
push
push
pull
pull
sonic-net/DASH/main
sonic-net/DASH/main
1
1
3
3
4
4
5
5
fork devel/DASH/featureX
fork devel/DASH/featur...
create or update (pull) fork
create or update (pull) fork
2
2
create branch
create branch
fork
devel/DASH/
featureX-dev
fork...
git push
git push
ACR
ACR
pull fails
pull fails
pull request
pull request
6
6
7
7
8
8
sonic-net/DASH/featureX
sonic-net/DASH/featureX
fork
devel/DASH/
featureX-dev
fork...
pull fails (first time)
pull fails...
continue development in fork
continue dev...
Parent repo
Parent repo
Forked repo
"devel"
Forked repo...
Text is not SVG - cannot display
\ No newline at end of file +
sonic-net/DASH/main
sonic-net/DASH/main
create branch
create branch
sonic-net/DASH/featureX
sonic-net/DASH/featureX
(role permissions required)
(role permissions r...
modify/create docker images
modify/create...
Local
Local
sonic-net/DASH/featureX
sonic-net/DASH/featureX
code/make/test
code/make/test
ACR
ACR
push
push
re-run failed job
re-run failed job
ACR
ACR
push
push
pull
pull
pull request
pull request
ACR
ACR
push
push
pull
pull
sonic-net/DASH/main
sonic-net/DASH/main
1
1
3
3
4
4
5
5
fork devel/DASH/featureX
fork devel/DASH/featur...
create or update (pull) fork
create or update (pull) fork
2
2
create branch
create branch
fork
devel/DASH/
featureX-dev
fork...
git push
git push
ACR
ACR
pull fails
pull fails
pull request
pull request
6
6
7
7
8
8
sonic-net/DASH/featureX
sonic-net/DASH/featureX
fork
devel/DASH/
featureX-dev
fork...
pull fails (first time)
pull fails...
continue development in fork
continue dev...
Parent repo
Parent repo
Forked repo
"devel"
Forked repo...
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dash-p4-bmv2-thrift-workflow.svg b/dash-pipeline/images/dash-p4-bmv2-thrift-workflow.svg index 297ddc6f1..3da68f851 100644 --- a/dash-pipeline/images/dash-p4-bmv2-thrift-workflow.svg +++ b/dash-pipeline/images/dash-p4-bmv2-thrift-workflow.svg @@ -1,4 +1,4 @@ -
ixia-c
ixia-c
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
make  sai-thrift-client
make  sai-thrift-client
SW traffic 
generator
SW traffic...
DASH P4
behavioral model 
(source of truth)
DASH P4...
Standard OCP SAI
header files subset
(underlay)
Standard OCP SAI...
DASH SAI
header files
(overrlay)
DASH SAI...
Saithrift code
generator
Saithrift code...
Thrift server
skeleton C++ code
Thrift server...
opencompute/SAI
opencompute/SAI
make P4
make P4
DASH/dash-pipeline
DASH/dash-pipeline
Generate SAI headers
Generate SAI headers
DUT Software
Target
DUT Software...
Python thrift client  lib*
Python thrift client...
Git
Git
SAI-Thrift
commands
SAI-Thrift...
P4 "object code" loaded by bmv2 
P4 "object code" loaded by bmv2...
make sai-thrift-server
make sai-thrift-server
dash_pipeline_p4rt.json
dash_pipeline_p4rt.json
make run-sai-thrift-server
make run-sai-thrift-server
make libsai-test
make run-libsai-test
make libsai-test...
Git
Git
dash_pipeline.json
dash_pipeline.json
generate_dash_api.sh
generate_dash_api.sh
Containers provide the build & run environment:
Containers provide the b...
make docker-XXX
make docker-XXX
make sai
make sai
meta/make
meta/make
bmv2 SAI implementation C++ code
bmv2 SAI implementation C++ code
meta/gensairpc.pl
meta/gensairpc.pl
saithrift
server
saithrift...
libsai
libsai
p4c
p4c
make sai
make sai
make <target>
make <target>
LEGEND
LEGEND
make target or script in dash-pipeline
make target or script in dash-pipeline
make <target>
make <target>
make target or script in another repo (e.g. SAI/meta)
make target or script in another repo (e.g. SAI/meta)
SAI & meta headers
SAI & meta headers
Resource comes from external repo (resources assumed to be in this repo otherwise)
Resource comes from external repo (resources assumed to be in this repo otherwi...
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Runtime socket communications (RPC commands or test traffic)
Runtime socket communications (RPC commands or test traffic)
Tgen Commands
Tgen Commands
Build step produces artifacts
Build step produces artifacts
make run-switch
make run-switch
make run-saithrift_XXXtests
make run-saithrift_XXXtests
(Git Submodule)
(Git Submodule)

compiled c++ test programs e.g. vnet_out
compiled c++ test p...
make docker-XXX-publish
make docker-XXX-publish
local environment
local environ...
Various repos (Ubuntu, p4.org, etc.)
Various repos (Ubunt...
local environment
local environ...
dash-xxx
dash-xxx
dash-XXX
dash-XXX
P4 Info
P4 Info
Reg
Reg
make docker-XXX-pull (explicit)
make docker-XXX...
docker-run (implicit)
docker-run (imp...
Python thrift client  lib*
Python thrift client...
Bmv2+
V1+ Arch
Bmv2+...
Git
Git
opencompute/SAI
opencompute/SAI
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
make deploy-ixia-c
make deploy-ixia-c
Build-time container
Build-time container
Run-time container
Run-time container
Test scripts:
PTF, Pytest
mounted from host dev env
Test scripts:...
make run-saithrift_dev-XXXtests
make run-saithrift_dev-XXXtests
/test-dev
/test-dev
/test
/test
/SAI
/SAI
Text is not SVG - cannot display
\ No newline at end of file +
ixia-c
ixia-c
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
make  sai-thrift-client
make  sai-thrift-client
SW traffic 
generator
SW traffic...
DASH P4
behavioral model 
(source of truth)
DASH P4...
Standard OCP SAI
header files subset
(underlay)
Standard OCP SAI...
DASH SAI
header files
(overrlay)
DASH SAI...
Saithrift code
generator
Saithrift code...
Thrift server
skeleton C++ code
Thrift server...
opencompute/SAI
opencompute/SAI
make P4
make P4
DASH/dash-pipeline
DASH/dash-pipeline
Generate SAI headers
Generate SAI headers
DUT Software
Target
DUT Software...
Python thrift client  lib*
Python thrift client...
Git
Git
SAI-Thrift
commands
SAI-Thrift...
P4 "object code" loaded by bmv2 
P4 "object code" loaded by bmv2...
make sai-thrift-server
make sai-thrift-server
dash_pipeline_p4rt.json
dash_pipeline_p4rt.json
make run-sai-thrift-server
make run-sai-thrift-server
make libsai-test
make run-libsai-test
make libsai-test...
Git
Git
dash_pipeline.json
dash_pipeline.json
generate_dash_api.sh
generate_dash_api.sh
Containers provide the build & run environment:
Containers provide the b...
make docker-XXX
make docker-XXX
make sai
make sai
meta/make
meta/make
bmv2 SAI implementation C++ code
bmv2 SAI implementation C++ code
meta/gensairpc.pl
meta/gensairpc.pl
saithrift
server
saithrift...
libsai
libsai
p4c
p4c
make sai
make sai
make <target>
make <target>
LEGEND
LEGEND
make target or script in dash-pipeline
make target or script in dash-pipeline
make <target>
make <target>
make target or script in another repo (e.g. SAI/meta)
make target or script in another repo (e.g. SAI/meta)
SAI & meta headers
SAI & meta headers
Resource comes from external repo (resources assumed to be in this repo otherwise)
Resource comes from external repo (resources assumed to be in this repo otherwi...
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Runtime socket communications (RPC commands or test traffic)
Runtime socket communications (RPC commands or test traffic)
Tgen Commands
Tgen Commands
Build step produces artifacts
Build step produces artifacts
make run-switch
make run-switch
make run-saithrift_XXXtests
make run-saithrift_XXXtests
(Git Submodule)
(Git Submodule)

compiled c++ test programs e.g. vnet_out
compiled c++ test p...
make docker-XXX-publish
make docker-XXX-publish
local environment
local environ...
Various repos (Ubuntu, p4.org, etc.)
Various repos (Ubunt...
local environment
local environ...
dash-xxx
dash-xxx
dash-XXX
dash-XXX
P4 Info
P4 Info
Reg
Reg
make docker-XXX-pull (explicit)
make docker-XXX...
docker-run (implicit)
docker-run (imp...
Python thrift client  lib*
Python thrift client...
Bmv2+
V1+ Arch
Bmv2+...
Git
Git
opencompute/SAI
opencompute/SAI
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
make deploy-ixia-c
make deploy-ixia-c
Build-time container
Build-time container
Run-time container
Run-time container
Test scripts:
PTF, Pytest
mounted from host dev env
Test scripts:...
make run-saithrift_dev-XXXtests
make run-saithrift_dev-XXXtests
/test-dev
/test-dev
/test
/test
/SAI
/SAI
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dash-submodule-git-hierarchy.svg b/dash-pipeline/images/dash-submodule-git-hierarchy.svg index f71edc447..e8ec70d9e 100644 --- a/dash-pipeline/images/dash-submodule-git-hierarchy.svg +++ b/dash-pipeline/images/dash-submodule-git-hierarchy.svg @@ -1,4 +1,4 @@ -
Git
Git
github.com/parent-project
github.com/parent-project
Git
Git
github.com/sonic-net/DASH
github.com/sonic-net/DASH
Git
Git
github.com/opencomputeproject/SAI
github.com/opencomputeproject/SAI
/DASH
/DASH
./dash-pipeline/SAI/SAI
./dash-pipeline/SAI/S...
Git Repos
Git Repos
Filesystem directories
Filesystem...
DASH  submodule directly imported into "parent-project
DASH  submodule directly i...
Git
Git
github.com/p4lang/ptf
github.com/p4lang/ptf
./test/ptf
./test/...
Git submodules used by DASH project itself, indirectly imported into "parent-project."
Git submodules used by DASH pr...
Text is not SVG - cannot display
\ No newline at end of file +
Git
Git
github.com/parent-project
github.com/parent-project
Git
Git
github.com/sonic-net/DASH
github.com/sonic-net/DASH
Git
Git
github.com/opencomputeproject/SAI
github.com/opencomputeproject/SAI
/DASH
/DASH
./dash-pipeline/SAI/SAI
./dash-pipeline/SAI/S...
Git Repos
Git Repos
Filesystem directories
Filesystem...
DASH  submodule directly imported into "parent-project
DASH  submodule directly i...
Git
Git
github.com/p4lang/ptf
github.com/p4lang/ptf
./test/ptf
./test/...
Git submodules used by DASH project itself, indirectly imported into "parent-project."
Git submodules used by DASH pr...
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dash-submodule-workflow.svg b/dash-pipeline/images/dash-submodule-workflow.svg index 96de7a3f6..7dd73b6a7 100644 --- a/dash-pipeline/images/dash-submodule-workflow.svg +++ b/dash-pipeline/images/dash-submodule-workflow.svg @@ -1,4 +1,4 @@ -
ixia-c
ixia-c
SAI
Implementation
?
SAI...
make  sai-thrift-client
make  sai-thrift-client
DASH P4
behavioral model 
(source of truth)
DASH P4...
Standard OCP SAI
header files subset
(underlay)
Standard OCP SAI...
DASH SAI
header files
(overrlay)
DASH SAI...
Saithrift code
generator
Saithrift code...
Thrift server
skeleton C++ code
Thrift server...
opencompute/SAI
opencompute/SAI
make P4
make P4
DASH/dash-pipeline
DASH/dash-pipeline
Generate SAI headers
Generate SAI headers
Git
Git
dash_pipeline.json
dash_pipeline.json
generate_dash_api.sh
generate_dash_api.sh
Containers provide the build & run environment:
Containers provide the b...
make docker-XXX
make docker-XXX
make sai
make sai
meta/make
meta/make
SAI implementation code
SAI implementation code
meta/gensairpc.pl
meta/gensairpc.pl
saithrift
server
saithrift...
libsai
libsai
p4c
p4c
make sai
make sai
make <target>
make <target>
LEGEND
LEGEND
make target or script in dash-pipeline
make target or script in dash-pipeline
make <target>
make <target>
make target or script in another repo (e.g. SAI/meta)
make target or script in another repo (e.g. SAI/meta)
SAI & meta headers
SAI & meta headers
Resource comes from external repo (resources assumed to be in this repo otherwise)
Resource comes from external repo (resources assumed to be in this repo otherwi...
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Runtime socket communications (RPC commands or test traffic)
Runtime socket communications (RPC commands or test traffic)
Tgen Commands
Tgen Commands
Build step produces artifacts
Build step produces artifacts
make run-switch
make run-switch
make run-saithrift_XXXtests
make run-saithrift_XXXtests
(Git Submodule)
(Git Submodule)

make docker-XXX-publish
make docker-XXX-publish
local environment
local environ...
Various repos (Ubuntu, p4.org, etc.)
Various repos (Ubunt...
local environment
local environ...
dash-xxx
dash-xxx
dash-XXX
dash-XXX
P4 Info
P4 Info
Reg
Reg
make docker-XXX-pull (explicit)
make docker-XXX...
docker-run (implicit)
docker-run (imp...
Python thrift client  lib*
Python thrift client...
DASH Dataplane
DASH Dataplane
Git
Git
opencompute/SAI
opencompute/SAI
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
make deploy-ixia-c
make deploy-ixia-c
Build-time container
Build-time container
Run-time container
Run-time container
Test scripts:
PTF, Pytest
mounted from host dev env
Test scripts:...
make run-saithrift_dev-XXXtests
make run-saithrift_dev-XXXtests
/test-dev
/test-dev
/test
/test
/SAI
/SAI
Custom third-party implementation
Custom third-party i...
socket or in-process
socket or in...
Text is not SVG - cannot display
\ No newline at end of file +
ixia-c
ixia-c
SAI
Implementation
?
SAI...
make  sai-thrift-client
make  sai-thrift-client
DASH P4
behavioral model 
(source of truth)
DASH P4...
Standard OCP SAI
header files subset
(underlay)
Standard OCP SAI...
DASH SAI
header files
(overrlay)
DASH SAI...
Saithrift code
generator
Saithrift code...
Thrift server
skeleton C++ code
Thrift server...
opencompute/SAI
opencompute/SAI
make P4
make P4
DASH/dash-pipeline
DASH/dash-pipeline
Generate SAI headers
Generate SAI headers
Git
Git
dash_pipeline.json
dash_pipeline.json
generate_dash_api.sh
generate_dash_api.sh
Containers provide the build & run environment:
Containers provide the b...
make docker-XXX
make docker-XXX
make sai
make sai
meta/make
meta/make
SAI implementation code
SAI implementation code
meta/gensairpc.pl
meta/gensairpc.pl
saithrift
server
saithrift...
libsai
libsai
p4c
p4c
make sai
make sai
make <target>
make <target>
LEGEND
LEGEND
make target or script in dash-pipeline
make target or script in dash-pipeline
make <target>
make <target>
make target or script in another repo (e.g. SAI/meta)
make target or script in another repo (e.g. SAI/meta)
SAI & meta headers
SAI & meta headers
Resource comes from external repo (resources assumed to be in this repo otherwise)
Resource comes from external repo (resources assumed to be in this repo otherwi...
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Runtime socket communications (RPC commands or test traffic)
Runtime socket communications (RPC commands or test traffic)
Tgen Commands
Tgen Commands
Build step produces artifacts
Build step produces artifacts
make run-switch
make run-switch
make run-saithrift_XXXtests
make run-saithrift_XXXtests
(Git Submodule)
(Git Submodule)

make docker-XXX-publish
make docker-XXX-publish
local environment
local environ...
Various repos (Ubuntu, p4.org, etc.)
Various repos (Ubunt...
local environment
local environ...
dash-xxx
dash-xxx
dash-XXX
dash-XXX
P4 Info
P4 Info
Reg
Reg
make docker-XXX-pull (explicit)
make docker-XXX...
docker-run (implicit)
docker-run (imp...
Python thrift client  lib*
Python thrift client...
DASH Dataplane
DASH Dataplane
Git
Git
opencompute/SAI
opencompute/SAI
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
make deploy-ixia-c
make deploy-ixia-c
Build-time container
Build-time container
Run-time container
Run-time container
Test scripts:
PTF, Pytest
mounted from host dev env
Test scripts:...
make run-saithrift_dev-XXXtests
make run-saithrift_dev-XXXtests
/test-dev
/test-dev
/test
/test
/SAI
/SAI
Custom third-party implementation
Custom third-party i...
socket or in-process
socket or in...
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dev-workflow-p4-libsai.svg b/dash-pipeline/images/dev-workflow-p4-libsai.svg index 6dd445554..54739efd7 100644 --- a/dash-pipeline/images/dev-workflow-p4-libsai.svg +++ b/dash-pipeline/images/dev-workflow-p4-libsai.svg @@ -1,4 +1,4 @@ -
p4c
p4c
make p4
(make p4-clean)
make p4...
P4.json
P4RT.json
P4.json...
Bmv2+
V1+ Arch
Bmv2+...
make run-switch
(make kill-switch)
make run-switch...
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
tests/
libsai
tests/...
libsai
libsai
make run-libsai-test
make run-libsai-test
p4runtime
p4runtime
make sai
make sai
c++ sai config
c++ sai config
P4 coding,
libsai generator
P4 coding,...
make run-switch
make run-libsai-test
make run-switch...
make p4 sai libsai-test
make p4 sai libsai-te...
make  sai-thrift-client
make  sai-thrift-client
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Python thrift client  lib*
Python thrift client...
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
/test
/test
/SAI
/SAI
packets (veths)
packets (veths)
make run-saithrift-client-bash
make run-saithrift-client-bash
optional
optional
Text is not SVG - cannot display
\ No newline at end of file +
p4c
p4c
make p4
(make p4-clean)
make p4...
P4.json
P4RT.json
P4.json...
Bmv2+
V1+ Arch
Bmv2+...
make run-switch
(make kill-switch)
make run-switch...
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
tests/
libsai
tests/...
libsai
libsai
make run-libsai-test
make run-libsai-test
p4runtime
p4runtime
make sai
make sai
c++ sai config
c++ sai config
P4 coding,
libsai generator
P4 coding,...
make run-switch
make run-libsai-test
make run-switch...
make p4 sai libsai-test
make p4 sai libsai-te...
make  sai-thrift-client
make  sai-thrift-client
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Python thrift client  lib*
Python thrift client...
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
/test
/test
/SAI
/SAI
packets (veths)
packets (veths)
make run-saithrift-client-bash
make run-saithrift-client-bash
optional
optional
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dev-workflow-p4-saithrift.svg b/dash-pipeline/images/dev-workflow-p4-saithrift.svg index fd4d7e8aa..492017882 100644 --- a/dash-pipeline/images/dev-workflow-p4-saithrift.svg +++ b/dash-pipeline/images/dev-workflow-p4-saithrift.svg @@ -1,4 +1,4 @@ -
p4c
p4c
make p4
(make p4-clean)
make p4...
P4.json
P4RT.json
P4.json...
Bmv2+
V1+ Arch
Bmv2+...
make run-switch
(make kill-switch)
make run-switch...
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
saithrift-server
saithrift-...
libsai
libsai
p4runtime
p4runtime
make sai
make sai
make saithrift-server
make saithrift-server
make sai-thrift-client
make sai-thrift-client
Test scripts:
PTF, Pytest
built into container
Test scripts:...
make run-xxx-tests
make run-xxx-tests
Python thrift client  lib*
Python thrift client...
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
/test
/test
/SAI
/SAI
red = included in "make all"
red = included in "make all"
packets (veths)
packets (veths)
Tgen commands
Tgen commands
saithrift commands
saithrift commands
any coding
any coding
make run-switch
make run-sai-thrift-server
make run-all-tests
make run-switch...
make all
make all
/test-dev
/test-dev
test-case coding
test-case co...
run tests
interactively
run tests...
make run-saithrift-client-bash
make run-saithrift-client-bash
Text is not SVG - cannot display
\ No newline at end of file +
p4c
p4c
make p4
(make p4-clean)
make p4...
P4.json
P4RT.json
P4.json...
Bmv2+
V1+ Arch
Bmv2+...
make run-switch
(make kill-switch)
make run-switch...
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
saithrift-server
saithrift-...
libsai
libsai
p4runtime
p4runtime
make sai
make sai
make saithrift-server
make saithrift-server
make sai-thrift-client
make sai-thrift-client
Test scripts:
PTF, Pytest
built into container
Test scripts:...
make run-xxx-tests
make run-xxx-tests
Python thrift client  lib*
Python thrift client...
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
/test
/test
/SAI
/SAI
red = included in "make all"
red = included in "make all"
packets (veths)
packets (veths)
Tgen commands
Tgen commands
saithrift commands
saithrift commands
any coding
any coding
make run-switch
make run-sai-thrift-server
make run-all-tests
make run-switch...
make all
make all
/test-dev
/test-dev
test-case coding
test-case co...
run tests
interactively
run tests...
make run-saithrift-client-bash
make run-saithrift-client-bash
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/dev-workflow-p4.svg b/dash-pipeline/images/dev-workflow-p4.svg index 0a96f4750..b88c10e00 100644 --- a/dash-pipeline/images/dev-workflow-p4.svg +++ b/dash-pipeline/images/dev-workflow-p4.svg @@ -1,4 +1,4 @@ -
make p4
(make p4-clean)
make p4...
P4.json
P4RT.json
P4.json...
Bmv2+
V1+ Arch
Bmv2+...
make run-switch
(make kill-switch)
make run-switch...
P4 coding
P4 coding
manually verify
manually v...
make p4
make p4
make  sai-thrift-client
make  sai-thrift-client
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Python thrift client  lib*
Python thrift client...
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
/test
/test
/SAI
/SAI
packets (veths)
packets (veths)
make run-saithrift-client-bash
make run-saithrift-client-bash
optional
optional
Text is not SVG - cannot display
\ No newline at end of file +
make p4
(make p4-clean)
make p4...
P4.json
P4RT.json
P4.json...
Bmv2+
V1+ Arch
Bmv2+...
make run-switch
(make kill-switch)
make run-switch...
P4 coding
P4 coding
manually verify
manually v...
make p4
make p4
make  sai-thrift-client
make  sai-thrift-client
Test scripts:
PTF, Pytest
built into container
Test scripts:...
Python thrift client  lib*
Python thrift client...
SAI PTF Framework
SAI PTF Framework
Scapy
Scapy
/test
/test
/SAI
/SAI
packets (veths)
packets (veths)
make run-saithrift-client-bash
make run-saithrift-client-bash
optional
optional
Text is not SVG - cannot display
diff --git a/dash-pipeline/images/docker-volume-mounts.svg b/dash-pipeline/images/docker-volume-mounts.svg index 9d26054f3..9ec755fd8 100644 --- a/dash-pipeline/images/docker-volume-mounts.svg +++ b/dash-pipeline/images/docker-volume-mounts.svg @@ -1,4 +1,4 @@ -
Host Filesystem
Host Files...
Container Filesystem
Container...
/
  /WORKDIR
      /DASH
        /dash-pipeline
          /SAI
/...
/
  /SAI
/...
mount
mount
docker run -v $(PWD)/SAI:/SAI
docker run -v $(PWD)/SAI:/SAI
Text is not SVG - cannot display
\ No newline at end of file +
Host Filesystem
Host Files...
Container Filesystem
Container...
/
  /WORKDIR
      /DASH
        /dash-pipeline
          /SAI
/...
/
  /SAI
/...
mount
mount
docker run -v $(PWD)/SAI:/SAI
docker run -v $(PWD)/SAI:/SAI
Text is not SVG - cannot display
diff --git a/dash-pipeline/tests/libsai/README.md b/dash-pipeline/tests/libsai/README.md index d318bb1fb..fa7177ffb 100644 --- a/dash-pipeline/tests/libsai/README.md +++ b/dash-pipeline/tests/libsai/README.md @@ -1,2 +1,2 @@ # libsai tests directory -These tests are written in c++ and are intended to test and demonstrate writing DASH API configuration and management code which links to the `libsai` library for DASH. In particular, these programs use the SAI-to-P4Runtime adaptor layer. As such they require many libraries including gRPC, protobuf, P4 PI layer etc. in addition to `libsai` itself. \ No newline at end of file +These tests are written in c++ and are intended to test and demonstrate writing DASH API configuration and management code which links to the `libsai` library for DASH. In particular, these programs use the SAI-to-P4Runtime adaptor layer. As such they require many libraries including gRPC, protobuf, P4 PI layer etc. in addition to `libsai` itself. diff --git a/dash-pipeline/tests/saithrift/README.md b/dash-pipeline/tests/saithrift/README.md index 1d7d5bb6f..4520265af 100644 --- a/dash-pipeline/tests/saithrift/README.md +++ b/dash-pipeline/tests/saithrift/README.md @@ -5,4 +5,4 @@ This directory contains tests for DASH pipeline using python `saithrift` client The tests use the same thrift and saithrift client libraries and in general the configuration and setup of the DASH data plane will use the same APIs and command sequences. The frameworks differ primarily in how test suites are designed and orchestrated. Each framework has advantages and disadvantages, hence both are supported as first-class citizens. -In particular the PTF test framework has a significant body of helper libraries which simplify setup. The corollary is that the PTF libraries make a lot of embedded assumptions about the test target, the environment and the data plane SW packet generator (scapy). \ No newline at end of file +In particular the PTF test framework has a significant body of helper libraries which simplify setup. The corollary is that the PTF libraries make a lot of embedded assumptions about the test target, the environment and the data plane SW packet generator (scapy). diff --git a/dash-pipeline/tests/saithrift/ptf/README.md b/dash-pipeline/tests/saithrift/ptf/README.md index e8f99433d..5d7500d30 100644 --- a/dash-pipeline/tests/saithrift/ptf/README.md +++ b/dash-pipeline/tests/saithrift/ptf/README.md @@ -3,4 +3,4 @@ This directory can contain PTF tests for DASH bmv2. These would supplement standard tests under [SAI/ptf](../../SAI/ptf) -CI-ready DASH tests are moved to [`test/test-cases/functional/ptf`](../../../../test/test-cases/functional/ptf/) \ No newline at end of file +CI-ready DASH tests are moved to [`test/test-cases/functional/ptf`](../../../../test/test-cases/functional/ptf/) diff --git a/doc-github-rules.md b/doc-github-rules.md index 789c3efb0..e4b46eb4d 100644 --- a/doc-github-rules.md +++ b/doc-github-rules.md @@ -204,4 +204,4 @@ See also [A collection of .gitignore templates](https://github.com/github/gitign - [Visual studio code](https://code.visualstudio.com/) - [Gitlens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens). Supercharge the Git capabilities. - [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one). Create the ToC for an article. -- [Drawing tool: diagrams.net](https://www.diagrams.net/) \ No newline at end of file +- [Drawing tool: diagrams.net](https://www.diagrams.net/) diff --git a/documentation/dataplane/README.md b/documentation/dataplane/README.md index 03dc75736..2ca344457 100644 --- a/documentation/dataplane/README.md +++ b/documentation/dataplane/README.md @@ -14,4 +14,4 @@ This folder contains DASH data plane design and requirements documents. ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/dataplane/dash-config-schema-json.md b/documentation/dataplane/dash-config-schema-json.md index d813ab48d..f8a8531ff 100644 --- a/documentation/dataplane/dash-config-schema-json.md +++ b/documentation/dataplane/dash-config-schema-json.md @@ -734,4 +734,4 @@ last update: 04/12/2022 } -``` \ No newline at end of file +``` diff --git a/documentation/encrypt-gw-service/README.md b/documentation/encrypt-gw-service/README.md index 264913705..5f033d786 100644 --- a/documentation/encrypt-gw-service/README.md +++ b/documentation/encrypt-gw-service/README.md @@ -11,4 +11,4 @@ This folder contains DASH Encryption Gateway Service design and requirements doc ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/express-route-service/README.md b/documentation/express-route-service/README.md index e951ad476..5217d2695 100644 --- a/documentation/express-route-service/README.md +++ b/documentation/express-route-service/README.md @@ -11,4 +11,4 @@ This folder contains DASH Express Route Gateway Service design and requirements ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/general/README.md b/documentation/general/README.md index da9a60763..b0e86fddb 100644 --- a/documentation/general/README.md +++ b/documentation/general/README.md @@ -20,4 +20,4 @@ This folder contains DASH general design and requirements documents. | Document | Description | | ---------------------------------------------------------------------------------- | ------------------------------------------ | | [dash-general-compliance-requirements.md](dash-general-compliance-requirements.md) | DASH General Compliance Requirements | -| [program-scale-testing-requirements-draft.md](program-scale-testing-requirements-draft.md) | DASH scale and performance requirements | \ No newline at end of file +| [program-scale-testing-requirements-draft.md](program-scale-testing-requirements-draft.md) | DASH scale and performance requirements | diff --git a/documentation/general/images/dash-hld-eni-objects.svg b/documentation/general/images/dash-hld-eni-objects.svg index f95584a60..0d51d22c3 100644 --- a/documentation/general/images/dash-hld-eni-objects.svg +++ b/documentation/general/images/dash-hld-eni-objects.svg @@ -1,4 +1,4 @@ -
QoS
QoS
KEY:MAC
KEY:MAC
ROUTE_TABLE:Prefix
ROUTE_TABLE:Prefix
ACL_IN/ACL_OUT
ACL_IN/ACL_OUT
ENI Objects
ENI Objects
Text is not SVG - cannot display
\ No newline at end of file +
QoS
QoS
KEY:MAC
KEY:MAC
ROUTE_TABLE:Prefix
ROUTE_TABLE:Prefix
ACL_IN/ACL_OUT
ACL_IN/ACL_OUT
ENI Objects
ENI Objects
Text is not SVG - cannot display
diff --git a/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg b/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg index 40290e1c7..ebfd96806 100644 --- a/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg +++ b/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg @@ -1,4 +1,4 @@ -
VNI Lookup
(set direction)
VNI Lookup...
ENI Lookup
ENI Lookup
Conntrack Lookup
Conntrack Lookup
Routing
Routing
ACLs
ACLs
Metering
Metering
Conntrack Update
Conntrack Update
Network
Network
VM
VM
Vxlan Encap
Vxlan Encap
Text is not SVG - cannot display
\ No newline at end of file +
VNI Lookup
(set direction)
VNI Lookup...
ENI Lookup
ENI Lookup
Conntrack Lookup
Conntrack Lookup
Routing
Routing
ACLs
ACLs
Metering
Metering
Conntrack Update
Conntrack Update
Network
Network
VM
VM
Vxlan Encap
Vxlan Encap
Text is not SVG - cannot display
diff --git a/documentation/general/images/dash-hld-vnet-objects.svg b/documentation/general/images/dash-hld-vnet-objects.svg index 674b99c83..7d593a857 100644 --- a/documentation/general/images/dash-hld-vnet-objects.svg +++ b/documentation/general/images/dash-hld-vnet-objects.svg @@ -1,4 +1,4 @@ -
VNET Objects
VNET Objects
KEY:VNET_NAME
KEY:VNET_NAME
MAPPING_TABLE:CA_IP
MAPPING_TABLE:CA_IP
VNI
VNI
Text is not SVG - cannot display
\ No newline at end of file +
VNET Objects
VNET Objects
KEY:VNET_NAME
KEY:VNET_NAME
MAPPING_TABLE:CA_IP
MAPPING_TABLE:CA_IP
VNI
VNI
Text is not SVG - cannot display
diff --git a/documentation/general/images/dash-simplified-physical-deployment-example.svg b/documentation/general/images/dash-simplified-physical-deployment-example.svg index abf3ef3e2..328050975 100644 --- a/documentation/general/images/dash-simplified-physical-deployment-example.svg +++ b/documentation/general/images/dash-simplified-physical-deployment-example.svg @@ -1,4 +1,4 @@ -
Regional Network Gateway

West     East
Regional Netw...
Regional Network Gateway

West     East
Regional Netw...
DataCenterRow(s)
Appliance
Applian...
e
e
Traffic
Traffic
External/Internet
External/Internet
Destination
Destination
Representative Region & DataCenter
Representative Region & DataCenter
Appliance
Applian...
Server Racks w/ToRs
Server R...
Server Racks w/ToRs
Server R...
WAN Equipment
WAN Equipment
WAN Equipment
WAN Equipment
Server w/VMs
Server w/VMs
Server w/VMs
Server w/VMs
Rack w/Appliance
Rack w/Appliance
Rack w/Appliance
Rack w/Appliance
Smart Switch
Smart Switch
DASH on ToR
DASH on ToR
DASH on
Appliance
DASH on...
DASH on NIC
DASH on NIC
Text is not SVG - cannot display
\ No newline at end of file +
Regional Network Gateway

West     East
Regional Netw...
Regional Network Gateway

West     East
Regional Netw...
DataCenterRow(s)
Appliance
Applian...
e
e
Traffic
Traffic
External/Internet
External/Internet
Destination
Destination
Representative Region & DataCenter
Representative Region & DataCenter
Appliance
Applian...
Server Racks w/ToRs
Server R...
Server Racks w/ToRs
Server R...
WAN Equipment
WAN Equipment
WAN Equipment
WAN Equipment
Server w/VMs
Server w/VMs
Server w/VMs
Server w/VMs
Rack w/Appliance
Rack w/Appliance
Rack w/Appliance
Rack w/Appliance
Smart Switch
Smart Switch
DASH on ToR
DASH on ToR
DASH on
Appliance
DASH on...
DASH on NIC
DASH on NIC
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-appliance-architecture.svg b/documentation/general/images/hld/dash-appliance-architecture.svg index 64ce75cb4..4145822e2 100644 --- a/documentation/general/images/hld/dash-appliance-architecture.svg +++ b/documentation/general/images/hld/dash-appliance-architecture.svg @@ -1,4 +1,4 @@ -
database container
database container
redis server
redis server
Kernel Space
Kernel Space
bgp container
bgp container
bgpd
bgpd
zebra
zebra
fpm-syncd
fpm-syncd
dhcp-relay container
dhcp-relay container
dhcp-relay
dhcp-relay
pmon container
pmon container
fan control 
fan control 
sensord
sensord
snmp container
snmp container
snmpd
snmpd
snmp-subagent
snmp-subagent
teamd container
teamd container
teamd
teamd
teamsyncd
teamsyncd
lldp container
lldp container
lldpd
lldpd
lldpmgrd
lldpmgrd
lldp-syncd
lldp-syncd
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orchagent
orchagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
sonic-cfggen
sonic-cfggen
CLI
CLI
asic drivers
asic drivers
network drivers
network drivers
platform drivers
platform drivers
transceivers
transceivers
fan/power/leds
fan/power/leds
Customizable
Customizable
User Space
User Space
telemetry container
telemetry container
telemetry
telemetry
Hardware
Hardware
gNMI container
gNMI container
DASH API
DASH API
Appliance
Appliance
SONiC ToR
SONiC ToR
Appliance w/6 NIC
Applianc...
NIC w/DPU 
NIC w/DPU 
Text is not SVG - cannot display
\ No newline at end of file +
database container
database container
redis server
redis server
Kernel Space
Kernel Space
bgp container
bgp container
bgpd
bgpd
zebra
zebra
fpm-syncd
fpm-syncd
dhcp-relay container
dhcp-relay container
dhcp-relay
dhcp-relay
pmon container
pmon container
fan control 
fan control 
sensord
sensord
snmp container
snmp container
snmpd
snmpd
snmp-subagent
snmp-subagent
teamd container
teamd container
teamd
teamd
teamsyncd
teamsyncd
lldp container
lldp container
lldpd
lldpd
lldpmgrd
lldpmgrd
lldp-syncd
lldp-syncd
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orchagent
orchagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
sonic-cfggen
sonic-cfggen
CLI
CLI
asic drivers
asic drivers
network drivers
network drivers
platform drivers
platform drivers
transceivers
transceivers
fan/power/leds
fan/power/leds
Customizable
Customizable
User Space
User Space
telemetry container
telemetry container
telemetry
telemetry
Hardware
Hardware
gNMI container
gNMI container
DASH API
DASH API
Appliance
Appliance
SONiC ToR
SONiC ToR
Appliance w/6 NIC
Applianc...
NIC w/DPU 
NIC w/DPU 
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-high-level-appliance.svg b/documentation/general/images/hld/dash-high-level-appliance.svg index 4121d0c1b..81b830826 100644 --- a/documentation/general/images/hld/dash-high-level-appliance.svg +++ b/documentation/general/images/hld/dash-high-level-appliance.svg @@ -1,4 +1,4 @@ -
SONiC DASH on SDN Appliance w/6 DPU
SONiC DASH on SDN Appliance w/6 DPU

Presents as 1 Appliance
Presents as 1 Appliance
SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#1SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#2DZSONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#3SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#4SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#5SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#6


...
SDN Controller (Network Management as a Service (NMaaS))
SDN Controller (Network Management as a Service (NMaaS))
Text is not SVG - cannot display
\ No newline at end of file +
SONiC DASH on SDN Appliance w/6 DPU
SONiC DASH on SDN Appliance w/6 DPU

Presents as 1 Appliance
Presents as 1 Appliance
SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#1SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#2DZSONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#3SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#4SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#5SONiC or SONiC-DASHgNMI Container
gNMI
gNMI
DPU#6


...
SDN Controller (Network Management as a Service (NMaaS))
SDN Controller (Network Management as a Service (NMaaS))
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-high-level-design-schema.svg b/documentation/general/images/hld/dash-high-level-design-schema.svg index 460bbfa7b..49945e029 100644 --- a/documentation/general/images/hld/dash-high-level-design-schema.svg +++ b/documentation/general/images/hld/dash-high-level-design-schema.svg @@ -1,4 +1,4 @@ -
database container
database container
ASIC_DB
ASIC_DB
APP_DB
APP_DB
redis server
redis server
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk 
asic (vendor) sdk 
sonic-cfggen
sonic-cfggen
CLI
CLI
import/export
import/export
SDN Controller
SDN Controller
DASH API
DASH API
gNMI Client
gNMI Client
DASH/gNMI container
DASH/gNMI container
gNMI server
gNMI server
Config Backend
Config Backend
SWSS
SWSS
dashorch
dashorch
orchagent
orchagent
gRPC get/set call
gRPC get/set call
Example DASH_APP_DB Database Schema

DASH_MAPPING_TABLE:{{vnet}}:{{ip_address}} 

    "routing_type": {{routing_type}} 
    "underlay_ip":{{ip_address}}
    "mac_address":{{mac_address}} (OPTIONAL) 
    "metering_bucket": {{bucket_id}}(OPTIONAL)
key                      = DASH_ROUTE_TABLE:eni:ip_address ; ENI route table with CA IP
; field                  = value 
action_type              = routing_type              ; reference to routing type
underlay_ip              = ip_address                ; PA address for the CA
mac_address              = MAC address as string     ; Inner dst mac
metering_bucket          = bucket_id                 ; metering and counter
Example DASH_APP_DB Database Schema...
Standardized JSON format for DASH configuration. Can be used as declarative test-case data. Can be expressed as literal JSON content or generated programmatically on the fly for testing.
Standardized JSON format for DASH co...
SAI Objects
Transform APP objs to ASIC objs
Transform APP obj...
Transform gNMI YANG objects  to APP DB objects
Transform gNMI YA...
YANG Schema
YANG Sc...
Script or code-as-config data
Script or co...
transform & drive API
transform &...
DASH Config
DASH Config
Generate
Generate
gNMI
gNMI
SAI-redis
SAI-redis
SAI-thrift
SAI-thrift
Canonical test data can be transformed into any API to allow same test cases to be applied to every level in the stack.
Canonical test data can be tra...
import/export
import/...
Viewer does not support full SVG 1.1
\ No newline at end of file +
database container
database container
ASIC_DB
ASIC_DB
APP_DB
APP_DB
redis server
redis server
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk 
asic (vendor) sdk 
sonic-cfggen
sonic-cfggen
CLI
CLI
import/export
import/export
SDN Controller
SDN Controller
DASH API
DASH API
gNMI Client
gNMI Client
DASH/gNMI container
DASH/gNMI container
gNMI server
gNMI server
Config Backend
Config Backend
SWSS
SWSS
dashorch
dashorch
orchagent
orchagent
gRPC get/set call
gRPC get/set call
Example DASH_APP_DB Database Schema

DASH_MAPPING_TABLE:{{vnet}}:{{ip_address}} 

    "routing_type": {{routing_type}} 
    "underlay_ip":{{ip_address}}
    "mac_address":{{mac_address}} (OPTIONAL) 
    "metering_bucket": {{bucket_id}}(OPTIONAL)
key                      = DASH_ROUTE_TABLE:eni:ip_address ; ENI route table with CA IP
; field                  = value 
action_type              = routing_type              ; reference to routing type
underlay_ip              = ip_address                ; PA address for the CA
mac_address              = MAC address as string     ; Inner dst mac
metering_bucket          = bucket_id                 ; metering and counter
Example DASH_APP_DB Database Schema...
Standardized JSON format for DASH configuration. Can be used as declarative test-case data. Can be expressed as literal JSON content or generated programmatically on the fly for testing.
Standardized JSON format for DASH co...
SAI Objects
Transform APP objs to ASIC objs
Transform APP obj...
Transform gNMI YANG objects  to APP DB objects
Transform gNMI YA...
YANG Schema
YANG Sc...
Script or code-as-config data
Script or co...
transform & drive API
transform &...
DASH Config
DASH Config
Generate
Generate
gNMI
gNMI
SAI-redis
SAI-redis
SAI-thrift
SAI-thrift
Canonical test data can be transformed into any API to allow same test cases to be applied to every level in the stack.
Canonical test data can be tra...
import/export
import/...
Viewer does not support full SVG 1.1
diff --git a/documentation/general/images/hld/dash-high-level-design.svg b/documentation/general/images/hld/dash-high-level-design.svg index 966cd5381..cedbfcf49 100644 --- a/documentation/general/images/hld/dash-high-level-design.svg +++ b/documentation/general/images/hld/dash-high-level-design.svg @@ -1,4 +1,4 @@ -
database container
database container
redis server
redis server
Kernel Space
Kernel Space
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk 
asic (vendor) sdk 
sonic-cfggen
sonic-cfggen
CLI
CLI
Customizable
Customizable
User Space
User Space
SDN Controller
SDN Controller
DASH API
DASH API
gNMI Client
gNMI Client
DASH High Level 
Design
DASH High Level...
DASH/gNMI container
DASH/gNMI container
gNMI server
gNMI server
Config Backend
Config Backend
SWSS
SWSS
dashorch
dashorch
orchagent
orchagent
gRPC get/set call
gRPC get/set call
Viewer does not support full SVG 1.1
\ No newline at end of file +
database container
database container
redis server
redis server
Kernel Space
Kernel Space
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk 
asic (vendor) sdk 
sonic-cfggen
sonic-cfggen
CLI
CLI
Customizable
Customizable
User Space
User Space
SDN Controller
SDN Controller
DASH API
DASH API
gNMI Client
gNMI Client
DASH High Level 
Design
DASH High Level...
DASH/gNMI container
DASH/gNMI container
gNMI server
gNMI server
Config Backend
Config Backend
SWSS
SWSS
dashorch
dashorch
orchagent
orchagent
gRPC get/set call
gRPC get/set call
Viewer does not support full SVG 1.1
diff --git a/documentation/general/images/hld/dash-high-level-smart-switch.svg b/documentation/general/images/hld/dash-high-level-smart-switch.svg index 735c29da6..df5d6af07 100644 --- a/documentation/general/images/hld/dash-high-level-smart-switch.svg +++ b/documentation/general/images/hld/dash-high-level-smart-switch.svg @@ -1,4 +1,4 @@ -
database container
database container
redis server
redis server
syncd container
syncd container
syncd
syncd
sai api
sai api
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
gNMI ContainerSONiC on Smart Switch
Smart switch
Smart switch
DASH capable DPU#1
DASH capable DPU#1
DASH capable DPU#2
DASH capable DPU#2
DASH capable DPU#3
DASH capable DPU#3
DASH capable DPU#4
DASH capable DPU#4
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orhagent
orhagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd


...
SDN Controller (Network Management as a Service - NMaaS)
SDN Controller (Network Management as a Service - NMaaS)
Text is not SVG - cannot display
\ No newline at end of file +
database container
database container
redis server
redis server
syncd container
syncd container
syncd
syncd
sai api
sai api
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
gNMI ContainerSONiC on Smart Switch
Smart switch
Smart switch
DASH capable DPU#1
DASH capable DPU#1
DASH capable DPU#2
DASH capable DPU#2
DASH capable DPU#3
DASH capable DPU#3
DASH capable DPU#4
DASH capable DPU#4
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orhagent
orhagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd


...
SDN Controller (Network Management as a Service - NMaaS)
SDN Controller (Network Management as a Service - NMaaS)
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-hld-project-ecosystem.svg b/documentation/general/images/hld/dash-hld-project-ecosystem.svg index ddc4d680c..42fe0bb12 100644 --- a/documentation/general/images/hld/dash-hld-project-ecosystem.svg +++ b/documentation/general/images/hld/dash-hld-project-ecosystem.svg @@ -1,4 +1,4 @@ -
DASH
DASH
SONiC OS
SONiC OS
Cloud Deployment
Cloud Deployment
SDN
SDN
SONiC Integration Test Suite
SONiC Integration Te...

Programmable
Networking Devices
 
Programmable...
Scenarios
Scenarios
P4 
Behavioral
Model
P4...
DASH Services Conformance and
Performance
Test Suite
DASH Services Confor...
Text is not SVG - cannot display
\ No newline at end of file +
DASH
DASH
SONiC OS
SONiC OS
Cloud Deployment
Cloud Deployment
SDN
SDN
SONiC Integration Test Suite
SONiC Integration Te...

Programmable
Networking Devices
 
Programmable...
Scenarios
Scenarios
P4 
Behavioral
Model
P4...
DASH Services Conformance and
Performance
Test Suite
DASH Services Confor...
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-hld-software-stack.svg b/documentation/general/images/hld/dash-hld-software-stack.svg index 03bcb87d1..b67d2c74d 100644 --- a/documentation/general/images/hld/dash-hld-software-stack.svg +++ b/documentation/general/images/hld/dash-hld-software-stack.svg @@ -1,4 +1,4 @@ -
gNMI container
gNMI container
Switch State Service (SWSS)
Switch State Service (SWSS)
ASIC Drivers
ASIC Drivers
Switch Abstraction Interface (SAI) API DASH extension
Switch Abstraction Interface (SAI) API DASH extension
DASH capable ASICs
DASH capable ASICs
Redis
Redis
User Space
User Space
Kernel Space
Kernel Space
Hardware
Hardware
SDN Controller (NMaaS)
SDN Controller (NMaaS)
Management Space
Management Space
Technology provider ASIC SDK
Technology provider ASIC SDK
SONiC app containers
SONiC app containers
Text is not SVG - cannot display
\ No newline at end of file +
gNMI container
gNMI container
Switch State Service (SWSS)
Switch State Service (SWSS)
ASIC Drivers
ASIC Drivers
Switch Abstraction Interface (SAI) API DASH extension
Switch Abstraction Interface (SAI) API DASH extension
DASH capable ASICs
DASH capable ASICs
Redis
Redis
User Space
User Space
Kernel Space
Kernel Space
Hardware
Hardware
SDN Controller (NMaaS)
SDN Controller (NMaaS)
Management Space
Management Space
Technology provider ASIC SDK
Technology provider ASIC SDK
SONiC app containers
SONiC app containers
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-single-dpu-architecture.svg b/documentation/general/images/hld/dash-single-dpu-architecture.svg index dbdf9cc1c..c12bd046d 100644 --- a/documentation/general/images/hld/dash-single-dpu-architecture.svg +++ b/documentation/general/images/hld/dash-single-dpu-architecture.svg @@ -1,4 +1,4 @@ -
database container
database container
redis server
redis server
Kernel Space
Kernel Space
bgp container
bgp container
bgpd
bgpd
zebra
zebra
fpm-syncd
fpm-syncd
dhcp-relay container
dhcp-relay container
dhcp-relay
dhcp-relay
pmon container
pmon container
fan control 
fan control 
sensord
sensord
snmp container
snmp container
snmpd
snmpd
snmp-subagent
snmp-subagent
teamd container
teamd container
teamd
teamd
teamsyncd
teamsyncd
lldp container
lldp container
lldpd
lldpd
lldpmgrd
lldpmgrd
lldp-syncd
lldp-syncd
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orchagent
orchagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk 
asic (vendor) sdk 
sonic-cfggen
sonic-cfggen
CLI
CLI
asic drivers
asic drivers
network drivers
network drivers
platform drivers
platform drivers
transceivers
transceivers
DASH capable
single DPU
DASH capable...
fan/power/leds
fan/power/leds
Customizable
Customizable
User Space
User Space
Hardware
Hardware
gNMI container
gNMI container
DASH API
DASH API
telemetry container
telemetry container
telemetry
telemetry
This drawing is for the NIC form factor, single DPU
This drawing is for the NIC form factor,...
Text is not SVG - cannot display
\ No newline at end of file +
database container
database container
redis server
redis server
Kernel Space
Kernel Space
bgp container
bgp container
bgpd
bgpd
zebra
zebra
fpm-syncd
fpm-syncd
dhcp-relay container
dhcp-relay container
dhcp-relay
dhcp-relay
pmon container
pmon container
fan control 
fan control 
sensord
sensord
snmp container
snmp container
snmpd
snmpd
snmp-subagent
snmp-subagent
teamd container
teamd container
teamd
teamd
teamsyncd
teamsyncd
lldp container
lldp container
lldpd
lldpd
lldpmgrd
lldpmgrd
lldp-syncd
lldp-syncd
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orchagent
orchagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk 
asic (vendor) sdk 
sonic-cfggen
sonic-cfggen
CLI
CLI
asic drivers
asic drivers
network drivers
network drivers
platform drivers
platform drivers
transceivers
transceivers
DASH capable
single DPU
DASH capable...
fan/power/leds
fan/power/leds
Customizable
Customizable
User Space
User Space
Hardware
Hardware
gNMI container
gNMI container
DASH API
DASH API
telemetry container
telemetry container
telemetry
telemetry
This drawing is for the NIC form factor, single DPU
This drawing is for the NIC form factor,...
Text is not SVG - cannot display
diff --git a/documentation/general/images/hld/dash-smart-switch-architecture.svg b/documentation/general/images/hld/dash-smart-switch-architecture.svg index dfb31e127..21f73d6a8 100644 --- a/documentation/general/images/hld/dash-smart-switch-architecture.svg +++ b/documentation/general/images/hld/dash-smart-switch-architecture.svg @@ -1,4 +1,4 @@ -
database container
database container
redis server
redis server
Kernel Space
Kernel Space
bgp container
bgp container
bgpd
bgpd
zebra
zebra
fpm-syncd
fpm-syncd
dhcp-relay container
dhcp-relay container
dhcp-relay
dhcp-relay
pmon container
pmon container
fan control 
fan control 
sensord
sensord
snmp container
snmp container
snmpd
snmpd
snmp-subagent
snmp-subagent
teamd container
teamd container
teamd
teamd
teamsyncd
teamsyncd
lldp container
lldp container
lldpd
lldpd
lldpmgrd
lldpmgrd
lldp-syncd
lldp-syncd
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orchagent
orchagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
sonic-cfggen
sonic-cfggen
CLI
CLI
asic drivers
asic drivers
network drivers
network drivers
platform drivers
platform drivers
transceivers
transceivers
fan/power/leds
fan/power/leds
Customizable
Customizable
User Space
User Space
gNMI container
gNMI container
DASH API
DASH API
telemetry container
telemetry container
telemetry
telemetry
Hardware
Hardware


DASH capable asic(s)  - 4xSWSS
DASH capable asic(s)  - 4xSWSS
Switch asic - 1 x SWSS
Switch asic - 1 x SWSS
Smart switch
Smart switch
Smart Switch
Smart Switch
Text is not SVG - cannot display
\ No newline at end of file +
database container
database container
redis server
redis server
Kernel Space
Kernel Space
bgp container
bgp container
bgpd
bgpd
zebra
zebra
fpm-syncd
fpm-syncd
dhcp-relay container
dhcp-relay container
dhcp-relay
dhcp-relay
pmon container
pmon container
fan control 
fan control 
sensord
sensord
snmp container
snmp container
snmpd
snmpd
snmp-subagent
snmp-subagent
teamd container
teamd container
teamd
teamd
teamsyncd
teamsyncd
lldp container
lldp container
lldpd
lldpd
lldpmgrd
lldpmgrd
lldp-syncd
lldp-syncd
swss container
swss container
portsyncd
portsyncd
intfsyncd
intfsyncd
neighsyncd
neighsyncd
orchagent
orchagent
intfmgrd
intfmgrd
vlanmgrd
vlanmgrd
syncd container
syncd container
syncd
syncd
sai api DASH
sai api DASH
asic (vendor) sdk
asic (vendor) sdk
sonic-cfggen
sonic-cfggen
CLI
CLI
asic drivers
asic drivers
network drivers
network drivers
platform drivers
platform drivers
transceivers
transceivers
fan/power/leds
fan/power/leds
Customizable
Customizable
User Space
User Space
gNMI container
gNMI container
DASH API
DASH API
telemetry container
telemetry container
telemetry
telemetry
Hardware
Hardware


DASH capable asic(s)  - 4xSWSS
DASH capable asic(s)  - 4xSWSS
Switch asic - 1 x SWSS
Switch asic - 1 x SWSS
Smart switch
Smart switch
Smart Switch
Smart Switch
Text is not SVG - cannot display
diff --git a/documentation/general/images/packet-flow-in-flow-match.svg b/documentation/general/images/packet-flow-in-flow-match.svg index 7b7d13823..967050e57 100644 --- a/documentation/general/images/packet-flow-in-flow-match.svg +++ b/documentation/general/images/packet-flow-in-flow-match.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA Appliance:80
Dst:  PA Appliance...
Src:  PA1:57212
Src:  PA1:57212
VXLAN
VXLAN
1
1
Src VM CA 1 initiates connection to Dst VM CA 2
Src VM CA 1 initiates connection to Dst VM CA 2
Matched Route
Matched Route
Transform
Transform
Route Type
Route Type
2
2
SMAC1 -> DMAC_FAKE
SMAC1 -> DMAC_FAKE
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/IP stack of Windows/Linux.  Upon packet construction we construct the packet which needs a MAC address.  This will be overridden later.
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/...
3
3
Outer Evaluation
Outer Evaluation
Outer Evaluation
Outer Evaluation
4
4
SRC: Physical IP of host
DST:  Physical IP of SDN appliance
SRC: Physical IP of host...
SRC:  SDN Appliance IP
DST:  100.0.0.2 from CA to PA mapping table lookup
SRC:  SDN Appliance IP...
5
5
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
6
6
VNI Custom
VNI Custom
VNI:  10001
VNI:  10001
7
7
Inner MAC: 
Inner MAC: 
Inner MAC:
Inner MAC:
8
8
SRC:  SMAC1 DST - DMAC_FAKE
SRC:  SMAC1 DST - DMAC_FAKE
SRC-SMAC1   DST E4-A7-A0-99-0E-18
SRC-SMAC1   DST E4-A7-A0-99-0E-18
9
9
Inner IP:  10.0.0.1 -> 10.0.0.2
Inner IP:  10.0.0.1 -> 10.0.0.2
Route ID = 1
Route ID = 1
Inner IP:  10.00.1 -> 10.0.0.2
Inner IP:  10.00.1 -> 10.0.0.2
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA Appliance:80
Dst:  PA Appliance...
Src:  PA1:57212
Src:  PA1:57212
VXLAN
VXLAN
1
1
Src VM CA 1 initiates connection to Dst VM CA 2
Src VM CA 1 initiates connection to Dst VM CA 2
Matched Route
Matched Route
Transform
Transform
Route Type
Route Type
2
2
SMAC1 -> DMAC_FAKE
SMAC1 -> DMAC_FAKE
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/IP stack of Windows/Linux.  Upon packet construction we construct the packet which needs a MAC address.  This will be overridden later.
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/...
3
3
Outer Evaluation
Outer Evaluation
Outer Evaluation
Outer Evaluation
4
4
SRC: Physical IP of host
DST:  Physical IP of SDN appliance
SRC: Physical IP of host...
SRC:  SDN Appliance IP
DST:  100.0.0.2 from CA to PA mapping table lookup
SRC:  SDN Appliance IP...
5
5
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
6
6
VNI Custom
VNI Custom
VNI:  10001
VNI:  10001
7
7
Inner MAC: 
Inner MAC: 
Inner MAC:
Inner MAC:
8
8
SRC:  SMAC1 DST - DMAC_FAKE
SRC:  SMAC1 DST - DMAC_FAKE
SRC-SMAC1   DST E4-A7-A0-99-0E-18
SRC-SMAC1   DST E4-A7-A0-99-0E-18
9
9
Inner IP:  10.0.0.1 -> 10.0.0.2
Inner IP:  10.0.0.1 -> 10.0.0.2
Route ID = 1
Route ID = 1
Inner IP:  10.00.1 -> 10.0.0.2
Inner IP:  10.00.1 -> 10.0.0.2
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn-appliance.svg b/documentation/general/images/sdn-appliance.svg index 2e8b0921b..ec2091e91 100644 --- a/documentation/general/images/sdn-appliance.svg +++ b/documentation/general/images/sdn-appliance.svg @@ -1,4 +1,4 @@ -
Left Side:
VMs behind
Appliance 
Left Side:...
Right Side:
remote endpoints or
external clients
Right Side:...
Azure Host
Azure Host
SDN Appliance
SDN Appliance
DASH VM ENI - Flow table
DASH VM ENI - Flow table
DASH-VM- ENI-Outbound Rules
(ENI Match - Inner-SRC-MAC)
DASH-VM- ENI-Outbound Rules...
DASH -VM- ENI-Inbound-Rules
(ENI Match - Inner-DST-MAC)
DASH -VM- ENI-Inbound-Rules...
DASH-VM-ENI-Outbound Rules
(ENI Match - Inner-SRC-MAC)
DASH-VM-ENI-Outbound Rules...
DASH-VM-ENI-Inbound Rules
(ENI Match - Inner-DST-MAC)
DASH-VM-ENI-Inbound Rules...
DASH-VM-ENI-Inbound Rules
(ENI Match - Inner-DST-MAC)
DASH-VM-ENI-Inbound Rules...
DST
DST
DST
DST
Outbound VXLAN
Outbound VXLAN
Outbound
Outbound
Outbound VXLAN
Outbound VXLAN
Outbound 
Outbound 
Inbound VXLAN
Inbound VXLAN
Inbound 
Inbound 
Inbound VXLAN
Inbound VXLAN
Inbound 
Inbound 
DASH Optimized VMDASH Optimized VM
Text is not SVG - cannot display
\ No newline at end of file +
Left Side:
VMs behind
Appliance 
Left Side:...
Right Side:
remote endpoints or
external clients
Right Side:...
Azure Host
Azure Host
SDN Appliance
SDN Appliance
DASH VM ENI - Flow table
DASH VM ENI - Flow table
DASH-VM- ENI-Outbound Rules
(ENI Match - Inner-SRC-MAC)
DASH-VM- ENI-Outbound Rules...
DASH -VM- ENI-Inbound-Rules
(ENI Match - Inner-DST-MAC)
DASH -VM- ENI-Inbound-Rules...
DASH-VM-ENI-Outbound Rules
(ENI Match - Inner-SRC-MAC)
DASH-VM-ENI-Outbound Rules...
DASH-VM-ENI-Inbound Rules
(ENI Match - Inner-DST-MAC)
DASH-VM-ENI-Inbound Rules...
DASH-VM-ENI-Inbound Rules
(ENI Match - Inner-DST-MAC)
DASH-VM-ENI-Inbound Rules...
DST
DST
DST
DST
Outbound VXLAN
Outbound VXLAN
Outbound
Outbound
Outbound VXLAN
Outbound VXLAN
Outbound 
Outbound 
Inbound VXLAN
Inbound VXLAN
Inbound 
Inbound 
Inbound VXLAN
Inbound VXLAN
Inbound 
Inbound 
DASH Optimized VMDASH Optimized VM
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn-high-cps.svg b/documentation/general/images/sdn-high-cps.svg index 3b1b20bc7..aa03b5b64 100644 --- a/documentation/general/images/sdn-high-cps.svg +++ b/documentation/general/images/sdn-high-cps.svg @@ -1,4 +1,4 @@ -
Azure Host
Azure Host
CPS Optimized VM
CPS Optimized VM
SDN Agents
SDN Agents
VFP not in CPS path
VFP not in CPS path
FPGA
packets are tunneled to appliance as opposed to local VFP for CPS optimized VMs
FPGA...
SDN Appliance
SDN Appliance
SDN Appliance Pair in DC
exposing SONiC interface
SDN Appliance Pa...
Tunnel
Tunnel
Tunnel
Tunnel
DST VM / PE / MNAT / MDNAT
DST VM / PE / MNAT / MDNAT
Tunnel
Tunnel
Tunnel
Tunnel
Text is not SVG - cannot display
\ No newline at end of file +
Azure Host
Azure Host
CPS Optimized VM
CPS Optimized VM
SDN Agents
SDN Agents
VFP not in CPS path
VFP not in CPS path
FPGA
packets are tunneled to appliance as opposed to local VFP for CPS optimized VMs
FPGA...
SDN Appliance
SDN Appliance
SDN Appliance Pair in DC
exposing SONiC interface
SDN Appliance Pa...
Tunnel
Tunnel
Tunnel
Tunnel
DST VM / PE / MNAT / MDNAT
DST VM / PE / MNAT / MDNAT
Tunnel
Tunnel
Tunnel
Tunnel
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/eni-match-flow-direction.svg b/documentation/general/images/sdn/eni-match-flow-direction.svg index 4b7f3ba5d..719d306a2 100644 --- a/documentation/general/images/sdn/eni-match-flow-direction.svg +++ b/documentation/general/images/sdn/eni-match-flow-direction.svg @@ -1,4 +1,4 @@ -InboundInbound uses Inner DST MAC to select ENIENI match based on DEST MAC == ENI MACOutboundOutbound uses Inner SRC MAC to select ENIENI match based on SRC MAC == ENI MAC
Determine direction based on VNI
Determine direct...
Start
Start
Match?
Match?
Match?
Match?
Perform Inbound Fast Path
Perform Inbou...
Perform Inbound Slow Path
Perform Inbou...
Perform Outbound Slow Path
Perform Outbo...
Perform Outbound Fast Path
Perform Outbo...
Yes
Yes
Yes
Yes
No
No
No
No
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
\ No newline at end of file +InboundInbound uses Inner DST MAC to select ENIENI match based on DEST MAC == ENI MACOutboundOutbound uses Inner SRC MAC to select ENIENI match based on SRC MAC == ENI MAC
Determine direction based on VNI
Determine direct...
Start
Start
Match?
Match?
Match?
Match?
Perform Inbound Fast Path
Perform Inbou...
Perform Inbound Slow Path
Perform Inbou...
Perform Outbound Slow Path
Perform Outbo...
Perform Outbound Fast Path
Perform Outbo...
Yes
Yes
Yes
Yes
No
No
No
No
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/inbound-fast-path-flow.svg b/documentation/general/images/sdn/inbound-fast-path-flow.svg index 6452431ce..7c313c151 100644 --- a/documentation/general/images/sdn/inbound-fast-path-flow.svg +++ b/documentation/general/images/sdn/inbound-fast-path-flow.svg @@ -1,4 +1,4 @@ -Lookup Flow Table 5-tuple matchMatch found; direction based on SRC or DST MACCorresponding Match Action, do not enter rule processingFinal packet transpositionRefresh flow TTLConnection TableState machine metadataConditional DecapSLB decap if needed; Decap VNET GRE KeyDecap only if Outer PA matches w/mapping tableElse, drop and terminate pipeline
Perform Inbound Fast Path
Perform Inbou...
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
\ No newline at end of file +Lookup Flow Table 5-tuple matchMatch found; direction based on SRC or DST MACCorresponding Match Action, do not enter rule processingFinal packet transpositionRefresh flow TTLConnection TableState machine metadataConditional DecapSLB decap if needed; Decap VNET GRE KeyDecap only if Outer PA matches w/mapping tableElse, drop and terminate pipeline
Perform Inbound Fast Path
Perform Inbou...
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/inbound-slow-path-flow.svg b/documentation/general/images/sdn/inbound-slow-path-flow.svg index da52a4347..1cbad13bb 100644 --- a/documentation/general/images/sdn/inbound-slow-path-flow.svg +++ b/documentation/general/images/sdn/inbound-slow-path-flow.svg @@ -1,4 +1,4 @@ -
Perform Inbound Slow Path
Perform Inbou...
Conditional DecapSLB decap if needed; Decap VNET GRE KeyDecap only if Outer PA matches w/mapping tableElse, drop and terminate pipelineLookup Flow Table Match Not Found; ENI rule processing beginsDST MAC in the packet matches the ENI MACACL1SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Controlled by Azure/MSFT, contains default rulesBlock, Soft Block, Allow, DenyIf rule w/bit exit ACL pipeline on hit is matched, the ACL pipeline is abandonedACL2SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Customer ControlledACL3SRC,DST,SPort,DPort,Protocol,Action,Priority,Exit ACL pipeline on hit (Terminate)?Customer ControlledTranspose ActionRewrite MACsTranspose IPs / portsEncap/DecapInbound Route ProcessingLookup table is per ENI; could be GlobalEach route entry has prefix and separate action entryOuter encap IPv4 permits within-Region routingCould be multiple Global lookup tables per ENIsAcross Regions we use IPv6Create tthe FlowExample of Mapping and Routing Tables Mapping Table for a V-Port / ENI
Customer Address (CA)
Customer Ad...
Physical Address v4 (PA)
Physical Ad...
Physical Address v6 (PA)
Physical Ad...
MAC Address for D-MAC Rewrite
MAC Address for D-...
VNI to use
VNI to use
10.0.0.1
10.0.0.1
100.0.0.1
100.0.0.1
3ffe::1
3ffe::1
E4-A7-A0-99-0E-17
E4-A7-A0-99-0E-17
10001
10001
Example Route Table for a V-Port / ENI
Route
Route
Action
Action
Route Type (Choices)

* Encap_with_lookup_V4_underlay: Encap per mapping table.V4 underlay
* Encap_with_lookup_V6_underlay: Encap per mapping table.V6 underlay
* Encap_with_Provided_data (PA): Encap per proided data (Multiple PA can be provided)
* Outbound NAT(SNAT)_L3: execute on SRC IP w/provided data
* Outbound NAT (SNAT)_L4: execute on SRC IP, src port based on provided data
* Nul:block trafficl
* Private Link
Route Type (Choices)...
Route ID
Route ID
10.0.0.0/24,
...more prefixes
10.0.0.0/24,...
Encap: VXLAN

Action:
check mapping table for exact DST, VNI, ANd D-MAC rewrite info
Encap: VXLAN...
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
1
1
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
\ No newline at end of file +
Perform Inbound Slow Path
Perform Inbou...
Conditional DecapSLB decap if needed; Decap VNET GRE KeyDecap only if Outer PA matches w/mapping tableElse, drop and terminate pipelineLookup Flow Table Match Not Found; ENI rule processing beginsDST MAC in the packet matches the ENI MACACL1SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Controlled by Azure/MSFT, contains default rulesBlock, Soft Block, Allow, DenyIf rule w/bit exit ACL pipeline on hit is matched, the ACL pipeline is abandonedACL2SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Customer ControlledACL3SRC,DST,SPort,DPort,Protocol,Action,Priority,Exit ACL pipeline on hit (Terminate)?Customer ControlledTranspose ActionRewrite MACsTranspose IPs / portsEncap/DecapInbound Route ProcessingLookup table is per ENI; could be GlobalEach route entry has prefix and separate action entryOuter encap IPv4 permits within-Region routingCould be multiple Global lookup tables per ENIsAcross Regions we use IPv6Create tthe FlowExample of Mapping and Routing Tables Mapping Table for a V-Port / ENI
Customer Address (CA)
Customer Ad...
Physical Address v4 (PA)
Physical Ad...
Physical Address v6 (PA)
Physical Ad...
MAC Address for D-MAC Rewrite
MAC Address for D-...
VNI to use
VNI to use
10.0.0.1
10.0.0.1
100.0.0.1
100.0.0.1
3ffe::1
3ffe::1
E4-A7-A0-99-0E-17
E4-A7-A0-99-0E-17
10001
10001
Example Route Table for a V-Port / ENI
Route
Route
Action
Action
Route Type (Choices)

* Encap_with_lookup_V4_underlay: Encap per mapping table.V4 underlay
* Encap_with_lookup_V6_underlay: Encap per mapping table.V6 underlay
* Encap_with_Provided_data (PA): Encap per proided data (Multiple PA can be provided)
* Outbound NAT(SNAT)_L3: execute on SRC IP w/provided data
* Outbound NAT (SNAT)_L4: execute on SRC IP, src port based on provided data
* Nul:block trafficl
* Private Link
Route Type (Choices)...
Route ID
Route ID
10.0.0.0/24,
...more prefixes
10.0.0.0/24,...
Encap: VXLAN

Action:
check mapping table for exact DST, VNI, ANd D-MAC rewrite info
Encap: VXLAN...
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
1
1
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/outbound-fast-path-flow.svg b/documentation/general/images/sdn/outbound-fast-path-flow.svg index 227468d5c..3ccaaafc4 100644 --- a/documentation/general/images/sdn/outbound-fast-path-flow.svg +++ b/documentation/general/images/sdn/outbound-fast-path-flow.svg @@ -1,4 +1,4 @@ -Conditional Decap
SLB decap if needed; Decap VNET GRE Key
SLB decap if needed; Decap VNET GRE...
Decap only if Outer PA matches the PA configured for the ENI
Decap only if Outer PA matches the...
Else, drop and terminate pipeline
Else, drop and terminate pipeline
Lookup Flow Table 
Match found; direction based on SRC or DST MAC
Match found; direction based on SRC...
Corresponding Match Action, do not enter rule processing
Corresponding Match Action, do not...
Refresh Flow TTL
Refresh Flow TTL
Perform Outbound Fast Path
Perform Outbo...
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
\ No newline at end of file +Conditional Decap
SLB decap if needed; Decap VNET GRE Key
SLB decap if needed; Decap VNET GRE...
Decap only if Outer PA matches the PA configured for the ENI
Decap only if Outer PA matches the...
Else, drop and terminate pipeline
Else, drop and terminate pipeline
Lookup Flow Table 
Match found; direction based on SRC or DST MAC
Match found; direction based on SRC...
Corresponding Match Action, do not enter rule processing
Corresponding Match Action, do not...
Refresh Flow TTL
Refresh Flow TTL
Perform Outbound Fast Path
Perform Outbo...
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/outbound-slow-path-flow.svg b/documentation/general/images/sdn/outbound-slow-path-flow.svg index 7f519a8b1..e54573e45 100644 --- a/documentation/general/images/sdn/outbound-slow-path-flow.svg +++ b/documentation/general/images/sdn/outbound-slow-path-flow.svg @@ -1,4 +1,4 @@ -Conditional DecapSLB decap if needed; Decap VNET GRE KeyDecap only if Outer PA matches thePA configured for the ENIElse, drop and terminate pipelineLookup Flow Table Match Not Found; ENI rule processing beginsPossible to insert corresponding inbound flowACL1SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Controlled by Azure/MSFT, contains default rulesBlock, Soft Block, Allow, DenyIf rule w/bit exit ACL pipeline on hit is matched, the ACL pipeline is abandonedACL2SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Customer ControlledACL3SRC,DST,SPort,DPort,Protocol,Action,Priority,Exit ACL pipeline on hit (Terminate)?Customer ControlledTranspose ActionRewrite MACsTranspose IPs / portsEncap/DecapInbound Route ProcessingSet DSCP bit value to XProcess relevant routeEach route entry has prefix and separate actionentryCreate tthe FlowExample of Mapping and Routing Tables Mapping Table for a V-Port / ENI
Customer Address (CA)
Customer Ad...
Physical Address v4 (PA)
Physical Ad...
Physical Address v6 (PA)
Physical Ad...
MAC Address for D-MAC Rewrite
MAC Address for D-...
VNI to use
VNI to use
10.0.0.1
10.0.0.1
100.0.0.1
100.0.0.1
3ffe::1
3ffe::1
E4-A7-A0-99-0E-17
E4-A7-A0-99-0E-17
10001
10001
Example Route Table for a V-Port / ENI
Route
Route
Action
Action
Route Type (Choices)

* Encap_with_lookup_V4_underlay: Encap per mapping table.V4 underlay
* Encap_with_lookup_V6_underlay: Encap per mapping table.V6 underlay
* Encap_with_Provided_data (PA): Encap per proided data (Multiple PA can be provided)
* Outbound NAT(SNAT)_L3: execute on SRC IP w/provided data
* Outbound NAT (SNAT)_L4: execute on SRC IP, src port based on provided data
* Nul:block trafficl
* Private Link
Route Type (Choices)...
Route ID
Route ID
10.0.0.0/24,
...more prefixes
10.0.0.0/24,...
Encap: VXLAN

Action:
check mapping table for exact DST, VNI, ANd D-MAC rewrite info
Encap: VXLAN...
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
1
1
Perform Outbound Slow Path
Perform Outbo...
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
\ No newline at end of file +Conditional DecapSLB decap if needed; Decap VNET GRE KeyDecap only if Outer PA matches thePA configured for the ENIElse, drop and terminate pipelineLookup Flow Table Match Not Found; ENI rule processing beginsPossible to insert corresponding inbound flowACL1SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Controlled by Azure/MSFT, contains default rulesBlock, Soft Block, Allow, DenyIf rule w/bit exit ACL pipeline on hit is matched, the ACL pipeline is abandonedACL2SRC,DST,SPort,DPort,Protocol,Action,Priority, Exit ACL pipeline on hit (Terminate)?Customer ControlledACL3SRC,DST,SPort,DPort,Protocol,Action,Priority,Exit ACL pipeline on hit (Terminate)?Customer ControlledTranspose ActionRewrite MACsTranspose IPs / portsEncap/DecapInbound Route ProcessingSet DSCP bit value to XProcess relevant routeEach route entry has prefix and separate actionentryCreate tthe FlowExample of Mapping and Routing Tables Mapping Table for a V-Port / ENI
Customer Address (CA)
Customer Ad...
Physical Address v4 (PA)
Physical Ad...
Physical Address v6 (PA)
Physical Ad...
MAC Address for D-MAC Rewrite
MAC Address for D-...
VNI to use
VNI to use
10.0.0.1
10.0.0.1
100.0.0.1
100.0.0.1
3ffe::1
3ffe::1
E4-A7-A0-99-0E-17
E4-A7-A0-99-0E-17
10001
10001
Example Route Table for a V-Port / ENI
Route
Route
Action
Action
Route Type (Choices)

* Encap_with_lookup_V4_underlay: Encap per mapping table.V4 underlay
* Encap_with_lookup_V6_underlay: Encap per mapping table.V6 underlay
* Encap_with_Provided_data (PA): Encap per proided data (Multiple PA can be provided)
* Outbound NAT(SNAT)_L3: execute on SRC IP w/provided data
* Outbound NAT (SNAT)_L4: execute on SRC IP, src port based on provided data
* Nul:block trafficl
* Private Link
Route Type (Choices)...
Route ID
Route ID
10.0.0.0/24,
...more prefixes
10.0.0.0/24,...
Encap: VXLAN

Action:
check mapping table for exact DST, VNI, ANd D-MAC rewrite info
Encap: VXLAN...
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
1
1
Perform Outbound Slow Path
Perform Outbo...
Performed on the appliance
Performed on the appliance
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-inbound-from-lb.svg b/documentation/general/images/sdn/sdn-packet-transforms-inbound-from-lb.svg index ddb025d5b..3dd986fac 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-inbound-from-lb.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-inbound-from-lb.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
4
4
3
3
2
2
8
8
7
7
6
6
VFP
VFP
Host
Host
Loadbalanced public IP
inbound mapping
through SLB

Loadbalanced public IP...
Mux
Mux
Encapsulation
Encapsulation
TCP
TCP
Dst: Cust IP:xx
Dst: Cust IP:xx
Src: VIP 1:80
Src: VIP 1:80
Dst: Client with Cust IP
Dst: Client with Cust IP
9
9
TCP
TCP
Dst: Cust IP:xx
Dst: Cust IP:xx
Src HLIP 1:8080
Src HLIP 1:8080
TCP
TCP
Src CA1:8080
Src CA1:8080
Dst: Cust IP:xx
Dst: Cust IP:xx
Source endpoint could be external
or in Azure behind another load
balancer. 
Details ignored here.

Source endpoint could be ext...
The MUX matches the inbound VIP and port
range to a load balancing rule. It then hashes
(src ip, src port, dst ip, dst port and protocol) to select a DIP from the active dip pool. Finally, the mux encapsulates the packet to the destination host using NVGRE with destination VM MAC as inner MAC and destination Host PA as outer IP.

The MUX matches the inbound VIP and port...
SLB NAT uses HLIP
as destination

SLB NAT uses HLIP...
VFP decaps the packet and 
rewrites the destination VIP
to the CA and destintion
port to DIP port (unless DSR is
configured)

VFP decaps the packet and...
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
47 (GRE)
47 (GRE)
Src: Mux PA
Src: Mux PA
Dst: Host PA
Dst: Host PA
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: Source MAC
Src: Source MAC
1
1
5
5
Dst: CA1:8080
Dst: CA1:8080
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
47 (GRE)
47 (GRE)
Src: Mux PA
Src: Mux PA
Dst: Host PA
Dst: Host PA
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: Source MAC
Src: Source MAC
TCP
TCP
Dst: VIP1:80
Dst: VIP1:80
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: VIP1:80
Dst: VIP1:80
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: HLIP 1:8080
Dst: HLIP 1:8080
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: Cust IP:xx
Dst: Cust IP:xx
Src: VIP 1:80
Src: VIP 1:80
NIC MAC1/HLIP1
NIC MAC1/HLIP1
VFP rewrites te return packet src to the vip and sends the packet back to client
VFP rewrites te retu...
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
4
4
3
3
2
2
8
8
7
7
6
6
VFP
VFP
Host
Host
Loadbalanced public IP
inbound mapping
through SLB

Loadbalanced public IP...
Mux
Mux
Encapsulation
Encapsulation
TCP
TCP
Dst: Cust IP:xx
Dst: Cust IP:xx
Src: VIP 1:80
Src: VIP 1:80
Dst: Client with Cust IP
Dst: Client with Cust IP
9
9
TCP
TCP
Dst: Cust IP:xx
Dst: Cust IP:xx
Src HLIP 1:8080
Src HLIP 1:8080
TCP
TCP
Src CA1:8080
Src CA1:8080
Dst: Cust IP:xx
Dst: Cust IP:xx
Source endpoint could be external
or in Azure behind another load
balancer. 
Details ignored here.

Source endpoint could be ext...
The MUX matches the inbound VIP and port
range to a load balancing rule. It then hashes
(src ip, src port, dst ip, dst port and protocol) to select a DIP from the active dip pool. Finally, the mux encapsulates the packet to the destination host using NVGRE with destination VM MAC as inner MAC and destination Host PA as outer IP.

The MUX matches the inbound VIP and port...
SLB NAT uses HLIP
as destination

SLB NAT uses HLIP...
VFP decaps the packet and 
rewrites the destination VIP
to the CA and destintion
port to DIP port (unless DSR is
configured)

VFP decaps the packet and...
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
47 (GRE)
47 (GRE)
Src: Mux PA
Src: Mux PA
Dst: Host PA
Dst: Host PA
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: Source MAC
Src: Source MAC
1
1
5
5
Dst: CA1:8080
Dst: CA1:8080
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
47 (GRE)
47 (GRE)
Src: Mux PA
Src: Mux PA
Dst: Host PA
Dst: Host PA
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: Source MAC
Src: Source MAC
TCP
TCP
Dst: VIP1:80
Dst: VIP1:80
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: VIP1:80
Dst: VIP1:80
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: HLIP 1:8080
Dst: HLIP 1:8080
Src: Cust IP:xx
Src: Cust IP:xx
TCP
TCP
Dst: Cust IP:xx
Dst: Cust IP:xx
Src: VIP 1:80
Src: VIP 1:80
NIC MAC1/HLIP1
NIC MAC1/HLIP1
VFP rewrites te return packet src to the vip and sends the packet back to client
VFP rewrites te retu...
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-outbound-nat-l4.svg b/documentation/general/images/sdn/sdn-packet-transforms-outbound-nat-l4.svg index e2a867865..38206dde9 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-outbound-nat-l4.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-outbound-nat-l4.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
7
7
8
8
9
9
VFP
VFP
Host
Host
Outbound SNAT
through
a public  loadbalanced IP

Outbound SNAT...
Mux
Mux
Encapsulation
Encapsulation
Dst: PA1
Dst: PA1
Src: Mux PA
Src: Mux PA
IPinIP/NVGRE 
IPinIP/NVGRE 
TCP
TCP
Dst  VIP1:12345
Dst  VIP1:12345
Src Cust IP:80
Src Cust IP:80
Dst: PA1
Dst: PA1
Src: Mux PA
Src: Mux PA
IPinIP/NVGRE 
IPinIP/NVGRE 
TCP
TCP
Dst  VIP1:12345
Dst  VIP1:12345
Src Cust IP:80
Src Cust IP:80
Dst: Client with Cust IP
Dst: Client with Cust IP
5
5
6
6
TCP
TCP
Dst  VIP1:12345
Dst  VIP1:12345
Src Cust IP:80
Src Cust IP:80
TCP
TCP
Dst  PA1:57212
Dst  PA1:57212
Src Cust IP:80
Src Cust IP:80
TCP
TCP
Src Cust IP:80
Src Cust IP:80
Dst  CA1:57212
Dst  CA1:57212
Dst: CustIP:80
Dst: CustIP:80
Src: VIP:12345
Src: VIP:12345
TCP
TCP
Dst: CustIP:80
Dst: CustIP:80
Src: VIP:12345
Src: VIP:12345
TCP
TCP
TCP
TCP
Dst: CustIP:80
Dst: CustIP:80
Src: PA1:57212
Src: PA1:57212
TCP
TCP
Dst: CustIP:80
Dst: CustIP:80
Src: CA1:57212
Src: CA1:57212
Destination endpoint could be external or in Azure behind another load balancer. Details ignored here.
Destination endpoint could b...
The MUX matches the inbound VIP and port range to a DIP and then encapsulates the packet to the destination host using either IPinIP or NVGRE
The MUX matches the inbound...
VFP allocates a SNAT port from a local NatPool, rewrites the packet src to the VIP and then sends the packet to the destination
VFP allocates a SNAT port fr...
VFP decaps the packet, then matches the SNAT fow. Based on the flow, it rewrites the destination VIP to the CA and destination port to the Dip port.
VFP decaps the packet, then...
Src: VM1
Src: VM1
Src: Mux1
Src: Mux1
Dest: Mux2
Dest: Mux2
Dest: VM2
Dest: VM2
1-4
1-4
Overview
Overview
6-9
6-9
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
7
7
8
8
9
9
VFP
VFP
Host
Host
Outbound SNAT
through
a public  loadbalanced IP

Outbound SNAT...
Mux
Mux
Encapsulation
Encapsulation
Dst: PA1
Dst: PA1
Src: Mux PA
Src: Mux PA
IPinIP/NVGRE 
IPinIP/NVGRE 
TCP
TCP
Dst  VIP1:12345
Dst  VIP1:12345
Src Cust IP:80
Src Cust IP:80
Dst: PA1
Dst: PA1
Src: Mux PA
Src: Mux PA
IPinIP/NVGRE 
IPinIP/NVGRE 
TCP
TCP
Dst  VIP1:12345
Dst  VIP1:12345
Src Cust IP:80
Src Cust IP:80
Dst: Client with Cust IP
Dst: Client with Cust IP
5
5
6
6
TCP
TCP
Dst  VIP1:12345
Dst  VIP1:12345
Src Cust IP:80
Src Cust IP:80
TCP
TCP
Dst  PA1:57212
Dst  PA1:57212
Src Cust IP:80
Src Cust IP:80
TCP
TCP
Src Cust IP:80
Src Cust IP:80
Dst  CA1:57212
Dst  CA1:57212
Dst: CustIP:80
Dst: CustIP:80
Src: VIP:12345
Src: VIP:12345
TCP
TCP
Dst: CustIP:80
Dst: CustIP:80
Src: VIP:12345
Src: VIP:12345
TCP
TCP
TCP
TCP
Dst: CustIP:80
Dst: CustIP:80
Src: PA1:57212
Src: PA1:57212
TCP
TCP
Dst: CustIP:80
Dst: CustIP:80
Src: CA1:57212
Src: CA1:57212
Destination endpoint could be external or in Azure behind another load balancer. Details ignored here.
Destination endpoint could b...
The MUX matches the inbound VIP and port range to a DIP and then encapsulates the packet to the destination host using either IPinIP or NVGRE
The MUX matches the inbound...
VFP allocates a SNAT port from a local NatPool, rewrites the packet src to the VIP and then sends the packet to the destination
VFP allocates a SNAT port fr...
VFP decaps the packet, then matches the SNAT fow. Based on the flow, it rewrites the destination VIP to the CA and destination port to the Dip port.
VFP decaps the packet, then...
Src: VM1
Src: VM1
Src: Mux1
Src: Mux1
Dest: Mux2
Dest: Mux2
Dest: VM2
Dest: VM2
1-4
1-4
Overview
Overview
6-9
6-9
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-private-link-service.svg b/documentation/general/images/sdn/sdn-packet-transforms-private-link-service.svg index 41cceef29..6b31bbcb8 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-private-link-service.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-private-link-service.svg @@ -1,4 +1,4 @@ -
Private Link
Service

Private Link...
SLB NAT Layer
SLB NAT Layer
4
4
3
3
11
11
12
12
VFP
VFP
Host
Host
1
1
Dst: VM CA2
Dst: VM CA2
VFP_DEFAULT_TRANSPOSITION_
LAYER_STATELESS
VFP_DEFAULT_TRANSPOSITION_...
VNET_VFP_PRIVATE_IP_
NAT_STATEFUL
VNET_VFP_PRIVATE_IP_...
VNET Layer
VNET Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
5
5
2
2
10
10
9
9
8
8
SLB_VNAT Layer
SLB_VNAT Layer
7
7
6
6
TCP
TCP
Dst:  CA2:BE_Port
Dst:  CA2:BE_Port
Src: CA:NAT PORT
Src: CA:NAT PORT
TCP
TCP
Src: NAT_CA:NAT PORT
Src: NAT_CA:NAT PORT
Dst:  ILB_CA/VIP:80
Dst:  ILB_CA/VIP:80
TCP
TCP
Src: NAT_CA:NAT PORT
Src: NAT_CA:NAT PORT
Dst: PE_PA/PE_VIP:80
Dst: PE_PA/PE_VIP:80
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
Src: ST GW VIP
Src: ST GW VIP
Dst: PE_VIP
Dst: PE_VIP
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
Src: ST GW VIP
Src: ST GW VIP
Dst: PE_VIP
Dst: PE_VIP
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
TCP
TCP
Dst:  CA2:BE_Port
Dst:  CA2:BE_Port
Src: NAT_CA:NAT PORT
Src: NAT_CA:NAT PORT
TCP
TCP
Src:  ILB_CA:80
Src:  ILB_CA:80
Dst:  NAT_CA:NAT_PORT
Dst:  NAT_CA:NAT_PORT
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
TCP
TCP
Dst:  CA:NAT Port
Dst:  CA:NAT Port
Src: CA2:BE PORT
Src: CA2:BE PORT
TCP
TCP
Src:  ILB_CA:80
Src:  ILB_CA:80
Dst:  NAT_CA:NAT_PORT
Dst:  NAT_CA:NAT_PORT
NVGRE (100) 
NVGRE (100) 
Src: PE_VIP
Src: PE_VIP
Dst: ST GW VIP
Dst: ST GW VIP
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
NVGRE (100) 
NVGRE (100) 
Src: PE_VIP
Src: PE_VIP
Dst: ST GW VIP
Dst: ST GW VIP
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Since decap  was stateful the 
addresses are restored here

Since decap  was stateful th...
VNET layer does an 
unconditional statefull decap

VNET layer does an...
Source NAT happens here which 
modifies : Source IP, Source Port
and Dest IP. This is also a 6 to 4
NAT. Here we use the NAT CA to convert source address

Source NAT happens here which...
SLB VNAT layer will now do
the DNAT here into the 
VNET CA

SLB VNAT layer will now do...
Text is not SVG - cannot display
\ No newline at end of file +
Private Link
Service

Private Link...
SLB NAT Layer
SLB NAT Layer
4
4
3
3
11
11
12
12
VFP
VFP
Host
Host
1
1
Dst: VM CA2
Dst: VM CA2
VFP_DEFAULT_TRANSPOSITION_
LAYER_STATELESS
VFP_DEFAULT_TRANSPOSITION_...
VNET_VFP_PRIVATE_IP_
NAT_STATEFUL
VNET_VFP_PRIVATE_IP_...
VNET Layer
VNET Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
5
5
2
2
10
10
9
9
8
8
SLB_VNAT Layer
SLB_VNAT Layer
7
7
6
6
TCP
TCP
Dst:  CA2:BE_Port
Dst:  CA2:BE_Port
Src: CA:NAT PORT
Src: CA:NAT PORT
TCP
TCP
Src: NAT_CA:NAT PORT
Src: NAT_CA:NAT PORT
Dst:  ILB_CA/VIP:80
Dst:  ILB_CA/VIP:80
TCP
TCP
Src: NAT_CA:NAT PORT
Src: NAT_CA:NAT PORT
Dst: PE_PA/PE_VIP:80
Dst: PE_PA/PE_VIP:80
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
Src: ST GW VIP
Src: ST GW VIP
Dst: PE_VIP
Dst: PE_VIP
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
Src: ST GW VIP
Src: ST GW VIP
Dst: PE_VIP
Dst: PE_VIP
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
TCP
TCP
Dst:  CA2:BE_Port
Dst:  CA2:BE_Port
Src: NAT_CA:NAT PORT
Src: NAT_CA:NAT PORT
TCP
TCP
Src:  ILB_CA:80
Src:  ILB_CA:80
Dst:  NAT_CA:NAT_PORT
Dst:  NAT_CA:NAT_PORT
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
TCP
TCP
Dst:  CA:NAT Port
Dst:  CA:NAT Port
Src: CA2:BE PORT
Src: CA2:BE PORT
TCP
TCP
Src:  ILB_CA:80
Src:  ILB_CA:80
Dst:  NAT_CA:NAT_PORT
Dst:  NAT_CA:NAT_PORT
NVGRE (100) 
NVGRE (100) 
Src: PE_VIP
Src: PE_VIP
Dst: ST GW VIP
Dst: ST GW VIP
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
NVGRE (100) 
NVGRE (100) 
Src: PE_VIP
Src: PE_VIP
Dst: ST GW VIP
Dst: ST GW VIP
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Since decap  was stateful the 
addresses are restored here

Since decap  was stateful th...
VNET layer does an 
unconditional statefull decap

VNET layer does an...
Source NAT happens here which 
modifies : Source IP, Source Port
and Dest IP. This is also a 6 to 4
NAT. Here we use the NAT CA to convert source address

Source NAT happens here which...
SLB VNAT layer will now do
the DNAT here into the 
VNET CA

SLB VNAT layer will now do...
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-private-link.svg b/documentation/general/images/sdn/sdn-packet-transforms-private-link.svg index 0be26cce1..9f6bbce98 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-private-link.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-private-link.svg @@ -1,4 +1,4 @@ -
SLB NAT Layer
SLB NAT Layer
2
2
3
3
7
7
6
6
VFP
VFP
Host
Host
5
5
Src: VM CA1
Src: VM CA1
VFP_DEFAULT_TRANSPOSITION_
LAYER_STATELESS
VFP_DEFAULT_TRANSPOSITION_...
VNET_VFP_PRIVATE_IP_
NAT_STATEFUL
VNET_VFP_PRIVATE_IP_...
VNET Layer
VNET Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
4
4
8
8
9
9
10
10
TCP
TCP
Dst: PE:80
Dst: PE:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE:80
Dst: 2603:10E1:100:2::PE:80
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
PA/HLIP
PA/HLIP
PE_VIP
PE_VIP
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
ST GW VIP
ST GW VIP
PE_VIP
PE_VIP
TCP
TCP
Src: PE:80
Src: PE:80
Dst: CA1:57212
Dst: CA1:57212
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
TCP
TCP
Src: 2603:10E1:100:2::PE:80
Src: 2603:10E1:100:2::PE:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
NVGRE (100) 
NVGRE (100) 
PE_VIP
PE_VIP
PA/HLIP
PA/HLIP
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
NVGRE (100) 
NVGRE (100) 
PE_VIP
PE_VIP
ST GW VIP
ST GW VIP
Lookup happens in VNET_VFP_PRIVATEIP_VSDEST_
MAP_SPACE.
We convert PECA to PEPA/VIP here. 

Lookup happens in VNET_VFP_P...
Private Link
Private Link
Text is not SVG - cannot display
\ No newline at end of file +
SLB NAT Layer
SLB NAT Layer
2
2
3
3
7
7
6
6
VFP
VFP
Host
Host
5
5
Src: VM CA1
Src: VM CA1
VFP_DEFAULT_TRANSPOSITION_
LAYER_STATELESS
VFP_DEFAULT_TRANSPOSITION_...
VNET_VFP_PRIVATE_IP_
NAT_STATEFUL
VNET_VFP_PRIVATE_IP_...
VNET Layer
VNET Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
4
4
8
8
9
9
10
10
TCP
TCP
Dst: PE:80
Dst: PE:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE:80
Dst: 2603:10E1:100:2::PE:80
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
PA/HLIP
PA/HLIP
PE_VIP
PE_VIP
TCP
TCP
Src: FD40:C00:31:4A4F:6b31:100:::57212
Src: FD40:C00:31:4A4F:6b31:100:::57212
Dst: 2603:10E1:100:2::PE_VIP:80
Dst: 2603:10E1:100:2::PE_VIP:80
NVGRE (100) 
NVGRE (100) 
ST GW VIP
ST GW VIP
PE_VIP
PE_VIP
TCP
TCP
Src: PE:80
Src: PE:80
Dst: CA1:57212
Dst: CA1:57212
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
TCP
TCP
Src: 2603:10E1:100:2::PE:80
Src: 2603:10E1:100:2::PE:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
NVGRE (100) 
NVGRE (100) 
PE_VIP
PE_VIP
PA/HLIP
PA/HLIP
TCP
TCP
Src: 2603:10E1:100:2::PE_VIP:80
Src: 2603:10E1:100:2::PE_VIP:80
Dst: FD40:C00:31:4A4F:6b31:100:::57212
Dst: FD40:C00:31:4A4F:6b31:100:::57212
NVGRE (100) 
NVGRE (100) 
PE_VIP
PE_VIP
ST GW VIP
ST GW VIP
Lookup happens in VNET_VFP_PRIVATEIP_VSDEST_
MAP_SPACE.
We convert PECA to PEPA/VIP here. 

Lookup happens in VNET_VFP_P...
Private Link
Private Link
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-service-tunneling.svg b/documentation/general/images/sdn/sdn-packet-transforms-service-tunneling.svg index 76cd4c1f4..3ca4a1a30 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-service-tunneling.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-service-tunneling.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
3
3
4
4
5
5
17
17
18
18
19
19
VFP
VFP
Host
Host
VFP Transportation Layer
VFP Transportation Layer
1
1
2
2
20
20
Src: VM CA2
Src: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
13
13
14
14
7
7
8
8
9
9
VFP
VFP
Host
Host
 SLB VNAT Layer
 SLB VNAT Layer
11
11
12
12
10
10
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
6
6
15
15
16
16
VM - Service Tunnel  destination 
SDL or Cross region storage
that needs SNAT
VM - Service Tunnel  destination...
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPV6 CA1:572
Dst  ST IPV6 CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Dst: STGW IPV4 VIP
Dst: STGW IPV4 VIP
Src: SQL VIP:80
Src: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: VM MAC2
Src: VM MAC2
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPV6 CA1:572
Dst  ST IPV6 CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Dst: STGW IPV4 VIP
Dst: STGW IPV4 VIP
Src: SQL VIP:80
Src: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: VM MAC2
Src: VM MAC2
Dst: VM PA1:80
Dst: VM PA1:80
Src: Mux: PA
Src: Mux: PA
IPinIP/NVGRE
IPinIP/NVGRE
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPV6 CA1:572
Dst  ST IPV6 CA1:572
TCP
TCP
Src: SQL VIP:80
Src: SQL VIP:80
Dst  CA1:572
Dst  CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Src: ST GW IPV4 VIP
Src: ST GW IPV4 VIP
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Src: VM PA1
Src: VM PA1
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: SQL VIP:80
Dst: SQL VIP:80
Src  CA1:572
Src  CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Src: ST GW IPV4 VIP
Src: ST GW IPV4 VIP
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: SQL PA2:80
Dst: SQL PA2:80
Src: Mux: PA
Src: Mux: PA
IPinIP/NVGRE
IPinIP/NVGRE
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Src: ST GW IPV4 VIP
Src: ST GW IPV4 VIP
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: ST IPv6 VIP:2200
Dst: ST IPv6 VIP:2200
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
DSt: ST GW IPV4 VIP
DSt: ST GW IPV4 VIP
Src: SQL VIP:80
Src: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: VM MAC2
Src: VM MAC2
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPv6 CA1:572
Dst  ST IPv6 CA1:572
TCP
TCP
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPv6 CA1:572
Dst  ST IPv6 CA1:572
TCP
TCP
Src: ST IPv6 CA2:2200
Src: ST IPv6 CA2:2200
Dst  ST IPv6 CA1:572
Dst  ST IPv6 CA1:572
TCP
TCP
For destination ST Gateway IPv4 VIP, Mux uses the inner ST IPv6 CA1 (STv1) or the inner MAC (STv2) to idenify the PA1. Then encap with IPinIP/NVGRE
For destination ST Gateway IPv4...
The Mux matches the inbound VIP and port to a load  balancing rule. It then hashes (src IP, src port, dst IP, dst port and protocol) to select a DIP from the active sip pool. Finally the Mux encapsulates the packet to the destination host using eitehr IPinIP or NVGRE
The Mux matches the inbound VIP an...
SLB NAT Layer SNAT SQL and cross region storage with ST GateWay IPv4 VIP. No SNAT port allocation needed as Mux uses eitehr inner MAC (ST2) or CA in inner IPv6 (ST1) for return traffic
SLB NAT Layer SNAT SQL and cros...
VNET layer NVGRE encap with GRE key 100 and source IPv4 PA, destination IPv4 VIP
VNET layer NVGRE encap with GRE...
VFP transposition layer performs IPv4 to IPv6 NAT for ST-enabled destination. Source IPv6 conatins VNet ID, Subnet ID, source CA. Destination IPv6 contains dst ST prefix + dst VIP
VFP transposition layer perform...
VNET layer descap the  GRE outer  IPv4, the flow will preserve the origianl src/dedt VIP from the outer header to match returnpacket
VNET layer descap the  GRE oute...
VNAT layer NAT dst from ST IPv6 VIP to ST IPv6 CA2
VNAT layer NAT dst from ST IPv6...
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
3
3
4
4
5
5
17
17
18
18
19
19
VFP
VFP
Host
Host
VFP Transportation Layer
VFP Transportation Layer
1
1
2
2
20
20
Src: VM CA2
Src: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
13
13
14
14
7
7
8
8
9
9
VFP
VFP
Host
Host
 SLB VNAT Layer
 SLB VNAT Layer
11
11
12
12
10
10
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
6
6
15
15
16
16
VM - Service Tunnel  destination 
SDL or Cross region storage
that needs SNAT
VM - Service Tunnel  destination...
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPV6 CA1:572
Dst  ST IPV6 CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Dst: STGW IPV4 VIP
Dst: STGW IPV4 VIP
Src: SQL VIP:80
Src: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: VM MAC2
Src: VM MAC2
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPV6 CA1:572
Dst  ST IPV6 CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Dst: STGW IPV4 VIP
Dst: STGW IPV4 VIP
Src: SQL VIP:80
Src: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: VM MAC2
Src: VM MAC2
Dst: VM PA1:80
Dst: VM PA1:80
Src: Mux: PA
Src: Mux: PA
IPinIP/NVGRE
IPinIP/NVGRE
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPV6 CA1:572
Dst  ST IPV6 CA1:572
TCP
TCP
Src: SQL VIP:80
Src: SQL VIP:80
Dst  CA1:572
Dst  CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Src: ST GW IPV4 VIP
Src: ST GW IPV4 VIP
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Src: VM PA1
Src: VM PA1
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: SQL VIP:80
Dst: SQL VIP:80
Src  CA1:572
Src  CA1:572
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Src: ST GW IPV4 VIP
Src: ST GW IPV4 VIP
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: SQL PA2:80
Dst: SQL PA2:80
Src: Mux: PA
Src: Mux: PA
IPinIP/NVGRE
IPinIP/NVGRE
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
Src: ST GW IPV4 VIP
Src: ST GW IPV4 VIP
Dst: SQL VIP:80
Dst: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: dst MAC
Dst: dst MAC
Src: VM MAC1
Src: VM MAC1
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: ST IPv6 VIP:80
Dst: ST IPv6 VIP:80
Src  ST IPV6 CA1:572
Src  ST IPV6 CA1:572
TCP
TCP
Dst: ST IPv6 VIP:2200
Dst: ST IPv6 VIP:2200
TCP
TCP
47 (GRE)
47 (GRE)
Dst: NextHop MAC
Dst: NextHop MAC
Src: Source MAC
Src: Source MAC
DSt: ST GW IPV4 VIP
DSt: ST GW IPV4 VIP
Src: SQL VIP:80
Src: SQL VIP:80
GRE (0x6558)
GRE (0x6558)
Dst: VM MAC1
Dst: VM MAC1
Src: VM MAC2
Src: VM MAC2
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPv6 CA1:572
Dst  ST IPv6 CA1:572
TCP
TCP
Src: ST IPv6 VIP:80
Src: ST IPv6 VIP:80
Dst  ST IPv6 CA1:572
Dst  ST IPv6 CA1:572
TCP
TCP
Src: ST IPv6 CA2:2200
Src: ST IPv6 CA2:2200
Dst  ST IPv6 CA1:572
Dst  ST IPv6 CA1:572
TCP
TCP
For destination ST Gateway IPv4 VIP, Mux uses the inner ST IPv6 CA1 (STv1) or the inner MAC (STv2) to idenify the PA1. Then encap with IPinIP/NVGRE
For destination ST Gateway IPv4...
The Mux matches the inbound VIP and port to a load  balancing rule. It then hashes (src IP, src port, dst IP, dst port and protocol) to select a DIP from the active sip pool. Finally the Mux encapsulates the packet to the destination host using eitehr IPinIP or NVGRE
The Mux matches the inbound VIP an...
SLB NAT Layer SNAT SQL and cross region storage with ST GateWay IPv4 VIP. No SNAT port allocation needed as Mux uses eitehr inner MAC (ST2) or CA in inner IPv6 (ST1) for return traffic
SLB NAT Layer SNAT SQL and cros...
VNET layer NVGRE encap with GRE key 100 and source IPv4 PA, destination IPv4 VIP
VNET layer NVGRE encap with GRE...
VFP transposition layer performs IPv4 to IPv6 NAT for ST-enabled destination. Source IPv6 conatins VNet ID, Subnet ID, source CA. Destination IPv6 contains dst ST prefix + dst VIP
VFP transposition layer perform...
VNET layer descap the  GRE outer  IPv4, the flow will preserve the origianl src/dedt VIP from the outer header to match returnpacket
VNET layer descap the  GRE oute...
VNAT layer NAT dst from ST IPv6 VIP to ST IPv6 CA2
VNAT layer NAT dst from ST IPv6...
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-vm-internal-load-balancer.svg b/documentation/general/images/sdn/sdn-packet-transforms-vm-internal-load-balancer.svg index 4344acc85..087785193 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-vm-internal-load-balancer.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-vm-internal-load-balancer.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
3
3
4
4
5
5
7
7
8
8
9
9
14
14
15
15
16
16
17
17
18
18
VFP
VFP
Host
Host
VFP
VFP
Host
Host
13
13
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers
VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet
VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
 SLB VNAT Layer
 SLB VNAT Layer
 SLB VNAT Layer
 SLB VNAT Layer

VM Internal
Load Balalncer CA
(in VNET) communication

VM Internal...
1
1
2
2
6
6
10
10
11
11
12
12
19
19
VNET layer NAT the
from ILB CA to VM CA 
VNET layer NAT the...
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
TCP
TCP
Src: CA1:57212
Src: CA1:57212
Dst: ILB CA2:80
Dst: ILB CA2:80
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
TCP
TCP
Src: CA1:57212
Src: CA1:57212
Dst: ILB CA2:80
Dst: ILB CA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: PA2:80
Dst: PA2:80
Src: PA
Src: PA
IPinP/NVGRE
IPinP/NVGRE
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
3
3
4
4
5
5
7
7
8
8
9
9
14
14
15
15
16
16
17
17
18
18
VFP
VFP
Host
Host
VFP
VFP
Host
Host
13
13
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers
VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet
VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
 SLB VNAT Layer
 SLB VNAT Layer
 SLB VNAT Layer
 SLB VNAT Layer

VM Internal
Load Balalncer CA
(in VNET) communication

VM Internal...
1
1
2
2
6
6
10
10
11
11
12
12
19
19
VNET layer NAT the
from ILB CA to VM CA 
VNET layer NAT the...
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
TCP
TCP
Src: CA1:57212
Src: CA1:57212
Dst: ILB CA2:80
Dst: ILB CA2:80
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
TCP
TCP
Src: CA1:57212
Src: CA1:57212
Dst: ILB CA2:80
Dst: ILB CA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: ILB PA2:80
Src: ILB PA2:80
Src ILB CA2:80
Src ILB CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: ILB PA2:80
Dst: ILB PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: PA2:80
Dst: PA2:80
Src: PA
Src: PA
IPinP/NVGRE
IPinP/NVGRE
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-packet-transforms-vm-to-vm.svg b/documentation/general/images/sdn/sdn-packet-transforms-vm-to-vm.svg index 46e902a88..bf38e5610 100644 --- a/documentation/general/images/sdn/sdn-packet-transforms-vm-to-vm.svg +++ b/documentation/general/images/sdn/sdn-packet-transforms-vm-to-vm.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Text is not SVG - cannot display
diff --git a/documentation/general/images/sdn/sdn-virtual-port.svg b/documentation/general/images/sdn/sdn-virtual-port.svg index e29bccb97..0e281843c 100644 --- a/documentation/general/images/sdn/sdn-virtual-port.svg +++ b/documentation/general/images/sdn/sdn-virtual-port.svg @@ -1,4 +1,4 @@ -
ACL 1
ACL 1
ACL 2
ACL 2
ACL n
ACL n
Other Transforms
Other Transforms
V-Port (ENI)
VNIC Indentifier - MAC
Address/VXLAN VNI
V-Port (ENI)...
V-Port config
(port mac, QQS, DSCP)
V-Port config...
NAT Policies
NAT Policies
Route TableMapping Table
Text is not SVG - cannot display
\ No newline at end of file +
ACL 1
ACL 1
ACL 2
ACL 2
ACL n
ACL n
Other Transforms
Other Transforms
V-Port (ENI)
VNIC Indentifier - MAC
Address/VXLAN VNI
V-Port (ENI)...
V-Port config
(port mac, QQS, DSCP)
V-Port config...
NAT Policies
NAT Policies
Route TableMapping Table
Text is not SVG - cannot display
diff --git a/documentation/general/images/tcp-connection-abort.svg b/documentation/general/images/tcp-connection-abort.svg index 1e1a682e1..0a59af9c0 100644 --- a/documentation/general/images/tcp-connection-abort.svg +++ b/documentation/general/images/tcp-connection-abort.svg @@ -1,4 +1,4 @@ -
Data & Acks
Data & Acks
Data
Data
RST
RST
RST
RST
Text is not SVG - cannot display
\ No newline at end of file +
Data & Acks
Data & Acks
Data
Data
RST
RST
RST
RST
Text is not SVG - cannot display
diff --git a/documentation/general/images/tcp-connection-create.svg b/documentation/general/images/tcp-connection-create.svg index 86cba5572..539204029 100644 --- a/documentation/general/images/tcp-connection-create.svg +++ b/documentation/general/images/tcp-connection-create.svg @@ -1,4 +1,4 @@ -
optional first file 
optional first fil...
SYN | SEQ Client
SYN | SEQ Client
Client
Client
Server
Server
SYN-ACK | SEQ Client + 1 | SEQ Server
SYN-ACK | SEQ Client + 1 | SEQ Server
ACK | SEQ Server + 1 | SEQ Client + 1
ACK | SEQ Server + 1 | SEQ Client + 1
Text is not SVG - cannot display
\ No newline at end of file +
optional first file 
optional first fil...
SYN | SEQ Client
SYN | SEQ Client
Client
Client
Server
Server
SYN-ACK | SEQ Client + 1 | SEQ Server
SYN-ACK | SEQ Client + 1 | SEQ Server
ACK | SEQ Server + 1 | SEQ Client + 1
ACK | SEQ Server + 1 | SEQ Client + 1
Text is not SVG - cannot display
diff --git a/documentation/general/images/tcp-connection-delete.svg b/documentation/general/images/tcp-connection-delete.svg index 79b13ac54..d3b8fb4fe 100644 --- a/documentation/general/images/tcp-connection-delete.svg +++ b/documentation/general/images/tcp-connection-delete.svg @@ -1,4 +1,4 @@ -
Initiator
Initiator
Receiver
Receiver
FIN
FIN
ACK
ACK
FIN
FIN
ACK
ACK
Established 
Connection
Established...
Established 
Connection
Established...
active close
FIN_WAIT_1
active close...
FIN_WAIT_1
FIN_WAIT_1
TIME WAIT
TIME WAIT
CLOSE WAIT
passive close
CLOSE WAIT...
LAST_ACK
LAST_ACK
Closed
Closed
Closed
Closed
Text is not SVG - cannot display
\ No newline at end of file +
Initiator
Initiator
Receiver
Receiver
FIN
FIN
ACK
ACK
FIN
FIN
ACK
ACK
Established 
Connection
Established...
Established 
Connection
Established...
active close
FIN_WAIT_1
active close...
FIN_WAIT_1
FIN_WAIT_1
TIME WAIT
TIME WAIT
CLOSE WAIT
passive close
CLOSE WAIT...
LAST_ACK
LAST_ACK
Closed
Closed
Closed
Closed
Text is not SVG - cannot display
diff --git a/documentation/gnmi/README.md b/documentation/gnmi/README.md index 0a8edec7a..b657f10fd 100644 --- a/documentation/gnmi/README.md +++ b/documentation/gnmi/README.md @@ -14,4 +14,4 @@ This folder contains DASH gNMI Interface design and requirements documents. ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/high-avail/README.md b/documentation/high-avail/README.md index 253f76c1c..4cefe8d47 100644 --- a/documentation/high-avail/README.md +++ b/documentation/high-avail/README.md @@ -14,4 +14,4 @@ This folder contains DASH High Availability design and requirements documents. ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/high-avail/images/dash-ha-appliance.svg b/documentation/high-avail/images/dash-ha-appliance.svg index e79f29a8e..e3f49889d 100644 --- a/documentation/high-avail/images/dash-ha-appliance.svg +++ b/documentation/high-avail/images/dash-ha-appliance.svg @@ -1,4 +1,4 @@ -
DASH Appliance
DASH Appliance
1
1
2
2
3
3
5
5
6
6
4
4
DASH Appliance
DASH Appliance
1
1
2
2
3
3
5
5
6
6
4
4
Inter-DPU HA communications channel routed through network
Inter-DPU HA communicati...
DASH Appliance
DASH Appliance
1
1
2
2
3
3
5
5
6
6
4
4
to upper tiered switches or network
to upper tiered switches or network
Links are illustrative only, actual qty and speed varies.
Links are illustrativ...
High-Availability Peers
High-Availability Pee...
Backup Device
Backup Device
Devices may be co-located or remotely-located
Devices may be co-located or remotely-located
Viewer does not support full SVG 1.1
\ No newline at end of file +
DASH Appliance
DASH Appliance
1
1
2
2
3
3
5
5
6
6
4
4
DASH Appliance
DASH Appliance
1
1
2
2
3
3
5
5
6
6
4
4
Inter-DPU HA communications channel routed through network
Inter-DPU HA communicati...
DASH Appliance
DASH Appliance
1
1
2
2
3
3
5
5
6
6
4
4
to upper tiered switches or network
to upper tiered switches or network
Links are illustrative only, actual qty and speed varies.
Links are illustrativ...
High-Availability Peers
High-Availability Pee...
Backup Device
Backup Device
Devices may be co-located or remotely-located
Devices may be co-located or remotely-located
Viewer does not support full SVG 1.1
diff --git a/documentation/high-avail/images/dash-ha-smart-switch.svg b/documentation/high-avail/images/dash-ha-smart-switch.svg index b435f972c..f3eea4cb8 100644 --- a/documentation/high-avail/images/dash-ha-smart-switch.svg +++ b/documentation/high-avail/images/dash-ha-smart-switch.svg @@ -1,4 +1,4 @@ -
DASH Applliance/
Smart Switch
DASH Applliance/...
Captive DPU complex
Captive DPU...
DASH Applliance/
Smart Switch
DASH Applliance/...
Inter-DPU HA communications channel routed through network
Inter-DPU HA communications channel...
to upper tiered switches or network
to upper tiered switches or network
1
1
2
2
N
N
Captive DPU complex
Captive DPU...
1
1
2
2
N
N
Switch ASIC
Switch A...
Switch ASIC
Switch A...
DASH Applliance/
Smart Switch
DASH Applliance/...
Captive DPU complex
Captive DPU...
1
1
2
2
N
N
Switch ASIC
Switch A...
High-Availability Peers
High-Availability Pee...
Backup Device
Backup Device
Links are illustrative only, actual qty and speed varies.
Links are illustrativ...
Devices may be co-located or remotely-located
Devices may be co-located or remotely-located
Viewer does not support full SVG 1.1
\ No newline at end of file +
DASH Applliance/
Smart Switch
DASH Applliance/...
Captive DPU complex
Captive DPU...
DASH Applliance/
Smart Switch
DASH Applliance/...
Inter-DPU HA communications channel routed through network
Inter-DPU HA communications channel...
to upper tiered switches or network
to upper tiered switches or network
1
1
2
2
N
N
Captive DPU complex
Captive DPU...
1
1
2
2
N
N
Switch ASIC
Switch A...
Switch ASIC
Switch A...
DASH Applliance/
Smart Switch
DASH Applliance/...
Captive DPU complex
Captive DPU...
1
1
2
2
N
N
Switch ASIC
Switch A...
High-Availability Peers
High-Availability Pee...
Backup Device
Backup Device
Links are illustrative only, actual qty and speed varies.
Links are illustrativ...
Devices may be co-located or remotely-located
Devices may be co-located or remotely-located
Viewer does not support full SVG 1.1
diff --git a/documentation/high-avail/images/ha-functional-diag.svg b/documentation/high-avail/images/ha-functional-diag.svg index 13c44c778..81eb300f3 100644 --- a/documentation/high-avail/images/ha-functional-diag.svg +++ b/documentation/high-avail/images/ha-functional-diag.svg @@ -1,4 +1,4 @@ -DPU A Flow Entries
Flow identifiers
Flow identifie...
Timers
Timers
State
State
{5-tuple, etc.}
{5-tuple, etc.}
{active/passive, etc.}
{active/passiv...
Dataplane Pipeline
Dataplane Pipeline
L3 route
L3 route
stale entries
stale...
HA Dataplane Sync Controller A
HA Dataplane Sync Cont...
data channel
UDP, unreliable
data channel...
control channel
TCP, reliable
control channel...
flow table
syncing
flow table...
DPU A (local)
DPU A (local)
HA Dataplane Sync Controller B
HA Dataplane Sync Cont...
DPU B (peer)
DPU B (peer)
DPU B Flow Entries
DPU B Flow Entries
Use DC fabric for inband HA sync channels
Use DC fabric for inban...
sync channels (physical)
sync channe...
sync channels (logical)
sync channe...
Dataplane Pipeline
Dataplane Pipeline
flow table
syncing
flow table...
Layer 3 ToR Switch
Layer 3 ToR Switch
sync channels (physical)
sync channe...
Management API (SAI?)
Management...
Telemetry/
observability
Telemetry/...
"real-time" events,status, etc.
"real-time" e...
Config,control, state, stats
Config,contro...
Active flow updates
Active flow...
Active flow updates
Active flow...
Management API (SAI?)
Management...
Telemetry/
observability
Telemetry/...
to management SW, collectors etc.
to management SW, collecto...
channel SLAs?
channel SLAs?
Viewer does not support full SVG 1.1
\ No newline at end of file +DPU A Flow Entries
Flow identifiers
Flow identifie...
Timers
Timers
State
State
{5-tuple, etc.}
{5-tuple, etc.}
{active/passive, etc.}
{active/passiv...
Dataplane Pipeline
Dataplane Pipeline
L3 route
L3 route
stale entries
stale...
HA Dataplane Sync Controller A
HA Dataplane Sync Cont...
data channel
UDP, unreliable
data channel...
control channel
TCP, reliable
control channel...
flow table
syncing
flow table...
DPU A (local)
DPU A (local)
HA Dataplane Sync Controller B
HA Dataplane Sync Cont...
DPU B (peer)
DPU B (peer)
DPU B Flow Entries
DPU B Flow Entries
Use DC fabric for inband HA sync channels
Use DC fabric for inban...
sync channels (physical)
sync channe...
sync channels (logical)
sync channe...
Dataplane Pipeline
Dataplane Pipeline
flow table
syncing
flow table...
Layer 3 ToR Switch
Layer 3 ToR Switch
sync channels (physical)
sync channe...
Management API (SAI?)
Management...
Telemetry/
observability
Telemetry/...
"real-time" events,status, etc.
"real-time" e...
Config,control, state, stats
Config,contro...
Active flow updates
Active flow...
Active flow updates
Active flow...
Management API (SAI?)
Management...
Telemetry/
observability
Telemetry/...
to management SW, collectors etc.
to management SW, collecto...
channel SLAs?
channel SLAs?
Viewer does not support full SVG 1.1
diff --git a/documentation/high-avail/images/ha-state-sync-packet-format.svg b/documentation/high-avail/images/ha-state-sync-packet-format.svg index 1f0fe01de..f433cccdf 100644 --- a/documentation/high-avail/images/ha-state-sync-packet-format.svg +++ b/documentation/high-avail/images/ha-state-sync-packet-format.svg @@ -1,4 +1,4 @@ -
Ethernet
Ethernet
IP
IP
UDP
UDP
Flags
Flags
Opaque
Opaque
Msg 1
Msg 1
Opaque
Opaque
Msg 2
Msg 2
Opaque
Opaque
Msg N
Msg N
Opaque
Opaque
...
...
State Synchronization Packet Format
State Synchronization Packet Format
Truncated
(for replies, when requested)
Truncated...
Receiver specifies “N”, maximum messages allowed per packet (can be 1)
Sender may choose to send 1 to N messages per packet
Receiver specifies “N”, maximum messages allowed per packet...
Text is not SVG - cannot display
\ No newline at end of file +
Ethernet
Ethernet
IP
IP
UDP
UDP
Flags
Flags
Opaque
Opaque
Msg 1
Msg 1
Opaque
Opaque
Msg 2
Msg 2
Opaque
Opaque
Msg N
Msg N
Opaque
Opaque
...
...
State Synchronization Packet Format
State Synchronization Packet Format
Truncated
(for replies, when requested)
Truncated...
Receiver specifies “N”, maximum messages allowed per packet (can be 1)
Sender may choose to send 1 to N messages per packet
Receiver specifies “N”, maximum messages allowed per packet...
Text is not SVG - cannot display
diff --git a/documentation/high-avail/images/ha-sync-operations.svg b/documentation/high-avail/images/ha-sync-operations.svg index b9a7af397..dc79ce7c0 100644 --- a/documentation/high-avail/images/ha-sync-operations.svg +++ b/documentation/high-avail/images/ha-sync-operations.svg @@ -1,4 +1,4 @@ -
DPU 2
DPU 2
DPU 1
DPU 1
Lossy Channel
Lossy Channel
State Updates
State Updates
Replies
Replies
Sender
Sender
Receiver
Receiver
State Updates
State Updates
Replies
Replies
Receiver
Receiver
Sender
Sender
Fixed Behavior
Simple & Stateless
Fixed Behavior...
Flexible Behavior
Stateless or Stateful
Flexible Behavior...
Text is not SVG - cannot display
\ No newline at end of file +
DPU 2
DPU 2
DPU 1
DPU 1
Lossy Channel
Lossy Channel
State Updates
State Updates
Replies
Replies
Sender
Sender
Receiver
Receiver
State Updates
State Updates
Replies
Replies
Receiver
Receiver
Sender
Sender
Fixed Behavior
Simple & Stateless
Fixed Behavior...
Flexible Behavior
Stateless or Stateful
Flexible Behavior...
Text is not SVG - cannot display
diff --git a/documentation/images/general/dash-specs-flow.svg b/documentation/images/general/dash-specs-flow.svg index 2e05a8488..75b215a43 100644 --- a/documentation/images/general/dash-specs-flow.svg +++ b/documentation/images/general/dash-specs-flow.svg @@ -1,4 +1,4 @@ -
Test Cases
Test Cases
Detailed test cases which reference hard compliance requirements by ID so they can be traced back. A single test case can cover multiple requirements. Test cases include documentation, machine-readable parameters /test vectors which describe stimulus and expected responses, etc.
Detailed test cases which reference hard compliance requirements b...
HLDs
HLDs
High-level descriptions & requirements  - architecture,  services, features, encapsulations and transformations, etc. Emphasis is on understanding the objective/design. 
High-level descriptions & requirements  - architecture,  services,...
Compliance Requirements
Compliance...
Precise numeric and/or behavioral requirements, each requirement is well-specified. Should refer back to an associated HLD as applicable. Each requirement should be assigned an ID which can be referenced in test cases. Emphasis is on human-readability and maintainability but could be expressed in machine-readable form (e.g. yaml file) so can be consumed by test cases.

Example:
Reqmt. ID 1.2.3.4.5
10M connections per second <under some specified condition>
Precise numeric and/or behavioral requirements, each requirement i...
P4 Behavioral Model
P4 Behavior...
Dataplane behavioral model expressed in P4 (overlay, at least). Agrees with HLDs. Machine-readable/executable.
Dataplane behavioral model expressed in P4 (overlay, at least). Ag...
Test Scripts
Test Scrip...
Detailed test results in report form, both human and machine-readable, including all metadata required to reproduce the test exactly (all GitHub commit/branch info, DUT details, SW versions, etc.). Results can refer back to the HLDs and compliance requirements.
Detailed test results in report form, both human and machine-reada...
DASH/Documentation
DASH/Documentation
DASH/test
DASH/test
Reports
Reports
Test Results
Test Results
Executable testing scripts which implement the test cases. Data-driven to the extent possible, using values  from test cases and compliance requirements. Test results should refer back to original compliance requirements and test cases, including measured results, pass/fail, and test-case ID numbers. Tests can be run manually in local testbeds and triggered automatically in a CI/CD pipeline. A single script can run more than one test case.
Executable testing scripts which implement the test cases. Data-dr...
reference/
consume
reference/...
reference
reference
DASH Github Repo
DASH Githu...
Not stored in GitHub
Not stored...
store
store
Results Database (optional)
Results Datab...
Results can be stored by the entity which runs the test (e.g. a DASH device provider). Community CI/CD tests could be archived suitably.
Results can be stored by the entity which runs the te...
Results Archive
Results Ar...
reference
reference
reference/
consume
reference/...
Repo location/content
Repo location/content
Artifacts
Artifacts
Description
Description
generate
generate
Viewer does not support full SVG 1.1
\ No newline at end of file +
Test Cases
Test Cases
Detailed test cases which reference hard compliance requirements by ID so they can be traced back. A single test case can cover multiple requirements. Test cases include documentation, machine-readable parameters /test vectors which describe stimulus and expected responses, etc.
Detailed test cases which reference hard compliance requirements b...
HLDs
HLDs
High-level descriptions & requirements  - architecture,  services, features, encapsulations and transformations, etc. Emphasis is on understanding the objective/design. 
High-level descriptions & requirements  - architecture,  services,...
Compliance Requirements
Compliance...
Precise numeric and/or behavioral requirements, each requirement is well-specified. Should refer back to an associated HLD as applicable. Each requirement should be assigned an ID which can be referenced in test cases. Emphasis is on human-readability and maintainability but could be expressed in machine-readable form (e.g. yaml file) so can be consumed by test cases.

Example:
Reqmt. ID 1.2.3.4.5
10M connections per second <under some specified condition>
Precise numeric and/or behavioral requirements, each requirement i...
P4 Behavioral Model
P4 Behavior...
Dataplane behavioral model expressed in P4 (overlay, at least). Agrees with HLDs. Machine-readable/executable.
Dataplane behavioral model expressed in P4 (overlay, at least). Ag...
Test Scripts
Test Scrip...
Detailed test results in report form, both human and machine-readable, including all metadata required to reproduce the test exactly (all GitHub commit/branch info, DUT details, SW versions, etc.). Results can refer back to the HLDs and compliance requirements.
Detailed test results in report form, both human and machine-reada...
DASH/Documentation
DASH/Documentation
DASH/test
DASH/test
Reports
Reports
Test Results
Test Results
Executable testing scripts which implement the test cases. Data-driven to the extent possible, using values  from test cases and compliance requirements. Test results should refer back to original compliance requirements and test cases, including measured results, pass/fail, and test-case ID numbers. Tests can be run manually in local testbeds and triggered automatically in a CI/CD pipeline. A single script can run more than one test case.
Executable testing scripts which implement the test cases. Data-dr...
reference/
consume
reference/...
reference
reference
DASH Github Repo
DASH Githu...
Not stored in GitHub
Not stored...
store
store
Results Database (optional)
Results Datab...
Results can be stored by the entity which runs the test (e.g. a DASH device provider). Community CI/CD tests could be archived suitably.
Results can be stored by the entity which runs the te...
Results Archive
Results Ar...
reference
reference
reference/
consume
reference/...
Repo location/content
Repo location/content
Artifacts
Artifacts
Description
Description
generate
generate
Viewer does not support full SVG 1.1
diff --git a/documentation/images/general/github-project-workflow.svg b/documentation/images/general/github-project-workflow.svg index c93fd5949..05d3a296e 100644 --- a/documentation/images/general/github-project-workflow.svg +++ b/documentation/images/general/github-project-workflow.svg @@ -1,4 +1,4 @@ -Project item list DASH P4 BM: Model ComparisonItem nWork Items (Issues)DASH P4 BM: Model ComparisonItem 2Other Work Items (Issues)Item 1Item 2Pull RequestsPR 1PR 2
Link
Link
Link
Link
Link
Link
Project  to track status, assignees, etc.. 
Project  to track status, assignees, etc...
Actual work items 
Actual work items 
Actual sub-work items 
Actual sub-work items 
Actual work  
Actual work  
This is where the project entry is described and assignees are listed
This is where the project entry...
Just a link to the issue
Just a link to the issue
Text is not SVG - cannot display
\ No newline at end of file +Project item list DASH P4 BM: Model ComparisonItem nWork Items (Issues)DASH P4 BM: Model ComparisonItem 2Other Work Items (Issues)Item 1Item 2Pull RequestsPR 1PR 2
Link
Link
Link
Link
Link
Link
Project  to track status, assignees, etc.. 
Project  to track status, assignees, etc...
Actual work items 
Actual work items 
Actual sub-work items 
Actual sub-work items 
Actual work  
Actual work  
This is where the project entry is described and assignees are listed
This is where the project entry...
Just a link to the issue
Just a link to the issue
Text is not SVG - cannot display
diff --git a/documentation/images/icons/dash-icon-large.svg b/documentation/images/icons/dash-icon-large.svg index fcfddde27..0c921293d 100644 --- a/documentation/images/icons/dash-icon-large.svg +++ b/documentation/images/icons/dash-icon-large.svg @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/documentation/images/icons/dash-icon-medium.svg b/documentation/images/icons/dash-icon-medium.svg index 793c62b37..b7a7b6e52 100644 --- a/documentation/images/icons/dash-icon-medium.svg +++ b/documentation/images/icons/dash-icon-medium.svg @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/documentation/images/icons/dash-icon-small.svg b/documentation/images/icons/dash-icon-small.svg index 59f8357f9..32879dad5 100644 --- a/documentation/images/icons/dash-icon-small.svg +++ b/documentation/images/icons/dash-icon-small.svg @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/documentation/images/icons/dash-icon-xlarge.svg b/documentation/images/icons/dash-icon-xlarge.svg index fc66d239f..2593df46d 100644 --- a/documentation/images/icons/dash-icon-xlarge.svg +++ b/documentation/images/icons/dash-icon-xlarge.svg @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/documentation/load-bal-service/README.md b/documentation/load-bal-service/README.md index e4919efbb..abebd3a80 100644 --- a/documentation/load-bal-service/README.md +++ b/documentation/load-bal-service/README.md @@ -12,4 +12,4 @@ This folder contains DASH Load Balancer Service design and requirements document ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/sai/README.md b/documentation/sai/README.md index 8ff4c80bc..15cd35acc 100644 --- a/documentation/sai/README.md +++ b/documentation/sai/README.md @@ -11,4 +11,4 @@ This folder contains DASH SAI Interface design and requirements documents. ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/stpl-service/README.md b/documentation/stpl-service/README.md index bad04f19b..37f40f1b5 100644 --- a/documentation/stpl-service/README.md +++ b/documentation/stpl-service/README.md @@ -11,4 +11,4 @@ This folder contains DASH Service Tunnel & Private Link Service design and requi ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/vnet-peering-service/README.md b/documentation/vnet-peering-service/README.md index 3138cb808..73e826e94 100644 --- a/documentation/vnet-peering-service/README.md +++ b/documentation/vnet-peering-service/README.md @@ -11,4 +11,4 @@ This folder contains DASH VNET Peering Service design and requirements documents ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/vnet2vnet-service/README.md b/documentation/vnet2vnet-service/README.md index ad29b2e94..1f85cd94a 100644 --- a/documentation/vnet2vnet-service/README.md +++ b/documentation/vnet2vnet-service/README.md @@ -12,4 +12,4 @@ This folder contains DASH VNET-to-VNET Service design and requirements documents ## Requirements | Document | Description | -| ------------------------------------------------------ | ------------------------------------------ | \ No newline at end of file +| ------------------------------------------------------ | ------------------------------------------ | diff --git a/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-inbound.svg b/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-inbound.svg index 837115380..bf6155cf4 100644 --- a/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-inbound.svg +++ b/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-inbound.svg @@ -1,4 +1,4 @@ -
VNET1
VNET1
VM1
VM1
VNET2
VNET2
VM2
VM2
Virtual Network
Virtual Network
Inbound
Inbound
Text is not SVG - cannot display
\ No newline at end of file +
VNET1
VNET1
VM1
VM1
VNET2
VNET2
VM2
VM2
Virtual Network
Virtual Network
Inbound
Inbound
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-outbound.svg b/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-outbound.svg index 10e7a4f17..17d7c9b99 100644 --- a/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-outbound.svg +++ b/documentation/vnet2vnet-service/images/packet-pipeline-processing-per-eni-outbound.svg @@ -1,4 +1,4 @@ -
VNET1
VNET1
VM1
VM1
VNET2
VNET2
VM2
VM2
Virtual Network
Virtual Network
Outbound
Outbound
Text is not SVG - cannot display
\ No newline at end of file +
VNET1
VNET1
VM1
VM1
VNET2
VNET2
VM2
VM2
Virtual Network
Virtual Network
Outbound
Outbound
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/packet-processing-pipeline-tables-example.svg b/documentation/vnet2vnet-service/images/packet-processing-pipeline-tables-example.svg index a8b766374..3076afac8 100644 --- a/documentation/vnet2vnet-service/images/packet-processing-pipeline-tables-example.svg +++ b/documentation/vnet2vnet-service/images/packet-processing-pipeline-tables-example.svg @@ -1,4 +1,4 @@ -
Type
Type
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/16
F4939FEFC47E:10.1.0.0/16
Type
Type
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
101.1.2.3
101.1.2.3
mac address
mac address
mac_address
mac_address
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.1.1.1
Vnet1:10.1.1.1
F922839922A2
F922839922A2
Type
Type
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
Type
Type
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/16
F4939FEFC47E:10.1.0.0/16
Type
Type
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
101.1.2.3
101.1.2.3
mac address
mac address
mac_address
mac_address
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.1.1.1
Vnet1:10.1.1.1
F922839922A2
F922839922A2
Type
Type
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
1
1
2
2
3
3
Text is not SVG - cannot display
\ No newline at end of file +
Type
Type
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/16
F4939FEFC47E:10.1.0.0/16
Type
Type
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
101.1.2.3
101.1.2.3
mac address
mac address
mac_address
mac_address
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.1.1.1
Vnet1:10.1.1.1
F922839922A2
F922839922A2
Type
Type
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
Type
Type
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/16
F4939FEFC47E:10.1.0.0/16
Type
Type
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
101.1.2.3
101.1.2.3
mac address
mac address
mac_address
mac_address
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.1.1.1
Vnet1:10.1.1.1
F922839922A2
F922839922A2
Type
Type
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
1
1
2
2
3
3
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/packet-transforms-vm-to-vm-in-vnet-without-dash.svg b/documentation/vnet2vnet-service/images/packet-transforms-vm-to-vm-in-vnet-without-dash.svg index 46e902a88..bf38e5610 100644 --- a/documentation/vnet2vnet-service/images/packet-transforms-vm-to-vm-in-vnet-without-dash.svg +++ b/documentation/vnet2vnet-service/images/packet-transforms-vm-to-vm-in-vnet-without-dash.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/routing-packet-10.1.0.1.svg b/documentation/vnet2vnet-service/images/routing-packet-10.1.0.1.svg index bab14b485..6a8cdb24e 100644 --- a/documentation/vnet2vnet-service/images/routing-packet-10.1.0.1.svg +++ b/documentation/vnet2vnet-service/images/routing-packet-10.1.0.1.svg @@ -1,4 +1,4 @@ -
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
overlay_ip
overlay_ip
10.0.0.6
10.0.0.6
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/24
F4939FEFC47E:10.1.0.0/24
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
2601:12:7a:1::1234
2601:12:7a:1::1234
mac address
mac address
mac_address
mac_address
F922839922A2
F922839922A2
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.0.0.6
Vnet1:10.0.0.6
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
3
3
4
4
3.1
3.1
2
2
5
5
Route
Route
6
6
Perfom LPM on destination address 10.1.0.1
Perfom LPM on de...
Perform encap
Perform encap
Route
Route
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TABLE
1
1
Start
Start
Text is not SVG - cannot display
\ No newline at end of file +
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
overlay_ip
overlay_ip
10.0.0.6
10.0.0.6
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/24
F4939FEFC47E:10.1.0.0/24
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
2601:12:7a:1::1234
2601:12:7a:1::1234
mac address
mac address
mac_address
mac_address
F922839922A2
F922839922A2
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.0.0.6
Vnet1:10.0.0.6
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
3
3
4
4
3.1
3.1
2
2
5
5
Route
Route
6
6
Perfom LPM on destination address 10.1.0.1
Perfom LPM on de...
Perform encap
Perform encap
Route
Route
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TABLE
1
1
Start
Start
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/routing-packet-10.1.1.1.svg b/documentation/vnet2vnet-service/images/routing-packet-10.1.1.1.svg index 3563c1afd..ae376a58f 100644 --- a/documentation/vnet2vnet-service/images/routing-packet-10.1.1.1.svg +++ b/documentation/vnet2vnet-service/images/routing-packet-10.1.1.1.svg @@ -1,4 +1,4 @@ -
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/16
F4939FEFC47E:10.1.0.0/16
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
101.1.2.3
101.1.2.3
mac address
mac address
mac_address
mac_address
F922839922A2
F922839922A2
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.1.1.1
Vnet1:10.1.1.1
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
3
3
4
4
3.1
3.1
2
2
5
5
Route
Route
6
6
Perfom LPM on destination address 10.1.1.1
Perfom LPM on de...
Perform encap
Perform encap
Route
Route
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TABLE
1
1
Start
Start
Text is not SVG - cannot display
\ No newline at end of file +
Name
Name
Value
Value
table
table
action
action
action-type
action-type
vnet
vnet
Vnet1
Vnet1
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.1.0.0/16
F4939FEFC47E:10.1.0.0/16
Name
Name
Value
Value
table
table
routing
routing
routing_type
routing_type
vnet_encap
vnet_encap
ip address
ip address
underlay_ip
underlay_ip
101.1.2.3
101.1.2.3
mac address
mac address
mac_address
mac_address
F922839922A2
F922839922A2
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TA...
Vnet1:10.1.1.1
Vnet1:10.1.1.1
Name
Name
Value
Value
routing
routing
vnet
vnet
action
action
action1
action1
action_type
action_type
maprouting
maprouting
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
3
3
4
4
3.1
3.1
2
2
5
5
Route
Route
6
6
Perfom LPM on destination address 10.1.1.1
Perfom LPM on de...
Perform encap
Perform encap
Route
Route
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
DASH_ROUTING_TYPE
DASH_ROUTING_TYPE
DASH_VNET_MAPPING_TABLE
DASH_VNET_MAPPING_TABLE
1
1
Start
Start
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/routing-packet-10.2.5.1.svg b/documentation/vnet2vnet-service/images/routing-packet-10.2.5.1.svg index ab6197cf1..e729a92e1 100644 --- a/documentation/vnet2vnet-service/images/routing-packet-10.2.5.1.svg +++ b/documentation/vnet2vnet-service/images/routing-packet-10.2.5.1.svg @@ -1,4 +1,4 @@ -
Name
Name
Value
Value
table
table
action
action
action-type
action-type
drop
drop
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.2.5.1/16
F4939FEFC47E:10.2.5.1/16
3
3
1
1
Perfom LPM on destination address 10.2.5.1
Perfom LPM on de...
Drop
Drop
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
Start
Start
2
2
Text is not SVG - cannot display
\ No newline at end of file +
Name
Name
Value
Value
table
table
action
action
action-type
action-type
drop
drop
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:10.2.5.1/16
F4939FEFC47E:10.2.5.1/16
3
3
1
1
Perfom LPM on destination address 10.2.5.1
Perfom LPM on de...
Drop
Drop
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
Start
Start
2
2
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/routing-packet-30.0.0.1.svg b/documentation/vnet2vnet-service/images/routing-packet-30.0.0.1.svg index d8c07cf92..625d6c863 100644 --- a/documentation/vnet2vnet-service/images/routing-packet-30.0.0.1.svg +++ b/documentation/vnet2vnet-service/images/routing-packet-30.0.0.1.svg @@ -1,4 +1,4 @@ -
Name
Name
Value
Value
table
table
action
action
action-type
action-type
direct
direct
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:30.0.0.0/16
F4939FEFC47E:30.0.0.0/16
3
3
1
1
Perfom LPM on destination address 30.0.0.1
Perfom LPM on de...
Route
Route
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
Start
Start
2
2
Text is not SVG - cannot display
\ No newline at end of file +
Name
Name
Value
Value
table
table
action
action
action-type
action-type
direct
direct
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
F4939FEFC47E:30.0.0.0/16
F4939FEFC47E:30.0.0.0/16
3
3
1
1
Perfom LPM on destination address 30.0.0.1
Perfom LPM on de...
Route
Route
DASH_ROUTE_TABLE
DASH_ROUTE_TABLE
Start
Start
2
2
Text is not SVG - cannot display
diff --git a/documentation/vnet2vnet-service/images/vm-to-vm-communication-vnet.svg b/documentation/vnet2vnet-service/images/vm-to-vm-communication-vnet.svg index 7f54a5553..b533b4d29 100644 --- a/documentation/vnet2vnet-service/images/vm-to-vm-communication-vnet.svg +++ b/documentation/vnet2vnet-service/images/vm-to-vm-communication-vnet.svg @@ -1,4 +1,4 @@ -
VNET1
VNET1
VM1
VM1
VNET2
VNET2
VM2
VM2
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Appliance
Appliance
SmartNIC
Smart...
Text is not SVG - cannot display
\ No newline at end of file +
VNET1
VNET1
VM1
VM1
VNET2
VNET2
VM2
VM2
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Tunnel
Appliance
Appliance
SmartNIC
Smart...
Text is not SVG - cannot display
diff --git a/images/github-project-workflow.svg b/images/github-project-workflow.svg index 4f3a19804..7dfbde4a7 100644 --- a/images/github-project-workflow.svg +++ b/images/github-project-workflow.svg @@ -1,4 +1,4 @@ -Project items list DASH P4 BM: Model ComparisonIsuue nWork Items (Issues)DASH P4 BM: Model ComparisonItem 2Other Work Items (Issues)Item 1Item 2Pull RequestsPR 1PR 2
Link
Link
Link
Link
Link
Link
Project  to track status, assiungees, etc.. 
Project  to track status, assiungees, etc...
Actual work items 
Actual work items 
Actual sub-work items 
Actual sub-work items 
Actual work  
Actual work  
This is where the project entry is described and assignees are listed
This is where the project entry...
Just a link to the issue
Just a link to the issue
Text is not SVG - cannot display
\ No newline at end of file +Project items list DASH P4 BM: Model ComparisonIsuue nWork Items (Issues)DASH P4 BM: Model ComparisonItem 2Other Work Items (Issues)Item 1Item 2Pull RequestsPR 1PR 2
Link
Link
Link
Link
Link
Link
Project  to track status, assiungees, etc.. 
Project  to track status, assiungees, etc...
Actual work items 
Actual work items 
Actual sub-work items 
Actual sub-work items 
Actual work  
Actual work  
This is where the project entry is described and assignees are listed
This is where the project entry...
Just a link to the issue
Just a link to the issue
Text is not SVG - cannot display
diff --git a/images/sdn-packet-transforms-vm-to-vm.svg b/images/sdn-packet-transforms-vm-to-vm.svg index b39980c02..edfe2ec28 100644 --- a/images/sdn-packet-transforms-vm-to-vm.svg +++ b/images/sdn-packet-transforms-vm-to-vm.svg @@ -1,4 +1,4 @@ -
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA Appliance:80
Dst:  PA Appliance...
Src:  PA1:57212
Src:  PA1:57212
VXLAN
VXLAN
1
1
Src VM CA 1 initiates connection to Dst VM CA 2
Src VM CA 1 initiates connection to Dst VM CA 2
Matched Route
Matched Route
Transform
Transform
Route Type
Route Type
2
2
SMAC1 -> DMAC_FAKE
SMAC1 -> DMAC_FAKE
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/IP stack of Windows/Linux.  Upon packet construction we construct the packet which needs a MAC address.  This will be overridden later.
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/...
3
3
Outer Evaluation
Outer Evaluation
Outer Evaluation
Outer Evaluation
4
4
SRC: Physical IP of host
DST:  Physical IP of SDN appliance
SRC: Physical IP of host...
SRC:  SDN Appliance IP
DST:  100.0.0.2 from CA to PA mapping table lookup
SRC:  SDN Appliance IP...
5
5
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
6
6
VNI Custom
VNI Custom
VNI:  10001
VNI:  10001
7
7
Inner MAC: 
Inner MAC: 
Inner MAC:
Inner MAC:
8
8
SRC:  SMAC1 DST - DMAC_FAKE
SRC:  SMAC1 DST - DMAC_FAKE
SRC-SMAC1   DST E4-A7-A0-99-0E-18
SRC-SMAC1   DST E4-A7-A0-99-0E-18
9
9
Inner IP:  10.0.0.1 -> 10.0.0.2
Inner IP:  10.0.0.1 -> 10.0.0.2
Route ID = 1
Route ID = 1
Inner IP:  10.00.1 -> 10.0.0.2
Inner IP:  10.00.1 -> 10.0.0.2
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
Text is not SVG - cannot display
\ No newline at end of file +
Src: VM CA1
Src: VM CA1
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
Dst: VM CA2
Dst: VM CA2
VNET Layer
VNET Layer
SLB NAT Layer
SLB NAT Layer
SLB Decap/Fastpath Layer
SLB Decap/Fastpath Layer
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
10
10
11
11
12
12
13
13
14
14
VFP
VFP
Host
Host
VFP
VFP
Host
Host
9
9

VM to VM
(in VNET)
communication

VM to VM...
VNET uses CA:PA mapping from CDS/RDS to add GRE encap with PA to the packet. 
The GRE paccket will pass through SLB NAT/Decap layers

VNET uses CA:PA mapping fr...
VNET layer decap the
GRE packet

VNET layer decap the...
Src: Mux1
Src: Mux1
Dst:  Mux2
Dst:  Mux2
Encapsulation
Encapsulation
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst: PA1:57212
Dst: PA1:57212
Src: PA2:80
Src: PA2:80
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Src CA2:80
Src CA2:80
Dst  CA1:57212
Dst  CA1:57212
TCP
TCP
Dst: CA2:80
Dst: CA2:80
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA2:80
Dst:  PA2:80
Src:  PA1:57212
Src:  PA1:57212
Dst: Appliance:80
Dst: Applianc...
Src: CA1:57212
Src: CA1:57212
TCP
TCP
GRE Header
GRE Header
47 (GRE)
47 (GRE)
Dst:  PA Appliance:80
Dst:  PA Appliance...
Src:  PA1:57212
Src:  PA1:57212
VXLAN
VXLAN
1
1
Src VM CA 1 initiates connection to Dst VM CA 2
Src VM CA 1 initiates connection to Dst VM CA 2
Matched Route
Matched Route
Transform
Transform
Route Type
Route Type
2
2
SMAC1 -> DMAC_FAKE
SMAC1 -> DMAC_FAKE
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/IP stack of Windows/Linux.  Upon packet construction we construct the packet which needs a MAC address.  This will be overridden later.
DMAC_FAKE is a hard coded MAC address to satisfy the TCP/...
3
3
Outer Evaluation
Outer Evaluation
Outer Evaluation
Outer Evaluation
4
4
SRC: Physical IP of host
DST:  Physical IP of SDN appliance
SRC: Physical IP of host...
SRC:  SDN Appliance IP
DST:  100.0.0.2 from CA to PA mapping table lookup
SRC:  SDN Appliance IP...
5
5
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
Encapsulation:  VXLAN
6
6
VNI Custom
VNI Custom
VNI:  10001
VNI:  10001
7
7
Inner MAC: 
Inner MAC: 
Inner MAC:
Inner MAC:
8
8
SRC:  SMAC1 DST - DMAC_FAKE
SRC:  SMAC1 DST - DMAC_FAKE
SRC-SMAC1   DST E4-A7-A0-99-0E-18
SRC-SMAC1   DST E4-A7-A0-99-0E-18
9
9
Inner IP:  10.0.0.1 -> 10.0.0.2
Inner IP:  10.0.0.1 -> 10.0.0.2
Route ID = 1
Route ID = 1
Inner IP:  10.00.1 -> 10.0.0.2
Inner IP:  10.00.1 -> 10.0.0.2
Encap_with_lookup_V4_underlay
Encap_with_lookup_V4_underlay
Text is not SVG - cannot display
diff --git a/test/.gitignore b/test/.gitignore index b6f656ebe..766836180 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1,2 +1,2 @@ **/__pycache__ -**/*.pyc \ No newline at end of file +**/*.pyc diff --git a/test/docs/README.md b/test/docs/README.md index 50148dd26..76f9bdfdb 100644 --- a/test/docs/README.md +++ b/test/docs/README.md @@ -16,4 +16,4 @@ | [SAI Challenger Test Workflows](dash-test-sai-challenger.md) | How to run scalable tests using SAI-Challenger and snappi. | | [Testbed](testbed/README.md) | Describes the setup and configuration of a DASH testbed.| | [snappi and SAI-Challenger based tests](dash-test-sai-challenger.md) | How to run scalable tests using SAI-Challenger and snappi. The scalability is achieved with additional DASH/SAI abstraction level in test code to simplify high scale DUT configuration. | -| [Test Plans](testplans/README.md) | Home of DASH features test plans including test plan template | \ No newline at end of file +| [Test Plans](testplans/README.md) | Home of DASH features test plans including test plan template | diff --git a/test/docs/dash-ptf-testbed.md b/test/docs/dash-ptf-testbed.md index edc2fd844..439dfc91c 100644 --- a/test/docs/dash-ptf-testbed.md +++ b/test/docs/dash-ptf-testbed.md @@ -1,2 +1,2 @@ # DASH Testbed using PTF (Packet Test Framework) -TODO \ No newline at end of file +TODO diff --git a/test/docs/dash-test-sai-challenger.md b/test/docs/dash-test-sai-challenger.md index 875524b9a..f2a017de3 100644 --- a/test/docs/dash-test-sai-challenger.md +++ b/test/docs/dash-test-sai-challenger.md @@ -91,4 +91,4 @@ Or in SAI configuration format: pytest -sv --setup=sai_dpu_client_server_snappi.json test_vnet_inbound.py pytest -sv --setup=sai_dpu_client_server_snappi.json test_vnet_outbound.py ``` ->**NOTE:** Feel free to use other Pytest flags. In particular, `-k ` and `-m ` can select tests based on a string pattern expression to filter by test-case name or `@pytest.mark` annotations, respectively. Refer to [Pytest documentation](https://docs.pytest.org/en/7.2.x/contents.html) for more info. Use `pytest -h` for help. \ No newline at end of file +>**NOTE:** Feel free to use other Pytest flags. In particular, `-k ` and `-m ` can select tests based on a string pattern expression to filter by test-case name or `@pytest.mark` annotations, respectively. Refer to [Pytest documentation](https://docs.pytest.org/en/7.2.x/contents.html) for more info. Use `pytest -h` for help. diff --git a/test/docs/images/vnet2vnet_outbound_traffic_scaling.svg b/test/docs/images/vnet2vnet_outbound_traffic_scaling.svg index 0d418a221..2e8f35ea5 100644 --- a/test/docs/images/vnet2vnet_outbound_traffic_scaling.svg +++ b/test/docs/images/vnet2vnet_outbound_traffic_scaling.svg @@ -1,4 +1,4 @@ -
VIP #1
VIP #1
ENI #1
ENI #1
ENI MAC MAP #1
ENI MAC MAP #1
ENI #2
ENI #2
ENI MAC MAP #2
ENI MAC MAP #2
DIRECTION LOOKUP #1
DIRECTION LOOKUP #1
OUTBOUND ROUTING #1
OUTBOUND ROUTING #1
OUTBOUND ROUTING #2
OUTBOUND ROUTING #2
OUTBOUND ROUTING #3
OUTBOUND ROUTING #3
OUTBOUND ROUTING #4
OUTBOUND ROUTING #4
CA TO PA #1
CA TO PA #1
CA TO PA #2
CA TO PA #2
CA TO PA #3
CA TO PA #3
CA TO PA #4
CA TO PA #4
DIRECTION LOOKUP #2
DIRECTION LOOKUP #2
VNET #X
VNET #X
VNET #X
VNET #X
VNET #X
VNET #X
VNET #Y
VNET #Y
VNET #X
VNET #X
VNET #X
VNET #X
CA TO PA #5
CA TO PA #5
CA TO PA #6
CA TO PA #6
CA TO PA #7
CA TO PA #7
CA TO PA #8
CA TO PA #8
Text is not SVG - cannot display
\ No newline at end of file +
VIP #1
VIP #1
ENI #1
ENI #1
ENI MAC MAP #1
ENI MAC MAP #1
ENI #2
ENI #2
ENI MAC MAP #2
ENI MAC MAP #2
DIRECTION LOOKUP #1
DIRECTION LOOKUP #1
OUTBOUND ROUTING #1
OUTBOUND ROUTING #1
OUTBOUND ROUTING #2
OUTBOUND ROUTING #2
OUTBOUND ROUTING #3
OUTBOUND ROUTING #3
OUTBOUND ROUTING #4
OUTBOUND ROUTING #4
CA TO PA #1
CA TO PA #1
CA TO PA #2
CA TO PA #2
CA TO PA #3
CA TO PA #3
CA TO PA #4
CA TO PA #4
DIRECTION LOOKUP #2
DIRECTION LOOKUP #2
VNET #X
VNET #X
VNET #X
VNET #X
VNET #X
VNET #X
VNET #Y
VNET #Y
VNET #X
VNET #X
VNET #X
VNET #X
CA TO PA #5
CA TO PA #5
CA TO PA #6
CA TO PA #6
CA TO PA #7
CA TO PA #7
CA TO PA #8
CA TO PA #8
Text is not SVG - cannot display
diff --git a/test/images/dash-gnmi-api.svg b/test/images/dash-gnmi-api.svg index aea548428..ee12dd9f7 100644 --- a/test/images/dash-gnmi-api.svg +++ b/test/images/dash-gnmi-api.svg @@ -1,4 +1,4 @@ -
gNMI Server
gNMI Server
Test Controller
Test Controller
gNMI API
gNMI A...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic...
e.g. IXIA
e.g. I...
Traffic
Traffic
DUT
DUT
Viewer does not support full SVG 1.1
\ No newline at end of file +
gNMI Server
gNMI Server
Test Controller
Test Controller
gNMI API
gNMI A...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic...
e.g. IXIA
e.g. I...
Traffic
Traffic
DUT
DUT
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-sai-challenger.svg b/test/images/dash-sai-challenger.svg index c5d6553df..1efcfd6c6 100644 --- a/test/images/dash-sai-challenger.svg +++ b/test/images/dash-sai-challenger.svg @@ -1,4 +1,4 @@ -
SAI Challenger
SAI Challenger
Test Controller
Test Controller
sai-redis
sai-redis
NOT USED - For Reference Only
NOT USED - For Reference Only
Test Traffic  Generator/Receiver ("TGen")
Test Traffic...
e.g. IXIA
e.g. I...
DUT
DUT
Traffic
Traffic
ASIC-DB
ASIC-DB
Viewer does not support full SVG 1.1
\ No newline at end of file +
SAI Challenger
SAI Challenger
Test Controller
Test Controller
sai-redis
sai-redis
NOT USED - For Reference Only
NOT USED - For Reference Only
Test Traffic  Generator/Receiver ("TGen")
Test Traffic...
e.g. IXIA
e.g. I...
DUT
DUT
Traffic
Traffic
ASIC-DB
ASIC-DB
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-saichallenger-enhanced.svg b/test/images/dash-saichallenger-enhanced.svg index 60aabac9f..1a010f283 100644 --- a/test/images/dash-saichallenger-enhanced.svg +++ b/test/images/dash-saichallenger-enhanced.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
file
file
literal SAI records in the test-case code
literal SAI rec...
stored SAI records
stored SAI...
file read
file read
saithrift driver
saithrift dr...
sairedis driver
sairedis dri...
gNMI driver (future?)
gNMI driver...
DUT API
DUT API
snappi supports a HW or SW Traffic Generator, e.g. ixia-c container for virtual or NIC-based tests; or HW chassis for line-rate tests. Supports powerful, flow-based constructs (header patterns/counters, etc.).
snappi supports a HW or SW Traffi...
Possible
sources of data-driven config
Possible...
dataplane wrapper
dataplane wr...
Scapy is a software-based packet generator/capture library, limited scale, not flow-based.
Scapy is a software-based pack...
custom generator
custom gene...
streaming SAI records
streaming...
input params
input params
dpugen
dpugen
generator
generator
generate
generate
SAI Challenger Framework
SAI Challenger Framework
module import
module import
Hand-coded or from generator
Hand-coded or...
OR
OR
traffic
traffic
HW/SW Traffic Generator
HW/SW Traf...
Packet Gen Cmds
Packet Gen Cmds
Choice of SW/HW traffic generators
Choice of SW/HW traffic generators
Optional way to generate DASH configs, especially high-scale.
Optional way to generate DASH con...
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
same logic can be used for different data inputs, yielding many test-cases
(e.g. "Test ACL rules" for various config files)
same logic can be...
Custom driver
Custom driver
Record Parser
Record Parser
https://pypi.org/project/dpugen/
pip install dpugen
https://pypi.org/project/dpugen/...
?
?
X
X
{...}
{...}
Test Logic
Test Log...
optional - traditional DUT config API calls, e.g. sai-thrift
optional - tra...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
specify DUT topology, dataplane (PTF/snappi), DUT API (sai-thrift, sai-redis) etc.
specify DUT topology, dataplane (PTF/snappi)...
SAI records are
Application- and NOS-agnostic - not tied to DASH or even SONiC
SAI records are...
PyTest test-case
PyTest test-case
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
file
file
literal SAI records in the test-case code
literal SAI rec...
stored SAI records
stored SAI...
file read
file read
saithrift driver
saithrift dr...
sairedis driver
sairedis dri...
gNMI driver (future?)
gNMI driver...
DUT API
DUT API
snappi supports a HW or SW Traffic Generator, e.g. ixia-c container for virtual or NIC-based tests; or HW chassis for line-rate tests. Supports powerful, flow-based constructs (header patterns/counters, etc.).
snappi supports a HW or SW Traffi...
Possible
sources of data-driven config
Possible...
dataplane wrapper
dataplane wr...
Scapy is a software-based packet generator/capture library, limited scale, not flow-based.
Scapy is a software-based pack...
custom generator
custom gene...
streaming SAI records
streaming...
input params
input params
dpugen
dpugen
generator
generator
generate
generate
SAI Challenger Framework
SAI Challenger Framework
module import
module import
Hand-coded or from generator
Hand-coded or...
OR
OR
traffic
traffic
HW/SW Traffic Generator
HW/SW Traf...
Packet Gen Cmds
Packet Gen Cmds
Choice of SW/HW traffic generators
Choice of SW/HW traffic generators
Optional way to generate DASH configs, especially high-scale.
Optional way to generate DASH con...
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
same logic can be used for different data inputs, yielding many test-cases
(e.g. "Test ACL rules" for various config files)
same logic can be...
Custom driver
Custom driver
Record Parser
Record Parser
https://pypi.org/project/dpugen/
pip install dpugen
https://pypi.org/project/dpugen/...
?
?
X
X
{...}
{...}
Test Logic
Test Log...
optional - traditional DUT config API calls, e.g. sai-thrift
optional - tra...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
specify DUT topology, dataplane (PTF/snappi), DUT API (sai-thrift, sai-redis) etc.
specify DUT topology, dataplane (PTF/snappi)...
SAI records are
Application- and NOS-agnostic - not tied to DASH or even SONiC
SAI records are...
PyTest test-case
PyTest test-case
Text is not SVG - cannot display
diff --git a/test/images/dash-test-wflow-p4-saithrift.svg b/test/images/dash-test-wflow-p4-saithrift.svg index 3df9196ee..e232a9230 100644 --- a/test/images/dash-test-wflow-p4-saithrift.svg +++ b/test/images/dash-test-wflow-p4-saithrift.svg @@ -1,4 +1,4 @@ -
TDI (Table-Driven Interface)
TDI (Table-Driven In...
Optional (not required
by DASH project)
May be used to verify P4 code
Optional (not required...
Traffic veths
Traffic veths
P4-DPDK
PNA arch
P4-DPDK...
Bmv2+
V1+ Arch
Bmv2+...
P4RT
server
P4RT...
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
Intel WIP
P4-DPDK with native
PNA arch support
Intel WIP...
Community WIP
bmv2 modified for V1 model with added stateful tracking.
Long-term: PNA compliant?
Community WIP...
dash-pipeline P4
V1 Architecture
dash-pipeline P4...
Traffic veths
Traffic veths
dash-pipeline P4
PNA Architecture
dash-pipeline P4...
Traffic generator commands
Traffic generator commands
PTF or PyTest
SAI-thrift test scripts
PTF or PyTest...
Scripts scalable to line-rate using snappi and HW packet generators
Scripts scalable to line-...
saithrift commands
saithrift commands
saithrift commands
saithrift commands
P4RT commands
P4RT commands
P4RT commands
P4RT commands
P4RT 
test scripts
P4RT...
P4RT
commands
(socket)
P4RT...
P4RT
server
P4RT...
saithrift
server
saithrift...
libsai
libsai
saithrift
server
saithrift...
libsai
libsai
P4RT and saithrift are alternate & parallel RPCs. TDI is the native interface.
P4RT and saithrift are...
P4RT and saithrift are alternate RPCs, P4RT is the native interface and saithrift is translated into P4RT
P4RT and saithrift are alt...
GitHub Actions
(CI/CD)
GitHub Actions...

Upon commit:
Any dependency change triggers a build & test.
Upon commit:Any dependen...
SW traffic 
generators
SW traffic...
+ Ixia-c
+ Ixia-c
Scapy
Scapy
OR
OR
Text is not SVG - cannot display
\ No newline at end of file +
TDI (Table-Driven Interface)
TDI (Table-Driven In...
Optional (not required
by DASH project)
May be used to verify P4 code
Optional (not required...
Traffic veths
Traffic veths
P4-DPDK
PNA arch
P4-DPDK...
Bmv2+
V1+ Arch
Bmv2+...
P4RT
server
P4RT...
SAI-P4RT
Adaptor/
P4RT Client
SAI-P4RT...
Intel WIP
P4-DPDK with native
PNA arch support
Intel WIP...
Community WIP
bmv2 modified for V1 model with added stateful tracking.
Long-term: PNA compliant?
Community WIP...
dash-pipeline P4
V1 Architecture
dash-pipeline P4...
Traffic veths
Traffic veths
dash-pipeline P4
PNA Architecture
dash-pipeline P4...
Traffic generator commands
Traffic generator commands
PTF or PyTest
SAI-thrift test scripts
PTF or PyTest...
Scripts scalable to line-rate using snappi and HW packet generators
Scripts scalable to line-...
saithrift commands
saithrift commands
saithrift commands
saithrift commands
P4RT commands
P4RT commands
P4RT commands
P4RT commands
P4RT 
test scripts
P4RT...
P4RT
commands
(socket)
P4RT...
P4RT
server
P4RT...
saithrift
server
saithrift...
libsai
libsai
saithrift
server
saithrift...
libsai
libsai
P4RT and saithrift are alternate & parallel RPCs. TDI is the native interface.
P4RT and saithrift are...
P4RT and saithrift are alternate RPCs, P4RT is the native interface and saithrift is translated into P4RT
P4RT and saithrift are alt...
GitHub Actions
(CI/CD)
GitHub Actions...

Upon commit:
Any dependency change triggers a build & test.
Upon commit:Any dependen...
SW traffic 
generators
SW traffic...
+ Ixia-c
+ Ixia-c
Scapy
Scapy
OR
OR
Text is not SVG - cannot display
diff --git a/test/images/dash-test-wflow-saithrift.svg b/test/images/dash-test-wflow-saithrift.svg index d22116d96..a6abd6388 100644 --- a/test/images/dash-test-wflow-saithrift.svg +++ b/test/images/dash-test-wflow-saithrift.svg @@ -1,4 +1,4 @@ -
Reusable for multiple northbound/southbound APIs
Reusable for multiple northbo...
Saithrift commands
Saithrift commands
Traffic generator commands (Scapy, snappi)
Traffic generator commands (Scapy, snappi)
HW/SW traffic 
generator
HW/SW traffic...
Automated and
repeatable traffic
tests
Automated and...
Hand-written and/or
templated test cases
Abstract format
Hand-written and/or...
dash-pipeline P4
behavioral model 
(source of truth)
dash-pipeline P4...
Standard OCP SAI
header files subset
(underlay)
Standard OCP SAI...
DASH SAI
header files
(overrlay)
DASH SAI...
Inputs
Inputs
Generate
Generate
Saithrift code
generator
Saithrift code...


Automatic saithrift client and server code generator


Automatic saithrift cli...
Traffic cables
Traffic cables
Import libs
Import libs
Thrift server
skeleton C++ code
Thrift server...
Target libsai
Target libsai
Inputs
Inputs
Build image
Build image
DUT image
DUT image
Generate
Generate
Python client 
+ helpers 
Python client...
DUT Software
Target
DUT Software...
dash/test
dash/test
opencompute/SAI
opencompute/SAI
Compile P4 Target
Compile P4 Target
Traffic veths
Traffic veths
Test scripts
PTF, PyTest
Test scripts...
SW Dev
SW Dev
DASH 
CI/CD Pipeline
DASH...
Manually triggered test
Manually triggered te...
Commit-triggered test
Commit-triggered test
DASH/dash--pipeline
DASH/dash--pipeline
Device Under test (DUT) config
Device Under test...
P4 Info
P4 Info
Generate SAI headers
Generate SAI headers
DUT Hardware
Target
DUT Hardware...
Git
Git
Git
Git
Git
Git
Git
Git
p4c
p4c
Text is not SVG - cannot display
\ No newline at end of file +
Reusable for multiple northbound/southbound APIs
Reusable for multiple northbo...
Saithrift commands
Saithrift commands
Traffic generator commands (Scapy, snappi)
Traffic generator commands (Scapy, snappi)
HW/SW traffic 
generator
HW/SW traffic...
Automated and
repeatable traffic
tests
Automated and...
Hand-written and/or
templated test cases
Abstract format
Hand-written and/or...
dash-pipeline P4
behavioral model 
(source of truth)
dash-pipeline P4...
Standard OCP SAI
header files subset
(underlay)
Standard OCP SAI...
DASH SAI
header files
(overrlay)
DASH SAI...
Inputs
Inputs
Generate
Generate
Saithrift code
generator
Saithrift code...


Automatic saithrift client and server code generator


Automatic saithrift cli...
Traffic cables
Traffic cables
Import libs
Import libs
Thrift server
skeleton C++ code
Thrift server...
Target libsai
Target libsai
Inputs
Inputs
Build image
Build image
DUT image
DUT image
Generate
Generate
Python client 
+ helpers 
Python client...
DUT Software
Target
DUT Software...
dash/test
dash/test
opencompute/SAI
opencompute/SAI
Compile P4 Target
Compile P4 Target
Traffic veths
Traffic veths
Test scripts
PTF, PyTest
Test scripts...
SW Dev
SW Dev
DASH 
CI/CD Pipeline
DASH...
Manually triggered test
Manually triggered te...
Commit-triggered test
Commit-triggered test
DASH/dash--pipeline
DASH/dash--pipeline
Device Under test (DUT) config
Device Under test...
P4 Info
P4 Info
Generate SAI headers
Generate SAI headers
DUT Hardware
Target
DUT Hardware...
Git
Git
Git
Git
Git
Git
Git
Git
p4c
p4c
Text is not SVG - cannot display
diff --git a/test/images/dash-testbed-inband-via-switch.svg b/test/images/dash-testbed-inband-via-switch.svg index f638d1b05..b1554697e 100644 --- a/test/images/dash-testbed-inband-via-switch.svg +++ b/test/images/dash-testbed-inband-via-switch.svg @@ -1,4 +1,4 @@ -
Inband API access via Switch
Inband API access via Switch
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
API en...
Traffic Interfaces
("Ports")
Traffic Int...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Inband API path over traffic port
Inband API...
DUT API  "Channel"
DUT API  "Channel"
external switch
external...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Inband API access via Switch
Inband API access via Switch
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
API en...
Traffic Interfaces
("Ports")
Traffic Int...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Inband API path over traffic port
Inband API...
DUT API  "Channel"
DUT API  "Channel"
external switch
external...
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-testbed-inband-via-tgen.svg b/test/images/dash-testbed-inband-via-tgen.svg index 1ee03435e..ea6cfac0b 100644 --- a/test/images/dash-testbed-inband-via-tgen.svg +++ b/test/images/dash-testbed-inband-via-tgen.svg @@ -1,4 +1,4 @@ -
Inband API access via Tgen
Inband API access via Tgen
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
API en...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
DUT API  "Channel"
DUT API  "Channel"
Inband API path over traffic port
Inband API pa...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Inband API access via Tgen
Inband API access via Tgen
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
API en...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
DUT API  "Channel"
DUT API  "Channel"
Inband API path over traffic port
Inband API pa...
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-testbed-out-of-band-mgmt.svg b/test/images/dash-testbed-out-of-band-mgmt.svg index e375de8da..c3e233b0d 100644 --- a/test/images/dash-testbed-out-of-band-mgmt.svg +++ b/test/images/dash-testbed-out-of-band-mgmt.svg @@ -1,4 +1,4 @@ -
Out of band API access via dedicated physical interface
Out of band API access via dedicated physical interface
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
via dedicated management port
API endpoint(s)...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
DUT API Interface
DUT API Interface
Inband API path
Inband API pa...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Out of band API access via dedicated physical interface
Out of band API access via dedicated physical interface
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
via dedicated management port
API endpoint(s)...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
DUT API Interface
DUT API Interface
Inband API path
Inband API pa...
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-testbed-out-of-band-via-iface.svg b/test/images/dash-testbed-out-of-band-via-iface.svg index 1923d4b96..b38adf29f 100644 --- a/test/images/dash-testbed-out-of-band-via-iface.svg +++ b/test/images/dash-testbed-out-of-band-via-iface.svg @@ -1,4 +1,4 @@ -
Out of band API access via PCIe Interace
Out of band API access via PCIe Interace
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
PCIe interface driver
PCIe int...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Operating system routing
Operating syste...
host/chassis management interface
host/chassis...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Out of band API access via PCIe Interace
Out of band API access via PCIe Interace
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
PCIe interface driver
PCIe int...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Operating system routing
Operating syste...
host/chassis management interface
host/chassis...
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-testbed-out-of-band-via-proxy.svg b/test/images/dash-testbed-out-of-band-via-proxy.svg index 7ba2d9f8f..ae7d29226 100644 --- a/test/images/dash-testbed-out-of-band-via-proxy.svg +++ b/test/images/dash-testbed-out-of-band-via-proxy.svg @@ -1,4 +1,4 @@ -
Out of band API access via Proxy
Out of band API access via Proxy
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
Proxy API endpoint(s)
Proxy API...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Internal translation to native API or SDK
Internal translation...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Out of band API access via Proxy
Out of band API access via Proxy
Test System Controller
("Controller")
Test Syste...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
Proxy API endpoint(s)
Proxy API...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Internal translation to native API or SDK
Internal translation...
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-testbed-ref-arch.svg b/test/images/dash-testbed-ref-arch.svg index 13f6ba83b..f8d5724e7 100644 --- a/test/images/dash-testbed-ref-arch.svg +++ b/test/images/dash-testbed-ref-arch.svg @@ -1,4 +1,4 @@ -
DASH-SONiC Reference Test Architecture
DASH-SONiC Reference Test Architecture
Test System Controller
("Controller")
Test Syste...
DUT Config/Mgmt Interface(s)
("APIs")
DUT Config/Mg...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
API en...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Viewer does not support full SVG 1.1
\ No newline at end of file +
DASH-SONiC Reference Test Architecture
DASH-SONiC Reference Test Architecture
Test System Controller
("Controller")
Test Syste...
DUT Config/Mgmt Interface(s)
("APIs")
DUT Config/Mg...
Device Under Test ("DUT")
Device Under...
Traffic Interface
Cabling
Traffic Inter...
TrafficGen Control Interface
TrafficGen Control Interfa...
API endpoint(s)
API en...
Traffic Interfaces
("Ports")
Traffic Interfac...
DUT Host/
Chassis/Fixture
DUT Hos...
Test Traffic  Generator/Receiver ("TGen")
Test Traffic  Gener...
e.g. IXIA
e.g. I...
Viewer does not support full SVG 1.1
diff --git a/test/images/dash-testbed-tests.svg b/test/images/dash-testbed-tests.svg index 199c61491..3f823a3f7 100644 --- a/test/images/dash-testbed-tests.svg +++ b/test/images/dash-testbed-tests.svg @@ -1,4 +1,4 @@ -
P2
P2
P1
P1
P2
P2
P1
P1
P1
P1
P2
P2
P3
P3
P4
P4
P5
P5
P6
P6
P7
P7
P8
P8
P1
P1
P2
P2
P1
P1
P2
P2
#1
#1
#2
#2
#3
#3
N100G
N100G
CS
CS
CS
CS
DASH appliance #1
DASH appliance #1
DASH appliance #...
DASH appliance #...
XGS12-HSL
XGS12-HSL
mgmt
mgmt
mgmt
mgmt
mgmt
mgmt
mgmt
mgmt
P2
P2
P1
P1
mgmt
mgmt
P2
P2
P1
P1
mgmt
mgmt
VxLAN
VxLAN
VxLAN
VxLAN
management network
management network
IxNetwork API Server
IxNetwork API Server
IxLoad API Server
IxLoad API Server
Tests and test Env container
Tests and test Env container
mgmt
mgmt
Linux server
Linux server
Text is not SVG - cannot display
\ No newline at end of file +
P2
P2
P1
P1
P2
P2
P1
P1
P1
P1
P2
P2
P3
P3
P4
P4
P5
P5
P6
P6
P7
P7
P8
P8
P1
P1
P2
P2
P1
P1
P2
P2
#1
#1
#2
#2
#3
#3
N100G
N100G
CS
CS
CS
CS
DASH appliance #1
DASH appliance #1
DASH appliance #...
DASH appliance #...
XGS12-HSL
XGS12-HSL
mgmt
mgmt
mgmt
mgmt
mgmt
mgmt
mgmt
mgmt
P2
P2
P1
P1
mgmt
mgmt
P2
P2
P1
P1
mgmt
mgmt
VxLAN
VxLAN
VxLAN
VxLAN
management network
management network
IxNetwork API Server
IxNetwork API Server
IxLoad API Server
IxLoad API Server
Tests and test Env container
Tests and test Env container
mgmt
mgmt
Linux server
Linux server
Text is not SVG - cannot display
diff --git a/test/images/dash-thrift-sai-api.svg b/test/images/dash-thrift-sai-api.svg index 2ac81b05a..a1321d690 100644 --- a/test/images/dash-thrift-sai-api.svg +++ b/test/images/dash-thrift-sai-api.svg @@ -1,4 +1,4 @@ -
saithrift
Server
saithrift...
Test Controller
Test Controller
DASH SAI
API
DASH SAI...
ASIC SDK
ASIC SDK
NOT USED - For Reference Only
NOT USED - For Reference Only
Test Traffic  Generator/Receiver ("TGen")
Test Traffic...
e.g. IXIA
e.g. I...
DUT
DUT
X
X
libsai
libsai
Traffic
Traffic
Viewer does not support full SVG 1.1
\ No newline at end of file +
saithrift
Server
saithrift...
Test Controller
Test Controller
DASH SAI
API
DASH SAI...
ASIC SDK
ASIC SDK
NOT USED - For Reference Only
NOT USED - For Reference Only
Test Traffic  Generator/Receiver ("TGen")
Test Traffic...
e.g. IXIA
e.g. I...
DUT
DUT
X
X
libsai
libsai
Traffic
Traffic
Viewer does not support full SVG 1.1
diff --git a/test/images/ixia-c.dut.svg b/test/images/ixia-c.dut.svg index 006e60b95..abd16fc39 100644 --- a/test/images/ixia-c.dut.svg +++ b/test/images/ixia-c.dut.svg @@ -1,4 +1,4 @@ -
veth1
veth1
bmv2
bmv2
ixia-c-controller

:443
ixia-c-controller...
snappi
Client
snappi...
Ixia-C Deployment for Bidrectional Traffic
Ixia-C Deployment for Bidrectional Traffic
ixia-c-traffic-engine

:5555
ixia-c-traffic-engine...
ixia-c-traffic-engine

:5556
ixia-c-traffic-engine...
veth3
veth3
Open Traffic Generator API
Open Traffic Ge...
veth0
veth0
veth2
veth2
veth1
veth1
veth3
veth3
Text is not SVG - cannot display
\ No newline at end of file +
veth1
veth1
bmv2
bmv2
ixia-c-controller

:443
ixia-c-controller...
snappi
Client
snappi...
Ixia-C Deployment for Bidrectional Traffic
Ixia-C Deployment for Bidrectional Traffic
ixia-c-traffic-engine

:5555
ixia-c-traffic-engine...
ixia-c-traffic-engine

:5556
ixia-c-traffic-engine...
veth3
veth3
Open Traffic Generator API
Open Traffic Ge...
veth0
veth0
veth2
veth2
veth1
veth1
veth3
veth3
Text is not SVG - cannot display
diff --git a/test/images/test_vxlan_1vpc_1ip.svg b/test/images/test_vxlan_1vpc_1ip.svg index dc678de89..877bcc0d6 100644 --- a/test/images/test_vxlan_1vpc_1ip.svg +++ b/test/images/test_vxlan_1vpc_1ip.svg @@ -1,4 +1,4 @@ -
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22BGP%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%23ffcc99%3BstrokeColor%3D%2336393d%3Bopacity%3D60%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22600%22%20y%3D%22380%22%20width%3D%22120%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%...
Loopback
Loopback
IP's
IP's
VxLAN
VxLAN
MAC
MAC
OVERLAY
OVERLAY
VM 1 IP 
VM 1 IP 
VM 2 IP 
VM 2 IP 
VM 2 IP 
VM 2 IP 
VM 1 IP 
VM 1 IP 
DENY  all other IP's
DENY  all other IP's
ALLOW
ALLOW
DEVICE UNDER TEST
DEVICE UNDER TEST
UNDERLAY  (Interface 1)
UNDERLAY  (Interface 1)
BGP
BGP
VM 1
VM 1
IP's
IP's
MAC
MAC
OVERLAY
OVERLAY
VM 2
VM 2
BGP
BGP
VxLAN
VxLAN
physical interface
physical interface
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22BGP%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%23ffcc99%3BstrokeColor%3D%2336393d%3Bopacity%3D60%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22600%22%20y%3D%22380%22%20width%3D%22120%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%...
UNDERLAY  (Interface 2)
UNDERLAY  (Interface 2)
BGP
BGP
physical interface
physical interface
loopback
loopback
VxLAN
VxLAN
ALLOW
ALLOW
physical interface
physical interface
physical interface
physical interface
loopback
loopback
Bi Directional Traffic flowing between VM 1 and VM2
Bi Directional Traffic flowing between VM 1 and VM2
Text is not SVG - cannot display
\ No newline at end of file +
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22BGP%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%23ffcc99%3BstrokeColor%3D%2336393d%3Bopacity%3D60%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22600%22%20y%3D%22380%22%20width%3D%22120%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%...
Loopback
Loopback
IP's
IP's
VxLAN
VxLAN
MAC
MAC
OVERLAY
OVERLAY
VM 1 IP 
VM 1 IP 
VM 2 IP 
VM 2 IP 
VM 2 IP 
VM 2 IP 
VM 1 IP 
VM 1 IP 
DENY  all other IP's
DENY  all other IP's
ALLOW
ALLOW
DEVICE UNDER TEST
DEVICE UNDER TEST
UNDERLAY  (Interface 1)
UNDERLAY  (Interface 1)
BGP
BGP
VM 1
VM 1
IP's
IP's
MAC
MAC
OVERLAY
OVERLAY
VM 2
VM 2
BGP
BGP
VxLAN
VxLAN
physical interface
physical interface
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22BGP%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%23ffcc99%3BstrokeColor%3D%2336393d%3Bopacity%3D60%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22600%22%20y%3D%22380%22%20width%3D%22120%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%...
UNDERLAY  (Interface 2)
UNDERLAY  (Interface 2)
BGP
BGP
physical interface
physical interface
loopback
loopback
VxLAN
VxLAN
ALLOW
ALLOW
physical interface
physical interface
physical interface
physical interface
loopback
loopback
Bi Directional Traffic flowing between VM 1 and VM2
Bi Directional Traffic flowing between VM 1 and VM2
Text is not SVG - cannot display
diff --git a/test/targets/README.md b/test/targets/README.md index 3b79988a2..093f6ab88 100644 --- a/test/targets/README.md +++ b/test/targets/README.md @@ -1,2 +1,2 @@ # Targets Subdirectory -This directory contains device/vendor-specific information used to drive tests, for example device SKUs, capabilities, etc. \ No newline at end of file +This directory contains device/vendor-specific information used to drive tests, for example device SKUs, capabilities, etc. diff --git a/test/test-cases/functional/ptf/saidashvnet.py b/test/test-cases/functional/ptf/saidashvnet.py index 354480966..cf5d64200 100644 --- a/test/test-cases/functional/ptf/saidashvnet.py +++ b/test/test-cases/functional/ptf/saidashvnet.py @@ -1,3707 +1,3707 @@ -# Copyright 2022-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 VNET tests -""" - -from unittest import skipIf - -from sai_thrift.sai_headers import * -from sai_dash_utils import * - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class UnderlayRouteTest(VnetApiEndpoints, VnetTrafficMixin): - """ - L3 Underlay bidirectional routing test case - Verifies correct L3 underlay routing when overlay configuration exist - """ - - def runTest(self): - self.configureTest() - - self.verifyOverlayOutboundConfigTest() - - self.l3UnderlayHost1toHost2RoutingTest() - self.l3UnderlayHost2toHost1RoutingTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - # configure overlay outbound - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host.client.ip, - underlay_dip=self.rx_host.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - # configure underlay - self.host_1 = self.tx_host - self.host_2 = self.rx_host - - self.configure_underlay(self.host_1, self.host_2) - - def verifyOverlayOutboundConfigTest(self): - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=False) - print("Overlay config OK\n") - - def l3UnderlayHost1toHost2RoutingTest(self): - - host_1_pkt = simple_udp_packet(eth_src=self.host_1.mac, - eth_dst=self.host_1.peer.mac, - ip_dst=self.host_2.ip, - ip_src=self.host_1.ip, - ip_ttl=64) - host_1_exp_pkt = simple_udp_packet(eth_src=self.host_2.peer.mac, - eth_dst=self.host_2.mac, - ip_dst=self.host_2.ip, - ip_src=self.host_1.ip, - ip_ttl=63) - - print("Sending simple UDP packet host_1 -> host_2, expecting routed packet") - send_packet(self, self.host_1.port, host_1_pkt) - verify_packet(self, host_1_exp_pkt, self.host_2.port) - print("Underlay Host 1 to Host 2 OK\n") - - def l3UnderlayHost2toHost1RoutingTest(self): - - host_2_pkt = simple_udp_packet(eth_src=self.host_2.mac, - eth_dst=self.host_2.peer.mac, - ip_dst=self.host_1.ip, - ip_src=self.host_2.ip, - ip_ttl=64) - host_2_exp_pkt = simple_udp_packet(eth_src=self.host_1.peer.mac, - eth_dst=self.host_1.mac, - ip_dst=self.host_1.ip, - ip_src=self.host_2.ip, - ip_ttl=63) - - print("Sending simple UDP packet host_2 -> host_1, expecting routed packet") - send_packet(self, self.host_2.port, host_2_pkt) - verify_packet(self, host_2_exp_pkt, self.host_1.port) - print("Underlay Host 2 to Host 1 OK\n") - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapPaValidateSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action - with underlay config (neighbour + next hop) but without underlay routes - - Verifies positive and negative scenarios - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) - self.vnet2VnetInboundNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host.client.vni, - sip=self.tx_host.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet) - # PA validation entry with Permit action - self.pa_validation_create(self.tx_host.ip, src_vnet) - - def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): - """ - Inbound VNET to VNET test - Verifies correct packet routing - """ - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetInboundRoutingTest.__name__, ' OK') - - def vnet2VnetInboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong CA Dst MAC - - wrong PA Validation IP: pa validation missmatch - - wrong Physical SIP: routing missmatch - - wrong VIP - - wrong VNI - """ - - invalid_vni = 1000 - invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" - invalid_pa_sip = "10.10.5.1" # routing missmatch - invalid_vip = "10.10.10.10" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=False, - invalid_vni=invalid_vni, - invalid_outer_src_ip=invalid_pa_sip, - invalid_inner_dst_mac=invalid_ca_dst_mac, - invalid_vip=invalid_vip) - - invalid_pa_valid_ip = "10.10.1.25" # pa validation missmatch - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=False, - invalid_outer_src_ip=invalid_pa_valid_ip) - - print('\n', self.vnet2VnetInboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test(Vnet2VnetInboundDecapPaValidateSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action - with underlay config (neighbour + next hop) but without underlay routes - - Verifies positive and negative scenarios - """ - - def setUp(self): - super(Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapPaValidateTwoPortsTest(Vnet2VnetInboundDecapPaValidateSinglePortTest): - """ - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - - Verifies positive scenario - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) - self.vnet2VnetInboundNegativeTest() - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapPaValidateTwoPortsOverlayIpv6Test(Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - - Verifies positive scenario - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapSinglePortTest(Vnet2VnetInboundDecapPaValidateSinglePortTest): - """ - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP inbound routing entry action - with underlay config (neighbour + next hop) but without underlay routes - - Verifies positive and negative scenarios - """ - - def configureTest(self): - """ - Setup DUT overlay in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_create(eni_id, vni=self.tx_host.client.vni, - sip=self.tx_host.ip, sip_mask="255.255.255.0") - - def vnet2VnetInboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong CA Dst MAC - - wrong VIP - - wrong VNI - - wrong Physical SIP: routing missmatch - """ - - invalid_vni = 1000 - invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" - invalid_vip = "10.10.10.10" - invalid_pa_sip = "10.10.3.22" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=False, - invalid_vni=invalid_vni, - invalid_inner_dst_mac=invalid_ca_dst_mac, - invalid_vip=invalid_vip, - invalid_outer_src_ip=invalid_pa_sip) - - print('\n', self.vnet2VnetInboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapSinglePortOverlayIpv6Test(Vnet2VnetInboundDecapSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP inbound routing entry action - with underlay config (neighbour + next hop) but without underlay routes - - Verifies positive and negative scenarios - """ - - def setUp(self): - super(Vnet2VnetInboundDecapSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapTwoPortsTest(Vnet2VnetInboundDecapSinglePortTest): - """ - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP inbound routing entry action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - - Verifies positive scenario - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) - self.vnet2VnetInboundNegativeTest() - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundDecapTwoPortsOverlayIpv6Test(Vnet2VnetInboundDecapSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP inbound routing entry action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - - Verifies positive scenario - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Inbound Vnet to Vnet scenario test case with single eni and - multiple inbound routing entries (3 PA validate and 1 Decap) - with underlay config (neighbour + next hop) but without underlay routes - - Connections: - Positive scenarios: - tx_host_0 -> rx_host (ENI 0) with PA validation 0 - tx_host_1 -> rx_host (ENI 0) with PA validation 1 - tx_host_2 -> rx_host (ENI 0) with PA validation 2 - tx_host_3 -> rx_host (ENI 0) without PA validation - Negative scenarios: - tx_host_0 -> rx_host invalid VNI - tx_host_1 -> rx_host Invalid ENI mac - tx_host_2 -> rx_host Invalid PA IP - tx_host_3 -> rx_host invalid VIP - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) - self.vnet2VnetInboundRoutingNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="8.0.0.1", - ip_prefix="8.0.0.0/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.2.1", - client_vni=10) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="9.0.0.1", - ip_prefix="9.0.0.0/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:10:00:00:AA:20", - client_ip="192.168.3.1", - client_vni=30) - - self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="11.0.0.1", - ip_prefix="11.0.0.1/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:AA:00:23:CC:20", - client_ip="192.168.4.1", - client_vni=40) - - self.vip_create(self.tx_host_0.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) - src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) - src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) - - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - # ENI configuration - eni_id = self.eni_create(vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing decap - self.inbound_routing_decap_create(eni_id, vni=self.tx_host_3.client.vni, - sip=self.tx_host_3.ip, sip_mask="255.255.255.0") - - # Inbound routing decap PA Validate tx_host_0 - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, - sip=self.tx_host_0.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_0) - # PA validation entry with Permit action tx_host_0 - self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) - - # Inbound routing decap PA Validate tx_host_1 - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_1.client.vni, - sip=self.tx_host_1.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_1) - # PA validation entry with Permit action tx_host_1 - self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) - - # Inbound routing decap PA Validate tx_host_2 - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_2.client.vni, - sip=self.tx_host_2.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_2) - # PA validation entry with Permit action tx_host_2 - self.pa_validation_create(self.tx_host_2.ip, src_vnet_2) - - def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): - """ - Inbound VNET to VNET test - Verifies correct packet routing: - tx_host_0 -> rx_host (ENI 0) with PA validation 0 - tx_host_1 -> rx_host (ENI 0) with PA validation 1 - tx_host_2 -> rx_host (ENI 0) with PA validation 2 - tx_host_3 -> rx_host (ENI 0) without PA validation - """ - - print("\nVerifying Inbound pkt send tx_host_0 -> rx_host ...") - self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - print("\nVerifying Inbound pkt send tx_host_1 -> rx_host ...") - self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - print("\nVerifying Inbound pkt send tx_host_2 -> rx_host ...") - self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - print("\nVerifying Inbound pkt send tx_host_3 -> rx_host ...") - self.verify_traffic_scenario(client=self.tx_host_3, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') - - def vnet2VnetInboundRoutingNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - tx_host_0 -> rx_host invalid VNI - tx_host_1 -> rx_host Invalid ENI mac - tx_host_2 -> rx_host Invalid PA IP - tx_host_3 -> rx_host invalid VIP - """ - - invalid_vni = 200 - invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" - invalid_pa_sip = "10.10.5.1" # routing missmatch - invalid_vip = "10.10.10.10" - - print("\nVerifying Inbound pkt drop with invalid VNI tx_host_0 -> rx_host ...") - self.verify_negative_traffic_scenario(client=self.tx_host_0, server=self.rx_host, - fake_mac=False, - invalid_vni=invalid_vni) - print("OK") - - print("\nVerifying Inbound pkt drop with invalid ENI mac tx_host_1 -> rx_host ...") - self.verify_negative_traffic_scenario(client=self.tx_host_1, server=self.rx_host, - fake_mac=False, - invalid_inner_dst_mac=invalid_ca_dst_mac) - print("OK") - - print("\nVerifying Inbound pkt drop with invalid PA IP tx_host_2 -> rx_host ...") - self.verify_negative_traffic_scenario(client=self.tx_host_2, server=self.rx_host, - fake_mac=False, - invalid_outer_src_ip=invalid_pa_sip) - print("OK") - - print("\nVerifying Inbound pkt drop with invalid VIP tx_host_3 -> rx_host ...") - self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, - fake_mac=False, - invalid_vip=invalid_vip) - print("OK") - - print('\n', self.vnet2VnetInboundRoutingNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with single eni and - multiple inbound routing entries (3 PA validate and 1 Decap) - with underlay config (neighbour + next hop) but without underlay routes - - Connections: - Positive scenarios: - tx_host_0 -> rx_host (ENI 0) with PA validation 0 - tx_host_1 -> rx_host (ENI 0) with PA validation 1 - tx_host_2 -> rx_host (ENI 0) with PA validation 2 - tx_host_3 -> rx_host (ENI 0) without PA validation - """ - - def setUp(self): - super(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="8.0.0.1", - ip_prefix="8.0.0.0/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="cccc::60", - client_vni=10) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="9.0.0.1", - ip_prefix="9.0.0.0/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:10:00:00:AA:20", - client_ip="dddd::14", - client_vni=30) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="11.0.0.1", - ip_prefix="11.0.0.1/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:AA:00:23:CC:20", - client_ip="eeee::80", - client_vni=40) - - self.vip_create(self.tx_host_0.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) - src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) - src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) - - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - # ENI configuration - eni_id = self.eni_create(vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing decap - self.inbound_routing_decap_create(eni_id, vni=self.tx_host_3.client.vni, - sip=self.tx_host_3.ip, sip_mask="255.255.255.0") - - # Inbound routing decap PA Validate tx_host_0 - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, - sip=self.tx_host_0.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_0) - # PA validation entry with Permit action tx_host_0 - self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) - - # Inbound routing decap PA Validate tx_host_1 - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_1.client.vni, - sip=self.tx_host_1.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_1) - # PA validation entry with Permit action tx_host_1 - self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) - - # Inbound routing decap PA Validate tx_host_2 - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_2.client.vni, - sip=self.tx_host_2.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_2) - # PA validation entry with Permit action tx_host_2 - self.pa_validation_create(self.tx_host_2.ip, src_vnet_2) - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsTest(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest): - """ - Inbound Vnet to Vnet scenario test case with single eni and - multiple inbound routing entries (3 PA validate and 1 Decap) - with underlay config (2 neighbours, 2 next-hops, 5 routes) - - Connections: - Positive scenarios: - tx_host_0 -> rx_host (ENI 0) with PA validation 0 - tx_host_1 -> rx_host (ENI 0) with PA validation 1 - tx_host_2 -> rx_host (ENI 0) with PA validation 2 - tx_host_3 -> rx_host (ENI 0) without PA validation - """ - - def runTest(self): - self.configureTest() - self.configure_underlay() - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) - - def configure_underlay(self): - - rif_0 = self.router_interface_create(self.tx_host_0.peer.port, - src_mac=self.tx_host_0.peer.mac) - nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) - self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) - - self.route_create(self.tx_host_0.ip_prefix, nhop_0) - self.route_create(self.tx_host_1.ip_prefix, nhop_0) - self.route_create(self.tx_host_2.ip_prefix, nhop_0) - self.route_create(self.tx_host_3.ip_prefix, nhop_0) - - rif_1 = self.router_interface_create(self.rx_host.peer.port, - src_mac=self.rx_host.peer.mac) - nhop_1 = self.nexthop_create(rif_1, self.rx_host.ip) - self.neighbor_create(rif_1, self.rx_host.ip, self.rx_host.mac) - self.route_create(self.rx_host.ip_prefix, nhop_1) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with single eni and - multiple inbound routing entries (3 PA validate and 1 Decap) - with underlay config (2 neighbours, 2 next-hops, 5 routes) - - Connections: - Positive scenarios: - tx_host_0 -> rx_host (ENI 0) with PA validation 0 - tx_host_1 -> rx_host (ENI 0) with PA validation 1 - tx_host_2 -> rx_host (ENI 0) with PA validation 2 - tx_host_3 -> rx_host (ENI 0) without PA validation - """ - - def runTest(self): - self.configureTest() - self.configure_underlay() - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) - - def configure_underlay(self): - - rif_0 = self.router_interface_create(self.tx_host_0.peer.port, - src_mac=self.tx_host_0.peer.mac) - nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) - self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) - - self.route_create(self.tx_host_0.ip_prefix, nhop_0) - self.route_create(self.tx_host_1.ip_prefix, nhop_0) - self.route_create(self.tx_host_2.ip_prefix, nhop_0) - self.route_create(self.tx_host_3.ip_prefix, nhop_0) - - rif_1 = self.router_interface_create(self.rx_host_0.peer.port, - src_mac=self.rx_host_0.peer.mac) - nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) - self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) - self.route_create(self.rx_host_1.ip_prefix, nhop_1) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Inbound Vnet to Vnet scenario test case with - multiple inbound routing entries (2 PA validate and 1 Decap) - with underlay config (neighbour + next hop) but without underlay routes - - Connections: - Positive scenarios: - tx_host_0 -> rx_host_0 (ENI 0) with PA validation - tx_host_1 -> rx_host_1 (ENI 1) with PA validation - tx_host_2 -> rx_host_0 (ENI 0) without PA validation - Negative scenarios: - tx_host_0 -> rx_host_1 - tx_host_1 -> rx_host_0 - tx_host_2 -> rx_host_1 - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) - self.vnet2VnetInboundRoutingNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip=self.tx_host_0.ip, - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.2.1", - client_vni=10) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="9.0.0.1", - ip_prefix="9.0.0.0/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:10:00:00:AA:20", - client_ip="192.168.3.1", - client_vni=30) - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:06:17", - client_ip="192.168.4.1", - client_vni=20) - - self.vip_create(self.tx_host_0.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host_0.client.vni) - self.direction_lookup_create(self.rx_host_1.client.vni) - - src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) - src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) - - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - - # ENI 0 configuration - eni_id_0 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host_0.ip), - vm_vni=self.rx_host_0.client.vni, - vnet_id=dst_vnet_0) - self.eni_mac_map_create(eni_id_0, self.rx_host_0.client.mac) # ENI MAC - - # Inbound routing decap - self.inbound_routing_decap_create(eni_id_0, vni=self.tx_host_2.client.vni, - sip=self.tx_host_2.ip, sip_mask="255.255.255.0") - - # Inbound routing decap PA Validate - self.inbound_routing_decap_validate_create(eni_id_0, vni=self.tx_host_0.client.vni, - sip=self.tx_host_0.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_0) - # PA validation entry with Permit action - self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) - - # ENI 1 configuration - eni_id_1 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host_1.ip), - vm_vni=self.rx_host_1.client.vni, - vnet_id=dst_vnet_1) - self.eni_mac_map_create(eni_id_1, self.rx_host_1.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_validate_create(eni_id_1, vni=self.tx_host_1.client.vni, - sip=self.tx_host_1.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_1) - # PA validation entry with Permit action - self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) - - def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): - """ - Inbound VNET to VNET test - Verifies correct packet routing: - tx_host_0 -> rx_host_0 (ENI 0) with PA validation - tx_host_1 -> rx_host_1 (ENI 1) with PA validation - tx_host_2 -> rx_host_0 (ENI 0) without PA validation - """ - - print("\nVerifying Inbound pkt send tx_host_0 -> rx_host_0 ...") - self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host_0, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - print("\nVerifying Inbound pkt send tx_host_1 -> rx_host_1 ...") - self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host_1, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - print("\nVerifying Inbound pkt send tx_host_2 -> rx_host_0 ...") - self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host_0, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - print("OK") - - - print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') - - def vnet2VnetInboundRoutingNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - tx_host_0 -> rx_host_1 - tx_host_1 -> rx_host_0 - tx_host_2 -> rx_host_1 - """ - - print("\nVerifying Inbound pkt drop tx_host_0 -> rx_host_1 ...") - self.verify_negative_traffic_scenario(client=self.tx_host_0, server=self.rx_host_1, - fake_mac=False, valid_pkt_drop=True) - print("OK") - - print("\nVerifying Inbound pkt drop tx_host_1 -> rx_host_0 ...") - self.verify_negative_traffic_scenario(client=self.tx_host_1, server=self.rx_host_0, - fake_mac=False, valid_pkt_drop=True) - print("OK") - - print("\nVerifying Inbound pkt drop tx_host_2 -> rx_host_1 ...") - self.verify_negative_traffic_scenario(client=self.tx_host_2, server=self.rx_host_1, - fake_mac=False, valid_pkt_drop=True) - print("OK") - - print('\n', self.vnet2VnetInboundRoutingNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - multiple inbound routing entries (2 PA validate and 1 Decap) - with underlay config (neighbour + next hop) but without underlay routes - - Connections: - Positive scenarios: - tx_host_0 -> rx_host_0 (ENI 0) with PA validation - tx_host_1 -> rx_host_1 (ENI 1) with PA validation - tx_host_2 -> rx_host_0 (ENI 0) without PA validation - Negative scenarios: - tx_host_0 -> rx_host_1 - tx_host_1 -> rx_host_0 - tx_host_2 -> rx_host_1 - """ - - def setUp(self): - super(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip=self.tx_host_0.ip, - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="cccc::30", - client_vni=10) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="9.0.0.1", - ip_prefix="9.0.0.0/24", - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:10:00:00:AA:20", - client_ip="dddd::40", - client_vni=30) - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:06:17", - client_ip="eeee::50", - client_vni=20) - - self.vip_create(self.tx_host_0.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host_0.client.vni) - self.direction_lookup_create(self.rx_host_1.client.vni) - - src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) - src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) - - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - - # ENI 0 configuration - eni_id_0 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host_0.ip), - vm_vni=self.rx_host_0.client.vni, - vnet_id=dst_vnet_0) - self.eni_mac_map_create(eni_id_0, self.rx_host_0.client.mac) # ENI MAC - - # Inbound routing decap - self.inbound_routing_decap_create(eni_id_0, vni=self.tx_host_2.client.vni, - sip=self.tx_host_2.ip, sip_mask="255.255.255.0") - - # Inbound routing decap PA Validate - self.inbound_routing_decap_validate_create(eni_id_0, vni=self.tx_host_0.client.vni, - sip=self.tx_host_0.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_0) - # PA validation entry with Permit action - self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) - - # ENI 1 configuration - eni_id_1 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host_1.ip), - vm_vni=self.rx_host_1.client.vni, - vnet_id=dst_vnet_1) - self.eni_mac_map_create(eni_id_1, self.rx_host_1.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_validate_create(eni_id_1, vni=self.tx_host_1.client.vni, - sip=self.tx_host_1.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet_1) - # PA validation entry with Permit action - self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsTest(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest): - """ - Inbound Vnet to Vnet scenario test case with - multiple inbound routing entries (2 PA validate and 1 Decap) - with underlay config (2 neighbours, 2 next-hops, 3 routes) - - Connections: - Positive scenarios: - tx_host_0 -> rx_host_0 (ENI 0) with PA validation - tx_host_1 -> rx_host_1 (ENI 1) with PA validation - tx_host_2 -> rx_host_0 (ENI 0) without PA validation - """ - - def runTest(self): - self.configureTest() - self.configure_underlay() - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) - - def configure_underlay(self): - rif_0 = self.router_interface_create(self.tx_host_0.peer.port, - src_mac=self.tx_host_0.peer.mac) - nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) - self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) - self.route_create(self.tx_host_0.ip_prefix, nhop_0) - self.route_create(self.tx_host_2.ip_prefix, nhop_0) - - rif_1 = self.router_interface_create(self.rx_host_0.peer.port, - src_mac=self.rx_host_0.peer.mac) - nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) - self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) - self.route_create(self.rx_host_1.ip_prefix, nhop_1) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - multiple inbound routing entries (2 PA validate and 1 Decap) - with underlay config (2 neighbours, 2 next-hops, 3 routes) - - Connections: - Positive scenarios: - tx_host_0 -> rx_host_0 (ENI 0) with PA validation - tx_host_1 -> rx_host_1 (ENI 1) with PA validation - tx_host_2 -> rx_host_0 (ENI 0) without PA validation - """ - - def runTest(self): - self.configureTest() - self.configure_underlay() - - self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) - - def configure_underlay(self): - rif_0 = self.router_interface_create(self.tx_host_0.peer.port, - src_mac=self.tx_host_0.peer.mac) - nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) - self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) - self.route_create(self.tx_host_0.ip_prefix, nhop_0) - self.route_create(self.tx_host_2.ip_prefix, nhop_0) - - rif_1 = self.router_interface_create(self.rx_host_0.peer.port, - src_mac=self.rx_host_0.peer.mac) - nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) - self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) - self.route_create(self.rx_host_1.ip_prefix, nhop_1) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries - with underlay config (neighbour + next hop) but without underlay routes - - Verifies positive and negative scenarios - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host_0, add_routes=False) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.1.20", - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.2.1", - client_vni=self.tx_host_0.client.vni) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.1.189", - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:10:00:00:AA:20", - client_ip="192.168.3.1", - client_vni=self.tx_host_0.client.vni) - - self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.1.200", # for PA validate missmatch - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:AA:00:23:CC:20", - client_ip="192.168.4.1", - client_vni=self.tx_host_0.client.vni) - - self.tx_host_4 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.2.20", # for Inbound route missmatch - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:BB:00:00:AC:A0", - client_ip="192.168.4.1", - client_vni=self.tx_host_0.client.vni) - - self.vip_create(self.tx_host_0.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host_0.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, - sip=self.tx_host_0.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet) - # PA validation entries with Permit action - self.pa_validation_create(self.tx_host_0.ip, src_vnet) - self.pa_validation_create(self.tx_host_1.ip, src_vnet) - self.pa_validation_create(self.tx_host_2.ip, src_vnet) - - def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): - """ - Inbound VNET to VNET test - Verifies correct packet routing - """ - - print(f"\nPA validate {self.tx_host_0.ip} verification, expect pass") - self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - - print(f"\nPA validate {self.tx_host_1.ip} verification, expect pass") - self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - - print(f"\nPA validate {self.tx_host_2.ip} verification, expect pass") - self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - - print(f"\nPA validate {self.tx_host_3.ip} verification, expect drop - PA validation missmatch") - self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, - fake_mac=False, valid_pkt_drop=True) - - print(f"\nPA validate {self.tx_host_4.ip} verification, expect drop - Inbound route missmatch") - self.verify_negative_traffic_scenario(client=self.tx_host_4, server=self.rx_host, - fake_mac=False, valid_pkt_drop=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries - with underlay config (neighbour + next hop) but without underlay routes - - Verifies positive and negative scenarios - """ - - def setUp(self): - super(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test, self).setUp(overlay_ipv6=True) - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host_0, add_routes=False) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.1.15", - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="cccc::40", - client_vni=self.tx_host_0.client.vni) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.1.100", - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:10:00:00:AA:20", - client_ip="dddd::50", - client_vni=self.tx_host_0.client.vni) - - self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.1.3", # for PA validate missmatch - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:AA:00:23:CC:20", - client_ip="eeee::60", - client_vni=self.tx_host_0.client.vni) - - self.tx_host_4 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip="10.10.12.20", # for Inbound route missmatch - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:BB:00:00:AC:A0", - client_ip="2603::10", - client_vni=self.tx_host_0.client.vni) - - self.vip_create(self.tx_host_0.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host_0.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, - sip=self.tx_host_0.ip, sip_mask="255.255.255.0", - src_vnet_id=src_vnet) - # PA validation entries with Permit action - self.pa_validation_create(self.tx_host_0.ip, src_vnet) - self.pa_validation_create(self.tx_host_1.ip, src_vnet) - self.pa_validation_create(self.tx_host_2.ip, src_vnet) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsTest(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest): - """ - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries - with full underlay config (2 neighbours + 2 next hops + 2 routes) - - Verifies positive and negative scenarios - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host_0, self.rx_host) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsIpv6Test(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound Vnet to Vnet scenario test case with - VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries - with underlay config (2 neighbours + 2 next hops + 2 routes) - - Verifies positive and negative scenarios - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host_0, self.rx_host) - - self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundEniSetUpDownSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Inbound Vnet to Vnet test scenario - Verifies packets forwarding/drop in accordance with ENI admin state - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.eni_set_admin_state(self.eni_id, "down") - self.vnet2VnetEniDownTrafficTest() - self.eni_set_admin_state(self.eni_id, "up") - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT overlay in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.rx_host.client.vni) - - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - self.eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.rx_host.ip), - vm_vni=self.rx_host.client.vni, - vnet_id=dst_vnet) - self.eni_mac_map_create(self.eni_id, self.rx_host.client.mac) # ENI MAC - - # Inbound routing PA Validate - self.inbound_routing_decap_create(self.eni_id, vni=self.tx_host.client.vni, - sip=self.tx_host.ip, sip_mask="255.255.255.0") - - def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): - """ - Verifies inbound packet routing when ENI admin state is UP - """ - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') - - def vnet2VnetEniDownTrafficTest(self): - """ - Verifies inbound packet drop when ENI admin state is DOWN - """ - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=False, valid_pkt_drop=True) - - print('\n', self.vnet2VnetEniDownTrafficTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundEniSetUpDownTwoPortsTest(Vnet2VnetInboundEniSetUpDownSinglePortTest): - """ - Inbound Vnet to Vnet test scenario - Verifies packets forwarding/drop in accordance with ENI admin state - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.eni_set_admin_state(self.eni_id, "down") - self.vnet2VnetEniDownTrafficTest() - self.eni_set_admin_state(self.eni_id, "up") - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) - self.vnet2VnetOutboundNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - # outbound routing - self.outbound_routing_vnet_direct_create(eni_id, "192.168.1.0/24", dst_vnet, - overlay_ip="192.168.1.10") - self.outbound_ca_to_pa_create(dst_vnet, # DST vnet id - "192.168.1.10", # DST IP addr - self.rx_host.ip, # Underlay DIP - overlay_dmac=self.rx_host.client.mac) - - def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): - """ - Outbound VNET to VNET test - Verifies correct packet routing - """ - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') - - def vnet2VnetOutboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "192.168.200.200" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action - with underlay config (neighbour + next hop) but without underlay routes - """ - - def setUp(self): - super(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - # outbound routing - self.outbound_routing_vnet_direct_create(eni_id, "bbbb::0/64", dst_vnet, - overlay_ip="bbbb::bc") - self.outbound_ca_to_pa_create(dst_vnet, # DST vnet id - "bbbb::bc", # DST IP addr - self.rx_host.ip, # Underlay DIP - overlay_dmac=self.rx_host.client.mac) - - def vnet2VnetOutboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "dddd::dc" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectTwoPortsTest(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): - """ - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - self.vnet2VnetOutboundNegativeTest() - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetDirectTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) - self.vnet2VnetOutboundNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host.client.ip, - underlay_dip=self.rx_host.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): - """ - Outbound VNET to VNET test - Verifies correct packet routing - """ - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') - - - def vnet2VnetOutboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "192.168.200.200" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - wrong_inner_dst_ip = "192.168.1.200" - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) - - print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteVnetSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action - with underlay config (neighbour + next hop) but without underlay routes - """ - def setUp(self): - super(Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host.client.ip, - underlay_dip=self.rx_host.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - def vnet2VnetOutboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "dddd::dc" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - wrong_inner_dst_ip = "bbbb::dc" - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, - invalid_inner_dst_ip=wrong_inner_dst_ip) - - print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetTwoPortsTest(Vnet2VnetOutboundRouteVnetSinglePortTest): - """ - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - self.vnet2VnetOutboundNegativeTest() - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteVnetTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundEniSetUpDownSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario - Verifies packets forwarding/drop in accordance with ENI admin state - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.eni_set_admin_state(self.eni_id, "down") - self.vnet2VnetEniDownTrafficTest() - self.eni_set_admin_state(self.eni_id, "up") - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - self.eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(self.eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=self.eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host.client.ip, - underlay_dip=self.rx_host.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): - """ - Verifies correct outbound packet routing when ENI admin state is UP - """ - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') - - def vnet2VnetEniDownTrafficTest(self): - """ - Verifies outbound packet drop when ENI admin state is DOWN - """ - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, valid_pkt_drop=True) - - print('\n', self.vnet2VnetEniDownTrafficTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundEniSetUpDownTwoPortsTest(Vnet2VnetOutboundEniSetUpDownSinglePortTest): - """ - Outbound Vnet to Vnet test scenario - Verifies packets forwarding/drop in accordance with ENI admin state - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - self.eni_set_admin_state(self.eni_id, "down") - self.vnet2VnetEniDownTrafficTest() - self.eni_set_admin_state(self.eni_id, "up") - self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteDirectSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.outboundRouteDirectTest(tx_equal_to_rx=True) - self.outboundRouteDirectNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.client.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) - - # outbound routing - self.outbound_routing_direct_create(eni_id, "192.168.1.0/24") - - def outboundRouteDirectTest(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, - connection=self.connection, fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx, - route_direct=True) - - def outboundRouteDirectNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "192.168.200.200" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - wrong_inner_dst_ip = "192.168.1.200" - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, - invalid_inner_dst_ip=wrong_inner_dst_ip) - - print('\n', self.outboundRouteDirectNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteDirectSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action - with underlay config (neighbour + next hop) but without underlay routes - """ - - def setUp(self): - super(Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.vip_create(self.tx_host.client.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) - - # outbound routing - self.outbound_routing_direct_create(eni_id, "bbbb::0/64") - - def outboundRouteDirectNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "dddd::dc" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - wrong_inner_dst_ip = "bbbb::dc" - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, - invalid_inner_dst_ip=wrong_inner_dst_ip) - - print('\n', self.outboundRouteDirectNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteDirectTwoPortsTest(Vnet2VnetOutboundRouteDirectSinglePortTest): - """ - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.outboundRouteDirectTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundRouteDirectTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with Outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.outboundRouteDirectTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - # Reconfigure configuration for tx equal to rx - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) - self.vnet2VnetOutboundNegativeTest() - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.1.17", - client_vni=self.rx_host_0.client.vni) - - self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:08:18", - client_ip="192.168.1.199", - client_vni=self.rx_host_0.client.vni) - - self.rx_host_3 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:10:00:00:AA:E1", - client_ip="192.168.1.77", - client_vni=self.rx_host_0.client.vni) - - self.vip_create(self.tx_host.peer.ip) - - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host_0.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host_0.client.mac, - use_dst_vnet_vni=True) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=True) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_2.client.ip, - underlay_dip=self.rx_host_2.ip, - overlay_dmac=self.rx_host_2.client.mac, - use_dst_vnet_vni=True) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_3.client.ip, - underlay_dip=self.rx_host_3.ip, - overlay_dmac=self.rx_host_3.client.mac, - use_dst_vnet_vni=False) - - def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): - """ - Outbound VNET to VNET test - Verifies correct packet routing - """ - - print(f"\nVerify outbound route to CA {self.rx_host_0.client.ip}, expect pass") - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print(f"\nVerify outbound route to CA {self.rx_host_1.client.ip}, expect pass") - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print(f"\nVerify outbound route to CA {self.rx_host_2.client.ip}, expect pass") - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_2, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print(f"\nVerify outbound route to CA {self.rx_host_3.client.ip} and use_dst_vnet=False, expect pass") - self.rx_host_3.client.vni = self.tx_host.client.vni - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_3, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') - - def vnet2VnetOutboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "192.168.200.200" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - wrong_inner_dst_ip = "192.168.1.200" - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) - - print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries - with underlay config (neighbour + next hop) but without underlay routes - """ - - def setUp(self): - super(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="bbbb:0000:0000:0000:1234::00", - client_vni=self.rx_host_0.client.vni) - - self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:08:18", - client_ip="bbbb:0000:0000:0000:0000:ab12::00", - client_vni=self.rx_host_0.client.vni) - - self.rx_host_3 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:10:00:00:AA:E1", - client_ip="bbbb::40", - client_vni=self.rx_host_0.client.vni) - - self.vip_create(self.tx_host.peer.ip) - - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host_0.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host_0.client.mac, - use_dst_vnet_vni=True) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=True) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_2.client.ip, - underlay_dip=self.rx_host_2.ip, - overlay_dmac=self.rx_host_2.client.mac, - use_dst_vnet_vni=True) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host_3.client.ip, - underlay_dip=self.rx_host_3.ip, - overlay_dmac=self.rx_host_3.client.mac, - use_dst_vnet_vni=False) - - def vnet2VnetOutboundNegativeTest(self): - """ - Verifies negative scenarios (packet drop): - - wrong VIP - - routing drop (CA Dst IP does not match any routing entry) - - wrong CA Src MAC (does not match any ENI) - - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) - """ - - invalid_vip = "10.10.10.10" - wrong_inner_dst_ip = "bbbb:0000:0000:1111::00" - wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" - - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_vip=invalid_vip, - invalid_inner_dst_ip=wrong_inner_dst_ip, - invalid_inner_src_mac=wrong_inner_src_ca_mac) - - wrong_inner_dst_ip = "bbbb::33" - self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, - fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) - - print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsTest(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest): - """ - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries - with full underlay config (2 neighbours + 2 next hops + 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsIpv6Test(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 - Outbound Vnet to Vnet test scenario with outbound routing entry - SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=True) - self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.2.1", - client_vni=3) - - # Overlay routing - self.vip_create(self.tx_host.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet_0) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.2.0/24", - dst_vnet_id=dst_vnet_1) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=False) - - def vnet2VnetOutboundDstVnetIdTrueTest(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetOutboundDstVnetIdTrueTest.__name__, ' OK') - - def vnet2VnetOutboundDstVnetIdFalseTest(self, tx_equal_to_rx): - - # For use_dst_vnet_vni=False verification change rx client vni to tx client vni - self.rx_host_1.client.vni = self.tx_host.client.vni - - self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, - connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.vnet2VnetOutboundDstVnetIdFalseTest.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET - with underlay config (neighbour + next hop) but without underlay routes - """ - - def setUp(self): - super(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="cccc::30", - client_vni=3) - - # Overlay routing - self.vip_create(self.tx_host.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet_0) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="cccc::0/64", - dst_vnet_id=dst_vnet_1) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsTest(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): - """ - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) - self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) - self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): - """ - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=True) - self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.2.1", - client_vni=3) - - # Overlay routing - self.vip_create(self.tx_host.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet_0, - overlay_ip="192.168.1.111") - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip="192.168.1.111", - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="192.168.2.0/24", - dst_vnet_id=dst_vnet_1, - overlay_ip="192.168.2.222") - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip="192.168.2.222", - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT - with underlay config (neighbour + next hop) but without underlay routes - """ - - def setUp(self): - super(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="cccc::30", - client_vni=3) - - # Overlay routing - self.vip_create(self.tx_host.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet_0, - overlay_ip="bbbb::bc") - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip="bbbb::bc", - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="cccc::0/64", - dst_vnet_id=dst_vnet_1, - overlay_ip="cccc::bc") - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip="cccc::bc", - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortsTest(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest): - """ - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) - self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortstOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario that verifies - CA to PA entry use_dst_vnet_vni attribute True and False values - when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) - self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Inbound and Outbound Vnet to Vnet test scenario - Verifies overlay routing with multiple inbound/outbound configurations - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.host_0, self.host_2, add_routes=False) - - self.outboundHost0toHost2Test(tx_equal_to_rx=True) - self.inboundHost2toHost0Test(tx_equal_to_rx=True) - - self.outboundHost3toHost1Test(tx_equal_to_rx=True) - self.inboundHost1toHost3Test(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - - host_0.client (vni 1) ca ip: 192.168.0.1 (eni_0) <---> host_2.client (vni 2) ca ip: 192.168.1.1 - host_1.client (vni 10) ca ip: 192.168.2.1 <---> (eni_3) host_3.client (vni 20) ca ip: 192.168.3.1 - """ - - self.host_0 = self.tx_host - - self.host_1 = self.define_neighbor_network(port=self.host_0.port, - mac=self.host_0.mac, - ip=self.host_0.ip, - ip_prefix=self.host_0.ip_prefix, - peer_port=self.host_0.peer.port, - peer_mac=self.host_0.peer.mac, - peer_ip=self.host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="192.168.2.1", - client_vni=10) - self.host_2 = self.rx_host - - self.host_3 = self.define_neighbor_network(port=self.host_2.port, - mac=self.host_2.mac, - ip=self.host_2.ip, - ip_prefix=self.host_2.ip_prefix, - peer_port=self.host_2.peer.port, - peer_mac=self.host_2.peer.mac, - peer_ip=self.host_2.peer.ip, - client_mac="00:04:00:00:06:17", - client_ip="192.168.3.1", - client_vni=20) - # Overlay routing - self.vip_create(self.host_0.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.host_0.client.vni) - self.direction_lookup_create(self.host_3.client.vni) - - host_0_vnet = self.vnet_create(vni=self.host_0.client.vni) - host_1_vnet = self.vnet_create(vni=self.host_1.client.vni) - - host_2_vnet = self.vnet_create(vni=self.host_2.client.vni) - host_3_vnet = self.vnet_create(vni=self.host_3.client.vni) - - eni_id_0 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.host_0.ip), - vm_vni=self.host_0.client.vni, - vnet_id=host_0_vnet) - self.eni_mac_map_create(eni_id_0, self.host_0.client.mac) - - eni_id_3 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.host_3.ip), - vm_vni=self.host_3.client.vni, - vnet_id=host_3_vnet) - self.eni_mac_map_create(eni_id_3, self.host_3.client.mac) - - # ENI 0 inbound/outbound routing - self.inbound_routing_decap_validate_create(eni_id=eni_id_0, vni=self.host_2.client.vni, - sip=self.host_2.ip, sip_mask="255.255.255.0", - src_vnet_id=host_2_vnet) - self.pa_validation_create(sip=self.host_2.ip, - vnet_id=host_2_vnet) - - self.outbound_routing_vnet_create(eni_id_0, lpm="192.168.1.0/24", - dst_vnet_id=host_2_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=host_2_vnet, - dip=self.host_2.client.ip, - underlay_dip=self.host_2.ip, - overlay_dmac=self.host_2.client.mac) - - # ENI 3 inbound/outbound routing - self.inbound_routing_decap_validate_create(eni_id=eni_id_3, vni=self.host_1.client.vni, - sip=self.host_1.ip, sip_mask="255.255.255.0", - src_vnet_id=host_1_vnet) - self.pa_validation_create(sip=self.host_1.ip, - vnet_id=host_1_vnet) - - self.outbound_routing_vnet_create(eni_id_3, lpm="192.168.2.0/24", - dst_vnet_id=host_1_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=host_1_vnet, - dip=self.host_1.client.ip, - underlay_dip=self.host_1.ip, - overlay_dmac=self.host_1.client.mac) - - def outboundHost0toHost2Test(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.host_0, - server=self.host_2, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.outboundHost0toHost2Test.__name__, ' OK') - - def inboundHost2toHost0Test(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.host_2, - server=self.host_0, - connection=self.connection, - fake_mac=False, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.inboundHost2toHost0Test.__name__, ' OK') - - def outboundHost3toHost1Test(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.host_3, - server=self.host_1, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.outboundHost3toHost1Test.__name__, ' OK') - - def inboundHost1toHost3Test(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.host_1, - server=self.host_3, - connection=self.connection, - fake_mac=False, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.inboundHost1toHost3Test.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundOutboundMultipleConfigsSinglePortOverlayIpv6Test(Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound and Outbound Vnet to Vnet test scenario - Verifies overlay routing with multiple inbound/outbound configurations - with underlay config (neighbour + next hop) but without underlay routes - """ - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - - host_0.client (vni 1) ca ipv6: aaaa::10 (eni_0) <---> host_2.client (vni 2) ca ipv6: bbbb::20 - host_1.client (vni 10) ca ipv6: cccc::30 <---> (eni_3) host_3.client (vni 20) ca ipv6: dddd::40 - """ - - self.host_0 = self.tx_host - - self.host_1 = self.define_neighbor_network(port=self.host_0.port, - mac=self.host_0.mac, - ip=self.host_0.ip, - ip_prefix=self.host_0.ip_prefix, - peer_port=self.host_0.peer.port, - peer_mac=self.host_0.peer.mac, - peer_ip=self.host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip="cccc::30", - client_vni=10) - self.host_2 = self.rx_host - - self.host_3 = self.define_neighbor_network(port=self.host_2.port, - mac=self.host_2.mac, - ip=self.host_2.ip, - ip_prefix=self.host_2.ip_prefix, - peer_port=self.host_2.peer.port, - peer_mac=self.host_2.peer.mac, - peer_ip=self.host_2.peer.ip, - client_mac="00:04:00:00:06:17", - client_ip="dddd::40", - client_vni=20) - # Overlay routing - self.vip_create(self.host_0.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.host_0.client.vni) - self.direction_lookup_create(self.host_3.client.vni) - - host_0_vnet = self.vnet_create(vni=self.host_0.client.vni) - host_1_vnet = self.vnet_create(vni=self.host_1.client.vni) - - host_2_vnet = self.vnet_create(vni=self.host_2.client.vni) - host_3_vnet = self.vnet_create(vni=self.host_3.client.vni) - - eni_id_0 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.host_0.ip), - vm_vni=self.host_0.client.vni, - vnet_id=host_0_vnet) - self.eni_mac_map_create(eni_id_0, self.host_0.client.mac) - - eni_id_3 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.host_3.ip), - vm_vni=self.host_3.client.vni, - vnet_id=host_3_vnet) - self.eni_mac_map_create(eni_id_3, self.host_3.client.mac) - - # ENI 0 inbound/outbound routing - self.inbound_routing_decap_validate_create(eni_id=eni_id_0, vni=self.host_2.client.vni, - sip=self.host_2.ip, sip_mask="255.255.255.0", - src_vnet_id=host_2_vnet) - self.pa_validation_create(sip=self.host_2.ip, - vnet_id=host_2_vnet) - - self.outbound_routing_vnet_create(eni_id_0, lpm="bbbb::0/64", - dst_vnet_id=host_2_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=host_2_vnet, - dip=self.host_2.client.ip, - underlay_dip=self.host_2.ip, - overlay_dmac=self.host_2.client.mac) - - # ENI 3 inbound/outbound routing - self.inbound_routing_decap_validate_create(eni_id=eni_id_3, vni=self.host_1.client.vni, - sip=self.host_1.ip, sip_mask="255.255.255.0", - src_vnet_id=host_1_vnet) - self.pa_validation_create(sip=self.host_1.ip, - vnet_id=host_1_vnet) - - self.outbound_routing_vnet_create(eni_id_3, lpm="cccc::0/64", - dst_vnet_id=host_1_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=host_1_vnet, - dip=self.host_1.client.ip, - underlay_dip=self.host_1.ip, - overlay_dmac=self.host_1.client.mac) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundOutboundMultipleConfigsTwoPortsTest(Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest): - """ - Inbound and Outbound Vnet to Vnet test scenario - Verifies overlay routing with multiple inbound/outbound configurations - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.host_0, self.host_2, - add_routes=True) - - self.outboundHost0toHost2Test(tx_equal_to_rx=False) - self.inboundHost2toHost0Test(tx_equal_to_rx=False) - - self.outboundHost3toHost1Test(tx_equal_to_rx=False) - self.inboundHost1toHost3Test(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetInboundOutboundMultipleConfigsTwoPortsOverlayIpv6Test(Vnet2VnetInboundOutboundMultipleConfigsSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Inbound and Outbound Vnet to Vnet test scenario - Verifies overlay routing with multiple inbound/outbound configurations - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.host_0, self.host_2, - add_routes=True) - - self.outboundHost0toHost2Test(tx_equal_to_rx=False) - self.inboundHost2toHost0Test(tx_equal_to_rx=False) - - self.outboundHost3toHost1Test(tx_equal_to_rx=False) - self.inboundHost1toHost3Test(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario when multiple ENI and - Outbound routing entries exist with the same CA IP prefixes - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host_0, add_routes=False) - - self.outboundEni0Test(tx_equal_to_rx=True) - self.outboundEni1Test(tx_equal_to_rx=True) - self.outboundEni2Test(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - - 192.168.0.1 -> 192.168.1.1 - tx_host_0 (vni 1) -> rx_host_0 (vni 2) - tx_host_1 (vni 10) -> rx_host_1 (vni 20) - tx_host_2 (vni 100) -> rx_host_2 (vni 200) - """ - - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip=self.tx_host_0.ip, - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip=self.tx_host_0.client.ip, - client_vni=10) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip=self.tx_host_0.ip, - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:04:00:00:06:17", - client_ip=self.tx_host_0.client.ip, - client_vni=100) - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:06:17", - client_ip=self.rx_host.client.ip, - client_vni=20) - - self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:06:00:00:07:18", - client_ip=self.rx_host.client.ip, - client_vni=200) - - # Overlay routing - self.vip_create(self.tx_host_0.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host_0.client.vni) - self.direction_lookup_create(self.tx_host_1.client.vni) - self.direction_lookup_create(self.tx_host_2.client.vni) - - src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) - src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) - src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) - - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) - - eni_id_0 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host_0.ip), - vm_vni=self.tx_host_0.client.vni, - vnet_id=src_vnet_0) - self.eni_mac_map_create(eni_id=eni_id_0, mac=self.tx_host_0.client.mac) - - eni_id_1 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host_1.ip), - vm_vni=self.tx_host_1.client.vni, - vnet_id=src_vnet_1) - self.eni_mac_map_create(eni_id=eni_id_1, mac=self.tx_host_1.client.mac) - - eni_id_2 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host_2.ip), - vm_vni=self.tx_host_2.client.vni, - vnet_id=src_vnet_2) - self.eni_mac_map_create(eni_id=eni_id_2, mac=self.tx_host_2.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_create(eni_id=eni_id_0, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet_0) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host_0.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_create(eni_id=eni_id_1, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet_1) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=False) - - self.outbound_routing_vnet_direct_create(eni_id=eni_id_2, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet_2, - overlay_ip="192.168.1.111") - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, - dip="192.168.1.111", - underlay_dip=self.rx_host_2.ip, - overlay_dmac=self.rx_host_2.client.mac, - use_dst_vnet_vni=True) - - def outboundEni0Test(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.tx_host_0, - server=self.rx_host_0, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.outboundEni0Test.__name__, ' OK') - - def outboundEni1Test(self, tx_equal_to_rx): - - # For use_dst_vnet_vni=False verification change rx client vni to tx client vni - self.rx_host_1.client.vni = self.tx_host_1.client.vni - - self.verify_traffic_scenario(client=self.tx_host_1, - server=self.rx_host_1, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.outboundEni1Test.__name__, ' OK') - - def outboundEni2Test(self, tx_equal_to_rx): - - self.verify_traffic_scenario(client=self.tx_host_2, - server=self.rx_host_2, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.outboundEni2Test.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario when multiple ENI and - Outbound routing entries exist with the same CA IP prefixes - with underlay config (neighbour + next hop) but without underlay routes - """ - - def setUp(self): - super(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - - CA: aaaa::10 -> bbbb::20 - tx_host_0 (vni 1) -> rx_host_0 (vni 2) - tx_host_1 (vni 10) -> rx_host_1 (vni 20) - tx_host_2 (vni 100) -> rx_host_2 (vni 200) - """ - - self.tx_host_0 = self.tx_host - - self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip=self.tx_host_0.ip, - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:03:00:00:05:16", - client_ip=self.tx_host_0.client.ip, - client_vni=10) - - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, - mac=self.tx_host_0.mac, - ip=self.tx_host_0.ip, - ip_prefix=self.tx_host_0.ip_prefix, - peer_port=self.tx_host_0.peer.port, - peer_mac=self.tx_host_0.peer.mac, - peer_ip=self.tx_host_0.peer.ip, - client_mac="00:04:00:00:06:17", - client_ip=self.tx_host_0.client.ip, - client_vni=100) - - self.rx_host_0 = self.rx_host - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:06:17", - client_ip=self.rx_host.client.ip, - client_vni=20) - - self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:06:00:00:07:18", - client_ip=self.rx_host.client.ip, - client_vni=200) - - # Overlay routing - self.vip_create(self.tx_host_0.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host_0.client.vni) - self.direction_lookup_create(self.tx_host_1.client.vni) - self.direction_lookup_create(self.tx_host_2.client.vni) - - src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) - src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) - src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) - - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) - - eni_id_0 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host_0.ip), - vm_vni=self.tx_host_0.client.vni, - vnet_id=src_vnet_0) - self.eni_mac_map_create(eni_id=eni_id_0, mac=self.tx_host_0.client.mac) - - eni_id_1 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host_1.ip), - vm_vni=self.tx_host_1.client.vni, - vnet_id=src_vnet_1) - self.eni_mac_map_create(eni_id=eni_id_1, mac=self.tx_host_1.client.mac) - - eni_id_2 = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host_2.ip), - vm_vni=self.tx_host_2.client.vni, - vnet_id=src_vnet_2) - self.eni_mac_map_create(eni_id=eni_id_2, mac=self.tx_host_2.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_create(eni_id=eni_id_0, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet_0) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host_0.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_create(eni_id=eni_id_1, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet_1) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=False) - - self.outbound_routing_vnet_direct_create(eni_id=eni_id_2, lpm="bbbb::0/64", - dst_vnet_id=dst_vnet_2, - overlay_ip="bbbb::bc") - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, - dip="bbbb::bc", - underlay_dip=self.rx_host_2.ip, - overlay_dmac=self.rx_host_2.client.mac, - use_dst_vnet_vni=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsTest(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest): - """ - Outbound Vnet to Vnet test scenario when multiple ENI and - Outbound routing entries exist with the same CA IP prefixes - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host_0, self.rx_host_0) - - self.outboundEni0Test(tx_equal_to_rx=False) - self.outboundEni1Test(tx_equal_to_rx=False) - self.outboundEni2Test(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsOverlayIpv6Test(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario when multiple ENI and - Outbound routing entries exist with the same CA IP prefixes - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host_0, self.rx_host_0) - - self.outboundEni0Test(tx_equal_to_rx=False) - self.outboundEni1Test(tx_equal_to_rx=False) - self.outboundEni2Test(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario with single ENI and - multiple Outbound routing entries with the overlapping CA IP prefixes - with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.singleEniToOutboundVm1Test(tx_equal_to_rx=True) - self.singleEniToOutboundVm2Test(tx_equal_to_rx=True) - self.singleEniToOutboundVm3Test(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - - CA: - tx_host (vni 1) 9.0.0.1 -> 10.5.4.4/8 rx_host_0 (vni 2) - tx_host (vni 1) 9.0.0.1 -> 10.0.1.2/24 rx_host_1 (vni 20) - tx_host (vni 1) 9.0.0.1 -> 10.1.1.1/32 rx_host_2 (vni 200) - """ - - # Update VIP - self.tx_host.peer.ip = "12.1.1.1" - self.rx_host.peer.ip = "12.1.1.1" - - # Update some network parameters for ip prefixes overlapping - self.tx_host.ip = "192.168.0.1" - self.tx_host.ip_prefix = "192.168.0.0/24" - self.tx_host.client.ip = "9.0.0.1" - - self.rx_host_0 = self.rx_host - self.rx_host_0.ip = "192.168.1.1" - self.rx_host_0.ip_prefix = "192.168.1.0/24" - self.rx_host_0.client.ip = "10.5.4.4" - rx_host_0_client_ip_prefix = "10.0.0.0/8" - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:06:17", - client_ip="10.0.1.2", - client_vni=20) - rx_host_1_client_ip_prefix = "10.0.1.0/24" - - self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:06:00:00:07:18", - client_ip="10.1.1.1", - client_vni=200) - rx_host_2_client_ip_prefix = "10.1.1.1/32" - - # Overlay routing - self.vip_create(self.tx_host.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_0_client_ip_prefix, - dst_vnet_id=dst_vnet_0) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host_0.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_1_client_ip_prefix, - dst_vnet_id=dst_vnet_1) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=True) - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_2_client_ip_prefix, - dst_vnet_id=dst_vnet_2) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, - dip=self.rx_host_2.client.ip, - underlay_dip=self.rx_host_2.ip, - overlay_dmac=self.rx_host_2.client.mac, - use_dst_vnet_vni=True) - - def singleEniToOutboundVm1Test(self, tx_equal_to_rx): - """ - Packet sending: - CA IP: 9.0.0.1 -> 10.5.4.4/8 - VNET: 1 -> 2 - """ - - self.verify_traffic_scenario(client=self.tx_host, - server=self.rx_host_0, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.singleEniToOutboundVm1Test.__name__, ' OK') - - def singleEniToOutboundVm2Test(self, tx_equal_to_rx): - """ - Packet sending: - CA IP: 9.0.0.1 -> 10.0.1.2/24 - VNET: 1 -> 20 - """ - - self.verify_traffic_scenario(client=self.tx_host, - server=self.rx_host_1, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.singleEniToOutboundVm2Test.__name__, ' OK') - - def singleEniToOutboundVm3Test(self, tx_equal_to_rx): - """ - Packet sending: - CA IP: 9.0.0.1 -> 10.1.1.1/32 - VNET: 1 -> 200 - """ - - self.verify_traffic_scenario(client=self.tx_host, - server=self.rx_host_2, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - print('\n', self.singleEniToOutboundVm3Test.__name__, ' OK') - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with single ENI and - multiple Outbound routing entries with the overlapping CA IP prefixes - with underlay config (neighbour + next hop) but without underlay routes - """ - def setUp(self): - super(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - - CA: - tx_host (vni 1) aaaa::10 -> 2001:db8:cad::1/48 rx_host_0 (vni 2) - tx_host (vni 1) aaaa::10 -> 2001:db8:cad:800::1/53 rx_host_1 (vni 20) - tx_host (vni 1) aaaa::10 -> 2001:db8:cad:810::1/62 rx_host_2 (vni 200) - """ - - # Update some network parameters for ip prefixes overlapping - self.tx_host.ip = "192.168.0.1" - self.tx_host.ip_prefix = "192.168.0.0/24" - - self.rx_host_0 = self.rx_host - self.rx_host_0.ip = "192.168.1.1" - self.rx_host_0.ip_prefix = "192.168.1.0/24" - self.rx_host_0.client.ip = "2001:db8:cad::1" - rx_host_0_client_ip_prefix = "2001:db8:cad::0/48" - - self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:05:00:00:06:17", - client_ip="2001:db8:cad:800::1", - client_vni=20) - rx_host_1_client_ip_prefix = "2001:db8:cad:800::0/53" - - self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, - mac=self.rx_host_0.mac, - ip=self.rx_host_0.ip, - ip_prefix=self.rx_host_0.ip_prefix, - peer_port=self.rx_host_0.peer.port, - peer_mac=self.rx_host_0.peer.mac, - peer_ip=self.rx_host_0.peer.ip, - client_mac="00:06:00:00:07:18", - client_ip="2001:db8:cad:810::1", - client_vni=200) - rx_host_2_client_ip_prefix = "2001:db8:cad:810::0/62" - - # Overlay routing - self.vip_create(self.tx_host.peer.ip) # Appliance VIP - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - - dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) - dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) - dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) - - # Outbound routing and CA to PA entries creation - # for use_dst_vnet_vni=True - self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_0_client_ip_prefix, - dst_vnet_id=dst_vnet_0) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, - dip=self.rx_host_0.client.ip, - underlay_dip=self.rx_host_0.ip, - overlay_dmac=self.rx_host_0.client.mac, - use_dst_vnet_vni=True) - - # for use_dst_vnet_vni=False - self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_1_client_ip_prefix, - dst_vnet_id=dst_vnet_1) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, - dip=self.rx_host_1.client.ip, - underlay_dip=self.rx_host_1.ip, - overlay_dmac=self.rx_host_1.client.mac, - use_dst_vnet_vni=True) - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_2_client_ip_prefix, - dst_vnet_id=dst_vnet_2) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, - dip=self.rx_host_2.client.ip, - underlay_dip=self.rx_host_2.ip, - overlay_dmac=self.rx_host_2.client.mac, - use_dst_vnet_vni=True) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsTest(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest): - """ - Outbound Vnet to Vnet test scenario with single ENI and - multiple Outbound routing entries with the overlapping CA IP prefixes - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.singleEniToOutboundVm1Test(tx_equal_to_rx=False) - self.singleEniToOutboundVm2Test(tx_equal_to_rx=False) - self.singleEniToOutboundVm3Test(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsOverlayIpv6Test(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test): - """ - Underlay IPv4 and Overlay IPv6 configs - Outbound Vnet to Vnet test scenario with single ENI and - multiple Outbound routing entries with the overlapping CA IP prefixes - with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host_0) - - self.singleEniToOutboundVm1Test(tx_equal_to_rx=False) - self.singleEniToOutboundVm2Test(tx_equal_to_rx=False) - self.singleEniToOutboundVm3Test(tx_equal_to_rx=False) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): - """ - Outbound Vnet to Vnet test scenario with the same - CA and PA IP prefixes with underlay config (neighbour + next hop) but without underlay routes - """ - - def runTest(self): - self.update_configuration_for_tx_equal_to_rx() - self.configureTest() - self.configure_underlay(self.tx_host, add_routes=False) - - self.vnet2VnetOutboundRouteVnetTest(tx_equal_to_rx=True) - - def configureTest(self): - """ - Setup DUT in accordance with test purpose - """ - - # Update network parameters with the same provider and client ip addresses - self.tx_host.ip = self.tx_host.client.ip # 192.168.0.1 - self.tx_host.ip_prefix = "192.168.0.0/24" - - self.rx_host.ip = self.rx_host.client.ip # 192.168.1.1 - self.rx_host.ip_prefix = "192.168.1.0/24" - - # Configure overlay routing - self.vip_create(self.tx_host.peer.ip) - - # direction lookup VNI, reserved VNI assigned to the VM->Appliance - self.direction_lookup_create(self.tx_host.client.vni) - - src_vnet = self.vnet_create(vni=self.tx_host.client.vni) - dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) - - eni_id = self.eni_create(admin_state=True, - vm_underlay_dip=sai_ipaddress(self.tx_host.ip), - vm_vni=self.tx_host.client.vni, - vnet_id=src_vnet) - self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC - - self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", - dst_vnet_id=dst_vnet) - self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, - dip=self.rx_host.client.ip, - underlay_dip=self.rx_host.ip, - overlay_dmac=self.rx_host.client.mac, - use_dst_vnet_vni=True) - - def vnet2VnetOutboundRouteVnetTest(self, tx_equal_to_rx): - """ - Packet sending: - CA IP: 192.168.0.1/24 -> 192.168.1.1/24 - PA IP: 192.168.0.1/24 -> VIP -> 192.168.1.1/24 - VNET: 1 -> 2 - """ - - self.verify_traffic_scenario(client=self.tx_host, - server=self.rx_host, - connection=self.connection, - fake_mac=True, - tx_equal_to_rx=tx_equal_to_rx) - - -@group("draft") -@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") -class Vnet2VnetOutboundSameCaPaIpPrefixesTwoPortsTest(Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest): - """ - Outbound Vnet to Vnet test scenario with the same - CA and PA IP prefixes with full underlay config (2 neighbours, 2 next-hops, 2 routes) - """ - - def runTest(self): - self.configureTest() - self.configure_underlay(self.tx_host, self.rx_host) - - self.vnet2VnetOutboundRouteVnetTest(tx_equal_to_rx=False) +# Copyright 2022-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 VNET tests +""" + +from unittest import skipIf + +from sai_thrift.sai_headers import * +from sai_dash_utils import * + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class UnderlayRouteTest(VnetApiEndpoints, VnetTrafficMixin): + """ + L3 Underlay bidirectional routing test case + Verifies correct L3 underlay routing when overlay configuration exist + """ + + def runTest(self): + self.configureTest() + + self.verifyOverlayOutboundConfigTest() + + self.l3UnderlayHost1toHost2RoutingTest() + self.l3UnderlayHost2toHost1RoutingTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + # configure overlay outbound + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # configure underlay + self.host_1 = self.tx_host + self.host_2 = self.rx_host + + self.configure_underlay(self.host_1, self.host_2) + + def verifyOverlayOutboundConfigTest(self): + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=False) + print("Overlay config OK\n") + + def l3UnderlayHost1toHost2RoutingTest(self): + + host_1_pkt = simple_udp_packet(eth_src=self.host_1.mac, + eth_dst=self.host_1.peer.mac, + ip_dst=self.host_2.ip, + ip_src=self.host_1.ip, + ip_ttl=64) + host_1_exp_pkt = simple_udp_packet(eth_src=self.host_2.peer.mac, + eth_dst=self.host_2.mac, + ip_dst=self.host_2.ip, + ip_src=self.host_1.ip, + ip_ttl=63) + + print("Sending simple UDP packet host_1 -> host_2, expecting routed packet") + send_packet(self, self.host_1.port, host_1_pkt) + verify_packet(self, host_1_exp_pkt, self.host_2.port) + print("Underlay Host 1 to Host 2 OK\n") + + def l3UnderlayHost2toHost1RoutingTest(self): + + host_2_pkt = simple_udp_packet(eth_src=self.host_2.mac, + eth_dst=self.host_2.peer.mac, + ip_dst=self.host_1.ip, + ip_src=self.host_2.ip, + ip_ttl=64) + host_2_exp_pkt = simple_udp_packet(eth_src=self.host_1.peer.mac, + eth_dst=self.host_1.mac, + ip_dst=self.host_1.ip, + ip_src=self.host_2.ip, + ip_ttl=63) + + print("Sending simple UDP packet host_2 -> host_1, expecting routed packet") + send_packet(self, self.host_2.port, host_2_pkt) + verify_packet(self, host_2_exp_pkt, self.host_1.port) + print("Underlay Host 2 to Host 1 OK\n") + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetInboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host.client.vni, + sip=self.tx_host.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host.ip, src_vnet) + + def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetInboundRoutingTest.__name__, ' OK') + + def vnet2VnetInboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong CA Dst MAC + - wrong PA Validation IP: pa validation missmatch + - wrong Physical SIP: routing missmatch + - wrong VIP + - wrong VNI + """ + + invalid_vni = 1000 + invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" + invalid_pa_sip = "10.10.5.1" # routing missmatch + invalid_vip = "10.10.10.10" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, + invalid_vni=invalid_vni, + invalid_outer_src_ip=invalid_pa_sip, + invalid_inner_dst_mac=invalid_ca_dst_mac, + invalid_vip=invalid_vip) + + invalid_pa_valid_ip = "10.10.1.25" # pa validation missmatch + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, + invalid_outer_src_ip=invalid_pa_valid_ip) + + print('\n', self.vnet2VnetInboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test(Vnet2VnetInboundDecapPaValidateSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def setUp(self): + super(Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateTwoPortsTest(Vnet2VnetInboundDecapPaValidateSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetInboundNegativeTest() + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapPaValidateTwoPortsOverlayIpv6Test(Vnet2VnetInboundDecapPaValidateSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapSinglePortTest(Vnet2VnetInboundDecapPaValidateSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def configureTest(self): + """ + Setup DUT overlay in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_create(eni_id, vni=self.tx_host.client.vni, + sip=self.tx_host.ip, sip_mask="255.255.255.0") + + def vnet2VnetInboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong CA Dst MAC + - wrong VIP + - wrong VNI + - wrong Physical SIP: routing missmatch + """ + + invalid_vni = 1000 + invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" + invalid_vip = "10.10.10.10" + invalid_pa_sip = "10.10.3.22" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, + invalid_vni=invalid_vni, + invalid_inner_dst_mac=invalid_ca_dst_mac, + invalid_vip=invalid_vip, + invalid_outer_src_ip=invalid_pa_sip) + + print('\n', self.vnet2VnetInboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapSinglePortOverlayIpv6Test(Vnet2VnetInboundDecapSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def setUp(self): + super(Vnet2VnetInboundDecapSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapTwoPortsTest(Vnet2VnetInboundDecapSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetInboundNegativeTest() + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundDecapTwoPortsOverlayIpv6Test(Vnet2VnetInboundDecapSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP inbound routing entry action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + + Verifies positive scenario + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + Negative scenarios: + tx_host_0 -> rx_host invalid VNI + tx_host_1 -> rx_host Invalid ENI mac + tx_host_2 -> rx_host Invalid PA IP + tx_host_3 -> rx_host invalid VIP + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + self.vnet2VnetInboundRoutingNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="8.0.0.1", + ip_prefix="8.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="192.168.3.1", + client_vni=30) + + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="11.0.0.1", + ip_prefix="11.0.0.1/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="192.168.4.1", + client_vni=40) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + # ENI configuration + eni_id = self.eni_create(vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id, vni=self.tx_host_3.client.vni, + sip=self.tx_host_3.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate tx_host_0 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action tx_host_0 + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # Inbound routing decap PA Validate tx_host_1 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action tx_host_1 + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + # Inbound routing decap PA Validate tx_host_2 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_2) + # PA validation entry with Permit action tx_host_2 + self.pa_validation_create(self.tx_host_2.ip, src_vnet_2) + + def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + print("\nVerifying Inbound pkt send tx_host_0 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_1 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_2 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_3 -> rx_host ...") + self.verify_traffic_scenario(client=self.tx_host_3, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') + + def vnet2VnetInboundRoutingNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + tx_host_0 -> rx_host invalid VNI + tx_host_1 -> rx_host Invalid ENI mac + tx_host_2 -> rx_host Invalid PA IP + tx_host_3 -> rx_host invalid VIP + """ + + invalid_vni = 200 + invalid_ca_dst_mac = "9e:ba:ce:98:d9:e2" + invalid_pa_sip = "10.10.5.1" # routing missmatch + invalid_vip = "10.10.10.10" + + print("\nVerifying Inbound pkt drop with invalid VNI tx_host_0 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_0, server=self.rx_host, + fake_mac=False, + invalid_vni=invalid_vni) + print("OK") + + print("\nVerifying Inbound pkt drop with invalid ENI mac tx_host_1 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_1, server=self.rx_host, + fake_mac=False, + invalid_inner_dst_mac=invalid_ca_dst_mac) + print("OK") + + print("\nVerifying Inbound pkt drop with invalid PA IP tx_host_2 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_2, server=self.rx_host, + fake_mac=False, + invalid_outer_src_ip=invalid_pa_sip) + print("OK") + + print("\nVerifying Inbound pkt drop with invalid VIP tx_host_3 -> rx_host ...") + self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, + fake_mac=False, + invalid_vip=invalid_vip) + print("OK") + + print('\n', self.vnet2VnetInboundRoutingNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + def setUp(self): + super(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="8.0.0.1", + ip_prefix="8.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::60", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="dddd::14", + client_vni=30) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="11.0.0.1", + ip_prefix="11.0.0.1/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="eeee::80", + client_vni=40) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + # ENI configuration + eni_id = self.eni_create(vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id, vni=self.tx_host_3.client.vni, + sip=self.tx_host_3.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate tx_host_0 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action tx_host_0 + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # Inbound routing decap PA Validate tx_host_1 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action tx_host_1 + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + # Inbound routing decap PA Validate tx_host_2 + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_2) + # PA validation entry with Permit action tx_host_2 + self.pa_validation_create(self.tx_host_2.ip, src_vnet_2) + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsTest(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 5 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_1.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + self.route_create(self.tx_host_3.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host.peer.port, + src_mac=self.rx_host.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host.ip) + self.neighbor_create(rif_1, self.rx_host.ip, self.rx_host.mac) + self.route_create(self.rx_host.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesSingleEniTwoPortsOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesSingleEniSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with single eni and + multiple inbound routing entries (3 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 5 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host (ENI 0) with PA validation 0 + tx_host_1 -> rx_host (ENI 0) with PA validation 1 + tx_host_2 -> rx_host (ENI 0) with PA validation 2 + tx_host_3 -> rx_host (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_1.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + self.route_create(self.tx_host_3.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host_0.peer.port, + src_mac=self.rx_host_0.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) + self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) + self.route_create(self.rx_host_1.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + Negative scenarios: + tx_host_0 -> rx_host_1 + tx_host_1 -> rx_host_0 + tx_host_2 -> rx_host_1 + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + self.vnet2VnetInboundRoutingNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="192.168.3.1", + client_vni=30) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="192.168.4.1", + client_vni=20) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host_0.client.vni) + self.direction_lookup_create(self.rx_host_1.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + # ENI 0 configuration + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_0.ip), + vm_vni=self.rx_host_0.client.vni, + vnet_id=dst_vnet_0) + self.eni_mac_map_create(eni_id_0, self.rx_host_0.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id_0, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate + self.inbound_routing_decap_validate_create(eni_id_0, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # ENI 1 configuration + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_1.ip), + vm_vni=self.rx_host_1.client.vni, + vnet_id=dst_vnet_1) + self.eni_mac_map_create(eni_id_1, self.rx_host_1.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id_1, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + def vnet2VnetInboundRoutingPositiveTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + """ + + print("\nVerifying Inbound pkt send tx_host_0 -> rx_host_0 ...") + self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host_0, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_1 -> rx_host_1 ...") + self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host_1, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + print("\nVerifying Inbound pkt send tx_host_2 -> rx_host_0 ...") + self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host_0, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + print("OK") + + + print('\n', self.vnet2VnetInboundRoutingPositiveTest.__name__, ' OK') + + def vnet2VnetInboundRoutingNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + tx_host_0 -> rx_host_1 + tx_host_1 -> rx_host_0 + tx_host_2 -> rx_host_1 + """ + + print("\nVerifying Inbound pkt drop tx_host_0 -> rx_host_1 ...") + self.verify_negative_traffic_scenario(client=self.tx_host_0, server=self.rx_host_1, + fake_mac=False, valid_pkt_drop=True) + print("OK") + + print("\nVerifying Inbound pkt drop tx_host_1 -> rx_host_0 ...") + self.verify_negative_traffic_scenario(client=self.tx_host_1, server=self.rx_host_0, + fake_mac=False, valid_pkt_drop=True) + print("OK") + + print("\nVerifying Inbound pkt drop tx_host_2 -> rx_host_1 ...") + self.verify_negative_traffic_scenario(client=self.tx_host_2, server=self.rx_host_1, + fake_mac=False, valid_pkt_drop=True) + print("OK") + + print('\n', self.vnet2VnetInboundRoutingNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (neighbour + next hop) but without underlay routes + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + Negative scenarios: + tx_host_0 -> rx_host_1 + tx_host_1 -> rx_host_0 + tx_host_2 -> rx_host_1 + """ + + def setUp(self): + super(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="9.0.0.1", + ip_prefix="9.0.0.0/24", + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="dddd::40", + client_vni=30) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="eeee::50", + client_vni=20) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host_0.client.vni) + self.direction_lookup_create(self.rx_host_1.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + # ENI 0 configuration + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_0.ip), + vm_vni=self.rx_host_0.client.vni, + vnet_id=dst_vnet_0) + self.eni_mac_map_create(eni_id_0, self.rx_host_0.client.mac) # ENI MAC + + # Inbound routing decap + self.inbound_routing_decap_create(eni_id_0, vni=self.tx_host_2.client.vni, + sip=self.tx_host_2.ip, sip_mask="255.255.255.0") + + # Inbound routing decap PA Validate + self.inbound_routing_decap_validate_create(eni_id_0, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_0) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet_0) + + # ENI 1 configuration + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host_1.ip), + vm_vni=self.rx_host_1.client.vni, + vnet_id=dst_vnet_1) + self.eni_mac_map_create(eni_id_1, self.rx_host_1.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id_1, vni=self.tx_host_1.client.vni, + sip=self.tx_host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet_1) + # PA validation entry with Permit action + self.pa_validation_create(self.tx_host_1.ip, src_vnet_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsTest(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 3 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host_0.peer.port, + src_mac=self.rx_host_0.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) + self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) + self.route_create(self.rx_host_1.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundMultiplePaValidatesMultipleEniTwoPortsOverlayIpv6Test(Vnet2VnetInboundMultiplePaValidatesMultipleEniSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + multiple inbound routing entries (2 PA validate and 1 Decap) + with underlay config (2 neighbours, 2 next-hops, 3 routes) + + Connections: + Positive scenarios: + tx_host_0 -> rx_host_0 (ENI 0) with PA validation + tx_host_1 -> rx_host_1 (ENI 1) with PA validation + tx_host_2 -> rx_host_0 (ENI 0) without PA validation + """ + + def runTest(self): + self.configureTest() + self.configure_underlay() + + self.vnet2VnetInboundRoutingPositiveTest(tx_equal_to_rx=False) + + def configure_underlay(self): + rif_0 = self.router_interface_create(self.tx_host_0.peer.port, + src_mac=self.tx_host_0.peer.mac) + nhop_0 = self.nexthop_create(rif_0, self.tx_host_0.ip) + self.neighbor_create(rif_0, self.tx_host_0.ip, self.tx_host_0.mac) + self.route_create(self.tx_host_0.ip_prefix, nhop_0) + self.route_create(self.tx_host_2.ip_prefix, nhop_0) + + rif_1 = self.router_interface_create(self.rx_host_0.peer.port, + src_mac=self.rx_host_0.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) + self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) + self.route_create(self.rx_host_1.ip_prefix, nhop_1) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host_0, add_routes=False) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.20", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.189", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="192.168.3.1", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.200", # for PA validate missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="192.168.4.1", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_4 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.2.20", # for Inbound route missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:BB:00:00:AC:A0", + client_ip="192.168.4.1", + client_vni=self.tx_host_0.client.vni) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host_0.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet) + # PA validation entries with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet) + self.pa_validation_create(self.tx_host_1.ip, src_vnet) + self.pa_validation_create(self.tx_host_2.ip, src_vnet) + + def vnet2VnetInboundRoutingTest(self, tx_equal_to_rx): + """ + Inbound VNET to VNET test + Verifies correct packet routing + """ + + print(f"\nPA validate {self.tx_host_0.ip} verification, expect pass") + self.verify_traffic_scenario(client=self.tx_host_0, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nPA validate {self.tx_host_1.ip} verification, expect pass") + self.verify_traffic_scenario(client=self.tx_host_1, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nPA validate {self.tx_host_2.ip} verification, expect pass") + self.verify_traffic_scenario(client=self.tx_host_2, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nPA validate {self.tx_host_3.ip} verification, expect drop - PA validation missmatch") + self.verify_negative_traffic_scenario(client=self.tx_host_3, server=self.rx_host, + fake_mac=False, valid_pkt_drop=True) + + print(f"\nPA validate {self.tx_host_4.ip} verification, expect drop - Inbound route missmatch") + self.verify_negative_traffic_scenario(client=self.tx_host_4, server=self.rx_host, + fake_mac=False, valid_pkt_drop=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with underlay config (neighbour + next hop) but without underlay routes + + Verifies positive and negative scenarios + """ + + def setUp(self): + super(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test, self).setUp(overlay_ipv6=True) + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host_0, add_routes=False) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.15", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::40", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.100", + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:10:00:00:AA:20", + client_ip="dddd::50", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.1.3", # for PA validate missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:AA:00:23:CC:20", + client_ip="eeee::60", + client_vni=self.tx_host_0.client.vni) + + self.tx_host_4 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip="10.10.12.20", # for Inbound route missmatch + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:BB:00:00:AC:A0", + client_ip="2603::10", + client_vni=self.tx_host_0.client.vni) + + self.vip_create(self.tx_host_0.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host_0.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_validate_create(eni_id, vni=self.tx_host_0.client.vni, + sip=self.tx_host_0.ip, sip_mask="255.255.255.0", + src_vnet_id=src_vnet) + # PA validation entries with Permit action + self.pa_validation_create(self.tx_host_0.ip, src_vnet) + self.pa_validation_create(self.tx_host_1.ip, src_vnet) + self.pa_validation_create(self.tx_host_2.ip, src_vnet) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsTest(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortTest): + """ + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with full underlay config (2 neighbours + 2 next hops + 2 routes) + + Verifies positive and negative scenarios + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleInboundRouteMultiplePaValidateTwoPortsIpv6Test(Vnet2VnetSingleInboundRouteMultiplePaValidateSinglePortIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound Vnet to Vnet scenario test case with + VXLAN_DECAP_PA_VALIDATE inbound routing entry action with multiple PA validate entries + with underlay config (2 neighbours + 2 next hops + 2 routes) + + Verifies positive and negative scenarios + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host) + + self.vnet2VnetInboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundEniSetUpDownSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.eni_set_admin_state(self.eni_id, "down") + self.vnet2VnetEniDownTrafficTest() + self.eni_set_admin_state(self.eni_id, "up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT overlay in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.rx_host.client.vni) + + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + self.eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.rx_host.ip), + vm_vni=self.rx_host.client.vni, + vnet_id=dst_vnet) + self.eni_mac_map_create(self.eni_id, self.rx_host.client.mac) # ENI MAC + + # Inbound routing PA Validate + self.inbound_routing_decap_create(self.eni_id, vni=self.tx_host.client.vni, + sip=self.tx_host.ip, sip_mask="255.255.255.0") + + def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): + """ + Verifies inbound packet routing when ENI admin state is UP + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=False, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') + + def vnet2VnetEniDownTrafficTest(self): + """ + Verifies inbound packet drop when ENI admin state is DOWN + """ + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=False, valid_pkt_drop=True) + + print('\n', self.vnet2VnetEniDownTrafficTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundEniSetUpDownTwoPortsTest(Vnet2VnetInboundEniSetUpDownSinglePortTest): + """ + Inbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.eni_set_admin_state(self.eni_id, "down") + self.vnet2VnetEniDownTrafficTest() + self.eni_set_admin_state(self.eni_id, "up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + # outbound routing + self.outbound_routing_vnet_direct_create(eni_id, "192.168.1.0/24", dst_vnet, + overlay_ip="192.168.1.10") + self.outbound_ca_to_pa_create(dst_vnet, # DST vnet id + "192.168.1.10", # DST IP addr + self.rx_host.ip, # Underlay DIP + overlay_dmac=self.rx_host.client.mac) + + def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): + """ + Outbound VNET to VNET test + Verifies correct packet routing + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + # outbound routing + self.outbound_routing_vnet_direct_create(eni_id, "bbbb::0/64", dst_vnet, + overlay_ip="bbbb::bc") + self.outbound_ca_to_pa_create(dst_vnet, # DST vnet id + "bbbb::bc", # DST IP addr + self.rx_host.ip, # Underlay DIP + overlay_dmac=self.rx_host.client.mac) + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "dddd::dc" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectTwoPortsTest(Vnet2VnetOutboundRouteVnetDirectSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundNegativeTest() + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetDirectTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetDirectSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): + """ + Outbound VNET to VNET test + Verifies correct packet routing + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') + + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "192.168.1.200" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteVnetSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with underlay config (neighbour + next hop) but without underlay routes + """ + def setUp(self): + super(Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "dddd::dc" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "bbbb::dc" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, + invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetTwoPortsTest(Vnet2VnetOutboundRouteVnetSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundNegativeTest() + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteVnetTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteVnetSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundEniSetUpDownSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.eni_set_admin_state(self.eni_id, "down") + self.vnet2VnetEniDownTrafficTest() + self.eni_set_admin_state(self.eni_id, "up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + self.eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(self.eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=self.eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetEniUpTrafficTest(self, tx_equal_to_rx): + """ + Verifies correct outbound packet routing when ENI admin state is UP + """ + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetEniUpTrafficTest.__name__, ' OK') + + def vnet2VnetEniDownTrafficTest(self): + """ + Verifies outbound packet drop when ENI admin state is DOWN + """ + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, valid_pkt_drop=True) + + print('\n', self.vnet2VnetEniDownTrafficTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundEniSetUpDownTwoPortsTest(Vnet2VnetOutboundEniSetUpDownSinglePortTest): + """ + Outbound Vnet to Vnet test scenario + Verifies packets forwarding/drop in accordance with ENI admin state + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + self.eni_set_admin_state(self.eni_id, "down") + self.vnet2VnetEniDownTrafficTest() + self.eni_set_admin_state(self.eni_id, "up") + self.vnet2VnetEniUpTrafficTest(tx_equal_to_rx=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.outboundRouteDirectTest(tx_equal_to_rx=True) + self.outboundRouteDirectNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.client.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) + + # outbound routing + self.outbound_routing_direct_create(eni_id, "192.168.1.0/24") + + def outboundRouteDirectTest(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host, + connection=self.connection, fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx, + route_direct=True) + + def outboundRouteDirectNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "192.168.1.200" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, + invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.outboundRouteDirectNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundRouteDirectSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.vip_create(self.tx_host.client.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) + + # outbound routing + self.outbound_routing_direct_create(eni_id, "bbbb::0/64") + + def outboundRouteDirectNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "dddd::dc" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "bbbb::dc" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, + invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.outboundRouteDirectNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectTwoPortsTest(Vnet2VnetOutboundRouteDirectSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.outboundRouteDirectTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundRouteDirectTwoPortsOverlayIpv6Test(Vnet2VnetOutboundRouteDirectSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with Outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT action + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.outboundRouteDirectTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + # Reconfigure configuration for tx equal to rx + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundNegativeTest() + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.1.17", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:08:18", + client_ip="192.168.1.199", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_3 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:10:00:00:AA:E1", + client_ip="192.168.1.77", + client_vni=self.rx_host_0.client.vni) + + self.vip_create(self.tx_host.peer.ip) + + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host_0.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_3.client.ip, + underlay_dip=self.rx_host_3.ip, + overlay_dmac=self.rx_host_3.client.mac, + use_dst_vnet_vni=False) + + def vnet2VnetOutboundRoutingTest(self, tx_equal_to_rx): + """ + Outbound VNET to VNET test + Verifies correct packet routing + """ + + print(f"\nVerify outbound route to CA {self.rx_host_0.client.ip}, expect pass") + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nVerify outbound route to CA {self.rx_host_1.client.ip}, expect pass") + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nVerify outbound route to CA {self.rx_host_2.client.ip}, expect pass") + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_2, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print(f"\nVerify outbound route to CA {self.rx_host_3.client.ip} and use_dst_vnet=False, expect pass") + self.rx_host_3.client.vni = self.tx_host.client.vni + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_3, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundRoutingTest.__name__, ' OK') + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "192.168.200.200" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "192.168.1.200" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="bbbb:0000:0000:0000:1234::00", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:08:18", + client_ip="bbbb:0000:0000:0000:0000:ab12::00", + client_vni=self.rx_host_0.client.vni) + + self.rx_host_3 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:10:00:00:AA:E1", + client_ip="bbbb::40", + client_vni=self.rx_host_0.client.vni) + + self.vip_create(self.tx_host.peer.ip) + + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host_0.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host_3.client.ip, + underlay_dip=self.rx_host_3.ip, + overlay_dmac=self.rx_host_3.client.mac, + use_dst_vnet_vni=False) + + def vnet2VnetOutboundNegativeTest(self): + """ + Verifies negative scenarios (packet drop): + - wrong VIP + - routing drop (CA Dst IP does not match any routing entry) + - wrong CA Src MAC (does not match any ENI) + - mapping drop (CA Dst IP matches routing entry prefix but drops by ca_to_pa) + """ + + invalid_vip = "10.10.10.10" + wrong_inner_dst_ip = "bbbb:0000:0000:1111::00" + wrong_inner_src_ca_mac = "00:aa:00:aa:00:aa" + + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_vip=invalid_vip, + invalid_inner_dst_ip=wrong_inner_dst_ip, + invalid_inner_src_mac=wrong_inner_src_ca_mac) + + wrong_inner_dst_ip = "bbbb::33" + self.verify_negative_traffic_scenario(client=self.tx_host, server=self.rx_host, + fake_mac=True, invalid_inner_dst_ip=wrong_inner_dst_ip) + + print('\n', self.vnet2VnetOutboundNegativeTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsTest(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with full underlay config (2 neighbours + 2 next hops + 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetSingleOutboundRouteMultipleCa2PaTwoPortsIpv6Test(Vnet2VnetSingleOutboundRouteMultipleCa2PaSinglePortIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 + Outbound Vnet to Vnet test scenario with outbound routing entry + SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET action and multiple CA2PA entries + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundRoutingTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.2.0/24", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + def vnet2VnetOutboundDstVnetIdTrueTest(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_0, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundDstVnetIdTrueTest.__name__, ' OK') + + def vnet2VnetOutboundDstVnetIdFalseTest(self, tx_equal_to_rx): + + # For use_dst_vnet_vni=False verification change rx client vni to tx client vni + self.rx_host_1.client.vni = self.tx_host.client.vni + + self.verify_traffic_scenario(client=self.tx_host, server=self.rx_host_1, + connection=self.connection, fake_mac=True, tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.vnet2VnetOutboundDstVnetIdFalseTest.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="cccc::0/64", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsTest(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetTwoPortsOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest(Vnet2VnetOutboundDstVnetIdRouteVnetSinglePortTest): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=True) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_0, + overlay_ip="192.168.1.111") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip="192.168.1.111", + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="192.168.2.0/24", + dst_vnet_id=dst_vnet_1, + overlay_ip="192.168.2.222") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip="192.168.2.222", + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=3) + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_0, + overlay_ip="bbbb::bc") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip="bbbb::bc", + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_direct_create(eni_id=eni_id, lpm="cccc::0/64", + dst_vnet_id=dst_vnet_1, + overlay_ip="cccc::bc") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip="cccc::bc", + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortsTest(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortTest): + """ + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundDstVnetIdRouteVnetDirectTwoPortstOverlayIpv6Test(Vnet2VnetOutboundDstVnetIdRouteVnetDirectSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario that verifies + CA to PA entry use_dst_vnet_vni attribute True and False values + when routing action is SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.vnet2VnetOutboundDstVnetIdTrueTest(tx_equal_to_rx=False) + self.vnet2VnetOutboundDstVnetIdFalseTest(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.host_0, self.host_2, add_routes=False) + + self.outboundHost0toHost2Test(tx_equal_to_rx=True) + self.inboundHost2toHost0Test(tx_equal_to_rx=True) + + self.outboundHost3toHost1Test(tx_equal_to_rx=True) + self.inboundHost1toHost3Test(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + + host_0.client (vni 1) ca ip: 192.168.0.1 (eni_0) <---> host_2.client (vni 2) ca ip: 192.168.1.1 + host_1.client (vni 10) ca ip: 192.168.2.1 <---> (eni_3) host_3.client (vni 20) ca ip: 192.168.3.1 + """ + + self.host_0 = self.tx_host + + self.host_1 = self.define_neighbor_network(port=self.host_0.port, + mac=self.host_0.mac, + ip=self.host_0.ip, + ip_prefix=self.host_0.ip_prefix, + peer_port=self.host_0.peer.port, + peer_mac=self.host_0.peer.mac, + peer_ip=self.host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="192.168.2.1", + client_vni=10) + self.host_2 = self.rx_host + + self.host_3 = self.define_neighbor_network(port=self.host_2.port, + mac=self.host_2.mac, + ip=self.host_2.ip, + ip_prefix=self.host_2.ip_prefix, + peer_port=self.host_2.peer.port, + peer_mac=self.host_2.peer.mac, + peer_ip=self.host_2.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip="192.168.3.1", + client_vni=20) + # Overlay routing + self.vip_create(self.host_0.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.host_0.client.vni) + self.direction_lookup_create(self.host_3.client.vni) + + host_0_vnet = self.vnet_create(vni=self.host_0.client.vni) + host_1_vnet = self.vnet_create(vni=self.host_1.client.vni) + + host_2_vnet = self.vnet_create(vni=self.host_2.client.vni) + host_3_vnet = self.vnet_create(vni=self.host_3.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_0.ip), + vm_vni=self.host_0.client.vni, + vnet_id=host_0_vnet) + self.eni_mac_map_create(eni_id_0, self.host_0.client.mac) + + eni_id_3 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_3.ip), + vm_vni=self.host_3.client.vni, + vnet_id=host_3_vnet) + self.eni_mac_map_create(eni_id_3, self.host_3.client.mac) + + # ENI 0 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_0, vni=self.host_2.client.vni, + sip=self.host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=host_2_vnet) + self.pa_validation_create(sip=self.host_2.ip, + vnet_id=host_2_vnet) + + self.outbound_routing_vnet_create(eni_id_0, lpm="192.168.1.0/24", + dst_vnet_id=host_2_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_2_vnet, + dip=self.host_2.client.ip, + underlay_dip=self.host_2.ip, + overlay_dmac=self.host_2.client.mac) + + # ENI 3 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_3, vni=self.host_1.client.vni, + sip=self.host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=host_1_vnet) + self.pa_validation_create(sip=self.host_1.ip, + vnet_id=host_1_vnet) + + self.outbound_routing_vnet_create(eni_id_3, lpm="192.168.2.0/24", + dst_vnet_id=host_1_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_1_vnet, + dip=self.host_1.client.ip, + underlay_dip=self.host_1.ip, + overlay_dmac=self.host_1.client.mac) + + def outboundHost0toHost2Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.host_0, + server=self.host_2, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundHost0toHost2Test.__name__, ' OK') + + def inboundHost2toHost0Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.host_2, + server=self.host_0, + connection=self.connection, + fake_mac=False, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.inboundHost2toHost0Test.__name__, ' OK') + + def outboundHost3toHost1Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.host_3, + server=self.host_1, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundHost3toHost1Test.__name__, ' OK') + + def inboundHost1toHost3Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.host_1, + server=self.host_3, + connection=self.connection, + fake_mac=False, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.inboundHost1toHost3Test.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsSinglePortOverlayIpv6Test(Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with underlay config (neighbour + next hop) but without underlay routes + """ + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + + host_0.client (vni 1) ca ipv6: aaaa::10 (eni_0) <---> host_2.client (vni 2) ca ipv6: bbbb::20 + host_1.client (vni 10) ca ipv6: cccc::30 <---> (eni_3) host_3.client (vni 20) ca ipv6: dddd::40 + """ + + self.host_0 = self.tx_host + + self.host_1 = self.define_neighbor_network(port=self.host_0.port, + mac=self.host_0.mac, + ip=self.host_0.ip, + ip_prefix=self.host_0.ip_prefix, + peer_port=self.host_0.peer.port, + peer_mac=self.host_0.peer.mac, + peer_ip=self.host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip="cccc::30", + client_vni=10) + self.host_2 = self.rx_host + + self.host_3 = self.define_neighbor_network(port=self.host_2.port, + mac=self.host_2.mac, + ip=self.host_2.ip, + ip_prefix=self.host_2.ip_prefix, + peer_port=self.host_2.peer.port, + peer_mac=self.host_2.peer.mac, + peer_ip=self.host_2.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip="dddd::40", + client_vni=20) + # Overlay routing + self.vip_create(self.host_0.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.host_0.client.vni) + self.direction_lookup_create(self.host_3.client.vni) + + host_0_vnet = self.vnet_create(vni=self.host_0.client.vni) + host_1_vnet = self.vnet_create(vni=self.host_1.client.vni) + + host_2_vnet = self.vnet_create(vni=self.host_2.client.vni) + host_3_vnet = self.vnet_create(vni=self.host_3.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_0.ip), + vm_vni=self.host_0.client.vni, + vnet_id=host_0_vnet) + self.eni_mac_map_create(eni_id_0, self.host_0.client.mac) + + eni_id_3 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.host_3.ip), + vm_vni=self.host_3.client.vni, + vnet_id=host_3_vnet) + self.eni_mac_map_create(eni_id_3, self.host_3.client.mac) + + # ENI 0 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_0, vni=self.host_2.client.vni, + sip=self.host_2.ip, sip_mask="255.255.255.0", + src_vnet_id=host_2_vnet) + self.pa_validation_create(sip=self.host_2.ip, + vnet_id=host_2_vnet) + + self.outbound_routing_vnet_create(eni_id_0, lpm="bbbb::0/64", + dst_vnet_id=host_2_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_2_vnet, + dip=self.host_2.client.ip, + underlay_dip=self.host_2.ip, + overlay_dmac=self.host_2.client.mac) + + # ENI 3 inbound/outbound routing + self.inbound_routing_decap_validate_create(eni_id=eni_id_3, vni=self.host_1.client.vni, + sip=self.host_1.ip, sip_mask="255.255.255.0", + src_vnet_id=host_1_vnet) + self.pa_validation_create(sip=self.host_1.ip, + vnet_id=host_1_vnet) + + self.outbound_routing_vnet_create(eni_id_3, lpm="cccc::0/64", + dst_vnet_id=host_1_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=host_1_vnet, + dip=self.host_1.client.ip, + underlay_dip=self.host_1.ip, + overlay_dmac=self.host_1.client.mac) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsTwoPortsTest(Vnet2VnetInboundOutboundMultipleConfigsSinglePortTest): + """ + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.host_0, self.host_2, + add_routes=True) + + self.outboundHost0toHost2Test(tx_equal_to_rx=False) + self.inboundHost2toHost0Test(tx_equal_to_rx=False) + + self.outboundHost3toHost1Test(tx_equal_to_rx=False) + self.inboundHost1toHost3Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetInboundOutboundMultipleConfigsTwoPortsOverlayIpv6Test(Vnet2VnetInboundOutboundMultipleConfigsSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Inbound and Outbound Vnet to Vnet test scenario + Verifies overlay routing with multiple inbound/outbound configurations + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.host_0, self.host_2, + add_routes=True) + + self.outboundHost0toHost2Test(tx_equal_to_rx=False) + self.inboundHost2toHost0Test(tx_equal_to_rx=False) + + self.outboundHost3toHost1Test(tx_equal_to_rx=False) + self.inboundHost1toHost3Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host_0, add_routes=False) + + self.outboundEni0Test(tx_equal_to_rx=True) + self.outboundEni1Test(tx_equal_to_rx=True) + self.outboundEni2Test(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + + 192.168.0.1 -> 192.168.1.1 + tx_host_0 (vni 1) -> rx_host_0 (vni 2) + tx_host_1 (vni 10) -> rx_host_1 (vni 20) + tx_host_2 (vni 100) -> rx_host_2 (vni 200) + """ + + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip=self.tx_host_0.client.ip, + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip=self.tx_host_0.client.ip, + client_vni=100) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip=self.rx_host.client.ip, + client_vni=20) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip=self.rx_host.client.ip, + client_vni=200) + + # Overlay routing + self.vip_create(self.tx_host_0.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host_0.client.vni) + self.direction_lookup_create(self.tx_host_1.client.vni) + self.direction_lookup_create(self.tx_host_2.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_0.ip), + vm_vni=self.tx_host_0.client.vni, + vnet_id=src_vnet_0) + self.eni_mac_map_create(eni_id=eni_id_0, mac=self.tx_host_0.client.mac) + + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_1.ip), + vm_vni=self.tx_host_1.client.vni, + vnet_id=src_vnet_1) + self.eni_mac_map_create(eni_id=eni_id_1, mac=self.tx_host_1.client.mac) + + eni_id_2 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_2.ip), + vm_vni=self.tx_host_2.client.vni, + vnet_id=src_vnet_2) + self.eni_mac_map_create(eni_id=eni_id_2, mac=self.tx_host_2.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id_0, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id_1, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + self.outbound_routing_vnet_direct_create(eni_id=eni_id_2, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet_2, + overlay_ip="192.168.1.111") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip="192.168.1.111", + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + def outboundEni0Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host_0, + server=self.rx_host_0, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundEni0Test.__name__, ' OK') + + def outboundEni1Test(self, tx_equal_to_rx): + + # For use_dst_vnet_vni=False verification change rx client vni to tx client vni + self.rx_host_1.client.vni = self.tx_host_1.client.vni + + self.verify_traffic_scenario(client=self.tx_host_1, + server=self.rx_host_1, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundEni1Test.__name__, ' OK') + + def outboundEni2Test(self, tx_equal_to_rx): + + self.verify_traffic_scenario(client=self.tx_host_2, + server=self.rx_host_2, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.outboundEni2Test.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + + def setUp(self): + super(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + + CA: aaaa::10 -> bbbb::20 + tx_host_0 (vni 1) -> rx_host_0 (vni 2) + tx_host_1 (vni 10) -> rx_host_1 (vni 20) + tx_host_2 (vni 100) -> rx_host_2 (vni 200) + """ + + self.tx_host_0 = self.tx_host + + self.tx_host_1 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:03:00:00:05:16", + client_ip=self.tx_host_0.client.ip, + client_vni=10) + + self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + mac=self.tx_host_0.mac, + ip=self.tx_host_0.ip, + ip_prefix=self.tx_host_0.ip_prefix, + peer_port=self.tx_host_0.peer.port, + peer_mac=self.tx_host_0.peer.mac, + peer_ip=self.tx_host_0.peer.ip, + client_mac="00:04:00:00:06:17", + client_ip=self.tx_host_0.client.ip, + client_vni=100) + + self.rx_host_0 = self.rx_host + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip=self.rx_host.client.ip, + client_vni=20) + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip=self.rx_host.client.ip, + client_vni=200) + + # Overlay routing + self.vip_create(self.tx_host_0.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host_0.client.vni) + self.direction_lookup_create(self.tx_host_1.client.vni) + self.direction_lookup_create(self.tx_host_2.client.vni) + + src_vnet_0 = self.vnet_create(vni=self.tx_host_0.client.vni) + src_vnet_1 = self.vnet_create(vni=self.tx_host_1.client.vni) + src_vnet_2 = self.vnet_create(vni=self.tx_host_2.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) + + eni_id_0 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_0.ip), + vm_vni=self.tx_host_0.client.vni, + vnet_id=src_vnet_0) + self.eni_mac_map_create(eni_id=eni_id_0, mac=self.tx_host_0.client.mac) + + eni_id_1 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_1.ip), + vm_vni=self.tx_host_1.client.vni, + vnet_id=src_vnet_1) + self.eni_mac_map_create(eni_id=eni_id_1, mac=self.tx_host_1.client.mac) + + eni_id_2 = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host_2.ip), + vm_vni=self.tx_host_2.client.vni, + vnet_id=src_vnet_2) + self.eni_mac_map_create(eni_id=eni_id_2, mac=self.tx_host_2.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id_0, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id_1, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=False) + + self.outbound_routing_vnet_direct_create(eni_id=eni_id_2, lpm="bbbb::0/64", + dst_vnet_id=dst_vnet_2, + overlay_ip="bbbb::bc") + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip="bbbb::bc", + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsTest(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortTest): + """ + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host_0) + + self.outboundEni0Test(tx_equal_to_rx=False) + self.outboundEni1Test(tx_equal_to_rx=False) + self.outboundEni2Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundMultipleEniSameIpPrefixTwoPortsOverlayIpv6Test(Vnet2VnetOutboundMultipleEniSameIpPrefixSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario when multiple ENI and + Outbound routing entries exist with the same CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host_0, self.rx_host_0) + + self.outboundEni0Test(tx_equal_to_rx=False) + self.outboundEni1Test(tx_equal_to_rx=False) + self.outboundEni2Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.singleEniToOutboundVm1Test(tx_equal_to_rx=True) + self.singleEniToOutboundVm2Test(tx_equal_to_rx=True) + self.singleEniToOutboundVm3Test(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + + CA: + tx_host (vni 1) 9.0.0.1 -> 10.5.4.4/8 rx_host_0 (vni 2) + tx_host (vni 1) 9.0.0.1 -> 10.0.1.2/24 rx_host_1 (vni 20) + tx_host (vni 1) 9.0.0.1 -> 10.1.1.1/32 rx_host_2 (vni 200) + """ + + # Update VIP + self.tx_host.peer.ip = "12.1.1.1" + self.rx_host.peer.ip = "12.1.1.1" + + # Update some network parameters for ip prefixes overlapping + self.tx_host.ip = "192.168.0.1" + self.tx_host.ip_prefix = "192.168.0.0/24" + self.tx_host.client.ip = "9.0.0.1" + + self.rx_host_0 = self.rx_host + self.rx_host_0.ip = "192.168.1.1" + self.rx_host_0.ip_prefix = "192.168.1.0/24" + self.rx_host_0.client.ip = "10.5.4.4" + rx_host_0_client_ip_prefix = "10.0.0.0/8" + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="10.0.1.2", + client_vni=20) + rx_host_1_client_ip_prefix = "10.0.1.0/24" + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip="10.1.1.1", + client_vni=200) + rx_host_2_client_ip_prefix = "10.1.1.1/32" + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_0_client_ip_prefix, + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_1_client_ip_prefix, + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_2_client_ip_prefix, + dst_vnet_id=dst_vnet_2) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + def singleEniToOutboundVm1Test(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 9.0.0.1 -> 10.5.4.4/8 + VNET: 1 -> 2 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host_0, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.singleEniToOutboundVm1Test.__name__, ' OK') + + def singleEniToOutboundVm2Test(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 9.0.0.1 -> 10.0.1.2/24 + VNET: 1 -> 20 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host_1, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.singleEniToOutboundVm2Test.__name__, ' OK') + + def singleEniToOutboundVm3Test(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 9.0.0.1 -> 10.1.1.1/32 + VNET: 1 -> 200 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host_2, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + print('\n', self.singleEniToOutboundVm3Test.__name__, ' OK') + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with underlay config (neighbour + next hop) but without underlay routes + """ + def setUp(self): + super(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test, self).setUp(overlay_ipv6=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + + CA: + tx_host (vni 1) aaaa::10 -> 2001:db8:cad::1/48 rx_host_0 (vni 2) + tx_host (vni 1) aaaa::10 -> 2001:db8:cad:800::1/53 rx_host_1 (vni 20) + tx_host (vni 1) aaaa::10 -> 2001:db8:cad:810::1/62 rx_host_2 (vni 200) + """ + + # Update some network parameters for ip prefixes overlapping + self.tx_host.ip = "192.168.0.1" + self.tx_host.ip_prefix = "192.168.0.0/24" + + self.rx_host_0 = self.rx_host + self.rx_host_0.ip = "192.168.1.1" + self.rx_host_0.ip_prefix = "192.168.1.0/24" + self.rx_host_0.client.ip = "2001:db8:cad::1" + rx_host_0_client_ip_prefix = "2001:db8:cad::0/48" + + self.rx_host_1 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:05:00:00:06:17", + client_ip="2001:db8:cad:800::1", + client_vni=20) + rx_host_1_client_ip_prefix = "2001:db8:cad:800::0/53" + + self.rx_host_2 = self.define_neighbor_network(port=self.rx_host_0.port, + mac=self.rx_host_0.mac, + ip=self.rx_host_0.ip, + ip_prefix=self.rx_host_0.ip_prefix, + peer_port=self.rx_host_0.peer.port, + peer_mac=self.rx_host_0.peer.mac, + peer_ip=self.rx_host_0.peer.ip, + client_mac="00:06:00:00:07:18", + client_ip="2001:db8:cad:810::1", + client_vni=200) + rx_host_2_client_ip_prefix = "2001:db8:cad:810::0/62" + + # Overlay routing + self.vip_create(self.tx_host.peer.ip) # Appliance VIP + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + + dst_vnet_0 = self.vnet_create(vni=self.rx_host_0.client.vni) + dst_vnet_1 = self.vnet_create(vni=self.rx_host_1.client.vni) + dst_vnet_2 = self.vnet_create(vni=self.rx_host_2.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id=eni_id, mac=self.tx_host.client.mac) + + # Outbound routing and CA to PA entries creation + # for use_dst_vnet_vni=True + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_0_client_ip_prefix, + dst_vnet_id=dst_vnet_0) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_0, + dip=self.rx_host_0.client.ip, + underlay_dip=self.rx_host_0.ip, + overlay_dmac=self.rx_host_0.client.mac, + use_dst_vnet_vni=True) + + # for use_dst_vnet_vni=False + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_1_client_ip_prefix, + dst_vnet_id=dst_vnet_1) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_1, + dip=self.rx_host_1.client.ip, + underlay_dip=self.rx_host_1.ip, + overlay_dmac=self.rx_host_1.client.mac, + use_dst_vnet_vni=True) + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm=rx_host_2_client_ip_prefix, + dst_vnet_id=dst_vnet_2) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet_2, + dip=self.rx_host_2.client.ip, + underlay_dip=self.rx_host_2.ip, + overlay_dmac=self.rx_host_2.client.mac, + use_dst_vnet_vni=True) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsTest(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.singleEniToOutboundVm1Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm2Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm3Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSingleEniMultipleIpPrefixTwoPortsOverlayIpv6Test(Vnet2VnetOutboundSingleEniMultipleIpPrefixSinglePortOverlayIpv6Test): + """ + Underlay IPv4 and Overlay IPv6 configs + Outbound Vnet to Vnet test scenario with single ENI and + multiple Outbound routing entries with the overlapping CA IP prefixes + with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host_0) + + self.singleEniToOutboundVm1Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm2Test(tx_equal_to_rx=False) + self.singleEniToOutboundVm3Test(tx_equal_to_rx=False) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest(VnetApiEndpoints, VnetTrafficMixin): + """ + Outbound Vnet to Vnet test scenario with the same + CA and PA IP prefixes with underlay config (neighbour + next hop) but without underlay routes + """ + + def runTest(self): + self.update_configuration_for_tx_equal_to_rx() + self.configureTest() + self.configure_underlay(self.tx_host, add_routes=False) + + self.vnet2VnetOutboundRouteVnetTest(tx_equal_to_rx=True) + + def configureTest(self): + """ + Setup DUT in accordance with test purpose + """ + + # Update network parameters with the same provider and client ip addresses + self.tx_host.ip = self.tx_host.client.ip # 192.168.0.1 + self.tx_host.ip_prefix = "192.168.0.0/24" + + self.rx_host.ip = self.rx_host.client.ip # 192.168.1.1 + self.rx_host.ip_prefix = "192.168.1.0/24" + + # Configure overlay routing + self.vip_create(self.tx_host.peer.ip) + + # direction lookup VNI, reserved VNI assigned to the VM->Appliance + self.direction_lookup_create(self.tx_host.client.vni) + + src_vnet = self.vnet_create(vni=self.tx_host.client.vni) + dst_vnet = self.vnet_create(vni=self.rx_host.client.vni) + + eni_id = self.eni_create(admin_state=True, + vm_underlay_dip=sai_ipaddress(self.tx_host.ip), + vm_vni=self.tx_host.client.vni, + vnet_id=src_vnet) + self.eni_mac_map_create(eni_id, self.tx_host.client.mac) # ENI MAC + + self.outbound_routing_vnet_create(eni_id=eni_id, lpm="192.168.1.0/24", + dst_vnet_id=dst_vnet) + self.outbound_ca_to_pa_create(dst_vnet_id=dst_vnet, + dip=self.rx_host.client.ip, + underlay_dip=self.rx_host.ip, + overlay_dmac=self.rx_host.client.mac, + use_dst_vnet_vni=True) + + def vnet2VnetOutboundRouteVnetTest(self, tx_equal_to_rx): + """ + Packet sending: + CA IP: 192.168.0.1/24 -> 192.168.1.1/24 + PA IP: 192.168.0.1/24 -> VIP -> 192.168.1.1/24 + VNET: 1 -> 2 + """ + + self.verify_traffic_scenario(client=self.tx_host, + server=self.rx_host, + connection=self.connection, + fake_mac=True, + tx_equal_to_rx=tx_equal_to_rx) + + +@group("draft") +@skipIf(test_param_get('target') == 'bmv2', "Blocked on BMv2 by Issue #236") +class Vnet2VnetOutboundSameCaPaIpPrefixesTwoPortsTest(Vnet2VnetOutboundSameCaPaIpPrefixesSinglePortTest): + """ + Outbound Vnet to Vnet test scenario with the same + CA and PA IP prefixes with full underlay config (2 neighbours, 2 next-hops, 2 routes) + """ + + def runTest(self): + self.configureTest() + self.configure_underlay(self.tx_host, self.rx_host) + + self.vnet2VnetOutboundRouteVnetTest(tx_equal_to_rx=False) diff --git a/test/test-cases/functional/saic/empty_test.py b/test/test-cases/functional/saic/empty_test.py index 2e6150a6c..df6bc603f 100644 --- a/test/test-cases/functional/saic/empty_test.py +++ b/test/test-cases/functional/saic/empty_test.py @@ -4,4 +4,4 @@ def test_placeholder(): print('test_placeholder') - pass \ No newline at end of file + pass diff --git a/test/test-cases/functional/saic/pytest.ini b/test/test-cases/functional/saic/pytest.ini index f9eb33c53..68918ea63 100644 --- a/test/test-cases/functional/saic/pytest.ini +++ b/test/test-cases/functional/saic/pytest.ini @@ -1,4 +1,4 @@ [pytest] markers = ptf: traffic tests supported by PTF. snappi should work as well. - snappi: traffic tests that requires snappi only. \ No newline at end of file + snappi: traffic tests that requires snappi only. diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen-files.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen-files.svg index d3ade40aa..be3c160a5 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen-files.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen-files.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
PyTest test-case
PyTest test-case
custom config generator
custom config g...
file
file
stored SAI records
stored SAI...
stdout
stdout
process_commands()
process_comm...
Execute in command-line mode to emit JSON records
Execute in command-line mod...
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
PyTest test-case
PyTest test-case
custom config generator
custom config g...
file
file
stored SAI records
stored SAI...
stdout
stdout
process_commands()
process_comm...
Execute in command-line mode to emit JSON records
Execute in command-line mod...
Text is not SVG - cannot display
diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen.svg index fa9a25f4f..2e98fa8db 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-custom-gen.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
process-commands()
process-co...
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
custom config generator
custom config g...
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
process-commands()
process-co...
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
custom config generator
custom config g...
Text is not SVG - cannot display
diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen-files.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen-files.svg index 0bc766b1f..605b8a426 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen-files.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen-files.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
file
file
stored SAI records
stored SAI...
process_commands()
process_co...
saithrift driver
saithrift d...
DUT API
DUT API
input params
input params
dpugen
dpugen
generator
generator
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
Execute in command-line mode to emit JSON records
Execute in command-line mod...
PyTest test-case
PyTest test-case
import
import
stdout
stdout
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
file
file
stored SAI records
stored SAI...
process_commands()
process_co...
saithrift driver
saithrift d...
DUT API
DUT API
input params
input params
dpugen
dpugen
generator
generator
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
Execute in command-line mode to emit JSON records
Execute in command-line mod...
PyTest test-case
PyTest test-case
import
import
stdout
stdout
Text is not SVG - cannot display
diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen.svg index 80c712f8a..cd384c795 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-dpugen.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
saithrift driver
saithrift d...
DUT API
DUT API
streaming SAI records
streaming...
input params
input params
dpugen
dpugen
generator
generator
generate
generate
SAI Challenger Framework
SAI Challenger Framework
module import
module import
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
saithrift driver
saithrift d...
DUT API
DUT API
streaming SAI records
streaming...
input params
input params
dpugen
dpugen
generator
generator
generate
generate
SAI Challenger Framework
SAI Challenger Framework
module import
module import
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
Text is not SVG - cannot display
diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension-files.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension-files.svg index e613fd9c3..630157664 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension-files.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension-files.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
literal SAI records in the test-case code
literal SAI rec...
PyTest test-case
PyTest test-case
embedded list-comprehension expression
embedded list-c...
file
file
stored SAI records
stored SAI...
stdout
stdout
process_commands()
process_comm...
Execute in command-line mode to emit JSON records
Execute in command-line mod...
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
literal SAI records in the test-case code
literal SAI rec...
PyTest test-case
PyTest test-case
embedded list-comprehension expression
embedded list-c...
file
file
stored SAI records
stored SAI...
stdout
stdout
process_commands()
process_comm...
Execute in command-line mode to emit JSON records
Execute in command-line mod...
Text is not SVG - cannot display
diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension.svg index 86c8540ec..99c528ccf 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-list-comprehension.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
literal SAI records in the test-case code
literal SAI rec...
process-commands()
process-co...
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
embedded list-comprehension expression
embedded list-c...
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
literal SAI records in the test-case code
literal SAI rec...
process-commands()
process-co...
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
embedded list-comprehension expression
embedded list-c...
Text is not SVG - cannot display
diff --git a/test/test-cases/functional/saic/tutorial/images/dut-config-literal.svg b/test/test-cases/functional/saic/tutorial/images/dut-config-literal.svg index cd76ab367..e01b6a589 100644 --- a/test/test-cases/functional/saic/tutorial/images/dut-config-literal.svg +++ b/test/test-cases/functional/saic/tutorial/images/dut-config-literal.svg @@ -1,4 +1,4 @@ -
API wrapper
API wrapper
literal SAI records in the test-case code
literal SAI rec...
process_commands()
process_co...
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
Text is not SVG - cannot display
\ No newline at end of file +
API wrapper
API wrapper
literal SAI records in the test-case code
literal SAI rec...
process_commands()
process_co...
saithrift driver
saithrift d...
DUT API
DUT API
SAI Challenger Framework
SAI Challenger Framework
DUT (Device under test)
HW  or SW (bmv2, etc.)
DUT (Device under test...
Record Parser
Record Parser
?
?
X
X
{...}
{...}
Test Logic
Test Log...
sai-thrift
sai-redis
etc.
sai-thrift...
Test Fixture setup files
Test Fixture se...
PyTest test-case
PyTest test-case
Text is not SVG - cannot display
diff --git a/test/test-cases/scale/saic/pytest.ini b/test/test-cases/scale/saic/pytest.ini index f9eb33c53..68918ea63 100644 --- a/test/test-cases/scale/saic/pytest.ini +++ b/test/test-cases/scale/saic/pytest.ini @@ -1,4 +1,4 @@ [pytest] markers = ptf: traffic tests supported by PTF. snappi should work as well. - snappi: traffic tests that requires snappi only. \ No newline at end of file + snappi: traffic tests that requires snappi only. diff --git a/test/test-cases/scale/vnet2vnet/48K-ips/README.md b/test/test-cases/scale/vnet2vnet/48K-ips/README.md index 71f7ee843..63e140f76 100644 --- a/test/test-cases/scale/vnet2vnet/48K-ips/README.md +++ b/test/test-cases/scale/vnet2vnet/48K-ips/README.md @@ -17,4 +17,4 @@ The intention of the 48K-IPs test is to evaluate a DPUs performance with an obje |------+----------------+------------------------+---------------+-----------------+-----------------| | 1 | 100000 | 0 | 10 | 0 | 0 | +------+----------------+------------------------+---------------+-----------------+-----------------+ -``` \ No newline at end of file +``` diff --git a/test/test-cases/scale/vnet2vnet/48K-ips/test_vxlan_8vpc_48K-ips.py b/test/test-cases/scale/vnet2vnet/48K-ips/test_vxlan_8vpc_48K-ips.py index 9a7373cf8..1bfa7bf3c 100644 --- a/test/test-cases/scale/vnet2vnet/48K-ips/test_vxlan_8vpc_48K-ips.py +++ b/test/test-cases/scale/vnet2vnet/48K-ips/test_vxlan_8vpc_48K-ips.py @@ -1,1442 +1,1442 @@ -import inspect -import json -import sys -import time -from copy import deepcopy - -import ipaddress -import macaddress -import pytest -import requests -from ixload import IxLoadUtils as IxLoadUtils -from ixnetwork_restpy import SessionAssistant -from ixnetwork_restpy.assistants.statistics.statviewassistant import StatViewAssistant -from tabulate import tabulate -from testdata_baby_hero import testdata,ip_type -from datetime import datetime -from future.utils import iteritems - -data = [] -final_result_data=[] -setup_information=None -ixnetwork=None -config_elements_sets=[] -val_map={} -tiNo = 16 -captions = ["Test","PPS", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %","PossibleBoundary"] - - -@pytest.fixture(scope="class") -def setup(smartnics, tbinfo,utils): - """Gather all required test information from DUT and tbinfo. - A Dictionary with required test information. - """ - print ("*"*50+"SETUP"+"*"*50) - setup_information = {"nics": smartnics, "tbinfo": tbinfo, } - smartnics.configure_target(testdata) - yield setup_information - -def find_boundary(utils): - global data, final_result_data - hls = ixnetwork.Traffic.TrafficItem.find()[0].HighLevelStream.find() - - def boundary_check(test_boundary_val): - for hl in hls: - hl.FrameRate.update(Type='framesPerSecond', Rate=test_boundary_val) - - utils.start_traffic(ixnetwork) - utils.ss("\t\t\tLet Traffic run for ", 10) - utils.ss("\t\t\tPrint Stats Before issuing Clear Stats ", 2) - utils.printStats(ixnetwork, "Traffic Item Statistics", {"Traffic Item Statistics": {'transpose': False, 'toprint': ["Traffic Item", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %"]}}) - utils.ss("\t\t\tLet Clear Stats ", 2) - ixnetwork.ClearStats() - utils.ss("\t\t\tLet Traffic run for another ", 90) - utils.stop_traffic(ixnetwork) - utils.ss("\t\t\tLets wait for stats to settle down for ", 10) - #print("\tVerify Traffic stats") - ti = StatViewAssistant(ixnetwork, 'Traffic Item Statistics') - if float(ti.Rows[0]['Frames Delta']) == float(0): - ixnetwork.ClearStats() - return False - else: - ixnetwork.ClearStats() - return True - - poss_val, step, tolerance, pass_val, fail_val = int(20000000 / tiNo), int(20000000 / tiNo), 100000, None, None - #poss_val, step, tolerance, pass_val, fail_val = int(20000000 / tiNo), int(20000000 / tiNo), 50000, None, None - - while True: - print("="*50) - print(f"Test running for {utils.human_format(poss_val * tiNo)} framesPerSecond") - print(" POSSPASS|FAIL|PASS=", poss_val, fail_val, pass_val) - print("="*50) - result = boundary_check(poss_val) - row = utils.printStats(ixnetwork, "Traffic Item Statistics", {"Traffic Item Statistics": {'transpose': False, 'toprint': ["Traffic Item", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %"]}}) - utils.printStats(ixnetwork, "Flow Statistics", {"Flow Statistics": {'transpose': False, 'toprint': ["Traffic Item", "Source/Dest Endpoint Pair", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %"]}}) - data.append([sys._getframe().f_back.f_code.co_name,utils.human_format(poss_val * tiNo)]+row[1:]) - - if result: - fail_val = poss_val - if pass_val: - poss_val = int((pass_val+fail_val)/2) - else: - poss_val = int(poss_val/2) - else: # we need to continue - pass_val = poss_val - if not fail_val: - poss_val = pass_val+step - else: - poss_val = int((pass_val+fail_val)/2) - if fail_val: - if abs(fail_val-poss_val) <= tolerance: - if pass_val==None: - print ("Not able to find Boundary Tolerance (%d) is Less than last fail value (%d)" % (tolerance,fail_val)) - pass_val="NA" - else: - pass_val = utils.human_format(pass_val * tiNo) - print("Final Possible Boundary is ", pass_val) - print(" X POSSPASS|FAIL|PASS=", poss_val, fail_val, pass_val) - break - data.append([sys._getframe().f_back.f_code.co_name]+["***"]*5+[pass_val]) - print(tabulate(data, headers=captions, tablefmt="psql")) - - final_result_data.append([sys._getframe().f_back.f_code.co_name,pass_val]) - - - -@pytest.fixture(scope="class") -def pps_config(setup,tbinfo,utils): - """ - Description: Verify ip address can be configured in SVI. - Topo: DUT02 ============ DUT01 - Dev. status: DONE - """ - global ixnetwork,config_elements_sets,val_map - testbed = setup["tbinfo"] - snic = setup["nics"] - def createTI(name, endpoints): - trafficItem = ixnetwork.Traffic.TrafficItem.find(Name="^%s$" % name) - if len(trafficItem) == 0: - trafficItem = ixnetwork.Traffic.TrafficItem.add(Name=name, TrafficType='ipv4', BiDirectional=False) # BiDirectional=True - for indx,srcdst in enumerate(endpoints): - print ("ENP UP",indx+1) - src,dst = srcdst - endpoint_set_up = trafficItem.EndpointSet.add(Name="%s-ENI_UP-%s" % (name,str(indx+1)),ScalableSources=src, ScalableDestinations=dst) - ce = trafficItem.ConfigElement.find()[-1] - ce.FrameRate.update(Type='framesPerSecond', Rate=50000) - ce.TransmissionControl.Type = 'continuous' - ce.FrameRateDistribution.PortDistribution = 'applyRateToAll' - ce.FrameSize.FixedSize = 128 - udp_srcport = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.srcPort") - udp_srcport.Auto = False - udp_srcport.SingleValue = 50687 - udp_len = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.length") - udp_len.Auto = False - udp_len.SingleValue = 80 - - udp_template = ixnetwork.Traffic.ProtocolTemplate.find(StackTypeId='^udp$') - ipv4_template = ce.Stack.find(TemplateName="ipv4-template.xml")[-1] - inner_udp = ce.Stack.read(ipv4_template.AppendProtocol(udp_template)) - trafficItem.Tracking.find()[0].TrackBy = ['trackingenabled0', 'sourceDestEndpointPair0'] - inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') - inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') - inn_sp.Auto = False - inn_dp.Auto = False - inn_sp.SingleValue = 10000 - inn_dp.SingleValue = 10000 - ce_up = ce - print ("ENP Down",indx+1) - #DOWN - endpoint_set_down = trafficItem.EndpointSet.add(Name="%s-ENI_DOWN-%s" % (name,str(indx+1)),ScalableSources=dst, ScalableDestinations=src) - ce = trafficItem.ConfigElement.find()[-1] - ce.FrameRate.update(Type='framesPerSecond', Rate=50000) - ce.TransmissionControl.Type = 'continuous' - ce.FrameRateDistribution.PortDistribution = 'applyRateToAll' - ce.FrameSize.FixedSize = 128 - udp_srcport = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.srcPort") - udp_srcport.Auto = False - udp_srcport.SingleValue = 50687 - udp_len = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.length") - udp_len.Auto = False - udp_len.SingleValue = 80 - - udp_template = ixnetwork.Traffic.ProtocolTemplate.find(StackTypeId='^udp$') - ipv4_template = ce.Stack.find(TemplateName="ipv4-template.xml")[-1] - inner_udp = ce.Stack.read(ipv4_template.AppendProtocol(udp_template)) - trafficItem.Tracking.find()[0].TrackBy = ['trackingenabled0', 'sourceDestEndpointPair0'] - inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') - inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') - inn_sp.Auto = False - inn_dp.Auto = False - inn_sp.SingleValue = 10000 - inn_dp.SingleValue = 10000 - ce_down=ce - - if name=="Allow": - config_elements_sets.append((ce_up,ce_down)) - - print ("Done") - #trafficItem.Generate() - print (datetime.now(),"*"*80) - return trafficItem - - - obj_map = {} - for k in testdata["val_map"].keys(): - obj_map[k] = deepcopy({}) - val_map = testdata["val_map"] - - print('connect to a test tool platform') - tb=testbed['stateless'][0] - - session_assistant = SessionAssistant( - IpAddress=tb['server'][0]['addr'], - RestPort=tb['server'][0]['rest'], - UserName=testbed["CR"][tb['server'][0]['addr']]['user'], - Password=testbed["CR"][tb['server'][0]['addr']]['password'], - SessionName="MIRTest", - ClearConfig=True - ) - - ixnetwork = session_assistant.Ixnetwork - - - portList = [{'xpath': '/vport[%s]' % str(indx+1), 'name': 'VTEP_0%d' % (indx+1), 'location': p['location']} for indx, p in enumerate(tb['tgen'][0]['interfaces'])] - ixnetwork.ResourceManager.ImportConfig(json.dumps(portList), False) - - vports = list(ixnetwork.Vport.find()) - l1data = tb['tgen'][0]['interfaces'] - tmp = [{'xpath': '/vport[%d]/l1Config/%s' % (vp.InternalId, vp.Type), "ieeeL1Defaults": l1data[indx]['ieee'] } for indx, vp in enumerate(vports)] - ixnetwork.ResourceManager.ImportConfig(json.dumps(tmp), False) - tmp = [{'xpath': '/vport[%d]/l1Config/%s' % (vp.InternalId, vp.Type), "enableAutoNegotiation": l1data[indx]['an']} for indx, vp in enumerate(vports)] - ixnetwork.ResourceManager.ImportConfig(json.dumps(tmp), False) - - tmp = [{'xpath': '/vport[%d]/l1Config/%s' % (vp.InternalId, vp.Type), "enableRsFec": l1data[indx]['fec'], "autoInstrumentation": "floating"} for indx, vp in enumerate(vports)] - ixnetwork.ResourceManager.ImportConfig(json.dumps(tmp), False) - for ed in [1, 2]: - # OUTER DG - obj_map[ed]["oeth"] = ixnetwork.Topology.add(Ports=vports[ed-1], Name="TG_%d" % ed).DeviceGroup.add(Name="O_DG_%d" % ed, Multiplier=1).Ethernet.add(Name='ETH_%d' % ed) - if ip_type=="v4": - obj_map[ed]["oipv4"] = obj_map[ed]["oeth"].Ipv4.add(Name="IPv4%d" % ed) - elif ip_type=="v6": - obj_map[ed]["oipv4"] = obj_map[ed]["oeth"].Ipv6.add(Name="IPv6%d" % ed) - - if val_map[ed]['underlay_routing']=="BGP": - if ip_type=="v4": - obj_map[ed]["obgp"] = obj_map[ed]["oipv4"].BgpIpv4Peer.add(Name="BGP_%d" % ed) - elif ip_type=="v6": - obj_map[ed]["obgp"] = obj_map[ed]["oipv4"].BgpIpv6Peer.add(Name="BGP_%d" % ed) - - # OUTER NG - ng = ixnetwork.Topology.find().DeviceGroup.find(Name="O_DG_%d" % ed).NetworkGroup.add(Name="NG_%d" % ed, Multiplier=val_map[ed]["oipv4pool"]["multiplier"]) - if ip_type=="v4": - obj_map[ed]["oipv4pool"] = ng.Ipv4PrefixPools.add(NumberOfAddresses='1') - elif ip_type=="v6": - obj_map[ed]["oipv4pool"] = ng.Ipv6PrefixPools.add(NumberOfAddresses='1') - - # DG Behing Outer NG - obj_map[ed]["dg_b_ong"] = ng.DeviceGroup.add(Name="DG_B_ONG_%d" % ed, Multiplier=1) - obj_map[ed]["dg_b_ong_eth"] = obj_map[ed]["dg_b_ong"].Ethernet.add(Name='ETH_%d' % ed) - if ip_type=="v4": - obj_map[ed]["dg_b_ong_ipv4"] = obj_map[ed]["dg_b_ong_eth"].Ipv4.add(Name='IPv4_%d' % ed) - obj_map[ed]["vxlan"] = obj_map[ed]["dg_b_ong_ipv4"].Vxlan.add(Name="VXLAN_%d" % ed) - elif ip_type=="v6": - obj_map[ed]["dg_b_ong_ipv4"] = obj_map[ed]["dg_b_ong_eth"].Ipv6.add(Name='IPv6_%d' % ed) - obj_map[ed]["vxlan"] = obj_map[ed]["dg_b_ong_ipv4"].Vxlanv6.add(Name="VXLAN_%d" % ed) - - - - # ALLOW & DENY - if ed==1: - if ip_type=="v4": - obj_map[ed]["iipv4_local"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Local',Multiplier=1).Ethernet.add().Ipv4.add() - elif ip_type=="v6": - obj_map[ed]["iipv4_local"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Local',Multiplier=1).Ethernet.add().Ipv6.add() - - obj_map[ed]["ieth_local"] = obj_map[ed]["iipv4_local"].parent - else: - if ip_type=="v4": - obj_map[ed]["iipv4_allow"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Allow',Multiplier=val_map[ed]["iipv4_allow"]["multiplier"]).Ethernet.add().Ipv4.add() - elif ip_type=="v6": - obj_map[ed]["iipv4_allow"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Allow',Multiplier=val_map[ed]["iipv4_allow"]["multiplier"]).Ethernet.add().Ipv6.add() - - obj_map[ed]["ieth_allow"] = obj_map[ed]["iipv4_allow"].parent - - if ip_type=="v4": - obj_map[ed]["iipv4_deny"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Deny',Multiplier=val_map[ed]["iipv4_deny"]["multiplier"]).Ethernet.add().Ipv4.add() - elif ip_type=="v6": - obj_map[ed]["iipv4_deny"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Deny',Multiplier=val_map[ed]["iipv4_deny"]["multiplier"]).Ethernet.add().Ipv6.add() - obj_map[ed]["ieth_deny"] = obj_map[ed]["iipv4_deny"].parent - - - for ed in [1, 2]: - # OUTER DG - obj_map[ed]["oeth"].Mac.Increment(start_value=val_map[ed]["oeth"]["mac"], step_value='00:00:00:00:00:01') - obj_map[ed]["oipv4"].Address.Increment(start_value=val_map[ed]["oipv4"]["ip"], step_value=val_map[ed]["oipv4"]["ip_step"]) - obj_map[ed]["oipv4"].GatewayIp.Increment(start_value=val_map[ed]["oipv4"]["gip"], step_value=val_map[ed]["oipv4"]["gip_step"]) - - - resolve_gateway = False - if val_map[ed]['underlay_routing']=="STATIC": - resolve_gateway = True - - obj_map[ed]["oipv4"].ResolveGateway.Single(resolve_gateway) - obj_map[ed]["oipv4"].ManualGatewayMac.Single(val_map[ed]["oipv4"]["mac"]) - - # BGP - if val_map[ed]['underlay_routing']=="BGP": - obj_map[ed]["obgp"].DutIp.Single(val_map[ed]["obgp"]["dip"]) - obj_map[ed]["obgp"].LocalAs2Bytes.Single(val_map[ed]["obgp"]["las"]) - if ip_type=="v4": - obj_map[ed]["obgp"].EnableBgpIdSameasRouterId.Single(True) - obj_map[ed]["obgp"].FilterIpV4Unicast.Single(True) - elif ip_type=="v6": - #obj_map[ed]["obgp"].EnableBgpIdSameasRouterId.Single(True)----------------------------> This gives an error - obj_map[ed]["obgp"].FilterIpV6Unicast.Single(True) - - obj_map[ed]["obgp"].FilterEvpn.Single(True) - - #obj_map[ed]["bgp"].IpVrfToIpVrfType = 'interfacefullWithUnnumberedCorefacingIRB' - #obj_map[ed]["bgp"].EthernetSegmentsCountV4 = 128 - - obj_map[ed]["obgp"].BgpId.Single(val_map[ed]["obgp"]["bid"]) - obj_map[ed]["obgp"].Type.Single('external') - - # OUTER NG - obj_map[ed]["oipv4pool"].NetworkAddress.Increment(start_value=val_map[ed]["oipv4pool"]["ip"], step_value=val_map[ed]["oipv4pool"]["ip_step"]) - obj_map[ed]["oipv4pool"].PrefixLength.Single(32) - ipv4_behindvxlan = obj_map[ed]["vxlan"].parent - ipv4_behindvxlan.Address.Increment(start_value=val_map[ed]["oipv4pool"]["ip"], step_value=val_map[ed]["oipv4pool"]["ip_step"]) - ipv4_behindvxlan.ResolveGateway.Single(False) - - # DG Behing Outer NG - # DG Behind Outer NG Ethernet - eth = obj_map[ed]["dg_b_ong_ipv4"].parent - eth.Mac.Increment(start_value=val_map[ed]["dg_b_ong_eth"]["mac"], step_value='00:00:00:00:00:01') - - # DG Behind Outer NG IPv4 - for s in obj_map[ed]["dg_b_ong_ipv4"].Address.Steps: - s.Enabled = False - obj_map[ed]["dg_b_ong_ipv4"].Address.Increment(start_value=val_map[ed]["dg_b_ong_ipv4"]["ip"], step_value=val_map[ed]["dg_b_ong_ipv4"]["ip_step"]) - obj_map[ed]["dg_b_ong_ipv4"].GatewayIp.Increment(start_value=val_map[ed]["dg_b_ong_ipv4"]["gip"], step_value=val_map[ed]["dg_b_ong_ipv4"]["gip_step"]) - obj_map[ed]["dg_b_ong_ipv4"].Prefix.Single(32) - - # VXLAN - obj_map[ed]["vxlan"].EnableStaticInfo = True - - if ip_type=="v4": - vxlan_sinfo=obj_map[ed]["vxlan"].VxlanStaticInfo - vxlan_sinfo.MacStaticConfig.Single(True) - remote_vtep_ip_obj = vxlan_sinfo.RemoteVtepIpv4 - remote_vm_mac = vxlan_sinfo.RemoteVmStaticMac - elif ip_type=="v6": - vxlan_sinfo=obj_map[ed]["vxlan"].VxlanIPv6StaticInfo - vxlan_sinfo.EnableManualRemoteVMMac.Single(True) - remote_vtep_ip_obj = vxlan_sinfo.RemoteVtepUnicastIpv6 - remote_vm_mac = vxlan_sinfo.RemoteVMMacAddress - - - - remote_vtep_ip_obj.Single(val_map[ed]["vxlan"]["RemoteVtepIpv4"]) - obj_map[ed]["vxlan"].Vni.Increment(start_value=val_map[ed]["vxlan"]["Vni"], step_value=1) - vxlan_sinfo.SuppressArp.Single(True) - obj_map[ed]["vxlan"].StaticInfoCount = val_map[ed]["vxlan"]["StaticInfoCount"] - - - # LOCAL | ALLOW & DENY - if ed==1: - - remote_vm_mac.Custom( - start_value=val_map[ed]["vxlan"]["RemoteVmStaticMac"]["start_value"], - step_value=val_map[ed]["vxlan"]["RemoteVmStaticMac"]["step_value"], - increments=val_map[ed]["vxlan"]["RemoteVmStaticMac"]["increments"] - ) - remote_vm_mac.Steps[0].Enabled = True - remote_vm_mac.Steps[0].Step = val_map[ed]["vxlan"]["RemoteVmStaticMac"]["ng_step"] - - vxlan_sinfo.RemoteVmStaticIpv4.Custom( - start_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["start_value"], - step_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["step_value"], - increments=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["increments"] - ) - vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Enabled = True - vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Step = val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["ng_step"] - - - obj_map[ed]["ieth_local"].Mac.Increment(start_value=val_map[ed]["ieth_local"]["mac"], step_value=val_map[ed]["ieth_local"]["step"],) - obj_map[ed]["ieth_local"].Mac.Steps[1].Enabled=True - obj_map[ed]["ieth_local"].Mac.Steps[1].Step = '00:00:00:08:00:00' - - obj_map[ed]["iipv4_local"].Prefix.Single(8) - - obj_map[ed]["iipv4_local"].Address.Increment( start_value=val_map[ed]["iipv4_local"]["ip"], step_value=val_map[ed]["iipv4_local"]["ip_step"]) - obj_map[ed]["iipv4_local"].Address.Steps[1].Enabled=True - obj_map[ed]["iipv4_local"].Address.Steps[1].Step = val_map[ed]["iipv4_local"]["ip_ng1_step"] - - obj_map[ed]["iipv4_local"].GatewayIp.Increment(start_value=val_map[ed]["iipv4_local"]["gip"], step_value=val_map[ed]["iipv4_local"]["gip_step"]) - obj_map[ed]["iipv4_local"].GatewayIp.Steps[1].Enabled=True - obj_map[ed]["iipv4_local"].GatewayIp.Steps[1].Step = val_map[ed]["iipv4_local"]["gip_ng1_step"] - - - else: - - remote_vm_mac.Increment(start_value=val_map[ed]["vxlan"]["RemoteVmStaticMac"],step_value='00:00:00:00:00:01') - remote_vm_mac.Steps[0].Enabled =True - remote_vm_mac.Steps[0].Step = '00:00:00:08:00:00' - - #vxlan_sinfo.RemoteVmStaticIpv4.Increment(start_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"],step_value='0.0.0.1') - vxlan_sinfo.RemoteVmStaticIpv4.Custom( - start_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["start_value"], - step_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["step_value"], - ) - - vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Enabled =True - vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Step = val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["ng_step"] - - eth_allow = obj_map[ed]["ieth_allow"] - ip_allow = obj_map[ed]["iipv4_allow"] - eth_deny = obj_map[ed]["ieth_deny"] - ip_deny = obj_map[ed]["iipv4_deny"] - - - eth_allow.Mac.Custom( - start_value=val_map[ed]["ieth_allow"]["mac"]["start_value"], - step_value =val_map[ed]["ieth_allow"]["mac"]["step_value"], - increments =val_map[ed]["ieth_allow"]["mac"]["increments"] - ) - - eth_allow.Mac.Steps[1].Enabled = True - eth_allow.Mac.Steps[1].Step = val_map[ed]["ieth_allow"]["mac"]["ng_step"] - - ip_allow.Address.Custom( - start_value=val_map[ed]["iipv4_allow"]["ip"]["start_value"], - step_value =val_map[ed]["iipv4_allow"]["ip"]["step_value"], - increments =val_map[ed]["iipv4_allow"]["ip"]["increments"] - ) - ip_allow.Address.Steps[1].Enabled = True - ip_allow.Address.Steps[1].Step = val_map[ed]["iipv4_allow"]["ip"]["ng_step"] - - ip_allow.Prefix.Single(8) - - ip_allow.GatewayIp.Increment(start_value=val_map[ed]["iipv4_allow"]["gip"], step_value=val_map[ed]["iipv4_allow"]["gip_step"]) #Fix Increments - ip_allow.GatewayIp.Steps[1].Enabled=True - ip_allow.GatewayIp.Steps[1].Step = val_map[ed]["iipv4_allow"]["gip_ng_step"] - - - eth_deny.Mac.Custom( - start_value=val_map[ed]["ieth_deny"]["mac"]["start_value"], - step_value =val_map[ed]["ieth_deny"]["mac"]["step_value"], - increments =val_map[ed]["ieth_deny"]["mac"]["increments"] - ) - eth_deny.Mac.Steps[1].Enabled = True - eth_deny.Mac.Steps[1].Step = val_map[ed]["ieth_deny"]["mac"]["ng_step"] - - ip_deny.Address.Custom( - start_value=val_map[ed]["iipv4_deny"]["ip"]["start_value"], - step_value =val_map[ed]["iipv4_deny"]["ip"]["step_value"], - increments =val_map[ed]["iipv4_deny"]["ip"]["increments"] - ) - - ip_deny.Address.Steps[1].Enabled = True - ip_deny.Address.Steps[1].Step = val_map[ed]["iipv4_deny"]["ip"]["ng_step"] - - ip_deny.Prefix.Single(8) - - - ip_deny.GatewayIp.Increment(start_value=val_map[ed]["iipv4_deny"]["gip"], step_value=val_map[ed]["iipv4_deny"]["gip_step"]) #Fix Increments - ip_deny.GatewayIp.Steps[1].Enabled=True - ip_deny.GatewayIp.Steps[1].Step = val_map[ed]["iipv4_deny"]["gip_ng_step"] - - print("Create Traffic OneIPOneVPC") - if ip_type=="v4": - ipv4_local = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Local").Ethernet.find().Ipv4.find() - ipv4_allow = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Allow").Ethernet.find().Ipv4.find() - ipv4_deny = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Deny").Ethernet.find().Ipv4.find() - elif ip_type=="v6": - ipv4_local = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Local").Ethernet.find().Ipv6.find() - ipv4_allow = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Allow").Ethernet.find().Ipv6.find() - ipv4_deny = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Deny").Ethernet.find().Ipv6.find() - print("Create Traffic OneIPOneVPC") - - vpcs, ips = val_map[1]["oipv4pool"]["multiplier"], int(val_map[1]["vxlan"]["StaticInfoCount"]/2) - endpoints_allow,endpoints_deny=[], [] - - for vpc in range(vpcs): - endpoints_allow.append( - ( - deepcopy([{"arg1": ipv4_local.href,"arg2": 1,"arg3": 1,"arg4": vpc+1,"arg5": 1 }]), - deepcopy([{"arg1": ipv4_allow.href,"arg2": 1,"arg3": 1,"arg4": vpc*ips+1,"arg5": ips }]) - ) - ) - endpoints_deny.append( - ( - deepcopy([{"arg1": ipv4_local.href,"arg2": 1, "arg3": 1, "arg4": vpc+1, "arg5": 1 }]), - deepcopy([{"arg1": ipv4_deny.href ,"arg2": 1, "arg3": 1, "arg4": vpc*ips+1, "arg5": ips }]) - ) - ) - - ti_allow = createTI("Allow", endpoints_allow) - ti_deny = createTI("Deny", endpoints_deny) - - -#@pytest.mark.usefixtures("pps_config") -class Test_Dpu: - - def teardown_method(self, method): - print("Clean up configuration") - - def test_pps_001(self, setup, utils): - print('Start All Protocols test_pps_001') - ixnetwork.StartAllProtocols(Arg1='sync') - - try: - print('Verify protocol sessions') - protocolsSummary = StatViewAssistant(ixnetwork, 'Protocols Summary') - protocolsSummary.CheckCondition('Sessions Not Started', StatViewAssistant.EQUAL, 0) - protocolsSummary.CheckCondition('Sessions Down', StatViewAssistant.EQUAL, 0) - except Exception as e: - raise Exception(str(e)) - time.sleep(90) - - ti_allow = ixnetwork.Traffic.TrafficItem.find(Name="Allow") - ti_deny = ixnetwork.Traffic.TrafficItem.find(Name="Deny") - ti_allow.Generate() - ti_deny.Generate() - ixnetwork.Traffic.Apply() - utils.start_traffic(ixnetwork) - time.sleep(30) - utils.stop_traffic(ixnetwork) - - find_boundary(utils) - print(tabulate(final_result_data, headers=["Test","Max Possible PPS"], tablefmt="psql")) - - def test_pps_increment_udp(self, setup, utils): - - print('Start All Protocols test_pps_random_udp_src_dst') - ixnetwork.StartAllProtocols(Arg1='sync') - try: - print('Verify protocol sessions') - protocolsSummary = StatViewAssistant(ixnetwork, 'Protocols Summary') - protocolsSummary.CheckCondition('Sessions Not Started', StatViewAssistant.EQUAL, 0) - protocolsSummary.CheckCondition('Sessions Down', StatViewAssistant.EQUAL, 0) - except Exception as e: - raise Exception(str(e)) - - trafficItem = ixnetwork.Traffic.TrafficItem.find(Name="Deny") - if len(trafficItem)==1: - trafficItem.Enabled=False - ti_allow = ixnetwork.Traffic.TrafficItem.find(Name="Allow") - vm_start_value=9000 - host_start_value=10000 - host_step = 5000 - endpoint_sets = ti_allow.EndpointSet.find() - #for ep_up,ep_down in endpoint_sets: - for ce_up,ce_down in config_elements_sets: - print (ce_up,ce_down) - inner_udp = ce_up.Stack.find(TemplateName="udp-template.xml")[-1] - inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') - inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') - inn_sp.ValueType = "singleValue" - inn_dp.ValueType = "increment" - inn_sp.SingleValue = vm_start_value - inn_dp.StartValue = host_start_value - inn_dp.StepValue = 1 - inn_dp.CountValue = int(val_map[1]["vxlan"]["StaticInfoCount"]/2) - - - inner_udp = ce_down.Stack.find(TemplateName="udp-template.xml")[-1] - inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') - inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') - inn_sp.ValueType = "increment" - inn_dp.ValueType = "singleValue" - inn_dp.SingleValue = vm_start_value - inn_sp.StartValue = host_start_value - inn_sp.StepValue = 1 - inn_sp.CountValue = int(val_map[1]["vxlan"]["StaticInfoCount"]/2) - - - - vm_start_value+=1 - host_start_value=host_start_value+host_step - - ti_allow.Generate() - ixnetwork.Traffic.Apply() - utils.start_traffic(ixnetwork) - time.sleep(30) - utils.stop_traffic(ixnetwork) - - find_boundary(utils) - print(tabulate(final_result_data, headers=["Test","Max Possible PPS"], tablefmt="psql")) - - def test_cps_001(self, setup, create_ixload_session_url): - """ - Description: Verify ip address can be configured in SVI. - Topo: DUT02 ============ DUT01 - Dev. status: DONE - """ - def _patch_test_setting(url_patch_dict, setting): - - url = url_patch_dict['base_url'] + url_patch_dict[setting]['url'] - - return requests.patch(url, json=url_patch_dict[setting]['json']) - - def _get_timeline_link(timelines, timeline_key): - - link = "" - link_test = "" - - for elem in timelines: - if elem['name'] in timeline_key: - link_init = elem['links'][0]['href'] - link_init_list = link_init.split("/") - link_init_list.pop(len(link_init_list) - 1) - link_test = '/'.join(link_init_list) - - shaved = link_test.split("/") - for i in range(5): - shaved.pop(0) - shaved.insert(0, "") - link = "/".join(shaved) - - return link - - def _set_timeline_settings(test_settings, rampDownTime, sustainTime): - - timeline_url = 'http://' + test_settings.gatewayServer + ":{}".format( - test_settings.gatewayPort) + '/api/v1/' + session_url + '/ixload/test/activeTest/timelineList' - response = requests.get(timeline_url, headers=headers) - timelines = response.json() - - timeline1_url = 'http://' + test_settings.gatewayServer + ":{}".format( - test_settings.gatewayPort) + '/api/v1/' + session_url + \ - _get_timeline_link(timelines, "Timeline1") - timeline1_settings = {"rampDownTime": rampDownTime, "sustainTime": sustainTime} - requests.patch(timeline1_url, json=timeline1_settings) - - timeline2_url = 'http://' + test_settings.gatewayServer + ":{}".format( - test_settings.gatewayPort) + '/api/v1/' + session_url + \ - _get_timeline_link(timelines, "Timeline2") - timeline2_settings = {"rampDownTime": rampDownTime, "sustainTime": sustainTime} - requests.patch(timeline2_url, json=timeline2_settings) - - timeline_matchLongest_url = 'http://' + test_settings.gatewayServer + ":{}".format( - test_settings.gatewayPort) + '/api/v1/' + session_url + \ - _get_timeline_link(timelines, "") - matchLongest_settings = {"sustainTime": sustainTime} - requests.patch(timeline_matchLongest_url, json=matchLongest_settings) - - return - - def _getTestCurrentState(connection, sessionUrl): - - activeTestUrl = "%s/ixload/test/activeTest" % (sessionUrl) - testObj = connection.httpGet(activeTestUrl) - - return testObj.currentState - - def _print_final_table(test_run_results): - stat_table = [] - stat_columns = ["It", "Obtained CPS", "HTTP Requests Failed", "TCP Retries", - "TCP Resets TX", "TCP Resets RX"] - for iter in test_run_results: - stat_table.append(iter) - print("\n%s" % tabulate(stat_table, headers=stat_columns, tablefmt='psql', floatfmt=".2f")) - - def _poll_stats(connection, sessionUrl, watchedStatsDict, pollingInterval=4): - - statSourceList = list(watchedStatsDict) - - # retrieve stats for a given stat dict - # all the stats will be saved in the dictionary below - - # statsDict format: - # { - # statSourceName: { - # timestamp: { - # statCaption : value - # } - # } - # } - stats_dict = {} - - # remember the timstamps that were already collected - will be ignored in future - collectedTimestamps = {} # format { statSource : [2000, 4000, ...] } - testIsRunning = True - - # check stat sources - for statSource in statSourceList[:]: - statSourceUrl = "%s/ixload/stats/%s/values" % (sessionUrl, statSource) - statSourceReply = connection.httpRequest("GET", statSourceUrl) - if statSourceReply.status_code != 200: - statSourceList.remove(statSource) - - # check the test state, and poll stats while the test is still running - while testIsRunning: - - # the polling interval is configurable. by default, it's set to 4 seconds - time.sleep(pollingInterval) - - for statSource in statSourceList: - valuesUrl = "%s/ixload/stats/%s/values" % (sessionUrl, statSource) - - valuesObj = connection.httpGet(valuesUrl) - valuesDict = valuesObj.getOptions() - - # get just the new timestamps - that were not previously retrieved in another stats polling iteration - newTimestamps = [int(timestamp) for timestamp in list(valuesDict) if - timestamp not in collectedTimestamps.get(statSource, [])] - newTimestamps.sort() - - for timestamp in newTimestamps: - timeStampStr = str(timestamp) - - collectedTimestamps.setdefault(statSource, []).append(timeStampStr) - - timestampDict = stats_dict.setdefault(statSource, {}).setdefault(timestamp, {}) - - # save the values for the current timestamp, and later print them - for caption, value in iteritems(valuesDict[timeStampStr].getOptions()): - if caption in watchedStatsDict[statSource]: - timestampDict[caption] = value - stat_table_row = [] - for table_row in timestampDict.keys(): - stat_table_row.append(table_row) - table = [] - columns = ['Stat Source', 'Time Stamp', 'Stat Name', 'Value'] - for i, stat in enumerate(stat_table_row): - table.append([statSource, timeStampStr, stat, timestampDict[stat]]) - # print("\n%s" % tabulate(table, headers=columns, tablefmt='psql')) - - testIsRunning = _getTestCurrentState(connection, sessionUrl) == "Running" - - print("Stopped receiving stats.") - return stats_dict - - def _get_stats_global(stats_dict): - stats_global = [] - - for key in stats_dict['HTTPClient'].keys(): - if key in stats_dict['HTTPClient'] and key in stats_dict['HTTPServer']: - stats_global.append([key, stats_dict['HTTPClient'][key]['HTTP Simulated Users'], - stats_dict['HTTPClient'][key]['HTTP Concurrent Connections'], - stats_dict['HTTPClient'][key]['TCP CPS'], - stats_dict['HTTPClient'][key]['HTTP Connect Time (us)'], - stats_dict['HTTPServer'][key]['HTTP Requests Failed'], - stats_dict['HTTPServer'][key]['TCP Retries'], - stats_dict['HTTPServer'][key]['TCP Resets Sent'], - stats_dict['HTTPServer'][key]['TCP Resets Received']]) - - return stats_global - - def _check_for_error_stats(test_stats, error_type): - - error_dict = { - error_type: { - "first_time": 0, - "last_time": 0, - "num_of_seq_timestamps": 0 - } - } - - timestamps_l = [i[0] for i in test_stats] - errors_l = [i[1] for i in test_stats] - seen = set() - dupes = {} - - first_time = 0 - for i, x in enumerate(errors_l): - if x in seen: - dupes.setdefault(x, []).append(i) - else: - seen.add(x) - - # insert timestamp index location at beginning of list - for key in dupes.keys(): - dupes[key].insert(0, dupes[key][0] - 1) - - # make list of lens of each duplicates, then remove and remove rest of error entries from dupes dict - errors_l = [len(dupes[x]) for x in dupes.keys()] - max_index = errors_l.index(max(errors_l)) - errors_l.pop(max_index) - - # keep only the highest number of stable - for i, key in enumerate(list(dupes)): - if i != max_index: - dupes.pop(key, None) - - for key in dupes.keys(): - error_dict[error_type]["first_time"] = dupes[key][0] - error_dict[error_type]["last_time"] = dupes[key][-1] - - if list(dupes.keys())[0] != 0: - error_dict[error_type]["num_of_seq_timestamps"] = len(dupes[key]) - else: - error_dict[error_type]["num_of_seq_timestamps"] = 0 - - return error_dict - - def _get_max_cps(test_stats, cps_stats): - - cps_list = [] - for cps in cps_stats: - cps_list.append(cps[1]) - - stats = deepcopy(cps_list) - for i, elem in enumerate(stats): - if elem == '""': - stats[i] = 0 - - stats.sort() - max_cps = stats[-1] - cps_max_w_ts = cps_stats[cps_list.index(max_cps)] - - return cps_max_w_ts - - def _get_effective_cps(cps_stats, http_requests_dict, tcp_retries_dict, tcp_resets_tx_dict, tcp_resets_rx_dict): - - error_list = [http_requests_dict, tcp_retries_dict, tcp_resets_tx_dict, tcp_resets_rx_dict] - num_of_timestamps = len(cps_stats) - - seq_l = [list(x.values())[0]["num_of_seq_timestamps"] for x in error_list] - error_list[seq_l.index(max(seq_l))] - key = list(error_list[seq_l.index(max(seq_l))].keys())[0] - first_time = error_list[seq_l.index(max(seq_l))][key]["first_time"] - last_time = error_list[seq_l.index(max(seq_l))][key]["last_time"] - - effective_cps_ts = { - "first_time": cps_stats[first_time][0], - "last_time": cps_stats[last_time][0] - } - - if max(seq_l) != 0: - avg = 0 - effective_cps_l = [] - for i, cps in enumerate(cps_stats): - if i >= first_time and i <= last_time: - effective_cps_l.append(cps) - avg += cps[1] - effective_cps = avg / error_list[seq_l.index(max(seq_l))][key]["num_of_seq_timestamps"] - else: - effective_cps = 0 - effective_cps_ts = {"first_time": 0, "last_time": cps_stats[last_time][0]} - - return effective_cps, effective_cps_ts - - def _get_latency_ranges(test_stats): - - latency_stats = { - "latency_min": 0, - "latency_max": 0, - "latency_avg": 0 - } - - only_lat_stats = [] - for lat_stat in test_stats: - if lat_stat[4] == '""': - lat_stat[4] = 0 - only_lat_stats.append(lat_stat[4]) - - latency_stats["latency_min"] = min(only_lat_stats) - latency_stats["latency_max"] = max(only_lat_stats) - - lat_addr = 0 - for elem in only_lat_stats: - lat_addr += elem - - latency_stats["latency_avg"] = lat_addr / len(only_lat_stats) - - return latency_stats - - def _get_testrun_results(stats_dict, url_patch_dict): - - stats_global = _get_stats_global(stats_dict) - - failures_dict = {"http_requests_failed": 0, "tcp_retries": 0, "tcp_resets_tx": 0, - "tcp_resets_rx": 0, "total": 0} - - # get and compare stats - http_requests_failed_l = [[x[0], x[5]] for x in stats_global] - http_requests_failed = max([x[1] for x in http_requests_failed_l]) - failures_dict["http_requests_failed"] = http_requests_failed - #http_requests_dict = _check_for_error_stats(http_requests_failed_l, "http_requests_failed") - - tcp_retries_l = [[x[0], x[6]] for x in stats_global] - tcp_retries = max([x[1] for x in tcp_retries_l]) - failures_dict["tcp_retries"] = tcp_retries - #tcp_retries_dict = _check_for_error_stats(tcp_retries_l, "tcp_retries") - - tcp_resets_tx_l = [[x[0], x[7]] for x in stats_global] - tcp_resets_tx = max([x[1] for x in tcp_resets_tx_l]) - failures_dict["tcp_resets_tx"] = tcp_resets_tx - #tcp_resets_tx_dict = _check_for_error_stats(tcp_resets_tx_l, "tcp_resets_tx") - - tcp_resets_rx_l = [[x[0], x[8]] for x in stats_global] - tcp_resets_rx = max([x[1] for x in tcp_resets_rx_l]) - failures_dict["tcp_resets_rx"] = tcp_resets_rx - #tcp_resets_rx_dict = _check_for_error_stats(tcp_resets_rx_l, "tcp_resets_rx") - - failures = http_requests_failed + tcp_retries + tcp_resets_tx + tcp_resets_rx - failures_dict["total"] = failures - - steady_time_start = url_patch_dict['timeline_settings']['advancedIteration']['d0'] * 1000 - cps_stats = [[x[0], x[3]] for x in stats_global if x[0] >= steady_time_start] - cps_max_w_ts = _get_max_cps(stats_global, cps_stats) - cps_max = cps_max_w_ts[1] - #effective_cps, effective_cps_ts = _get_effective_cps(cps_stats, http_requests_dict, tcp_retries_dict, - # tcp_resets_tx_dict, tcp_resets_rx_dict) - - latency_ranges = _get_latency_ranges(stats_global) - - return failures_dict, cps_max, cps_max_w_ts, latency_ranges - - def _print_stat_table(cps_max_w_ts, failures_dict, latency_ranges): - - stat_table = [] - stat_columns = ["Timestamp (s)", "TCP Max CPS", "Total Failures"] - stat_table.append([int(cps_max_w_ts[0]) / 1000, int(cps_max_w_ts[1]), failures_dict["total"]]) - - stat_f_table = [] - stat_f_columns = ["HTTP Requests Failed", "TCP Retries", "TCP Resets TX", "TCP Resets RX"] - stat_f_table.append([failures_dict["http_requests_failed"], failures_dict["tcp_retries"], - failures_dict["tcp_resets_tx"], failures_dict["tcp_resets_rx"]]) - - lat_table = [] - lat_table.append( - [latency_ranges["latency_min"], latency_ranges["latency_max"], latency_ranges["latency_avg"]] - ) - lat_stat_columns = ["Connect Time min (us)", "Connect Time max (us)", "Connect Time avg (us)"] - - print("\n%s" % tabulate(stat_table, headers=stat_columns, tablefmt='psql')) - print("\n%s" % tabulate(stat_f_table, headers=stat_f_columns, tablefmt='psql')) - print("\n%s" % tabulate(lat_table, headers=lat_stat_columns, tablefmt='psql')) - - def _run_cc_test(connection, session_url, url_patch_dict, MAX_CPS, MIN_CPS, - threshold, target_failures, test_settings, start_value=0): - - test_run_results = [] - test_value = start_value - test_iteration = 1 - - test_result = "" - IxLoadUtils.log( - "----Test Iteration %d------------------------------------------------------------------" - % test_iteration) - old_value = test_value - IxLoadUtils.log("Testing CC Objective = %d" % test_value) - kActivityOptionsToChange = { - # format: { activityName : { option : value } } - "HTTPClient1": { - "userIpMapping": "1:ALL", - "enableConstraint": False, - "userObjectiveType": "concurrentConnections", - "userObjectiveValue": int(test_value), - } - } - IxLoadUtils.log("Updating CPS objective value settings...") - IxLoadUtils.changeActivityOptions(connection, session_url, kActivityOptionsToChange) - IxLoadUtils.changeActivityOptions(connection, session_url, kActivityOptionsToChange) - IxLoadUtils.log("CPS objective value updated.") - - IxLoadUtils.log("Saving rxf") - IxLoadUtils.saveRxf(connection, session_url, "C:\\automation\\24k_8VPC_CC_{}.rxf".format(test_iteration)) - - IxLoadUtils.log("Applying config...") - IxLoadUtils.applyConfiguration(connection, session_url) - - IxLoadUtils.log("Starting the test...") - IxLoadUtils.runTest(connection, session_url) - IxLoadUtils.log("Test started.") - - IxLoadUtils.log("Test running and extracting stats...") - stats_dict = _poll_stats(connection, session_url, stats_test_settings) - IxLoadUtils.log("Test finished.") - - failures_dict, cps_max, cps_max_w_ts, latency_ranges = _get_testrun_results(stats_dict, url_patch_dict) - - _print_stat_table(cps_max_w_ts, failures_dict, latency_ranges) - - test_run_results.append( - [test_iteration, cps_max, failures_dict["http_requests_failed"], - failures_dict["tcp_retries"], failures_dict["tcp_resets_tx"], - failures_dict["tcp_resets_rx"]] - ) - - return cps_max_w_ts, failures_dict, test_run_results, latency_ranges - - def _create_ip_ranges(connection, session_url, traffic_network, plugin_name): - - IxLoadUtils.HttpUtils.addIpRange(connection, session_url, traffic_network, - plugin_name, {"ipType": "IPv4"}) - - def _get_ip_range_names(connection, session_url, traffic_network, plugin_names, url_patch_dict): - - ip_range_names = [] - range_string = IxLoadUtils.HttpUtils.getRangeListUrl(connection, session_url, traffic_network, plugin_names, - "rangeList") - string_split = range_string.split("/") - range_url = "/" + "/".join(string_split[2:]) - url = url_patch_dict["base_url"] + range_url - - response = requests.get(url, params=None) - range_list_info = response.json() - - for elem in range_list_info: - ip_range_names.append(elem['name']) - - return ip_range_names, range_list_info - - def _create_traffic_map(connection, url_patch_dict, nsgs, enis, ip_ranges_per_vpc): - # Make Traffic Map Settings - - portMapPolicy_json = {'portMapPolicy': 'customMesh'} - destinations_url = url_patch_dict['base_url'] + url_patch_dict['traffic_maps']['destinations_url'] - response = requests.patch(destinations_url, json=portMapPolicy_json) - - # meshType - submapsIPv4_url = url_patch_dict['base_url'] + url_patch_dict['traffic_maps']['subMapsIPv4_url'] - meshType_json = url_patch_dict['traffic_maps']['meshType_setting'] - response = requests.patch(submapsIPv4_url, json=meshType_json) - - # map source-to-destination - sourceRanges_url = submapsIPv4_url + "/sourceRanges/%s" - destId = 1 - if url_patch_dict['traffic_maps']['meshType_setting']['meshType'] == 'ipRangePairs': - ip_count = 0 - for i in range(nsgs): - destinationId_json = {'destinationId': destId} - url = sourceRanges_url % (i) - response = requests.patch(url, json=destinationId_json) - ip_count += 1 - if ip_count == ip_ranges_per_vpc: - destId += 1 - ip_count = 0 - else: - # vlanRangePairs meshType - for i in range(enis): - destinationId_json = {'destinationId': destId} - url = sourceRanges_url % (i) - response = requests.patch(url, json=destinationId_json) - destId += 1 - - # destinationRanges - destRanges_json = {'enable': False} - destinationRanges_url = url_patch_dict['base_url'] + "/destinationRanges/%s" - for i in range(enis): - url = destinationRanges_url % (i) - if i == 0: - response = requests.patch(url, json=destRanges_json) - - return - - def _build_node_ips(count, vpc, nodetype="client"): - IP_STEP1 = int(ipaddress.ip_address(u'0.0.0.1')) - IP_STEP2 = int(ipaddress.ip_address(u'0.0.1.0')) - IP_STEP3 = int(ipaddress.ip_address(u'0.1.0.0')) - IP_STEP4 = int(ipaddress.ip_address(u'1.0.0.0')) - IP_STEPE = int(ipaddress.ip_address(u'0.0.0.2')) - IP_C_START = ipaddress.ip_address(u'1.128.0.1') - IP_S_START = ipaddress.ip_address(u'1.1.0.1') - - if nodetype in "client": - ip = ipaddress.ip_address(int(IP_C_START) + (IP_STEP3 * count * 4) + (IP_STEP4 * (vpc - 1))) - - if nodetype in "server": - ip = ipaddress.ip_address(int(IP_S_START) + (IP_STEP4 * (vpc - 1))) - - return ip - - def _set_ip_range_options(ip_count, eni_index, nodetype): - - if nodetype in "client": - host_count = 500 - incrementBy = "0.0.2.0" - else: - host_count = 1 - incrementBy = "0.0.0.2" - - ip = str(_build_node_ips(ip_count, eni_index, nodetype)) - - IpOptionsToChange = {'count': host_count, 'ipAddress': ip, 'prefix': 8, 'incrementBy': incrementBy, - 'gatewayAddress': "0.0.0.0", 'gatewayIncrement': '0.0.0.0'} - - - return IpOptionsToChange - - def _build_node_macs(count, vpc, nodetype="client"): - ENI_MAC_STEP = '00:00:00:08:00:00' - mac_start_client = macaddress.MAC('00:1B:6E:80:00:01') - mac_start_server = macaddress.MAC('00:1B:6E:00:00:01') - mac_incr1 = macaddress.MAC('00:00:00:01:00:00') - mac_incr3 = macaddress.MAC('00:00:00:03:00:00') - - if nodetype in "client": - m = macaddress.MAC(int(mac_start_client) + int(macaddress.MAC(ENI_MAC_STEP)) * (vpc - 1) + (int(mac_incr1) * count)) - - if nodetype in "server": - m = macaddress.MAC(int(mac_start_server) + int(macaddress.MAC(ENI_MAC_STEP)) * (vpc - 1)) - - return m - - def _set_mac_range_options(ip_count=0, eni_index=0, nodetype="client"): - - if nodetype in "client": - mac_increment = "00:00:00:00:00:80" - else: - mac_increment = "00:00:00:00:00:02" - - mac_address = str(_build_node_macs(ip_count, eni_index, nodetype)) - mac_address = mac_address.replace("-", ":") - - macOptionsToChange = {"mac": mac_address, "incrementBy": mac_increment} - - return macOptionsToChange - - def _set_vlan_range_options(url_patch_dict, index, nodetype="client"): - - if nodetype == 'client': - firstId = url_patch_dict['client_vlan_settings']['json']['firstId'] + index - uniqueCount = url_patch_dict['client_vlan_settings']['json']['uniqueCount'] - else: - firstId = url_patch_dict['server_vlan_settings']['json']['firstId'] + index - uniqueCount = url_patch_dict['server_vlan_settings']['json']['uniqueCount'] - - vlan_settings = {'firstId': firstId, 'uniqueCount': uniqueCount} - - return vlan_settings - - def _get_url_ip(nodetype, node_ip_range_names, index): - - if nodetype == "client": - range_url = url_patch_dict['client_range_setting']['url'] - else: - range_url = url_patch_dict['server_range_setting']['url'] - - r_index = node_ip_range_names[index].split("-")[1][1:] - url_ip = url_patch_dict['base_url'] + range_url % (r_index) - - return url_ip - - # MAIN - kCommunities = [ - # format: {option1: value1, option2: value2} - {}, # default community with no options - {"tcpAccelerationAllowedFlag": True}, # community with tcpAccelerationAllowedFlag set to True - ] - - kActivities = { - 'Traffic1@Network1': ['HTTP Client'], - 'Traffic2@Network2': ['HTTP Server'] - } - - kNewCommands = { - # format: { agent name : [ { field : value } ] } - "HTTPClient1": [ - { - "commandType": "GET", - "destination": "Traffic2_HTTPServer1:80", - "pageObject": "/1b.html", - }, - ], - } - - stats_test_settings = { - 'HTTPClient': ['HTTP Simulated Users', - 'HTTP Concurrent Connections', - 'TCP CPS', - 'HTTP Connect Time (us)', - ], - 'HTTPServer': ['HTTP Requests Failed', - 'TCP Retries', - 'TCP Resets Sent', - 'TCP Resets Received', - ], - } - - stats_dict = {} - location = inspect.getfile(inspect.currentframe()) - - session = create_ixload_session_url - connection = session['connection'] - test_settings = session['test_settings'] - - headers = {'Accept': 'application/json'} - session_url = IxLoadUtils.createNewSession(connection, test_settings.ixLoadVersion) - base_url = 'http://' + test_settings.gatewayServer + ":{}".format(test_settings.gatewayPort) + \ - '/api/v1/' + session_url - - url_patch_dict = { - 'base_url': base_url, - 'traffic_maps': { - 'meshType_setting': {'meshType': "vlanRangePairs"}, - #'meshType_setting': {'meshType': "ipRangePairs"}, - 'subMapsIPv4_url': "/ixload/test/activeTest/communityList/0/activityList/0/destinations/0/customPortMap/submapsIPv4/0", - 'destinations_url': "/ixload/test/activeTest/communityList/0/activityList/0/destinations/0" - }, - 'allow_routes': { - 'json': {"allowRouteConflicts": True}, - 'url': "/ixload/preferences" - }, - 'auto_mac_setting': { - "autoMacGeneration": False - }, - 'timeline_settings': { - 'timelineType': 1, - 'url': "/ixload/test/activetest/communitylist/0/activitylist/0/timeline", - 'advanced': { - 'rampUpValue': 1000000, - 'sustainTime': 240, - }, - 'advancedIteration': { - 'd0': 120, - 'd1': 150, - 'd2': 10, - 'd3': 10, - } - }, - 'client_range_setting': { - 'json': {}, - 'url': "/ixload/test/activeTest/communityList/0/network/stack/childrenList/2/childrenList/3/rangeList/%s" - }, - 'server_range_setting': { - 'json': {}, - 'url': "/ixload/test/activeTest/communityList/1/network/stack/childrenList/5/childrenList/6/rangeList/%s" - }, - 'client_vlan_settings': { - 'json': {"firstId": 101, "uniqueCount": 1}, - 'url': "/ixload/test/activeTest/communityList/0/network/stack/childrenList/2/childrenList/3/rangeList/%s/vlanRange" - }, - 'server_vlan_settings': { - 'json': {"firstId": 1, "uniqueCount": 1}, - 'url': "/ixload/test/activeTest/communityList/1/network/stack/childrenList/5/childrenList/6/rangeList/%s/vlanRange" - }, - 'http_version': { - 'json': {"httpVersion": 1}, - 'url': "/ixload/test/activeTest/communityList/0/activityList/0/agent" - }, - 'http_tcp_conns_per_user': { - 'json': {"maxSessions": 48}, - 'url': "/ixload/test/activeTest/communityList/0/activityList/0/agent" - }, - 'client_disable_tcp_tw_recycle': { - 'json': {"tcp_tw_recycle": False}, - 'url': "/ixload/test/activeTest/communityList/0/network/globalPlugins/2" - }, - 'server_disable_tcp_tw_recycle': { - 'json': {"tcp_tw_recycle": False}, - 'url': "/ixload/test/activeTest/communityList/1/network/globalPlugins/5" - }, - 'stats_configured': { - 'url': '/ixload/stats/HTTPClient/configuredStats' - }, - 'cps_aggregation_type': { - 'json': {"aggregationType": "kRate"}, - 'url': "" - }, - 'cps_stat_caption': { - 'json': {"caption": "TCP CPS"}, - 'url': "" - } - } - - enis = 8 - ip_ranges_per_vpc = 6 - num_ranges = enis - nsgs = enis * ip_ranges_per_vpc - - IxLoadUtils.log('Creating communities...') - IxLoadUtils.addCommunities(connection, session_url, kCommunities) - IxLoadUtils.log('Communities created.') - - IxLoadUtils.log('Creating activities..') - IxLoadUtils.addActivities(connection, session_url, kActivities) - IxLoadUtils.log('Activities created..') - - IxLoadUtils.log("Enabling Forceful Ownership of Ports") - IxLoadUtils.enableForcefullyTakeOwnershipAndResetPorts(connection, session_url) - IxLoadUtils.log("Forceful Ownership Complete") - - response = _patch_test_setting(url_patch_dict, 'allow_routes') - - IxLoadUtils.log("Clearing commands %s..." % (list(kNewCommands))) - IxLoadUtils.clearAgentsCommandList(connection, session_url, list(kNewCommands)) - IxLoadUtils.log("Command lists cleared.") - - IxLoadUtils.log("Adding IPv4 ranges ...") - # Create Client and Server IP Ranges - for _ in range(nsgs): - _create_ip_ranges(connection, session_url, "Traffic1@Network1", "IP-1") - - for _ in range(enis): - _create_ip_ranges(connection, session_url, "Traffic2@Network2", "IP-2") - - # Get Client/Server IP range info - client_ip_range_names, client_range_list_info = _get_ip_range_names(connection, session_url, - "Traffic1@Network1", "IP-1", url_patch_dict) - server_ip_range_names, server_range_list_info = _get_ip_range_names(connection, session_url, - "Traffic2@Network2", "IP-2", url_patch_dict) - - IxLoadUtils.log("Disabling autoMacGeneration ...") - for i in range(nsgs): - url_ip = _get_url_ip("client", client_ip_range_names, i) - response = requests.patch(url_ip, json=url_patch_dict['auto_mac_setting']) - #response = self.make_request('PATCH', url_ip, url_patch_dict['auto_mac_setting']) - - for i in range(enis): - url_ip = _get_url_ip("server", server_ip_range_names, i) - response = requests.patch(url_ip, json=url_patch_dict['auto_mac_setting']) - #response = self.make_request('PATCH', url_ip, url_patch_dict['auto_mac_setting']) - - vlan_enabled = {"enabled": True} - - IxLoadUtils.log("Creating Client IPs, MACs, and VLANIDs") - client_ip_range_settings = [] - client_mac_range_settings = [] - client_vlan_range_settings = [] - eni_index = 1 - ip_count = 0 - nodetype = "client" - # Build Client IPs and MACs - for i in range(nsgs + 1 + ip_ranges_per_vpc): - if ip_count < ip_ranges_per_vpc and eni_index <= enis: - # --- ixNet objects need to be added in the list before they are configured. - client_ip_range_settings.append(_set_ip_range_options(ip_count, eni_index, nodetype)) - client_mac_range_settings.append(_set_mac_range_options(ip_count, eni_index, nodetype)) - client_vlan_range_settings.append(_set_vlan_range_options(url_patch_dict, eni_index-1, nodetype)) - ip_count += 1 - else: - eni_index += 1 - ip_count = 0 - - IxLoadUtils.log("Setting Client Ranges: IPs, MACs, VLANs") - for i in range(nsgs): - # Enable VLAN settings - range_url = url_patch_dict['client_range_setting']['url'] - r_index = client_ip_range_names[i].split("-")[1][1:] - - url_ip = url_patch_dict['base_url'] + range_url % (r_index) - url_mac = url_patch_dict['base_url'] + range_url % (r_index) + "/macRange" - url_vlan = url_patch_dict['base_url'] + range_url % (r_index) + "/vlanRange" - - response = requests.patch(url_ip, json=client_ip_range_settings[i]) - response = requests.patch(url_mac, json=client_mac_range_settings[i]) - response = requests.patch(url_vlan, json=vlan_enabled) - response = requests.patch(url_vlan, json=client_vlan_range_settings[i]) - - IxLoadUtils.log("Creating Server IPs, MACs, and VLANIDs") - nodetype = "server" - server_ip_range_settings = [] - server_mac_range_settings = [] - server_vlan_range_settings = [] - # Build Server IPs and MACs - for i in range(enis): - server_ip_range_settings.append(_set_ip_range_options(0, i + 1, nodetype)) - server_mac_range_settings.append(_set_mac_range_options(0, i+1, nodetype)) - server_vlan_range_settings.append(_set_vlan_range_options(url_patch_dict, i, nodetype)) - - IxLoadUtils.log("Setting Server Ranges: IPs, MACs, VLANs") - for i in range(enis): - range_url = url_patch_dict['server_range_setting']['url'] - r_index = server_ip_range_names[i].split("-")[1][1:] - - url_ip = url_patch_dict['base_url'] + range_url % (r_index) - url_mac = url_patch_dict['base_url'] + range_url % (r_index) + "/macRange" - url_vlan = url_patch_dict['base_url'] + range_url % (r_index) + "/vlanRange" - - response = requests.patch(url_ip, json=server_ip_range_settings[i]) - response = requests.patch(url_mac, json=server_mac_range_settings[i]) - response = requests.patch(url_vlan, json=vlan_enabled) - response = requests.patch(url_vlan, json=server_vlan_range_settings[i]) - - IxLoadUtils.log("Disabling Unused IP ranges ...") - kIpOptionsToChange = { - # format : { IP Range name : { optionName : optionValue } } - client_ip_range_names[-1]: { - 'count': 1, - 'enabled': False, - }, - server_ip_range_names[-1]: { - 'count': 1, - 'enabled': False, - } - } - IxLoadUtils.changeIpRangesParams(connection, session_url, kIpOptionsToChange) - - # Turn off TCP settings - IxLoadUtils.log("Adjusting Test Settings, TCP, HTTP ...") - response = _patch_test_setting(url_patch_dict, 'http_version') - response = _patch_test_setting(url_patch_dict, 'http_tcp_conns_per_user') - - response = _patch_test_setting(url_patch_dict, 'client_disable_tcp_tw_recycle') - response = _patch_test_setting(url_patch_dict, 'server_disable_tcp_tw_recycle') - - IxLoadUtils.log("Adjusting Test Timeline settings ...") - if url_patch_dict['timeline_settings']['timelineType'] == 0: - rampDownTime = 10 - sustainTime = 180 - _set_timeline_settings(test_settings, rampDownTime, sustainTime) - else: - url_timeline = url_patch_dict['base_url'] + url_patch_dict['timeline_settings']['url'] - timelineType_json = {'timelineType': url_patch_dict['timeline_settings']['timelineType']} - response = requests.patch(url_timeline, json=timelineType_json) - - timeline_json = url_patch_dict['timeline_settings']['advanced'] - response = requests.patch(url_timeline, json=timeline_json) - - advanced_url = url_timeline + "/advancedIteration/segmentList/%s" - for i in range(4): - url = advanced_url % (i) - d_json = {'duration': url_patch_dict['timeline_settings']['advancedIteration']['d{}'.format(i)]} - response = requests.patch(url, json=d_json) - - # Change TCP Connections Established to CPS caption name and to use kRate aggregationType - stats_configured_url = url_patch_dict['base_url'] + url_patch_dict['stats_configured']['url'] - response = requests.get(stats_configured_url, params=None) - stat_url_list = response.json() - for stat in stat_url_list: - if stat['caption'] == 'TCP Connections Established': - objectID = stat['objectID'] - - cps_url = url_patch_dict['stats_configured']['url'] + '/' + str(objectID) - url_patch_dict['cps_aggregation_type']['url'] = cps_url - url_patch_dict['cps_stat_caption']['url'] = cps_url - - response = _patch_test_setting(url_patch_dict, 'cps_aggregation_type') - response = _patch_test_setting(url_patch_dict, 'cps_stat_caption') - - IxLoadUtils.log("Adding new commands %s..." % (list(kNewCommands))) - IxLoadUtils.addCommands(connection, session_url, kNewCommands) - IxLoadUtils.log("Commands added.") - - IxLoadUtils.log("Creating custom traffic maps") - _create_traffic_map(connection, url_patch_dict, nsgs, enis, ip_ranges_per_vpc) - IxLoadUtils.log("Traffic Maps completed") - - IxLoadUtils.log("Clearing chassis list...") - IxLoadUtils.clearChassisList(connection, session_url) - IxLoadUtils.log("Chassis list cleared.") - - IxLoadUtils.log("Adding chassis %s..." % (test_settings.chassisList)) - IxLoadUtils.addChassisList(connection, session_url, test_settings.chassisList) - IxLoadUtils.log("Chassis added.") - - IxLoadUtils.log("Assigning new ports...") - IxLoadUtils.assignPorts(connection, session_url, test_settings.portListPerCommunity) - IxLoadUtils.log("Ports assigned.") - - initial_objective = 6000000 - threshold = 100000 - target_failures = 1000 - MAX_CPS = 9000000 - MIN_CPS = 0 - cps_max_w_ts, failures_dict, test_run_results, latency_ranges = _run_cc_test(connection, session_url, - url_patch_dict, - MAX_CPS, - MIN_CPS, threshold, - target_failures, test_settings, - initial_objective) - - IxLoadUtils.log("Test Complete Final Values") - _print_final_table(test_run_results) - - IxLoadUtils.deleteAllSessions(connection) - +import inspect +import json +import sys +import time +from copy import deepcopy + +import ipaddress +import macaddress +import pytest +import requests +from ixload import IxLoadUtils as IxLoadUtils +from ixnetwork_restpy import SessionAssistant +from ixnetwork_restpy.assistants.statistics.statviewassistant import StatViewAssistant +from tabulate import tabulate +from testdata_baby_hero import testdata,ip_type +from datetime import datetime +from future.utils import iteritems + +data = [] +final_result_data=[] +setup_information=None +ixnetwork=None +config_elements_sets=[] +val_map={} +tiNo = 16 +captions = ["Test","PPS", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %","PossibleBoundary"] + + +@pytest.fixture(scope="class") +def setup(smartnics, tbinfo,utils): + """Gather all required test information from DUT and tbinfo. + A Dictionary with required test information. + """ + print ("*"*50+"SETUP"+"*"*50) + setup_information = {"nics": smartnics, "tbinfo": tbinfo, } + smartnics.configure_target(testdata) + yield setup_information + +def find_boundary(utils): + global data, final_result_data + hls = ixnetwork.Traffic.TrafficItem.find()[0].HighLevelStream.find() + + def boundary_check(test_boundary_val): + for hl in hls: + hl.FrameRate.update(Type='framesPerSecond', Rate=test_boundary_val) + + utils.start_traffic(ixnetwork) + utils.ss("\t\t\tLet Traffic run for ", 10) + utils.ss("\t\t\tPrint Stats Before issuing Clear Stats ", 2) + utils.printStats(ixnetwork, "Traffic Item Statistics", {"Traffic Item Statistics": {'transpose': False, 'toprint': ["Traffic Item", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %"]}}) + utils.ss("\t\t\tLet Clear Stats ", 2) + ixnetwork.ClearStats() + utils.ss("\t\t\tLet Traffic run for another ", 90) + utils.stop_traffic(ixnetwork) + utils.ss("\t\t\tLets wait for stats to settle down for ", 10) + #print("\tVerify Traffic stats") + ti = StatViewAssistant(ixnetwork, 'Traffic Item Statistics') + if float(ti.Rows[0]['Frames Delta']) == float(0): + ixnetwork.ClearStats() + return False + else: + ixnetwork.ClearStats() + return True + + poss_val, step, tolerance, pass_val, fail_val = int(20000000 / tiNo), int(20000000 / tiNo), 100000, None, None + #poss_val, step, tolerance, pass_val, fail_val = int(20000000 / tiNo), int(20000000 / tiNo), 50000, None, None + + while True: + print("="*50) + print(f"Test running for {utils.human_format(poss_val * tiNo)} framesPerSecond") + print(" POSSPASS|FAIL|PASS=", poss_val, fail_val, pass_val) + print("="*50) + result = boundary_check(poss_val) + row = utils.printStats(ixnetwork, "Traffic Item Statistics", {"Traffic Item Statistics": {'transpose': False, 'toprint': ["Traffic Item", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %"]}}) + utils.printStats(ixnetwork, "Flow Statistics", {"Flow Statistics": {'transpose': False, 'toprint': ["Traffic Item", "Source/Dest Endpoint Pair", "Tx Frames", "Rx Frames", "Frames Delta", "Loss %"]}}) + data.append([sys._getframe().f_back.f_code.co_name,utils.human_format(poss_val * tiNo)]+row[1:]) + + if result: + fail_val = poss_val + if pass_val: + poss_val = int((pass_val+fail_val)/2) + else: + poss_val = int(poss_val/2) + else: # we need to continue + pass_val = poss_val + if not fail_val: + poss_val = pass_val+step + else: + poss_val = int((pass_val+fail_val)/2) + if fail_val: + if abs(fail_val-poss_val) <= tolerance: + if pass_val==None: + print ("Not able to find Boundary Tolerance (%d) is Less than last fail value (%d)" % (tolerance,fail_val)) + pass_val="NA" + else: + pass_val = utils.human_format(pass_val * tiNo) + print("Final Possible Boundary is ", pass_val) + print(" X POSSPASS|FAIL|PASS=", poss_val, fail_val, pass_val) + break + data.append([sys._getframe().f_back.f_code.co_name]+["***"]*5+[pass_val]) + print(tabulate(data, headers=captions, tablefmt="psql")) + + final_result_data.append([sys._getframe().f_back.f_code.co_name,pass_val]) + + + +@pytest.fixture(scope="class") +def pps_config(setup,tbinfo,utils): + """ + Description: Verify ip address can be configured in SVI. + Topo: DUT02 ============ DUT01 + Dev. status: DONE + """ + global ixnetwork,config_elements_sets,val_map + testbed = setup["tbinfo"] + snic = setup["nics"] + def createTI(name, endpoints): + trafficItem = ixnetwork.Traffic.TrafficItem.find(Name="^%s$" % name) + if len(trafficItem) == 0: + trafficItem = ixnetwork.Traffic.TrafficItem.add(Name=name, TrafficType='ipv4', BiDirectional=False) # BiDirectional=True + for indx,srcdst in enumerate(endpoints): + print ("ENP UP",indx+1) + src,dst = srcdst + endpoint_set_up = trafficItem.EndpointSet.add(Name="%s-ENI_UP-%s" % (name,str(indx+1)),ScalableSources=src, ScalableDestinations=dst) + ce = trafficItem.ConfigElement.find()[-1] + ce.FrameRate.update(Type='framesPerSecond', Rate=50000) + ce.TransmissionControl.Type = 'continuous' + ce.FrameRateDistribution.PortDistribution = 'applyRateToAll' + ce.FrameSize.FixedSize = 128 + udp_srcport = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.srcPort") + udp_srcport.Auto = False + udp_srcport.SingleValue = 50687 + udp_len = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.length") + udp_len.Auto = False + udp_len.SingleValue = 80 + + udp_template = ixnetwork.Traffic.ProtocolTemplate.find(StackTypeId='^udp$') + ipv4_template = ce.Stack.find(TemplateName="ipv4-template.xml")[-1] + inner_udp = ce.Stack.read(ipv4_template.AppendProtocol(udp_template)) + trafficItem.Tracking.find()[0].TrackBy = ['trackingenabled0', 'sourceDestEndpointPair0'] + inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') + inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') + inn_sp.Auto = False + inn_dp.Auto = False + inn_sp.SingleValue = 10000 + inn_dp.SingleValue = 10000 + ce_up = ce + print ("ENP Down",indx+1) + #DOWN + endpoint_set_down = trafficItem.EndpointSet.add(Name="%s-ENI_DOWN-%s" % (name,str(indx+1)),ScalableSources=dst, ScalableDestinations=src) + ce = trafficItem.ConfigElement.find()[-1] + ce.FrameRate.update(Type='framesPerSecond', Rate=50000) + ce.TransmissionControl.Type = 'continuous' + ce.FrameRateDistribution.PortDistribution = 'applyRateToAll' + ce.FrameSize.FixedSize = 128 + udp_srcport = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.srcPort") + udp_srcport.Auto = False + udp_srcport.SingleValue = 50687 + udp_len = ce.Stack.find(StackTypeId="udp").Field.find(FieldTypeId="udp.header.length") + udp_len.Auto = False + udp_len.SingleValue = 80 + + udp_template = ixnetwork.Traffic.ProtocolTemplate.find(StackTypeId='^udp$') + ipv4_template = ce.Stack.find(TemplateName="ipv4-template.xml")[-1] + inner_udp = ce.Stack.read(ipv4_template.AppendProtocol(udp_template)) + trafficItem.Tracking.find()[0].TrackBy = ['trackingenabled0', 'sourceDestEndpointPair0'] + inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') + inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') + inn_sp.Auto = False + inn_dp.Auto = False + inn_sp.SingleValue = 10000 + inn_dp.SingleValue = 10000 + ce_down=ce + + if name=="Allow": + config_elements_sets.append((ce_up,ce_down)) + + print ("Done") + #trafficItem.Generate() + print (datetime.now(),"*"*80) + return trafficItem + + + obj_map = {} + for k in testdata["val_map"].keys(): + obj_map[k] = deepcopy({}) + val_map = testdata["val_map"] + + print('connect to a test tool platform') + tb=testbed['stateless'][0] + + session_assistant = SessionAssistant( + IpAddress=tb['server'][0]['addr'], + RestPort=tb['server'][0]['rest'], + UserName=testbed["CR"][tb['server'][0]['addr']]['user'], + Password=testbed["CR"][tb['server'][0]['addr']]['password'], + SessionName="MIRTest", + ClearConfig=True + ) + + ixnetwork = session_assistant.Ixnetwork + + + portList = [{'xpath': '/vport[%s]' % str(indx+1), 'name': 'VTEP_0%d' % (indx+1), 'location': p['location']} for indx, p in enumerate(tb['tgen'][0]['interfaces'])] + ixnetwork.ResourceManager.ImportConfig(json.dumps(portList), False) + + vports = list(ixnetwork.Vport.find()) + l1data = tb['tgen'][0]['interfaces'] + tmp = [{'xpath': '/vport[%d]/l1Config/%s' % (vp.InternalId, vp.Type), "ieeeL1Defaults": l1data[indx]['ieee'] } for indx, vp in enumerate(vports)] + ixnetwork.ResourceManager.ImportConfig(json.dumps(tmp), False) + tmp = [{'xpath': '/vport[%d]/l1Config/%s' % (vp.InternalId, vp.Type), "enableAutoNegotiation": l1data[indx]['an']} for indx, vp in enumerate(vports)] + ixnetwork.ResourceManager.ImportConfig(json.dumps(tmp), False) + + tmp = [{'xpath': '/vport[%d]/l1Config/%s' % (vp.InternalId, vp.Type), "enableRsFec": l1data[indx]['fec'], "autoInstrumentation": "floating"} for indx, vp in enumerate(vports)] + ixnetwork.ResourceManager.ImportConfig(json.dumps(tmp), False) + for ed in [1, 2]: + # OUTER DG + obj_map[ed]["oeth"] = ixnetwork.Topology.add(Ports=vports[ed-1], Name="TG_%d" % ed).DeviceGroup.add(Name="O_DG_%d" % ed, Multiplier=1).Ethernet.add(Name='ETH_%d' % ed) + if ip_type=="v4": + obj_map[ed]["oipv4"] = obj_map[ed]["oeth"].Ipv4.add(Name="IPv4%d" % ed) + elif ip_type=="v6": + obj_map[ed]["oipv4"] = obj_map[ed]["oeth"].Ipv6.add(Name="IPv6%d" % ed) + + if val_map[ed]['underlay_routing']=="BGP": + if ip_type=="v4": + obj_map[ed]["obgp"] = obj_map[ed]["oipv4"].BgpIpv4Peer.add(Name="BGP_%d" % ed) + elif ip_type=="v6": + obj_map[ed]["obgp"] = obj_map[ed]["oipv4"].BgpIpv6Peer.add(Name="BGP_%d" % ed) + + # OUTER NG + ng = ixnetwork.Topology.find().DeviceGroup.find(Name="O_DG_%d" % ed).NetworkGroup.add(Name="NG_%d" % ed, Multiplier=val_map[ed]["oipv4pool"]["multiplier"]) + if ip_type=="v4": + obj_map[ed]["oipv4pool"] = ng.Ipv4PrefixPools.add(NumberOfAddresses='1') + elif ip_type=="v6": + obj_map[ed]["oipv4pool"] = ng.Ipv6PrefixPools.add(NumberOfAddresses='1') + + # DG Behing Outer NG + obj_map[ed]["dg_b_ong"] = ng.DeviceGroup.add(Name="DG_B_ONG_%d" % ed, Multiplier=1) + obj_map[ed]["dg_b_ong_eth"] = obj_map[ed]["dg_b_ong"].Ethernet.add(Name='ETH_%d' % ed) + if ip_type=="v4": + obj_map[ed]["dg_b_ong_ipv4"] = obj_map[ed]["dg_b_ong_eth"].Ipv4.add(Name='IPv4_%d' % ed) + obj_map[ed]["vxlan"] = obj_map[ed]["dg_b_ong_ipv4"].Vxlan.add(Name="VXLAN_%d" % ed) + elif ip_type=="v6": + obj_map[ed]["dg_b_ong_ipv4"] = obj_map[ed]["dg_b_ong_eth"].Ipv6.add(Name='IPv6_%d' % ed) + obj_map[ed]["vxlan"] = obj_map[ed]["dg_b_ong_ipv4"].Vxlanv6.add(Name="VXLAN_%d" % ed) + + + + # ALLOW & DENY + if ed==1: + if ip_type=="v4": + obj_map[ed]["iipv4_local"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Local',Multiplier=1).Ethernet.add().Ipv4.add() + elif ip_type=="v6": + obj_map[ed]["iipv4_local"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Local',Multiplier=1).Ethernet.add().Ipv6.add() + + obj_map[ed]["ieth_local"] = obj_map[ed]["iipv4_local"].parent + else: + if ip_type=="v4": + obj_map[ed]["iipv4_allow"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Allow',Multiplier=val_map[ed]["iipv4_allow"]["multiplier"]).Ethernet.add().Ipv4.add() + elif ip_type=="v6": + obj_map[ed]["iipv4_allow"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Allow',Multiplier=val_map[ed]["iipv4_allow"]["multiplier"]).Ethernet.add().Ipv6.add() + + obj_map[ed]["ieth_allow"] = obj_map[ed]["iipv4_allow"].parent + + if ip_type=="v4": + obj_map[ed]["iipv4_deny"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Deny',Multiplier=val_map[ed]["iipv4_deny"]["multiplier"]).Ethernet.add().Ipv4.add() + elif ip_type=="v6": + obj_map[ed]["iipv4_deny"] = obj_map[ed]["dg_b_ong"].DeviceGroup.add(Name='Deny',Multiplier=val_map[ed]["iipv4_deny"]["multiplier"]).Ethernet.add().Ipv6.add() + obj_map[ed]["ieth_deny"] = obj_map[ed]["iipv4_deny"].parent + + + for ed in [1, 2]: + # OUTER DG + obj_map[ed]["oeth"].Mac.Increment(start_value=val_map[ed]["oeth"]["mac"], step_value='00:00:00:00:00:01') + obj_map[ed]["oipv4"].Address.Increment(start_value=val_map[ed]["oipv4"]["ip"], step_value=val_map[ed]["oipv4"]["ip_step"]) + obj_map[ed]["oipv4"].GatewayIp.Increment(start_value=val_map[ed]["oipv4"]["gip"], step_value=val_map[ed]["oipv4"]["gip_step"]) + + + resolve_gateway = False + if val_map[ed]['underlay_routing']=="STATIC": + resolve_gateway = True + + obj_map[ed]["oipv4"].ResolveGateway.Single(resolve_gateway) + obj_map[ed]["oipv4"].ManualGatewayMac.Single(val_map[ed]["oipv4"]["mac"]) + + # BGP + if val_map[ed]['underlay_routing']=="BGP": + obj_map[ed]["obgp"].DutIp.Single(val_map[ed]["obgp"]["dip"]) + obj_map[ed]["obgp"].LocalAs2Bytes.Single(val_map[ed]["obgp"]["las"]) + if ip_type=="v4": + obj_map[ed]["obgp"].EnableBgpIdSameasRouterId.Single(True) + obj_map[ed]["obgp"].FilterIpV4Unicast.Single(True) + elif ip_type=="v6": + #obj_map[ed]["obgp"].EnableBgpIdSameasRouterId.Single(True)----------------------------> This gives an error + obj_map[ed]["obgp"].FilterIpV6Unicast.Single(True) + + obj_map[ed]["obgp"].FilterEvpn.Single(True) + + #obj_map[ed]["bgp"].IpVrfToIpVrfType = 'interfacefullWithUnnumberedCorefacingIRB' + #obj_map[ed]["bgp"].EthernetSegmentsCountV4 = 128 + + obj_map[ed]["obgp"].BgpId.Single(val_map[ed]["obgp"]["bid"]) + obj_map[ed]["obgp"].Type.Single('external') + + # OUTER NG + obj_map[ed]["oipv4pool"].NetworkAddress.Increment(start_value=val_map[ed]["oipv4pool"]["ip"], step_value=val_map[ed]["oipv4pool"]["ip_step"]) + obj_map[ed]["oipv4pool"].PrefixLength.Single(32) + ipv4_behindvxlan = obj_map[ed]["vxlan"].parent + ipv4_behindvxlan.Address.Increment(start_value=val_map[ed]["oipv4pool"]["ip"], step_value=val_map[ed]["oipv4pool"]["ip_step"]) + ipv4_behindvxlan.ResolveGateway.Single(False) + + # DG Behing Outer NG + # DG Behind Outer NG Ethernet + eth = obj_map[ed]["dg_b_ong_ipv4"].parent + eth.Mac.Increment(start_value=val_map[ed]["dg_b_ong_eth"]["mac"], step_value='00:00:00:00:00:01') + + # DG Behind Outer NG IPv4 + for s in obj_map[ed]["dg_b_ong_ipv4"].Address.Steps: + s.Enabled = False + obj_map[ed]["dg_b_ong_ipv4"].Address.Increment(start_value=val_map[ed]["dg_b_ong_ipv4"]["ip"], step_value=val_map[ed]["dg_b_ong_ipv4"]["ip_step"]) + obj_map[ed]["dg_b_ong_ipv4"].GatewayIp.Increment(start_value=val_map[ed]["dg_b_ong_ipv4"]["gip"], step_value=val_map[ed]["dg_b_ong_ipv4"]["gip_step"]) + obj_map[ed]["dg_b_ong_ipv4"].Prefix.Single(32) + + # VXLAN + obj_map[ed]["vxlan"].EnableStaticInfo = True + + if ip_type=="v4": + vxlan_sinfo=obj_map[ed]["vxlan"].VxlanStaticInfo + vxlan_sinfo.MacStaticConfig.Single(True) + remote_vtep_ip_obj = vxlan_sinfo.RemoteVtepIpv4 + remote_vm_mac = vxlan_sinfo.RemoteVmStaticMac + elif ip_type=="v6": + vxlan_sinfo=obj_map[ed]["vxlan"].VxlanIPv6StaticInfo + vxlan_sinfo.EnableManualRemoteVMMac.Single(True) + remote_vtep_ip_obj = vxlan_sinfo.RemoteVtepUnicastIpv6 + remote_vm_mac = vxlan_sinfo.RemoteVMMacAddress + + + + remote_vtep_ip_obj.Single(val_map[ed]["vxlan"]["RemoteVtepIpv4"]) + obj_map[ed]["vxlan"].Vni.Increment(start_value=val_map[ed]["vxlan"]["Vni"], step_value=1) + vxlan_sinfo.SuppressArp.Single(True) + obj_map[ed]["vxlan"].StaticInfoCount = val_map[ed]["vxlan"]["StaticInfoCount"] + + + # LOCAL | ALLOW & DENY + if ed==1: + + remote_vm_mac.Custom( + start_value=val_map[ed]["vxlan"]["RemoteVmStaticMac"]["start_value"], + step_value=val_map[ed]["vxlan"]["RemoteVmStaticMac"]["step_value"], + increments=val_map[ed]["vxlan"]["RemoteVmStaticMac"]["increments"] + ) + remote_vm_mac.Steps[0].Enabled = True + remote_vm_mac.Steps[0].Step = val_map[ed]["vxlan"]["RemoteVmStaticMac"]["ng_step"] + + vxlan_sinfo.RemoteVmStaticIpv4.Custom( + start_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["start_value"], + step_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["step_value"], + increments=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["increments"] + ) + vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Enabled = True + vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Step = val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["ng_step"] + + + obj_map[ed]["ieth_local"].Mac.Increment(start_value=val_map[ed]["ieth_local"]["mac"], step_value=val_map[ed]["ieth_local"]["step"],) + obj_map[ed]["ieth_local"].Mac.Steps[1].Enabled=True + obj_map[ed]["ieth_local"].Mac.Steps[1].Step = '00:00:00:08:00:00' + + obj_map[ed]["iipv4_local"].Prefix.Single(8) + + obj_map[ed]["iipv4_local"].Address.Increment( start_value=val_map[ed]["iipv4_local"]["ip"], step_value=val_map[ed]["iipv4_local"]["ip_step"]) + obj_map[ed]["iipv4_local"].Address.Steps[1].Enabled=True + obj_map[ed]["iipv4_local"].Address.Steps[1].Step = val_map[ed]["iipv4_local"]["ip_ng1_step"] + + obj_map[ed]["iipv4_local"].GatewayIp.Increment(start_value=val_map[ed]["iipv4_local"]["gip"], step_value=val_map[ed]["iipv4_local"]["gip_step"]) + obj_map[ed]["iipv4_local"].GatewayIp.Steps[1].Enabled=True + obj_map[ed]["iipv4_local"].GatewayIp.Steps[1].Step = val_map[ed]["iipv4_local"]["gip_ng1_step"] + + + else: + + remote_vm_mac.Increment(start_value=val_map[ed]["vxlan"]["RemoteVmStaticMac"],step_value='00:00:00:00:00:01') + remote_vm_mac.Steps[0].Enabled =True + remote_vm_mac.Steps[0].Step = '00:00:00:08:00:00' + + #vxlan_sinfo.RemoteVmStaticIpv4.Increment(start_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"],step_value='0.0.0.1') + vxlan_sinfo.RemoteVmStaticIpv4.Custom( + start_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["start_value"], + step_value=val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["step_value"], + ) + + vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Enabled =True + vxlan_sinfo.RemoteVmStaticIpv4.Steps[0].Step = val_map[ed]["vxlan"]["RemoteVmStaticIpv4"]["ng_step"] + + eth_allow = obj_map[ed]["ieth_allow"] + ip_allow = obj_map[ed]["iipv4_allow"] + eth_deny = obj_map[ed]["ieth_deny"] + ip_deny = obj_map[ed]["iipv4_deny"] + + + eth_allow.Mac.Custom( + start_value=val_map[ed]["ieth_allow"]["mac"]["start_value"], + step_value =val_map[ed]["ieth_allow"]["mac"]["step_value"], + increments =val_map[ed]["ieth_allow"]["mac"]["increments"] + ) + + eth_allow.Mac.Steps[1].Enabled = True + eth_allow.Mac.Steps[1].Step = val_map[ed]["ieth_allow"]["mac"]["ng_step"] + + ip_allow.Address.Custom( + start_value=val_map[ed]["iipv4_allow"]["ip"]["start_value"], + step_value =val_map[ed]["iipv4_allow"]["ip"]["step_value"], + increments =val_map[ed]["iipv4_allow"]["ip"]["increments"] + ) + ip_allow.Address.Steps[1].Enabled = True + ip_allow.Address.Steps[1].Step = val_map[ed]["iipv4_allow"]["ip"]["ng_step"] + + ip_allow.Prefix.Single(8) + + ip_allow.GatewayIp.Increment(start_value=val_map[ed]["iipv4_allow"]["gip"], step_value=val_map[ed]["iipv4_allow"]["gip_step"]) #Fix Increments + ip_allow.GatewayIp.Steps[1].Enabled=True + ip_allow.GatewayIp.Steps[1].Step = val_map[ed]["iipv4_allow"]["gip_ng_step"] + + + eth_deny.Mac.Custom( + start_value=val_map[ed]["ieth_deny"]["mac"]["start_value"], + step_value =val_map[ed]["ieth_deny"]["mac"]["step_value"], + increments =val_map[ed]["ieth_deny"]["mac"]["increments"] + ) + eth_deny.Mac.Steps[1].Enabled = True + eth_deny.Mac.Steps[1].Step = val_map[ed]["ieth_deny"]["mac"]["ng_step"] + + ip_deny.Address.Custom( + start_value=val_map[ed]["iipv4_deny"]["ip"]["start_value"], + step_value =val_map[ed]["iipv4_deny"]["ip"]["step_value"], + increments =val_map[ed]["iipv4_deny"]["ip"]["increments"] + ) + + ip_deny.Address.Steps[1].Enabled = True + ip_deny.Address.Steps[1].Step = val_map[ed]["iipv4_deny"]["ip"]["ng_step"] + + ip_deny.Prefix.Single(8) + + + ip_deny.GatewayIp.Increment(start_value=val_map[ed]["iipv4_deny"]["gip"], step_value=val_map[ed]["iipv4_deny"]["gip_step"]) #Fix Increments + ip_deny.GatewayIp.Steps[1].Enabled=True + ip_deny.GatewayIp.Steps[1].Step = val_map[ed]["iipv4_deny"]["gip_ng_step"] + + print("Create Traffic OneIPOneVPC") + if ip_type=="v4": + ipv4_local = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Local").Ethernet.find().Ipv4.find() + ipv4_allow = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Allow").Ethernet.find().Ipv4.find() + ipv4_deny = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Deny").Ethernet.find().Ipv4.find() + elif ip_type=="v6": + ipv4_local = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Local").Ethernet.find().Ipv6.find() + ipv4_allow = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Allow").Ethernet.find().Ipv6.find() + ipv4_deny = ixnetwork.Topology.find().DeviceGroup.find().NetworkGroup.find().DeviceGroup.find().DeviceGroup.find(Name="Deny").Ethernet.find().Ipv6.find() + print("Create Traffic OneIPOneVPC") + + vpcs, ips = val_map[1]["oipv4pool"]["multiplier"], int(val_map[1]["vxlan"]["StaticInfoCount"]/2) + endpoints_allow,endpoints_deny=[], [] + + for vpc in range(vpcs): + endpoints_allow.append( + ( + deepcopy([{"arg1": ipv4_local.href,"arg2": 1,"arg3": 1,"arg4": vpc+1,"arg5": 1 }]), + deepcopy([{"arg1": ipv4_allow.href,"arg2": 1,"arg3": 1,"arg4": vpc*ips+1,"arg5": ips }]) + ) + ) + endpoints_deny.append( + ( + deepcopy([{"arg1": ipv4_local.href,"arg2": 1, "arg3": 1, "arg4": vpc+1, "arg5": 1 }]), + deepcopy([{"arg1": ipv4_deny.href ,"arg2": 1, "arg3": 1, "arg4": vpc*ips+1, "arg5": ips }]) + ) + ) + + ti_allow = createTI("Allow", endpoints_allow) + ti_deny = createTI("Deny", endpoints_deny) + + +#@pytest.mark.usefixtures("pps_config") +class Test_Dpu: + + def teardown_method(self, method): + print("Clean up configuration") + + def test_pps_001(self, setup, utils): + print('Start All Protocols test_pps_001') + ixnetwork.StartAllProtocols(Arg1='sync') + + try: + print('Verify protocol sessions') + protocolsSummary = StatViewAssistant(ixnetwork, 'Protocols Summary') + protocolsSummary.CheckCondition('Sessions Not Started', StatViewAssistant.EQUAL, 0) + protocolsSummary.CheckCondition('Sessions Down', StatViewAssistant.EQUAL, 0) + except Exception as e: + raise Exception(str(e)) + time.sleep(90) + + ti_allow = ixnetwork.Traffic.TrafficItem.find(Name="Allow") + ti_deny = ixnetwork.Traffic.TrafficItem.find(Name="Deny") + ti_allow.Generate() + ti_deny.Generate() + ixnetwork.Traffic.Apply() + utils.start_traffic(ixnetwork) + time.sleep(30) + utils.stop_traffic(ixnetwork) + + find_boundary(utils) + print(tabulate(final_result_data, headers=["Test","Max Possible PPS"], tablefmt="psql")) + + def test_pps_increment_udp(self, setup, utils): + + print('Start All Protocols test_pps_random_udp_src_dst') + ixnetwork.StartAllProtocols(Arg1='sync') + try: + print('Verify protocol sessions') + protocolsSummary = StatViewAssistant(ixnetwork, 'Protocols Summary') + protocolsSummary.CheckCondition('Sessions Not Started', StatViewAssistant.EQUAL, 0) + protocolsSummary.CheckCondition('Sessions Down', StatViewAssistant.EQUAL, 0) + except Exception as e: + raise Exception(str(e)) + + trafficItem = ixnetwork.Traffic.TrafficItem.find(Name="Deny") + if len(trafficItem)==1: + trafficItem.Enabled=False + ti_allow = ixnetwork.Traffic.TrafficItem.find(Name="Allow") + vm_start_value=9000 + host_start_value=10000 + host_step = 5000 + endpoint_sets = ti_allow.EndpointSet.find() + #for ep_up,ep_down in endpoint_sets: + for ce_up,ce_down in config_elements_sets: + print (ce_up,ce_down) + inner_udp = ce_up.Stack.find(TemplateName="udp-template.xml")[-1] + inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') + inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') + inn_sp.ValueType = "singleValue" + inn_dp.ValueType = "increment" + inn_sp.SingleValue = vm_start_value + inn_dp.StartValue = host_start_value + inn_dp.StepValue = 1 + inn_dp.CountValue = int(val_map[1]["vxlan"]["StaticInfoCount"]/2) + + + inner_udp = ce_down.Stack.find(TemplateName="udp-template.xml")[-1] + inn_sp = inner_udp.Field.find(DisplayName='^UDP-Source-Port') + inn_dp = inner_udp.Field.find(DisplayName='^UDP-Dest-Port') + inn_sp.ValueType = "increment" + inn_dp.ValueType = "singleValue" + inn_dp.SingleValue = vm_start_value + inn_sp.StartValue = host_start_value + inn_sp.StepValue = 1 + inn_sp.CountValue = int(val_map[1]["vxlan"]["StaticInfoCount"]/2) + + + + vm_start_value+=1 + host_start_value=host_start_value+host_step + + ti_allow.Generate() + ixnetwork.Traffic.Apply() + utils.start_traffic(ixnetwork) + time.sleep(30) + utils.stop_traffic(ixnetwork) + + find_boundary(utils) + print(tabulate(final_result_data, headers=["Test","Max Possible PPS"], tablefmt="psql")) + + def test_cps_001(self, setup, create_ixload_session_url): + """ + Description: Verify ip address can be configured in SVI. + Topo: DUT02 ============ DUT01 + Dev. status: DONE + """ + def _patch_test_setting(url_patch_dict, setting): + + url = url_patch_dict['base_url'] + url_patch_dict[setting]['url'] + + return requests.patch(url, json=url_patch_dict[setting]['json']) + + def _get_timeline_link(timelines, timeline_key): + + link = "" + link_test = "" + + for elem in timelines: + if elem['name'] in timeline_key: + link_init = elem['links'][0]['href'] + link_init_list = link_init.split("/") + link_init_list.pop(len(link_init_list) - 1) + link_test = '/'.join(link_init_list) + + shaved = link_test.split("/") + for i in range(5): + shaved.pop(0) + shaved.insert(0, "") + link = "/".join(shaved) + + return link + + def _set_timeline_settings(test_settings, rampDownTime, sustainTime): + + timeline_url = 'http://' + test_settings.gatewayServer + ":{}".format( + test_settings.gatewayPort) + '/api/v1/' + session_url + '/ixload/test/activeTest/timelineList' + response = requests.get(timeline_url, headers=headers) + timelines = response.json() + + timeline1_url = 'http://' + test_settings.gatewayServer + ":{}".format( + test_settings.gatewayPort) + '/api/v1/' + session_url + \ + _get_timeline_link(timelines, "Timeline1") + timeline1_settings = {"rampDownTime": rampDownTime, "sustainTime": sustainTime} + requests.patch(timeline1_url, json=timeline1_settings) + + timeline2_url = 'http://' + test_settings.gatewayServer + ":{}".format( + test_settings.gatewayPort) + '/api/v1/' + session_url + \ + _get_timeline_link(timelines, "Timeline2") + timeline2_settings = {"rampDownTime": rampDownTime, "sustainTime": sustainTime} + requests.patch(timeline2_url, json=timeline2_settings) + + timeline_matchLongest_url = 'http://' + test_settings.gatewayServer + ":{}".format( + test_settings.gatewayPort) + '/api/v1/' + session_url + \ + _get_timeline_link(timelines, "") + matchLongest_settings = {"sustainTime": sustainTime} + requests.patch(timeline_matchLongest_url, json=matchLongest_settings) + + return + + def _getTestCurrentState(connection, sessionUrl): + + activeTestUrl = "%s/ixload/test/activeTest" % (sessionUrl) + testObj = connection.httpGet(activeTestUrl) + + return testObj.currentState + + def _print_final_table(test_run_results): + stat_table = [] + stat_columns = ["It", "Obtained CPS", "HTTP Requests Failed", "TCP Retries", + "TCP Resets TX", "TCP Resets RX"] + for iter in test_run_results: + stat_table.append(iter) + print("\n%s" % tabulate(stat_table, headers=stat_columns, tablefmt='psql', floatfmt=".2f")) + + def _poll_stats(connection, sessionUrl, watchedStatsDict, pollingInterval=4): + + statSourceList = list(watchedStatsDict) + + # retrieve stats for a given stat dict + # all the stats will be saved in the dictionary below + + # statsDict format: + # { + # statSourceName: { + # timestamp: { + # statCaption : value + # } + # } + # } + stats_dict = {} + + # remember the timstamps that were already collected - will be ignored in future + collectedTimestamps = {} # format { statSource : [2000, 4000, ...] } + testIsRunning = True + + # check stat sources + for statSource in statSourceList[:]: + statSourceUrl = "%s/ixload/stats/%s/values" % (sessionUrl, statSource) + statSourceReply = connection.httpRequest("GET", statSourceUrl) + if statSourceReply.status_code != 200: + statSourceList.remove(statSource) + + # check the test state, and poll stats while the test is still running + while testIsRunning: + + # the polling interval is configurable. by default, it's set to 4 seconds + time.sleep(pollingInterval) + + for statSource in statSourceList: + valuesUrl = "%s/ixload/stats/%s/values" % (sessionUrl, statSource) + + valuesObj = connection.httpGet(valuesUrl) + valuesDict = valuesObj.getOptions() + + # get just the new timestamps - that were not previously retrieved in another stats polling iteration + newTimestamps = [int(timestamp) for timestamp in list(valuesDict) if + timestamp not in collectedTimestamps.get(statSource, [])] + newTimestamps.sort() + + for timestamp in newTimestamps: + timeStampStr = str(timestamp) + + collectedTimestamps.setdefault(statSource, []).append(timeStampStr) + + timestampDict = stats_dict.setdefault(statSource, {}).setdefault(timestamp, {}) + + # save the values for the current timestamp, and later print them + for caption, value in iteritems(valuesDict[timeStampStr].getOptions()): + if caption in watchedStatsDict[statSource]: + timestampDict[caption] = value + stat_table_row = [] + for table_row in timestampDict.keys(): + stat_table_row.append(table_row) + table = [] + columns = ['Stat Source', 'Time Stamp', 'Stat Name', 'Value'] + for i, stat in enumerate(stat_table_row): + table.append([statSource, timeStampStr, stat, timestampDict[stat]]) + # print("\n%s" % tabulate(table, headers=columns, tablefmt='psql')) + + testIsRunning = _getTestCurrentState(connection, sessionUrl) == "Running" + + print("Stopped receiving stats.") + return stats_dict + + def _get_stats_global(stats_dict): + stats_global = [] + + for key in stats_dict['HTTPClient'].keys(): + if key in stats_dict['HTTPClient'] and key in stats_dict['HTTPServer']: + stats_global.append([key, stats_dict['HTTPClient'][key]['HTTP Simulated Users'], + stats_dict['HTTPClient'][key]['HTTP Concurrent Connections'], + stats_dict['HTTPClient'][key]['TCP CPS'], + stats_dict['HTTPClient'][key]['HTTP Connect Time (us)'], + stats_dict['HTTPServer'][key]['HTTP Requests Failed'], + stats_dict['HTTPServer'][key]['TCP Retries'], + stats_dict['HTTPServer'][key]['TCP Resets Sent'], + stats_dict['HTTPServer'][key]['TCP Resets Received']]) + + return stats_global + + def _check_for_error_stats(test_stats, error_type): + + error_dict = { + error_type: { + "first_time": 0, + "last_time": 0, + "num_of_seq_timestamps": 0 + } + } + + timestamps_l = [i[0] for i in test_stats] + errors_l = [i[1] for i in test_stats] + seen = set() + dupes = {} + + first_time = 0 + for i, x in enumerate(errors_l): + if x in seen: + dupes.setdefault(x, []).append(i) + else: + seen.add(x) + + # insert timestamp index location at beginning of list + for key in dupes.keys(): + dupes[key].insert(0, dupes[key][0] - 1) + + # make list of lens of each duplicates, then remove and remove rest of error entries from dupes dict + errors_l = [len(dupes[x]) for x in dupes.keys()] + max_index = errors_l.index(max(errors_l)) + errors_l.pop(max_index) + + # keep only the highest number of stable + for i, key in enumerate(list(dupes)): + if i != max_index: + dupes.pop(key, None) + + for key in dupes.keys(): + error_dict[error_type]["first_time"] = dupes[key][0] + error_dict[error_type]["last_time"] = dupes[key][-1] + + if list(dupes.keys())[0] != 0: + error_dict[error_type]["num_of_seq_timestamps"] = len(dupes[key]) + else: + error_dict[error_type]["num_of_seq_timestamps"] = 0 + + return error_dict + + def _get_max_cps(test_stats, cps_stats): + + cps_list = [] + for cps in cps_stats: + cps_list.append(cps[1]) + + stats = deepcopy(cps_list) + for i, elem in enumerate(stats): + if elem == '""': + stats[i] = 0 + + stats.sort() + max_cps = stats[-1] + cps_max_w_ts = cps_stats[cps_list.index(max_cps)] + + return cps_max_w_ts + + def _get_effective_cps(cps_stats, http_requests_dict, tcp_retries_dict, tcp_resets_tx_dict, tcp_resets_rx_dict): + + error_list = [http_requests_dict, tcp_retries_dict, tcp_resets_tx_dict, tcp_resets_rx_dict] + num_of_timestamps = len(cps_stats) + + seq_l = [list(x.values())[0]["num_of_seq_timestamps"] for x in error_list] + error_list[seq_l.index(max(seq_l))] + key = list(error_list[seq_l.index(max(seq_l))].keys())[0] + first_time = error_list[seq_l.index(max(seq_l))][key]["first_time"] + last_time = error_list[seq_l.index(max(seq_l))][key]["last_time"] + + effective_cps_ts = { + "first_time": cps_stats[first_time][0], + "last_time": cps_stats[last_time][0] + } + + if max(seq_l) != 0: + avg = 0 + effective_cps_l = [] + for i, cps in enumerate(cps_stats): + if i >= first_time and i <= last_time: + effective_cps_l.append(cps) + avg += cps[1] + effective_cps = avg / error_list[seq_l.index(max(seq_l))][key]["num_of_seq_timestamps"] + else: + effective_cps = 0 + effective_cps_ts = {"first_time": 0, "last_time": cps_stats[last_time][0]} + + return effective_cps, effective_cps_ts + + def _get_latency_ranges(test_stats): + + latency_stats = { + "latency_min": 0, + "latency_max": 0, + "latency_avg": 0 + } + + only_lat_stats = [] + for lat_stat in test_stats: + if lat_stat[4] == '""': + lat_stat[4] = 0 + only_lat_stats.append(lat_stat[4]) + + latency_stats["latency_min"] = min(only_lat_stats) + latency_stats["latency_max"] = max(only_lat_stats) + + lat_addr = 0 + for elem in only_lat_stats: + lat_addr += elem + + latency_stats["latency_avg"] = lat_addr / len(only_lat_stats) + + return latency_stats + + def _get_testrun_results(stats_dict, url_patch_dict): + + stats_global = _get_stats_global(stats_dict) + + failures_dict = {"http_requests_failed": 0, "tcp_retries": 0, "tcp_resets_tx": 0, + "tcp_resets_rx": 0, "total": 0} + + # get and compare stats + http_requests_failed_l = [[x[0], x[5]] for x in stats_global] + http_requests_failed = max([x[1] for x in http_requests_failed_l]) + failures_dict["http_requests_failed"] = http_requests_failed + #http_requests_dict = _check_for_error_stats(http_requests_failed_l, "http_requests_failed") + + tcp_retries_l = [[x[0], x[6]] for x in stats_global] + tcp_retries = max([x[1] for x in tcp_retries_l]) + failures_dict["tcp_retries"] = tcp_retries + #tcp_retries_dict = _check_for_error_stats(tcp_retries_l, "tcp_retries") + + tcp_resets_tx_l = [[x[0], x[7]] for x in stats_global] + tcp_resets_tx = max([x[1] for x in tcp_resets_tx_l]) + failures_dict["tcp_resets_tx"] = tcp_resets_tx + #tcp_resets_tx_dict = _check_for_error_stats(tcp_resets_tx_l, "tcp_resets_tx") + + tcp_resets_rx_l = [[x[0], x[8]] for x in stats_global] + tcp_resets_rx = max([x[1] for x in tcp_resets_rx_l]) + failures_dict["tcp_resets_rx"] = tcp_resets_rx + #tcp_resets_rx_dict = _check_for_error_stats(tcp_resets_rx_l, "tcp_resets_rx") + + failures = http_requests_failed + tcp_retries + tcp_resets_tx + tcp_resets_rx + failures_dict["total"] = failures + + steady_time_start = url_patch_dict['timeline_settings']['advancedIteration']['d0'] * 1000 + cps_stats = [[x[0], x[3]] for x in stats_global if x[0] >= steady_time_start] + cps_max_w_ts = _get_max_cps(stats_global, cps_stats) + cps_max = cps_max_w_ts[1] + #effective_cps, effective_cps_ts = _get_effective_cps(cps_stats, http_requests_dict, tcp_retries_dict, + # tcp_resets_tx_dict, tcp_resets_rx_dict) + + latency_ranges = _get_latency_ranges(stats_global) + + return failures_dict, cps_max, cps_max_w_ts, latency_ranges + + def _print_stat_table(cps_max_w_ts, failures_dict, latency_ranges): + + stat_table = [] + stat_columns = ["Timestamp (s)", "TCP Max CPS", "Total Failures"] + stat_table.append([int(cps_max_w_ts[0]) / 1000, int(cps_max_w_ts[1]), failures_dict["total"]]) + + stat_f_table = [] + stat_f_columns = ["HTTP Requests Failed", "TCP Retries", "TCP Resets TX", "TCP Resets RX"] + stat_f_table.append([failures_dict["http_requests_failed"], failures_dict["tcp_retries"], + failures_dict["tcp_resets_tx"], failures_dict["tcp_resets_rx"]]) + + lat_table = [] + lat_table.append( + [latency_ranges["latency_min"], latency_ranges["latency_max"], latency_ranges["latency_avg"]] + ) + lat_stat_columns = ["Connect Time min (us)", "Connect Time max (us)", "Connect Time avg (us)"] + + print("\n%s" % tabulate(stat_table, headers=stat_columns, tablefmt='psql')) + print("\n%s" % tabulate(stat_f_table, headers=stat_f_columns, tablefmt='psql')) + print("\n%s" % tabulate(lat_table, headers=lat_stat_columns, tablefmt='psql')) + + def _run_cc_test(connection, session_url, url_patch_dict, MAX_CPS, MIN_CPS, + threshold, target_failures, test_settings, start_value=0): + + test_run_results = [] + test_value = start_value + test_iteration = 1 + + test_result = "" + IxLoadUtils.log( + "----Test Iteration %d------------------------------------------------------------------" + % test_iteration) + old_value = test_value + IxLoadUtils.log("Testing CC Objective = %d" % test_value) + kActivityOptionsToChange = { + # format: { activityName : { option : value } } + "HTTPClient1": { + "userIpMapping": "1:ALL", + "enableConstraint": False, + "userObjectiveType": "concurrentConnections", + "userObjectiveValue": int(test_value), + } + } + IxLoadUtils.log("Updating CPS objective value settings...") + IxLoadUtils.changeActivityOptions(connection, session_url, kActivityOptionsToChange) + IxLoadUtils.changeActivityOptions(connection, session_url, kActivityOptionsToChange) + IxLoadUtils.log("CPS objective value updated.") + + IxLoadUtils.log("Saving rxf") + IxLoadUtils.saveRxf(connection, session_url, "C:\\automation\\24k_8VPC_CC_{}.rxf".format(test_iteration)) + + IxLoadUtils.log("Applying config...") + IxLoadUtils.applyConfiguration(connection, session_url) + + IxLoadUtils.log("Starting the test...") + IxLoadUtils.runTest(connection, session_url) + IxLoadUtils.log("Test started.") + + IxLoadUtils.log("Test running and extracting stats...") + stats_dict = _poll_stats(connection, session_url, stats_test_settings) + IxLoadUtils.log("Test finished.") + + failures_dict, cps_max, cps_max_w_ts, latency_ranges = _get_testrun_results(stats_dict, url_patch_dict) + + _print_stat_table(cps_max_w_ts, failures_dict, latency_ranges) + + test_run_results.append( + [test_iteration, cps_max, failures_dict["http_requests_failed"], + failures_dict["tcp_retries"], failures_dict["tcp_resets_tx"], + failures_dict["tcp_resets_rx"]] + ) + + return cps_max_w_ts, failures_dict, test_run_results, latency_ranges + + def _create_ip_ranges(connection, session_url, traffic_network, plugin_name): + + IxLoadUtils.HttpUtils.addIpRange(connection, session_url, traffic_network, + plugin_name, {"ipType": "IPv4"}) + + def _get_ip_range_names(connection, session_url, traffic_network, plugin_names, url_patch_dict): + + ip_range_names = [] + range_string = IxLoadUtils.HttpUtils.getRangeListUrl(connection, session_url, traffic_network, plugin_names, + "rangeList") + string_split = range_string.split("/") + range_url = "/" + "/".join(string_split[2:]) + url = url_patch_dict["base_url"] + range_url + + response = requests.get(url, params=None) + range_list_info = response.json() + + for elem in range_list_info: + ip_range_names.append(elem['name']) + + return ip_range_names, range_list_info + + def _create_traffic_map(connection, url_patch_dict, nsgs, enis, ip_ranges_per_vpc): + # Make Traffic Map Settings + + portMapPolicy_json = {'portMapPolicy': 'customMesh'} + destinations_url = url_patch_dict['base_url'] + url_patch_dict['traffic_maps']['destinations_url'] + response = requests.patch(destinations_url, json=portMapPolicy_json) + + # meshType + submapsIPv4_url = url_patch_dict['base_url'] + url_patch_dict['traffic_maps']['subMapsIPv4_url'] + meshType_json = url_patch_dict['traffic_maps']['meshType_setting'] + response = requests.patch(submapsIPv4_url, json=meshType_json) + + # map source-to-destination + sourceRanges_url = submapsIPv4_url + "/sourceRanges/%s" + destId = 1 + if url_patch_dict['traffic_maps']['meshType_setting']['meshType'] == 'ipRangePairs': + ip_count = 0 + for i in range(nsgs): + destinationId_json = {'destinationId': destId} + url = sourceRanges_url % (i) + response = requests.patch(url, json=destinationId_json) + ip_count += 1 + if ip_count == ip_ranges_per_vpc: + destId += 1 + ip_count = 0 + else: + # vlanRangePairs meshType + for i in range(enis): + destinationId_json = {'destinationId': destId} + url = sourceRanges_url % (i) + response = requests.patch(url, json=destinationId_json) + destId += 1 + + # destinationRanges + destRanges_json = {'enable': False} + destinationRanges_url = url_patch_dict['base_url'] + "/destinationRanges/%s" + for i in range(enis): + url = destinationRanges_url % (i) + if i == 0: + response = requests.patch(url, json=destRanges_json) + + return + + def _build_node_ips(count, vpc, nodetype="client"): + IP_STEP1 = int(ipaddress.ip_address(u'0.0.0.1')) + IP_STEP2 = int(ipaddress.ip_address(u'0.0.1.0')) + IP_STEP3 = int(ipaddress.ip_address(u'0.1.0.0')) + IP_STEP4 = int(ipaddress.ip_address(u'1.0.0.0')) + IP_STEPE = int(ipaddress.ip_address(u'0.0.0.2')) + IP_C_START = ipaddress.ip_address(u'1.128.0.1') + IP_S_START = ipaddress.ip_address(u'1.1.0.1') + + if nodetype in "client": + ip = ipaddress.ip_address(int(IP_C_START) + (IP_STEP3 * count * 4) + (IP_STEP4 * (vpc - 1))) + + if nodetype in "server": + ip = ipaddress.ip_address(int(IP_S_START) + (IP_STEP4 * (vpc - 1))) + + return ip + + def _set_ip_range_options(ip_count, eni_index, nodetype): + + if nodetype in "client": + host_count = 500 + incrementBy = "0.0.2.0" + else: + host_count = 1 + incrementBy = "0.0.0.2" + + ip = str(_build_node_ips(ip_count, eni_index, nodetype)) + + IpOptionsToChange = {'count': host_count, 'ipAddress': ip, 'prefix': 8, 'incrementBy': incrementBy, + 'gatewayAddress': "0.0.0.0", 'gatewayIncrement': '0.0.0.0'} + + + return IpOptionsToChange + + def _build_node_macs(count, vpc, nodetype="client"): + ENI_MAC_STEP = '00:00:00:08:00:00' + mac_start_client = macaddress.MAC('00:1B:6E:80:00:01') + mac_start_server = macaddress.MAC('00:1B:6E:00:00:01') + mac_incr1 = macaddress.MAC('00:00:00:01:00:00') + mac_incr3 = macaddress.MAC('00:00:00:03:00:00') + + if nodetype in "client": + m = macaddress.MAC(int(mac_start_client) + int(macaddress.MAC(ENI_MAC_STEP)) * (vpc - 1) + (int(mac_incr1) * count)) + + if nodetype in "server": + m = macaddress.MAC(int(mac_start_server) + int(macaddress.MAC(ENI_MAC_STEP)) * (vpc - 1)) + + return m + + def _set_mac_range_options(ip_count=0, eni_index=0, nodetype="client"): + + if nodetype in "client": + mac_increment = "00:00:00:00:00:80" + else: + mac_increment = "00:00:00:00:00:02" + + mac_address = str(_build_node_macs(ip_count, eni_index, nodetype)) + mac_address = mac_address.replace("-", ":") + + macOptionsToChange = {"mac": mac_address, "incrementBy": mac_increment} + + return macOptionsToChange + + def _set_vlan_range_options(url_patch_dict, index, nodetype="client"): + + if nodetype == 'client': + firstId = url_patch_dict['client_vlan_settings']['json']['firstId'] + index + uniqueCount = url_patch_dict['client_vlan_settings']['json']['uniqueCount'] + else: + firstId = url_patch_dict['server_vlan_settings']['json']['firstId'] + index + uniqueCount = url_patch_dict['server_vlan_settings']['json']['uniqueCount'] + + vlan_settings = {'firstId': firstId, 'uniqueCount': uniqueCount} + + return vlan_settings + + def _get_url_ip(nodetype, node_ip_range_names, index): + + if nodetype == "client": + range_url = url_patch_dict['client_range_setting']['url'] + else: + range_url = url_patch_dict['server_range_setting']['url'] + + r_index = node_ip_range_names[index].split("-")[1][1:] + url_ip = url_patch_dict['base_url'] + range_url % (r_index) + + return url_ip + + # MAIN + kCommunities = [ + # format: {option1: value1, option2: value2} + {}, # default community with no options + {"tcpAccelerationAllowedFlag": True}, # community with tcpAccelerationAllowedFlag set to True + ] + + kActivities = { + 'Traffic1@Network1': ['HTTP Client'], + 'Traffic2@Network2': ['HTTP Server'] + } + + kNewCommands = { + # format: { agent name : [ { field : value } ] } + "HTTPClient1": [ + { + "commandType": "GET", + "destination": "Traffic2_HTTPServer1:80", + "pageObject": "/1b.html", + }, + ], + } + + stats_test_settings = { + 'HTTPClient': ['HTTP Simulated Users', + 'HTTP Concurrent Connections', + 'TCP CPS', + 'HTTP Connect Time (us)', + ], + 'HTTPServer': ['HTTP Requests Failed', + 'TCP Retries', + 'TCP Resets Sent', + 'TCP Resets Received', + ], + } + + stats_dict = {} + location = inspect.getfile(inspect.currentframe()) + + session = create_ixload_session_url + connection = session['connection'] + test_settings = session['test_settings'] + + headers = {'Accept': 'application/json'} + session_url = IxLoadUtils.createNewSession(connection, test_settings.ixLoadVersion) + base_url = 'http://' + test_settings.gatewayServer + ":{}".format(test_settings.gatewayPort) + \ + '/api/v1/' + session_url + + url_patch_dict = { + 'base_url': base_url, + 'traffic_maps': { + 'meshType_setting': {'meshType': "vlanRangePairs"}, + #'meshType_setting': {'meshType': "ipRangePairs"}, + 'subMapsIPv4_url': "/ixload/test/activeTest/communityList/0/activityList/0/destinations/0/customPortMap/submapsIPv4/0", + 'destinations_url': "/ixload/test/activeTest/communityList/0/activityList/0/destinations/0" + }, + 'allow_routes': { + 'json': {"allowRouteConflicts": True}, + 'url': "/ixload/preferences" + }, + 'auto_mac_setting': { + "autoMacGeneration": False + }, + 'timeline_settings': { + 'timelineType': 1, + 'url': "/ixload/test/activetest/communitylist/0/activitylist/0/timeline", + 'advanced': { + 'rampUpValue': 1000000, + 'sustainTime': 240, + }, + 'advancedIteration': { + 'd0': 120, + 'd1': 150, + 'd2': 10, + 'd3': 10, + } + }, + 'client_range_setting': { + 'json': {}, + 'url': "/ixload/test/activeTest/communityList/0/network/stack/childrenList/2/childrenList/3/rangeList/%s" + }, + 'server_range_setting': { + 'json': {}, + 'url': "/ixload/test/activeTest/communityList/1/network/stack/childrenList/5/childrenList/6/rangeList/%s" + }, + 'client_vlan_settings': { + 'json': {"firstId": 101, "uniqueCount": 1}, + 'url': "/ixload/test/activeTest/communityList/0/network/stack/childrenList/2/childrenList/3/rangeList/%s/vlanRange" + }, + 'server_vlan_settings': { + 'json': {"firstId": 1, "uniqueCount": 1}, + 'url': "/ixload/test/activeTest/communityList/1/network/stack/childrenList/5/childrenList/6/rangeList/%s/vlanRange" + }, + 'http_version': { + 'json': {"httpVersion": 1}, + 'url': "/ixload/test/activeTest/communityList/0/activityList/0/agent" + }, + 'http_tcp_conns_per_user': { + 'json': {"maxSessions": 48}, + 'url': "/ixload/test/activeTest/communityList/0/activityList/0/agent" + }, + 'client_disable_tcp_tw_recycle': { + 'json': {"tcp_tw_recycle": False}, + 'url': "/ixload/test/activeTest/communityList/0/network/globalPlugins/2" + }, + 'server_disable_tcp_tw_recycle': { + 'json': {"tcp_tw_recycle": False}, + 'url': "/ixload/test/activeTest/communityList/1/network/globalPlugins/5" + }, + 'stats_configured': { + 'url': '/ixload/stats/HTTPClient/configuredStats' + }, + 'cps_aggregation_type': { + 'json': {"aggregationType": "kRate"}, + 'url': "" + }, + 'cps_stat_caption': { + 'json': {"caption": "TCP CPS"}, + 'url': "" + } + } + + enis = 8 + ip_ranges_per_vpc = 6 + num_ranges = enis + nsgs = enis * ip_ranges_per_vpc + + IxLoadUtils.log('Creating communities...') + IxLoadUtils.addCommunities(connection, session_url, kCommunities) + IxLoadUtils.log('Communities created.') + + IxLoadUtils.log('Creating activities..') + IxLoadUtils.addActivities(connection, session_url, kActivities) + IxLoadUtils.log('Activities created..') + + IxLoadUtils.log("Enabling Forceful Ownership of Ports") + IxLoadUtils.enableForcefullyTakeOwnershipAndResetPorts(connection, session_url) + IxLoadUtils.log("Forceful Ownership Complete") + + response = _patch_test_setting(url_patch_dict, 'allow_routes') + + IxLoadUtils.log("Clearing commands %s..." % (list(kNewCommands))) + IxLoadUtils.clearAgentsCommandList(connection, session_url, list(kNewCommands)) + IxLoadUtils.log("Command lists cleared.") + + IxLoadUtils.log("Adding IPv4 ranges ...") + # Create Client and Server IP Ranges + for _ in range(nsgs): + _create_ip_ranges(connection, session_url, "Traffic1@Network1", "IP-1") + + for _ in range(enis): + _create_ip_ranges(connection, session_url, "Traffic2@Network2", "IP-2") + + # Get Client/Server IP range info + client_ip_range_names, client_range_list_info = _get_ip_range_names(connection, session_url, + "Traffic1@Network1", "IP-1", url_patch_dict) + server_ip_range_names, server_range_list_info = _get_ip_range_names(connection, session_url, + "Traffic2@Network2", "IP-2", url_patch_dict) + + IxLoadUtils.log("Disabling autoMacGeneration ...") + for i in range(nsgs): + url_ip = _get_url_ip("client", client_ip_range_names, i) + response = requests.patch(url_ip, json=url_patch_dict['auto_mac_setting']) + #response = self.make_request('PATCH', url_ip, url_patch_dict['auto_mac_setting']) + + for i in range(enis): + url_ip = _get_url_ip("server", server_ip_range_names, i) + response = requests.patch(url_ip, json=url_patch_dict['auto_mac_setting']) + #response = self.make_request('PATCH', url_ip, url_patch_dict['auto_mac_setting']) + + vlan_enabled = {"enabled": True} + + IxLoadUtils.log("Creating Client IPs, MACs, and VLANIDs") + client_ip_range_settings = [] + client_mac_range_settings = [] + client_vlan_range_settings = [] + eni_index = 1 + ip_count = 0 + nodetype = "client" + # Build Client IPs and MACs + for i in range(nsgs + 1 + ip_ranges_per_vpc): + if ip_count < ip_ranges_per_vpc and eni_index <= enis: + # --- ixNet objects need to be added in the list before they are configured. + client_ip_range_settings.append(_set_ip_range_options(ip_count, eni_index, nodetype)) + client_mac_range_settings.append(_set_mac_range_options(ip_count, eni_index, nodetype)) + client_vlan_range_settings.append(_set_vlan_range_options(url_patch_dict, eni_index-1, nodetype)) + ip_count += 1 + else: + eni_index += 1 + ip_count = 0 + + IxLoadUtils.log("Setting Client Ranges: IPs, MACs, VLANs") + for i in range(nsgs): + # Enable VLAN settings + range_url = url_patch_dict['client_range_setting']['url'] + r_index = client_ip_range_names[i].split("-")[1][1:] + + url_ip = url_patch_dict['base_url'] + range_url % (r_index) + url_mac = url_patch_dict['base_url'] + range_url % (r_index) + "/macRange" + url_vlan = url_patch_dict['base_url'] + range_url % (r_index) + "/vlanRange" + + response = requests.patch(url_ip, json=client_ip_range_settings[i]) + response = requests.patch(url_mac, json=client_mac_range_settings[i]) + response = requests.patch(url_vlan, json=vlan_enabled) + response = requests.patch(url_vlan, json=client_vlan_range_settings[i]) + + IxLoadUtils.log("Creating Server IPs, MACs, and VLANIDs") + nodetype = "server" + server_ip_range_settings = [] + server_mac_range_settings = [] + server_vlan_range_settings = [] + # Build Server IPs and MACs + for i in range(enis): + server_ip_range_settings.append(_set_ip_range_options(0, i + 1, nodetype)) + server_mac_range_settings.append(_set_mac_range_options(0, i+1, nodetype)) + server_vlan_range_settings.append(_set_vlan_range_options(url_patch_dict, i, nodetype)) + + IxLoadUtils.log("Setting Server Ranges: IPs, MACs, VLANs") + for i in range(enis): + range_url = url_patch_dict['server_range_setting']['url'] + r_index = server_ip_range_names[i].split("-")[1][1:] + + url_ip = url_patch_dict['base_url'] + range_url % (r_index) + url_mac = url_patch_dict['base_url'] + range_url % (r_index) + "/macRange" + url_vlan = url_patch_dict['base_url'] + range_url % (r_index) + "/vlanRange" + + response = requests.patch(url_ip, json=server_ip_range_settings[i]) + response = requests.patch(url_mac, json=server_mac_range_settings[i]) + response = requests.patch(url_vlan, json=vlan_enabled) + response = requests.patch(url_vlan, json=server_vlan_range_settings[i]) + + IxLoadUtils.log("Disabling Unused IP ranges ...") + kIpOptionsToChange = { + # format : { IP Range name : { optionName : optionValue } } + client_ip_range_names[-1]: { + 'count': 1, + 'enabled': False, + }, + server_ip_range_names[-1]: { + 'count': 1, + 'enabled': False, + } + } + IxLoadUtils.changeIpRangesParams(connection, session_url, kIpOptionsToChange) + + # Turn off TCP settings + IxLoadUtils.log("Adjusting Test Settings, TCP, HTTP ...") + response = _patch_test_setting(url_patch_dict, 'http_version') + response = _patch_test_setting(url_patch_dict, 'http_tcp_conns_per_user') + + response = _patch_test_setting(url_patch_dict, 'client_disable_tcp_tw_recycle') + response = _patch_test_setting(url_patch_dict, 'server_disable_tcp_tw_recycle') + + IxLoadUtils.log("Adjusting Test Timeline settings ...") + if url_patch_dict['timeline_settings']['timelineType'] == 0: + rampDownTime = 10 + sustainTime = 180 + _set_timeline_settings(test_settings, rampDownTime, sustainTime) + else: + url_timeline = url_patch_dict['base_url'] + url_patch_dict['timeline_settings']['url'] + timelineType_json = {'timelineType': url_patch_dict['timeline_settings']['timelineType']} + response = requests.patch(url_timeline, json=timelineType_json) + + timeline_json = url_patch_dict['timeline_settings']['advanced'] + response = requests.patch(url_timeline, json=timeline_json) + + advanced_url = url_timeline + "/advancedIteration/segmentList/%s" + for i in range(4): + url = advanced_url % (i) + d_json = {'duration': url_patch_dict['timeline_settings']['advancedIteration']['d{}'.format(i)]} + response = requests.patch(url, json=d_json) + + # Change TCP Connections Established to CPS caption name and to use kRate aggregationType + stats_configured_url = url_patch_dict['base_url'] + url_patch_dict['stats_configured']['url'] + response = requests.get(stats_configured_url, params=None) + stat_url_list = response.json() + for stat in stat_url_list: + if stat['caption'] == 'TCP Connections Established': + objectID = stat['objectID'] + + cps_url = url_patch_dict['stats_configured']['url'] + '/' + str(objectID) + url_patch_dict['cps_aggregation_type']['url'] = cps_url + url_patch_dict['cps_stat_caption']['url'] = cps_url + + response = _patch_test_setting(url_patch_dict, 'cps_aggregation_type') + response = _patch_test_setting(url_patch_dict, 'cps_stat_caption') + + IxLoadUtils.log("Adding new commands %s..." % (list(kNewCommands))) + IxLoadUtils.addCommands(connection, session_url, kNewCommands) + IxLoadUtils.log("Commands added.") + + IxLoadUtils.log("Creating custom traffic maps") + _create_traffic_map(connection, url_patch_dict, nsgs, enis, ip_ranges_per_vpc) + IxLoadUtils.log("Traffic Maps completed") + + IxLoadUtils.log("Clearing chassis list...") + IxLoadUtils.clearChassisList(connection, session_url) + IxLoadUtils.log("Chassis list cleared.") + + IxLoadUtils.log("Adding chassis %s..." % (test_settings.chassisList)) + IxLoadUtils.addChassisList(connection, session_url, test_settings.chassisList) + IxLoadUtils.log("Chassis added.") + + IxLoadUtils.log("Assigning new ports...") + IxLoadUtils.assignPorts(connection, session_url, test_settings.portListPerCommunity) + IxLoadUtils.log("Ports assigned.") + + initial_objective = 6000000 + threshold = 100000 + target_failures = 1000 + MAX_CPS = 9000000 + MIN_CPS = 0 + cps_max_w_ts, failures_dict, test_run_results, latency_ranges = _run_cc_test(connection, session_url, + url_patch_dict, + MAX_CPS, + MIN_CPS, threshold, + target_failures, test_settings, + initial_objective) + + IxLoadUtils.log("Test Complete Final Values") + _print_final_table(test_run_results) + + IxLoadUtils.deleteAllSessions(connection) + diff --git a/test/test-cases/scale/vnet2vnet/48K-ips/testdata_vxlan_8vpc_48K-ips.py b/test/test-cases/scale/vnet2vnet/48K-ips/testdata_vxlan_8vpc_48K-ips.py index 58c973a42..1094135ef 100644 --- a/test/test-cases/scale/vnet2vnet/48K-ips/testdata_vxlan_8vpc_48K-ips.py +++ b/test/test-cases/scale/vnet2vnet/48K-ips/testdata_vxlan_8vpc_48K-ips.py @@ -1,137 +1,137 @@ -import pandas as pd -import os - - -ip_type = "v6" - -testdata = { - "val_map": { - 1: { - "underlay_routing":"BGP",#"BGP" - "oeth": {"mac": "80:09:02:01:00:01", }, - "oipv4": { - "ip": "220.0.1.2", - "ip_step":"0.0.0.1", - "gip": "220.0.1.1", - "gip_step":"0.0.0.1", - "mac": "00:ae:cd:10:7e:c6", - }, - "obgp": {"ip": "220.0.1.2", "dip": "220.0.1.1", "bid": "194.0.0.1", "type": "External", "las": 200, }, - "oipv4pool": {"ip": "221.0.1.1", "ip_step":"0.0.0.1","multiplier": 8}, - "dg_b_ong_eth": {"mac": '00:12:01:00:00:01', }, - "dg_b_ong_ipv4": { - "ip": "221.0.1.1", - "ip_step":"0.0.0.1", - "gip": "101.1.0.1", - "gip_step":"0.0.0.1", - }, - "vxlan": { - "RemoteVmStaticMac": { - "start_value":'00:1b:6e:80:00:01', - "step_value":"00:00:00:01:00:00", - "increments":[("00:00:00:00:00:40", 1000,[])], - "ng_step":'00:00:00:08:00:00' - }, - "RemoteVtepIpv4": '221.0.0.2', - "StaticInfoCount": 6000, - "Vni": 1, - "RemoteVmStaticIpv4": { - "start_value":"1.128.0.1", - "step_value":"0.4.0.0", - "increments":[("0.0.1.0", 1000,[])],"ng_step":"1.0.0.0" - } - }, - - "ieth_local": {"mac": "00:1b:6e:00:00:01",'step':'00:00:00:00:00:01'}, - "iipv4_local": {"ip": "1.1.0.1", "gip": "1.128.0.1","prefix":9,'ip_step':'0.0.0.1','ip_ng1_step':'1.0.0.0','gip_step':'0.0.0.0','gip_ng1_step':'1.0.0.0'}, - }, - 2: { - "underlay_routing":"BGP",#"BGP" - "oeth": {"mac": "80:09:02:02:00:01", }, - "oipv4": { - "ip": "220.0.2.2", - "ip_step":"0.0.0.1", - "gip": "220.0.2.1", - "gip_step":"0.0.0.1", - "mac": "00:ae:cd:10:7e:c6", - }, - "obgp": {"ip": "220.0.2.2", "dip": "220.0.2.1", "bid": "194.0.0.1", "type": "External", "las": 200, }, - "oipv4pool": {"ip": "221.0.2.101","ip_step":"0.0.0.1", "multiplier": 8}, - "dg_b_ong_eth": {"mac": '00:15:01:00:00:01', }, - "dg_b_ong_ipv4": { - "ip": "221.0.2.101", - "ip_step":"0.0.0.1", - "gip": "104.1.0.1", - "gip_step":"0.0.0.1", - - }, - "vxlan": { - "RemoteVmStaticMac": '00:1b:6e:00:00:01', - "RemoteVtepIpv4": '221.0.0.2', - "StaticInfoCount": 1, - "Vni": 101, - "RemoteVmStaticIpv4": "1.1.0.1", - "RemoteVmStaticIpv4": { - "start_value":"1.1.0.1", - "step_value":"0.0.0.1", - "increments":[],"ng_step":"1.0.0.0" - } - }, - "ieth_allow": { - "mac": { - "start_value":'00:1b:6e:80:00:01', - "step_value":"00:00:00:01:00:00", - "increments":[("00:00:00:00:00:80", 500,[])], - "ng_step":'00:00:00:08:00:00' - }, - - }, - "iipv4_allow": { - "ip": { - "start_value":'1.128.0.1', - "step_value":"0.4.0.0", - "increments":[("0.0.2.0", 500,[])], - "ng_step":"1.0.0.0" - }, - "gip": "1.1.0.1", - "gip_step": "0.0.0.0", - "gip_ng_step": "1.0.0.0", - "prefix":9, - "multiplier": 3000 - }, - "ieth_deny": { - "mac": { - "start_value":'00:1b:6e:80:00:01', - "step_value":"00:00:00:01:00:00", - "increments":[("00:00:00:00:00:40", 500,[])], - "ng_step":'00:00:00:08:00:00' - }, - - }, - "iipv4_deny": { - "ip": { - "start_value":'1.128.1.1', - "step_value":"0.4.0.0", - "increments":[("0.0.2.0", 500,[])], - "ng_step":"1.0.0.0" - }, - "gip": "1.1.0.1", - "gip_step": "0.0.0.0", - "gip_ng_step": "1.0.0.0", - "prefix":9, - "multiplier": 3000 - }, - - } - }, - "acl_policies": [ - { - 'src_ip': ['222.0.0.2/32', '222.0.0.2/32'], - 'dst_ip':['222.0.0.1/32', '222.0.0.1/32'], - 'priority':0, - 'action':'allow', - }, - ] -} -#VNI need increment - +import pandas as pd +import os + + +ip_type = "v6" + +testdata = { + "val_map": { + 1: { + "underlay_routing":"BGP",#"BGP" + "oeth": {"mac": "80:09:02:01:00:01", }, + "oipv4": { + "ip": "220.0.1.2", + "ip_step":"0.0.0.1", + "gip": "220.0.1.1", + "gip_step":"0.0.0.1", + "mac": "00:ae:cd:10:7e:c6", + }, + "obgp": {"ip": "220.0.1.2", "dip": "220.0.1.1", "bid": "194.0.0.1", "type": "External", "las": 200, }, + "oipv4pool": {"ip": "221.0.1.1", "ip_step":"0.0.0.1","multiplier": 8}, + "dg_b_ong_eth": {"mac": '00:12:01:00:00:01', }, + "dg_b_ong_ipv4": { + "ip": "221.0.1.1", + "ip_step":"0.0.0.1", + "gip": "101.1.0.1", + "gip_step":"0.0.0.1", + }, + "vxlan": { + "RemoteVmStaticMac": { + "start_value":'00:1b:6e:80:00:01', + "step_value":"00:00:00:01:00:00", + "increments":[("00:00:00:00:00:40", 1000,[])], + "ng_step":'00:00:00:08:00:00' + }, + "RemoteVtepIpv4": '221.0.0.2', + "StaticInfoCount": 6000, + "Vni": 1, + "RemoteVmStaticIpv4": { + "start_value":"1.128.0.1", + "step_value":"0.4.0.0", + "increments":[("0.0.1.0", 1000,[])],"ng_step":"1.0.0.0" + } + }, + + "ieth_local": {"mac": "00:1b:6e:00:00:01",'step':'00:00:00:00:00:01'}, + "iipv4_local": {"ip": "1.1.0.1", "gip": "1.128.0.1","prefix":9,'ip_step':'0.0.0.1','ip_ng1_step':'1.0.0.0','gip_step':'0.0.0.0','gip_ng1_step':'1.0.0.0'}, + }, + 2: { + "underlay_routing":"BGP",#"BGP" + "oeth": {"mac": "80:09:02:02:00:01", }, + "oipv4": { + "ip": "220.0.2.2", + "ip_step":"0.0.0.1", + "gip": "220.0.2.1", + "gip_step":"0.0.0.1", + "mac": "00:ae:cd:10:7e:c6", + }, + "obgp": {"ip": "220.0.2.2", "dip": "220.0.2.1", "bid": "194.0.0.1", "type": "External", "las": 200, }, + "oipv4pool": {"ip": "221.0.2.101","ip_step":"0.0.0.1", "multiplier": 8}, + "dg_b_ong_eth": {"mac": '00:15:01:00:00:01', }, + "dg_b_ong_ipv4": { + "ip": "221.0.2.101", + "ip_step":"0.0.0.1", + "gip": "104.1.0.1", + "gip_step":"0.0.0.1", + + }, + "vxlan": { + "RemoteVmStaticMac": '00:1b:6e:00:00:01', + "RemoteVtepIpv4": '221.0.0.2', + "StaticInfoCount": 1, + "Vni": 101, + "RemoteVmStaticIpv4": "1.1.0.1", + "RemoteVmStaticIpv4": { + "start_value":"1.1.0.1", + "step_value":"0.0.0.1", + "increments":[],"ng_step":"1.0.0.0" + } + }, + "ieth_allow": { + "mac": { + "start_value":'00:1b:6e:80:00:01', + "step_value":"00:00:00:01:00:00", + "increments":[("00:00:00:00:00:80", 500,[])], + "ng_step":'00:00:00:08:00:00' + }, + + }, + "iipv4_allow": { + "ip": { + "start_value":'1.128.0.1', + "step_value":"0.4.0.0", + "increments":[("0.0.2.0", 500,[])], + "ng_step":"1.0.0.0" + }, + "gip": "1.1.0.1", + "gip_step": "0.0.0.0", + "gip_ng_step": "1.0.0.0", + "prefix":9, + "multiplier": 3000 + }, + "ieth_deny": { + "mac": { + "start_value":'00:1b:6e:80:00:01', + "step_value":"00:00:00:01:00:00", + "increments":[("00:00:00:00:00:40", 500,[])], + "ng_step":'00:00:00:08:00:00' + }, + + }, + "iipv4_deny": { + "ip": { + "start_value":'1.128.1.1', + "step_value":"0.4.0.0", + "increments":[("0.0.2.0", 500,[])], + "ng_step":"1.0.0.0" + }, + "gip": "1.1.0.1", + "gip_step": "0.0.0.0", + "gip_ng_step": "1.0.0.0", + "prefix":9, + "multiplier": 3000 + }, + + } + }, + "acl_policies": [ + { + 'src_ip': ['222.0.0.2/32', '222.0.0.2/32'], + 'dst_ip':['222.0.0.1/32', '222.0.0.1/32'], + 'priority':0, + 'action':'allow', + }, + ] +} +#VNI need increment + diff --git a/test/test-cases/scale/vnet2vnet/README.md b/test/test-cases/scale/vnet2vnet/README.md index 89896c1ef..261b09629 100644 --- a/test/test-cases/scale/vnet2vnet/README.md +++ b/test/test-cases/scale/vnet2vnet/README.md @@ -1,101 +1,101 @@ -# VNET to VNET - -The SONiC-DASH testbed provides a common test platform to examine an extensive collection of test cases and allow ease of duplication and modification. The directory structure is arranged for configuring a variety of test SKUs and to reduce testing design time. - -The files found within this directory serve the following purpose: -1. Define a guide for expanding DASH test scenarios. -2. Generate `packets per second` and `connections per second` benchmarks all driven from PyTest. - - -# test cases - -| Test case | Description | -| ---------------------------------------------- | --------------------------------------------------------- | -| [vxlan_1eni_1ip](one-ip) | minimum possible config | -| [vxlan_8eni_48k_IPs](48K-ips) | medium sized config | - - - -# minimum possible config -1 src ip , 1dst ip, 1 UDP port, 1 eni ...... 1-2 flow(s) - -Intent here is to create the smallest, most basic config that will get UDP traffic to pass through in both directions. - -This will prove the basic functionality is there. - -Based on the design of the implementation this test will usually be able to give us also the best or the worst performance numbers. - -obtain PPS and latency numbers - -# minimum possible config, add few UDP ports -This builds on top of the previous test. - -Intent here is to get closer to reality where we will have more than 1 flow at a time. - -For highly parallel implementations have 1 flow per processing unit and it should provide the best performance numbers. - -obtain PPS and latency numbers - -# minimum possible config, with random src and dest UDP ports -builds on top of minimum possible config, but since we have 65K possible source and 65K possible destination ports, we can generate 4 billion unique flows. - -this test can be ran in 2 ways. - -keep the flow expiration timer at 1 sec and see what is the device flow install rate. - -keep the flow expiration timer at `big number` and see how many flows can be installed before device starts misbehaving. - - - is performance slowly degrading ? - - is performance all of a sudden degrading drastically? - - will the device crash? - - will the device recover and return to good performance/functionality once the flows expire and flow tables are not full anymore? - -# minimum possible config, cps test -This test will find the highest CPS by counting the aggregate number of connections established. -- Test uses a binary search algorithm to step up or down the CPS objective - - - -# 48K IPs "baby hero", UDP test -this has full hero test config with 8 ENIs, 6 NSGs per ENI, 1000 ACL policies per NSG, with the only exception that it has only 1 prefix per ACL policy instead of ~200 - -half of ACLs are allow half are deny with alternating IPs - -24K flows will be created over allowed IPs and 24K flows will be sent over the deny IPs - -this test will verify that: - - configuration can scale - - see the scale impact on performance from the minimum config - - see that allow/deny ACLs are respected - -# 48K IPs "baby hero", tcp test -traffic will be sent over the 24K allowed IPs - -test will have full 5M+1M tcp sessions by making use of tcp ports - -connection rate value will be observed while maintaining 6M concurrent sessions - -# few others upcoming tests - - mix of tcp and UDP in same test - - full hero test - - IPv6 version of the tests - - IPv4 with IPv6 mix, 25% IPv4, 25% IPv6, 25% IPv4 over IPv6, 25% IPv6 over IPv4 - - ... -# VNET to VNET - -The SONiC-DASH testbed provides a common test platform to examine an extensive collection of test cases and allow ease of duplication and modification. The directory structure is arranged for configuring a variety of test SKUs and to reduce testing design time. - -The files found within this directory serve the following purpose: -1. Define a guide for expanding DASH test scenarios. -2. Generate two test outcomes using separate traffic generation tools and collecting results using one testing framework: PyTest. -3. Demonstrate testbed setup requires minimum configuration as the test platform provides tools and configuration out of the box. -4. Test one seeks to find the maximum capability of the device under test to measure the raw bandwidth by identifying the Packets Per Second. -5. Test two's goal is to discover the maximum number of functioning connections that can be established per second. - - -# test cases - -| Test case | Description | -| ---------------------------------------------- | -------------------------------------------------------------- | -| [vxlan_1vpc_1ip](one-ip/README.md) | performance numbers for best case scenario | -| [vxlan_8vpc_48K-ips](48K-ips/README.md) | performance with an objective of maintaining 6M parallel flows | +# VNET to VNET + +The SONiC-DASH testbed provides a common test platform to examine an extensive collection of test cases and allow ease of duplication and modification. The directory structure is arranged for configuring a variety of test SKUs and to reduce testing design time. + +The files found within this directory serve the following purpose: +1. Define a guide for expanding DASH test scenarios. +2. Generate `packets per second` and `connections per second` benchmarks all driven from PyTest. + + +# test cases + +| Test case | Description | +| ---------------------------------------------- | --------------------------------------------------------- | +| [vxlan_1eni_1ip](one-ip) | minimum possible config | +| [vxlan_8eni_48k_IPs](48K-ips) | medium sized config | + + + +# minimum possible config +1 src ip , 1dst ip, 1 UDP port, 1 eni ...... 1-2 flow(s) + +Intent here is to create the smallest, most basic config that will get UDP traffic to pass through in both directions. + +This will prove the basic functionality is there. + +Based on the design of the implementation this test will usually be able to give us also the best or the worst performance numbers. + +obtain PPS and latency numbers + +# minimum possible config, add few UDP ports +This builds on top of the previous test. + +Intent here is to get closer to reality where we will have more than 1 flow at a time. + +For highly parallel implementations have 1 flow per processing unit and it should provide the best performance numbers. + +obtain PPS and latency numbers + +# minimum possible config, with random src and dest UDP ports +builds on top of minimum possible config, but since we have 65K possible source and 65K possible destination ports, we can generate 4 billion unique flows. + +this test can be ran in 2 ways. + +keep the flow expiration timer at 1 sec and see what is the device flow install rate. + +keep the flow expiration timer at `big number` and see how many flows can be installed before device starts misbehaving. + + - is performance slowly degrading ? + - is performance all of a sudden degrading drastically? + - will the device crash? + - will the device recover and return to good performance/functionality once the flows expire and flow tables are not full anymore? + +# minimum possible config, cps test +This test will find the highest CPS by counting the aggregate number of connections established. +- Test uses a binary search algorithm to step up or down the CPS objective + + + +# 48K IPs "baby hero", UDP test +this has full hero test config with 8 ENIs, 6 NSGs per ENI, 1000 ACL policies per NSG, with the only exception that it has only 1 prefix per ACL policy instead of ~200 + +half of ACLs are allow half are deny with alternating IPs + +24K flows will be created over allowed IPs and 24K flows will be sent over the deny IPs + +this test will verify that: + - configuration can scale + - see the scale impact on performance from the minimum config + - see that allow/deny ACLs are respected + +# 48K IPs "baby hero", tcp test +traffic will be sent over the 24K allowed IPs + +test will have full 5M+1M tcp sessions by making use of tcp ports + +connection rate value will be observed while maintaining 6M concurrent sessions + +# few others upcoming tests + - mix of tcp and UDP in same test + - full hero test + - IPv6 version of the tests + - IPv4 with IPv6 mix, 25% IPv4, 25% IPv6, 25% IPv4 over IPv6, 25% IPv6 over IPv4 + - ... +# VNET to VNET + +The SONiC-DASH testbed provides a common test platform to examine an extensive collection of test cases and allow ease of duplication and modification. The directory structure is arranged for configuring a variety of test SKUs and to reduce testing design time. + +The files found within this directory serve the following purpose: +1. Define a guide for expanding DASH test scenarios. +2. Generate two test outcomes using separate traffic generation tools and collecting results using one testing framework: PyTest. +3. Demonstrate testbed setup requires minimum configuration as the test platform provides tools and configuration out of the box. +4. Test one seeks to find the maximum capability of the device under test to measure the raw bandwidth by identifying the Packets Per Second. +5. Test two's goal is to discover the maximum number of functioning connections that can be established per second. + + +# test cases + +| Test case | Description | +| ---------------------------------------------- | -------------------------------------------------------------- | +| [vxlan_1vpc_1ip](one-ip/README.md) | performance numbers for best case scenario | +| [vxlan_8vpc_48K-ips](48K-ips/README.md) | performance with an objective of maintaining 6M parallel flows | diff --git a/test/test-cases/scale/vnet2vnet/one-ip/dash_1vpc_1ip_peer.json b/test/test-cases/scale/vnet2vnet/one-ip/dash_1vpc_1ip_peer.json index 32f2a2c31..2ff56e485 100644 --- a/test/test-cases/scale/vnet2vnet/one-ip/dash_1vpc_1ip_peer.json +++ b/test/test-cases/scale/vnet2vnet/one-ip/dash_1vpc_1ip_peer.json @@ -172,4 +172,4 @@ } ] -} \ No newline at end of file +} diff --git a/test/test-cases/utils/README.md b/test/test-cases/utils/README.md index 9788f9918..fcbe819b3 100644 --- a/test/test-cases/utils/README.md +++ b/test/test-cases/utils/README.md @@ -1,2 +1,2 @@ # utils -This directory contains miscellaneous utilities used in tests. \ No newline at end of file +This directory contains miscellaneous utilities used in tests. diff --git a/test/third-party/traffic_gen/README.md b/test/third-party/traffic_gen/README.md index f38cc54df..6555db894 100644 --- a/test/third-party/traffic_gen/README.md +++ b/test/third-party/traffic_gen/README.md @@ -9,4 +9,4 @@ Ixia-c supports client APIs in various languages, most prevalent being [snappi]( * Vendor-neutral [Open Traffic Generator](https://github.com/open-traffic-generator) model and API * [Ixia-c](https://github.com/open-traffic-generator/ixia-c), a powerful traffic generator based on Open Traffic Generator API * [Ixia-c Slack support channel](https://github.com/open-traffic-generator/ixia-c/blob/main/docs/support.md) -* [Keysight Elastic Network Generator](https://www.keysight.com/us/en/products/network-test/protocol-load-test/keysight-elastic-network-generator.html), a commercial version of Ixia-c with L3 protocol engine, no restrictions on performance and scalability, priority technical support. \ No newline at end of file +* [Keysight Elastic Network Generator](https://www.keysight.com/us/en/products/network-test/protocol-load-test/keysight-elastic-network-generator.html), a commercial version of Ixia-c with L3 protocol engine, no restrictions on performance and scalability, priority technical support. diff --git a/test/third-party/traffic_gen/deployment/README.md b/test/third-party/traffic_gen/deployment/README.md index b85803d20..b781b6a95 100644 --- a/test/third-party/traffic_gen/deployment/README.md +++ b/test/third-party/traffic_gen/deployment/README.md @@ -6,4 +6,4 @@ Deployment is done using `docker-compose` and configuration file [ixia-c-deployment.yml](ixia-c-deployment.yml) and by setting up veth pairs (assumed already in-place by the test environment before docker-compose is called). Future considerations - - [Containerlab](https://containerlab.dev/), a CLI for orchestrating and managing container-based networking labs. \ No newline at end of file + - [Containerlab](https://containerlab.dev/), a CLI for orchestrating and managing container-based networking labs. diff --git a/test/third-party/traffic_gen/deployment/ixia-c.drawio.svg b/test/third-party/traffic_gen/deployment/ixia-c.drawio.svg index 006e60b95..abd16fc39 100644 --- a/test/third-party/traffic_gen/deployment/ixia-c.drawio.svg +++ b/test/third-party/traffic_gen/deployment/ixia-c.drawio.svg @@ -1,4 +1,4 @@ -
veth1
veth1
bmv2
bmv2
ixia-c-controller

:443
ixia-c-controller...
snappi
Client
snappi...
Ixia-C Deployment for Bidrectional Traffic
Ixia-C Deployment for Bidrectional Traffic
ixia-c-traffic-engine

:5555
ixia-c-traffic-engine...
ixia-c-traffic-engine

:5556
ixia-c-traffic-engine...
veth3
veth3
Open Traffic Generator API
Open Traffic Ge...
veth0
veth0
veth2
veth2
veth1
veth1
veth3
veth3
Text is not SVG - cannot display
\ No newline at end of file +
veth1
veth1
bmv2
bmv2
ixia-c-controller

:443
ixia-c-controller...
snappi
Client
snappi...
Ixia-C Deployment for Bidrectional Traffic
Ixia-C Deployment for Bidrectional Traffic
ixia-c-traffic-engine

:5555
ixia-c-traffic-engine...
ixia-c-traffic-engine

:5556
ixia-c-traffic-engine...
veth3
veth3
Open Traffic Generator API
Open Traffic Ge...
veth0
veth0
veth2
veth2
veth1
veth1
veth3
veth3
Text is not SVG - cannot display
From 7e166cc6eb70e04f0517107baea534529b2db0bb Mon Sep 17 00:00:00 2001 From: MirceaDan Date: Wed, 7 Jun 2023 13:46:10 -0700 Subject: [PATCH 29/75] check that all files have linux line endings before commit (#380) added pre-commit and pre-commit ci to check for file line endings and update them to linux if needed --- .github/workflows/pre-commit-check.yml | 93 ++++++++++++++++++++++++++ .pre-commit-config.yaml | 19 ++++++ 2 files changed, 112 insertions(+) create mode 100644 .github/workflows/pre-commit-check.yml create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/pre-commit-check.yml b/.github/workflows/pre-commit-check.yml new file mode 100644 index 000000000..9c0848048 --- /dev/null +++ b/.github/workflows/pre-commit-check.yml @@ -0,0 +1,93 @@ +name: pre-commit-check + +on: + pull_request: + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - run: pip install pre-commit>=3.2.1 + - run: pre-commit --version + - run: git --version + - run: git status + - run: pre-commit install + - run: git fetch origin + - run: | + set -x + set +e + OUTPUT=$(pre-commit run --color never --from-ref HEAD^ --to-ref HEAD 2>&1) + EXIT_CODE=$? + echo $OUTPUT + echo $EXIT_CODE + echo "pre_commit<> $GITHUB_ENV + echo $OUTPUT >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + echo "exit_code=$EXIT_CODE" >> $GITHUB_ENV + continue-on-error: true + + - name: Prepare comment + if: ${{ env.exit_code != 0 }} + env: + PRE_COMMIT: ${{ env.pre_commit }} + EXIT_CODE: ${{ env.exit_code }} + run: | + echo "$PRE_COMMIT" + echo $EXIT_CODE + if [[ `echo "$PRE_COMMIT" | wc -l` -gt 20 ]]; then + PRE_COMMIT=`echo "$PRE_COMMIT" | head -n 20` + PRE_COMMIT="$PRE_COMMIT\n...\n[truncated extra lines, please run pre-commit locally to view full check results]" + PRE_COMMIT=`printf "$PRE_COMMIT"` + fi + br='
' + PR_MESSAGE="The [pre-commit](http://pre-commit.com/) check detected issues in the files touched by this pull request. + + Detailed pre-commit check results: + + $PRE_COMMIT + To run the pre-commit checks locally, you can follow below steps: + + 1. Ensure that default python is python3. + + 2. Ensure that the \`pre-commit\` package is installed: + + \`\`\`sudo pip install pre-commit\`\`\` + + 3. Go to repository root folder + + 4. Install the pre-commit hooks: + + \`\`\`pre-commit install\`\`\` + + 5. Use pre-commit to check staged file: + + \`\`\`pre-commit\`\`\` + + 6. Alternatively, you can check committed files using: + + \`\`\`pre-commit run --from-ref --to-ref \`\`\` + or + \`\`\`pre-commit run --all-files\`\`\`" + results=`echo "$PR_MESSAGE" | while read line; do echo $line$br; done | tr -d '\n'` + echo "pre_commit_mod=$results" >> $GITHUB_ENV + echo "exit_code=$EXIT_CODE" >> $GITHUB_ENV + + - name: Add comment to PR + if: ${{ env.exit_code != 0 }} + env: + URL: ${{ github.event.pull_request.comments_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PRE_COMMIT: ${{ env.pre_commit_mod }} + run: | + curl \ + -X POST \ + $URL \ + -H "Content-Type: application/json" \ + -H "Authorization: token $GITHUB_TOKEN" \ + --data "{ \"body\": \"$PRE_COMMIT\" }" + + - name: pre-commit exit code + env: + EXIT_CODE: ${{ env.exit_code }} + run: exit $EXIT_CODE diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..2af694291 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: mixed-line-ending + args: [--fix=lf] + # - id: trailing-whitespace +# - id: end-of-file-fixer +# - id: check-case-conflict +# - id: check-ast +# - id: check-json +# - id: double-quote-string-fixer +# - repo: https://github.com/PyCQA/flake8 +# rev: 6.0.0 +# hooks: +# - id: flake8 +# args: ["--max-line-length=201", "--extend-ignore=F601,F821"] From 233f99e988cd96adafd6291c06679a854f42c213 Mon Sep 17 00:00:00 2001 From: Chris Sommers <31145757+chrispsommers@users.noreply.github.com> Date: Thu, 8 Jun 2023 10:57:57 -0700 Subject: [PATCH 30/75] Update ixia-c/snappi to fix https://github.com/sonic-net/DASH/issues/357 (TLS 1.0/1.1 security concerns) #372 (#384) * Update config file * Use newer snappi in SAI-Challenger. * Update SAI Challenger, snappi, ixia-c to fix https://github.com/sonic-net/DASH/issues/357 TLS 1.0 and 1.1 security risk in ixiac Controller. This requires changes to various dockerfiles. Added long-overdue dependencies to Makefile to rebuild Docker base images as needed. * Updated to latest SAI Challenger which includes updated snappi. --- .gitmodules | 2 +- dash-pipeline/Makefile | 11 +++++++++-- .../dockerfiles/DOCKER_SAITHRIFT_CLIENT_BLDR_IMG.env | 2 +- .../dockerfiles/Dockerfile.saichallenger-client-bldr | 2 +- dash-pipeline/dockerfiles/Dockerfile.saithrift-client | 2 +- .../dockerfiles/Dockerfile.saithrift-client-bldr | 1 + dash-pipeline/tests/requirements.txt | 2 +- test/requirements.txt | 4 ++-- .../functional/saic/sai_dpu_client_server_snappi.json | 2 +- .../scale/saic/sai_dpu_client_server_snappi.json | 2 +- test/third-party/traffic_gen/deployment/.env | 4 ++-- 11 files changed, 21 insertions(+), 13 deletions(-) diff --git a/.gitmodules b/.gitmodules index 42aae0be4..0ced2e43b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,5 +4,5 @@ branch = dash-ptf-ci [submodule "test/SAI-Challenger"] path = test/SAI-Challenger - url = https://github.com/opencomputeproject/SAI-Challenger + url = https://github.com/opencomputeproject/SAI-Challenger.git branch = main diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index 95f2b5991..dc95de8fa 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -411,6 +411,9 @@ docker-publish-saithrift-bldr: DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saithrift-client-bldr | $(SHA1SUM)) DOCKER_SAITHRIFT_CLIENT_BLDR_IMG = $(DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_NAME):$(DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_TAG) +docker-saithrift-client-bldr-image-exists: + docker images --format "{{.Repository}}:{{.Tag}}" |grep $(DOCKER_SAITHRIFT_CLIENT_BLDR_IMG) || make docker-saithrift-client-bldr + docker-saithrift-client-bldr: { [ x$(ENABLE_DOCKER_PULL) == xy ] && docker pull $(DOCKER_SAITHRIFT_CLIENT_BLDR_IMG); } || \ docker build \ @@ -440,7 +443,7 @@ docker-publish-saithrift-client-bldr: # Client image, rebuild any time SAI interface changes # TODO - add sai header (inc/ and experimental) dependencies -docker-saithrift-client: +docker-saithrift-client: docker-saithrift-client-bldr-image-exists docker build \ -f dockerfiles/Dockerfile.saithrift-client \ -t $(DOCKER_SAITHRIFT_CLIENT_IMG) \ @@ -655,6 +658,10 @@ endif DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_TAG = $(shell cat dockerfiles/Dockerfile.saichallenger-client-bldr | $(SHA1SUM)) DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG = $(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_NAME):$(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG_TAG) + +docker-saichallenger-client-bldr-image-exists: + docker images --format "{{.Repository}}:{{.Tag}}" |grep $(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG) || make docker-saichallenger-client-bldr + docker-saichallenger-client-bldr: { [ x$(ENABLE_DOCKER_PULL) == xy ] && docker pull $(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG); } || \ { pushd $(SAI_CHALLENGER_PATH) && git submodule update --init && ./build.sh -i client && popd; \ @@ -674,7 +681,7 @@ docker-publish-saichallenger-client-bldr: docker-pull-saichallenger-client-bldr: docker pull $(DOCKER_SAI_CHALLENGER_CLIENT_BLDR_IMG) -docker-saichallenger-client: docker-saichallenger-client-bldr +docker-saichallenger-client: docker-saichallenger-client-bldr-image-exists docker build \ -f dockerfiles/Dockerfile.saichallenger-client \ -t $(DOCKER_SAI_CHALLENGER_CLIENT_IMG) \ diff --git a/dash-pipeline/dockerfiles/DOCKER_SAITHRIFT_CLIENT_BLDR_IMG.env b/dash-pipeline/dockerfiles/DOCKER_SAITHRIFT_CLIENT_BLDR_IMG.env index 06c05a35e..6f367b9be 100644 --- a/dash-pipeline/dockerfiles/DOCKER_SAITHRIFT_CLIENT_BLDR_IMG.env +++ b/dash-pipeline/dockerfiles/DOCKER_SAITHRIFT_CLIENT_BLDR_IMG.env @@ -2,4 +2,4 @@ # Changing this will cause build/publish to occur in CI actions export DASH_ACR_REGISTRY=sonicdash.azurecr.io export DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_NAME?=${DASH_ACR_REGISTRY}/dash-saithrift-client-bldr -export DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_CTAG?=220819 +export DOCKER_SAITHRIFT_CLIENT_BLDR_IMG_CTAG?=230523 diff --git a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr index 6b2c2aa48..76f7afac8 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saichallenger-client-bldr @@ -1,5 +1,5 @@ # Requires or something -# sc-client:230601 +# sc-client:230607 FROM sc-client ADD tests/ /tests/ diff --git a/dash-pipeline/dockerfiles/Dockerfile.saithrift-client b/dash-pipeline/dockerfiles/Dockerfile.saithrift-client index ed8476bf6..324c3a5e4 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saithrift-client +++ b/dash-pipeline/dockerfiles/Dockerfile.saithrift-client @@ -1,5 +1,5 @@ -FROM sonicdash.azurecr.io/dash-saithrift-client-bldr:220819 +FROM sonicdash.azurecr.io/dash-saithrift-client-bldr:230523 LABEL maintainer="SONiC-DASH Community " LABEL description="This Docker image contains the toolchain to run\ the saithrift client and test programs for DASH." diff --git a/dash-pipeline/dockerfiles/Dockerfile.saithrift-client-bldr b/dash-pipeline/dockerfiles/Dockerfile.saithrift-client-bldr index b192a88a1..faceb0f0b 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saithrift-client-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saithrift-client-bldr @@ -6,6 +6,7 @@ LABEL maintainer="SONiC-DASH Community " LABEL description="This Docker image contains the toolchain to build and install \ the saithrift client and test programs for DASH. It does not contain thrift/saithrift libraries" ADD requirements.txt /tests/ +# ctag 230523 # Below we build the baseline set of tools to run saithrift client tests # Contents do not include the thrift and saithrift client libraries, which need diff --git a/dash-pipeline/tests/requirements.txt b/dash-pipeline/tests/requirements.txt index 34cd8841c..97fca2def 100644 --- a/dash-pipeline/tests/requirements.txt +++ b/dash-pipeline/tests/requirements.txt @@ -1,2 +1,2 @@ -snappi==0.9.4 +snappi==0.11.14 pytest>=6.0.1 diff --git a/test/requirements.txt b/test/requirements.txt index 34cd8841c..cc935c015 100644 --- a/test/requirements.txt +++ b/test/requirements.txt @@ -1,2 +1,2 @@ -snappi==0.9.4 -pytest>=6.0.1 +snappi==0.11.14 +pytest=>=6.0.1 diff --git a/test/test-cases/functional/saic/sai_dpu_client_server_snappi.json b/test/test-cases/functional/saic/sai_dpu_client_server_snappi.json index 035743583..b85d97ddf 100755 --- a/test/test-cases/functional/saic/sai_dpu_client_server_snappi.json +++ b/test/test-cases/functional/saic/sai_dpu_client_server_snappi.json @@ -20,7 +20,7 @@ "alias": "ixia", "type": "snappi", "mode": "ixia_c", - "controller": "https://127.0.0.1:443", + "controller": "https://127.0.0.1:8443", "port_groups": [ {"alias": 0, "name": "veth1", "speed": "10G"}, {"alias": 1, "name": "veth3", "speed": "10G"} diff --git a/test/test-cases/scale/saic/sai_dpu_client_server_snappi.json b/test/test-cases/scale/saic/sai_dpu_client_server_snappi.json index 035743583..b85d97ddf 100755 --- a/test/test-cases/scale/saic/sai_dpu_client_server_snappi.json +++ b/test/test-cases/scale/saic/sai_dpu_client_server_snappi.json @@ -20,7 +20,7 @@ "alias": "ixia", "type": "snappi", "mode": "ixia_c", - "controller": "https://127.0.0.1:443", + "controller": "https://127.0.0.1:8443", "port_groups": [ {"alias": 0, "name": "veth1", "speed": "10G"}, {"alias": 1, "name": "veth3", "speed": "10G"} diff --git a/test/third-party/traffic_gen/deployment/.env b/test/third-party/traffic_gen/deployment/.env index a15c34c10..d0c13ee25 100644 --- a/test/third-party/traffic_gen/deployment/.env +++ b/test/third-party/traffic_gen/deployment/.env @@ -1,6 +1,6 @@ DOCKER_REGISTRY=ghcr.io/open-traffic-generator -CONTROLLER_VERSION=0.0.1-3587 -TRAFFIC_ENGINE_VERSION=1.6.0.19 +CONTROLLER_VERSION=0.0.1-4064 +TRAFFIC_ENGINE_VERSION=1.6.0.35 IFC1=veth1 IFC2=veth3 TCP_PORT_IFC1=5555 From add355e26b5ed5c86140a3559d851a5a9ae8b499 Mon Sep 17 00:00:00 2001 From: Vijay Srinivasan <8528272+vijasrin@users.noreply.github.com> Date: Wed, 21 Jun 2023 09:44:23 -0700 Subject: [PATCH 31/75] Adding support for metering (#365) - Metering P4 model changes in BMV2 - Changes to support the SAI api generation for metering tables --- dash-pipeline/SAI/sai_api_gen.py | 33 ++++-- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 50 +++++---- dash-pipeline/SAI/templates/saiapi.h.j2 | 11 ++ dash-pipeline/SAI/templates/utils.h.j2 | 21 ++++ dash-pipeline/bmv2/dash_metadata.p4 | 8 ++ dash-pipeline/bmv2/dash_outbound.p4 | 31 +++++- dash-pipeline/bmv2/dash_pipeline.p4 | 101 ++++++++++++++++++ .../tests/libsai/vnet_out/vnet_out.cpp | 8 ++ .../pytest/vnet/test_saithrift_vnet.py | 2 + .../functional/ptf/sai_dash_utils.py | 14 ++- test/test-cases/functional/ptf/saidashacl.py | 9 +- test/test-cases/functional/ptf/saidasheni.py | 2 + .../functional/ptf/saidashvnet_sanity.py | 8 +- .../saic/config_bidir_setup_commands.py | 36 +++++-- .../saic/config_inbound_setup_commands.py | 8 ++ .../saic/config_outbound_setup_commands.json | 24 +++-- .../saic/sai-api/test_sai_api_vnet_eni.py | 5 +- .../sai-api/test_sai_api_vnet_in_route.py | 4 + .../sai-api/test_sai_api_vnet_out_route.py | 12 ++- .../sai-api/test_sai_api_vnet_pa_entry.py | 2 +- .../saic/sai-api/test_sai_api_vnet_vni.py | 1 + ..._outbound_small_scale_config_via_dpugen.py | 16 ++- ..._small_scale_config_via_dpugen_create.json | 32 +++++- .../saic/test_sai_vnet_outbound_scale.py | 17 ++- .../saic/vnet_inbound_setup_commands.json | 4 + .../vnet_outbound_setup_commands_scale.json | 57 +++++++--- .../vnet_outbound_setup_commands_simple.json | 12 ++- 27 files changed, 442 insertions(+), 86 deletions(-) diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 6502a2cd8..c8862eed6 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -43,6 +43,7 @@ 'sai_ip_address_t': 'ipaddr', 'sai_ip_addr_family_t': 'u32', 'sai_uint32_t': 'u32', + 'sai_uint64_t': 'u64', 'sai_mac_t': 'mac' } @@ -54,13 +55,26 @@ def p4_annotation_to_sai_attr(p4rt, sai_attr): sai_attr['type'] = kv['value']['stringValue'] elif kv['key'] == 'isresourcetype': sai_attr['isresourcetype'] = kv['value']['stringValue'] + elif kv['key'] == 'isreadonly': + sai_attr['isreadonly'] = kv['value']['stringValue'] elif kv['key'] == 'objects': sai_attr['objectName'] = kv['value']['stringValue'] + elif kv['key'] == 'skipattr': + sai_attr['skipattr'] = kv['value']['stringValue'] else: print("Unknown attr annotation " + kv['key']) exit(1) sai_attr['field'] = sai_type_to_field[sai_attr['type']] +def p4_annotation_to_sai_table(p4rt, sai_table): + for anno in p4rt[STRUCTURED_ANNOTATIONS_TAG]: + if anno[NAME_TAG] == SAI_TAG: + for kv in anno[KV_PAIR_LIST_TAG][KV_PAIRS_TAG]: + if kv['key'] == 'isobject': + sai_table['is_object'] = kv['value']['stringValue'] + if kv['key'] == 'ignoretable': + sai_table['ignore_table'] = kv['value']['stringValue'] + def get_sai_key_type(key_size, key_header, key_field): if key_size == 1: return 'bool', "booldata" @@ -252,7 +266,11 @@ def generate_sai_apis(program, ignore_tables): sai_table_data[ACTIONS_TAG] = [] sai_table_data[ACTION_PARAMS_TAG] = [] + if STRUCTURED_ANNOTATIONS_TAG in table['preamble']: + p4_annotation_to_sai_table(table['preamble'], sai_table_data) table_control, table_name = table[PREAMBLE_TAG][NAME_TAG].split('.', 1) + if 'ignore_table' in sai_table_data.keys(): + ignore_tables.append(table_name) if table_name in ignore_tables: continue @@ -300,13 +318,14 @@ def generate_sai_apis(program, ignore_tables): fill_action_params(sai_table_data[ACTION_PARAMS_TAG], param_names, all_actions[action_id]) sai_table_data[ACTIONS_TAG].append(all_actions[action_id]) - if len(sai_table_data['keys']) == 1 and sai_table_data['keys'][0]['sai_key_name'].endswith(table_name.split('.')[-1] + '_id'): - sai_table_data['is_object'] = 'true' - elif len(sai_table_data['keys']) > 5: - sai_table_data['is_object'] = 'true' - else: - sai_table_data['is_object'] = 'false' - sai_table_data['name'] = sai_table_data['name'] + '_entry' + if 'is_object' not in sai_table_data.keys(): + if len(sai_table_data['keys']) == 1 and sai_table_data['keys'][0]['sai_key_name'].endswith(table_name.split('.')[-1] + '_id'): + sai_table_data['is_object'] = 'true' + elif len(sai_table_data['keys']) > 5: + sai_table_data['is_object'] = 'true' + else: + sai_table_data['is_object'] = 'false' + sai_table_data['name'] = sai_table_data['name'] + '_entry' table_names.append(sai_table_data[NAME_TAG]) is_new_api = True diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index a23e14260..c45319bdf 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -42,8 +42,8 @@ sai_status_t sai_create_{{ table.name }}( // There shall be one and only one action_type p4::v1::TableAction* entry = nullptr; p4::v1::Action* action = nullptr; - auto expectedParams = 0; - auto matchedParams = 0; + //auto expectedParams = 0; + //auto matchedParams = 0; sai_object_id_t objId = 0; // Search the action pi_p4_id_t actionId = 0; @@ -58,8 +58,8 @@ sai_status_t sai_create_{{ table.name }}( tableId = {{table.id}}; entry = matchActionEntry->mutable_action(); action = entry->mutable_action(); - expectedParams = 0; - matchedParams = 0; + //expectedParams = 0; + //matchedParams = 0; objId = 0; matchActionEntry->set_table_id(tableId); @@ -139,7 +139,7 @@ sai_status_t sai_create_{{ table.name }}( {% if table.actions|length == 1 %} {% for action in table.actions %} actionId = {{action.id}}; // SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }} - expectedParams = {{ action.params|length }}; + //expectedParams = {{ action.params|length }}; {% endfor %} {% else %} // Search the action @@ -150,7 +150,7 @@ sai_status_t sai_create_{{ table.name }}( {% for action in table.actions %} case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { actionId = {{action.id}}; - expectedParams = {{ action.params|length }}; + //expectedParams = {{ action.params|length }}; break; } {% endfor %} @@ -165,31 +165,34 @@ sai_status_t sai_create_{{ table.name }}( for (uint32_t i = 0; i < attr_count; i++) { switch(attr_list[i].id) { {% for param in table.actionParams %} + {% if param.skipattr == 'true' %} + {% else %} case SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}: { auto param = action->add_params(); param->set_param_id({{param.id}}); {{param.field}}SetVal(attr_list[i].value, param, {{param.bitwidth}}); - matchedParams++; + //matchedParams++; {% if 'v4_or_v6_id' in param %} { // set v4_or_v6 field auto param = action->add_params(); param->set_param_id({{param.v4_or_v6_id}}); booldataSetVal((attr_list[i].value.ipaddr.addr_family == SAI_IP_ADDR_FAMILY_IPV4) ? 0 : 1, param, 1); - matchedParams++; + //matchedParams++; } {% endif %} break; } + {% endif %} {% endfor %} } } - assert((matchedParams == expectedParams)); + //assert((matchedParams == expectedParams)); - if (matchedParams != expectedParams) { - goto ErrRet; - } + //if (matchedParams != expectedParams) { + // goto ErrRet; + //} if (false == InsertInTable(matchActionEntry, &objId)) { goto ErrRet; } @@ -284,8 +287,8 @@ sai_status_t sai_create_{{ table.name }}( // There shall be one and only one action_type auto entry = matchActionEntry->mutable_action(); auto action = entry->mutable_action(); - auto expectedParams = 0; - auto matchedParams = 0; + //auto expectedParams = 0; + //auto matchedParams = 0; pi_p4_id_t actionId; grpc::StatusCode retCode; @@ -327,7 +330,7 @@ sai_status_t sai_create_{{ table.name }}( {% if table.actions|length == 1 %} {% for action in table.actions %} actionId = {{action.id}}; // SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }} - expectedParams = {{ action.params|length }}; + //expectedParams = {{ action.params|length }}; {% endfor %} {% else %} // Search the action @@ -336,7 +339,7 @@ sai_status_t sai_create_{{ table.name }}( {% for action in table.actions %} case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { actionId = {{action.id}}; - expectedParams = {{ action.params|length }}; + //expectedParams = {{ action.params|length }}; break; } {% endfor %} @@ -350,31 +353,34 @@ sai_status_t sai_create_{{ table.name }}( for (uint32_t i = 0; i < attr_count; i++) { switch(attr_list[i].id) { {% for param in table.actionParams %} + {% if param.skipattr == 'true' %} + {% else %} case SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}: { auto param = action->add_params(); param->set_param_id({{param.id}}); {{param.field}}SetVal(attr_list[i].value, param, {{param.bitwidth}}); - matchedParams++; + //matchedParams++; {% if 'v4_or_v6_id' in param %} { // set v4_or_v6 field auto param = action->add_params(); param->set_param_id({{param.v4_or_v6_id}}); booldataSetVal((attr_list[i].value.ipaddr.addr_family == SAI_IP_ADDR_FAMILY_IPV4) ? 0 : 1, param, 1); - matchedParams++; + //matchedParams++; } {% endif %} break; } + {% endif %} {% endfor %} } } - assert((matchedParams == expectedParams)); + //assert((matchedParams == expectedParams)); - if (matchedParams != expectedParams) { - goto ErrRet; - } + //if (matchedParams != expectedParams) { + // goto ErrRet; + //} // TODO: ternaly needs to set priority retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK == retCode) { diff --git a/dash-pipeline/SAI/templates/saiapi.h.j2 b/dash-pipeline/SAI/templates/saiapi.h.j2 index 71e4adf7c..545c75cd1 100644 --- a/dash-pipeline/SAI/templates/saiapi.h.j2 +++ b/dash-pipeline/SAI/templates/saiapi.h.j2 @@ -118,6 +118,7 @@ typedef enum _sai_{{ table.name }}_attr_t {% if table.is_object == 'true' %} {% if table['keys'] | length > 1 %} {% for key in table['keys'] %} +{% if key.isattribute != 'false' %} /** * @brief {{ key.match_type | capitalize | replace('Lpm', 'LPM') }} matched key {{ key.sai_key_name }} * @@ -149,16 +150,23 @@ typedef enum _sai_{{ table.name }}_attr_t */ SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}_MASK, +{% endif %} {% endif %} {% endfor %} {% endif %} {% endif %} {% for param in table.actionParams %} +{% if param.skipattr == 'true' %} +{% else %} /** * @brief Action {% for action in param.paramActions %}{{ action }}{{ ", " if not loop.last else "" }}{% endfor %} parameter {{ param.name | upper }} * * @type {{ param.type }} +{% if param.isreadonly == 'true' %} + * @flags READ_ONLY +{% else %} * @flags CREATE_AND_SET +{% endif %} {% if param.type == 'sai_uint16_t' %} * @isvlan false {% endif %} @@ -177,8 +185,10 @@ typedef enum _sai_{{ table.name }}_attr_t {% elif param.field == 's32' %} * @default {{ param.default }} {% else %} +{% if param.isreadonly != 'true' %} * @default 0 {% endif %} +{% endif %} {% if table.actions | length > 1 %} {% if param.paramActions | length > 0 %} * @validonly {% for action in param.paramActions %}SAI_{{ table.name | upper }}_ATTR_ACTION == SAI_{{ table.name | upper }}_ACTION_{{ action | upper }}{{ " or " if not loop.last else "" }}{% endfor %} @@ -196,6 +206,7 @@ typedef enum _sai_{{ table.name }}_attr_t SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}, {% endif %} +{% endif %} {% endfor %} {% if table.with_counters == 'true' %} /** diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/templates/utils.h.j2 index 3cd47d08e..b18bd6c33 100644 --- a/dash-pipeline/SAI/templates/utils.h.j2 +++ b/dash-pipeline/SAI/templates/utils.h.j2 @@ -140,6 +140,27 @@ void ipaddrSetVal(const sai_ip_address_t &value, T &t, int bits = -1){ } } +template +void ipaddrSetMask(const sai_attribute_value_t &value, T &t, int bits = -1){ + ipaddrSetMask(value.ipaddr, t); +} + +template +void ipaddrSetMask(const sai_ip_address_t &value, T &t, int bits = -1){ + switch(value.addr_family) { + case SAI_IP_ADDR_FAMILY_IPV4: { + uint32_t mask = value.addr.ip4; + t->set_mask(&mask, 4); + } + break; + case SAI_IP_ADDR_FAMILY_IPV6: { + t->set_mask(const_cast(&value.addr.ip6[0]), 16); + } + break; + default: assert(0 && "unrecognzed value.ipaddr.addr_family"); + } +} + template void macSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ t->set_value(const_cast(&value.mac[0]), 6); diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index 444ed5153..9eb701290 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -62,6 +62,14 @@ struct metadata_t { bit<16> stage3_dash_acl_group_id; bit<16> stage4_dash_acl_group_id; bit<16> stage5_dash_acl_group_id; + bit<1> meter_policy_en; + bit<1> mapping_meter_class_override; + bit<16> meter_policy_id; + bit<16> policy_meter_class; + bit<16> route_meter_class; + bit<16> mapping_meter_class; + bit<16> meter_class; + bit<32> meter_bucket_index; tag_map_t src_tag_map; tag_map_t dst_tag_map; } diff --git a/dash-pipeline/bmv2/dash_outbound.p4 b/dash-pipeline/bmv2/dash_outbound.p4 index 05857c5ea..4609019cd 100644 --- a/dash-pipeline/bmv2/dash_outbound.p4 +++ b/dash-pipeline/bmv2/dash_outbound.p4 @@ -9,19 +9,32 @@ control outbound(inout headers_t hdr, inout metadata_t meta) { - action route_vnet(bit<16> dst_vnet_id) { + action set_route_meter_attrs(bit<1> meter_policy_en, + bit<16> meter_class) { + meta.meter_policy_en = meter_policy_en; + meta.route_meter_class = meter_class; + } + action route_vnet(bit<16> dst_vnet_id, + bit<1> meter_policy_en, + bit<16> meter_class) { meta.dst_vnet_id = dst_vnet_id; + set_route_meter_attrs(meter_policy_en, meter_class); } action route_vnet_direct(bit<16> dst_vnet_id, bit<1> is_overlay_ip_v4_or_v6, - IPv4ORv6Address overlay_ip) { + IPv4ORv6Address overlay_ip, + bit<1> meter_policy_en, + bit<16> meter_class) { meta.dst_vnet_id = dst_vnet_id; meta.lkup_dst_ip_addr = overlay_ip; meta.is_lkup_dst_ip_v6 = is_overlay_ip_v4_or_v6; + set_route_meter_attrs(meter_policy_en, meter_class); } - action route_direct() { + action route_direct(bit<1> meter_policy_en, + bit<16> meter_class) { + set_route_meter_attrs(meter_policy_en, meter_class); /* send to underlay router without any encap */ } @@ -42,7 +55,9 @@ control outbound(inout headers_t hdr, bit<1> is_underlay_sip_v4_or_v6, IPv4ORv6Address underlay_sip, dash_encapsulation_t dash_encapsulation, - bit<24> tunnel_key) { + bit<24> tunnel_key, + bit<1> meter_policy_en, + bit<16> meter_class) { /* Assume the overlay addresses provided are always IPv6 and the original are IPv4 */ /* assert(is_overlay_dip_v4_or_v6 == 1 && is_overlay_sip_v4_or_v6 == 1); assert(is_overlay_dip_mask_v4_or_v6 == 1 && is_overlay_sip_mask_v4_or_v6 == 1); @@ -62,6 +77,7 @@ control outbound(inout headers_t hdr, meta.encap_data.overlay_dmac = hdr.ethernet.dst_addr; meta.encap_data.dash_encapsulation = dash_encapsulation; meta.encap_data.service_tunnel_key = tunnel_key; + set_route_meter_attrs(meter_policy_en, meter_class); } #ifdef TARGET_BMV2_V1MODEL @@ -102,13 +118,18 @@ control outbound(inout headers_t hdr, #endif // TARGET_DPDK_PNA } + action set_tunnel_mapping(IPv4Address underlay_dip, EthernetAddress overlay_dmac, - bit<1> use_dst_vnet_vni) { + bit<1> use_dst_vnet_vni, + bit<16> meter_class, + bit<1> meter_class_override) { if (use_dst_vnet_vni == 1) meta.vnet_id = meta.dst_vnet_id; meta.encap_data.overlay_dmac = overlay_dmac; meta.encap_data.underlay_dip = underlay_dip; + meta.mapping_meter_class = meter_class; + meta.mapping_meter_class_override = meter_class_override; } #ifdef TARGET_BMV2_V1MODEL diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index 24fa1052f..ea6575ada 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -113,6 +113,8 @@ control dash_ingress( @Sai[type="sai_uint32_t"] bit<24> vm_vni, bit<16> vnet_id, + bit<16> v4_meter_policy_id, + bit<16> v6_meter_policy_id, ACL_GROUPS_PARAM(inbound_v4), ACL_GROUPS_PARAM(inbound_v6), ACL_GROUPS_PARAM(outbound_v4), @@ -133,12 +135,14 @@ control dash_ingress( } else { ACL_GROUPS_COPY_TO_META(inbound_v6); } + meta.meter_policy_id = v6_meter_policy_id; } else { if (meta.direction == dash_direction_t.OUTBOUND) { ACL_GROUPS_COPY_TO_META(outbound_v4); } else { ACL_GROUPS_COPY_TO_META(inbound_v4); } + meta.meter_policy_id = v4_meter_policy_id; } } @@ -231,6 +235,76 @@ control dash_ingress( const default_action = deny; } + action check_ip_addr_family(@Sai[type="sai_ip_addr_family_t", isresourcetype="true"] bit<32> ip_addr_family) { + if (ip_addr_family == 0) /* SAI_IP_ADDR_FAMILY_IPV4 */ { + if (meta.is_overlay_ip_v6 == 1) { + meta.dropped = true; + } + } else { + if (meta.is_overlay_ip_v6 == 0) { + meta.dropped = true; + } + } + } + + @name("meter_policy|dash_meter") + @Sai[isobject="true"] + table meter_policy { + key = { + meta.meter_policy_id : exact @name("meta.meter_policy_id:meter_policy_id"); + } + actions = { + check_ip_addr_family; + } + } + + action set_policy_meter_class(bit<16> meter_class) { + meta.policy_meter_class = meter_class; + } + + @name("meter_rule|dash_meter") + @Sai[isobject="true"] + table meter_rule { + key = { + meta.meter_policy_id: exact @name("meta.meter_policy_id:meter_policy_id") @Sai[type="sai_object_id_t", isresourcetype="true", objects="METER_POLICY"]; + hdr.ipv4.dst_addr : ternary @name("hdr.ipv4.dst_addr:dip"); + } + + actions = { + set_policy_meter_class; + @defaultonly NoAction; + } + const default_action = NoAction(); + } + + // MAX_METER_BUCKET = MAX_ENI(64) * NUM_BUCKETS_PER_ENI(4096) + #define MAX_METER_BUCKETS 262144 +#ifdef TARGET_BMV2_V1MODEL + counter(MAX_METER_BUCKETS, CounterType.bytes) meter_bucket_inbound; + counter(MAX_METER_BUCKETS, CounterType.bytes) meter_bucket_outbound; +#endif // TARGET_BMV2_V1MODEL + action meter_bucket_action( + @Sai[type="sai_uint64_t", isreadonly="true"] bit<64> outbound_bytes_counter, + @Sai[type="sai_uint64_t", isreadonly="true"] bit<64> inbound_bytes_counter, + @Sai[type="sai_uint32_t", skipattr="true"] bit<32> meter_bucket_index) { + // read only counters for SAI api generation only + meta.meter_bucket_index = meter_bucket_index; + } + + @name("meter_bucket|dash_meter") + @Sai[isobject="true"] + table meter_bucket { + key = { + meta.eni_id: exact @name("meta.eni_id:eni_id"); + meta.meter_class: exact @name("meta.meter_class:meter_class"); + } + actions = { + meter_bucket_action; + @defaultonly NoAction; + } + const default_action = NoAction(); + } + action set_eni(bit<16> eni_id) { meta.eni_id = eni_id; } @@ -388,6 +462,33 @@ control dash_ingress( inbound.apply(hdr, meta); } + if (meta.meter_policy_en == 1) { + meter_policy.apply(); + meter_rule.apply(); + } + + { + if (meta.meter_policy_en == 1) { + meta.meter_class = meta.policy_meter_class; + } else { + meta.meter_class = meta.route_meter_class; + } + if ((meta.meter_class == 0) || (meta.mapping_meter_class_override == 1)) { + meta.meter_class = meta.mapping_meter_class; + } + } + + meter_bucket.apply(); + if (meta.direction == dash_direction_t.OUTBOUND) { +#ifdef TARGET_BMV2_V1MODEL + meter_bucket_outbound.count(meta.meter_bucket_index); +#endif + } else if (meta.direction == dash_direction_t.INBOUND) { +#ifdef TARGET_BMV2_V1MODEL + meter_bucket_inbound.count(meta.meter_bucket_index); +#endif + } + eni_meter.apply(); if (meta.dropped) { diff --git a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp index f450ab199..acbfcbab8 100644 --- a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp +++ b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp @@ -141,6 +141,14 @@ int main(int argc, char **argv) attr.value.u32 = vnet_id; attrs.push_back(attr); + attr.id = SAI_ENI_ATTR_V4_METER_POLICY_ID; + attr.value.oid = SAI_NULL_OBJECT_ID; + attrs.push_back(attr); + + attr.id = SAI_ENI_ATTR_V6_METER_POLICY_ID; + attr.value.oid = SAI_NULL_OBJECT_ID; + attrs.push_back(attr); + std::unordered_map acl_group_ids = { {SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID, in_acl_group_id}, {SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID, in_acl_group_id}, diff --git a/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py b/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py index fa2089dec..acb9cd20e 100644 --- a/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py +++ b/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py @@ -41,6 +41,8 @@ def test_sai_thrift_create_eni(saithrift_client): vm_underlay_dip=vm_underlay_dip, vm_vni=9, vnet_id=vnet, + v4_meter_policy_id = 0, + v6_meter_policy_id = 0, inbound_v4_stage1_dash_acl_group_id = in_acl_group_id, inbound_v4_stage2_dash_acl_group_id = in_acl_group_id, inbound_v4_stage3_dash_acl_group_id = in_acl_group_id, diff --git a/test/test-cases/functional/ptf/sai_dash_utils.py b/test/test-cases/functional/ptf/sai_dash_utils.py index a93f4025b..b9124ab50 100644 --- a/test/test-cases/functional/ptf/sai_dash_utils.py +++ b/test/test-cases/functional/ptf/sai_dash_utils.py @@ -143,6 +143,8 @@ def eni_create(self, **kwargs): "vm_underlay_dip": sai_ipaddress("0.0.0.0"), "vm_vni": 1, "vnet_id": 1, + "v4_meter_policy_id": 0, + "v6_meter_policy_id": 0, "inbound_v4_stage1_dash_acl_group_id": 0, "inbound_v4_stage2_dash_acl_group_id": 0, "inbound_v4_stage3_dash_acl_group_id": 0, @@ -289,7 +291,8 @@ def outbound_routing_vnet_direct_create(self, eni_id, lpm, dst_vnet_id, sai_thrift_create_outbound_routing_entry(self.client, outbound_routing_entry, dst_vnet_id=dst_vnet_id, action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT, - overlay_ip=sai_ipaddress(overlay_ip), counter_id=counter_id) + overlay_ip=sai_ipaddress(overlay_ip), counter_id=counter_id, + meter_policy_en=False, meter_class=0) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_routing_vnet_direct_remove, outbound_routing_entry) @@ -302,7 +305,8 @@ def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None): switch_id=self.switch_id, eni_id=eni_id, destination=sai_ipprefix(lpm)) sai_thrift_create_outbound_routing_entry(self.client, outbound_routing_entry, counter_id=counter_id, - action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT) + action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT, + meter_policy_en=False, meter_class=0) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_routing_vnet_direct_remove, outbound_routing_entry) @@ -317,7 +321,8 @@ def outbound_routing_vnet_create(self, eni_id, lpm, dst_vnet_id, counter_id=None sai_thrift_create_outbound_routing_entry(self.client, outbound_routing_entry, dst_vnet_id=dst_vnet_id, counter_id=counter_id, - action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET) + action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET, + meter_policy_en=False, meter_class=0) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_routing_vnet_direct_remove, outbound_routing_entry) @@ -336,7 +341,8 @@ def outbound_ca_to_pa_create(self, dst_vnet_id, dip, underlay_dip, sai_thrift_create_outbound_ca_to_pa_entry(self.client, ca_to_pa_entry, underlay_dip=sai_ipaddress(underlay_dip), use_dst_vnet_vni=use_dst_vnet_vni, - overlay_dmac=overlay_dmac) + overlay_dmac=overlay_dmac, + meter_class=0, meter_class_override=False) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_ca_to_pa_remove, ca_to_pa_entry) diff --git a/test/test-cases/functional/ptf/saidashacl.py b/test/test-cases/functional/ptf/saidashacl.py index 9249d6c51..8a5f3983c 100644 --- a/test/test-cases/functional/ptf/saidashacl.py +++ b/test/test-cases/functional/ptf/saidashacl.py @@ -208,6 +208,8 @@ def setUpSwitch(self): vm_underlay_dip=vm_underlay_dip, vm_vni=9, vnet_id=self.vnet, + v4_meter_policy_id=0, + v6_meter_policy_id=0, inbound_v4_stage1_dash_acl_group_id=self.in_v4_stage1_acl_group_id, inbound_v4_stage2_dash_acl_group_id=self.in_v4_stage2_acl_group_id, inbound_v4_stage3_dash_acl_group_id=self.in_v4_stage3_acl_group_id, @@ -223,7 +225,6 @@ def setUpSwitch(self): inbound_v6_stage3_dash_acl_group_id=self.in_v6_stage3_acl_group_id, inbound_v6_stage4_dash_acl_group_id=0, inbound_v6_stage5_dash_acl_group_id=0, - outbound_v6_stage1_dash_acl_group_id=self.out_v6_stage1_acl_group_id, outbound_v6_stage2_dash_acl_group_id=self.out_v6_stage2_acl_group_id, outbound_v6_stage3_dash_acl_group_id=self.out_v6_stage3_acl_group_id, @@ -247,7 +248,8 @@ def setUpSwitch(self): switch_id=self.switch_id, eni_id=self.eni, destination=ca_prefix) self.create_entry(sai_thrift_create_outbound_routing_entry, sai_thrift_remove_outbound_routing_entry, - self.ore, action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET, dst_vnet_id=self.vnet) + self.ore, action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET, dst_vnet_id=self.vnet, + meter_policy_en=False, meter_class=0) underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4=self.dst_pa_ip)) @@ -255,7 +257,8 @@ def setUpSwitch(self): switch_id=self.switch_id, dst_vnet_id=self.vnet, dip=dip) self.create_entry(sai_thrift_create_outbound_ca_to_pa_entry, sai_thrift_remove_outbound_ca_to_pa_entry, - self.ocpe, underlay_dip=underlay_dip, overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni=True) + self.ocpe, underlay_dip=underlay_dip, overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni=True, + meter_class=0, meter_class_override=False) def setupTest(self): self.tests.append(AclRuleTest(self, diff --git a/test/test-cases/functional/ptf/saidasheni.py b/test/test-cases/functional/ptf/saidasheni.py index 9c521b612..761c036ba 100644 --- a/test/test-cases/functional/ptf/saidasheni.py +++ b/test/test-cases/functional/ptf/saidasheni.py @@ -130,6 +130,8 @@ def createEniTest(self): vm_underlay_dip=self.vm_underlay_dip, vm_vni=self.vm_vni, vnet_id=self.vm_vnet, + v4_meter_policy_id=0, + v6_meter_policy_id=0, inbound_v4_stage1_dash_acl_group_id=self.in_acl_group_id, inbound_v4_stage2_dash_acl_group_id=self.in_acl_group_id, inbound_v4_stage3_dash_acl_group_id=self.in_acl_group_id, diff --git a/test/test-cases/functional/ptf/saidashvnet_sanity.py b/test/test-cases/functional/ptf/saidashvnet_sanity.py index 094e81f5c..0e5849a72 100644 --- a/test/test-cases/functional/ptf/saidashvnet_sanity.py +++ b/test/test-cases/functional/ptf/saidashvnet_sanity.py @@ -62,6 +62,8 @@ def configureVnet(self): vm_underlay_dip=vm_underlay_dip, vm_vni=9, vnet_id=self.vnet, + v4_meter_policy_id = 0, + v6_meter_policy_id = 0, # TODO: Enable ACL rule #inbound_v4_stage1_dash_acl_group_id = self.in_acl_group_id, #inbound_v4_stage2_dash_acl_group_id = self.in_acl_group_id, @@ -115,14 +117,16 @@ def configureVnet(self): self.ore = sai_thrift_outbound_routing_entry_t(switch_id=self.switch_id, eni_id=self.eni, destination=ca_prefix) status = sai_thrift_create_outbound_routing_entry(self.client, self.ore, action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET, - dst_vnet_id=self.vnet) + dst_vnet_id=self.vnet, + meter_policy_en=False, meter_class=0) assert(status == SAI_STATUS_SUCCESS) underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4=self.dst_pa_ip)) self.ocpe = sai_thrift_outbound_ca_to_pa_entry_t(switch_id=self.switch_id, dst_vnet_id=self.vnet, dip=dip) status = sai_thrift_create_outbound_ca_to_pa_entry(self.client, self.ocpe, underlay_dip = underlay_dip, - overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni = True) + overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni = True, + meter_class=0, meter_class_override=False) assert(status == SAI_STATUS_SUCCESS) print(f"\n{self.__class__.__name__} configureVnet OK") diff --git a/test/test-cases/functional/saic/config_bidir_setup_commands.py b/test/test-cases/functional/saic/config_bidir_setup_commands.py index e61db1a01..1457d85d4 100644 --- a/test/test-cases/functional/saic/config_bidir_setup_commands.py +++ b/test/test-cases/functional/saic/config_bidir_setup_commands.py @@ -117,7 +117,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, { @@ -151,7 +153,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, { @@ -185,7 +189,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, @@ -236,7 +242,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -250,7 +258,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -264,7 +274,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -336,7 +348,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", NETWORK_VTEP_IP, "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", INNER_DST_MAC, - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -351,7 +365,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", NETWORK_VTEP_IP, "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", INNER_DST_MAC2, - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -366,7 +382,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", ENI_VTEP_IP, "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", INNER_SRC_MAC, - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] } ] diff --git a/test/test-cases/functional/saic/config_inbound_setup_commands.py b/test/test-cases/functional/saic/config_inbound_setup_commands.py index 8862a16f2..8eb829d2d 100644 --- a/test/test-cases/functional/saic/config_inbound_setup_commands.py +++ b/test/test-cases/functional/saic/config_inbound_setup_commands.py @@ -148,6 +148,10 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, @@ -209,6 +213,10 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, diff --git a/test/test-cases/functional/saic/config_outbound_setup_commands.json b/test/test-cases/functional/saic/config_outbound_setup_commands.json index ddaf81518..a8d6ec526 100644 --- a/test/test-cases/functional/saic/config_outbound_setup_commands.json +++ b/test/test-cases/functional/saic/config_outbound_setup_commands.json @@ -91,7 +91,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, { @@ -125,7 +127,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, @@ -164,7 +168,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -178,7 +184,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, @@ -194,7 +202,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "221.0.2.101", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:1b:6e:00:00:01", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -209,7 +219,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "221.0.1.11", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:1A:C5:00:00:01", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] } ] diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py index e80491573..4732f4e5d 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py @@ -7,7 +7,6 @@ class TestSaiVnetEni: - def test_vnet_eni_create(self, dpu): commands = [ @@ -84,6 +83,10 @@ def test_vnet_eni_create(self, dpu): "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py index b0c21cf4d..42c09c0b1 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py @@ -90,6 +90,10 @@ def test_vnet_inbound_routing_entry_create_setup(self, dpu): "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py index d42a7b5a1..12d337324 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py @@ -89,6 +89,10 @@ def test_vnet_outbound_routing_entry_create(self, dpu): "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, @@ -109,7 +113,9 @@ def test_vnet_outbound_routing_entry_create(self, dpu): }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, ] @@ -146,7 +152,9 @@ def test_vnet_outbound_routing_entry_set(self, dpu): }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, ] diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py index 37367a49f..9439d01b6 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_pa_entry.py @@ -10,7 +10,7 @@ class TestSaiVnetPaEntry: - + def test_vnet_pa_validation_entry_create(self, dpu): # Create VNET diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py index cd2154bbf..c97b4c45a 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_vni.py @@ -77,6 +77,7 @@ def test_vnet_vni_get2(self, dpu): print("\n======= SAI commands RETURN values get =======") pprint(results) + @pytest.mark.skip(reason="get and set not implemented, yet") def test_vnet_vni_remove(self, dpu): commands = [ diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py index a2eb8bc48..2f071c497 100755 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py @@ -45,6 +45,13 @@ NUMBER_OF_IN_ACL_GROUP = 0 NUMBER_OF_OUT_ACL_GROUP = 0 +def add_meter_attrs(attr_type, attrs, ext): + i = 0 + for item in attrs: + if item['type'] == attr_type: + attrs[i]['attributes'].extend(ext) + i += 1 + return attrs class TestSaiVnetOutbound: def make_create_commands(self): """ Generate a configuration @@ -52,7 +59,14 @@ def make_create_commands(self): """ conf = dpugen.sai.SaiConfig() conf.generate() - return conf.items() + ret = add_meter_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0"]) + + ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0', + 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE', 'True' ]) + + ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True', + 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS', '0' ]) + return ret def make_remove_commands(self): """ Generate a configuration to remove entries diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json index 80e4750e7..1c0ff3b13 100644 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json @@ -132,6 +132,10 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, @@ -193,6 +197,10 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, @@ -235,7 +243,11 @@ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", - "$vnet_#5000" + "$vnet_#5000", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", + "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", + "0" ] }, { @@ -251,7 +263,11 @@ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", - "$vnet_#6000" + "$vnet_#6000", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", + "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", + "0" ] }, { @@ -269,7 +285,11 @@ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:1B:6E:00:00:01", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", - "True" + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" ] }, { @@ -287,7 +307,11 @@ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:1B:6E:18:00:01", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", - "True" + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" ] } ] diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py index 49f390c49..8e84bd6e5 100755 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py @@ -97,7 +97,13 @@ } } - +def add_meter_attrs(attr_type, attrs, ext): + i = 0 + for item in attrs: + if item['type'] == attr_type: + attrs[i]['attributes'].extend(ext) + i += 1 + return attrs class TestSaiVnetOutbound: def make_create_vnet_config(self): """ Generate a configuration @@ -106,7 +112,14 @@ def make_create_vnet_config(self): conf = dpugen.sai.SaiConfig() conf.mergeParams(TEST_VNET_OUTBOUND_CONFIG_SCALE) conf.generate() - return conf.items() + ret = add_meter_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0"]) + + ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0', + 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE', 'True' ]) + + ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True', + 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS', '0' ]) + return ret def make_remove_vnet_config(self): """ Generate a configuration to remove entries diff --git a/test/test-cases/scale/saic/vnet_inbound_setup_commands.json b/test/test-cases/scale/saic/vnet_inbound_setup_commands.json index e43e09c09..20113fdd3 100644 --- a/test/test-cases/scale/saic/vnet_inbound_setup_commands.json +++ b/test/test-cases/scale/saic/vnet_inbound_setup_commands.json @@ -110,6 +110,10 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, diff --git a/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json b/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json index 564e8798a..db575f3ce 100644 --- a/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json +++ b/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json @@ -126,7 +126,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, { @@ -160,7 +162,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, { @@ -198,7 +202,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#0" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#0", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -212,7 +218,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#1" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#1", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -226,7 +234,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#2" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#2", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -240,7 +250,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#3" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet_#3", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -255,7 +267,10 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.1.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:00", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -270,7 +285,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.2.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:01", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -285,7 +302,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.3.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:02", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -300,7 +319,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.4.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:03", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -315,7 +336,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.5.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:04", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -330,7 +353,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.6.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:05", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -345,7 +370,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.7.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:06", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] }, { @@ -360,7 +387,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.8.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:07", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] } ] diff --git a/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json b/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json index 087132275..133adf5ae 100644 --- a/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json +++ b/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json @@ -78,7 +78,9 @@ "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", "0", - "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0" + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0" ] }, { @@ -104,7 +106,9 @@ }, "attributes": [ "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", - "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet" + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", "0" ] }, { @@ -119,7 +123,9 @@ "attributes": [ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.1.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:00:00", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True" + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] } ] From 04f859cf93fd6fa6e4a89f9ebec40e52f0bc4b75 Mon Sep 17 00:00:00 2001 From: KrisNey-MSFT Date: Wed, 21 Jun 2023 14:24:24 -0700 Subject: [PATCH 32/75] Update Pipeline README.md (#392) Update to include Draft gap analysis for interested volunteers to participate. --- dash-pipeline/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dash-pipeline/README.md b/dash-pipeline/README.md index 8840379d1..a28f5db8f 100644 --- a/dash-pipeline/README.md +++ b/dash-pipeline/README.md @@ -36,6 +36,7 @@ This is a P4 model of the DASH overlay pipeline which uses the [bmv2](https://gi * P4 code doesn't loop packets back to same port. * P4 code mark-to-drop not set when meta.drop is set. * Permission and ownership issues in Docker images, permanent fix is needed. +* Link to article describing gaps in BMv2 and P4-DPDK; targets that they are missing in order to be a good DASH P4 reference model: [Draft Gap Analysis](https://github.com/jafingerhut/p4-guide/tree/master/dash) # TODOs ## Loose Ends Small items to complete given the existing features and state, e.g. excluding major roadmap items. From 64cbb0ae83f65b14469f8554ace942ca18c3a8d1 Mon Sep 17 00:00:00 2001 From: Chris Sommers <31145757+chrispsommers@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:15:25 -0700 Subject: [PATCH 33/75] Add Keysight DASH slidedeck from SmartNIC Summit 2023 (#394) --- ...C Summit 2023 - DASH-workshop-Keysight.pdf | Bin 0 -> 3290918 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 slides/SMART NIC Summit 2023 - DASH-workshop-Keysight.pdf diff --git a/slides/SMART NIC Summit 2023 - DASH-workshop-Keysight.pdf b/slides/SMART NIC Summit 2023 - DASH-workshop-Keysight.pdf new file mode 100644 index 0000000000000000000000000000000000000000..46bdc0aa438fce4e5d86c77bbbbb42a129a15403 GIT binary patch literal 3290918 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

%=J|+RLa#uY-xU*Cowx543kM8=0 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[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

IV>*9Wa1F);5q(+Dw&Cl-gHViW+7 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

wqQV6!e7j;AfJCQE_g3a)BoF6!aSdoCO(Vk7@ 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 z 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

BXNM#`(KVCLzVd^C;iyoFkHuI%be3b6va99x8%` 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%0A-$QNnitlGLaDwcyK*H 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%0Dd|&<4MzNY64_SBOCpuvAp@Zd3V-y01<+ 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%0Apl z4&T5}Kk-9V9nzO(REnp7&HzSOTb zH*I2n((-Oa&l|tzsWSYyXYuZI{(kuA@U;;#-HcwP#&-9ppYO~PlboKg3=W3gz-9ss z$(9cdyx>@kX_sw!_3efQQ(iz7SazcnfY_x^ce`tU`uKmtE#mF&g|=OVax>lJJv%z$ z9zmw%3lh@BF3G|>U_jvY7z{ALpPQL;OQuNqu)3nz8XAy1Ee`%P(HtiU%^dv*Ktyv7 z$azhJ-WC4BPFe*KF7JggvZEi?>yRUDs_IaL@{9 zV`F0?4T_Z0LFf{=hQH#`NVj8Wy%1(A#VkQy;9(xleW6RQ>0Z38&RBFcxT2i(Vv9w6 z-}8piW||=vtgYi$4bQV%_c@(umUFmW6H73t(LKM>JK*NzjiQ{2Jll_K^ZEC~wO#m} z-Qb+;r!2j+DTtofgr8%LcbbE5nk+k2nWBBE$>q?J-=5x*=KP)BZj;NP+6N=~4|h4) z%>XAeRevFEZvMwgxBR2GLTqD-UE^TWH@Y%U*3FggLv2HKwB4!o{mc|V5G!Xo9j-BbH;c z$RM>|`y=)(e-SWaNx|Q2yL+?P#bEIHUS==Sk3i7xrJUpg*$zhm_k_=*SaTNqbM*>n zoM#zQy9drBjj27;Z9Qq~@$0G8^egrrI{s49$!3_h&U48*#BkP4+VgnSm;B^-0E;h? z>osj9z5Fq`S*6yJn&z2BCm_`3|DBYvybm9Xg=*=!zR4}l^ZxnTb&L1u81^sD#lR!d z`?tix6X%4NT+YCl?WV6o94GXacb60{W)&iT#&@}eYk6eVcQHcKwCfz5H}O##s9mV%sT(zg`C8*nl4eu@!d{35X*57N<0^$!=zOHsKr zspJ0ONbeA^%*D^?Su&*G=-=r5$obmj8_>Atw_ULwR&$Y(@+cWuB8{?^Nc~3aXQu4E ztApI65AELjyItzC$u6>-s$U(cP;I$_*yOfAbSyn*xZ1~~+*Vk*r?(&(sP1}ZG4)+v z!eL=*AfWiMPRq%7*J;}kzV4CL=nCrMci|+y-KTbj$47AXHgx7+uVE$Q`bf*hLk|rb z%1)t3EryUCy=8KdB&jyC94$-~%z&f#zNX|T0lU3QfHNg?mQ0yR>h+V;?}1wgT~p3n z;ef+HSye3+D_O6kgxbqZjzkFNvlcI1G&xzvk}DGpVp(e$p6v z*~Cb|G8!wHLWClEy|~M7aupz>IpH_(%D686hK#+v{XNfy3=$t zT@)qqh2XR~OD-q$WZcOK9FmE|EHARlljHEY#6s+IX=$?o96$F`M=eNy>@vZ!O?Ru!YPm4L{4=By0d#?j#GG2j1dI>yeb!>@CeWd6ZD z>$&&j?vV6w6h#gpEzqUX>_= z$AC#IC{?PNrV3``*zW_z)P(WhHr+TYJG=z*`rJFacf-tJkjM3Fev#7uDm=o3ocZe` z!f5WGLzJ4CBT_MJaFNUfg~D0iCw&DhFNYvs4j-#|d5Z2&411-3U}l}R!&dR=EDqlR ztGAlp1mx`b_KEpSaRt;#jbi=PrZ zt#*&X3D3B#;_1^*jmc~ZmrhFoW5(Jjv<&ycXLh}Q9NVl%G9^zo5y4ejxXYerj3vJlxcPwrnm_n)56{6njbX}v%IvPzih%1Uxbu@O@v+jCN)I|GGRa-%|w0L$`J9mlI+-4`m<&}rSl@{~k zd&5ibJV#;YwS4OSCDHOMt^FCm8u%HPzwrI0)ldbgS`h+@kr5n=LE+ydY=bS_TQ^KA z?GJ232w^@cCz$?_X_xUG@QSYSTWR zC6^XL^9Vd|GQL1NoH@mYsS~b>A5eqZ5{LXm} zZij6fqrQ*@nf9^$5h$DlTsZ^NMSN?ul zJa4HuzdS+*-wV|ITJO7u=~K6jYo%tJho7FfTmYKsyV9LOL6!BeFA^Er`L0#Po(ekI ze@%I{58A`o55fX7XL$5jc!I#rO*}1&4pM`|SLtf=p#t2P<*@C1^fw}RTd(=Jjxn|fkj?qy z`R`%{+F##*QDxAdlM~jY3AeUG5LOQ_&0)@rl61cl39q1zLaU9388#r>%DW+!PzGp9;GToZbf(V9tX243Cfi zScTWm&tb5`e^YkszWM7v9f#oZr4V|O1XA*AkaM8@jak+q=IAGcdS5{8TCtjq#5*Uf zrlKknqgl@fac%K5_C&3TjZtD=jd@0$9;q|r2TVf3l`gag%#WktFklntXtw{rRdB?R z6QVSAUeFacjb163ZCge;J8W|&2Vc3~;@70;dlypYXrU}P7GJ#s;nEDDXt)Sozn8$B z%$8u3^M~HUtpJZYZs@FIakaIvLouzc0~2&e8)S`&rpPH@0ZP0TBFEkB?2ZthRK$|y zst}wtLaWJ=mdl>XZiaCVkKk#reG~HAhRoLlRT(9fQNCYM&^!VO85Y&nG95&9W5yKL?M^sf0OuM=kyW1-FipdCi zq>7v(FG&2wSsNI#Jo1cz04bx9N!gJx2WgrdypHdbw-f+qG6Y8Sa=zj`R+;C&y;`S8 zSkI3$i<#?T8e7F8y`);DHXjLrZY|2T+<=80GfFyXu1*(!mu=oA*>Cqi!V|HFKkm<0;N6K~w&zZt=>3!5nM!lv44@ z=+{zT%2Qm~#T%W6$!NRCcqj2qr}7hPGgoGOgE8T4(b&E_ljAoRQ)BgFiABQIE|0uH zs029g;t5+r^#~Cx${}iC(Xr@44<0$_N5sC|91lv+peQoola+eQZKS4wLfHA;|8dPFsq3N30u@H?#$pDE|mUGTJt;S(2jz*=TtBf<}J<)57bKF zpFHiy@PXf=c}7F|j}E(a9FloO-3pBEdqIoa0)|%B;l*jA_~z@?t)>X2J13;h;tJ3Q zB6Qf~CAJfUh1C3z?DzjuXZ`|J!hqqNy8dypju#(oXs}^QYot`G0*y>|G+{$Nnh?6ViHH4JhA{E4lVVyBR=Y6bv|8W_VKLeIK>+YOnK zzGcbh5m)AvnOgRxcgqbggJ%T+`i1SWdcItfRfEJ+kyMi86(vL^+dGb1eM{({o@B98 z#y`%280mF5=<~O0clqb+69&J{WJfn$)QsA@CgYoLMW}P%^FdEdAaKZ5@Y~XfHLeBuaea*)Zmk-=hxKK~*hou=r*Yg>< zLZg2c$*J`2BqgV>1uWI{=8>%XXPmlNtN`n!Plrq6NYzJ6vEhiw>RE71pU~HTo)`t4 zfO8W-Ok5zLq?u9xZq%L-Yko5#iQogb`X*|rE!F#v?{FLYX~q=b0UXT;jk6srj%17< zuf_4tJv-U9C9d}!JH7kT7jFdKJc>O0QpXF{b)8HGFRhCeb~Ft)wuXvh0jJ^T6x0$n z+~03^oiqa=2|7>%IJHu)`N*^ZY1*RZ5oHf0>g)->WzH#hR6I+IWOLWh6h>l+t82-W zuFcp>K3DvX$lUhwHtTn$`|92YgN|>12aRqV1a^Ai1h(n5eFCsgT^TDmkF6s=G^DLw zJEa}fN(os70^)h5mmymM35y#3uP{)I4#h8VU(0Szf-$PMnak)(v9Z0`eAfleXe!Y9ZRlG>VQ zoZ<{5@M@Y<3p$fg<9wVyN7dt2wj?k5ePk6<@){-De4_;R-1&GJ%7~g+@;p(QW%7s*KpOxIS}RDvP3Qn z?DXN3anw$U&*#a`7{%Z(6u@(I?&a6lx(KPMlC@8J@^aLA-u0Ho4o?ac(RIVx9;^L( z%Wmg~b)j%HzY0GW&F&fm!8pZjP80Vycf~&>klb%NO=WAbCDj2-%gZaHU$COavYo{vTX%^ z@u$rPb}QbzB%GE2`Rn!N-i{}%C6CE*C15d+BD_G!X(hxF_ug;PW7SuX%j%!$rIoRj zu?Sdx1Etq5Jo_oH)VmpJ4D4sC`?P?x1QrgIgHQ;gUbGF2j05=@hIz!8}J(a6IRKTc_Qwyjq7czw^vBUu{}813)%i276aDnZ;VX54_ttBHU4N#hP7*Io z-uJI#kD3W!d1tOO6IV5vnL-eL8tE%tUq?pU#BOU8bAC6-}J1_6x)TP3hcZgq6H~89kqah z;($D>tz}$mzwQ2o#pRaAOsbkvBrt=}bLHipluOWOMqk*dgDm}!f1u<(DO4-Q% z1zviw3PmI;awc8sFDBjzPWXU1QYr4}E(EIm+j65oST4suKSi5q*x2>d>TBmJGo3Qe zSANy9so`+brx{J-flU^g0bIZ6Gsz{8q?FiP(KmbB39xBM{e6o^SoBqYdFJIefdmdd z0u%PjgN|XjXlLJPJzy7to|rk9s_D|OVx(ReR>B7#L&&qx z1xA$QzP$2Cc|)QfR*t}nVT!-Rw=2UE@O?4% zj#C9OvTOScg+5{Y*T2gHQ)r*v(I-CBZ`bpN_)H*XE&QX>Jf+a0VfNquO+^?vpi5VG zn+|N_`t;NYHLN$PofpagpI}cU*(`)SiKbD%zP#&oMw(H{mx!>ze~YmGB=GY>An2Hh zHs6Ni8+!sewf+$0Ao(SQu(EGo#3kZ_KQgz}-Y?+^B5|WauF?Q$|p!2P$Z;2twi%k3i%M$qy9b9$^ z-?_;cuU{?#VR#E%DM{3`yC*L%riiLuNnM8Dv1j|M>1>&_>WU~_d;+#Vp}`?SA0<8- zjz!BZG0!*Vb<4S6I9M;V|KvVz+)Gm_si7J4Ubtn`+us; zpKJTwyHEet6?ApIq>ZysLkq}ZJ{wh~JY1HUq)qh9>*0a<+Mbx}D2gVqy&az?rB=gizae$Z~!E6_p|E?sI zlR|%O0wXkpI9?nB(5)o&lj9HNCX8A_tHC=u$VW0vwN%jHfujGlVGoGc^#qsK)yBc$ z(*8xK2g@l0Fvh|7wYYk4e6h0+)TPyP!mZyu%kA}L>oYL@wCPurs|4tJ^wQMJ>*)ia z)1dP*o8~v+XJGrl3Otsc-G65fLWQnb6pAE8k;lv=#!(;3&CfG^Otinsr5K0ILdjVT z@FgoH#nX$ZbJu>qcc7%BIMyzQ=Zsc}m&fw_eSG-~*X z?X=e|_(%A@9i80`y8!ONG@d7}&w;U-nscotj}fD-t{~vDX!%^|znDDrqT|FTmy7W} zpwf{bb@c9D>4|yca^U!Q=u?mF|GI1?zd>xRHy0NV(Aj50p@SoR)*r#2ZQj(%=$kL1 zlEO}pUl!p;!Mt>cl@q>3-erg7P1*7u-W@;Rm-**^I~MJa?h|kBfDnp+w9p|0NC^B6w#R$F?>m3+L4U$g0B6teoH zvAv67WyX~4Tr}xilZrgsceDML?j6u^R$Zn9E>KGdyH)3xL$_$NpfClNq|UpVrlo_u z(0nK4TvcG2A&=7PJ$rtmeP$Oc`R|=?TaDgpUyksXnp)o8G&-rrM7KJ7g(#c+CuiH+mibqSi>ae7xrv@wWX~l}iZ_u^ks`8yieIM(&%$8v0 z?+<^DBz`GBs`ruhh?o<3AlYzjizzq>C#o18wAZ+KBM zA>~CgQ1sp43B#4X)^NJPFsv1zKMhW>NR4HjYQ9+(URJkql9YvUd>JzY``|saHoWOc zNv(4C-Qh!*?j=sK0l6&y*299*lS|l#A6gWw@0}DSXCm5YzF}z)O*FNpuWx+TEg|!i zXQVwOb8$+{|C09>p2q*079oxg7G5h=F{^5>cF1s2m18zt%h_dv?GZ&BScvwYw-+lM zh14NO0-gG1Nl1rXc$ZzcL|^IQgMr?TE)8@yb)a}8H*77|k<;W;0=@cKB|! z{W=?XeMJA0HZxc`z|ByTFPLuRb5V%GrL-Paa`rH{Yi%?a1WN}mDTEK)h&O7e{N z^+c-(iI08KwK)vgl>@FRMXvJO(Klu@GU9|vEHWY^Hci#qcP?3xSq^^H8<%i3a4kDC zE}Y`{a+PIJHux6tlA=K90G`>+|5##Wu)pZew=@Wy-_E>R_-))#-ALG~agDVd)+5FaPzN>WGM-x~rWZ9jdU%cAXjdAbaP#q2Y;Z5j~+T z?c9DjVX+Sio9vTEcWG2MJl<6L1m-b>2w(AQn_Ix0*K(yZ0hW?57zd};M=xUoraNGy zCCDl>l%?M|02H)aU%ml5MS!hv=t+u;4D3qlY|iYlQidk)x_~l}M_Cr;Upu0+OEv!t z{KjP3(4v>QfMU_sFW8__CB{ti=A*XkPj{7c6)B&YD>EveJI>yAPNm59&h*B~6ZQi$ zWu%uM>A zM0ql&*M{Sh>zQIb-Bsuum_CslyBv3k*4{E&10|yBZpTIFWjj&E z9ARF5Df@yf4{2dp)@|Kovbmvyi9T;jMNHhlty$0bj;!V^N1@>rz4bK~wmVhU=ekAQ zak%1L&G}Q15B)xdP83rw&7{DEZDir@MCd<1HqWTT2-S+f4Q0}01#6E`@LGeCn*aIg zk<|a2ZJud@tA1v4VA1gje$_3i9)J58RuoPb7A?IS5poq=XmMYYZXkVPUgc5TXIu@Q zjGhW9$az;%s^?q&*oEEx_s3lIZ?Jy@&y($L=A2)jHEUM$0}`pT^ZI<3Nhb2EsEww1 zgelfdA#MH}_=8jb^5!L-)Dw-@Tdf`+o4VeAhljJ#Vtw|Q?0FTmfJ#1PmW#4o>C4n) zDh=TsteQzJqptJ8R%vlgL~R9Cx0hnn+CN*+$Fm1*O?d*j^;*JTa}kU+E&^+Fi2^%> zbB_3SO!WX3!_pBi!pVDE(#M1FTxsoVdmEtjX@X8!7#sNPZ_*TxCW_GvberU?RJzx| zo^|^uav%i}LElb=m&xBsWb~UWR#rb+I13181*)Z9hC!fw?nwo3?aX|<_!oG&7_WoF zP`-hmSMGkulh$3T9DhEIFeS$6j@6KRb~g_=9p;(||9pTDI56O6VyFDjG3CIuCHkJ< zz~8l>?L}R@{A0h>o;KO83m>p`Z$GdBzKr>~$ijkjiz7rR*(s{qaz5pv$TyXL7?y#8 zlSz8F(hGY$)8yCOFekTYfM4%-7=#N7raw(p^tL6OBDuA2PK4>otQfzXkqn!8q z@NSl)6ZihAs*1Ym`zxxK=F~#F;xDm4Si1~7YoGW|RV{p&i^}Aksw#(C^E!0jGJ1at zawDSW;_RV`@n-pM=M~!~4q6pDup`W9g!Y3g=i(DzTVfrzB$N_IW~hJn84FLCo2a51 zc^(fRPiJ)({q_(!(oa~L%V7J65CZ9lC1p%`3al$K7RaIM&^Y! zS7>-RT!Hm*kv=OGd0<0jW#!1oNNjBE!oos!c6MuPD~Y%xuYQ%05$QCEg!u1Su1(bW z;+N5NzB?6@{^C)XZSos)OcW4C*8(9y!Shc!RseDCGrSvs+X!vQ-1~a!=6QDwwx4Nk zz1n^d9&-K?2XKMj$yYeC2ty!QJDQz}ed4dI^!auCI$Qq@88AEYt2^r3O^5z*RCs?a~kD}Gt?}xe2vs`V7iPzIx zrmgDVi|og~RXX%rY^OmOtaKV2!o`J=cdM|6b50Yk)|M-Xq-^AB(Fz>lvoWoMqRIDL zln+0cwazO{t6i(NbYev8w`{pGp71IfmxMk^ z0@Y`J;DgTT8PP~(W8+t%z+o>=wZN6rj+Hl!WQQ*fn|O|w4V(IQ2@M-Vw^4c~?mD`< zL$PqPew}rdg%83B>W6_2ZoJ7+iFY3O>Rf1RO)4Ej_cog_6d)2J;ocq}{5xvJqR)i2 zpy0@d^Vk=)8jU!HdEBKqZ&xlm^L>U($Wsn|j!iX)+pv&oP_l=IuK!|T_}z8CR=Gmt z*wfb+Wi&Yy2jEKj4_?h$+!I>_KAEJY6zOp=@=Oi$1ty_g`%PH~H0(I})Wh5L-ng%q5&PSzSruyjAF<^erm?j%2!W;WiRzVa zP4%$7+J1PCFK+gnQX&m6CaLJjk{aBhI^C@!n_35c=uf1EjXXu0cPC5Z;UUtsE(f`K zu+mbW!OcW1h~Ktk9YP{S(>^D*!JIIr{%1e6wO#0gS2UQ(bQ1qx7 zyF6r+be8qy#eSWs??u5uku4|EZyfnxQ$EPm)iv_TdkYu9)jZW9K8chHC^+#=kiGo- z`lbOwc$n@);kfl^fVf&|^)P+|uIHQK%KapmwKc$v|rz~fpZ z|J+cLjk`z^O_p`0+_>|DgL3x)bKu;aFU7St??7s4_u`Elz(L!VUuv1RzMO}pcl%?8 zsasL-DYc4+#Von}*4+u-pbs2s5Hb=r*gRm=){NRoeS>giO%Y{=CGcNKR@)#pHh?yD zaw!Fuz+EP}1kF0j1!S20x!5eh9U5en^hd?Atu`#7pA@XQwK|oxQ&(5Lx)SZaRw&V1 z*#O0MOV>Qi_uC5swk;Xxcz&62XVD!FH7=QNkgjz**i4i*U94T$K}jFZ6mlmWEX}Hs zRwCSq52J=nN;gq=@^YE-M-K<-g0R=6#OSrhXMu~o#HjxfJpJOpY>WJH!1LZmuO1#B z*CgA&>GvfiS0v#5sRjc7LUVikoDAC;_ndU?k&NU} zOX9a|uiKgMO>QRbOhVMv)%Ep7-LZpb7`?s$fU~mZzf*ID$qX7s@(@k%| zN=h-e4T`$G_ z&S{7f^L#Q~QCK;08CrGuKV^2XU6)F0*|@ zc?hEpV@@gO#S_>q)Jc7K=)g-%3qPuI3^w_idHk$Q476L!c$!gsB`YQj$ zr*NMq{cw-^6XZ8vy6KD{l_j1)exVl|VHECI;oJ2=h+Ijz5SsHi|4z5C(d*Z`uj_Sl z249_4^y{!y0U%9)46pKiK2~SKC4+ml3^YR}3t@i_2Gt23oGiV;>+S;pemx9Eg)~{% zTkNDPJhRks(Y)Q5$7!`-2sYI}w<_egmQ$-zv;F$x=nRh&)Ok;5N}PWQtcFT29jVZ( zEpvUC3vr%c9%otrxC2THM=sGyTkY{2(OAj=N^wf7=qH4|X_`X6C&RlJoW@K@2qJ{!sX9Bst*c{#^aIcJORIQQ z0=hF3BpJtr|L{>O`_ts#*-ARWwy9@PFvk&fV5CS;j_c_#rgoO6? z51u`u6M~|ztnax^<|az$jw1!Dz^KoJ_-)JHi_z~ncxVazc)c6ZN*S6pxvD(qyKO~y zkuY}$l(*WTqNpmlPuP|~ZfRk%O;+Fq zgxdAtm*<^s3Db4xlBr=z&I{(OYK~72uHLy;06ICkXagPPw2&sxom`EbyE7^2?=pO* zC1yFhzG`=INvZsMRK45b))_FR|Ne+{eCFMqaHwC0d$<%_$M~t*?CLB`+;B?DU~lcS z>sn&I*H-H*=o;!^D-Fi5Luy$P&yl>2k|%p%xBn#tB5stQc`HB)mXgD{uoGBj!Ix46 zhNT47oZoHK+ZQ}<#n(pAY+ZVn1T^FpbPJ!+SgK%yZR7|qBZ{)&j*uSoT{O-2H`0TR z2$~$1g3)hj_%6H9wy&~3TF4AvjV&l|c+X6E%wH4-%vwy3Zb?& zhE3ZJliB`LdsAB`AI9y&`{51+rXHHc*c8xAB#?ImhRV&o;_lWkZ*IaYA9}6(ht%vK z^+&Ly@FX5jd(gx_ms;n^v&mULyN_o;@vo5yw1=!HN$OOB<~UM&lCE%cqB3`z!z50? zy1SO9JF*N)YY-}tAr~3SAr!Y;lnEjc96~x|Udci9F>*uvMh{$JQpqm-DF`PrK{d3+ z5d6zC(6!!lvl}V9CzQ1Aks2fK&$brLz?^Ur!08$SLypOW?;Vs5q@~Sa>5~OX;wb zr=SEyXW5N2P-KdLt(!!Uk-wStw2X-wqRPHcT86*QV3%Gl3exV~a4{pND>)s3B;N;

Kqx$c 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

a}hs< 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�!CG%; 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%0D;@v&SyzWSSk4+eU9u?%-V-;YCE+D^|>{ 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 $j(0muFSb4OQmjgBI=hi=?I+ckkMDWIur7H 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≶KFjo!m^c}6wt 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 z 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�~2FY=4o!)_VbsHGia&cW< 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%0DY4bXM;HQZZE=EAS)Geapf_8Qi) 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

@;^pj>i&;mivLwS? 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%0Arm7(ZiTkPpFs3O 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

~<+WEj|@?}hf)Uxe1@-hyuZ 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

8VhzcI_E9C=1Ay1qqGDvxW>G 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

_w3ZuC-Y4r))P_ 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 literal 0 HcmV?d00001 From 07464d00aec7640a9599d30164b85f72d5bb3ed6 Mon Sep 17 00:00:00 2001 From: vincent-xs <114104889+vincent-xs@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:49:01 -0400 Subject: [PATCH 34/75] cleanup in dash testcases (return proper objects, fix remove command (#393) generation in scale outbound) update saithrift docker file (-qq is not working on newer docker compose version) update p4 generation to handle ip prefix list (needed when we compile dash acl with DASH_MATCH to generate the proper SAI API) --- dash-pipeline/SAI/sai_api_gen.py | 3 ++- dash-pipeline/SAI/templates/saiapi.h.j2 | 2 ++ .../dockerfiles/Dockerfile.saithrift-bldr | 2 +- .../test-cases/functional/ptf/sai_dash_utils.py | 17 ++++++++++++++++- test/test-cases/functional/ptf/saidasheni.py | 16 ++++++++-------- test/test-cases/functional/ptf/saidashvnet.py | 12 ++++++------ .../scale/saic/test_sai_vnet_outbound_scale.py | 4 ++-- .../scale/saic/vnet_inbound_setup_commands.json | 2 +- .../vnet_outbound_setup_commands_scale.json | 1 - 9 files changed, 38 insertions(+), 21 deletions(-) diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index c8862eed6..5e8269a4b 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -44,7 +44,8 @@ 'sai_ip_addr_family_t': 'u32', 'sai_uint32_t': 'u32', 'sai_uint64_t': 'u64', - 'sai_mac_t': 'mac' + 'sai_mac_t': 'mac', + 'sai_ip_prefix_list_t': 'ipprefixlist' } def p4_annotation_to_sai_attr(p4rt, sai_attr): diff --git a/dash-pipeline/SAI/templates/saiapi.h.j2 b/dash-pipeline/SAI/templates/saiapi.h.j2 index 545c75cd1..adb49b369 100644 --- a/dash-pipeline/SAI/templates/saiapi.h.j2 +++ b/dash-pipeline/SAI/templates/saiapi.h.j2 @@ -184,6 +184,8 @@ typedef enum _sai_{{ table.name }}_attr_t * @default SAI_NULL_OBJECT_ID {% elif param.field == 's32' %} * @default {{ param.default }} +{% elif param.type == 'sai_ip_prefix_list_t' %} + * @default empty {% else %} {% if param.isreadonly != 'true' %} * @default 0 diff --git a/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr b/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr index 46b90b77f..874252b43 100644 --- a/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr +++ b/dash-pipeline/dockerfiles/Dockerfile.saithrift-bldr @@ -25,7 +25,7 @@ ENV SAI_PTF_DEPS sudo git python3 wget doxygen graphviz aspell-en \ ENV DASH_SAIGEN_DEPS python3 python3-pip -RUN apt-get update -qq && \ +RUN apt-get update -q && \ apt-get install -y --no-install-recommends $SAI_PTF_DEPS $DASH_SAIGEN_DEPS && \ pip3 install ctypesgen jinja2 diff --git a/test/test-cases/functional/ptf/sai_dash_utils.py b/test/test-cases/functional/ptf/sai_dash_utils.py index b9124ab50..1e702d8e9 100644 --- a/test/test-cases/functional/ptf/sai_dash_utils.py +++ b/test/test-cases/functional/ptf/sai_dash_utils.py @@ -196,6 +196,7 @@ def direction_lookup_create(self, vni): sai_thrift_create_direction_lookup_entry(self.client, direction_lookup_entry, action=act) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.direction_lookup_remove, direction_lookup_entry) + return direction_lookup_entry def direction_lookup_remove(self, direction_lookup_entry): sai_thrift_remove_direction_lookup_entry(self.client, direction_lookup_entry) @@ -209,6 +210,7 @@ def eni_mac_map_create(self, eni_id, mac): sai_thrift_create_eni_ether_address_map_entry(self.client, eni_ether_address_map_entry, eni_id=eni_id) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.eni_mac_map_remove, eni_ether_address_map_entry) + return eni_ether_address_map_entry def eni_mac_map_remove(self, eni_ether_address_map_entry): sai_thrift_remove_eni_ether_address_map_entry(self.client, eni_ether_address_map_entry) @@ -243,6 +245,7 @@ def inbound_routing_decap_validate_create(self, eni_id, vni, sip, sip_mask, src_ src_vnet_id=src_vnet_id) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.inbound_routing_remove, inbound_routing_entry) + return inbound_routing_entry def inbound_routing_decap_create(self, eni_id, vni, sip, sip_mask): """ @@ -258,6 +261,7 @@ def inbound_routing_decap_create(self, eni_id, vni, sip, sip_mask): action=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.inbound_routing_remove, inbound_routing_entry) + return inbound_routing_entry def inbound_routing_remove(self, inbound_routing_entry): sai_thrift_remove_inbound_routing_entry(self.client, inbound_routing_entry) @@ -276,6 +280,8 @@ def pa_validation_create(self, sip, vnet_id): self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.pa_validation_remove, pa_validation_entry) + return pa_validation_entry + def pa_validation_remove(self, pa_validation_entry): sai_thrift_remove_pa_validation_entry(self.client, pa_validation_entry) @@ -296,6 +302,8 @@ def outbound_routing_vnet_direct_create(self, eni_id, lpm, dst_vnet_id, self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_routing_vnet_direct_remove, outbound_routing_entry) + return outbound_routing_entry + def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None): """ Create outband vnet direct routing entry @@ -310,6 +318,8 @@ def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None): self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_routing_vnet_direct_remove, outbound_routing_entry) + return outbound_routing_entry + def outbound_routing_vnet_create(self, eni_id, lpm, dst_vnet_id, counter_id=None): """ Create outbound vnet routing entry @@ -346,6 +356,8 @@ def outbound_ca_to_pa_create(self, dst_vnet_id, dip, underlay_dip, self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.add_teardown_obj(self.outbound_ca_to_pa_remove, ca_to_pa_entry) + return ca_to_pa_entry + def outbound_ca_to_pa_remove(self, ca_to_pa_entry): sai_thrift_remove_outbound_ca_to_pa_entry(self.client, ca_to_pa_entry) @@ -871,7 +883,10 @@ def send_verify(pkt): if invalid_inner_dst_ip is not None: # Verify drop with invalid inner Dst IP vxlan_pkt_invalid_inner_dst_ip = deepcopy(vxlan_pkt) - vxlan_pkt_invalid_inner_dst_ip.getlayer('VXLAN').getlayer('IP').dst = invalid_inner_dst_ip + if vxlan_pkt_invalid_inner_dst_ip.getlayer('VXLAN').haslayer('IP'): + vxlan_pkt_invalid_inner_dst_ip.getlayer('VXLAN').getlayer('IP').dst = invalid_inner_dst_ip + else: + vxlan_pkt_invalid_inner_dst_ip.getlayer('VXLAN').getlayer('IPv6').dst = invalid_inner_dst_ip print("Sending VxLAN IPv4 packet with invalid Inner Dst MAC, expect drop") send_verify(vxlan_pkt_invalid_inner_dst_ip) diff --git a/test/test-cases/functional/ptf/saidasheni.py b/test/test-cases/functional/ptf/saidasheni.py index 761c036ba..6446f65e9 100644 --- a/test/test-cases/functional/ptf/saidasheni.py +++ b/test/test-cases/functional/ptf/saidasheni.py @@ -347,7 +347,7 @@ def eniGetAttributesTest(self): self.assertEqual(attr['pps'], self.pps) self.assertEqual(attr['flows'], self.flows) self.assertEqual(attr['admin_state'], self.admin_state) - self.assertEqual(attr['vm_underlay_dip'], self.vm_underlay_dip.addr.ip4) + self.assertEqual(attr['vm_underlay_dip'].addr.ip4, self.vm_underlay_dip.addr.ip4) self.assertEqual(attr['vm_vni'], self.vm_vni) self.assertEqual(attr['vnet_id'], self.vm_vnet) self.assertEqual(attr['inbound_v4_stage1_dash_acl_group_id'], self.in_acl_group_id) @@ -425,7 +425,7 @@ def eniSetAndGetAttributesTest(self): self.assertEqual(self.status(), SAI_STATUS_SUCCESS) attr = sai_thrift_get_eni_attribute(self.client, self.eni, vm_underlay_dip=True) - self.assertEqual(attr['vm_underlay_dip'], test_vm_underlay_dip.addr.ip) + self.assertEqual(attr['vm_underlay_dip'].addr.ip4, test_vm_underlay_dip.addr.ip4) # set and verify new vm_vni value sai_thrift_set_eni_attribute(self.client, self.eni, vm_vni=test_vm_vni) @@ -666,7 +666,7 @@ def eniSetAndGetAttributesTest(self): self.assertEqual(attr['pps'], self.pps) self.assertEqual(attr['flows'], self.flows) self.assertEqual(attr['admin_state'], self.admin_state) - self.assertEqual(attr['vm_underlay_dip'], self.vm_underlay_dip.addr.ip4) + self.assertEqual(attr['vm_underlay_dip'].addr.ip4, self.vm_underlay_dip.addr.ip4) self.assertEqual(attr['vm_vni'], self.vm_vni) self.assertEqual(attr['vnet_id'], self.vm_vnet) self.assertEqual(attr['inbound_v4_stage1_dash_acl_group_id'], self.in_acl_group_id) @@ -710,7 +710,7 @@ def eniEtherAddressMapAttributesTest(self): test_flows = 500 test_vm_underlay_ip = sai_ipaddress('172.0.15.15') - test_eni = self.eni(cps=test_cps, + test_eni = self.eni_create(cps=test_cps, pps=test_pps, flows=test_flows, admin_state=True, @@ -846,7 +846,7 @@ def outboundRoutingEntryAttributesTest(self): self.assertEqual(self.status(), SAI_STATUS_SUCCESS) self.assertEqual(attr['action'], SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT) self.assertEqual(attr['dst_vnet_id'], self.outbound_vnet) - self.assertEqual(attr['overlay_ip'], self.overlay_ip) + self.assertEqual(attr['overlay_ip'].addr.ip4, self.overlay_ip) # TODO: add get counter verification try: @@ -918,7 +918,7 @@ def outboundCa2PaEntryAttributesTest(self): use_dst_vnet_vni=True ) self.assertEqual(self.status(), SAI_STATUS_SUCCESS) - self.assertEqual(attr['underlay_dip'], self.underlay_dip) + self.assertEqual(attr['underlay_dip'].addr.ip4, self.underlay_dip) self.assertEqual(attr['overlay_dmac'], self.overlay_dmac) self.assertEqual(attr['use_dst_vnet_vni'], True) # TODO: add get counter verification @@ -949,8 +949,8 @@ def outboundCa2PaEntryAttributesTest(self): overlay_dmac=True, use_dst_vnet_vni=True ) - self.assertEqual(attr['underlay_dip'], test_dip) - self.assertEqual(attr['overlay_dmac'], test_overlay_dmac) + self.assertEqual(attr['underlay_dip'].addr.ip4, test_dip) + self.assertEqual(attr['overlay_dmac'].upper(), test_overlay_dmac) self.assertEqual(attr['use_dst_vnet_vni'], False) def deleteVnetWhenMapExistTest(self): diff --git a/test/test-cases/functional/ptf/saidashvnet.py b/test/test-cases/functional/ptf/saidashvnet.py index cf5d64200..57062866a 100644 --- a/test/test-cases/functional/ptf/saidashvnet.py +++ b/test/test-cases/functional/ptf/saidashvnet.py @@ -607,7 +607,7 @@ def configureTest(self): client_ip="dddd::14", client_vni=30) - self.tx_host_2 = self.define_neighbor_network(port=self.tx_host_0.port, + self.tx_host_3 = self.define_neighbor_network(port=self.tx_host_0.port, mac=self.tx_host_0.mac, ip="11.0.0.1", ip_prefix="11.0.0.1/24", @@ -736,11 +736,11 @@ def configure_underlay(self): self.route_create(self.tx_host_2.ip_prefix, nhop_0) self.route_create(self.tx_host_3.ip_prefix, nhop_0) - rif_1 = self.router_interface_create(self.rx_host_0.peer.port, - src_mac=self.rx_host_0.peer.mac) - nhop_1 = self.nexthop_create(rif_1, self.rx_host_0.ip) - self.neighbor_create(rif_1, self.rx_host_0.ip, self.rx_host_0.mac) - self.route_create(self.rx_host_1.ip_prefix, nhop_1) + rif_1 = self.router_interface_create(self.rx_host.peer.port, + src_mac=self.rx_host.peer.mac) + nhop_1 = self.nexthop_create(rif_1, self.rx_host.ip) + self.neighbor_create(rif_1, self.rx_host.ip, self.rx_host.mac) + self.route_create(self.rx_host.ip_prefix, nhop_1) @group("draft") diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py index 8e84bd6e5..36dbed8c1 100755 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py @@ -125,9 +125,9 @@ def make_remove_vnet_config(self): """ Generate a configuration to remove entries returns iterator (generator) of SAI records """ - cleanup_commands = [{'name': cmd['name'], 'op': 'remove'} for cmd in self.make_create_vnet_config()] - cleanup_commands = reversed(cleanup_commands) + cleanup_commands = reversed(self.make_create_vnet_config()) for cmd in cleanup_commands: + cmd['op'] = 'remove' yield cmd return diff --git a/test/test-cases/scale/saic/vnet_inbound_setup_commands.json b/test/test-cases/scale/saic/vnet_inbound_setup_commands.json index 20113fdd3..a4e79a12c 100644 --- a/test/test-cases/scale/saic/vnet_inbound_setup_commands.json +++ b/test/test-cases/scale/saic/vnet_inbound_setup_commands.json @@ -140,7 +140,7 @@ "vni": "1000", "sip": "10.10.2.0", "sip_mask": "255.255.255.0", - "priority": 0 + "priority": "0" }, "attributes": [ "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION", diff --git a/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json b/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json index db575f3ce..8b9a30762 100644 --- a/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json +++ b/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json @@ -268,7 +268,6 @@ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", "172.16.1.20", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", "00:DD:DD:DD:DD:00", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", - "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", "True", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", "0", "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] From b34421b77709916ab15c9716458c44ae8cf77fb7 Mon Sep 17 00:00:00 2001 From: Ravi Vantipalli Date: Tue, 11 Jul 2023 15:20:50 -0700 Subject: [PATCH 35/75] Update SAI refpoint to OCP SAI (#398) * Update to OCP SAI master refpoint * go one step back * one more step * Update sai_api_gen to account for duplicates --- .gitmodules | 4 ++-- dash-pipeline/SAI/SAI | 2 +- dash-pipeline/SAI/sai_api_gen.py | 10 +++++++++- dash-pipeline/SAI/templates/saifixedapis.cpp.j2 | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 0ced2e43b..eee4f5e1e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "dash-pipeline/SAI/SAI"] path = dash-pipeline/SAI/SAI - url = https://github.com/reshmaintel/SAI.git - branch = dash-ptf-ci + url = https://github.com/opencomputeproject/SAI.git + branch = master [submodule "test/SAI-Challenger"] path = test/SAI-Challenger url = https://github.com/opencomputeproject/SAI-Challenger.git diff --git a/dash-pipeline/SAI/SAI b/dash-pipeline/SAI/SAI index 52e7b425d..b874c18b9 160000 --- a/dash-pipeline/SAI/SAI +++ b/dash-pipeline/SAI/SAI @@ -1 +1 @@ -Subproject commit 52e7b425d5c3bcdb1460ecb6d6b114df9cad4a08 +Subproject commit b874c18b9856e14fc57d7bfb552982e3fe293590 diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 5e8269a4b..42472d212 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -516,8 +516,16 @@ def write_sai_files(sai_api): env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) env.add_extension('jinja2.ext.loopcontrols') env.add_extension('jinja2.ext.do') + +final_sai_enums = [] +with open('./SAI/experimental/saitypesextensions.h', 'r') as f: + content = f.read() + for enum in sai_enums: + if enum['name'] not in content: + final_sai_enums.append(enum) + sai_enums_tm = env.get_template('templates/saienums.j2') -sai_enums_str = sai_enums_tm.render(sai_enums = sai_enums) +sai_enums_str = sai_enums_tm.render(sai_enums = final_sai_enums) sai_enums_lines = sai_enums_str.split('\n') # The SAI object struct for entries diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 64b943fc8..f8c5c50c9 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -250,6 +250,8 @@ sai_status_t sai_api_initialize( _In_ uint64_t flags, _In_ const sai_service_method_table_t *services) { return SAI_STATUS_SUCCESS; } +sai_status_t sai_api_uninitialize(void) { return SAI_STATUS_SUCCESS; } + sai_status_t sai_log_set( _In_ sai_api_t api, _In_ sai_log_level_t log_level) { return SAI_STATUS_SUCCESS; } From ac329c8c3edc9ee1df584efec774b5d6f7e2c035 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Wed, 12 Jul 2023 10:54:59 -0700 Subject: [PATCH 36/75] [Sonic] Update HLD for ACL tagging and metering (#400) * [Sonic] Update HLD for ACL tagging and metering * Use a list instead of a bitmap for ACL tagging * Metering - resolve / clarify priority across policy routing and mapping --- documentation/general/dash-sonic-hld.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 8cb169479..daea1b988 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -1,6 +1,6 @@ # SONiC-DASH HLD ## High Level Design Document -### Rev 1.4 +### Rev 1.6 # Table of Contents @@ -139,7 +139,7 @@ Metering is essential for billing the customers and below are the high-level req - Mapping table based metering - E.g For specific destinations within the mapping table that must be billed separately - Policy in the metering context refers to metering policy associated to Route tables. This is not related to ACL policy or any ACL packet counters. - If packet flow hits multiple metering buckets, order of priority shall be **Policy->Route->Mapping** -- User shall be able to override the precedence between Routing and Mapping buckets by setting an _override_ flag. When policy is enabled for a route, it takes higher precedence than routing and mapping metering bucket. +- User shall be able to override the precedence between Routing/Policy and Mapping buckets by setting an _override_ flag. When policy is enabled for a route, it takes higher precedence than routing and mapping metering bucket unless _override_ flag is set in which case Mapping takes precedence - Implementation shall aggregate the counters on an "_ENI+Metering Bucket_" combination for billing: - All traffic from an ENI to a Peered VNET - All traffic from an ENI to a Private Link destination @@ -189,22 +189,21 @@ ACL is essential for NSGs and have different stages. In the current model, there - No requirement to modify an existing rule except for the case above. For e.g change action of a rule from permit to deny or vice-versa - ACL Tagging - Mapping a prefix to a tag can reduce the repetition of prefixes across different ACL rules and optimize memory usage - - Tagging is implemented as a bitmap in Orchagent and SAI layers + - Tagging is implemented as list in Orchagent and SAI layers - A prefix can belong to multiple tags - Prefixes can be added or removed from a tag at any time - - SAI implementation shall return a capability for the bitmap size. A '0' return value shall be treated as no-tag support. - - An example tag bitmap is as below. Assume tag bitmap size of 8 (a capability returned by SAI implementation). + - SAI implementation shall return a capability for the list size. A '0' return value shall be treated as no-tag support. + - An example tag list is as below. - Tag1 - 10.1.1.0/24, 20.1.1.0/24 - Tag2 - 10.1.0.0/8, 20.1.1.0/24, 50.1.1.1/32 - Tag8 - Empty - - SAI_SRC_TAG_ENTRY_ATTR_TAG_MAP: 10.1.1.0/24 -> "0000 0011", 20.1.1.0/24 -> "0000 0011", 10.1.0.0/8 -> "0000 0010". Note that orchagent shall extend the tag map to include all subnet to allow an LPM based lookup. In this case, tags for 10.1.1.0/24 shall also include the tag for 10.1.0.0/8. - - SAI_DASH_ACL_RULE_ATTR_SRC_TAG: Assume there is a rule with src tag bitmap as "0001 0010", it is a rule hit if the derived tag has at least 1 bit that matches the bitmap in the rule. - - If a packet arrives with src ip of 10.1.1.1, the corresponding derived src tag shall be "0000 0011" (say HW_DERIVED_TAG_MAP, matching entry for 10.1.1.0/24) - - Ternary operation shall be => HW_DERIVED_TAG_MAP | (SAI_DASH_ACL_RULE_ATTR_SRC_TAG & SAI_DASH_ACL_RULE_ATTR_SRC_TAG_MASK). If any bit is set, it is treated as a match. In order to achieve this functionality, SAI implementation can expand the ACL rules to multiple rules that has only ONE tag set. + - SAI_SRC_TAG_ENTRY_ATTR_TAG_MAP: 10.1.1.0/24 -> "Tag1, Tag2", 20.1.1.0/24 -> "Tag1, Tag2", 10.1.0.0/8 -> "Tag2". Note that orchagent shall extend the tag map to include all subnet to allow an LPM based lookup. In this case, tags for 10.1.1.0/24 shall also include the tag for 10.1.0.0/8. + - SAI_DASH_ACL_RULE_ATTR_SRC_TAG: This shall be a list of tags to match. + - If a packet arrives with src ip of 10.1.1.1, the corresponding derived src tag list shall be "Tag1, Tag2". It shall be then matched against the ACL_RULE Tag list - If the tag field is empty, ACL rule must match ANY tag or NO tag. - - The bitmap size depends on the SAI implementation capability. It is fixed during initialization based on the capability value returned by SAI implementation. This same bitmap size shall be later used for ACL rules and prefix-tag mapping. Orchagent shall implement the logic to chose the tags with largest number of prefixes, based on the capability value. Say 8 biggest tags in the above example. Rest of the tags shall be expanded to include prefixes in the ACL rules. + - The tag list size depends on the SAI implementation capability. It is fixed during initialization based on the capability value returned by SAI implementation. - Deleting ACL group is permitted as long as it is not bind to an ENI. It is not expected for application to delete individual rules prior to deleting a group. Implementation is expected to delete/free all resources when application triggers an ACL group delete. -- ACL rules are not expected to have both tags and prefixes configured in the same rule. In case NorthBound configures with both tags and prefix, orchagent shall split this to separate rules. At high-level, requirement is an `OR` operation when there is both tag and prefix. +- ACL rules are not expected to have both tags and prefixes of same type configured in the same rule. For e.g, same rule shall not have both src tag and src prefix configured, but it is possible to have src tag and dst prefix or vice-versa - Counters can be attached to ACL rules optionally for retrieving the number of connections/flows. It is not required to get the packet/byte counter as in the traditional model. A new SAI counter type shall be required for this. # 2 Packet Flows From fa6df8ea0898ad71f5d62ce97f68ac0964b0288d Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Wed, 12 Jul 2023 11:05:28 -0700 Subject: [PATCH 37/75] [Sonic-HLD] Update for Fastpath design and requirements (#366) * [Sonic-HLD] Update for Fastpath design and requirements (#366) --- .wordlist.txt | 5 ++ documentation/general/dash-sonic-hld.md | 70 ++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/.wordlist.txt b/.wordlist.txt index 01f374392..e4373f827 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -139,6 +139,7 @@ DemoDays designator DEST dest +DestinationPort dev DHCP dir @@ -262,6 +263,7 @@ impactful incrementing inband InbfromLB +INET INIT Init initializer @@ -500,6 +502,7 @@ SDK SDKs SDN sdn +SequenceNumber SetRequest Sflow SHA @@ -524,6 +527,7 @@ SoCs Sommers SONiC SONiC's +SourcePort SpoofingPacket SRC src @@ -685,6 +689,7 @@ testability autogeneration IpAddress IpPrefix +Ipv bool uint AclRule diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index daea1b988..2fa6fa78d 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -46,6 +46,7 @@ | 1.3 | 04/12/2023 | Ze Gan | AppDB protobuf design | | 1.4 | 05/03/2023 | Prince Sunny | ACL Tagging, ACL Requirements | | 1.5 | 05/22/2023 | Oleksandr Ivantsiv | Update configuration examples | +| 1.6 | 06/01/2023 | Prince Sunny | Added FastPath | # About this Manual This document provides more detailed design of DASH APIs, DASH orchestration agent, Config and APP DB Schemas and other SONiC buildimage changes required to bring up SONiC image on an appliance card. General DASH HLD can be found at [dash_hld](./dash-high-level-design.md). @@ -264,6 +265,73 @@ It is possible that a given packet can get a hit in route table and/or mapping t ![dash-outbound-meter](./images/dash-hld-outbound-meter-pipeline.png) +## 2.5 FastPath + +This section captures the Sonic-Dash specifics of FastPath use-case. Detailed document on FastPath is captured here ([FastPath](https://github.com/sonic-net/DASH/blob/main/documentation/load-bal-service/load-balancer-v3.md)) + +The following are the salient points and requirements. Detailed design for FastPath feature shall come as a separate PR. FastPath redirect packets shall be handled by a standalone application and use SAI APIs to update the appliance/dpu flows. +- FastPath kicks in when appliance receives an ICMP redirect that matches an existing unified flow +- Each ICMP redirect shall only update one side of the flow. +- ICMP packet is generated only for TCP. It is not generated for UDP traffic. +- FastPath example for Service Tunnel. *Notice that this is an example scenario and can be extended later for other packet formats* + - After the first SYN pkt, appliance shall create two flows (one Outbound and another Inbound) + - Original Outbound packet shall have an inner IPv6 header and outer IPv4 (Src VIP-A and Dst VIP-B) + - After an ICMP redirect is received from VIP-B hosting MUX, the Outbound flow shall be fixed-up to have outer IPV4 dst address to use the Redirect IP of VIP-B. Same fixup for Inbound flow to change VIP-B to Redirect IP + - After an ICMP redirect is received from VIP-A hosting MUX, the Outbound flow shall be fixed-up to have outer IPV4 src address to use the Redirect IP of VIP-A. Same fixup for Inbound flow to change VIP-A to Redirect IP + - ICMP redirect shall have the original inner IPv6 address as the IP header's src and dst address. + - Redirect info shall contain the transposed IPv6 address, src and dst ports, sequence number and the encap type (NVGRE in this case) in addition to redirect address. + ``` + struct + { + uint32 Reserved; + in6_addr Target; + in6_addr Destination; +             uint8 Type; +             uint8 Length; +             uint8 Reserved2[6];             +             IPV6_HEADER Ipv6Header; +             uint16 SourcePort; +             uint16 DestinationPort; +             uint32 SequenceNumber; +         } Redirect; + + struct + { + uint32 Version; + uint16 AddrFamily; + uint16 EncapType; + uint32 EncapId; + union { + struct { + in_addr DipPAv4; + char VMMac[MAC_ADDR_SIZE]; + } Info4; + struct { + in6_addr DipPAv6; + char VMMac[MAC_ADDR_SIZE]; + } Info6; + } Redirect_Info; + ``` +- Implementation can use the above struct as a type-cast reference (packed as metadata in the redirect packet) and map it to a flow. Full packet capture is available in this ([doc](https://github.com/sonic-net/DASH/blob/main/documentation/load-bal-service/load-balancer-v3.md)) +- Redirect packet format is as below: + + + |SLB IP|APPL IP|GRE|SLB MAC|VM MAC|IP|Inner Src IP|Inner Dst IP|ICMP|Target Addr|Dst Addr|Redirect Header|Custom format| + |------|-------|---|-------|------|--|------------|------------|----|-----------|--------|---------------|-------------| + +- The following shall be used for translations + +| Field | Mapping | +| ----------------------------- | ----------------------------- | +| VM Mac | Source ENI | +| Inner Src IP | Original Src IP | +| Inner Dst IP | Original Dst IP | +| Target Address | Original Dst IP | +| Redirect Header | Original IPv6 Header + TCP ports (5 tuple) | +| Addr Family | AF_INET/AF_INET6 | +| Encap Type | NVGRE 1/VXLAN 2 | +| Encap Id | Redirect GRE Key/ VXLAN Id | +| Custom Redirect Info | Redirect DIP and Dst Mac | # 3 Modules Design @@ -1268,7 +1336,7 @@ For the example configuration above, the following is a brief explanation of loo h.4 Appliance shall first decapsulate the outer header and map it to a flow h.5 Second header's dst mac shall correspond to ENI MAC, as overwritten by SLB MUX h.6 Third header shall be the transpositioned IPv6 header - i. Note: This flow fixup shall be done when Fastpath kicks in with ICMP Redirect, and packets ingress with two headers. + i. Note: This flow fixup shall be done when FastPath kicks in with ICMP Redirect, and packets ingress with two headers. 3. Packet destined to 70.1.2.1 from 10.1.1.1: a. LPM lookup hits for entry 70.1.2.0/24 From b6d44c76aea7b8857061e1e7ee5aa087bc2e20cf Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 28 Jul 2023 14:12:22 -0700 Subject: [PATCH 38/75] Fix ENI lookup ordering (#396) Signed-off-by: Marian Pritsak --- dash-pipeline/bmv2/dash_pipeline.p4 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index ea6575ada..bf1c45837 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -405,6 +405,12 @@ control dash_ingress( /* Outer header processing */ + /* Put VM's MAC in the direction agnostic metadata field */ + meta.eni_addr = meta.direction == dash_direction_t.OUTBOUND ? + hdr.inner_ethernet.src_addr : + hdr.inner_ethernet.dst_addr; + + eni_ether_address_map.apply(); if (meta.direction == dash_direction_t.OUTBOUND) { vxlan_decap(hdr); } else if (meta.direction == dash_direction_t.INBOUND) { @@ -416,6 +422,8 @@ control dash_ingress( } } + /* At this point the processing is done on customer headers */ + meta.is_overlay_ip_v6 = 0; meta.ip_protocol = 0; meta.dst_ip_addr = 0; @@ -439,13 +447,6 @@ control dash_ingress( meta.dst_l4_port = hdr.udp.dst_port; } - /* At this point the processing is done on customer headers */ - - /* Put VM's MAC in the direction agnostic metadata field */ - meta.eni_addr = meta.direction == dash_direction_t.OUTBOUND ? - hdr.ethernet.src_addr : - hdr.ethernet.dst_addr; - eni_ether_address_map.apply(); eni.apply(); if (meta.eni_data.admin_state == 0) { deny(); From b322bc6e3e4625de9418fdc1615ee7144ca76ecb Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Tue, 1 Aug 2023 16:39:10 +0200 Subject: [PATCH 39/75] Update fixed apis (#410) Update fixed apis, and add missing ones --- dash-pipeline/SAI/sai_api_gen.py | 2 +- .../SAI/templates/saifixedapis.cpp.j2 | 82 ++++++++++++++----- 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 42472d212..10e723057 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -456,7 +456,7 @@ def write_sai_files(sai_api): new_lines.append(new_line + '\n') if 'new experimental object type includes' in line: new_lines.append(line) - new_line = '#include "../experimental/saiexperimental' + sai_api['app_name'].replace('_', '') + '.h"\n' + new_line = '#include \n' if new_line not in lines: new_lines.append(new_line) continue diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index f8c5c50c9..930bbd438 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -33,16 +33,6 @@ extern "C" { using namespace std; -sai_status_t sai_create_switch_dummy( - _Out_ sai_object_id_t *switch_id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list) { - - *switch_id = 0; // - fprintf(stderr, "sai_create_switch_dummy()\n"); - return SAI_STATUS_SUCCESS; -} - #define DASH_BMV2_NUM_PORTS 2 #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 @@ -54,6 +44,16 @@ sai_status_t sai_create_switch_dummy( #define DASH_BMV2_DEFAULT_VRF_ID MAKE_OID(SAI_OBJECT_TYPE_VIRTUAL_ROUTER,1) #define DASH_BMV2_DEFAULT_1Q_BRIDGE_ID MAKE_OID(SAI_OBJECT_TYPE_BRIDGE,1) +sai_status_t sai_create_switch_dummy( + _Out_ sai_object_id_t *switch_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) { + + *switch_id = MAKE_OID(SAI_OBJECT_TYPE_SWITCH,1), + fprintf(stderr, "sai_create_switch_dummy()\n"); + return SAI_STATUS_SUCCESS; +} + sai_object_id_t port_list[DASH_BMV2_NUM_PORTS] = { MAKE_OID(SAI_OBJECT_TYPE_PORT,1), MAKE_OID(SAI_OBJECT_TYPE_PORT,2) @@ -79,14 +79,14 @@ sai_status_t sai_get_switch_attribute( return SAI_STATUS_SUCCESS; case SAI_SWITCH_ATTR_PORT_LIST: - // make a tmp port list, saiserver will free the memory - objlist = (sai_object_id_t *)malloc(sizeof(port_list)); - memcpy(objlist, port_list, sizeof(port_list)); - port_obj_list = { - .count = DASH_BMV2_NUM_PORTS, - .list = objlist - }; - attr->value.objlist = port_obj_list; + + attr->value.objlist.count = DASH_BMV2_NUM_PORTS; + + for (uint32_t i = 0; i < DASH_BMV2_NUM_PORTS; i++) + { + attr->value.objlist.list[i] = port_list[i]; + } + fprintf(stderr, " sai_get_switch_attribute() [%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]\n", i, attr->id, DASH_BMV2_NUM_PORTS); return SAI_STATUS_SUCCESS; @@ -238,7 +238,15 @@ sai_object_type_t sai_object_type_query( sai_object_id_t sai_switch_id_query( - _In_ sai_object_id_t object_id) { return SAI_STATUS_SUCCESS; } + _In_ sai_object_id_t object_id) +{ + if (object_id == SAI_NULL_OBJECT_ID) + { + return SAI_NULL_OBJECT_ID; + } + + return MAKE_OID(SAI_OBJECT_TYPE_SWITCH,1); +} sai_status_t sai_query_attribute_enum_values_capability( _In_ sai_object_id_t switch_id, @@ -255,3 +263,39 @@ sai_status_t sai_api_uninitialize(void) { return SAI_STATUS_SUCCESS; } sai_status_t sai_log_set( _In_ sai_api_t api, _In_ sai_log_level_t log_level) { return SAI_STATUS_SUCCESS; } + +sai_status_t sai_query_api_version( + _Out_ sai_api_version_t *version) +{ + if (version) + { + *version = SAI_API_VERSION; + + return SAI_STATUS_SUCCESS; + } + + return SAI_STATUS_INVALID_PARAMETER; +} + +sai_status_t sai_query_stats_capability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _Inout_ sai_stat_capability_list_t *stats_capability) +{ + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t sai_query_attribute_capability( + _In_ sai_object_id_t switch_id, + _In_ sai_object_type_t object_type, + _In_ sai_attr_id_t attr_id, + _Out_ sai_attr_capability_t *attr_capability) +{ + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t sai_dbg_generate_dump( + _In_ const char *dump_file_name) +{ + return SAI_STATUS_NOT_IMPLEMENTED; +} From 1ffa37f5fa1c21c2bab19c29db679a213105d8b1 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 2 Aug 2023 09:14:16 +0200 Subject: [PATCH 40/75] [SAI] Move constructor to sai_api_initialize (#413) * [SAI] Move constructor to sai_api_initialize For future passing parameters via service method table * Add extern * Add comment --- .../SAI/templates/saifixedapis.cpp.j2 | 69 ++++++++++++++++++- dash-pipeline/SAI/templates/utils.cpp.j2 | 66 +----------------- .../tests/libsai/vnet_out/vnet_out.cpp | 15 +++- 3 files changed, 83 insertions(+), 67 deletions(-) diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 930bbd438..9a4d465ee 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -33,6 +33,11 @@ extern "C" { using namespace std; +// TODO to be moved to separate class/namespace + +static std::shared_ptr _grpcChannel; +extern std::unique_ptr stub; + #define DASH_BMV2_NUM_PORTS 2 #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 @@ -254,9 +259,71 @@ sai_status_t sai_query_attribute_enum_values_capability( _In_ sai_attr_id_t attr_id, _Inout_ sai_s32_list_t *enum_values_capability) { return SAI_STATUS_SUCCESS; } +static p4::config::v1::P4Info parse_p4info(const char *path) +{ + p4::config::v1::P4Info p4info; + std::ifstream istream(path); + assert(istream.good()); + google::protobuf::io::IstreamInputStream istream_(&istream); + google::protobuf::TextFormat::Parse(&istream_, &p4info); + return p4info; +} + sai_status_t sai_api_initialize( _In_ uint64_t flags, - _In_ const sai_service_method_table_t *services) { return SAI_STATUS_SUCCESS; } + _In_ const sai_service_method_table_t *services) +{ + const grpc::string _grpcTarget = "0.0.0.0:9559"; + char test_json[] = "/etc/dash/dash_pipeline.json"; + char test_proto_json[] = "/etc/dash/dash_pipeline_p4rt.txt"; + int dev_id = 0; + + auto p4info = parse_p4info(test_proto_json); + + auto set_election_id = [](p4::v1::Uint128 *election_id) { + election_id->set_high(0); + election_id->set_low(1); + }; + + grpc::ClientContext stream_context; + _grpcChannel = grpc::CreateChannel(_grpcTarget, grpc::InsecureChannelCredentials()); + stub = p4::v1::P4Runtime::NewStub(_grpcChannel); + auto stream = stub->StreamChannel(&stream_context); + { + p4::v1::StreamMessageRequest request; + auto arbitration = request.mutable_arbitration(); + arbitration->set_device_id(dev_id); + set_election_id(arbitration->mutable_election_id()); + stream->Write(request); + p4::v1::StreamMessageResponse response; + stream->Read(&response); + assert(response.update_case() == p4::v1::StreamMessageResponse::kArbitration); + assert(response.arbitration().status().code() == ::google::rpc::Code::OK); + } + { + p4::v1::SetForwardingPipelineConfigRequest request; + request.set_device_id(dev_id); + request.set_action( + p4::v1::SetForwardingPipelineConfigRequest_Action_VERIFY_AND_COMMIT); + set_election_id(request.mutable_election_id()); + auto config = request.mutable_config(); + config->set_allocated_p4info(&p4info); + std::ifstream istream(test_json); + config->mutable_p4_device_config()->assign( + (std::istreambuf_iterator(istream)), + std::istreambuf_iterator()); + + p4::v1::SetForwardingPipelineConfigResponse rep; + grpc::ClientContext context; + LOG("GRPC call SetForwardingPipelineConfig " + _grpcTarget + " => " + test_json + ", " + test_proto_json <SetForwardingPipelineConfig( + &context, request, &rep); + assert(status.ok()); + config->release_p4info(); + } + + return SAI_STATUS_SUCCESS; +} sai_status_t sai_api_uninitialize(void) { return SAI_STATUS_SUCCESS; } diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index 9fbe9f9f2..fe2903f04 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -32,13 +32,12 @@ extern "C" { using namespace std; -static std::shared_ptr _grpcChannel; static const grpc::string _grpcTarget = "localhost:9876"; static int deviceId; static unordered_multimap tableEntryMap; static std::mutex tableLock; static atomic nextId; -static std::unique_ptr stub; +std::unique_ptr stub; void correctIpPrefix(void *ip, const void *mask, size_t length) { @@ -74,69 +73,6 @@ int leadingNonZeroBits(const sai_ip6_t ipv6) { return 0; } -p4::config::v1::P4Info parse_p4info(const char *path) { - p4::config::v1::P4Info p4info; - std::ifstream istream(path); - assert(istream.good()); - google::protobuf::io::IstreamInputStream istream_(&istream); - google::protobuf::TextFormat::Parse(&istream_, &p4info); - return p4info; -} - - -// This gets called when library first loaded; requires a libsai func call to trigger this -__attribute__((constructor)) -static void Init() { - nextId = 0; - const grpc::string _grpcTarget = "0.0.0.0:9559"; - char test_json[] = "/etc/dash/dash_pipeline.json"; - char test_proto_json[] = "/etc/dash/dash_pipeline_p4rt.txt"; - int dev_id = 0; - - auto p4info = parse_p4info(test_proto_json); - - auto set_election_id = [](p4::v1::Uint128 *election_id) { - election_id->set_high(0); - election_id->set_low(1); - }; - - grpc::ClientContext stream_context; - _grpcChannel = grpc::CreateChannel(_grpcTarget, grpc::InsecureChannelCredentials()); - stub = p4::v1::P4Runtime::NewStub(_grpcChannel); - auto stream = stub->StreamChannel(&stream_context); - { - p4::v1::StreamMessageRequest request; - auto arbitration = request.mutable_arbitration(); - arbitration->set_device_id(dev_id); - set_election_id(arbitration->mutable_election_id()); - stream->Write(request); - p4::v1::StreamMessageResponse response; - stream->Read(&response); - assert(response.update_case() == p4::v1::StreamMessageResponse::kArbitration); - assert(response.arbitration().status().code() == ::google::rpc::Code::OK); - } - { - p4::v1::SetForwardingPipelineConfigRequest request; - request.set_device_id(dev_id); - request.set_action( - p4::v1::SetForwardingPipelineConfigRequest_Action_VERIFY_AND_COMMIT); - set_election_id(request.mutable_election_id()); - auto config = request.mutable_config(); - config->set_allocated_p4info(&p4info); - std::ifstream istream(test_json); - config->mutable_p4_device_config()->assign( - (std::istreambuf_iterator(istream)), - std::istreambuf_iterator()); - - p4::v1::SetForwardingPipelineConfigResponse rep; - grpc::ClientContext context; - LOG("GRPC call SetForwardingPipelineConfig " + _grpcTarget + " => " + test_json + ", " + test_proto_json <SetForwardingPipelineConfig( - &context, request, &rep); - assert(status.ok()); - config->release_p4info(); - } -} int GetDeviceId() { return deviceId; diff --git a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp index acbfcbab8..2f24ab6e1 100644 --- a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp +++ b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp @@ -3,8 +3,13 @@ #include #include +extern "C" { #include +} +// TODO below apis are extern of internal implementation +// they should not be used by extern, but obtained via +// sai_api_query function, FIXME extern sai_status_t sai_create_direction_lookup_entry( _In_ const sai_direction_lookup_entry_t *direction_lookup_entry, @@ -59,6 +64,14 @@ int main(int argc, char **argv) sai_object_id_t eni_id; sai_object_id_t vnet_id; + sai_status_t status = sai_api_initialize(0, nullptr); + + if (status != SAI_STATUS_SUCCESS) + { + std::cout << "Failed to initialize SAI api" << std::endl; + return 1; + } + sai_direction_lookup_entry_t dle = {}; dle.switch_id = switch_id; dle.vni = 60; @@ -68,7 +81,7 @@ int main(int argc, char **argv) attrs.push_back(attr); /* sai_status_t status = sai_dash_api_impl.create_direction_lookup_entry(&dle, attrs.size(), attrs.data()); */ - sai_status_t status = sai_create_direction_lookup_entry(&dle, attrs.size(), attrs.data()); + status = sai_create_direction_lookup_entry(&dle, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create Direction Lookup Entry" << std::endl; From c1085e9c4dddb6dde95e82d2a6bc9c99e933f316 Mon Sep 17 00:00:00 2001 From: MirceaDan Date: Wed, 2 Aug 2023 09:09:25 -0700 Subject: [PATCH 41/75] DASH scale requirement update (#403) * Update dash-sonic-hld.md reduced eni count from 64 to 32 increased CPS from 1.5M to 3.75 * Update program-scale-testing-requirements-draft.md updated scale numbers for hero test based on HLD increased the flow timer to 5 sec * feedback from pr 403 8M replaced with 32M 0.5- 1 second replaced with 5 seconds one packet every second replaced with 1 packet every 4.9 sec * reduced min cps requirement to 3 6 12 and 24M * adjusted cps to 3M * mapping reduced from 10M to 8M * spellcheck asic to ASIC --- documentation/general/dash-sonic-hld.md | 6 +-- ...rogram-scale-testing-requirements-draft.md | 49 ++++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 2fa6fa78d..8a43f02a5 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -104,7 +104,7 @@ Following are the minimal scaling requirements | Item | Expected value | | ----------------------------- | ----------------------------- | | VNETs | 1024* | -| ENI | 64 Per Card | +| ENI | 32 Per Card | | Outbound Routes per ENI | 100k | | Inbound Routes per ENI | 10k** | | NSGs per ENI | 10*** | @@ -116,11 +116,11 @@ Following are the minimal scaling requirements | Max prefixes per tag | 24k | | Max tags one prefix belong to | 512 | | Max tags in an ACL rule | 4k | -| CA-PA Mappings | 10M Per Card | +| CA-PA Mappings | 8M Per Card | | Active Connections/ENI | 1M (Bidirectional TCP or UDP) | | Total active connections | 32M (Bidirectional) | | Metering Buckets per ENI | 4000 | -| CPS | 1.5M | +| CPS | 3M | \* Number of VNET is a software limit as VNET by itself does not take hardware resources. This shall be limited to number of VNI hardware can support diff --git a/documentation/general/program-scale-testing-requirements-draft.md b/documentation/general/program-scale-testing-requirements-draft.md index 8ed1a7a6b..e60910fc4 100644 --- a/documentation/general/program-scale-testing-requirements-draft.md +++ b/documentation/general/program-scale-testing-requirements-draft.md @@ -193,8 +193,8 @@ integrators to track and test the designs in a common manner. expect more TCP and in fact in some cases we meter UDP as a potential source of DoS. - - Connection aging set to 1 sec and requires each connection or - bi-directional flow to receive one packet every second in each + - Connection aging set to 5 sec and requires each connection or + bi-directional flow to receive one packet every 4.9 seconds in each direction at a size that will fill up the links to near 100% in conjunction with the dynamically setup connection traffic. For this to be run successfully it may take a few runs as each TCP @@ -204,9 +204,9 @@ integrators to track and test the designs in a common manner. seen that meets the policy for the bi-directional flow setup. When using this in CPS testing, we will send a total of 6 packets to match TCP to make things more balanced. UDP - bi-directional flows will be aged within 1 second after + bi-directional flows will be aged within 5 second after receiving the last packet. I would set all UDP bi-directional - flows to 0.5 - 1.0 second aging to ensure that we do not inflate + flows to 5 seconds aging to ensure that we do not inflate the connection table over time. - One packet should be sent in each direction to be able to keep @@ -214,7 +214,7 @@ integrators to track and test the designs in a common manner. to a minimum that allows 6 CPS packets at maximum rate and at least one packet on each of the active connections in both directions that also allows for close to 100% link utilization - while not exceeding the TCP aging time of 1 sec. + while not exceeding the TCP aging time of 5 sec. - TCP connection is established and terminated without any data packets. @@ -228,19 +228,19 @@ integrators to track and test the designs in a common manner. saturated at 100Gbps for the duration of test runtime. At the same time we want as close to 100Gbps without losing packets. -- Inactivity based aging timer of 1 second. +- Inactivity based aging timer of 5 second. - All TCP connections should be deleted from the table after the test completes. - The connection table should therefore be zero. - - All UDP bi-directional flows need to age out before the 1 second + - All UDP bi-directional flows need to age out before the 5 second interval to allow for new UDP bi-directional flows to be established. If everything works as advertised, we should never - see the connection table go above the 8M connections. If we do + see the connection table go above the 32M connections. If we do then it is likely that UDP bi-directional flows were not aged - within the 1 second interval. To check this, we need to see a + within the 5 second interval. To check this, we need to see a high water counter for maximum connection table size. ## Feature Requirements @@ -294,19 +294,24 @@ The following scale of policies and routes are at minimum required to be configured during validation and test plan needs to be executed covering both scenarios: -| | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | -|---------------|------------|--------------|-------|-------|-------| -| VNETs | | 1024 | 2048 | 4096 | 8192 | -| ENIs | | 64 | 128 | 256 | 512 | -| Routes | 100K | 6.4M | 12.8M | 25.6M | 51.2M | -| NSGs | 5in + 5out | 640 | 1280 | 2560 | 5120 | -| ACLs prefixes | 10x100K | 64M | 128M | 256M | 512M | -| ACLs Ports | 10x10K | 6.4M | 12.8M | 25.6M | 51.2M | -| Mappings (CA to PA) | 160K | 10M | 20M | 40M | 80M | -| Act Con | 500K (bidir w/ connection pool capable of oversubscription) | 32M | 64M | 128M | 256M | -| CPS | | 3.75M | 7.5M | 15M | 30M | -| bg flows TCP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | -| bg flows UDP | | 15M (bidir w/ connection pool capable of oversubscription) | 30M | 60M | 120M | +| | per ENI | 200G (DPU) | 400G | 800G | 1.6T (smart switch) | +|---------------------|------------|-------------|-------|-------|-------| +| VNETs | | 1024 | 2048 | 4096 | 8192 | +| ENIs | | 32 | 64 | 128 | 256 | +| Outbound Routes | 100K | 3.2M | 6.4M | 12.8M | 25.6M | +| Inbound Routes | 10K | 320K | 640K | 1.28M | 2.56M | +| NSGs | 5in + 5out | 320 | 640 | 1280 | 2560 | +| ACLs prefixes | 10x100K | 32MM | 64M | 128M | 256M | +| ACLs Ports | 10x10K | 3.2M | 6.4M | 12.8M | 25.6M | +| Mappings (CA to PA) | NA[^1] | 8M | 16M | 32M | 64M | +| Act Con | 1M | 32M[^2] | 64M | 128M | 256M | +| CPS | | 3M | 6M | 12M | 24M | +| bg flows TCP | | 15M[^2] | 30M | 60M | 120M | +| bg flows UDP | | 15M[^2] | 30M | 60M | 120M | + + +[^1]: per ASIC numbers, can be distributed in any way to each ENI +[^2]: flows are bidir w/ connection pool capable of oversubscription - ACL rules per NSG = 1000 - Prefixes per ACL rule = 100 From a0e4ff836d1a90a414771706a303cae98ad3f2af Mon Sep 17 00:00:00 2001 From: Gspn Amith <50331118+AmithGspn@users.noreply.github.com> Date: Wed, 2 Aug 2023 10:28:29 -0600 Subject: [PATCH 42/75] Adds dash underlay routing functionality (#404) * Added dash underlay routing functioanlity * Updated the underlay code to make sure it work properly for TARGET_DPDK_PNA * Updated port numbers in bmv2 --- dash-pipeline/SAI/SAI | 2 +- dash-pipeline/SAI/sai_api_gen.py | 12 +- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 2 +- .../SAI/templates/saifixedapis.cpp.j2 | 1 + dash-pipeline/bmv2/dash_pipeline.p4 | 18 +- dash-pipeline/bmv2/underlay.p4 | 75 ++++ documentation/general/dash-sonic-hld.md | 6 +- ...hld-inbound-packet-processing-pipeline.svg | 4 +- ...ld-outbound-packet-processing-pipeline.png | Bin 221291 -> 0 bytes ...ld-outbound-packet-processing-pipeline.svg | 4 + .../test_config_vnet_route_bidirectional.py | 39 ++ .../test_config_vnet_route_unidirectional.py | 39 ++ .../saic/test_sai_vnet_route_bidirectional.py | 219 +++++++++++ .../test_sai_vnet_route_unidirectional.py | 195 ++++++++++ ...et_route_setup_commands_bidirectional.json | 358 ++++++++++++++++++ ...t_route_setup_commands_unidirectional.json | 189 +++++++++ 16 files changed, 1150 insertions(+), 13 deletions(-) create mode 100644 dash-pipeline/bmv2/underlay.p4 delete mode 100644 documentation/general/images/dash-hld-outbound-packet-processing-pipeline.png create mode 100644 documentation/general/images/dash-hld-outbound-packet-processing-pipeline.svg create mode 100644 test/test-cases/scale/saic/test_config_vnet_route_bidirectional.py create mode 100644 test/test-cases/scale/saic/test_config_vnet_route_unidirectional.py create mode 100644 test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py create mode 100644 test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py create mode 100644 test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json create mode 100644 test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json diff --git a/dash-pipeline/SAI/SAI b/dash-pipeline/SAI/SAI index b874c18b9..52e7b425d 160000 --- a/dash-pipeline/SAI/SAI +++ b/dash-pipeline/SAI/SAI @@ -1 +1 @@ -Subproject commit b874c18b9856e14fc57d7bfb552982e3fe293590 +Subproject commit 52e7b425d5c3bcdb1460ecb6d6b114df9cad4a08 diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 10e723057..202ba9c3d 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -362,8 +362,11 @@ def write_sai_impl_files(sai_api): env.add_extension('jinja2.ext.loopcontrols') env.add_extension('jinja2.ext.do') sai_impl_tm = env.get_template('/templates/saiapi.cpp.j2') - sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name']) - + if "dash" in sai_api['app_name']: + header_prefix = "experimental" + else: + header_prefix = "" + sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], header_prefix = header_prefix) with open('./lib/sai' + sai_api['app_name'].replace('_', '') + '.cpp', 'w') as o: o.write(sai_impl_str) @@ -508,7 +511,10 @@ def write_sai_files(sai_api): if table_ref.endswith(table_name): key[OBJECT_NAME_TAG] = table_name # Write SAI dictionary into SAI API headers - write_sai_files(get_uniq_sai_api(sai_api)) + if "dash" in sai_api['app_name']: + write_sai_files(get_uniq_sai_api(sai_api)) + + # Write SAI implementation write_sai_impl_files(sai_api) sai_api_name_list.append(sai_api['app_name'].replace('_', '')) sai_api_full_name_list.append(sai_api['app_name']) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index c45319bdf..9ec8461ac 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -7,7 +7,7 @@ #include #include "p4/v1/p4runtime.grpc.pb.h" #include "utils.h" -#include "saiexperimental{{ app_name | replace('_', '') }}.h" +#include "sai{{ header_prefix }}{{ app_name | replace('_', '') }}.h" #include "saitypes.h" #include "saistatus.h" #include diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 9a4d465ee..6805b9560 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -19,6 +19,7 @@ extern "C" { #include "saistatus.h" #include "saitypes.h" #include "saiextensions.h" +#include "sairoute.h" // TODO: Change to template generated values } #include #include diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index bf1c45837..e51edd6ed 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -9,6 +9,7 @@ #include "dash_outbound.p4" #include "dash_inbound.p4" #include "dash_conntrack.p4" +#include "underlay.p4" control dash_ingress( inout headers_t hdr @@ -374,10 +375,6 @@ control dash_ingress( apply { - /* Send packet on same port it arrived (echo) by default */ -#ifdef TARGET_BMV2_V1MODEL - standard_metadata.egress_spec = standard_metadata.ingress_port; -#endif // TARGET_BMV2_V1MODEL #ifdef TARGET_DPDK_PNA #ifdef DPDK_PNA_SEND_TO_PORT_FIX_MERGED // As of 2023-Jan-26, the version of the pna.p4 header file @@ -463,6 +460,19 @@ control dash_ingress( inbound.apply(hdr, meta); } + /* Underlay routing */ + meta.dst_ip_addr = (bit<128>)hdr.ipv4.dst_addr; + underlay.apply( + hdr + , meta + #ifdef TARGET_BMV2_V1MODEL + , standard_metadata + #endif // TARGET_BMV2_V1MODEL + #ifdef TARGET_DPDK_PNA + , istd + #endif // TARGET_DPDK_PNA + ); + if (meta.meter_policy_en == 1) { meter_policy.apply(); meter_rule.apply(); diff --git a/dash-pipeline/bmv2/underlay.p4 b/dash-pipeline/bmv2/underlay.p4 new file mode 100644 index 000000000..88cd4acc9 --- /dev/null +++ b/dash-pipeline/bmv2/underlay.p4 @@ -0,0 +1,75 @@ +#include +#include "dash_headers.p4" +#include "dash_metadata.p4" + +control underlay( + inout headers_t hdr + , inout metadata_t meta +#ifdef TARGET_BMV2_V1MODEL + , inout standard_metadata_t standard_metadata +#endif // TARGET_BMV2_V1MODEL +#ifdef TARGET_DPDK_PNA + , in pna_main_input_metadata_t istd +#endif // TARGET_DPDK_PNA + ) +{ + action set_nhop(bit<9> next_hop_id) { +#ifdef TARGET_BMV2_V1MODEL + standard_metadata.egress_spec = next_hop_id; +#endif // TARGET_BMV2_V1MODEL + +#ifdef TARGET_DPDK_PNA +#ifdef DPDK_PNA_SEND_TO_PORT_FIX_MERGED + // As of 2023-Jan-26, the version of the pna.p4 header file + // included with p4c defines send_to_port with a parameter + // that has no 'in' direction. The following commit in the + // public pna repo fixes this, but this fix has not yet been + // copied into the p4c repo. + // https://github.com/p4lang/pna/commit/b9fdfb888e5385472c34ff773914c72b78b63058 + // Until p4c is updated with this fix, the following line will + // give a compile-time error. + send_to_port(next_hop_id); +#endif // DPDK_PNA_SEND_TO_PORT_FIX_MERGED +#endif // TARGET_DPDK_PNA + } + + action def_act() { +#ifdef TARGET_BMV2_V1MODEL + standard_metadata.egress_spec = standard_metadata.ingress_port; +#endif // TARGET_BMV2_V1MODEL + +#ifdef TARGET_DPDK_PNA +#ifdef DPDK_PNA_SEND_TO_PORT_FIX_MERGED + // As of 2023-Jan-26, the version of the pna.p4 header file + // included with p4c defines send_to_port with a parameter + // that has no 'in' direction. The following commit in the + // public pna repo fixes this, but this fix has not yet been + // copied into the p4c repo. + // https://github.com/p4lang/pna/commit/b9fdfb888e5385472c34ff773914c72b78b63058 + // Until p4c is updated with this fix, the following line will + // give a compile-time error. + send_to_port(istd.input_port); +#endif // DPDK_PNA_SEND_TO_PORT_FIX_MERGED +#endif // TARGET_DPDK_PNA + } + + @name("route|route") + // TODO: To add structural annotations (example: @Sai[skipHeaderGen=true]) + table underlay_routing { + key = { + meta.dst_ip_addr : lpm @name("meta.dst_ip_addr:destination"); + } + + actions = { + /* Send packet on different/same port it arrived based on routing */ + set_nhop; + + /* Send packet on same port it arrived (echo) by default */ + @defaultonly def_act; + } + } + + apply { + underlay_routing.apply(); + } +} diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 8a43f02a5..4f1cc5fe5 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -213,7 +213,7 @@ The following section captures at a high-level on the VNET packet flow. Detailed ## 2.1 Outbound packet processing pipeline - ![dash-outbound](./images/dash-hld-outbound-packet-processing-pipeline.png) + ![dash-outbound](./images/dash-hld-outbound-packet-processing-pipeline.svg) Based on the incoming packet's VNI matched against the reserved VNI assigned for VM->Appliance, the pipeline shall set the direction as TX(Outbound) and using the inner src-mac, maps to the corresponding ENI.The incoming packet will always be VXLAN encapsulated and outer dst-ip is the appliance VIP. The pipeline shall parse the VNI, and for VM traffic, the VNI shall be a special reserved VNI. Everything else shall be treated as as network traffic(RX). Pipeline shall use VNI to differentiate the traffic to be VM (Inbound) or Network (Outbound). @@ -221,6 +221,8 @@ In the outbound flow, the appliance shall assume it is the first appliance to ap After the ACL stage, it does LPM routing based on the inner dst-ip and applies the respective action (encap, subsequent CA-PA mapping). Finally, update the connection tracking table for both inbound and outbound. +After the connection tracking update, the packet proceeds to the "underlay routing" stage. Based on the destination IP address (outer dst-ip), the underlay routing block decides how the packet should be forwarded towards its destination. + The figure below shows how the VNI to be encapsulated in the outgoing packet is derived based on the ENI, outbound routing and outbound CA-PA mapping table lookup in the Dash outbound packet processing pipeline. ![dash-outbound-vni](./images/dash-hld-outbound-vni.svg) @@ -229,7 +231,7 @@ The figure below shows how the VNI to be encapsulated in the outgoing packet is ![dash-inbound](./images/dash-hld-inbound-packet-processing-pipeline.svg) -Based on the incoming packet's VNI, if it does not match against any reserved VNI, the pipeline shall set the direction as RX(Inbound) and using the inner dst-mac, maps to the corresponding ENI. In the inbound flow, Priority based "Routing Rule" lookup happens based on VNI and optionally SRC PA prefix and maps to a VNET. In other words, the VNET is derived from a VNI key or a combination of VNI key and SRC PA based on the routing rule entry. It is possible that in some cases, two VNETs in different region can have the same VNI key and hence Inbound routing rule shall have both SRC PA prefix and VNI key to uniquely determine the VNET. Using the derived VNET's mapping tables, source PA address is validated against the list of mappings. If the check passes, decap action is performed, else dropped. Note that, PA validation is conditional and routing rule shall specify (say, by a flag) whether to perform PA validation or not as there are some cases like SLB traffic for which PA validation is not required. After route lookup is the three stage ACL, processed in order. ACLs can have multiple src/dst IP ranges or port ranges as match criteria. +Based on the incoming packet's VNI, if it does not match against any reserved VNI, the pipeline shall set the direction as RX(Inbound) and using the inner dst-mac, maps to the corresponding ENI. In the inbound flow, Priority based "Routing Rule" lookup happens based on VNI and optionally SRC PA prefix and maps to a VNET. In other words, the VNET is derived from a VNI key or a combination of VNI key and SRC PA based on the routing rule entry. It is possible that in some cases, two VNETs in different region can have the same VNI key and hence Inbound routing rule shall have both SRC PA prefix and VNI key to uniquely determine the VNET. Using the derived VNET's mapping tables, source PA address is validated against the list of mappings. If the check passes, decap action is performed, else dropped. Note that, PA validation is conditional and routing rule shall specify (say, by a flag) whether to perform PA validation or not as there are some cases like SLB traffic for which PA validation is not required. After route lookup is the three stage ACL, processed in order. ACLs can have multiple src/dst IP ranges or port ranges as match criteria. After the connection tracking update, the packet proceeds to the "underlay routing" stage. Based on the destination IP address (outer dst-ip), the underlay routing block decides how the packet should be forwarded towards its destination. It is worth noting that CA-PA mapping table shall be used for both encap and decap process diff --git a/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg b/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg index ebfd96806..33c83c644 100644 --- a/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg +++ b/documentation/general/images/dash-hld-inbound-packet-processing-pipeline.svg @@ -1,4 +1,4 @@ - + -
VNI Lookup
(set direction)
VNI Lookup...
ENI Lookup
ENI Lookup
Conntrack Lookup
Conntrack Lookup
Routing
Routing
ACLs
ACLs
Metering
Metering
Conntrack Update
Conntrack Update
Network
Network
VM
VM
Vxlan Encap
Vxlan Encap
Text is not SVG - cannot display
+
VNI Lookup
(set direction)
VNI Lookup...
ENI Lookup
ENI Lookup
Conntrack Lookup
Conntrack Lookup
Routing
Routing
ACLs
ACLs
Metering
Metering
Conntrack Update
Conntrack Update
Network
Network
VM
VM
Underlay routing
Underlay routing
Vxlan Encap
Vxlan Encap
Text is not SVG - cannot display
diff --git a/documentation/general/images/dash-hld-outbound-packet-processing-pipeline.png b/documentation/general/images/dash-hld-outbound-packet-processing-pipeline.png deleted file mode 100644 index f4eb5a02bbcc49349bb8d391e29638a9197e3411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221291 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 O5O})!xvX + + +
VNI Lookup
(set direction)
VNI Lookup...
ENI Lookup
ENI Lookup
Conntrack Lookup
Conntrack Lookup
ACLs
ACLs
Routing
Routing
Metering
Metering
Network
Network
VM
VM
Metering
Update
Metering...
Conntrack
Update
Conntrack...
Metering
Policy
Metering...
Underlay routing
Underlay routing
Text is not SVG - cannot display
\ No newline at end of file diff --git a/test/test-cases/scale/saic/test_config_vnet_route_bidirectional.py b/test/test-cases/scale/saic/test_config_vnet_route_bidirectional.py new file mode 100644 index 000000000..eb8c50ef1 --- /dev/null +++ b/test/test-cases/scale/saic/test_config_vnet_route_bidirectional.py @@ -0,0 +1,39 @@ +import json +from pathlib import Path +from pprint import pprint + +import pytest + +class TestConfigVnetRouting: + + @pytest.fixture(scope="class") + def vnet_in_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + current_file_dir = Path(__file__).parent + with (current_file_dir / 'vnet_route_setup_commands_bidirectional.json').open(mode='r') as config_file: + vnet_route_setup_commands = json.load(config_file) + return vnet_route_setup_commands + + def test_config_vnet_routing_bidirectional_create(self, dpu, vnet_in_config): + """ + Apply configuration that is loaded from the file. + """ + + results = [*dpu.process_commands(vnet_in_config)] + print('======= SAI commands RETURN values create =======') + pprint(results) + assert all(results), 'Create error' + + def test_config_vnet_routing_bidirectional_remove(self, dpu, vnet_in_config): + """ + Remove configuration that is loaded from the file. + """ + results = [*dpu.process_commands(vnet_in_config, cleanup=True)] + print("\n======= SAI commands RETURN values remove =======") + pprint(results) + assert all( + [result == 'SAI_STATUS_SUCCESS' for result in results] + ), 'Remove error' diff --git a/test/test-cases/scale/saic/test_config_vnet_route_unidirectional.py b/test/test-cases/scale/saic/test_config_vnet_route_unidirectional.py new file mode 100644 index 000000000..cb9266617 --- /dev/null +++ b/test/test-cases/scale/saic/test_config_vnet_route_unidirectional.py @@ -0,0 +1,39 @@ +import json +from pathlib import Path +from pprint import pprint + +import pytest + +class TestConfigVnetRouting: + + @pytest.fixture(scope="class") + def vnet_in_config(self): + """ + Fixture returns the content of the file with SAI configuration commands. + scope=class - The file is loaded once for the whole test class + """ + current_file_dir = Path(__file__).parent + with (current_file_dir / 'vnet_route_setup_commands_unidirectional.json').open(mode='r') as config_file: + vnet_route_setup_commands = json.load(config_file) + return vnet_route_setup_commands + + def test_config_vnet_routing_unidirectional_create(self, dpu, vnet_in_config): + """ + Apply configuration that is loaded from the file. + """ + + results = [*dpu.process_commands(vnet_in_config)] + print('======= SAI commands RETURN values create =======') + pprint(results) + assert all(results), 'Create error' + + def test_config_vnet_routing_unidirectional_remove(self, dpu, vnet_in_config): + """ + Remove configuration that is loaded from the file. + """ + results = [*dpu.process_commands(vnet_in_config, cleanup=True)] + print("\n======= SAI commands RETURN values remove =======") + pprint(results) + assert all( + [result == 'SAI_STATUS_SUCCESS' for result in results] + ), 'Remove error' diff --git a/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py b/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py new file mode 100644 index 000000000..2e3eb358f --- /dev/null +++ b/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py @@ -0,0 +1,219 @@ +""" +Verify VNET Route scenario +""" + +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +from saichallenger.common.sai_dataplane.utils.ptf_testutils import (send_packet, + simple_udp_packet, + simple_vxlan_packet) + +import sys +sys.path.append("../utils") +import vnet2vnet_helper as dh +current_file_dir = Path(__file__).parent + +# Constants +SWITCH_ID = 5 + +# Simple, non-scaled configuration. +# See README.md for details. + +TEST_VNET_ROUTE_BIDIRECTIONAL_CONFIG = { + + "ENI_COUNT": 1, + "ACL_RULES_NSG": 1, + "ACL_TABLE_COUNT": 1, + "IP_PER_ACL_RULE": 1, + "IP_MAPPED_PER_ACL_RULE": 1, + "IP_ROUTE_DIVIDER_PER_ACL_RULE": 1, + + 'DASH_VIP': { + 'vpe': { + 'SWITCH_ID': '$SWITCH_ID', + 'IPV4': "172.16.1.100" + } + }, + + 'DASH_DIRECTION_LOOKUP': { + 'dle': { + 'SWITCH_ID': '$SWITCH_ID', + 'VNI': 100, + 'ACTION': 'SET_OUTBOUND_DIRECTION' + } + }, + + 'DASH_ACL_GROUP': { + 'in_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + }, + 'out_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + } + }, + + 'DASH_VNET': { + 'vnet': { + 'VNI': 1000 + } + }, + + 'DASH_ENI': { + 'eni': { + 'ACL_GROUP': { + 'INBOUND': { + 'STAGE1': '$in_acl_group_id_#{0}', + 'STAGE2': '$in_acl_group_id_#{0}', + 'STAGE3': '$in_acl_group_id_#{0}}', + 'STAGE4': '$in_acl_group_id_#{0}}', + 'STAGE5': '$in_acl_group_id_#{0}}' + }, + 'OUTBOUND': { + 'STAGE1': 0, + 'STAGE2': 0, + 'STAGE3': 0, + 'STAGE4': 0, + 'STAGE5': 0 + } + }, + 'ADMIN_STATE': True, + 'CPS': 10000, + 'FLOWS': 10000, + 'PPS': 100000, + 'VM_UNDERLAY_DIP': "172.16.1.1", + 'VM_VNI': 9, + 'VNET_ID': '$vnet_#{0}' + } + }, + + 'DASH_ENI_ETHER_ADDRESS_MAP': { + 'eam': { + 'SWITCH_ID': '$SWITCH_ID', + 'MAC': "00:cc:cc:cc:00:00", + 'ENI_ID': '$eni_#{0}' + } + }, + + 'DASH_OUTBOUND_ROUTING': { + 'ore': { + 'SWITCH_ID': '$SWITCH_ID', + 'ENI_ID': '$eni_#{0}', + 'DESTINATION': "10.1.0.0/16", + 'ACTION': 'ROUTE_VNET', + 'DST_VNET_ID': '$vnet_#{0}' + } + }, + + 'DASH_OUTBOUND_CA_TO_PA': { + 'ocpe': { + 'SWITCH_ID': '$SWITCH_ID', + 'DST_VNET_ID': '$vnet_#{0}', + 'DIP': "10.1.2.50", + 'UNDERLAY_DIP': "172.16.1.20", + 'OVERLAY_DMAC': "00:DD:DD:DD:00:00", + 'USE_DST_VNET_VNI': True + } + }, + + 'DASH_ACL_GROUP': { + 'in_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + }, + 'out_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + } + } +} + +@pytest.mark.ptf +@pytest.mark.snappi +class TestSaiVnetRoute: + + # @pytest.fixture(scope="module", autouse=True) + # def discovery(dpu): + # dpu.objects_discovery() + + @pytest.mark.ptf + @pytest.mark.snappi + def test_vnet_route_bidirectional_create(self, dpu): + """Generate and apply configuration""" + + with (current_file_dir / 'vnet_route_setup_commands_bidirectional.json').open(mode='r') as config_file: + setup_commands = json.load(config_file) + results = [*dpu.process_commands(setup_commands)] + print("\n======= SAI commands RETURN values =======") + pprint(results) + assert all(results), 'Create error' + + + @pytest.mark.snappi + def test_vnet_route_packet_bidirectional_forwarding_with_route_match(self, dpu, dataplane): + """Verify packet forwarding with route match""" + + """ + Verify same config with high-rate traffic. + packets_per_flow=10 means that each possible packet path will be verified using 10 packet. + NOTE: For BMv2 we keep here PPS limitation + """ + dataplane.set_config() + + inner_pkt_one = simple_udp_packet(eth_dst = "02:02:02:02:02:02", + eth_src = "00:cc:cc:cc:00:00", + ip_dst = "10.1.2.50", + ip_src = "10.1.1.10") + vxlan_pkt_one = simple_vxlan_packet(eth_dst = "00:00:02:03:04:05", + eth_src = "00:00:05:06:06:06", + ip_dst = "172.16.1.100", + ip_src = "172.16.1.1", + udp_sport = 11639, + with_udp_chksum = False, + vxlan_vni = 100, + inner_frame = inner_pkt_one) + + # send_packet(dataplane, 1, vxlan_pkt, 111) + inner_pkt_two = simple_udp_packet(eth_dst = "00:00:00:09:03:14", + eth_src = "00:0a:04:06:06:06", + ip_dst = "172.19.1.100", + ip_src = "172.19.1.1") + vxlan_pkt_two = simple_vxlan_packet(eth_dst = "00:0b:05:06:06:06", + eth_src = "00:0a:05:06:06:06", + ip_dst = "10.10.2.20", + ip_src = "10.10.2.10", + udp_sport = 11638, + with_udp_chksum = False, + vxlan_vni = 60, + inner_frame = inner_pkt_two) + + send_packet(dataplane, 0, vxlan_pkt_one, 111) + send_packet(dataplane, 1, vxlan_pkt_two, 777) + + time.sleep(10) + rows = dataplane.get_all_stats() + print("{}".format(rows[0].name)) + print("Transmission_Frames : {}".format(rows[0].frames_tx)) + print("Recieved_Frames : {}".format(rows[0].frames_rx)) + print("{}".format(rows[1].name)) + print("--------------------------") + print("Transmission_Frames : {}".format(rows[1].frames_tx)) + print("Recieved_Frames : {}".format(rows[1].frames_rx)) + + @pytest.mark.ptf + @pytest.mark.snappi + def test_vnet_route_bidirectional_remove(self, dpu): + """Verify configuration removal""" + + with (current_file_dir / 'vnet_route_setup_commands_bidirectional.json').open(mode='r') as config_file: + setup_commands = json.load(config_file) + cleanup_commands = [] + for cmd in reversed(setup_commands): + cleanup_commands.append({'name': cmd['name'], 'op': 'remove'}) + + results = [*dpu.process_commands(cleanup_commands)] + print("\n======= SAI commands RETURN values =======") + pprint(results) + assert all( + [result == 'SAI_STATUS_SUCCESS' for result in results] + ), 'Remove error' diff --git a/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py b/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py new file mode 100644 index 000000000..018637257 --- /dev/null +++ b/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py @@ -0,0 +1,195 @@ +""" +Verify VNET Route scenario +""" + +import json +from pathlib import Path +from pprint import pprint +import time +import pytest +from saichallenger.common.sai_dataplane.utils.ptf_testutils import (send_packet, + simple_udp_packet, + simple_vxlan_packet, + verify_packet, + verify_no_other_packets) +import sys +sys.path.append("../utils") +import vnet2vnet_helper as dh +current_file_dir = Path(__file__).parent + +# Constants +SWITCH_ID = 5 + +# Simple, non-scaled configuration. +# See README.md for details. + +TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG = { + + "ENI_COUNT": 1, + "ACL_RULES_NSG": 1, + "ACL_TABLE_COUNT": 1, + "IP_PER_ACL_RULE": 1, + "IP_MAPPED_PER_ACL_RULE": 1, + "IP_ROUTE_DIVIDER_PER_ACL_RULE": 1, + + 'DASH_VIP': { + 'vpe': { + 'SWITCH_ID': '$SWITCH_ID', + 'IPV4': "172.16.1.100" + } + }, + + 'DASH_DIRECTION_LOOKUP': { + 'dle': { + 'SWITCH_ID': '$SWITCH_ID', + 'VNI': 100, + 'ACTION': 'SET_OUTBOUND_DIRECTION' + } + }, + + 'DASH_ACL_GROUP': { + 'in_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + }, + 'out_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + } + }, + + 'DASH_VNET': { + 'vnet': { + 'VNI': 1000 + } + }, + + 'DASH_ENI': { + 'eni': { + 'ACL_GROUP': { + 'INBOUND': { + 'STAGE1': '$in_acl_group_id_#{0}', + 'STAGE2': '$in_acl_group_id_#{0}', + 'STAGE3': '$in_acl_group_id_#{0}}', + 'STAGE4': '$in_acl_group_id_#{0}}', + 'STAGE5': '$in_acl_group_id_#{0}}' + }, + 'OUTBOUND': { + 'STAGE1': 0, + 'STAGE2': 0, + 'STAGE3': 0, + 'STAGE4': 0, + 'STAGE5': 0 + } + }, + 'ADMIN_STATE': True, + 'CPS': 10000, + 'FLOWS': 10000, + 'PPS': 100000, + 'VM_UNDERLAY_DIP': "172.16.1.1", + 'VM_VNI': 9, + 'VNET_ID': '$vnet_#{0}' + } + }, + + 'DASH_ENI_ETHER_ADDRESS_MAP': { + 'eam': { + 'SWITCH_ID': '$SWITCH_ID', + 'MAC': "00:cc:cc:cc:00:00", + 'ENI_ID': '$eni_#{0}' + } + }, + + 'DASH_OUTBOUND_ROUTING': { + 'ore': { + 'SWITCH_ID': '$SWITCH_ID', + 'ENI_ID': '$eni_#{0}', + 'DESTINATION': "10.1.0.0/16", + 'ACTION': 'ROUTE_VNET', + 'DST_VNET_ID': '$vnet_#{0}' + } + }, + + 'DASH_OUTBOUND_CA_TO_PA': { + 'ocpe': { + 'SWITCH_ID': '$SWITCH_ID', + 'DST_VNET_ID': '$vnet_#{0}', + 'DIP': "10.1.2.50", + 'UNDERLAY_DIP': "172.16.1.20", + 'OVERLAY_DMAC': "00:DD:DD:DD:00:00", + 'USE_DST_VNET_VNI': True + } + }, + + 'DASH_ACL_GROUP': { + 'in_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + }, + 'out_acl_group_id': { + 'ADDR_FAMILY': 'IPv4' + } + } +} + +@pytest.mark.ptf +@pytest.mark.snappi +class TestSaiVnetRoute: + + # @pytest.fixture(scope="module", autouse=True) + # def discovery(dpu): + # dpu.objects_discovery() + + @pytest.mark.ptf + @pytest.mark.snappi + def test_vnet_route_unidirectional_create(self, dpu): + """Generate and apply configuration""" + + with (current_file_dir / 'vnet_route_setup_commands_unidirectional.json').open(mode='r') as config_file: + setup_commands = json.load(config_file) + results = [*dpu.process_commands(setup_commands)] + print("\n======= SAI commands RETURN values =======") + pprint(results) + assert all(results), 'Create error' + + + @pytest.mark.snappi + def test_vnet_route_packet_unidirectional_forwarding_with_route_match(self, dpu, dataplane): + """Verify packet forwarding with route match""" + + """ + Verify same config with high-rate traffic. + packets_per_flow=10 means that each possible packet path will be verified using 10 packet. + NOTE: For BMv2 we keep here PPS limitation + """ + dh.scale_vnet_outbound_flows(dataplane, TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG, packets_per_flow=10, pps_per_flow=10) + dataplane.set_config() + dataplane.start_traffic() + # stu.wait_for(lambda: dh.check_flow_packets_metrics(dataplane, dataplane.flows[0], show=True)[0], + # "Test", timeout_seconds=10) + + time.sleep(10) + rows = dataplane.get_all_stats() + print("{}".format(rows[0].name)) + print("--------------------------") + print("Tx_Frames : {}".format(rows[0].frames_tx)) + print("Rx_Frames : {}".format(rows[0].frames_rx)) + print("{}".format(rows[1].name)) + print("--------------------------") + print("Tx_Frames : {}".format(rows[1].frames_tx)) + print("Rx_Frames : {}".format(rows[1].frames_rx)) + + @pytest.mark.ptf + @pytest.mark.snappi + def test_vnet_route_unidirectional_remove(self, dpu): + """Verify configuration removal""" + + with (current_file_dir / 'vnet_route_setup_commands_unidirectional.json').open(mode='r') as config_file: + setup_commands = json.load(config_file) + cleanup_commands = [] + for cmd in reversed(setup_commands): + cleanup_commands.append({'name': cmd['name'], 'op': 'remove'}) + + results = [*dpu.process_commands(cleanup_commands)] + print("\n======= SAI commands RETURN values =======") + pprint(results) + assert all( + [result == 'SAI_STATUS_SUCCESS' for result in results] + ), 'Remove error' diff --git a/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json b/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json new file mode 100644 index 000000000..d753b921a --- /dev/null +++ b/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json @@ -0,0 +1,358 @@ +[ + { + "name": "vpe", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": "172.16.1.100" + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", + "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "vpe_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": "10.10.2.20" + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", + "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "dle", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "100" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", + "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "dle_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "60" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", + "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "in_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", + "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "out_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", + "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "vnet", + "op": "create", + "type": "SAI_OBJECT_TYPE_VNET", + "attributes": [ + "SAI_VNET_ATTR_VNI", + "100" + ] + }, + { + "name": "vnet_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_VNET", + "attributes": [ + "SAI_VNET_ATTR_VNI", + "60" + ] + }, + { + "name": "eni", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + "172.16.1.1", + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", + "0" + ] + }, + { + "name": "eni_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + "10.10.2.10", + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", + "0" + ] + }, + { + "name": "eam", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": "00:CC:CC:CC:00:00" + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", + "$eni" + ] + }, + { + "name": "eam_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": "00:0a:04:06:06:06" + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", + "$eni" + ] + }, + { + "name": "ore", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni", + "destination": "10.1.0.0/16" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", + "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", + "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", + "0" + ] + }, + { + "name": "ore_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni", + "destination": "172.19.0.0/16" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", + "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", + "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", + "0" + ] + }, + { + "name": "ocpe", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "10.1.2.50" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", + "172.16.1.20", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", + "00:DD:DD:DD:00:00", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" + ] + }, + { + "name": "ocpe_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "172.19.1.100" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", + "10.10.2.15", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", + "00:BB:BB:BB:00:00", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" + ] + }, + { + "name": "route_entry_3", + "op": "create", + "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vr_id": "10", + "destination": "10.0.0.20/8" + }, + "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", + "1" + ] + }, + { + "name": "route_entry_4", + "op": "create", + "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vr_id": "10", + "destination": "172.0.0.10/8" + }, + "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", + "2" + ] + } +] diff --git a/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json b/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json new file mode 100644 index 000000000..574fb7363 --- /dev/null +++ b/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json @@ -0,0 +1,189 @@ +[ + { + "name": "vpe", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": "172.16.1.100" + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", + "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "dle", + "op": "create", + "type": "SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vni": "100" + }, + "attributes": [ + "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION", + "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION" + ] + }, + { + "name": "in_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", + "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "out_acl_group_id", + "op": "create", + "type": "SAI_OBJECT_TYPE_DASH_ACL_GROUP", + "attributes": [ + "SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY", + "SAI_IP_ADDR_FAMILY_IPV4" + ] + }, + { + "name": "vnet", + "op": "create", + "type": "SAI_OBJECT_TYPE_VNET", + "attributes": [ + "SAI_VNET_ATTR_VNI", + "1000" + ] + }, + { + "name": "eni", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + "172.16.1.1", + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", + "0" + ] + }, + { + "name": "eam", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "address": "00:CC:CC:CC:00:00" + }, + "attributes": [ + "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID", + "$eni" + ] + }, + { + "name": "ore", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "eni_id": "$eni", + "destination": "10.1.0.0/16" + }, + "attributes": [ + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION", + "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID", + "$vnet", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN", + "False", + "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS", + "0" + ] + }, + { + "name": "ocpe", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "10.1.2.50" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", + "172.16.1.20", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", + "00:DD:DD:DD:00:00", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" + ] + }, + { + "name": "route_entry_1", + "op": "create", + "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vr_id": "10", + "destination": "0.0.0.0/0" + }, + "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", + "1" + ] + } +] From dff420572539e22341febf1c62c789330fc7f74d Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 2 Aug 2023 19:54:02 +0200 Subject: [PATCH 43/75] [SAI] Refactor libsai and add propper logger (#416) Add proper logger class for logging inside libsai, for now data will be logged into stderr and syslog, later on this could be changed to select only one output. Logger is simpler version of sonic-swss-common/common/logger. Many changes are done in refactoring: internal generated functions are marked static whitespace on line ends are removed compiler warning flags are added unnecessary includes are removed DASH_LOG_ENTER macro added on every function return proper sai statuses instead of 0/-1 api implementations are prefixed dash_ and marked as DASH_PRIVATE to not export outside library extern C added to sai.h to make proper C bindings instead of C++ make proper sai api call using sai_api_query for vnet_out.cpp test, since previous one does not compile after moving functions private prefix macros using DASH_ change fprintf stderr to new DASH logger return SAI_STATUS_NOT_SUPPORTED instead of SAI_STATUS_SUCCESS on sai_*get api when attribute is not implemented (suspended since it's causing ptf test to fail) return not implemented on global sai_* apis when api is actually not implemented mutex will use lock_guard instead of manual lock/unlock update gitignore to skip temporary files --- .gitignore | 2 + dash-pipeline/SAI/sai_api_gen.py | 2 +- dash-pipeline/SAI/templates/Makefile.j2 | 50 ++- dash-pipeline/SAI/templates/logger.cpp.j2 | 61 ++++ dash-pipeline/SAI/templates/logger.h.j2 | 66 ++++ dash-pipeline/SAI/templates/saiapi.cpp.j2 | 188 +++++----- .../SAI/templates/saifixedapis.cpp.j2 | 343 ++++++++++-------- dash-pipeline/SAI/templates/saiimpl.h.j2 | 10 + dash-pipeline/SAI/templates/utils.cpp.j2 | 104 +++--- dash-pipeline/SAI/templates/utils.h.j2 | 42 ++- .../tests/libsai/vnet_out/vnet_out.cpp | 91 ++--- 11 files changed, 588 insertions(+), 371 deletions(-) create mode 100644 dash-pipeline/SAI/templates/logger.cpp.j2 create mode 100644 dash-pipeline/SAI/templates/logger.h.j2 create mode 100644 dash-pipeline/SAI/templates/saiimpl.h.j2 diff --git a/.gitignore b/.gitignore index eaf8d3c7a..1bb56ecf9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +**~ +**.swp .DS_STORE .idea *.bkp diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 202ba9c3d..86b8f7800 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -381,7 +381,7 @@ def write_sai_makefile(sai_api_name_list, sai_api_full_name_list): def write_sai_fixed_api_files(sai_api_full_name_list): env = Environment(loader=FileSystemLoader('.')) - for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp']: + for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp', 'saiimpl.h', 'logger.h', 'logger.cpp']: env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) sai_impl_tm = env.get_template('/templates/%s.j2' % filename) sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], api_names = sai_api_full_name_list) diff --git a/dash-pipeline/SAI/templates/Makefile.j2 b/dash-pipeline/SAI/templates/Makefile.j2 index 89417578a..d7ae6d006 100644 --- a/dash-pipeline/SAI/templates/Makefile.j2 +++ b/dash-pipeline/SAI/templates/Makefile.j2 @@ -2,6 +2,52 @@ # THIS MAKEFILE IS AUTO-GENERATED FROM templates/Makefile.j2 # DO NOT MODIFY +CXXFLAGS_COMMON= +CXXFLAGS_COMMON+= -ansi +CXXFLAGS_COMMON+= -fPIC +CXXFLAGS_COMMON+= -pipe +CXXFLAGS_COMMON+= -std=c++11 +CXXFLAGS_COMMON+= -Wall +CXXFLAGS_COMMON+= -Wcast-align +CXXFLAGS_COMMON+= -Wcast-qual +CXXFLAGS_COMMON+= -Wconversion +CXXFLAGS_COMMON+= -Wdisabled-optimization +#CXXFLAGS_COMMON+= -Werror # disabled until warnings will be fixed +CXXFLAGS_COMMON+= -Wextra +CXXFLAGS_COMMON+= -Wfloat-equal +CXXFLAGS_COMMON+= -Wformat=2 +CXXFLAGS_COMMON+= -Wformat-nonliteral +CXXFLAGS_COMMON+= -Wformat-security +CXXFLAGS_COMMON+= -Wformat-y2k +CXXFLAGS_COMMON+= -Wimport +CXXFLAGS_COMMON+= -Winit-self +CXXFLAGS_COMMON+= -Wno-inline +CXXFLAGS_COMMON+= -Winvalid-pch +CXXFLAGS_COMMON+= -Wmissing-field-initializers +CXXFLAGS_COMMON+= -Wmissing-format-attribute +CXXFLAGS_COMMON+= -Wmissing-include-dirs +CXXFLAGS_COMMON+= -Wmissing-noreturn +CXXFLAGS_COMMON+= -Wno-aggregate-return +CXXFLAGS_COMMON+= -Wno-padded +CXXFLAGS_COMMON+= -Wno-switch-enum +CXXFLAGS_COMMON+= -Wno-unused-parameter +CXXFLAGS_COMMON+= -Wpacked +CXXFLAGS_COMMON+= -Wpointer-arith +CXXFLAGS_COMMON+= -Wredundant-decls +CXXFLAGS_COMMON+= -Wshadow +CXXFLAGS_COMMON+= -Wstack-protector +CXXFLAGS_COMMON+= -Wstrict-aliasing=3 +CXXFLAGS_COMMON+= -Wswitch +CXXFLAGS_COMMON+= -Wswitch-default +CXXFLAGS_COMMON+= -Wunreachable-code +CXXFLAGS_COMMON+= -Wunused +CXXFLAGS_COMMON+= -Wvariadic-macros +CXXFLAGS_COMMON+= -Wwrite-strings +CXXFLAGS_COMMON+= -Wno-switch-default +CXXFLAGS_COMMON+= -Wconversion +CXXFLAGS_COMMON+= -Wno-psabi +CXXFLAGS_COMMON+= -Wno-unused-label + # Sources from OCP SAI Repo: SAI_DIR=../SAI/meta/ SAI_SRCS=saimetadatautils.c \ @@ -13,7 +59,8 @@ SAI_OBJS=$(SAI_SRCS:.c=.o) # DASH libsai "fixed" sources (not generated from P4 code) DASH_FIXED_SAI_SRCS=utils.cpp \ - saifixedapis.cpp + saifixedapis.cpp \ + logger.cpp DASH_FIXED_SAI_OBJ=$(DASH_FIXED_SAI_SRCS:.cpp=.o) # DASH libsai "generated" sources (from P4 code) @@ -38,6 +85,7 @@ libsai.so: $(DASH_FIXED_SAI_SRCS) $(DASH_GEN_SAI_SRCS) -I ../SAI/experimental/ \ -fPIC \ -g \ + $(CXXFLAGS_COMMON) \ $(GXX_FLAGS) \ $(DASH_FIXED_SAI_SRCS) \ $(DASH_GEN_SAI_SRCS) diff --git a/dash-pipeline/SAI/templates/logger.cpp.j2 b/dash-pipeline/SAI/templates/logger.cpp.j2 new file mode 100644 index 000000000..afa9d622f --- /dev/null +++ b/dash-pipeline/SAI/templates/logger.cpp.j2 @@ -0,0 +1,61 @@ +#include "logger.h" + +#include +#include +#include + +using namespace dash; + +Logger &Logger::getInstance() +{ + static Logger m_logger; + + return m_logger; +} + +void Logger::setMinPrio(Priority prio) +{ + getInstance().m_minPrio = prio; +} + +Logger::Priority Logger::getMinPrio() +{ + return getInstance().m_minPrio; +} + +void Logger::write(Priority prio, const char *fmt, ...) +{ + if (prio > m_minPrio) + return; + + // print to syslog + { + va_list ap; + va_start(ap, fmt); + + vsyslog(prio, fmt, ap); + + va_end(ap); + } + + // print to stderr + { + va_list ap; + va_start(ap, fmt); + + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + + va_end(ap); + } +} + +Logger::ScopeLogger::ScopeLogger(int line, const char *fun) : m_line(line), m_fun(fun) +{ + dash::Logger::getInstance().write(dash::Logger::DASH_DEBUG, "d:> %s: enter", m_fun); +} + +Logger::ScopeLogger::~ScopeLogger() +{ + dash::Logger::getInstance().write(dash::Logger::DASH_DEBUG, "d:< %s: exit", m_fun); +} diff --git a/dash-pipeline/SAI/templates/logger.h.j2 b/dash-pipeline/SAI/templates/logger.h.j2 new file mode 100644 index 000000000..7cd070027 --- /dev/null +++ b/dash-pipeline/SAI/templates/logger.h.j2 @@ -0,0 +1,66 @@ +#pragma once + +#include + +#define DASH_LOG_ERROR(MSG, ...) dash::Logger::getInstance().write(dash::Logger::DASH_ERROR, "e:- %s: " MSG, __FUNCTION__, ##__VA_ARGS__) +#define DASH_LOG_WARN(MSG, ...) dash::Logger::getInstance().write(dash::Logger::DASH_WARN, "w:- %s: " MSG, __FUNCTION__, ##__VA_ARGS__) +#define DASH_LOG_NOTICE(MSG, ...) dash::Logger::getInstance().write(dash::Logger::DASH_NOTICE, "n:- %s: " MSG, __FUNCTION__, ##__VA_ARGS__) +#define DASH_LOG_INFO(MSG, ...) dash::Logger::getInstance().write(dash::Logger::DASH_INFO, "i:- %s: " MSG, __FUNCTION__, ##__VA_ARGS__) +#define DASH_LOG_DEBUG(MSG, ...) dash::Logger::getInstance().write(dash::Logger::DASH_DEBUG, "d:- %s: " MSG, __FUNCTION__, ##__VA_ARGS__) + +#define DASH_LOG_ENTER() dash::Logger::ScopeLogger logger ## __LINE__ (__LINE__, __FUNCTION__) + +namespace dash +{ + class Logger + { + public: + + // same as syslog + enum Priority + { + DASH_EMERG, + DASH_ALERT, + DASH_CRIT, + DASH_ERROR, + DASH_WARN, + DASH_NOTICE, + DASH_INFO, + DASH_DEBUG + }; + + static Logger &getInstance(); + + static void setMinPrio(Priority prio); + + static Priority getMinPrio(); + + void write(Priority prio, const char *fmt, ...) +#ifdef __GNUC__ + __attribute__ ((format (printf, 3, 4))) +#endif + ; + + class ScopeLogger + { + public: + + ScopeLogger(int line, const char *fun); + ~ScopeLogger(); + + private: + const int m_line; + const char *m_fun; + }; + + private: + + Logger() = default; + ~Logger() = default; + + Logger(const Logger&) = delete; + Logger &operator=(const Logger&) = delete; + + std::atomic m_minPrio = { DASH_NOTICE }; + }; +} diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 9ec8461ac..701058aa1 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -1,29 +1,4 @@ -#include -#include -#include -#include -#include -#include -#include -#include "p4/v1/p4runtime.grpc.pb.h" #include "utils.h" -#include "sai{{ header_prefix }}{{ app_name | replace('_', '') }}.h" -#include "saitypes.h" -#include "saistatus.h" -#include -#include -#include - -#if __APPLE__ -#include -#else -#include -#include -#endif - -#define LOG(x) std::cerr<add_params(); - param->set_param_id({{param.v4_or_v6_id}}); - booldataSetVal((attr_list[i].value.ipaddr.addr_family == SAI_IP_ADDR_FAMILY_IPV4) ? 0 : 1, param, 1); + auto param2 = action->add_params(); + param2->set_param_id({{param.v4_or_v6_id}}); + booldataSetVal((attr_list[i].value.ipaddr.addr_family == SAI_IP_ADDR_FAMILY_IPV4) ? 0 : 1, param2, 1); //matchedParams++; } {% endif %} @@ -187,8 +164,8 @@ sai_status_t sai_create_{{ table.name }}( {% endfor %} } } - - //assert((matchedParams == expectedParams)); + + //assert((matchedParams == expectedParams)); //if (matchedParams != expectedParams) { // goto ErrRet; @@ -200,25 +177,28 @@ sai_status_t sai_create_{{ table.name }}( {% endfor %} *{{ table.name }}_id = objId; - return 0; + return SAI_STATUS_SUCCESS; ErrRet: delete matchActionEntry; RemoveFromTable(*{{ table.name }}_id); - return -1; + return SAI_STATUS_FAILURE; } -sai_status_t sai_create_{{ table.name }}s( +static sai_status_t dash_sai_create_{{ table.name }}s( _In_ sai_object_id_t switch_id, _In_ uint32_t object_count, _In_ const uint32_t *attr_count, _In_ const sai_attribute_t **attr_list, _In_ sai_bulk_op_error_mode_t mode, _Out_ sai_object_id_t *object_id, - _Out_ sai_status_t *object_statuses) { + _Out_ sai_status_t *object_statuses) +{ + DASH_LOG_ENTER(); + sai_status_t agg_status = SAI_STATUS_SUCCESS; for (uint32_t i = 0; i < object_count; i++) { - object_statuses[i] = sai_create_{{ table.name }}(&object_id[i], switch_id, attr_count[i], attr_list[i]); + object_statuses[i] = dash_sai_create_{{ table.name }}(&object_id[i], switch_id, attr_count[i], attr_list[i]); if (object_statuses[i] != SAI_STATUS_SUCCESS) { agg_status = SAI_STATUS_FAILURE; @@ -232,22 +212,30 @@ sai_status_t sai_create_{{ table.name }}s( return agg_status; } -sai_status_t sai_remove_{{ table.name }}(_In_ sai_object_id_t {{ table.name }}_id) { - if (RemoveFromTable({{ table.name }}_id)) { - return 0; +static sai_status_t dash_sai_remove_{{ table.name }}(_In_ sai_object_id_t {{ table.name }}_id) +{ + DASH_LOG_ENTER(); + + if (RemoveFromTable({{ table.name }}_id)) + { + return SAI_STATUS_SUCCESS; } - return -1; + + return SAI_STATUS_FAILURE; } -sai_status_t sai_remove_{{ table.name }}s( +static sai_status_t dash_sai_remove_{{ table.name }}s( _In_ uint32_t object_count, _In_ const sai_object_id_t *object_id, _In_ sai_bulk_op_error_mode_t mode, - _Out_ sai_status_t *object_statuses) { + _Out_ sai_status_t *object_statuses) +{ + DASH_LOG_ENTER(); + sai_status_t agg_status = SAI_STATUS_SUCCESS; for (uint32_t i = 0; i < object_count; i++) { - object_statuses[i] = sai_remove_{{ table.name }}(object_id[i]); + object_statuses[i] = dash_sai_remove_{{ table.name }}(object_id[i]); if (object_statuses[i] != SAI_STATUS_SUCCESS) { agg_status = SAI_STATUS_FAILURE; @@ -261,25 +249,32 @@ sai_status_t sai_remove_{{ table.name }}s( return agg_status; } -sai_status_t sai_set_{{ table.name }}_attribute ( +static sai_status_t dash_sai_set_{{ table.name }}_attribute ( _In_ sai_object_id_t {{ table.name }}_id, - _In_ const sai_attribute_t *attr) { + _In_ const sai_attribute_t *attr) +{ + DASH_LOG_ENTER(); assert(0 && "sai_set_{{ table.name }}_attribute NYI"); - return -1; + return SAI_STATUS_FAILURE; } -sai_status_t sai_get_{{ table.name }}_attribute( +static sai_status_t dash_sai_get_{{ table.name }}_attribute( _In_ sai_object_id_t {{ table.name }}_id, _In_ uint32_t attr_count, - _Inout_ sai_attribute_t *attr_list) { + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); assert(0 && "sai_get_{{ table.name }}_attribute NYI"); - return -1; + return SAI_STATUS_FAILURE; } {% else %} -sai_status_t sai_create_{{ table.name }}( +static sai_status_t dash_sai_create_{{ table.name }}( _In_ const sai_{{ table.name }}_t *{{ table.name }}, _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list) { + _In_ const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + p4::v1::TableEntry * matchActionEntry = new p4::v1::TableEntry(); pi_p4_id_t tableId = {{table.id}}; matchActionEntry->set_table_id(tableId); @@ -333,12 +328,12 @@ sai_status_t sai_create_{{ table.name }}( //expectedParams = {{ action.params|length }}; {% endfor %} {% else %} - // Search the action + // Search the action for (uint32_t i = 0; i < attr_count; i++) { switch(attr_list[i].value.s32) { {% for action in table.actions %} case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { - actionId = {{action.id}}; + actionId = {{action.id}}; //expectedParams = {{ action.params|length }}; break; } @@ -363,9 +358,9 @@ sai_status_t sai_create_{{ table.name }}( {% if 'v4_or_v6_id' in param %} { // set v4_or_v6 field - auto param = action->add_params(); - param->set_param_id({{param.v4_or_v6_id}}); - booldataSetVal((attr_list[i].value.ipaddr.addr_family == SAI_IP_ADDR_FAMILY_IPV4) ? 0 : 1, param, 1); + auto param2 = action->add_params(); + param2->set_param_id({{param.v4_or_v6_id}}); + booldataSetVal((attr_list[i].value.ipaddr.addr_family == SAI_IP_ADDR_FAMILY_IPV4) ? 0 : 1, param2, 1); //matchedParams++; } {% endif %} @@ -375,8 +370,8 @@ sai_status_t sai_create_{{ table.name }}( {% endfor %} } } - - //assert((matchedParams == expectedParams)); + + //assert((matchedParams == expectedParams)); //if (matchedParams != expectedParams) { // goto ErrRet; @@ -385,24 +380,27 @@ sai_status_t sai_create_{{ table.name }}( retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK == retCode) { delete matchActionEntry; - return 0; + return SAI_STATUS_SUCCESS; } ErrRet: delete matchActionEntry; - return -1; + return SAI_STATUS_FAILURE; } -sai_status_t sai_create_{{ table.name | replace("entry", "entries") }}( +static sai_status_t dash_sai_create_{{ table.name | replace("entry", "entries") }}( _In_ uint32_t object_count, _In_ const sai_{{ table.name }}_t *{{ table.name }}, _In_ const uint32_t *attr_count, _In_ const sai_attribute_t **attr_list, _In_ sai_bulk_op_error_mode_t mode, - _Out_ sai_status_t *object_statuses) { + _Out_ sai_status_t *object_statuses) +{ + DASH_LOG_ENTER(); + sai_status_t agg_status = SAI_STATUS_SUCCESS; for (uint32_t i = 0; i < object_count; i++) { - object_statuses[i] = sai_create_{{ table.name }}(&{{ table.name }}[i], attr_count[i], attr_list[i]); + object_statuses[i] = dash_sai_create_{{ table.name }}(&{{ table.name }}[i], attr_count[i], attr_list[i]); if (object_statuses[i] != SAI_STATUS_SUCCESS) { agg_status = SAI_STATUS_FAILURE; @@ -417,8 +415,11 @@ sai_status_t sai_create_{{ table.name | replace("entry", "entries") }}( } -sai_status_t sai_remove_{{ table.name }}( - _In_ const sai_{{ table.name }}_t *{{ table.name }}) { +static sai_status_t dash_sai_remove_{{ table.name }}( + _In_ const sai_{{ table.name }}_t *{{ table.name }}) +{ + DASH_LOG_ENTER(); + p4::v1::TableEntry * matchActionEntry = new p4::v1::TableEntry(); pi_p4_id_t tableId = {{table.id}}; matchActionEntry->set_table_id(tableId); @@ -461,24 +462,27 @@ sai_status_t sai_remove_{{ table.name }}( retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_DELETE); if (grpc::StatusCode::OK == retCode) { delete matchActionEntry; - return 0; + return SAI_STATUS_SUCCESS; } ErrRet: delete matchActionEntry; - return -1; + return SAI_STATUS_FAILURE; } -sai_status_t sai_remove_{{ table.name | replace("entry", "entries") }}( +static sai_status_t dash_sai_remove_{{ table.name | replace("entry", "entries") }}( _In_ uint32_t object_count, _In_ const sai_{{ table.name }}_t *{{ table.name }}, _In_ sai_bulk_op_error_mode_t mode, - _Out_ sai_status_t *object_statuses) { + _Out_ sai_status_t *object_statuses) +{ + DASH_LOG_ENTER(); + sai_status_t agg_status = SAI_STATUS_SUCCESS; for (uint32_t i = 0; i < object_count; i++) { - object_statuses[i] = sai_remove_{{ table.name }}(&{{ table.name }}[i]); + object_statuses[i] = dash_sai_remove_{{ table.name }}(&{{ table.name }}[i]); if (object_statuses[i] != SAI_STATUS_SUCCESS) { agg_status = SAI_STATUS_FAILURE; @@ -492,39 +496,43 @@ sai_status_t sai_remove_{{ table.name | replace("entry", "entries") }}( return agg_status; } -sai_status_t sai_set_{{ table.name }}_attribute( +static sai_status_t dash_sai_set_{{ table.name }}_attribute( _In_ const sai_{{ table.name }}_t *{{ table.name }}, - _In_ const sai_attribute_t *attr) { - assert(0 && "sai_set_{{ table.name }}_attribute NYI"); - return -1; + _In_ const sai_attribute_t *attr) +{ + DASH_LOG_ENTER(); + assert(0 && "sai_set_{{ table.name }}_attribute NYI"); + return SAI_STATUS_FAILURE; } -sai_status_t sai_get_{{ table.name }}_attribute( +static sai_status_t dash_sai_get_{{ table.name }}_attribute( _In_ const sai_{{ table.name }}_t *{{ table.name }}, _In_ uint32_t attr_count, - _Inout_ sai_attribute_t *attr_list) { - assert(0 && "sai_get_{{ table.name }}_attribute NYI"); - return -1; + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + assert(0 && "sai_get_{{ table.name }}_attribute NYI"); + return SAI_STATUS_FAILURE; } {% endif %} {% endfor %} /* TODO [cs] Generate .h file for _impl to use within sai_api_query() */ -sai_{{ app_name }}_api_t sai_{{app_name }}_api_impl = { +sai_{{ app_name }}_api_t dash_sai_{{ app_name }}_api_impl = { {% set registered_group = [] %} {% for table in tables %} {% if table.name in registered_group %}{% continue %}{% endif %} {% do registered_group.append( table.name ) %} - .create_{{ table.name }} = sai_create_{{ table.name }}, - .remove_{{ table.name }} = sai_remove_{{ table.name }}, - .set_{{ table.name }}_attribute = sai_set_{{ table.name }}_attribute, - .get_{{ table.name }}_attribute = sai_get_{{ table.name }}_attribute, + .create_{{ table.name }} = dash_sai_create_{{ table.name }}, + .remove_{{ table.name }} = dash_sai_remove_{{ table.name }}, + .set_{{ table.name }}_attribute = dash_sai_set_{{ table.name }}_attribute, + .get_{{ table.name }}_attribute = dash_sai_get_{{ table.name }}_attribute, {% if table.is_object == 'true' %} - .create_{{ table.name }}s = sai_create_{{ table.name }}s, - .remove_{{ table.name }}s = sai_remove_{{ table.name }}s, + .create_{{ table.name }}s = dash_sai_create_{{ table.name }}s, + .remove_{{ table.name }}s = dash_sai_remove_{{ table.name }}s, {% else %} - .create_{{ table.name | replace("entry", "entries") }} = sai_create_{{ table.name | replace("entry", "entries") }}, - .remove_{{ table.name | replace("entry", "entries") }} = sai_remove_{{ table.name | replace("entry", "entries") }}, + .create_{{ table.name | replace("entry", "entries") }} = dash_sai_create_{{ table.name | replace("entry", "entries") }}, + .remove_{{ table.name | replace("entry", "entries") }} = dash_sai_remove_{{ table.name | replace("entry", "entries") }}, {% endif %} {% endfor %} }; diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 6805b9560..ff8e1cd0f 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -2,136 +2,130 @@ * Fixed SAI APIs which are not based on P4 pipeline code. * Just sufficient to support testing & integrating bmv2's libsai. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "p4/v1/p4runtime.grpc.pb.h" #include "utils.h" -extern "C" { -#include "sai.h" -#include "saiobject.h" -#include "saistatus.h" -#include "saitypes.h" -#include "saiextensions.h" -#include "sairoute.h" // TODO: Change to template generated values -} -#include -#include -#include - -#if __APPLE__ -#include -#else -#include -#include -#endif - -using namespace std; +#include "saiimpl.h" // TODO to be moved to separate class/namespace static std::shared_ptr _grpcChannel; extern std::unique_ptr stub; -#define DASH_BMV2_NUM_PORTS 2 +#define DASH_BMV2_NUM_PORTS 2 #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 -#define OJBTYPE_SHFT 48 -#define MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype<id) { - - case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: - attr->value.u32 = DASH_BMV2_NUM_PORTS; - fprintf(stderr, " sai_get_switch_attribute() [%d] attr %d SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d\n", - i, attr->id, attr->value.u32); - return SAI_STATUS_SUCCESS; - - case SAI_SWITCH_ATTR_PORT_LIST: - - attr->value.objlist.count = DASH_BMV2_NUM_PORTS; - - for (uint32_t i = 0; i < DASH_BMV2_NUM_PORTS; i++) - { - attr->value.objlist.list[i] = port_list[i]; - } - - fprintf(stderr, " sai_get_switch_attribute() [%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]\n", - i, attr->id, DASH_BMV2_NUM_PORTS); - return SAI_STATUS_SUCCESS; - - case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID: - attr->value.oid = DASH_BMV2_DEFAULT_VLAN_ID; - fprintf(stderr, " sai_get_switch_attribute() [%d] attr %d SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx\n", - i, attr->id, attr->value.oid); - return SAI_STATUS_SUCCESS; - - case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID: - attr->value.oid = DASH_BMV2_DEFAULT_VRF_ID; - fprintf(stderr, " sai_get_switch_attribute() [0] attr %d SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx\n", attr->id, attr->value.oid); - return SAI_STATUS_SUCCESS; - - case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID: - attr->value.oid = DASH_BMV2_DEFAULT_1Q_BRIDGE_ID; - fprintf(stderr, " sai_get_switch_attribute() [0] attr %d SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx\n", attr->id, attr->value.oid); - return SAI_STATUS_SUCCESS; - - case SAI_SWITCH_ATTR_CPU_PORT: - attr->value.oid = DASH_BMV2_DEFAULT_CPU_PORT_ID; - fprintf(stderr, " sai_get_switch_attribute() [%d] attr %d DASH_BMV2_DEFAULT_CPU_PORT_ID = %lx\n", - i, attr->id, attr->value.oid); - return SAI_STATUS_SUCCESS; - default: - fprintf(stderr, " sai_get_switch_attribute() [0] attr %d is NOT SUPPORTED - returning SAI_STATUS_SUCCESS anyway\n", attr->id); - return SAI_STATUS_SUCCESS; + for (uint32_t i = 0; i < attr_count ; i++, attr++) + { + switch(attr->id) + { + case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: + + attr->value.u32 = DASH_BMV2_NUM_PORTS; + + DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->id, attr->value.u32); + + break; + + case SAI_SWITCH_ATTR_PORT_LIST: + + attr->value.objlist.count = DASH_BMV2_NUM_PORTS; + + for (uint32_t j = 0; j < DASH_BMV2_NUM_PORTS; j++) + { + attr->value.objlist.list[j] = port_list[j]; + } + + DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, attr->id, DASH_BMV2_NUM_PORTS); + + break; + + case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID: + + attr->value.oid = DASH_BMV2_DEFAULT_VLAN_ID; + + DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->id, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID: + + attr->value.oid = DASH_BMV2_DEFAULT_VRF_ID; + + DASH_LOG_NOTICE("attr %d SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", attr->id, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID: + + attr->value.oid = DASH_BMV2_DEFAULT_1Q_BRIDGE_ID; + + DASH_LOG_NOTICE("attr %d SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", attr->id, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_CPU_PORT: + + attr->value.oid = DASH_BMV2_DEFAULT_CPU_PORT_ID; + + DASH_LOG_NOTICE("[%d] attr %d DASH_BMV2_DEFAULT_CPU_PORT_ID = %lx", i, attr->id, attr->value.oid); + + break; + + default: + + DASH_LOG_WARN("attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", attr->id); + + memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage + + break; // TODO FIXME should return NOT SUPPORTED } } + return SAI_STATUS_SUCCESS; } -static sai_switch_api_t sai_switch_api_impl = { - .create_switch = sai_create_switch_dummy, +sai_switch_api_t dash_sai_switch_api_impl = { + .create_switch = dash_sai_create_switch, .remove_switch = 0, .set_switch_attribute = 0, - .get_switch_attribute = sai_get_switch_attribute, + .get_switch_attribute = dash_sai_get_switch_attribute, .get_switch_stats = 0, .get_switch_stats_ext = 0, .clear_switch_stats = 0, @@ -140,40 +134,50 @@ static sai_switch_api_t sai_switch_api_impl = { .create_switch_tunnel = 0, .remove_switch_tunnel = 0, .set_switch_tunnel_attribute = 0, - .get_switch_tunnel_attribute = 0 + .get_switch_tunnel_attribute = 0, }; - -sai_status_t sai_get_port_attribute( +static sai_status_t dash_sai_get_port_attribute( _In_ sai_object_id_t port_id, _In_ uint32_t attr_count, - _Inout_ sai_attribute_t *attr_list) { + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + + DASH_LOG_NOTICE("dash_sai_get_port_attribute()"); - fprintf(stderr, "sai_get_port_attribute()\n"); - int i; sai_attribute_t *attr = attr_list; - for (i = 0; i < attr_count ; i++, attr++) { - switch(attr->id) { - case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES: - attr->value.u32 = DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES; - fprintf(stderr, " sai_get_port_attribute() [0] attr %d SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d\n", attr->id, attr->value.u32); - return SAI_STATUS_SUCCESS; + for (uint32_t i = 0; i < attr_count ; i++, attr++) + { + switch(attr->id) + { + case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES: - default: - fprintf(stderr, " sai_get_port_attribute() [0] attr %d is NOT SUPPORTED - returning SAI_STATUS_SUCCESS anyway\n", attr->id); - return SAI_STATUS_SUCCESS; + attr->value.u32 = DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES; + + DASH_LOG_NOTICE("attr %d SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", attr->id, attr->value.u32); + + break; + + default: + + DASH_LOG_WARN("attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", attr->id); + + memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage + + break; // TODO FIXME should return NOT SUPPORTED } } return SAI_STATUS_SUCCESS; } -static sai_port_api_t sai_port_api_impl = { +sai_port_api_t dash_sai_port_api_impl = { .create_port = 0, .remove_port = 0, .set_port_attribute = 0, - .get_port_attribute = sai_get_port_attribute, + .get_port_attribute = dash_sai_get_port_attribute, .get_port_stats = 0, .get_port_stats_ext = 0, .clear_port_stats = 0, @@ -199,74 +203,95 @@ static sai_port_api_t sai_port_api_impl = { .get_ports_attribute = 0 }; - -{% for api in api_names %} -extern sai_{{ api }}_api_t sai_{{ api }}_api_impl; -{% endfor %} - - sai_status_t sai_api_query( _In_ sai_api_t api, - _Out_ void **api_method_table) { + _Out_ void **api_method_table) +{ + DASH_LOG_ENTER(); - switch(api) { + switch((int)api) { case SAI_API_SWITCH: - *api_method_table = (void *)&sai_switch_api_impl; + *api_method_table = (void *)&dash_sai_switch_api_impl; break; - + case SAI_API_PORT: - *api_method_table = (void *)&sai_port_api_impl; + *api_method_table = (void *)&dash_sai_port_api_impl; break; - + {% for api in api_names %} case SAI_API_{{ api | upper }}: - *api_method_table = (void *)&sai_{{ api }}_api_impl; + *api_method_table = (void *)&dash_sai_{{ api }}_api_impl; break; - + {% endfor %} default: + + DASH_LOG_WARN("api %d not supported", api); + return SAI_STATUS_NOT_SUPPORTED; + } - } - return SAI_STATUS_SUCCESS; + return SAI_STATUS_SUCCESS; } - sai_status_t sai_object_type_get_availability( _In_ sai_object_id_t switch_id, _In_ sai_object_type_t object_type, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list, - _Out_ uint64_t *count) { return SAI_STATUS_SUCCESS; } - + _Out_ uint64_t *count) +{ + DASH_LOG_ENTER(); + + DASH_LOG_WARN("not implemented"); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + sai_object_type_t sai_object_type_query( - _In_ sai_object_id_t object_id) { return sai_object_type_t(object_id>>OJBTYPE_SHFT); } + _In_ sai_object_id_t object_id) +{ + DASH_LOG_ENTER(); + return sai_object_type_t(object_id>>DASH_OBJECT_SHFT); +} sai_object_id_t sai_switch_id_query( _In_ sai_object_id_t object_id) { + DASH_LOG_ENTER(); + if (object_id == SAI_NULL_OBJECT_ID) { return SAI_NULL_OBJECT_ID; } - return MAKE_OID(SAI_OBJECT_TYPE_SWITCH,1); + return DASH_MAKE_OID(SAI_OBJECT_TYPE_SWITCH,1); } sai_status_t sai_query_attribute_enum_values_capability( _In_ sai_object_id_t switch_id, _In_ sai_object_type_t object_type, _In_ sai_attr_id_t attr_id, - _Inout_ sai_s32_list_t *enum_values_capability) { return SAI_STATUS_SUCCESS; } + _Inout_ sai_s32_list_t *enum_values_capability) +{ + DASH_LOG_ENTER(); + + DASH_LOG_WARN("not implemented"); + + return SAI_STATUS_NOT_IMPLEMENTED; +} static p4::config::v1::P4Info parse_p4info(const char *path) { + DASH_LOG_ENTER(); + p4::config::v1::P4Info p4info; std::ifstream istream(path); assert(istream.good()); google::protobuf::io::IstreamInputStream istream_(&istream); google::protobuf::TextFormat::Parse(&istream_, &p4info); + return p4info; } @@ -274,11 +299,15 @@ sai_status_t sai_api_initialize( _In_ uint64_t flags, _In_ const sai_service_method_table_t *services) { + DASH_LOG_ENTER(); + const grpc::string _grpcTarget = "0.0.0.0:9559"; char test_json[] = "/etc/dash/dash_pipeline.json"; char test_proto_json[] = "/etc/dash/dash_pipeline_p4rt.txt"; int dev_id = 0; + DASH_LOG_NOTICE("GRPC call SetForwardingPipelineConfig %s => %s, %s", _grpcTarget.c_str(), test_json, test_proto_json); + auto p4info = parse_p4info(test_proto_json); auto set_election_id = [](p4::v1::Uint128 *election_id) { @@ -316,7 +345,7 @@ sai_status_t sai_api_initialize( p4::v1::SetForwardingPipelineConfigResponse rep; grpc::ClientContext context; - LOG("GRPC call SetForwardingPipelineConfig " + _grpcTarget + " => " + test_json + ", " + test_proto_json <SetForwardingPipelineConfig( &context, request, &rep); assert(status.ok()); @@ -326,15 +355,29 @@ sai_status_t sai_api_initialize( return SAI_STATUS_SUCCESS; } -sai_status_t sai_api_uninitialize(void) { return SAI_STATUS_SUCCESS; } +sai_status_t sai_api_uninitialize(void) +{ + DASH_LOG_ENTER(); + + // TODO delete stub + + return SAI_STATUS_SUCCESS; +} sai_status_t sai_log_set( _In_ sai_api_t api, - _In_ sai_log_level_t log_level) { return SAI_STATUS_SUCCESS; } + _In_ sai_log_level_t log_level) +{ + DASH_LOG_ENTER(); + + return SAI_STATUS_SUCCESS; +} sai_status_t sai_query_api_version( _Out_ sai_api_version_t *version) { + DASH_LOG_ENTER(); + if (version) { *version = SAI_API_VERSION; @@ -342,6 +385,8 @@ sai_status_t sai_query_api_version( return SAI_STATUS_SUCCESS; } + DASH_LOG_ERROR("version parameter is NULL"); + return SAI_STATUS_INVALID_PARAMETER; } @@ -350,6 +395,10 @@ sai_status_t sai_query_stats_capability( _In_ sai_object_type_t object_type, _Inout_ sai_stat_capability_list_t *stats_capability) { + DASH_LOG_ENTER(); + + DASH_LOG_WARN("not implemented"); + return SAI_STATUS_NOT_IMPLEMENTED; } @@ -359,11 +408,19 @@ sai_status_t sai_query_attribute_capability( _In_ sai_attr_id_t attr_id, _Out_ sai_attr_capability_t *attr_capability) { + DASH_LOG_ENTER(); + + DASH_LOG_WARN("not implemented"); + return SAI_STATUS_NOT_IMPLEMENTED; } sai_status_t sai_dbg_generate_dump( _In_ const char *dump_file_name) { + DASH_LOG_ENTER(); + + DASH_LOG_WARN("not implemented"); + return SAI_STATUS_NOT_IMPLEMENTED; } diff --git a/dash-pipeline/SAI/templates/saiimpl.h.j2 b/dash-pipeline/SAI/templates/saiimpl.h.j2 new file mode 100644 index 000000000..039e387cd --- /dev/null +++ b/dash-pipeline/SAI/templates/saiimpl.h.j2 @@ -0,0 +1,10 @@ +#pragma once + +#define DASH_PRIVATE __attribute__((visibility("hidden"))) + +DASH_PRIVATE extern sai_switch_api_t dash_sai_switch_api_impl; +DASH_PRIVATE extern sai_port_api_t dash_sai_port_api_impl; + +{% for api in api_names %} +DASH_PRIVATE extern sai_{{ api }}_api_t dash_sai_{{ api }}_api_impl; +{% endfor %} diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index fe2903f04..1196bf5e4 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -1,42 +1,11 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "p4/v1/p4runtime.grpc.pb.h" #include "utils.h" -extern "C" { -#include "sai.h" -#include "saiobject.h" -#include "saistatus.h" -#include "saitypes.h" -#include "saiextensions.h" -} -#include -#include -#include - -#if __APPLE__ -#include -#else -#include -#include -#endif - -#define LOG(x) std::cerr< tableEntryMap; +static std::unordered_multimap tableEntryMap; static std::mutex tableLock; -static atomic nextId; +static std::atomic nextId; + std::unique_ptr stub; void correctIpPrefix(void *ip, const void *mask, size_t length) @@ -60,9 +29,9 @@ int leadingNonZeroBits(const uint32_t ipv4) { int leadingNonZeroBits(const sai_ip6_t ipv6) { int trailingZeros = 0; for (int i = 0; i < 16; i+=4) { - auto num = static_cast(ipv6[i]) + - (static_cast(ipv6[i+1]) << 8) + - (static_cast(ipv6[i+2]) << 16) + + auto num = static_cast(ipv6[i]) + + (static_cast(ipv6[i+1]) << 8) + + (static_cast(ipv6[i+2]) << 16) + (static_cast(ipv6[i+3]) << 24); auto firstSetBit = leadingNonZeroBits(num); if (firstSetBit > 0) { @@ -74,11 +43,14 @@ int leadingNonZeroBits(const sai_ip6_t ipv6) { } -int GetDeviceId() { +int GetDeviceId() +{ + DASH_LOG_ENTER(); + return deviceId; } -string updateTypeStr(p4::v1::Update_Type updateType) { +std::string updateTypeStr(p4::v1::Update_Type updateType) { const google::protobuf::EnumDescriptor *descriptor = p4::v1::Update_Type_descriptor(); return descriptor->FindValueByNumber(updateType)->name(); } @@ -92,7 +64,9 @@ const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const return nullptr; } -grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType) { +grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType) +{ + DASH_LOG_ENTER(); p4::v1::WriteRequest request; request.set_device_id(GetDeviceId()); @@ -100,47 +74,62 @@ grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type update->set_type(updateType); auto entity = update->mutable_entity(); entity->set_allocated_table_entry(entry); - + p4::v1::WriteResponse rep; grpc::ClientContext context; grpc::Status status = stub->Write(&context, request, &rep); - if (status.ok()) { - LOG("GRPC call Write::" << updateTypeStr(updateType) << " OK" << entry->ShortDebugString() << std::endl); + + if (status.ok()) + { + DASH_LOG_NOTICE("GRPC call Write::%s OK %s", updateTypeStr(updateType).c_str(), entry->ShortDebugString().c_str()); } - else { - LOG("GRPC ERROR["<< status.error_code() <<"]: " << status.error_message() << ", " << status.error_details() << std::endl); - LOG("GRPC call Write::" << updateTypeStr(updateType) << " ERROR: " << std::endl << entry->ShortDebugString() << std::endl); + else + { + DASH_LOG_ERROR("GRPC ERROR[%d]: %s, %s", status.error_code(), status.error_message().c_str(), status.error_details().c_str()); + DASH_LOG_ERROR("GRPC call Write::%s ERROR: %s", updateTypeStr(updateType).c_str(), entry->ShortDebugString().c_str()); } + //MILIND?? What is this? reference release? memory release? entity->release_table_entry(); return status.error_code(); } -bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId) { +bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId) +{ + DASH_LOG_ENTER(); + auto retCode = MutateTableEntry(entry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK != retCode) { return false; } - tableLock.lock(); - if (*objId == 0) { + std::lock_guard lock(tableLock); + + if (*objId == 0) + { *objId = NextObjIndex(); } tableEntryMap.insert(std::make_pair(*objId, entry)); - tableLock.unlock(); return true; } -sai_object_id_t NextObjIndex() { +sai_object_id_t NextObjIndex() +{ + DASH_LOG_ENTER(); + return ++nextId; } -bool RemoveFromTable(sai_object_id_t id) { - tableLock.lock(); +bool RemoveFromTable(sai_object_id_t id) +{ + DASH_LOG_ENTER(); + + std::lock_guard lock(tableLock); auto range = tableEntryMap.equal_range(id); - if (range.first == range.second) { - tableLock.unlock(); - LOG("id: " << id << " not present in the table for deletion!" < -#include -#include -#include -#include -#include -#include -#include "p4/v1/p4runtime.grpc.pb.h" -#include "saitypes.h" -#include -#include -#include +#pragma once #if __APPLE__ #include @@ -21,7 +7,25 @@ #include #endif -#define LOG(x) std::cerr< +#include +#include +#include +#include + +extern "C" +{ +#include "sai.h" +#include "saiextensions.h" +} + +#include "logger.h" + +#include +#include +#include +#include +#include template void booldataSetVal(const sai_attribute_value_t &value, T &t, int bits = 8){ @@ -136,7 +140,7 @@ void ipaddrSetVal(const sai_ip_address_t &value, T &t, int bits = -1){ t->set_value(const_cast(&value.addr.ip6[0]), 16); } break; - default: assert(0 && "unrecognzed value.ipaddr.addr_family"); + default: assert(0 && "unrecognzed value.ipaddr.addr_family"); } } @@ -203,7 +207,7 @@ void ipPrefixSetVal(const sai_ip_prefix_t &value, T &t, int bits = -1){ t->set_prefix_len(leadingNonZeroBits(value.mask.ip6)); } break; - default: assert(0 && "unrecognzed value.ipaddr.addr_family"); + default: assert(0 && "unrecognzed value.ipaddr.addr_family"); } } @@ -315,5 +319,3 @@ bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId); bool RemoveFromTable(sai_object_id_t id); int GetDeviceId(); - -#endif diff --git a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp index 2f24ab6e1..bebef12d1 100644 --- a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp +++ b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp @@ -5,54 +5,13 @@ extern "C" { #include +#include } -// TODO below apis are extern of internal implementation -// they should not be used by extern, but obtained via -// sai_api_query function, FIXME - -extern sai_status_t sai_create_direction_lookup_entry( - _In_ const sai_direction_lookup_entry_t *direction_lookup_entry, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); -extern sai_status_t sai_remove_direction_lookup_entry( - _In_ const sai_direction_lookup_entry_t *direction_lookup_entry); - -extern sai_status_t sai_create_eni_ether_address_map_entry( - _In_ const sai_eni_ether_address_map_entry_t *outbound_eni_lookup_from_vm_entry, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); -extern sai_status_t sai_remove_eni_ether_address_map_entry( - _In_ const sai_eni_ether_address_map_entry_t *outbound_eni_lookup_from_vm_entry); - -extern sai_status_t sai_create_vnet( - _Out_ sai_object_id_t *vnet_id, - _In_ sai_object_id_t switch_id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); -extern sai_status_t sai_remove_vnet(_In_ sai_object_id_t vnet_id); - -extern sai_status_t sai_create_eni( - _Out_ sai_object_id_t *eni_id, - _In_ sai_object_id_t switch_id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); - -extern sai_status_t sai_create_eni( - _Out_ sai_object_id_t *eni_id, - _In_ sai_object_id_t switch_id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); -extern sai_status_t sai_remove_eni( - _In_ sai_object_id_t eni_id); - -extern sai_status_t sai_create_dash_acl_group( - _Out_ sai_object_id_t *acl_group_id, - _In_ sai_object_id_t switch_id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); -extern sai_status_t sai_remove_dash_acl_group( - _In_ sai_object_id_t eni_id); +#define QUERY_STATUS_CHECK(s,api) \ + if ((s) != SAI_STATUS_SUCCESS) { \ + std::cout << "Failed to get api " #api ": " << (s) << std::endl; \ + exit(1); } int main(int argc, char **argv) { @@ -72,6 +31,22 @@ int main(int argc, char **argv) return 1; } + sai_dash_direction_lookup_api_t *dash_direction_lookup_api; + status = sai_api_query((sai_api_t)SAI_API_DASH_DIRECTION_LOOKUP, (void**)&dash_direction_lookup_api); + QUERY_STATUS_CHECK(status, SAI_API_DASH_DIRECTION_LOOKUP); + + sai_dash_acl_api_t *dash_acl_api; + status = sai_api_query((sai_api_t)SAI_API_DASH_ACL, (void**)&dash_acl_api); + QUERY_STATUS_CHECK(status, SAI_API_DASH_ACL); + + sai_dash_vnet_api_t *dash_vnet_api; + status = sai_api_query((sai_api_t)SAI_API_DASH_VNET, (void**)&dash_vnet_api); + QUERY_STATUS_CHECK(status, SAI_API_DASH_VNET); + + sai_dash_eni_api_t *dash_eni_api; + status = sai_api_query((sai_api_t)SAI_API_DASH_ENI, (void**)&dash_eni_api); + QUERY_STATUS_CHECK(status, SAI_API_DASH_ENI); + sai_direction_lookup_entry_t dle = {}; dle.switch_id = switch_id; dle.vni = 60; @@ -81,7 +56,7 @@ int main(int argc, char **argv) attrs.push_back(attr); /* sai_status_t status = sai_dash_api_impl.create_direction_lookup_entry(&dle, attrs.size(), attrs.data()); */ - status = sai_create_direction_lookup_entry(&dle, attrs.size(), attrs.data()); + status = dash_direction_lookup_api->create_direction_lookup_entry(&dle, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create Direction Lookup Entry" << std::endl; @@ -95,13 +70,13 @@ int main(int argc, char **argv) attrs.push_back(attr); /* status = sai_dash_api_impl.create_dash_acl_group(&group_id, switch_id, attrs.size(), attrs.data()); */ - status = sai_create_dash_acl_group(&in_acl_group_id, switch_id, attrs.size(), attrs.data()); + status = dash_acl_api->create_dash_acl_group(&in_acl_group_id, switch_id, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create inbound Dash ACL group" << std::endl; return 1; } - status = sai_create_dash_acl_group(&out_acl_group_id, switch_id, attrs.size(), attrs.data()); + status = dash_acl_api->create_dash_acl_group(&out_acl_group_id, switch_id, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create outbound Dash ACL group" << std::endl; @@ -114,7 +89,7 @@ int main(int argc, char **argv) attr.value.u32 = 9; attrs.push_back(attr); - status = sai_create_vnet(&vnet_id, switch_id, attrs.size(), attrs.data()); + status = dash_vnet_api->create_vnet(&vnet_id, switch_id, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create VNET table entry" << std::endl; @@ -190,7 +165,7 @@ int main(int argc, char **argv) attrs.push_back(attr); } - status = sai_create_eni(&eni_id, switch_id, attrs.size(), attrs.data()); + status = dash_eni_api->create_eni(&eni_id, switch_id, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create ENI object" << std::endl; @@ -212,7 +187,7 @@ int main(int argc, char **argv) attr.value.u16 = eni_id; attrs.push_back(attr); - status = sai_create_eni_ether_address_map_entry(&eam, attrs.size(), attrs.data()); + status = dash_eni_api->create_eni_ether_address_map_entry(&eam, attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create ENI Lookup From VM" << std::endl; @@ -220,28 +195,28 @@ int main(int argc, char **argv) } // Delete everything in reverse order - status = sai_remove_eni_ether_address_map_entry(&eam); + status = dash_eni_api->remove_eni_ether_address_map_entry(&eam); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to remove ENI Lookup From VM" << std::endl; return 1; } - status = sai_remove_eni(eni_id); + status = dash_eni_api->remove_eni(eni_id); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to remove ENI object " << eni_id << std::endl; return 1; } - status = sai_remove_vnet(vnet_id); + status = dash_vnet_api->remove_vnet(vnet_id); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to remove VNET table entry" << std::endl; return 1; } - status = sai_remove_dash_acl_group(out_acl_group_id); + status = dash_acl_api->remove_dash_acl_group(out_acl_group_id); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to remove Outbound ACL group object " @@ -249,7 +224,7 @@ int main(int argc, char **argv) return 1; } - status = sai_remove_dash_acl_group(in_acl_group_id); + status = dash_acl_api->remove_dash_acl_group(in_acl_group_id); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to remove Inbound ACL group object " @@ -257,7 +232,7 @@ int main(int argc, char **argv) return 1; } - status = sai_remove_direction_lookup_entry(&dle); + status = dash_direction_lookup_api->remove_direction_lookup_entry(&dle); if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to remove Direction Lookup Entry" << std::endl; From 75de7958dda8005aaa4b9706501d975642073994 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 2 Aug 2023 20:40:36 +0200 Subject: [PATCH 44/75] [submodule] Update SAI submodule to origin/master (#412) * [submodule] Update SAI submodule to origin/master * Add missing switch init functions --- dash-pipeline/SAI/SAI | 2 +- dash-pipeline/SAI/templates/saifixedapis.cpp.j2 | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dash-pipeline/SAI/SAI b/dash-pipeline/SAI/SAI index 52e7b425d..7a45648e9 160000 --- a/dash-pipeline/SAI/SAI +++ b/dash-pipeline/SAI/SAI @@ -1 +1 @@ -Subproject commit 52e7b425d5c3bcdb1460ecb6d6b114df9cad4a08 +Subproject commit 7a45648e928836722df241dfe01c57e02876d5c1 diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index ff8e1cd0f..31daff5db 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -135,6 +135,8 @@ sai_switch_api_t dash_sai_switch_api_impl = { .remove_switch_tunnel = 0, .set_switch_tunnel_attribute = 0, .get_switch_tunnel_attribute = 0, + .switch_mdio_cl22_read = 0, + .switch_mdio_cl22_write = 0, }; static sai_status_t dash_sai_get_port_attribute( From f475caa76fa3aa03f7f776046cce8d2b22d7154b Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 2 Aug 2023 21:44:10 +0200 Subject: [PATCH 45/75] Use shared_ptr instead of new/delete to prevent memory leak (#418) --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 13 ++++--------- dash-pipeline/SAI/templates/utils.cpp.j2 | 9 ++++----- dash-pipeline/SAI/templates/utils.h.j2 | 5 +++-- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 701058aa1..92eaa940f 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -14,7 +14,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( { DASH_LOG_ENTER(); - p4::v1::TableEntry * matchActionEntry = nullptr; + std::shared_ptr matchActionEntry; pi_p4_id_t tableId = 0; // There shall be one and only one action_type p4::v1::TableAction* entry = nullptr; @@ -31,7 +31,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% if 'stage' in table %} // For stage {{ table.stage }} {% endif %} - matchActionEntry = new p4::v1::TableEntry(); + matchActionEntry = std::make_shared(); tableId = {{table.id}}; entry = matchActionEntry->mutable_action(); action = entry->mutable_action(); @@ -179,7 +179,6 @@ static sai_status_t dash_sai_create_{{ table.name }}( *{{ table.name }}_id = objId; return SAI_STATUS_SUCCESS; ErrRet: - delete matchActionEntry; RemoveFromTable(*{{ table.name }}_id); return SAI_STATUS_FAILURE; } @@ -275,7 +274,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( { DASH_LOG_ENTER(); - p4::v1::TableEntry * matchActionEntry = new p4::v1::TableEntry(); + std::shared_ptr matchActionEntry = std::make_shared(); pi_p4_id_t tableId = {{table.id}}; matchActionEntry->set_table_id(tableId); auto tableEntry = {{ table.name }}; @@ -379,11 +378,9 @@ static sai_status_t dash_sai_create_{{ table.name }}( // TODO: ternaly needs to set priority retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK == retCode) { - delete matchActionEntry; return SAI_STATUS_SUCCESS; } ErrRet: - delete matchActionEntry; return SAI_STATUS_FAILURE; } @@ -420,7 +417,7 @@ static sai_status_t dash_sai_remove_{{ table.name }}( { DASH_LOG_ENTER(); - p4::v1::TableEntry * matchActionEntry = new p4::v1::TableEntry(); + std::shared_ptr matchActionEntry = std::make_shared(); pi_p4_id_t tableId = {{table.id}}; matchActionEntry->set_table_id(tableId); auto tableEntry = {{ table.name }}; @@ -461,13 +458,11 @@ static sai_status_t dash_sai_remove_{{ table.name }}( retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_DELETE); if (grpc::StatusCode::OK == retCode) { - delete matchActionEntry; return SAI_STATUS_SUCCESS; } ErrRet: - delete matchActionEntry; return SAI_STATUS_FAILURE; } diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index 1196bf5e4..a17e8e2fd 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -2,7 +2,7 @@ static int deviceId = 0; -static std::unordered_multimap tableEntryMap; +static std::unordered_multimap > tableEntryMap; static std::mutex tableLock; static std::atomic nextId; @@ -64,7 +64,7 @@ const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const return nullptr; } -grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType) +grpc::StatusCode MutateTableEntry(std::shared_ptr entry, p4::v1::Update_Type updateType) { DASH_LOG_ENTER(); @@ -73,7 +73,7 @@ grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type auto update = request.add_updates(); update->set_type(updateType); auto entity = update->mutable_entity(); - entity->set_allocated_table_entry(entry); + entity->set_allocated_table_entry(entry.get()); p4::v1::WriteResponse rep; grpc::ClientContext context; @@ -94,7 +94,7 @@ grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type return status.error_code(); } -bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId) +bool InsertInTable(std::shared_ptr entry, sai_object_id_t *objId) { DASH_LOG_ENTER(); @@ -141,7 +141,6 @@ bool RemoveFromTable(sai_object_id_t id) if (grpc::StatusCode::OK != tempRet) { retCode = tempRet; } - delete entry; } tableEntryMap.erase(id); diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/templates/utils.h.j2 index fc097c413..6ac2643ed 100644 --- a/dash-pipeline/SAI/templates/utils.h.j2 +++ b/dash-pipeline/SAI/templates/utils.h.j2 @@ -26,6 +26,7 @@ extern "C" #include #include #include +#include template void booldataSetVal(const sai_attribute_value_t &value, T &t, int bits = 8){ @@ -310,11 +311,11 @@ void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) { t->set_mask(&val, bytes); } -grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType); +grpc::StatusCode MutateTableEntry(std::shared_ptr, p4::v1::Update_Type updateType); sai_object_id_t NextObjIndex(); -bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId); +bool InsertInTable(std::shared_ptr entry, sai_object_id_t *objId); bool RemoveFromTable(sai_object_id_t id); From 1af97f108c8c874779efcb682b969c1221cfc407 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Mon, 7 Aug 2023 17:02:26 +0200 Subject: [PATCH 46/75] [SAI] Add support for dash configuration from sai interface (#419) --- dash-pipeline/SAI/sai_api_gen.py | 2 +- dash-pipeline/SAI/templates/Makefile.j2 | 3 +- dash-pipeline/SAI/templates/config.cpp.j2 | 127 ++++++++++++++++++ dash-pipeline/SAI/templates/config.h.j2 | 52 +++++++ dash-pipeline/SAI/templates/saidash.h.j2 | 48 +++++++ .../SAI/templates/saifixedapis.cpp.j2 | 42 +++--- 6 files changed, 257 insertions(+), 17 deletions(-) create mode 100644 dash-pipeline/SAI/templates/config.cpp.j2 create mode 100644 dash-pipeline/SAI/templates/config.h.j2 create mode 100644 dash-pipeline/SAI/templates/saidash.h.j2 diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 86b8f7800..07e1acc93 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -381,7 +381,7 @@ def write_sai_makefile(sai_api_name_list, sai_api_full_name_list): def write_sai_fixed_api_files(sai_api_full_name_list): env = Environment(loader=FileSystemLoader('.')) - for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp', 'saiimpl.h', 'logger.h', 'logger.cpp']: + for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp', 'saiimpl.h', 'logger.h', 'logger.cpp', 'saidash.h', 'config.h', 'config.cpp']: env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) sai_impl_tm = env.get_template('/templates/%s.j2' % filename) sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], api_names = sai_api_full_name_list) diff --git a/dash-pipeline/SAI/templates/Makefile.j2 b/dash-pipeline/SAI/templates/Makefile.j2 index d7ae6d006..aac6a2183 100644 --- a/dash-pipeline/SAI/templates/Makefile.j2 +++ b/dash-pipeline/SAI/templates/Makefile.j2 @@ -60,7 +60,8 @@ SAI_OBJS=$(SAI_SRCS:.c=.o) # DASH libsai "fixed" sources (not generated from P4 code) DASH_FIXED_SAI_SRCS=utils.cpp \ saifixedapis.cpp \ - logger.cpp + logger.cpp \ + config.cpp DASH_FIXED_SAI_OBJ=$(DASH_FIXED_SAI_SRCS:.cpp=.o) # DASH libsai "generated" sources (from P4 code) diff --git a/dash-pipeline/SAI/templates/config.cpp.j2 b/dash-pipeline/SAI/templates/config.cpp.j2 new file mode 100644 index 000000000..32e846039 --- /dev/null +++ b/dash-pipeline/SAI/templates/config.cpp.j2 @@ -0,0 +1,127 @@ +#include "config.h" +#include "logger.h" +#include "saidash.h" + +#include +#include + +using namespace dash; + +Config::Config(): + m_grpcTarget(DEFAULT_GRPC_TARGET), + m_pipelineJson(DEFAULT_PIPELINE_JSON), + m_pipelineProto(DEFAULT_PIPELINE_PROTO), + m_deviceId(DEFAULT_DEVICE_ID), + m_bmv2NumPorts(DEFAULT_BMV2_NUM_PORTS) +{ + DASH_LOG_ENTER(); + + // empty intentionally +} + +std::shared_ptr Config::getDefaultConfig() +{ + DASH_LOG_ENTER(); + + return std::make_shared(); +} + +std::shared_ptr Config::getConfig( + const sai_service_method_table_t* serviceMethodTable) +{ + DASH_LOG_ENTER(); + + auto cfg = getDefaultConfig(); + + if (serviceMethodTable == nullptr) + { + DASH_LOG_NOTICE("service method table is null, returning default config"); + + return cfg; + } + + if (serviceMethodTable->profile_get_value == nullptr) + { + DASH_LOG_NOTICE("profile_get_value member is null, returning default config"); + + return cfg; + } + + auto grpcTarget = serviceMethodTable->profile_get_value(0, SAI_KEY_DASH_GRPC_TARGET); + + if (grpcTarget) + { + DASH_LOG_NOTICE("%s: %s", SAI_KEY_DASH_GRPC_TARGET, grpcTarget); + + cfg->m_grpcTarget = grpcTarget; + } + + auto pipelineJson = serviceMethodTable->profile_get_value(0, SAI_KEY_DASH_PIPELINE_JSON); + + if (pipelineJson) + { + DASH_LOG_NOTICE("%s: %s", SAI_KEY_DASH_PIPELINE_JSON, pipelineJson); + + cfg->m_pipelineJson = pipelineJson; + } + + auto pipelineProto = serviceMethodTable->profile_get_value(0, SAI_KEY_DASH_PIPELINE_PROTO); + + if (pipelineProto) + { + DASH_LOG_NOTICE("%s: %s", SAI_KEY_DASH_PIPELINE_JSON, pipelineProto); + + cfg->m_pipelineProto = pipelineProto; + } + + auto deviceId = serviceMethodTable->profile_get_value(0, SAI_KEY_DASH_DEVICE_ID); + + if (deviceId) + { + int devId = atoi(deviceId); + + cfg->m_deviceId = devId; + + DASH_LOG_NOTICE("%s: %s (%d)", SAI_KEY_DASH_DEVICE_ID, deviceId, devId); + } + + auto numPorts = serviceMethodTable->profile_get_value(0, SAI_KEY_DASH_BMV2_NUM_PORTS); + + if (numPorts) + { + uint32_t num = (uint32_t)atoi(numPorts); + + if (num > MAX_BMV2_NUM_PORTS) + { + DASH_LOG_ERROR("%s: %s (%u > %u), setting to default %u", + SAI_KEY_DASH_BMV2_NUM_PORTS, + numPorts, + num, + MAX_BMV2_NUM_PORTS, + DEFAULT_BMV2_NUM_PORTS); + + num = DEFAULT_BMV2_NUM_PORTS; + } + + cfg->m_bmv2NumPorts = num; + + DASH_LOG_NOTICE("%s: %s (%u)", SAI_KEY_DASH_BMV2_NUM_PORTS, numPorts, num); + } + + return cfg; +} + +std::string Config::getConfigString() const +{ + DASH_LOG_ENTER(); + + std::stringstream ss; + + ss << " GrpcTarget=" << m_grpcTarget; + ss << " PipelineJson=" << m_pipelineJson; + ss << " PipelineProto=" << m_pipelineProto; + ss << " DeviceId=" << m_deviceId; + ss << " Bmv2NumPorts=" << m_bmv2NumPorts; + + return ss.str(); +} diff --git a/dash-pipeline/SAI/templates/config.h.j2 b/dash-pipeline/SAI/templates/config.h.j2 new file mode 100644 index 000000000..4e356d002 --- /dev/null +++ b/dash-pipeline/SAI/templates/config.h.j2 @@ -0,0 +1,52 @@ +#pragma once + +extern "C" { +#include +} + +#include +#include + +namespace dash +{ + constexpr char DEFAULT_GRPC_TARGET[] = "0.0.0.0:9559"; + + constexpr char DEFAULT_PIPELINE_JSON[] = "/etc/dash/dash_pipeline.json"; + + constexpr char DEFAULT_PIPELINE_PROTO[] = "/etc/dash/dash_pipeline_p4rt.txt"; + + constexpr int DEFAULT_DEVICE_ID = 0; + + constexpr uint32_t DEFAULT_BMV2_NUM_PORTS = 2; + + constexpr uint32_t MAX_BMV2_NUM_PORTS = 64; + + class Config + { + public: + + Config(); + ~Config() = default; + + public: + + static std::shared_ptr getDefaultConfig(); + + static std::shared_ptr getConfig( + const sai_service_method_table_t* serviceMethodTable); + + std::string getConfigString() const; + + public: + + std::string m_grpcTarget; + + std::string m_pipelineJson; + + std::string m_pipelineProto; + + int m_deviceId; + + uint32_t m_bmv2NumPorts; + }; +} diff --git a/dash-pipeline/SAI/templates/saidash.h.j2 b/dash-pipeline/SAI/templates/saidash.h.j2 new file mode 100644 index 000000000..526081000 --- /dev/null +++ b/dash-pipeline/SAI/templates/saidash.h.j2 @@ -0,0 +1,48 @@ +#pragma once + +/** + * @def SAI_KEY_DASH_GRPC_TARGET + * + * Specifies GRPC target in format IP:port. + * + * Example: 0.0.0.0:9559 + */ +#define SAI_KEY_DASH_GRPC_TARGET "SAI_DASH_GRPC_TARGET" + +/** + * @def SAI_KEY_DASH_PIPELINE_JSON + * + * Specifies pipeline json file path. + * + * Example: /etc/dash/dash_pipeline.json + */ +#define SAI_KEY_DASH_PIPELINE_JSON "SAI_DASH_PIPELINE_JSON" + +/** + * @def SAI_KEY_DASH_PIPELINE_PROTO + * + * Specifies pipeline proto p4rt file path. + * + * Example: /etc/dash/dash_pipeline_p4rt.txt + */ +#define SAI_KEY_DASH_PIPELINE_PROTO "SAI_DASH_PIPELINE_PROTO" + +/** Below defines could be depreacated if multiple asic will appear */ + +/** + * @def SAI_KEY_DASH_DEVICE_ID + * + * Specifies device ID as integer. + * + * Example: 0 + */ +#define SAI_KEY_DASH_DEVICE_ID "SAI_DASH_DEVICE_ID" + +/** + * @def SAI_KEY_DASH_BMV2_NUM_PORTS + * + * Specifies number of ports in bmv2 as unsigned integer. + * + * Example: 2 + */ +#define SAI_KEY_DASH_BMV2_NUM_PORTS "SAI_DASH_BMV2_NUM_PORTS" diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 31daff5db..5820f874b 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -4,13 +4,15 @@ */ #include "utils.h" #include "saiimpl.h" +#include "config.h" + +#include // TODO to be moved to separate class/namespace static std::shared_ptr _grpcChannel; extern std::unique_ptr stub; -#define DASH_BMV2_NUM_PORTS 2 #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 #define DASH_OBJECT_SHFT 48 @@ -21,10 +23,9 @@ extern std::unique_ptr stub; #define DASH_BMV2_DEFAULT_VRF_ID DASH_MAKE_OID(SAI_OBJECT_TYPE_VIRTUAL_ROUTER,1) #define DASH_BMV2_DEFAULT_1Q_BRIDGE_ID DASH_MAKE_OID(SAI_OBJECT_TYPE_BRIDGE,1) -static sai_object_id_t port_list[DASH_BMV2_NUM_PORTS] = { - DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,1), - DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,2) -}; +static std::shared_ptr cfg; + +static std::vector port_list; static sai_status_t dash_sai_create_switch( _Out_ sai_object_id_t *switch_id, @@ -57,7 +58,7 @@ static sai_status_t dash_sai_get_switch_attribute( { case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: - attr->value.u32 = DASH_BMV2_NUM_PORTS; + attr->value.u32 = cfg->m_bmv2NumPorts; DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->id, attr->value.u32); @@ -65,14 +66,14 @@ static sai_status_t dash_sai_get_switch_attribute( case SAI_SWITCH_ATTR_PORT_LIST: - attr->value.objlist.count = DASH_BMV2_NUM_PORTS; + attr->value.objlist.count = cfg->m_bmv2NumPorts; - for (uint32_t j = 0; j < DASH_BMV2_NUM_PORTS; j++) + for (size_t j = 0; j < cfg->m_bmv2NumPorts; j++) { - attr->value.objlist.list[j] = port_list[j]; + attr->value.objlist.list[j] = port_list.at(j); } - DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, attr->id, DASH_BMV2_NUM_PORTS); + DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, attr->id, cfg->m_bmv2NumPorts); break; @@ -303,10 +304,21 @@ sai_status_t sai_api_initialize( { DASH_LOG_ENTER(); - const grpc::string _grpcTarget = "0.0.0.0:9559"; - char test_json[] = "/etc/dash/dash_pipeline.json"; - char test_proto_json[] = "/etc/dash/dash_pipeline_p4rt.txt"; - int dev_id = 0; + cfg = dash::Config::getConfig(services); + + DASH_LOG_NOTICE("config: %s", cfg->getConfigString().c_str()); + + for (uint32_t i = 1; i <= cfg->m_bmv2NumPorts; i++) + { + port_list.push_back(DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,i)); + } + + assert(cfg->m_bmv2NumPorts == (uint32_t)port_list.size()); + + const grpc::string _grpcTarget = cfg->m_grpcTarget; + const char* test_json = cfg->m_pipelineJson.c_str(); + const char* test_proto_json = cfg->m_pipelineProto.c_str(); + int dev_id = cfg->m_deviceId; DASH_LOG_NOTICE("GRPC call SetForwardingPipelineConfig %s => %s, %s", _grpcTarget.c_str(), test_json, test_proto_json); @@ -361,7 +373,7 @@ sai_status_t sai_api_uninitialize(void) { DASH_LOG_ENTER(); - // TODO delete stub + stub = nullptr; return SAI_STATUS_SUCCESS; } From 666da4e4c7a60f4f0657366d9e9d4d6ffad739b1 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Tue, 8 Aug 2023 20:39:08 +0200 Subject: [PATCH 47/75] [SAI] Fix NextObjIndex method to embed objeect type into generated OID (#420) * [SAI] Embed object type inside object id This is required for proper working of sai_object_type_query api * Update init switch test * Use proper function name * Make proper oid --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 4 +-- .../SAI/templates/saifixedapis.cpp.j2 | 18 +++++----- dash-pipeline/SAI/templates/utils.cpp.j2 | 35 +++++++++++++------ dash-pipeline/SAI/templates/utils.h.j2 | 6 ++-- .../tests/libsai/init_switch/init_switch.cpp | 26 +++++++++----- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 92eaa940f..b4dae1376 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -46,7 +46,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( // Generate a SAI object ID and fill it as the P4 table key auto mf = matchActionEntry->add_match(); mf->set_field_id({{table['keys'][0].id}}); - objId = NextObjIndex(); + objId = NextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}); auto mf_exact = mf->mutable_exact(); {{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); {% else %} @@ -170,7 +170,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( //if (matchedParams != expectedParams) { // goto ErrRet; //} - if (false == InsertInTable(matchActionEntry, &objId)) { + if (false == InsertInTable(matchActionEntry, (sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, &objId)) { goto ErrRet; } diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 5820f874b..23a12e1e2 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -60,7 +60,7 @@ static sai_status_t dash_sai_get_switch_attribute( attr->value.u32 = cfg->m_bmv2NumPorts; - DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->id, attr->value.u32); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->value.u32); break; @@ -73,7 +73,7 @@ static sai_status_t dash_sai_get_switch_attribute( attr->value.objlist.list[j] = port_list.at(j); } - DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, attr->id, cfg->m_bmv2NumPorts); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, cfg->m_bmv2NumPorts); break; @@ -81,7 +81,7 @@ static sai_status_t dash_sai_get_switch_attribute( attr->value.oid = DASH_BMV2_DEFAULT_VLAN_ID; - DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->id, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->value.oid); break; @@ -89,7 +89,7 @@ static sai_status_t dash_sai_get_switch_attribute( attr->value.oid = DASH_BMV2_DEFAULT_VRF_ID; - DASH_LOG_NOTICE("attr %d SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", attr->id, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", i, attr->value.oid); break; @@ -97,7 +97,7 @@ static sai_status_t dash_sai_get_switch_attribute( attr->value.oid = DASH_BMV2_DEFAULT_1Q_BRIDGE_ID; - DASH_LOG_NOTICE("attr %d SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", attr->id, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", i, attr->value.oid); break; @@ -105,13 +105,13 @@ static sai_status_t dash_sai_get_switch_attribute( attr->value.oid = DASH_BMV2_DEFAULT_CPU_PORT_ID; - DASH_LOG_NOTICE("[%d] attr %d DASH_BMV2_DEFAULT_CPU_PORT_ID = %lx", i, attr->id, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_CPU_PORT = %lx", i, attr->value.oid); break; default: - DASH_LOG_WARN("attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", attr->id); + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage @@ -159,13 +159,13 @@ static sai_status_t dash_sai_get_port_attribute( attr->value.u32 = DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES; - DASH_LOG_NOTICE("attr %d SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", attr->id, attr->value.u32); + DASH_LOG_NOTICE("[%d] SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", i, attr->value.u32); break; default: - DASH_LOG_WARN("attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", attr->id); + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index a17e8e2fd..962b9b8b7 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -6,6 +6,8 @@ static std::unordered_multimap nextId; +#define MUTEX std::lock_guard _lock(tableLock); + std::unique_ptr stub; void correctIpPrefix(void *ip, const void *mask, size_t length) @@ -43,7 +45,7 @@ int leadingNonZeroBits(const sai_ip6_t ipv6) { } -int GetDeviceId() +static int GetDeviceId() { DASH_LOG_ENTER(); @@ -94,38 +96,47 @@ grpc::StatusCode MutateTableEntry(std::shared_ptr entry, p4: return status.error_code(); } -bool InsertInTable(std::shared_ptr entry, sai_object_id_t *objId) +bool InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId) { DASH_LOG_ENTER(); auto retCode = MutateTableEntry(entry, p4::v1::Update_Type_INSERT); - if (grpc::StatusCode::OK != retCode) { + + if (grpc::StatusCode::OK != retCode) + { return false; } - std::lock_guard lock(tableLock); + MUTEX; if (*objId == 0) { - *objId = NextObjIndex(); + *objId = NextObjectId(objectType); } + tableEntryMap.insert(std::make_pair(*objId, entry)); + return true; } -sai_object_id_t NextObjIndex() +// TODO to be removed and merged +#define DASH_OBJECT_SHFT 48 +#define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype< lock(tableLock); + MUTEX; + auto range = tableEntryMap.equal_range(id); + if (range.first == range.second) { DASH_LOG_ERROR("id: %ld not present in the table for deletion!", id); @@ -135,14 +146,18 @@ bool RemoveFromTable(sai_object_id_t id) grpc::StatusCode retCode = grpc::StatusCode::OK; - for (auto itr = range.first; itr != range.second; ++itr) { + for (auto itr = range.first; itr != range.second; ++itr) + { auto entry = itr->second; auto tempRet = MutateTableEntry(entry, p4::v1::Update_Type_DELETE); - if (grpc::StatusCode::OK != tempRet) { + + if (grpc::StatusCode::OK != tempRet) + { retCode = tempRet; } } tableEntryMap.erase(id); + return retCode == grpc::StatusCode::OK; } diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/templates/utils.h.j2 index 6ac2643ed..9807c30d3 100644 --- a/dash-pipeline/SAI/templates/utils.h.j2 +++ b/dash-pipeline/SAI/templates/utils.h.j2 @@ -313,10 +313,8 @@ void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) { grpc::StatusCode MutateTableEntry(std::shared_ptr, p4::v1::Update_Type updateType); -sai_object_id_t NextObjIndex(); +sai_object_id_t NextObjectId(sai_object_type_t objectType); -bool InsertInTable(std::shared_ptr entry, sai_object_id_t *objId); +bool InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId); bool RemoveFromTable(sai_object_id_t id); - -int GetDeviceId(); diff --git a/dash-pipeline/tests/libsai/init_switch/init_switch.cpp b/dash-pipeline/tests/libsai/init_switch/init_switch.cpp index 39f87ec0e..8d4826c0c 100644 --- a/dash-pipeline/tests/libsai/init_switch/init_switch.cpp +++ b/dash-pipeline/tests/libsai/init_switch/init_switch.cpp @@ -1,15 +1,23 @@ -#include #include "utils.h" -/* - Run this program to indirectly cause simple_switch_grpc to load its P4 pipeline - */ +#include + +// Run this program to indirectly cause simple_switch_grpc to load its P4 pipeline + int main(int argc, char **argv) { - // Make one benign call into libsai; it will force library load and - // invoke static lib initializer Init() which calls SetForwardingPipelineConfigRequest() - GetDeviceId(); - std::cout << "Switch is initialized." << std::endl; + // try initialize SAI api, this will load sai library and initialize P4 GRPC + + sai_status_t status = sai_api_initialize(0, nullptr); + + if (status == SAI_STATUS_SUCCESS) + { + std::cout << "sai_api_initialize success" << std::endl; + + return 0; + } + + std::cout << "sai_api_initialize failed: " << status << std::endl; - return 0; + return 1; } From 57488dcb6a0fafb861099acb35660f11e24e669a Mon Sep 17 00:00:00 2001 From: kcudnik Date: Tue, 8 Aug 2023 18:12:32 +0200 Subject: [PATCH 48/75] [SAI] Improve code quality in utils --- dash-pipeline/SAI/templates/utils.cpp.j2 | 69 ++++- dash-pipeline/SAI/templates/utils.h.j2 | 357 ++++++++++++++--------- 2 files changed, 275 insertions(+), 151 deletions(-) diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index 962b9b8b7..c2738e519 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -12,39 +12,57 @@ std::unique_ptr stub; void correctIpPrefix(void *ip, const void *mask, size_t length) { + DASH_LOG_ENTER(); + auto _ip = reinterpret_cast(ip); auto _mask = reinterpret_cast(mask); + for (size_t i = 0; i < length; i++) { _ip[i] = _ip[i] & _mask[i]; } } -int leadingNonZeroBits(const uint32_t ipv4) { - auto firstSetBit = __builtin_ffs(ipv4); - if (0==firstSetBit) { +int leadingNonZeroBits(const uint32_t ipv4) +{ + DASH_LOG_ENTER(); + + auto firstSetBit = __builtin_ffs(ipv4); + + if (0==firstSetBit) + { return 0; } - return 33 - firstSetBit; + + return 33 - firstSetBit; } -int leadingNonZeroBits(const sai_ip6_t ipv6) { +int leadingNonZeroBits(const sai_ip6_t& ipv6) +{ + DASH_LOG_ENTER(); + int trailingZeros = 0; - for (int i = 0; i < 16; i+=4) { + + for (int i = 0; i < 16; i+=4) + { auto num = static_cast(ipv6[i]) + - (static_cast(ipv6[i+1]) << 8) + - (static_cast(ipv6[i+2]) << 16) + - (static_cast(ipv6[i+3]) << 24); - auto firstSetBit = leadingNonZeroBits(num); - if (firstSetBit > 0) { + (static_cast(ipv6[i+1]) << 8) + + (static_cast(ipv6[i+2]) << 16) + + (static_cast(ipv6[i+3]) << 24); + + auto firstSetBit = leadingNonZeroBits(num); + + if (firstSetBit > 0) + { return 129-trailingZeros-firstSetBit; } + trailingZeros += 32; } + return 0; } - static int GetDeviceId() { DASH_LOG_ENTER(); @@ -52,17 +70,27 @@ static int GetDeviceId() return deviceId; } -std::string updateTypeStr(p4::v1::Update_Type updateType) { +std::string updateTypeStr(p4::v1::Update_Type updateType) +{ + DASH_LOG_ENTER(); + const google::protobuf::EnumDescriptor *descriptor = p4::v1::Update_Type_descriptor(); + return descriptor->FindValueByNumber(updateType)->name(); } -const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) { - for (uint32_t i = 0; i < attr_count; i++) { - if (attr_list[i].id == id) { +const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + + for (uint32_t i = 0; i < attr_count; i++) + { + if (attr_list[i].id == id) + { return &attr_list[i]; } } + return nullptr; } @@ -71,14 +99,21 @@ grpc::StatusCode MutateTableEntry(std::shared_ptr entry, p4: DASH_LOG_ENTER(); p4::v1::WriteRequest request; + request.set_device_id(GetDeviceId()); + auto update = request.add_updates(); + update->set_type(updateType); + auto entity = update->mutable_entity(); + entity->set_allocated_table_entry(entry.get()); p4::v1::WriteResponse rep; + grpc::ClientContext context; + grpc::Status status = stub->Write(&context, request, &rep); if (status.ok()) @@ -93,6 +128,7 @@ grpc::StatusCode MutateTableEntry(std::shared_ptr entry, p4: //MILIND?? What is this? reference release? memory release? entity->release_table_entry(); + return status.error_code(); } @@ -122,6 +158,7 @@ bool InsertInTable(std::shared_ptr entry, sai_object_type_t // TODO to be removed and merged #define DASH_OBJECT_SHFT 48 #define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype< #include -template -void booldataSetVal(const sai_attribute_value_t &value, T &t, int bits = 8){ + template +void booldataSetVal(const sai_attribute_value_t &value, T &t, int bits = 8) +{ assert(bits <= 8); + t->set_value(const_cast(&value.booldata), 1); } -template -void booldataSetVal(const bool &value, T &t, int bits = 8){ + template +void booldataSetVal(const bool &value, T &t, int bits = 8) +{ assert(bits <= 8); + t->set_value(const_cast(&value), 1); } -template -void u8SetVal(const sai_attribute_value_t &value, T &t, int bits = 8){ + template +void u8SetVal(const sai_attribute_value_t &value, T &t, int bits = 8) +{ assert(bits <= 8); + t->set_value(const_cast(&value.u8), 1); } -template -void u8SetVal(const sai_uint8_t &value, T &t, int bits = 8){ + template +void u8SetVal(const sai_uint8_t &value, T &t, int bits = 8) +{ assert(bits <= 8); + t->set_value(const_cast(&value), 1); } -template -void u16SetVal(const sai_attribute_value_t &value, T &t, int bits = 16){ + template +void u16SetVal(const sai_attribute_value_t &value, T &t, int bits = 16) +{ assert(bits <= 16); + uint16_t val = value.u16; + val = htons(val); - t->set_value(&val, 2);} -template -void u16SetVal(const sai_uint16_t &value, T &t, int bits = 16){ + t->set_value(&val, 2); +} + + template +void u16SetVal(const sai_uint16_t &value, T &t, int bits = 16) +{ assert(bits <= 16); + uint16_t val = value; + val = htons(val); + t->set_value(&val, 2); } -template -void u32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32){ + template +void u32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32) +{ assert(bits <= 32); + uint32_t val = value.u32; + val = htonl(val); val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_value(&val, bytes); } -template -void s32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32){ + template +void s32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32) +{ assert(bits <= 32); + uint32_t val = value.u32; + val = htonl(val); val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_value(&val, bytes); } -template -void u32SetVal(const sai_uint32_t &value, T &t, int bits = 32){ + template +void u32SetVal(const sai_uint32_t &value, T &t, int bits = 32) +{ assert(bits <= 32); + uint32_t val = value; + val = htonl(val); val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_value(&val, bytes); } -template -void u64SetVal(const sai_attribute_value_t &value, T &t, int bits = 64){ + template +void u64SetVal(const sai_uint64_t &value, T &t, int bits = 64) +{ assert(bits <= 64); - uint64_t val = value.u64; - if (*reinterpret_cast("\0\x01") == 0) { // Little Endian - const uint32_t high_part = htonl(static_cast(val >> 32)); - const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); - val = (static_cast(low_part) << 32) | high_part; - val = val >> (64-bits); - } - int bytes = (bits + 7) / 8; - t->set_value(&val, bytes);} -template -void u64SetVal(const sai_uint64_t &value, T &t, int bits = 64) { - assert(bits <= 64); uint64_t val = value; - if (*reinterpret_cast("\0\x01") == 0) { // Little Endian + + if (*reinterpret_cast("\0\x01") == 0) // Little Endian + { const uint32_t high_part = htonl(static_cast(val >> 32)); const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); + val = (static_cast(low_part) << 32) | high_part; - val = val >> (64-bits); + val = val >> (64 - bits); } + int bytes = (bits + 7) / 8; + t->set_value(&val, bytes); } -template -void ipaddrSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u64SetVal(const sai_attribute_value_t &value, T &t, int bits = 64) +{ + u64SetVal(value.u64, t, bits); +} + + template +void ipaddrSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ ipaddrSetVal(value.ipaddr, t); } -template -void ipaddrSetVal(const sai_ip_address_t &value, T &t, int bits = -1){ - switch(value.addr_family) { - case SAI_IP_ADDR_FAMILY_IPV4: { - uint32_t val = value.addr.ip4; - t->set_value(&val, 4); - } - break; - case SAI_IP_ADDR_FAMILY_IPV6: { - t->set_value(const_cast(&value.addr.ip6[0]), 16); - } - break; - default: assert(0 && "unrecognzed value.ipaddr.addr_family"); + template +void ipaddrSetVal(const sai_ip_address_t &value, T &t, int bits = -1) +{ + switch(value.addr_family) + { + case SAI_IP_ADDR_FAMILY_IPV4: + { + uint32_t val = value.addr.ip4; + + t->set_value(&val, 4); + } + break; + + case SAI_IP_ADDR_FAMILY_IPV6: + { + t->set_value(const_cast(&value.addr.ip6[0]), 16); + } + break; + + default: + assert(0 && "unrecognzed value.ipaddr.addr_family"); } } -template -void ipaddrSetMask(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void ipaddrSetMask(const sai_attribute_value_t &value, T &t, int bits = -1) +{ ipaddrSetMask(value.ipaddr, t); } -template -void ipaddrSetMask(const sai_ip_address_t &value, T &t, int bits = -1){ - switch(value.addr_family) { - case SAI_IP_ADDR_FAMILY_IPV4: { - uint32_t mask = value.addr.ip4; - t->set_mask(&mask, 4); - } - break; - case SAI_IP_ADDR_FAMILY_IPV6: { - t->set_mask(const_cast(&value.addr.ip6[0]), 16); - } - break; - default: assert(0 && "unrecognzed value.ipaddr.addr_family"); + template +void ipaddrSetMask(const sai_ip_address_t &value, T &t, int bits = -1) +{ + switch(value.addr_family) + { + case SAI_IP_ADDR_FAMILY_IPV4: + { + uint32_t mask = value.addr.ip4; + + t->set_mask(&mask, 4); + } + break; + + case SAI_IP_ADDR_FAMILY_IPV6: + { + t->set_mask(const_cast(&value.addr.ip6[0]), 16); + } + break; + + default: + assert(0 && "unrecognzed value.ipaddr.addr_family"); } } -template -void macSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void macSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ t->set_value(const_cast(&value.mac[0]), 6); } -template -void macSetVal(const sai_mac_t &value, T &t, int bits = -1){ + template +void macSetVal(const sai_mac_t &value, T &t, int bits = -1) +{ t->set_value(const_cast(&value[0]), 6); } @@ -180,137 +232,172 @@ void correctIpPrefix(void *ip, const void *mask, size_t length); int leadingNonZeroBits(const uint32_t ipv4); -int leadingNonZeroBits(const sai_ip6_t ipv6); +int leadingNonZeroBits(const sai_ip6_t& ipv6); -template -void ipPrefixSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void ipPrefixSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ ipPrefixSetVal(value.ipprefix, t); } -template -void ipPrefixSetVal(const sai_ip_prefix_t &value, T &t, int bits = -1){ - switch(value.addr_family) { - case SAI_IP_ADDR_FAMILY_IPV4: { - uint32_t val = value.addr.ip4; - correctIpPrefix(&val, &value.mask.ip4, 4); - t->set_value(&val, 4); - val = htonl(value.mask.ip4); - // LPM entry match field prefix length calculation needs to be fixed to accomodate 128 bit size. - // So the 96 is added to the prefix length. - t->set_prefix_len(leadingNonZeroBits(val)+96); - } - break; - case SAI_IP_ADDR_FAMILY_IPV6: { - uint8_t ip[16]; - std::copy(const_cast(&value.addr.ip6[0]), const_cast(&value.addr.ip6[0])+16, ip); - correctIpPrefix(ip, value.mask.ip6, 16); - t->set_value(ip, 16); - t->set_prefix_len(leadingNonZeroBits(value.mask.ip6)); - } - break; - default: assert(0 && "unrecognzed value.ipaddr.addr_family"); + template +void ipPrefixSetVal(const sai_ip_prefix_t &value, T &t, int bits = -1) +{ + switch(value.addr_family) + { + case SAI_IP_ADDR_FAMILY_IPV4: + { + uint32_t val = value.addr.ip4; + + correctIpPrefix(&val, &value.mask.ip4, 4); + + t->set_value(&val, 4); + + val = htonl(value.mask.ip4); + + // LPM entry match field prefix length calculation needs to be fixed to accomodate 128 bit size. + // So the 96 is added to the prefix length. + t->set_prefix_len(leadingNonZeroBits(val) + 96); + } + break; + + case SAI_IP_ADDR_FAMILY_IPV6: + { + uint8_t ip[16]; + + std::copy(const_cast(&value.addr.ip6[0]), const_cast(&value.addr.ip6[0]) + 16, ip); + + correctIpPrefix(ip, value.mask.ip6, 16); + + t->set_value(ip, 16); + t->set_prefix_len(leadingNonZeroBits(value.mask.ip6)); + } + break; + + default: + assert(0 && "unrecognzed value.ipaddr.addr_family"); } } -template -void u8listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u8listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u16listVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u16listVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u32listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u32listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u64listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u64listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void ipaddrlistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void ipaddrlistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u8rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u8rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u16rangelistVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u16rangelistVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u32rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u32rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void u64rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void u64rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -template -void ipaddrrangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1){ + template +void ipaddrrangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) +{ assert (0 && "NYI"); } -const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list); - -template -void u32SetMask(const sai_attribute_value_t &value, T &t, int bits = 32){ + template +void u32SetMask(const sai_attribute_value_t &value, T &t, int bits = 32) +{ assert(bits <= 32); + uint32_t val = value.u32; + val = htonl(val); val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_mask(&val, bytes); } -template -void u32SetMask(const sai_uint32_t &value, T &t, int bits = 32){ + template +void u32SetMask(const sai_uint32_t &value, T &t, int bits = 32) +{ assert(bits <= 32); + uint32_t val = value; + val = htonl(val); val = val >> (32 - bits); + int bytes = (bits + 7) / 8; + t->set_mask(&val, bytes); } -template -void u64SetMask(const sai_attribute_value_t &value, T &t, int bits = 64){ + template +void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) +{ assert(bits <= 64); - uint64_t val = value.u64; - if (*reinterpret_cast("\0\x01") == 0) { // Little Endian - const uint32_t high_part = htonl(static_cast(val >> 32)); - const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); - val = (static_cast(low_part) << 32) | high_part; - val = val >> (64-bits); - } - int bytes = (bits + 7) / 8; - t->set_value(&val, bytes);} -template -void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) { - assert(bits <= 64); uint64_t val = value; - if (*reinterpret_cast("\0\x01") == 0) { // Little Endian + + if (*reinterpret_cast("\0\x01") == 0) // Little Endian + { const uint32_t high_part = htonl(static_cast(val >> 32)); const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); + val = (static_cast(low_part) << 32) | high_part; val = val >> (64-bits); } + int bytes = (bits + 7) / 8; + t->set_mask(&val, bytes); } + template +void u64SetMask(const sai_attribute_value_t &value, T &t, int bits = 64) +{ + u64SetMask(value.u64, t, bits); +} + +const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list); + grpc::StatusCode MutateTableEntry(std::shared_ptr, p4::v1::Update_Type updateType); sai_object_id_t NextObjectId(sai_object_type_t objectType); From 69fbd6e8f0153ad4b14b37bd047b5b90f73cfeeb Mon Sep 17 00:00:00 2001 From: kcudnik Date: Tue, 8 Aug 2023 18:49:55 +0200 Subject: [PATCH 49/75] [SAI] Move utils to it's own namespace dash::utils To prevent leak symbols to other modules --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 2 + dash-pipeline/SAI/templates/utils.cpp.j2 | 18 +- dash-pipeline/SAI/templates/utils.h.j2 | 562 +++++++++++----------- 3 files changed, 295 insertions(+), 287 deletions(-) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index b4dae1376..4e815bc47 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -1,5 +1,7 @@ #include "utils.h" +using namespace dash::utils; + {% set registered_group = [] %} {% for table in tables %} {% if table.name in registered_group %}{% continue %}{% endif %} diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index c2738e519..4a80b64f0 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -10,7 +10,7 @@ static std::atomic nextId; std::unique_ptr stub; -void correctIpPrefix(void *ip, const void *mask, size_t length) +void dash::utils::correctIpPrefix(void *ip, const void *mask, size_t length) { DASH_LOG_ENTER(); @@ -23,7 +23,7 @@ void correctIpPrefix(void *ip, const void *mask, size_t length) } } -int leadingNonZeroBits(const uint32_t ipv4) +int dash::utils::leadingNonZeroBits(const uint32_t ipv4) { DASH_LOG_ENTER(); @@ -37,7 +37,7 @@ int leadingNonZeroBits(const uint32_t ipv4) return 33 - firstSetBit; } -int leadingNonZeroBits(const sai_ip6_t& ipv6) +int dash::utils::leadingNonZeroBits(const sai_ip6_t& ipv6) { DASH_LOG_ENTER(); @@ -70,7 +70,7 @@ static int GetDeviceId() return deviceId; } -std::string updateTypeStr(p4::v1::Update_Type updateType) +static std::string updateTypeStr(p4::v1::Update_Type updateType) { DASH_LOG_ENTER(); @@ -79,7 +79,7 @@ std::string updateTypeStr(p4::v1::Update_Type updateType) return descriptor->FindValueByNumber(updateType)->name(); } -const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) +const sai_attribute_t* dash::utils::getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) { DASH_LOG_ENTER(); @@ -94,7 +94,7 @@ const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const return nullptr; } -grpc::StatusCode MutateTableEntry(std::shared_ptr entry, p4::v1::Update_Type updateType) +grpc::StatusCode dash::utils::MutateTableEntry(std::shared_ptr entry, p4::v1::Update_Type updateType) { DASH_LOG_ENTER(); @@ -132,7 +132,7 @@ grpc::StatusCode MutateTableEntry(std::shared_ptr entry, p4: return status.error_code(); } -bool InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId) +bool dash::utils::InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId) { DASH_LOG_ENTER(); @@ -159,14 +159,14 @@ bool InsertInTable(std::shared_ptr entry, sai_object_type_t #define DASH_OBJECT_SHFT 48 #define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype< #include - template -void booldataSetVal(const sai_attribute_value_t &value, T &t, int bits = 8) +namespace dash { - assert(bits <= 8); - - t->set_value(const_cast(&value.booldata), 1); -} - - template -void booldataSetVal(const bool &value, T &t, int bits = 8) -{ - assert(bits <= 8); + namespace utils + { + template + void booldataSetVal(const sai_attribute_value_t &value, T &t, int bits = 8) + { + assert(bits <= 8); - t->set_value(const_cast(&value), 1); -} + t->set_value(const_cast(&value.booldata), 1); + } - template -void u8SetVal(const sai_attribute_value_t &value, T &t, int bits = 8) -{ - assert(bits <= 8); + template + void booldataSetVal(const bool &value, T &t, int bits = 8) + { + assert(bits <= 8); - t->set_value(const_cast(&value.u8), 1); -} + t->set_value(const_cast(&value), 1); + } - template -void u8SetVal(const sai_uint8_t &value, T &t, int bits = 8) -{ - assert(bits <= 8); + template + void u8SetVal(const sai_attribute_value_t &value, T &t, int bits = 8) + { + assert(bits <= 8); - t->set_value(const_cast(&value), 1); -} + t->set_value(const_cast(&value.u8), 1); + } - template -void u16SetVal(const sai_attribute_value_t &value, T &t, int bits = 16) -{ - assert(bits <= 16); + template + void u8SetVal(const sai_uint8_t &value, T &t, int bits = 8) + { + assert(bits <= 8); - uint16_t val = value.u16; + t->set_value(const_cast(&value), 1); + } - val = htons(val); + template + void u16SetVal(const sai_attribute_value_t &value, T &t, int bits = 16) + { + assert(bits <= 16); - t->set_value(&val, 2); -} + uint16_t val = value.u16; - template -void u16SetVal(const sai_uint16_t &value, T &t, int bits = 16) -{ - assert(bits <= 16); + val = htons(val); - uint16_t val = value; + t->set_value(&val, 2); + } - val = htons(val); + template + void u16SetVal(const sai_uint16_t &value, T &t, int bits = 16) + { + assert(bits <= 16); - t->set_value(&val, 2); -} + uint16_t val = value; - template -void u32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32) -{ - assert(bits <= 32); + val = htons(val); - uint32_t val = value.u32; + t->set_value(&val, 2); + } - val = htonl(val); - val = val >> (32 - bits); + template + void u32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32) + { + assert(bits <= 32); - int bytes = (bits + 7) / 8; + uint32_t val = value.u32; - t->set_value(&val, bytes); -} + val = htonl(val); + val = val >> (32 - bits); - template -void s32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32) -{ - assert(bits <= 32); + int bytes = (bits + 7) / 8; - uint32_t val = value.u32; + t->set_value(&val, bytes); + } - val = htonl(val); - val = val >> (32 - bits); + template + void s32SetVal(const sai_attribute_value_t &value, T &t, int bits = 32) + { + assert(bits <= 32); - int bytes = (bits + 7) / 8; + uint32_t val = value.u32; - t->set_value(&val, bytes); -} + val = htonl(val); + val = val >> (32 - bits); - template -void u32SetVal(const sai_uint32_t &value, T &t, int bits = 32) -{ - assert(bits <= 32); + int bytes = (bits + 7) / 8; - uint32_t val = value; + t->set_value(&val, bytes); + } - val = htonl(val); - val = val >> (32 - bits); + template + void u32SetVal(const sai_uint32_t &value, T &t, int bits = 32) + { + assert(bits <= 32); - int bytes = (bits + 7) / 8; + uint32_t val = value; - t->set_value(&val, bytes); -} + val = htonl(val); + val = val >> (32 - bits); - template -void u64SetVal(const sai_uint64_t &value, T &t, int bits = 64) -{ - assert(bits <= 64); + int bytes = (bits + 7) / 8; - uint64_t val = value; + t->set_value(&val, bytes); + } - if (*reinterpret_cast("\0\x01") == 0) // Little Endian - { - const uint32_t high_part = htonl(static_cast(val >> 32)); - const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); + template + void u64SetVal(const sai_uint64_t &value, T &t, int bits = 64) + { + assert(bits <= 64); - val = (static_cast(low_part) << 32) | high_part; - val = val >> (64 - bits); - } + uint64_t val = value; - int bytes = (bits + 7) / 8; + if (*reinterpret_cast("\0\x01") == 0) // Little Endian + { + const uint32_t high_part = htonl(static_cast(val >> 32)); + const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); - t->set_value(&val, bytes); -} + val = (static_cast(low_part) << 32) | high_part; + val = val >> (64 - bits); + } - template -void u64SetVal(const sai_attribute_value_t &value, T &t, int bits = 64) -{ - u64SetVal(value.u64, t, bits); -} + int bytes = (bits + 7) / 8; - template -void ipaddrSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - ipaddrSetVal(value.ipaddr, t); -} + t->set_value(&val, bytes); + } - template -void ipaddrSetVal(const sai_ip_address_t &value, T &t, int bits = -1) -{ - switch(value.addr_family) - { - case SAI_IP_ADDR_FAMILY_IPV4: + template + void u64SetVal(const sai_attribute_value_t &value, T &t, int bits = 64) { - uint32_t val = value.addr.ip4; - - t->set_value(&val, 4); + u64SetVal(value.u64, t, bits); } - break; - case SAI_IP_ADDR_FAMILY_IPV6: + template + void ipaddrSetVal(const sai_ip_address_t &value, T &t, int bits = -1) { - t->set_value(const_cast(&value.addr.ip6[0]), 16); + switch(value.addr_family) + { + case SAI_IP_ADDR_FAMILY_IPV4: + { + uint32_t val = value.addr.ip4; + + t->set_value(&val, 4); + } + break; + + case SAI_IP_ADDR_FAMILY_IPV6: + { + t->set_value(const_cast(&value.addr.ip6[0]), 16); + } + break; + + default: + assert(0 && "unrecognzed value.ipaddr.addr_family"); + } } - break; - default: - assert(0 && "unrecognzed value.ipaddr.addr_family"); - } -} + template + void ipaddrSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + ipaddrSetVal(value.ipaddr, t); + } - template -void ipaddrSetMask(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - ipaddrSetMask(value.ipaddr, t); -} + template + void ipaddrSetMask(const sai_ip_address_t &value, T &t, int bits = -1) + { + switch(value.addr_family) + { + case SAI_IP_ADDR_FAMILY_IPV4: + { + uint32_t mask = value.addr.ip4; + + t->set_mask(&mask, 4); + } + break; + + case SAI_IP_ADDR_FAMILY_IPV6: + { + t->set_mask(const_cast(&value.addr.ip6[0]), 16); + } + break; + + default: + assert(0 && "unrecognzed value.ipaddr.addr_family"); + } + } - template -void ipaddrSetMask(const sai_ip_address_t &value, T &t, int bits = -1) -{ - switch(value.addr_family) - { - case SAI_IP_ADDR_FAMILY_IPV4: + template + void ipaddrSetMask(const sai_attribute_value_t &value, T &t, int bits = -1) { - uint32_t mask = value.addr.ip4; + ipaddrSetMask(value.ipaddr, t); + } - t->set_mask(&mask, 4); + template + void macSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + t->set_value(const_cast(&value.mac[0]), 6); } - break; - case SAI_IP_ADDR_FAMILY_IPV6: + template + void macSetVal(const sai_mac_t &value, T &t, int bits = -1) { - t->set_mask(const_cast(&value.addr.ip6[0]), 16); + t->set_value(const_cast(&value[0]), 6); } - break; - default: - assert(0 && "unrecognzed value.ipaddr.addr_family"); - } -} + void correctIpPrefix(void *ip, const void *mask, size_t length); - template -void macSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - t->set_value(const_cast(&value.mac[0]), 6); -} + int leadingNonZeroBits(const uint32_t ipv4); - template -void macSetVal(const sai_mac_t &value, T &t, int bits = -1) -{ - t->set_value(const_cast(&value[0]), 6); -} + int leadingNonZeroBits(const sai_ip6_t& ipv6); + + template + void ipPrefixSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + ipPrefixSetVal(value.ipprefix, t); + } -void correctIpPrefix(void *ip, const void *mask, size_t length); + template + void ipPrefixSetVal(const sai_ip_prefix_t &value, T &t, int bits = -1) + { + switch(value.addr_family) + { + case SAI_IP_ADDR_FAMILY_IPV4: + { + uint32_t val = value.addr.ip4; -int leadingNonZeroBits(const uint32_t ipv4); + correctIpPrefix(&val, &value.mask.ip4, 4); -int leadingNonZeroBits(const sai_ip6_t& ipv6); + t->set_value(&val, 4); - template -void ipPrefixSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - ipPrefixSetVal(value.ipprefix, t); -} + val = htonl(value.mask.ip4); - template -void ipPrefixSetVal(const sai_ip_prefix_t &value, T &t, int bits = -1) -{ - switch(value.addr_family) - { - case SAI_IP_ADDR_FAMILY_IPV4: - { - uint32_t val = value.addr.ip4; + // LPM entry match field prefix length calculation needs to be fixed to accomodate 128 bit size. + // So the 96 is added to the prefix length. + t->set_prefix_len(leadingNonZeroBits(val) + 96); + } + break; + + case SAI_IP_ADDR_FAMILY_IPV6: + { + uint8_t ip[16]; - correctIpPrefix(&val, &value.mask.ip4, 4); + std::copy(const_cast(&value.addr.ip6[0]), const_cast(&value.addr.ip6[0]) + 16, ip); - t->set_value(&val, 4); + correctIpPrefix(ip, value.mask.ip6, 16); - val = htonl(value.mask.ip4); + t->set_value(ip, 16); + t->set_prefix_len(leadingNonZeroBits(value.mask.ip6)); + } + break; - // LPM entry match field prefix length calculation needs to be fixed to accomodate 128 bit size. - // So the 96 is added to the prefix length. - t->set_prefix_len(leadingNonZeroBits(val) + 96); + default: + assert(0 && "unrecognzed value.ipaddr.addr_family"); + } } - break; - case SAI_IP_ADDR_FAMILY_IPV6: + template + void u8listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) { - uint8_t ip[16]; - - std::copy(const_cast(&value.addr.ip6[0]), const_cast(&value.addr.ip6[0]) + 16, ip); + assert (0 && "NYI"); + } - correctIpPrefix(ip, value.mask.ip6, 16); + template + void u16listVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - t->set_value(ip, 16); - t->set_prefix_len(leadingNonZeroBits(value.mask.ip6)); + template + void u32listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); } - break; - default: - assert(0 && "unrecognzed value.ipaddr.addr_family"); - } -} + template + void u64listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void u8listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void ipaddrlistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void u16listVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void u8rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void u32listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void u16rangelistVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void u64listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void u32rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void ipaddrlistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void u64rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void u8rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void ipaddrrangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) + { + assert (0 && "NYI"); + } - template -void u16rangelistVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + template + void u32SetMask(const sai_attribute_value_t &value, T &t, int bits = 32) + { + assert(bits <= 32); - template -void u32rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + uint32_t val = value.u32; - template -void u64rangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + val = htonl(val); + val = val >> (32 - bits); - template -void ipaddrrangelistSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) -{ - assert (0 && "NYI"); -} + int bytes = (bits + 7) / 8; - template -void u32SetMask(const sai_attribute_value_t &value, T &t, int bits = 32) -{ - assert(bits <= 32); + t->set_mask(&val, bytes); + } - uint32_t val = value.u32; + template + void u32SetMask(const sai_uint32_t &value, T &t, int bits = 32) + { + assert(bits <= 32); - val = htonl(val); - val = val >> (32 - bits); + uint32_t val = value; - int bytes = (bits + 7) / 8; + val = htonl(val); + val = val >> (32 - bits); - t->set_mask(&val, bytes); -} + int bytes = (bits + 7) / 8; - template -void u32SetMask(const sai_uint32_t &value, T &t, int bits = 32) -{ - assert(bits <= 32); - - uint32_t val = value; - - val = htonl(val); - val = val >> (32 - bits); - - int bytes = (bits + 7) / 8; - - t->set_mask(&val, bytes); -} + t->set_mask(&val, bytes); + } - template -void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) -{ - assert(bits <= 64); + template + void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) + { + assert(bits <= 64); - uint64_t val = value; + uint64_t val = value; - if (*reinterpret_cast("\0\x01") == 0) // Little Endian - { - const uint32_t high_part = htonl(static_cast(val >> 32)); - const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); + if (*reinterpret_cast("\0\x01") == 0) // Little Endian + { + const uint32_t high_part = htonl(static_cast(val >> 32)); + const uint32_t low_part = htonl(static_cast(val & 0xFFFFFFFFLL)); - val = (static_cast(low_part) << 32) | high_part; - val = val >> (64-bits); - } + val = (static_cast(low_part) << 32) | high_part; + val = val >> (64-bits); + } - int bytes = (bits + 7) / 8; + int bytes = (bits + 7) / 8; - t->set_mask(&val, bytes); -} + t->set_mask(&val, bytes); + } - template -void u64SetMask(const sai_attribute_value_t &value, T &t, int bits = 64) -{ - u64SetMask(value.u64, t, bits); -} + template + void u64SetMask(const sai_attribute_value_t &value, T &t, int bits = 64) + { + u64SetMask(value.u64, t, bits); + } -const sai_attribute_t *getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list); + const sai_attribute_t* getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list); -grpc::StatusCode MutateTableEntry(std::shared_ptr, p4::v1::Update_Type updateType); + grpc::StatusCode MutateTableEntry(std::shared_ptr, p4::v1::Update_Type updateType); -sai_object_id_t NextObjectId(sai_object_type_t objectType); + sai_object_id_t NextObjectId(sai_object_type_t objectType); -bool InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId); + bool InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId); -bool RemoveFromTable(sai_object_id_t id); + bool RemoveFromTable(sai_object_id_t id); + } +} From 5f519dd882b84f1d18b9835d7f6bdd6df2416041 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Tue, 8 Aug 2023 20:05:31 +0200 Subject: [PATCH 50/75] [SAI] Move fixed api implementation to proper DashSai class --- dash-pipeline/SAI/sai_api_gen.py | 2 +- dash-pipeline/SAI/templates/Makefile.j2 | 3 +- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 475 ++++++++++++++++++ dash-pipeline/SAI/templates/dashsai.h.j2 | 106 ++++ dash-pipeline/SAI/templates/saiapi.cpp.j2 | 17 +- .../SAI/templates/saifixedapis.cpp.j2 | 218 +------- dash-pipeline/SAI/templates/saiimpl.h.j2 | 4 + dash-pipeline/SAI/templates/utils.cpp.j2 | 155 +----- dash-pipeline/SAI/templates/utils.h.j2 | 10 +- 9 files changed, 621 insertions(+), 369 deletions(-) create mode 100644 dash-pipeline/SAI/templates/dashsai.cpp.j2 create mode 100644 dash-pipeline/SAI/templates/dashsai.h.j2 diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 07e1acc93..aafaa9275 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -381,7 +381,7 @@ def write_sai_makefile(sai_api_name_list, sai_api_full_name_list): def write_sai_fixed_api_files(sai_api_full_name_list): env = Environment(loader=FileSystemLoader('.')) - for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp', 'saiimpl.h', 'logger.h', 'logger.cpp', 'saidash.h', 'config.h', 'config.cpp']: + for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp', 'saiimpl.h', 'logger.h', 'logger.cpp', 'saidash.h', 'dashsai.h', 'dashsai.cpp', 'config.h', 'config.cpp']: env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) sai_impl_tm = env.get_template('/templates/%s.j2' % filename) sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], api_names = sai_api_full_name_list) diff --git a/dash-pipeline/SAI/templates/Makefile.j2 b/dash-pipeline/SAI/templates/Makefile.j2 index aac6a2183..65f05ad7d 100644 --- a/dash-pipeline/SAI/templates/Makefile.j2 +++ b/dash-pipeline/SAI/templates/Makefile.j2 @@ -61,7 +61,8 @@ SAI_OBJS=$(SAI_SRCS:.c=.o) DASH_FIXED_SAI_SRCS=utils.cpp \ saifixedapis.cpp \ logger.cpp \ - config.cpp + config.cpp \ + dashsai.cpp DASH_FIXED_SAI_OBJ=$(DASH_FIXED_SAI_SRCS:.cpp=.o) # DASH libsai "generated" sources (from P4 code) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 new file mode 100644 index 000000000..746e4f944 --- /dev/null +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -0,0 +1,475 @@ +#include "dashsai.h" + +using namespace dash; + +#define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 + +#define DASH_OBJECT_SHFT 48 +#define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype< _lock(m_tableLock); + +DashSai::DashSai(): + m_apiInitialized(false) +{ + DASH_LOG_ENTER(); + + // those oids are constant + + m_switchId = DASH_MAKE_OID(SAI_OBJECT_TYPE_SWITCH, 1); + m_defaultCpuPortId = DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT, 64); + m_defaultVlanId = DASH_MAKE_OID(SAI_OBJECT_TYPE_VLAN, 1); + m_defaultVrfId = DASH_MAKE_OID(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, 1); + m_default1QBridgeId = DASH_MAKE_OID(SAI_OBJECT_TYPE_BRIDGE, 1); +} + +DashSai::~DashSai() +{ + DASH_LOG_ENTER(); + + if (m_apiInitialized) + { + apiUninitialize(); + } +} + +sai_status_t DashSai::apiInitialize( + _In_ uint64_t flags, + _In_ const sai_service_method_table_t *services) +{ + DASH_LOG_ENTER(); + + if (m_apiInitialized) + { + DASH_LOG_ERROR("api already initialized"); + + return SAI_STATUS_FAILURE; + } + + m_cfg = dash::Config::getConfig(services); + + DASH_LOG_NOTICE("config: %s", m_cfg->getConfigString().c_str()); + + for (uint32_t i = 1; i <= m_cfg->m_bmv2NumPorts; i++) + { + m_portList.push_back(DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,i)); + } + + assert(m_cfg->m_bmv2NumPorts == (uint32_t)m_portList.size()); + + const grpc::string _grpcTarget = m_cfg->m_grpcTarget; + const char* test_json = m_cfg->m_pipelineJson.c_str(); + const char* test_proto_json = m_cfg->m_pipelineProto.c_str(); + + DASH_LOG_NOTICE("GRPC call SetForwardingPipelineConfig %s => %s, %s", _grpcTarget.c_str(), test_json, test_proto_json); + + auto p4info = parse_p4info(test_proto_json); + + auto set_election_id = [](p4::v1::Uint128 *election_id) + { + election_id->set_high(0); + election_id->set_low(1); + }; + + grpc::ClientContext stream_context; + + m_grpcChannel = grpc::CreateChannel(_grpcTarget, grpc::InsecureChannelCredentials()); + + m_stub = p4::v1::P4Runtime::NewStub(m_grpcChannel); + + auto stream = m_stub->StreamChannel(&stream_context); + + { + p4::v1::StreamMessageRequest request; + auto arbitration = request.mutable_arbitration(); + arbitration->set_device_id(m_cfg->m_deviceId); + set_election_id(arbitration->mutable_election_id()); + stream->Write(request); + p4::v1::StreamMessageResponse response; + stream->Read(&response); + assert(response.update_case() == p4::v1::StreamMessageResponse::kArbitration); + assert(response.arbitration().status().code() == ::google::rpc::Code::OK); + } + + { + p4::v1::SetForwardingPipelineConfigRequest request; + request.set_device_id(m_cfg->m_deviceId); + request.set_action( + p4::v1::SetForwardingPipelineConfigRequest_Action_VERIFY_AND_COMMIT); + set_election_id(request.mutable_election_id()); + auto config = request.mutable_config(); + config->set_allocated_p4info(&p4info); + std::ifstream istream(test_json); + config->mutable_p4_device_config()->assign( + (std::istreambuf_iterator(istream)), + std::istreambuf_iterator()); + + p4::v1::SetForwardingPipelineConfigResponse rep; + grpc::ClientContext context; + + auto status = m_stub->SetForwardingPipelineConfig(&context, request, &rep); + + assert(status.ok()); + + config->release_p4info(); + } + + m_apiInitialized = true; + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::apiUninitialize(void) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + m_cfg = nullptr; + + m_portList.clear(); + + m_tableEntryMap.clear(); + + m_nextId = 0; + + m_grpcChannel = nullptr; + + m_stub = nullptr; + + m_apiInitialized = false; + + return SAI_STATUS_SUCCESS; +} + +sai_object_type_t DashSai::objectTypeQuery( + _In_ sai_object_id_t object_id) +{ + DASH_LOG_ENTER(); + + if (!m_apiInitialized) + { + DASH_LOG_ERROR("api not initialized"); + + return SAI_OBJECT_TYPE_NULL; + + } + + return sai_object_type_t(object_id >> (DASH_OBJECT_SHFT)); +} + +sai_object_id_t DashSai::switchIdQuery( + _In_ sai_object_id_t object_id) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + if (object_id == SAI_NULL_OBJECT_ID) + { + return SAI_NULL_OBJECT_ID; + } + + return m_switchId; +} + +sai_status_t DashSai::createSwitch( + _Out_ sai_object_id_t *switch_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + *switch_id = m_switchId; + + DASH_LOG_NOTICE("created switch id: %ld", *switch_id); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::getSwitchAttribute( + _In_ sai_object_id_t switch_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + DASH_LOG_NOTICE("dash_get_switch_attribute()"); + + sai_attribute_t *attr = attr_list; + + for (uint32_t i = 0; i < attr_count ; i++, attr++) + { + switch(attr->id) + { + case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: + + attr->value.u32 = m_cfg->m_bmv2NumPorts; + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->value.u32); + + break; + + case SAI_SWITCH_ATTR_PORT_LIST: + + attr->value.objlist.count = m_cfg->m_bmv2NumPorts; + + for (size_t j = 0; j < m_cfg->m_bmv2NumPorts; j++) + { + attr->value.objlist.list[j] = m_portList.at(j); + } + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, m_cfg->m_bmv2NumPorts); + + break; + + case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID: + + attr->value.oid = m_defaultVlanId; + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID: + + attr->value.oid = m_defaultVrfId; + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", i, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID: + + attr->value.oid = m_default1QBridgeId; + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", i, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_CPU_PORT: + + attr->value.oid = m_defaultCpuPortId; + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_CPU_PORT = %lx", i, attr->value.oid); + + break; + + default: + + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); + + memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage + + break; // TODO FIXME should return NOT SUPPORTED + } + } + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::getPortAttribute( + _In_ sai_object_id_t port_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + DASH_LOG_NOTICE("getPortAttribute()"); + + sai_attribute_t *attr = attr_list; + + for (uint32_t i = 0; i < attr_count ; i++, attr++) + { + switch(attr->id) + { + case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES: + + attr->value.u32 = DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES; + + DASH_LOG_NOTICE("[%d] SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", i, attr->value.u32); + + break; + + default: + + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); + + memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage + + break; // TODO FIXME should return NOT SUPPORTED + } + } + + return SAI_STATUS_SUCCESS; +} + +// private helper methods + +p4::config::v1::P4Info DashSai::parse_p4info( + _In_ const char *path) +{ + DASH_LOG_ENTER(); + + p4::config::v1::P4Info p4info; + std::ifstream istream(path); + assert(istream.good()); + google::protobuf::io::IstreamInputStream istream_(&istream); + google::protobuf::TextFormat::Parse(&istream_, &p4info); + + return p4info; +} + +std::string DashSai::updateTypeStr( + _In_ p4::v1::Update_Type updateType) +{ + DASH_LOG_ENTER(); + + const google::protobuf::EnumDescriptor *descriptor = p4::v1::Update_Type_descriptor(); + + return descriptor->FindValueByNumber(updateType)->name(); +} + +// helper methods + +grpc::StatusCode DashSai::mutateTableEntry( + _In_ std::shared_ptr entry, + _In_ p4::v1::Update_Type updateType) +{ + DASH_LOG_ENTER(); + + if (!m_apiInitialized) + { + DASH_LOG_ERROR("api not initialized"); + + return grpc::StatusCode::CANCELLED; + } + + p4::v1::WriteRequest request; + + request.set_device_id(m_cfg->m_deviceId); + + auto update = request.add_updates(); + + update->set_type(updateType); + + auto entity = update->mutable_entity(); + + entity->set_allocated_table_entry(entry.get()); + + p4::v1::WriteResponse rep; + + grpc::ClientContext context; + + grpc::Status status = m_stub->Write(&context, request, &rep); + + if (status.ok()) + { + DASH_LOG_NOTICE("GRPC call Write::%s OK %s", updateTypeStr(updateType).c_str(), entry->ShortDebugString().c_str()); + } + else + { + DASH_LOG_ERROR("GRPC ERROR[%d]: %s, %s", status.error_code(), status.error_message().c_str(), status.error_details().c_str()); + DASH_LOG_ERROR("GRPC call Write::%s ERROR: %s", updateTypeStr(updateType).c_str(), entry->ShortDebugString().c_str()); + } + + //MILIND?? What is this? reference release? memory release? + entity->release_table_entry(); + + return status.error_code(); +} + +bool DashSai::insertInTable( + _In_ std::shared_ptr entry, + _In_ sai_object_type_t objectType, + _Out_ sai_object_id_t *objId) +{ + DASH_LOG_ENTER(); + + if (!m_apiInitialized) + { + DASH_LOG_ERROR("api not initialized"); + + return false; + } + + auto retCode = mutateTableEntry(entry, p4::v1::Update_Type_INSERT); + + if (grpc::StatusCode::OK != retCode) + { + return false; + } + + MUTEX; + + if (*objId == 0) + { + *objId = getNextObjectId(objectType); + } + + m_tableEntryMap.insert(std::make_pair(*objId, entry)); + + return true; +} + +sai_object_id_t DashSai::getNextObjectId( + _In_ sai_object_type_t objectType) +{ + DASH_LOG_ENTER(); + + if (!m_apiInitialized) + { + DASH_LOG_ERROR("api not initialized"); + + return SAI_NULL_OBJECT_ID; + } + + return DASH_MAKE_OID(objectType, ++m_nextId); +} + +bool DashSai::removeFromTable( + _In_ sai_object_id_t id) +{ + DASH_LOG_ENTER(); + + if (!m_apiInitialized) + { + DASH_LOG_ERROR("api not initialized"); + + return false; + } + + MUTEX; + + auto range = m_tableEntryMap.equal_range(id); + + if (range.first == range.second) + { + DASH_LOG_ERROR("id: %ld not present in the table for deletion!", id); + + return false; + } + + grpc::StatusCode retCode = grpc::StatusCode::OK; + + for (auto itr = range.first; itr != range.second; ++itr) + { + auto entry = itr->second; + auto tempRet = mutateTableEntry(entry, p4::v1::Update_Type_DELETE); + + if (grpc::StatusCode::OK != tempRet) + { + retCode = tempRet; + } + } + + m_tableEntryMap.erase(id); + + return retCode == grpc::StatusCode::OK; +} diff --git a/dash-pipeline/SAI/templates/dashsai.h.j2 b/dash-pipeline/SAI/templates/dashsai.h.j2 new file mode 100644 index 000000000..e92b37133 --- /dev/null +++ b/dash-pipeline/SAI/templates/dashsai.h.j2 @@ -0,0 +1,106 @@ +#pragma once + +#include "utils.h" +#include "config.h" + +namespace dash +{ + class DashSai + { + public: + + DashSai(); + virtual ~DashSai(); + + public: // sai global api + + sai_status_t apiInitialize( + _In_ uint64_t flags, + _In_ const sai_service_method_table_t *services); + + sai_status_t apiUninitialize(void); + + sai_object_type_t objectTypeQuery( + _In_ sai_object_id_t object_id); + + sai_object_id_t switchIdQuery( + _In_ sai_object_id_t object_id); + + public: // QUAD api implementation + + sai_status_t createSwitch( + _Out_ sai_object_id_t *switch_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list); + + sai_status_t getSwitchAttribute( + _In_ sai_object_id_t switch_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list); + + sai_status_t getPortAttribute( + _In_ sai_object_id_t port_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list); + + public: // helper methods + + const sai_attribute_t* getMaskAttr( + _In_ sai_attr_id_t id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list); + + grpc::StatusCode mutateTableEntry( + _In_ std::shared_ptr, + _In_ p4::v1::Update_Type updateType); + + sai_object_id_t getNextObjectId( + _In_ sai_object_type_t objectType); + + bool insertInTable( + _In_ std::shared_ptr entry, + _In_ sai_object_type_t objectType, + _Out_ sai_object_id_t *objId); + + bool removeFromTable( + _In_ sai_object_id_t id); + + private: // private helper methods + + p4::config::v1::P4Info parse_p4info( + _In_ const char *path); + + std::string updateTypeStr( + _In_ p4::v1::Update_Type updateType); + + private: // internal sai objects + + sai_object_id_t m_switchId; + + sai_object_id_t m_defaultCpuPortId; + + sai_object_id_t m_defaultVlanId; + + sai_object_id_t m_defaultVrfId; + + sai_object_id_t m_default1QBridgeId; + + private: + + bool m_apiInitialized; + + std::shared_ptr m_cfg; + + std::vector m_portList; + + std::unordered_multimap > m_tableEntryMap; + + std::mutex m_tableLock; + + std::atomic m_nextId; + + std::shared_ptr m_grpcChannel; + + std::unique_ptr m_stub; + }; +} diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 4e815bc47..5c6496805 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -1,4 +1,5 @@ #include "utils.h" +#include "saiimpl.h" using namespace dash::utils; @@ -48,7 +49,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( // Generate a SAI object ID and fill it as the P4 table key auto mf = matchActionEntry->add_match(); mf->set_field_id({{table['keys'][0].id}}); - objId = NextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}); + objId = dashSai->getNextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}); auto mf_exact = mf->mutable_exact(); {{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); {% else %} @@ -172,7 +173,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( //if (matchedParams != expectedParams) { // goto ErrRet; //} - if (false == InsertInTable(matchActionEntry, (sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, &objId)) { + if (false == dashSai->insertInTable(matchActionEntry, (sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, &objId)) { goto ErrRet; } @@ -181,7 +182,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( *{{ table.name }}_id = objId; return SAI_STATUS_SUCCESS; ErrRet: - RemoveFromTable(*{{ table.name }}_id); + dashSai->removeFromTable(*{{ table.name }}_id); return SAI_STATUS_FAILURE; } @@ -217,7 +218,7 @@ static sai_status_t dash_sai_remove_{{ table.name }}(_In_ sai_object_id_t {{ tab { DASH_LOG_ENTER(); - if (RemoveFromTable({{ table.name }}_id)) + if (dashSai->removeFromTable({{ table.name }}_id)) { return SAI_STATUS_SUCCESS; } @@ -378,7 +379,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( // goto ErrRet; //} // TODO: ternaly needs to set priority - retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_INSERT); + retCode = dashSai->mutateTableEntry(matchActionEntry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK == retCode) { return SAI_STATUS_SUCCESS; } @@ -458,8 +459,10 @@ static sai_status_t dash_sai_remove_{{ table.name }}( {% endif %} {% endfor %} - retCode = MutateTableEntry(matchActionEntry, p4::v1::Update_Type_DELETE); - if (grpc::StatusCode::OK == retCode) { + retCode = dashSai->mutateTableEntry(matchActionEntry, p4::v1::Update_Type_DELETE); + + if (grpc::StatusCode::OK == retCode) + { return SAI_STATUS_SUCCESS; } diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 23a12e1e2..52cee8867 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -8,24 +8,7 @@ #include -// TODO to be moved to separate class/namespace - -static std::shared_ptr _grpcChannel; -extern std::unique_ptr stub; - -#define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 - -#define DASH_OBJECT_SHFT 48 -#define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype< cfg; - -static std::vector port_list; +std::shared_ptr dashSai = std::make_shared(); static sai_status_t dash_sai_create_switch( _Out_ sai_object_id_t *switch_id, @@ -34,11 +17,7 @@ static sai_status_t dash_sai_create_switch( { DASH_LOG_ENTER(); - *switch_id = DASH_MAKE_OID(SAI_OBJECT_TYPE_SWITCH,1), - - DASH_LOG_NOTICE("created switch id: %ld", *switch_id); - - return SAI_STATUS_SUCCESS; + return dashSai->createSwitch(switch_id, attr_count, attr_list); } static sai_status_t dash_sai_get_switch_attribute( @@ -48,78 +27,7 @@ static sai_status_t dash_sai_get_switch_attribute( { DASH_LOG_ENTER(); - DASH_LOG_NOTICE("dash_get_switch_attribute()"); - - sai_attribute_t *attr = attr_list; - - for (uint32_t i = 0; i < attr_count ; i++, attr++) - { - switch(attr->id) - { - case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: - - attr->value.u32 = cfg->m_bmv2NumPorts; - - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->value.u32); - - break; - - case SAI_SWITCH_ATTR_PORT_LIST: - - attr->value.objlist.count = cfg->m_bmv2NumPorts; - - for (size_t j = 0; j < cfg->m_bmv2NumPorts; j++) - { - attr->value.objlist.list[j] = port_list.at(j); - } - - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, cfg->m_bmv2NumPorts); - - break; - - case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID: - - attr->value.oid = DASH_BMV2_DEFAULT_VLAN_ID; - - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->value.oid); - - break; - - case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID: - - attr->value.oid = DASH_BMV2_DEFAULT_VRF_ID; - - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", i, attr->value.oid); - - break; - - case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID: - - attr->value.oid = DASH_BMV2_DEFAULT_1Q_BRIDGE_ID; - - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", i, attr->value.oid); - - break; - - case SAI_SWITCH_ATTR_CPU_PORT: - - attr->value.oid = DASH_BMV2_DEFAULT_CPU_PORT_ID; - - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_CPU_PORT = %lx", i, attr->value.oid); - - break; - - default: - - DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); - - memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage - - break; // TODO FIXME should return NOT SUPPORTED - } - } - - return SAI_STATUS_SUCCESS; + return dashSai->getSwitchAttribute(switch_id, attr_count, attr_list); } sai_switch_api_t dash_sai_switch_api_impl = { @@ -147,33 +55,7 @@ static sai_status_t dash_sai_get_port_attribute( { DASH_LOG_ENTER(); - DASH_LOG_NOTICE("dash_sai_get_port_attribute()"); - - sai_attribute_t *attr = attr_list; - - for (uint32_t i = 0; i < attr_count ; i++, attr++) - { - switch(attr->id) - { - case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES: - - attr->value.u32 = DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES; - - DASH_LOG_NOTICE("[%d] SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", i, attr->value.u32); - - break; - - default: - - DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); - - memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage - - break; // TODO FIXME should return NOT SUPPORTED - } - } - - return SAI_STATUS_SUCCESS; + return dashSai->getPortAttribute(port_id, attr_count, attr_list); } sai_port_api_t dash_sai_port_api_impl = { @@ -256,7 +138,7 @@ sai_object_type_t sai_object_type_query( { DASH_LOG_ENTER(); - return sai_object_type_t(object_id>>DASH_OBJECT_SHFT); + return dashSai->objectTypeQuery(object_id); } sai_object_id_t sai_switch_id_query( @@ -264,12 +146,7 @@ sai_object_id_t sai_switch_id_query( { DASH_LOG_ENTER(); - if (object_id == SAI_NULL_OBJECT_ID) - { - return SAI_NULL_OBJECT_ID; - } - - return DASH_MAKE_OID(SAI_OBJECT_TYPE_SWITCH,1); + return dashSai->switchIdQuery(object_id); } sai_status_t sai_query_attribute_enum_values_capability( @@ -285,97 +162,20 @@ sai_status_t sai_query_attribute_enum_values_capability( return SAI_STATUS_NOT_IMPLEMENTED; } -static p4::config::v1::P4Info parse_p4info(const char *path) -{ - DASH_LOG_ENTER(); - - p4::config::v1::P4Info p4info; - std::ifstream istream(path); - assert(istream.good()); - google::protobuf::io::IstreamInputStream istream_(&istream); - google::protobuf::TextFormat::Parse(&istream_, &p4info); - - return p4info; -} - sai_status_t sai_api_initialize( _In_ uint64_t flags, _In_ const sai_service_method_table_t *services) { DASH_LOG_ENTER(); - cfg = dash::Config::getConfig(services); - - DASH_LOG_NOTICE("config: %s", cfg->getConfigString().c_str()); - - for (uint32_t i = 1; i <= cfg->m_bmv2NumPorts; i++) - { - port_list.push_back(DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,i)); - } - - assert(cfg->m_bmv2NumPorts == (uint32_t)port_list.size()); - - const grpc::string _grpcTarget = cfg->m_grpcTarget; - const char* test_json = cfg->m_pipelineJson.c_str(); - const char* test_proto_json = cfg->m_pipelineProto.c_str(); - int dev_id = cfg->m_deviceId; - - DASH_LOG_NOTICE("GRPC call SetForwardingPipelineConfig %s => %s, %s", _grpcTarget.c_str(), test_json, test_proto_json); - - auto p4info = parse_p4info(test_proto_json); - - auto set_election_id = [](p4::v1::Uint128 *election_id) { - election_id->set_high(0); - election_id->set_low(1); - }; - - grpc::ClientContext stream_context; - _grpcChannel = grpc::CreateChannel(_grpcTarget, grpc::InsecureChannelCredentials()); - stub = p4::v1::P4Runtime::NewStub(_grpcChannel); - auto stream = stub->StreamChannel(&stream_context); - { - p4::v1::StreamMessageRequest request; - auto arbitration = request.mutable_arbitration(); - arbitration->set_device_id(dev_id); - set_election_id(arbitration->mutable_election_id()); - stream->Write(request); - p4::v1::StreamMessageResponse response; - stream->Read(&response); - assert(response.update_case() == p4::v1::StreamMessageResponse::kArbitration); - assert(response.arbitration().status().code() == ::google::rpc::Code::OK); - } - { - p4::v1::SetForwardingPipelineConfigRequest request; - request.set_device_id(dev_id); - request.set_action( - p4::v1::SetForwardingPipelineConfigRequest_Action_VERIFY_AND_COMMIT); - set_election_id(request.mutable_election_id()); - auto config = request.mutable_config(); - config->set_allocated_p4info(&p4info); - std::ifstream istream(test_json); - config->mutable_p4_device_config()->assign( - (std::istreambuf_iterator(istream)), - std::istreambuf_iterator()); - - p4::v1::SetForwardingPipelineConfigResponse rep; - grpc::ClientContext context; - - auto status = stub->SetForwardingPipelineConfig( - &context, request, &rep); - assert(status.ok()); - config->release_p4info(); - } - - return SAI_STATUS_SUCCESS; + return dashSai->apiInitialize(flags, services); } sai_status_t sai_api_uninitialize(void) { DASH_LOG_ENTER(); - stub = nullptr; - - return SAI_STATUS_SUCCESS; + return dashSai->apiUninitialize(); } sai_status_t sai_log_set( @@ -396,6 +196,8 @@ sai_status_t sai_query_api_version( { *version = SAI_API_VERSION; + DASH_LOG_NOTICE("SAI headers version: %d", SAI_API_VERSION); + return SAI_STATUS_SUCCESS; } diff --git a/dash-pipeline/SAI/templates/saiimpl.h.j2 b/dash-pipeline/SAI/templates/saiimpl.h.j2 index 039e387cd..a0dad0c4e 100644 --- a/dash-pipeline/SAI/templates/saiimpl.h.j2 +++ b/dash-pipeline/SAI/templates/saiimpl.h.j2 @@ -1,5 +1,7 @@ #pragma once +#include "dashsai.h" + #define DASH_PRIVATE __attribute__((visibility("hidden"))) DASH_PRIVATE extern sai_switch_api_t dash_sai_switch_api_impl; @@ -8,3 +10,5 @@ DASH_PRIVATE extern sai_port_api_t dash_sai_port_api_impl; {% for api in api_names %} DASH_PRIVATE extern sai_{{ api }}_api_t dash_sai_{{ api }}_api_impl; {% endfor %} + +DASH_PRIVATE extern std::shared_ptr dashSai; diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index 4a80b64f0..73abacddf 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -1,14 +1,19 @@ #include "utils.h" -static int deviceId = 0; - -static std::unordered_multimap > tableEntryMap; -static std::mutex tableLock; -static std::atomic nextId; +const sai_attribute_t* dash::utils::getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); -#define MUTEX std::lock_guard _lock(tableLock); + for (uint32_t i = 0; i < attr_count; i++) + { + if (attr_list[i].id == id) + { + return &attr_list[i]; + } + } -std::unique_ptr stub; + return nullptr; +} void dash::utils::correctIpPrefix(void *ip, const void *mask, size_t length) { @@ -62,139 +67,3 @@ int dash::utils::leadingNonZeroBits(const sai_ip6_t& ipv6) return 0; } - -static int GetDeviceId() -{ - DASH_LOG_ENTER(); - - return deviceId; -} - -static std::string updateTypeStr(p4::v1::Update_Type updateType) -{ - DASH_LOG_ENTER(); - - const google::protobuf::EnumDescriptor *descriptor = p4::v1::Update_Type_descriptor(); - - return descriptor->FindValueByNumber(updateType)->name(); -} - -const sai_attribute_t* dash::utils::getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list) -{ - DASH_LOG_ENTER(); - - for (uint32_t i = 0; i < attr_count; i++) - { - if (attr_list[i].id == id) - { - return &attr_list[i]; - } - } - - return nullptr; -} - -grpc::StatusCode dash::utils::MutateTableEntry(std::shared_ptr entry, p4::v1::Update_Type updateType) -{ - DASH_LOG_ENTER(); - - p4::v1::WriteRequest request; - - request.set_device_id(GetDeviceId()); - - auto update = request.add_updates(); - - update->set_type(updateType); - - auto entity = update->mutable_entity(); - - entity->set_allocated_table_entry(entry.get()); - - p4::v1::WriteResponse rep; - - grpc::ClientContext context; - - grpc::Status status = stub->Write(&context, request, &rep); - - if (status.ok()) - { - DASH_LOG_NOTICE("GRPC call Write::%s OK %s", updateTypeStr(updateType).c_str(), entry->ShortDebugString().c_str()); - } - else - { - DASH_LOG_ERROR("GRPC ERROR[%d]: %s, %s", status.error_code(), status.error_message().c_str(), status.error_details().c_str()); - DASH_LOG_ERROR("GRPC call Write::%s ERROR: %s", updateTypeStr(updateType).c_str(), entry->ShortDebugString().c_str()); - } - - //MILIND?? What is this? reference release? memory release? - entity->release_table_entry(); - - return status.error_code(); -} - -bool dash::utils::InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId) -{ - DASH_LOG_ENTER(); - - auto retCode = MutateTableEntry(entry, p4::v1::Update_Type_INSERT); - - if (grpc::StatusCode::OK != retCode) - { - return false; - } - - MUTEX; - - if (*objId == 0) - { - *objId = NextObjectId(objectType); - } - - tableEntryMap.insert(std::make_pair(*objId, entry)); - - return true; -} - -// TODO to be removed and merged -#define DASH_OBJECT_SHFT 48 -#define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype<second; - auto tempRet = MutateTableEntry(entry, p4::v1::Update_Type_DELETE); - - if (grpc::StatusCode::OK != tempRet) - { - retCode = tempRet; - } - } - - tableEntryMap.erase(id); - - return retCode == grpc::StatusCode::OK; -} diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/templates/utils.h.j2 index 73a4722f6..b91e3da2b 100644 --- a/dash-pipeline/SAI/templates/utils.h.j2 +++ b/dash-pipeline/SAI/templates/utils.h.j2 @@ -400,14 +400,6 @@ namespace dash u64SetMask(value.u64, t, bits); } - const sai_attribute_t* getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t *attr_list); - - grpc::StatusCode MutateTableEntry(std::shared_ptr, p4::v1::Update_Type updateType); - - sai_object_id_t NextObjectId(sai_object_type_t objectType); - - bool InsertInTable(std::shared_ptr entry, sai_object_type_t objectType, sai_object_id_t *objId); - - bool RemoveFromTable(sai_object_id_t id); + const sai_attribute_t* getMaskAttr(sai_attr_id_t id, uint32_t attr_count, const sai_attribute_t* attr_list); } } From 2e553afbbd97e3ec9309002bebf1aee796c2c9c8 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Tue, 8 Aug 2023 20:10:56 +0200 Subject: [PATCH 51/75] [SAI] Remove unused methods --- dash-pipeline/SAI/templates/dashsai.h.j2 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/dash-pipeline/SAI/templates/dashsai.h.j2 b/dash-pipeline/SAI/templates/dashsai.h.j2 index e92b37133..048906efb 100644 --- a/dash-pipeline/SAI/templates/dashsai.h.j2 +++ b/dash-pipeline/SAI/templates/dashsai.h.j2 @@ -45,11 +45,6 @@ namespace dash public: // helper methods - const sai_attribute_t* getMaskAttr( - _In_ sai_attr_id_t id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list); - grpc::StatusCode mutateTableEntry( _In_ std::shared_ptr, _In_ p4::v1::Update_Type updateType); From 88b1ae698c175f374de714ae682345eaca3ba2ad Mon Sep 17 00:00:00 2001 From: kcudnik Date: Wed, 9 Aug 2023 12:06:05 +0200 Subject: [PATCH 52/75] [SAI] Add workaround to return not supported status on get api This will be required for syncd in sonic-sairedis --- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 39 +++++++++++++++++++--- dash-pipeline/SAI/templates/dashsai.h.j2 | 6 ++-- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index 746e4f944..6149475a3 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -1,5 +1,7 @@ #include "dashsai.h" +#include + using namespace dash; #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 @@ -12,6 +14,21 @@ using namespace dash; DASH_LOG_ERROR("%s: api not initialized", __PRETTY_FUNCTION__); \ return SAI_STATUS_FAILURE; } +/** + * @def DASH_USE_NOT_SUPPORTED + * + * Name of environment variable, when set to any value, will return proper + * SAI_STATUS_NOT_SUPPORTED on switch/port GET api. + * + * Currently because of limitation of saithrift, GET on switch/port is + * returning SAI_STATUS_SUCCESS on not implemented attribute. + * + * TODO FIXME needs to be addressed in saithrift. + * + * This is temporary workaround for syncd, it should be removed when fixed in saithrift. + */ +#define DASH_USE_NOT_SUPPORTED "DASH_USE_NOT_SUPPORTED" + #define MUTEX std::lock_guard _lock(m_tableLock); DashSai::DashSai(): @@ -51,6 +68,8 @@ sai_status_t DashSai::apiInitialize( return SAI_STATUS_FAILURE; } + m_serviceMethodTable = services; + m_cfg = dash::Config::getConfig(services); DASH_LOG_NOTICE("config: %s", m_cfg->getConfigString().c_str()); @@ -143,6 +162,8 @@ sai_status_t DashSai::apiUninitialize(void) m_apiInitialized = false; + m_serviceMethodTable = nullptr; + return SAI_STATUS_SUCCESS; } @@ -199,8 +220,6 @@ sai_status_t DashSai::getSwitchAttribute( DASH_LOG_ENTER(); DASH_CHECK_API_INITIALIZED(); - DASH_LOG_NOTICE("dash_get_switch_attribute()"); - sai_attribute_t *attr = attr_list; for (uint32_t i = 0; i < attr_count ; i++, attr++) @@ -262,6 +281,13 @@ sai_status_t DashSai::getSwitchAttribute( default: + if (getenv(DASH_USE_NOT_SUPPORTED)) + { + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED", i, attr->id); + + return SAI_STATUS_NOT_SUPPORTED; + } + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage @@ -281,8 +307,6 @@ sai_status_t DashSai::getPortAttribute( DASH_LOG_ENTER(); DASH_CHECK_API_INITIALIZED(); - DASH_LOG_NOTICE("getPortAttribute()"); - sai_attribute_t *attr = attr_list; for (uint32_t i = 0; i < attr_count ; i++, attr++) @@ -299,6 +323,13 @@ sai_status_t DashSai::getPortAttribute( default: + if (getenv(DASH_USE_NOT_SUPPORTED)) + { + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED", i, attr->id); + + return SAI_STATUS_NOT_SUPPORTED; + } + DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage diff --git a/dash-pipeline/SAI/templates/dashsai.h.j2 b/dash-pipeline/SAI/templates/dashsai.h.j2 index 048906efb..1e9d8f852 100644 --- a/dash-pipeline/SAI/templates/dashsai.h.j2 +++ b/dash-pipeline/SAI/templates/dashsai.h.j2 @@ -62,10 +62,10 @@ namespace dash private: // private helper methods - p4::config::v1::P4Info parse_p4info( + static p4::config::v1::P4Info parse_p4info( _In_ const char *path); - std::string updateTypeStr( + static std::string updateTypeStr( _In_ p4::v1::Update_Type updateType); private: // internal sai objects @@ -84,6 +84,8 @@ namespace dash bool m_apiInitialized; + const sai_service_method_table_t* m_serviceMethodTable; + std::shared_ptr m_cfg; std::vector m_portList; From 81c1347205f6ee32855346a641385e5a66265af0 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Wed, 9 Aug 2023 14:20:22 +0200 Subject: [PATCH 53/75] [SAI] Remove underscore from variable naming --- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index 6149475a3..1c6f7e2bc 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -7,7 +7,7 @@ using namespace dash; #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 #define DASH_OBJECT_SHFT 48 -#define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype<getConfigString().c_str()); + m_portList.clear(); + for (uint32_t i = 1; i <= m_cfg->m_bmv2NumPorts; i++) { m_portList.push_back(DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,i)); @@ -81,11 +83,11 @@ sai_status_t DashSai::apiInitialize( assert(m_cfg->m_bmv2NumPorts == (uint32_t)m_portList.size()); - const grpc::string _grpcTarget = m_cfg->m_grpcTarget; + const grpc::string grpcTarget = m_cfg->m_grpcTarget; const char* test_json = m_cfg->m_pipelineJson.c_str(); const char* test_proto_json = m_cfg->m_pipelineProto.c_str(); - DASH_LOG_NOTICE("GRPC call SetForwardingPipelineConfig %s => %s, %s", _grpcTarget.c_str(), test_json, test_proto_json); + DASH_LOG_NOTICE("GRPC call SetForwardingPipelineConfig %s => %s, %s", grpcTarget.c_str(), test_json, test_proto_json); auto p4info = parse_p4info(test_proto_json); @@ -97,7 +99,7 @@ sai_status_t DashSai::apiInitialize( grpc::ClientContext stream_context; - m_grpcChannel = grpc::CreateChannel(_grpcTarget, grpc::InsecureChannelCredentials()); + m_grpcChannel = grpc::CreateChannel(grpcTarget, grpc::InsecureChannelCredentials()); m_stub = p4::v1::P4Runtime::NewStub(m_grpcChannel); @@ -351,8 +353,8 @@ p4::config::v1::P4Info DashSai::parse_p4info( p4::config::v1::P4Info p4info; std::ifstream istream(path); assert(istream.good()); - google::protobuf::io::IstreamInputStream istream_(&istream); - google::protobuf::TextFormat::Parse(&istream_, &p4info); + google::protobuf::io::IstreamInputStream is(&istream); + google::protobuf::TextFormat::Parse(&is, &p4info); return p4info; } From 656afdcbf14a3d2e9047a0f6a641f327a26bb8ff Mon Sep 17 00:00:00 2001 From: kcudnik Date: Wed, 9 Aug 2023 14:59:30 +0200 Subject: [PATCH 54/75] [SAI] Fix route bulk api set/get warnings --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 5c6496805..1ac3fcbe8 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -514,6 +514,35 @@ static sai_status_t dash_sai_get_{{ table.name }}_attribute( assert(0 && "sai_get_{{ table.name }}_attribute NYI"); return SAI_STATUS_FAILURE; } + +{% if table.name == 'route_entry' %} + +static sai_status_t dash_sai_set_{{ table.name | replace("entry", "entries") }}_attribute( + _In_ uint32_t object_count, + _In_ const sai_route_entry_t *route_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + DASH_LOG_ENTER(); + assert(0 && "sai_set_{{ table.name | replace("entry", "entries") }}_attribute NYI"); + return SAI_STATUS_FAILURE; +} + +static sai_status_t dash_sai_get_{{ table.name | replace("entry", "entries") }}_attribute( + _In_ uint32_t object_count, + _In_ const sai_route_entry_t *route_entry, + _In_ const uint32_t *attr_count, + _Inout_ sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + DASH_LOG_ENTER(); + assert(0 && "sai_get_{{ table.name | replace("entry", "entries") }}_attribute NYI"); + return SAI_STATUS_FAILURE; +} + +{% endif %} {% endif %} {% endfor %} @@ -534,5 +563,9 @@ sai_{{ app_name }}_api_t dash_sai_{{ app_name }}_api_impl = { .create_{{ table.name | replace("entry", "entries") }} = dash_sai_create_{{ table.name | replace("entry", "entries") }}, .remove_{{ table.name | replace("entry", "entries") }} = dash_sai_remove_{{ table.name | replace("entry", "entries") }}, {% endif %} +{% if table.name == 'route_entry' %} + .set_{{ table.name | replace("entry", "entries") }}_attribute = dash_sai_set_{{ table.name | replace("entry", "entries") }}_attribute, + .get_{{ table.name | replace("entry", "entries") }}_attribute = dash_sai_get_{{ table.name | replace("entry", "entries") }}_attribute, +{% endif %} {% endfor %} }; From 5372b9649c8dfc0d9e3d41bb761cfe465b593d45 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Wed, 9 Aug 2023 15:13:30 +0200 Subject: [PATCH 55/75] [SAI] Simplify insertInTable method --- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 26 +++++++++++++--------- dash-pipeline/SAI/templates/dashsai.h.j2 | 3 +-- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 5 ++--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index 1c6f7e2bc..004f09f3b 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -31,6 +31,10 @@ using namespace dash; #define MUTEX std::lock_guard _lock(m_tableLock); +// TODO replace assert with if and return error +// TODO replace DASH_MAKE_OID with ObjectIdManager +// TODO fix saiapi.cpp use insert/remove mutate getNextObjectId + DashSai::DashSai(): m_apiInitialized(false) { @@ -179,7 +183,6 @@ sai_object_type_t DashSai::objectTypeQuery( DASH_LOG_ERROR("api not initialized"); return SAI_OBJECT_TYPE_NULL; - } return sai_object_type_t(object_id >> (DASH_OBJECT_SHFT)); @@ -238,9 +241,9 @@ sai_status_t DashSai::getSwitchAttribute( case SAI_SWITCH_ATTR_PORT_LIST: - attr->value.objlist.count = m_cfg->m_bmv2NumPorts; + attr->value.objlist.count = std::min(m_cfg->m_bmv2NumPorts, attr->value.objlist.count); - for (size_t j = 0; j < m_cfg->m_bmv2NumPorts; j++) + for (size_t j = 0; j < attr->value.objlist.count; j++) { attr->value.objlist.list[j] = m_portList.at(j); } @@ -420,8 +423,7 @@ grpc::StatusCode DashSai::mutateTableEntry( bool DashSai::insertInTable( _In_ std::shared_ptr entry, - _In_ sai_object_type_t objectType, - _Out_ sai_object_id_t *objId) + _In_ sai_object_id_t objId) { DASH_LOG_ENTER(); @@ -432,6 +434,13 @@ bool DashSai::insertInTable( return false; } + if (objId == SAI_NULL_OBJECT_ID) + { + DASH_LOG_ERROR("objId is NULL"); + + return false; + } + auto retCode = mutateTableEntry(entry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK != retCode) @@ -441,12 +450,7 @@ bool DashSai::insertInTable( MUTEX; - if (*objId == 0) - { - *objId = getNextObjectId(objectType); - } - - m_tableEntryMap.insert(std::make_pair(*objId, entry)); + m_tableEntryMap.insert(std::make_pair(objId, entry)); return true; } diff --git a/dash-pipeline/SAI/templates/dashsai.h.j2 b/dash-pipeline/SAI/templates/dashsai.h.j2 index 1e9d8f852..a7e744227 100644 --- a/dash-pipeline/SAI/templates/dashsai.h.j2 +++ b/dash-pipeline/SAI/templates/dashsai.h.j2 @@ -54,8 +54,7 @@ namespace dash bool insertInTable( _In_ std::shared_ptr entry, - _In_ sai_object_type_t objectType, - _Out_ sai_object_id_t *objId); + _In_ sai_object_id_t objId); bool removeFromTable( _In_ sai_object_id_t id); diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 1ac3fcbe8..7db54710d 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -40,7 +40,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( action = entry->mutable_action(); //expectedParams = 0; //matchedParams = 0; - objId = 0; + objId = dashSai->getNextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}); matchActionEntry->set_table_id(tableId); @@ -49,7 +49,6 @@ static sai_status_t dash_sai_create_{{ table.name }}( // Generate a SAI object ID and fill it as the P4 table key auto mf = matchActionEntry->add_match(); mf->set_field_id({{table['keys'][0].id}}); - objId = dashSai->getNextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}); auto mf_exact = mf->mutable_exact(); {{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); {% else %} @@ -173,7 +172,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( //if (matchedParams != expectedParams) { // goto ErrRet; //} - if (false == dashSai->insertInTable(matchActionEntry, (sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, &objId)) { + if (false == dashSai->insertInTable(matchActionEntry, objId)) { goto ErrRet; } From 4f5cef592e4afbd24eac4b21c1451c643153a642 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Thu, 10 Aug 2023 11:29:33 +0200 Subject: [PATCH 56/75] [SAI] Change asserts to return error codes and add missing switch api --- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 161 ++++++++++++++++-- dash-pipeline/SAI/templates/dashsai.h.j2 | 15 +- .../SAI/templates/saifixedapis.cpp.j2 | 21 ++- 3 files changed, 181 insertions(+), 16 deletions(-) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index 004f09f3b..f08f48764 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -31,9 +31,7 @@ using namespace dash; #define MUTEX std::lock_guard _lock(m_tableLock); -// TODO replace assert with if and return error // TODO replace DASH_MAKE_OID with ObjectIdManager -// TODO fix saiapi.cpp use insert/remove mutate getNextObjectId DashSai::DashSai(): m_apiInitialized(false) @@ -47,6 +45,7 @@ DashSai::DashSai(): m_defaultVlanId = DASH_MAKE_OID(SAI_OBJECT_TYPE_VLAN, 1); m_defaultVrfId = DASH_MAKE_OID(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, 1); m_default1QBridgeId = DASH_MAKE_OID(SAI_OBJECT_TYPE_BRIDGE, 1); + m_defaultTrapGroup = DASH_MAKE_OID(SAI_OBJECT_TYPE_HOSTIF_TRAP_GROUP, 1); } DashSai::~DashSai() @@ -72,6 +71,8 @@ sai_status_t DashSai::apiInitialize( return SAI_STATUS_FAILURE; } + DASH_LOG_NOTICE("env %s set to: %s", DASH_USE_NOT_SUPPORTED, getenv(DASH_USE_NOT_SUPPORTED)); + m_serviceMethodTable = services; m_cfg = dash::Config::getConfig(services); @@ -85,7 +86,14 @@ sai_status_t DashSai::apiInitialize( m_portList.push_back(DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,i)); } - assert(m_cfg->m_bmv2NumPorts == (uint32_t)m_portList.size()); + if (m_cfg->m_bmv2NumPorts != (uint32_t)m_portList.size()) + { + DASH_LOG_ERROR("FATAL: number of ports is different: config: %u vs port list: %u", + m_cfg->m_bmv2NumPorts, + (uint32_t)m_portList.size()); + + return SAI_STATUS_FAILURE; + } const grpc::string grpcTarget = m_cfg->m_grpcTarget; const char* test_json = m_cfg->m_pipelineJson.c_str(); @@ -95,6 +103,13 @@ sai_status_t DashSai::apiInitialize( auto p4info = parse_p4info(test_proto_json); + if (p4info == nullptr) + { + DASH_LOG_ERROR("failed to parse p4info: %s", test_proto_json); + + return SAI_STATUS_FAILURE; + } + auto set_election_id = [](p4::v1::Uint128 *election_id) { election_id->set_high(0); @@ -117,8 +132,24 @@ sai_status_t DashSai::apiInitialize( stream->Write(request); p4::v1::StreamMessageResponse response; stream->Read(&response); - assert(response.update_case() == p4::v1::StreamMessageResponse::kArbitration); - assert(response.arbitration().status().code() == ::google::rpc::Code::OK); + + if (response.update_case() != p4::v1::StreamMessageResponse::kArbitration) + { + DASH_LOG_ERROR("FATAL: response: %d, expected %d (p4::v1::StreamMessageResponse::kArbitration)", + response.update_case(), + p4::v1::StreamMessageResponse::kArbitration); + + return SAI_STATUS_FAILURE; + } + + if (response.arbitration().status().code() != ::google::rpc::Code::OK) + { + DASH_LOG_ERROR("FATAL: arbitration status: %d, expected: %d (::google::rpc::Code::OK)", + response.arbitration().status().code(), + ::google::rpc::Code::OK); + + return SAI_STATUS_FAILURE; + } } { @@ -128,8 +159,17 @@ sai_status_t DashSai::apiInitialize( p4::v1::SetForwardingPipelineConfigRequest_Action_VERIFY_AND_COMMIT); set_election_id(request.mutable_election_id()); auto config = request.mutable_config(); - config->set_allocated_p4info(&p4info); + config->set_allocated_p4info(p4info.get()); + std::ifstream istream(test_json); + + if (!istream.good()) + { + DASH_LOG_ERROR("failed to open: %s", test_json); + + return SAI_STATUS_FAILURE; + } + config->mutable_p4_device_config()->assign( (std::istreambuf_iterator(istream)), std::istreambuf_iterator()); @@ -139,7 +179,12 @@ sai_status_t DashSai::apiInitialize( auto status = m_stub->SetForwardingPipelineConfig(&context, request, &rep); - assert(status.ok()); + if (!status.ok()) + { + DASH_LOG_ERROR("FATAL: SetForwardingPipelineConfig failed, error code: %d", status.error_code()); + + return SAI_STATUS_FAILURE; + } config->release_p4info(); } @@ -210,6 +255,11 @@ sai_status_t DashSai::createSwitch( DASH_LOG_ENTER(); DASH_CHECK_API_INITIALIZED(); + for (uint32_t i = 0; i < attr_count; i++) + { + DASH_LOG_WARN("attr id %d is NOT IMPLEMENTED, ignored", attr_list[i].id); + } + *switch_id = m_switchId; DASH_LOG_NOTICE("created switch id: %ld", *switch_id); @@ -217,6 +267,53 @@ sai_status_t DashSai::createSwitch( return SAI_STATUS_SUCCESS; } +sai_status_t DashSai::removeSwitch( + _In_ sai_object_id_t switch_id) +{ + DASH_LOG_ENTER(); + + if (switch_id != m_switchId) + { + DASH_LOG_ERROR("invalid switch_id: %lu, switch_id", switch_id); + + return SAI_STATUS_INVALID_PARAMETER; + } + + // dummy switch remove + + DASH_LOG_NOTICE("removing switch: %ld", switch_id); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::setSwitchAttribute( + _In_ sai_object_id_t switch_id, + _In_ const sai_attribute_t *attr) +{ + DASH_LOG_ENTER(); + + switch (attr->id) + { + case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: + case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: + case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: + case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: + case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: + case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: + case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: + + DASH_LOG_NOTICE("setting dummy notification callback (attr id: %d)", attr->id); + + return SAI_STATUS_SUCCESS; + + default: + + DASH_LOG_ERROR("set attr %d NOT IMPLEMENTED", attr->id); + + return SAI_STATUS_NOT_IMPLEMENTED; + } +} + sai_status_t DashSai::getSwitchAttribute( _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, @@ -284,6 +381,27 @@ sai_status_t DashSai::getSwitchAttribute( break; + case SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP: + + attr->value.oid = m_defaultTrapGroup; + + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP = %lx", i, attr->value.oid); + + break; + + case SAI_SWITCH_ATTR_SRC_MAC_ADDRESS: + + // dummy mac address + + attr->value.mac[0] = 0x00; + attr->value.mac[1] = 0x12; + attr->value.mac[2] = 0x34; + attr->value.mac[3] = 0x56; + attr->value.mac[4] = 0x78; + attr->value.mac[5] = 0x9A; + + break; + default: if (getenv(DASH_USE_NOT_SUPPORTED)) @@ -326,6 +444,15 @@ sai_status_t DashSai::getPortAttribute( break; + case SAI_PORT_ATTR_HW_LANE_LIST: + + // dummy hw lane list (required by syncd) + + attr->value.u32list.count = 1; + attr->value.u32list.list[0] = (uint32_t)(port_id & 0xffff); // get index from port ID to make lanes unique + + break; + default: if (getenv(DASH_USE_NOT_SUPPORTED)) @@ -348,18 +475,26 @@ sai_status_t DashSai::getPortAttribute( // private helper methods -p4::config::v1::P4Info DashSai::parse_p4info( +std::shared_ptr DashSai::parse_p4info( _In_ const char *path) { DASH_LOG_ENTER(); - p4::config::v1::P4Info p4info; + std::shared_ptr p4info = std::make_shared(); + std::ifstream istream(path); - assert(istream.good()); - google::protobuf::io::IstreamInputStream is(&istream); - google::protobuf::TextFormat::Parse(&is, &p4info); - return p4info; + if (istream.good()) + { + google::protobuf::io::IstreamInputStream is(&istream); + google::protobuf::TextFormat::Parse(&is, p4info.get()); + + return p4info; + } + + DASH_LOG_ERROR("failed to open: %s", path); + + return nullptr; } std::string DashSai::updateTypeStr( diff --git a/dash-pipeline/SAI/templates/dashsai.h.j2 b/dash-pipeline/SAI/templates/dashsai.h.j2 index a7e744227..2783461e3 100644 --- a/dash-pipeline/SAI/templates/dashsai.h.j2 +++ b/dash-pipeline/SAI/templates/dashsai.h.j2 @@ -28,16 +28,27 @@ namespace dash public: // QUAD api implementation + // switch + sai_status_t createSwitch( _Out_ sai_object_id_t *switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list); + sai_status_t removeSwitch( + _In_ sai_object_id_t switch_id); + + sai_status_t setSwitchAttribute( + _In_ sai_object_id_t switch_id, + _In_ const sai_attribute_t *attr); + sai_status_t getSwitchAttribute( _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _Inout_ sai_attribute_t *attr_list); + // port + sai_status_t getPortAttribute( _In_ sai_object_id_t port_id, _In_ uint32_t attr_count, @@ -61,7 +72,7 @@ namespace dash private: // private helper methods - static p4::config::v1::P4Info parse_p4info( + static std::shared_ptr parse_p4info( _In_ const char *path); static std::string updateTypeStr( @@ -79,6 +90,8 @@ namespace dash sai_object_id_t m_default1QBridgeId; + sai_object_id_t m_defaultTrapGroup; + private: bool m_apiInitialized; diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 52cee8867..6dd5d6511 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -30,10 +30,27 @@ static sai_status_t dash_sai_get_switch_attribute( return dashSai->getSwitchAttribute(switch_id, attr_count, attr_list); } +static sai_status_t dash_sai_remove_switch( + _In_ sai_object_id_t switch_id) +{ + DASH_LOG_ENTER(); + + return dashSai->removeSwitch(switch_id); +} + +static sai_status_t dash_sai_set_switch_attribute( + _In_ sai_object_id_t switch_id, + _In_ const sai_attribute_t *attr) +{ + DASH_LOG_ENTER(); + + return dashSai->setSwitchAttribute(switch_id, attr); +} + sai_switch_api_t dash_sai_switch_api_impl = { .create_switch = dash_sai_create_switch, - .remove_switch = 0, - .set_switch_attribute = 0, + .remove_switch = dash_sai_remove_switch, + .set_switch_attribute = dash_sai_set_switch_attribute, .get_switch_attribute = dash_sai_get_switch_attribute, .get_switch_stats = 0, .get_switch_stats_ext = 0, From 0cdd9aaefcbc92f9aaff565176b62a4c962673da Mon Sep 17 00:00:00 2001 From: kcudnik Date: Thu, 10 Aug 2023 12:56:41 +0200 Subject: [PATCH 57/75] [SAI] Print oids in hex form --- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index f08f48764..b9be97d4c 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -262,7 +262,7 @@ sai_status_t DashSai::createSwitch( *switch_id = m_switchId; - DASH_LOG_NOTICE("created switch id: %ld", *switch_id); + DASH_LOG_NOTICE("created switch id: 0x%lx", *switch_id); return SAI_STATUS_SUCCESS; } @@ -274,14 +274,14 @@ sai_status_t DashSai::removeSwitch( if (switch_id != m_switchId) { - DASH_LOG_ERROR("invalid switch_id: %lu, switch_id", switch_id); + DASH_LOG_ERROR("invalid switch_id: 0x%lx, switch_id", switch_id); return SAI_STATUS_INVALID_PARAMETER; } // dummy switch remove - DASH_LOG_NOTICE("removing switch: %ld", switch_id); + DASH_LOG_NOTICE("removing switch: 0x%lx", switch_id); return SAI_STATUS_SUCCESS; } @@ -353,7 +353,7 @@ sai_status_t DashSai::getSwitchAttribute( attr->value.oid = m_defaultVlanId; - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = 0x%lx", i, attr->value.oid); break; @@ -361,7 +361,7 @@ sai_status_t DashSai::getSwitchAttribute( attr->value.oid = m_defaultVrfId; - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", i, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = 0x%lx", i, attr->value.oid); break; @@ -369,7 +369,7 @@ sai_status_t DashSai::getSwitchAttribute( attr->value.oid = m_default1QBridgeId; - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", i, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = 0x%lx", i, attr->value.oid); break; @@ -377,7 +377,7 @@ sai_status_t DashSai::getSwitchAttribute( attr->value.oid = m_defaultCpuPortId; - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_CPU_PORT = %lx", i, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_CPU_PORT = 0x%lx", i, attr->value.oid); break; @@ -385,7 +385,7 @@ sai_status_t DashSai::getSwitchAttribute( attr->value.oid = m_defaultTrapGroup; - DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP = %lx", i, attr->value.oid); + DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP = 0x%lx", i, attr->value.oid); break; @@ -623,7 +623,7 @@ bool DashSai::removeFromTable( if (range.first == range.second) { - DASH_LOG_ERROR("id: %ld not present in the table for deletion!", id); + DASH_LOG_ERROR("id: 0x%lx not present in the table for deletion!", id); return false; } From 4d0abc2f9542b509adbf56fc5298e4761c270eae Mon Sep 17 00:00:00 2001 From: kcudnik Date: Thu, 10 Aug 2023 13:26:40 +0200 Subject: [PATCH 58/75] [SAI] Add missing check for api initialized --- dash-pipeline/SAI/templates/dashsai.cpp.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index b9be97d4c..8f8defaf1 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -271,6 +271,7 @@ sai_status_t DashSai::removeSwitch( _In_ sai_object_id_t switch_id) { DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); if (switch_id != m_switchId) { @@ -291,6 +292,7 @@ sai_status_t DashSai::setSwitchAttribute( _In_ const sai_attribute_t *attr) { DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); switch (attr->id) { From efdaa14d81f510e12941fc4846f7ff3dc6bed247 Mon Sep 17 00:00:00 2001 From: Gspn Amith <50331118+AmithGspn@users.noreply.github.com> Date: Wed, 30 Aug 2023 10:52:52 -0500 Subject: [PATCH 59/75] Adds SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION api to dash_underlay_routing (#422) * Enhanced underlay_routing functionality with the incorporation of the SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION api * Modified code, test cases to suit the packet action api functionality * Added assert statements for the test cases * Bug: Updated the comments --- dash-pipeline/bmv2/underlay.p4 | 20 +- .../saic/test_sai_vnet_route_bidirectional.py | 249 +++++++++--------- .../test_sai_vnet_route_unidirectional.py | 72 +++-- ...et_route_setup_commands_bidirectional.json | 244 ++++++++++++++++- ...t_route_setup_commands_unidirectional.json | 14 - 5 files changed, 430 insertions(+), 169 deletions(-) diff --git a/dash-pipeline/bmv2/underlay.p4 b/dash-pipeline/bmv2/underlay.p4 index 88cd4acc9..f00d4e7ba 100644 --- a/dash-pipeline/bmv2/underlay.p4 +++ b/dash-pipeline/bmv2/underlay.p4 @@ -2,6 +2,11 @@ #include "dash_headers.p4" #include "dash_metadata.p4" +// The values in this context have been sourced from the 'saiswitch.h' file and +// have been manually designated to maintain alignment with enum values specified in the SAI commit . +#define SAI_PACKET_ACTION_DROP 0 +#define SAI_PACKET_ACTION_FORWARD 1 + control underlay( inout headers_t hdr , inout metadata_t meta @@ -33,6 +38,16 @@ control underlay( #endif // TARGET_DPDK_PNA } + action pkt_act(bit<9> packet_action, bit<9> next_hop_id) { + if(packet_action == SAI_PACKET_ACTION_DROP) { + /* Drops the packet */ + meta.dropped = true; + } else if (packet_action == SAI_PACKET_ACTION_FORWARD) { + /* Forwards the packet on different/same port it arrived based on routing */ + set_nhop(next_hop_id); + } + } + action def_act() { #ifdef TARGET_BMV2_V1MODEL standard_metadata.egress_spec = standard_metadata.ingress_port; @@ -61,8 +76,9 @@ control underlay( } actions = { - /* Send packet on different/same port it arrived based on routing */ - set_nhop; + // Processes a packet based on the specified packet action. + // Depending on the packet action, it either drops the packet or forwards it to the specified next-hop. + pkt_act; /* Send packet on same port it arrived (echo) by default */ @defaultonly def_act; diff --git a/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py b/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py index 2e3eb358f..eb81f43ac 100644 --- a/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py +++ b/test/test-cases/scale/saic/test_sai_vnet_route_bidirectional.py @@ -9,11 +9,12 @@ import pytest from saichallenger.common.sai_dataplane.utils.ptf_testutils import (send_packet, simple_udp_packet, - simple_vxlan_packet) + simple_vxlan_packet, + verify_packet, + verify_no_other_packets) import sys sys.path.append("../utils") -import vnet2vnet_helper as dh current_file_dir = Path(__file__).parent # Constants @@ -22,112 +23,6 @@ # Simple, non-scaled configuration. # See README.md for details. -TEST_VNET_ROUTE_BIDIRECTIONAL_CONFIG = { - - "ENI_COUNT": 1, - "ACL_RULES_NSG": 1, - "ACL_TABLE_COUNT": 1, - "IP_PER_ACL_RULE": 1, - "IP_MAPPED_PER_ACL_RULE": 1, - "IP_ROUTE_DIVIDER_PER_ACL_RULE": 1, - - 'DASH_VIP': { - 'vpe': { - 'SWITCH_ID': '$SWITCH_ID', - 'IPV4': "172.16.1.100" - } - }, - - 'DASH_DIRECTION_LOOKUP': { - 'dle': { - 'SWITCH_ID': '$SWITCH_ID', - 'VNI': 100, - 'ACTION': 'SET_OUTBOUND_DIRECTION' - } - }, - - 'DASH_ACL_GROUP': { - 'in_acl_group_id': { - 'ADDR_FAMILY': 'IPv4' - }, - 'out_acl_group_id': { - 'ADDR_FAMILY': 'IPv4' - } - }, - - 'DASH_VNET': { - 'vnet': { - 'VNI': 1000 - } - }, - - 'DASH_ENI': { - 'eni': { - 'ACL_GROUP': { - 'INBOUND': { - 'STAGE1': '$in_acl_group_id_#{0}', - 'STAGE2': '$in_acl_group_id_#{0}', - 'STAGE3': '$in_acl_group_id_#{0}}', - 'STAGE4': '$in_acl_group_id_#{0}}', - 'STAGE5': '$in_acl_group_id_#{0}}' - }, - 'OUTBOUND': { - 'STAGE1': 0, - 'STAGE2': 0, - 'STAGE3': 0, - 'STAGE4': 0, - 'STAGE5': 0 - } - }, - 'ADMIN_STATE': True, - 'CPS': 10000, - 'FLOWS': 10000, - 'PPS': 100000, - 'VM_UNDERLAY_DIP': "172.16.1.1", - 'VM_VNI': 9, - 'VNET_ID': '$vnet_#{0}' - } - }, - - 'DASH_ENI_ETHER_ADDRESS_MAP': { - 'eam': { - 'SWITCH_ID': '$SWITCH_ID', - 'MAC': "00:cc:cc:cc:00:00", - 'ENI_ID': '$eni_#{0}' - } - }, - - 'DASH_OUTBOUND_ROUTING': { - 'ore': { - 'SWITCH_ID': '$SWITCH_ID', - 'ENI_ID': '$eni_#{0}', - 'DESTINATION': "10.1.0.0/16", - 'ACTION': 'ROUTE_VNET', - 'DST_VNET_ID': '$vnet_#{0}' - } - }, - - 'DASH_OUTBOUND_CA_TO_PA': { - 'ocpe': { - 'SWITCH_ID': '$SWITCH_ID', - 'DST_VNET_ID': '$vnet_#{0}', - 'DIP': "10.1.2.50", - 'UNDERLAY_DIP': "172.16.1.20", - 'OVERLAY_DMAC': "00:DD:DD:DD:00:00", - 'USE_DST_VNET_VNI': True - } - }, - - 'DASH_ACL_GROUP': { - 'in_acl_group_id': { - 'ADDR_FAMILY': 'IPv4' - }, - 'out_acl_group_id': { - 'ADDR_FAMILY': 'IPv4' - } - } -} - @pytest.mark.ptf @pytest.mark.snappi class TestSaiVnetRoute: @@ -152,14 +47,81 @@ def test_vnet_route_bidirectional_create(self, dpu): @pytest.mark.snappi def test_vnet_route_packet_bidirectional_forwarding_with_route_match(self, dpu, dataplane): """Verify packet forwarding with route match""" - - """ - Verify same config with high-rate traffic. - packets_per_flow=10 means that each possible packet path will be verified using 10 packet. - NOTE: For BMv2 we keep here PPS limitation - """ + dataplane.set_config() + # Route match, send packets from each port and drop packets on both ports. + # Send packet one + inner_pkt_one = simple_udp_packet(eth_dst = "02:02:02:02:02:02", + eth_src = "00:cc:cc:cc:00:00", + ip_dst = "12.1.2.50", + ip_src = "10.1.1.10") + vxlan_pkt_one = simple_vxlan_packet(eth_dst = "00:00:02:03:04:05", + eth_src = "00:00:05:06:06:06", + ip_dst = "170.16.1.100", + ip_src = "170.16.1.1", + udp_sport = 11638, + with_udp_chksum = False, + vxlan_vni = 100, + inner_frame = inner_pkt_one) + + # Expected received packet one + inner_exp_pkt_one = simple_udp_packet(eth_dst = "00:DD:DD:DD:00:00", + eth_src = "00:cc:cc:cc:00:00", + ip_dst = "12.1.2.50", + ip_src = "10.1.1.10") + vxlan_exp_pkt_one = simple_vxlan_packet(eth_dst = "00:00:00:00:00:00", + eth_src = "00:00:00:00:00:00", + ip_dst = "170.16.1.20", + ip_src = "170.16.1.100", + udp_sport = 0, + with_udp_chksum = False, + vxlan_vni = 100, + vxlan_flags = 0, + inner_frame = inner_exp_pkt_one) + vxlan_exp_pkt_one['IP'].chksum = 0 + + # Send packet two + inner_pkt_two = simple_udp_packet(eth_dst = "00:00:00:09:03:14", + eth_src = "00:0a:04:06:06:06", + ip_dst = "171.18.1.100", + ip_src = "171.18.1.1") + vxlan_pkt_two = simple_vxlan_packet(eth_dst = "00:0b:05:06:06:06", + eth_src = "00:0a:05:06:06:06", + ip_dst = "10.11.1.20", + ip_src = "10.11.1.10", + udp_sport = 11639, + with_udp_chksum = False, + vxlan_vni = 100, + inner_frame = inner_pkt_two) + + # Expected received packet two + inner_exp_pkt_two = simple_udp_packet(eth_dst = "00:BB:BB:BB:00:00", + eth_src = "00:0a:04:06:06:06", + ip_dst = "171.18.1.100", + ip_src = "171.18.1.1") + vxlan_exp_pkt_two = simple_vxlan_packet(eth_dst = "00:00:00:00:00:00", + eth_src = "00:00:00:00:00:00", + ip_dst = "10.11.1.15", + ip_src = "10.11.1.20", + udp_sport = 0, + with_udp_chksum = False, + vxlan_vni = 100, + vxlan_flags = 0, + inner_frame = inner_exp_pkt_two) + vxlan_exp_pkt_two['IP'].chksum = 0 + + # Send packets from both ports + send_packet(dataplane, 0, vxlan_pkt_one, 10) + # time.sleep(0.5) + send_packet(dataplane, 1, vxlan_pkt_two, 20) + + # Verify no packets received + print("\nVerifying drop...\n") + assert verify_no_other_packets(dataplane), "Packet are received" + + # Route match. send packets from each port, forward and receive packets on opposite ports + # Send packet one inner_pkt_one = simple_udp_packet(eth_dst = "02:02:02:02:02:02", eth_src = "00:cc:cc:cc:00:00", ip_dst = "10.1.2.50", @@ -168,12 +130,28 @@ def test_vnet_route_packet_bidirectional_forwarding_with_route_match(self, dpu, eth_src = "00:00:05:06:06:06", ip_dst = "172.16.1.100", ip_src = "172.16.1.1", - udp_sport = 11639, + udp_sport = 11638, with_udp_chksum = False, vxlan_vni = 100, inner_frame = inner_pkt_one) - # send_packet(dataplane, 1, vxlan_pkt, 111) + # Expected received packet one + inner_exp_pkt_one = simple_udp_packet(eth_dst = "00:DD:DD:DD:00:00", + eth_src = "00:cc:cc:cc:00:00", + ip_dst = "10.1.2.50", + ip_src = "10.1.1.10") + vxlan_exp_pkt_one = simple_vxlan_packet(eth_dst = "00:00:00:00:00:00", + eth_src = "00:00:00:00:00:00", + ip_dst = "172.16.1.20", + ip_src = "172.16.1.100", + udp_sport = 0, + with_udp_chksum = False, + vxlan_vni = 100, + vxlan_flags = 0, + inner_frame = inner_exp_pkt_one) + vxlan_exp_pkt_one['IP'].chksum = 0 + + # Send packet two inner_pkt_two = simple_udp_packet(eth_dst = "00:00:00:09:03:14", eth_src = "00:0a:04:06:06:06", ip_dst = "172.19.1.100", @@ -182,23 +160,36 @@ def test_vnet_route_packet_bidirectional_forwarding_with_route_match(self, dpu, eth_src = "00:0a:05:06:06:06", ip_dst = "10.10.2.20", ip_src = "10.10.2.10", - udp_sport = 11638, + udp_sport = 11639, with_udp_chksum = False, vxlan_vni = 60, inner_frame = inner_pkt_two) - send_packet(dataplane, 0, vxlan_pkt_one, 111) - send_packet(dataplane, 1, vxlan_pkt_two, 777) - - time.sleep(10) - rows = dataplane.get_all_stats() - print("{}".format(rows[0].name)) - print("Transmission_Frames : {}".format(rows[0].frames_tx)) - print("Recieved_Frames : {}".format(rows[0].frames_rx)) - print("{}".format(rows[1].name)) - print("--------------------------") - print("Transmission_Frames : {}".format(rows[1].frames_tx)) - print("Recieved_Frames : {}".format(rows[1].frames_rx)) + # Expected received packet two + inner_exp_pkt_two = simple_udp_packet(eth_dst = "00:BB:BB:BB:00:00", + eth_src = "00:0a:04:06:06:06", + ip_dst = "172.19.1.100", + ip_src = "172.19.1.1") + vxlan_exp_pkt_two = simple_vxlan_packet(eth_dst = "00:00:00:00:00:00", + eth_src = "00:00:00:00:00:00", + ip_dst = "10.10.2.15", + ip_src = "10.10.2.20", + udp_sport = 0, + with_udp_chksum = False, + vxlan_vni = 100, + vxlan_flags = 0, + inner_frame = inner_exp_pkt_two) + vxlan_exp_pkt_two['IP'].chksum = 0 + + # Send packets from both ports + send_packet(dataplane, 0, vxlan_pkt_one, 10) + time.sleep(0.5) + send_packet(dataplane, 1, vxlan_pkt_two, 20) + + # Verify received packets on specific ports + print("\nVerifying packets on both ports...\n") + assert verify_packet(dataplane, vxlan_exp_pkt_one, 1), "Packet not received on port 1" + assert verify_packet(dataplane, vxlan_exp_pkt_two, 0), "Packet not received on port 0" @pytest.mark.ptf @pytest.mark.snappi diff --git a/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py b/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py index 018637257..f4407abcb 100644 --- a/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py +++ b/test/test-cases/scale/saic/test_sai_vnet_route_unidirectional.py @@ -7,6 +7,7 @@ from pprint import pprint import time import pytest +import saichallenger.common.sai_dataplane.snappi.snappi_traffic_utils as stu from saichallenger.common.sai_dataplane.utils.ptf_testutils import (send_packet, simple_udp_packet, simple_vxlan_packet, @@ -153,28 +154,59 @@ def test_vnet_route_unidirectional_create(self, dpu): @pytest.mark.snappi def test_vnet_route_packet_unidirectional_forwarding_with_route_match(self, dpu, dataplane): """Verify packet forwarding with route match""" - - """ - Verify same config with high-rate traffic. - packets_per_flow=10 means that each possible packet path will be verified using 10 packet. - NOTE: For BMv2 we keep here PPS limitation - """ - dh.scale_vnet_outbound_flows(dataplane, TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG, packets_per_flow=10, pps_per_flow=10) + dataplane.set_config() - dataplane.start_traffic() - # stu.wait_for(lambda: dh.check_flow_packets_metrics(dataplane, dataplane.flows[0], show=True)[0], - # "Test", timeout_seconds=10) - time.sleep(10) - rows = dataplane.get_all_stats() - print("{}".format(rows[0].name)) - print("--------------------------") - print("Tx_Frames : {}".format(rows[0].frames_tx)) - print("Rx_Frames : {}".format(rows[0].frames_rx)) - print("{}".format(rows[1].name)) - print("--------------------------") - print("Tx_Frames : {}".format(rows[1].frames_tx)) - print("Rx_Frames : {}".format(rows[1].frames_rx)) + # No Route. send packets from a port, reflects the packets on the same port + SRC_VM_IP = "10.1.1.10" + OUTER_SMAC = "00:00:05:06:06:06" + OUR_MAC = "00:00:02:03:04:05" + + VIP = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_VIP']['vpe']['IPV4'] + VNET_VNI = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_VNET']['vnet']['VNI'] + DIR_LOOKUP_VNI = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_DIRECTION_LOOKUP']['dle']['VNI'] + SRC_VM_PA_IP = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_ENI']['eni']['VM_UNDERLAY_DIP'] + ENI_MAC = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_ENI_ETHER_ADDRESS_MAP']['eam']['MAC'] + DST_CA_IP = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_OUTBOUND_CA_TO_PA']['ocpe']['DIP'] + DST_PA_IP = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_OUTBOUND_CA_TO_PA']['ocpe']["UNDERLAY_DIP"] + DST_CA_MAC = TEST_VNET_ROUTE_UNIDIRECTIONAL_CONFIG['DASH_OUTBOUND_CA_TO_PA']['ocpe']["OVERLAY_DMAC"] + + # Send packet one + inner_pkt = simple_udp_packet(eth_dst = "02:02:02:02:02:02", + eth_src = ENI_MAC, + ip_dst = DST_CA_IP, + ip_src = SRC_VM_IP) + vxlan_pkt = simple_vxlan_packet(eth_dst = OUR_MAC, + eth_src = OUTER_SMAC, + ip_dst = VIP, + ip_src = SRC_VM_PA_IP, + udp_sport = 11638, + with_udp_chksum = False, + vxlan_vni = DIR_LOOKUP_VNI, + inner_frame = inner_pkt) + + # Expected received packet one + inner_exp_pkt = simple_udp_packet(eth_dst = DST_CA_MAC, + eth_src = ENI_MAC, + ip_dst = DST_CA_IP, + ip_src = SRC_VM_IP) + vxlan_exp_pkt = simple_vxlan_packet(eth_dst = "00:00:00:00:00:00", + eth_src = "00:00:00:00:00:00", + ip_dst = DST_PA_IP, + ip_src = VIP, + udp_sport = 0, + with_udp_chksum = False, + vxlan_vni = VNET_VNI, + vxlan_flags = 0, + inner_frame = inner_exp_pkt) + vxlan_exp_pkt['IP'].chksum = 0 + + # Send packets from port 0 + send_packet(dataplane, 0, vxlan_pkt, 10) + time.sleep(0.5) + + # Verify packets from port 0 + assert verify_packet(dataplane, vxlan_exp_pkt, 0), "Packet not received on port 0" @pytest.mark.ptf @pytest.mark.snappi diff --git a/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json b/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json index d753b921a..dbc951399 100644 --- a/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json +++ b/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json @@ -25,6 +25,32 @@ "SAI_VIP_ENTRY_ACTION_ACCEPT" ] }, + { + "name": "vpe_2", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": "10.11.1.20" + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", + "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, + { + "name": "vpe_3", + "op": "create", + "type": "SAI_OBJECT_TYPE_VIP_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vip": "170.16.1.100" + }, + "attributes": [ + "SAI_VIP_ENTRY_ATTR_ACTION", + "SAI_VIP_ENTRY_ACTION_ACCEPT" + ] + }, { "name": "dle", "op": "create", @@ -217,6 +243,136 @@ "0" ] }, + { + "name": "eni_2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + "10.11.1.10", + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", + "0" + ] + }, + { + "name": "eni_3", + "op": "create", + "type": "SAI_OBJECT_TYPE_ENI", + "attributes": [ + "SAI_ENI_ATTR_CPS", + "10000", + "SAI_ENI_ATTR_PPS", + "100000", + "SAI_ENI_ATTR_FLOWS", + "100000", + "SAI_ENI_ATTR_ADMIN_STATE", + "True", + "SAI_ENI_ATTR_VM_UNDERLAY_DIP", + "170.16.1.1", + "SAI_ENI_ATTR_VM_VNI", + "9", + "SAI_ENI_ATTR_VNET_ID", + "$vnet", + "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID", + "0", + "SAI_ENI_ATTR_V4_METER_POLICY_ID", + "0", + "SAI_ENI_ATTR_V6_METER_POLICY_ID", + "0" + ] + }, { "name": "eam", "op": "create", @@ -328,19 +484,97 @@ ] }, { - "name": "route_entry_3", + "name": "ocpe_2", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "171.18.1.100" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", + "10.11.1.15", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", + "00:BB:BB:BB:00:00", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" + ] + }, + { + "name": "ocpe_3", + "op": "create", + "type": "SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "dst_vnet_id": "$vnet", + "dip": "12.1.2.50" + }, + "attributes": [ + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP", + "170.16.1.20", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC", + "00:DD:DD:DD:00:00", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI", + "True", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS", + "0", + "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", + "False" + ] + }, + { + "name": "route_entry_1", "op": "create", "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", "key": { "switch_id": "$SWITCH_ID", "vr_id": "10", - "destination": "10.0.0.20/8" + "destination": "10.10.0.20/16" }, "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION", + "SAI_PACKET_ACTION_FORWARD", + "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", + "0" + ] + }, + { + "name": "route_entry_2", + "op": "create", + "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vr_id": "10", + "destination": "172.0.0.10/8" + }, + "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION", + "SAI_PACKET_ACTION_FORWARD", "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", "1" ] }, + { + "name": "route_entry_3", + "op": "create", + "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", + "key": { + "switch_id": "$SWITCH_ID", + "vr_id": "10", + "destination": "10.11.0.20/16" + }, + "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION", + "SAI_PACKET_ACTION_DROP", + "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", + "0" + ] + }, { "name": "route_entry_4", "op": "create", @@ -348,11 +582,13 @@ "key": { "switch_id": "$SWITCH_ID", "vr_id": "10", - "destination": "172.0.0.10/8" + "destination": "170.0.0.10/8" }, "attributes": [ + "SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION", + "SAI_PACKET_ACTION_DROP", "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", - "2" + "1" ] } ] diff --git a/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json b/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json index 574fb7363..2cdec1c43 100644 --- a/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json +++ b/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json @@ -171,19 +171,5 @@ "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE", "False" ] - }, - { - "name": "route_entry_1", - "op": "create", - "type": "SAI_OBJECT_TYPE_ROUTE_ENTRY", - "key": { - "switch_id": "$SWITCH_ID", - "vr_id": "10", - "destination": "0.0.0.0/0" - }, - "attributes": [ - "SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID", - "1" - ] } ] From 37affbd99485cb89961f65a7f7b611ee3187a4d8 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 30 Aug 2023 18:24:40 +0200 Subject: [PATCH 60/75] [sai-api-gen] Write files only when changes are detected (#429) * [sai-api-gen] Write wiles only when changes are detected This will make easier for make pick up when file actually changed * Fix spelling --- dash-pipeline/SAI/sai_api_gen.py | 37 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index aafaa9275..71ff6cff3 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -357,6 +357,19 @@ def get_uniq_sai_api(sai_api): sai_api[TABLES_TAG] = tables return sai_api +# don't write content to file if file already exists +# and the content is the same, this will not touch +# the file and let make utilize this +def write_if_different(file,content): + if os.path.isfile(file) == True: + o = open(file, "r") + data = o.read() + o.close() + if data == content: + return # nothing to change, file is up to date + with open(file, 'w') as o: + o.write(content) + def write_sai_impl_files(sai_api): env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) env.add_extension('jinja2.ext.loopcontrols') @@ -367,16 +380,14 @@ def write_sai_impl_files(sai_api): else: header_prefix = "" sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], header_prefix = header_prefix) - with open('./lib/sai' + sai_api['app_name'].replace('_', '') + '.cpp', 'w') as o: - o.write(sai_impl_str) + write_if_different('./lib/sai' + sai_api['app_name'].replace('_', '') + '.cpp',sai_impl_str) def write_sai_makefile(sai_api_name_list, sai_api_full_name_list): env = Environment(loader=FileSystemLoader('.')) makefile_tm = env.get_template('/templates/Makefile.j2') makefile_str = makefile_tm.render(api_names = sai_api_name_list) - with open('./lib/Makefile', 'w') as o: - o.write(makefile_str) + write_if_different('./lib/Makefile',makefile_str) def write_sai_fixed_api_files(sai_api_full_name_list): env = Environment(loader=FileSystemLoader('.')) @@ -386,8 +397,7 @@ def write_sai_fixed_api_files(sai_api_full_name_list): sai_impl_tm = env.get_template('/templates/%s.j2' % filename) sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], api_names = sai_api_full_name_list) - with open('./lib/%s' % filename, 'w') as o: - o.write(sai_impl_str) + write_if_different('./lib/%s' % filename,sai_impl_str) def write_sai_files(sai_api): @@ -401,8 +411,7 @@ def write_sai_files(sai_api): sai_header_tm = env.get_template('templates/saiapi.h.j2') sai_header_str = sai_header_tm.render(sai_api = sai_api) - with open('./SAI/experimental/saiexperimental' + sai_api['app_name'].replace('_', '') + '.h', 'w') as o: - o.write(sai_header_str) + write_if_different('./SAI/experimental/saiexperimental' + sai_api['app_name'].replace('_', '') + '.h',sai_header_str) # The SAI Extensions with open('./SAI/experimental/saiextensions.h', 'r') as f: @@ -423,8 +432,7 @@ def write_sai_files(sai_api): new_lines.append(line) - with open('./SAI/experimental/saiextensions.h', 'w') as f: - f.write(''.join(new_lines)) + write_if_different('./SAI/experimental/saiextensions.h',''.join(new_lines)) # The SAI Type Extensions with open('./SAI/experimental/saitypesextensions.h', 'r') as f: @@ -441,8 +449,7 @@ def write_sai_files(sai_api): new_lines.append(line) - with open('./SAI/experimental/saitypesextensions.h', 'w') as f: - f.write(''.join(new_lines)) + write_if_different('./SAI/experimental/saitypesextensions.h',''.join(new_lines)) # The SAI object struct for entries with open('./SAI/inc/saiobject.h', 'r') as f: @@ -466,8 +473,7 @@ def write_sai_files(sai_api): new_lines.append(line) - with open('./SAI/inc/saiobject.h', 'w') as f: - f.write(''.join(new_lines)) + write_if_different('./SAI/inc/saiobject.h',''.join(new_lines)) # CLI @@ -546,8 +552,7 @@ def write_sai_files(sai_api): new_lines = new_lines[:-1] new_lines.append(line) -with open('./SAI/experimental/saitypesextensions.h', 'w') as f: - f.write(''.join(new_lines)) +write_if_different('./SAI/experimental/saitypesextensions.h',''.join(new_lines)) write_sai_makefile(sai_api_name_list, sai_api_full_name_list) From 3e9d07c3ae5c85169838adc9fe799230fa31ef6b Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Fri, 1 Sep 2023 19:21:23 +0200 Subject: [PATCH 61/75] [submodule] Update SAI submodule to origin/master (#431) To include [test] Refactor saithriftv2 Makefile https://github.com/opencomputeproject/SAI/commit/4f39bd --- dash-pipeline/SAI/SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-pipeline/SAI/SAI b/dash-pipeline/SAI/SAI index 7a45648e9..8a0be5e1e 160000 --- a/dash-pipeline/SAI/SAI +++ b/dash-pipeline/SAI/SAI @@ -1 +1 @@ -Subproject commit 7a45648e928836722df241dfe01c57e02876d5c1 +Subproject commit 8a0be5e1e335a4797904f107ececa246c65eb353 From 654b357ab11b2f2a067a3a0d22eb99b275d9c337 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 1 Sep 2023 13:37:04 -0700 Subject: [PATCH 62/75] Remove ACL tags from BM (#425) Signed-off-by: Marian Pritsak --- dash-pipeline/bmv2/dash_acl.p4 | 2 - dash-pipeline/bmv2/dash_metadata.p4 | 4 - dash-pipeline/bmv2/dash_pipeline.p4 | 31 -------- test/test-cases/functional/ptf/saidashacl.py | 77 ------------------- .../saic/test_sai_vnet_outbound_simple.py | 2 - 5 files changed, 116 deletions(-) diff --git a/dash-pipeline/bmv2/dash_acl.p4 b/dash-pipeline/bmv2/dash_acl.p4 index 6b89958c8..481f2ea1e 100644 --- a/dash-pipeline/bmv2/dash_acl.p4 +++ b/dash-pipeline/bmv2/dash_acl.p4 @@ -38,8 +38,6 @@ match_kind { key = { \ meta. ## table_name ##_dash_acl_group_id : exact @name("meta.dash_acl_group_id:dash_acl_group_id") \ @Sai[type="sai_object_id_t", isresourcetype="true", objects="SAI_OBJECT_TYPE_DASH_ACL_GROUP"]; \ - meta.dst_tag_map : ternary @name("meta.dst_tag_map:dst_tag"); \ - meta.src_tag_map : ternary @name("meta.src_tag_map:src_tag"); \ meta.dst_ip_addr : LIST_MATCH @name("meta.dst_ip_addr:dip"); \ meta.src_ip_addr : LIST_MATCH @name("meta.src_ip_addr:sip"); \ meta.ip_protocol : LIST_MATCH @name("meta.ip_protocol:protocol"); \ diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index 9eb701290..d7611231f 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -3,8 +3,6 @@ #include "dash_headers.p4" -typedef bit<32> tag_map_t; - struct encap_data_t { bit<24> vni; bit<24> dest_vnet_vni; @@ -70,8 +68,6 @@ struct metadata_t { bit<16> mapping_meter_class; bit<16> meter_class; bit<32> meter_bucket_index; - tag_map_t src_tag_map; - tag_map_t dst_tag_map; } #endif /* _SIRIUS_METADATA_P4_ */ diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index e51edd6ed..ea86d0205 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -345,34 +345,6 @@ control dash_ingress( } } - action set_src_tag(tag_map_t tag_map) { - meta.src_tag_map = tag_map; - } - - @name("src_tag|dash_tag") - table src_tag { - key = { - meta.src_ip_addr : lpm @name("meta.src_ip_addr:sip"); - } - actions = { - set_src_tag; - } - } - - action set_dst_tag(tag_map_t tag_map) { - meta.dst_tag_map = tag_map; - } - - @name("dst_tag|dash_tag") - table dst_tag { - key = { - meta.dst_ip_addr : lpm @name("meta.dst_ip_addr:dip"); - } - actions = { - set_dst_tag; - } - } - apply { #ifdef TARGET_DPDK_PNA @@ -450,9 +422,6 @@ control dash_ingress( } acl_group.apply(); - src_tag.apply(); - dst_tag.apply(); - if (meta.direction == dash_direction_t.OUTBOUND) { outbound.apply(hdr, meta); diff --git a/test/test-cases/functional/ptf/saidashacl.py b/test/test-cases/functional/ptf/saidashacl.py index 8a5f3983c..ee395ddeb 100644 --- a/test/test-cases/functional/ptf/saidashacl.py +++ b/test/test-cases/functional/ptf/saidashacl.py @@ -6,30 +6,11 @@ from sai_dash_utils import VnetAPI -class Tag(object): - def __init__(self, saithrift, ip, mask, tag): - self.saithrift = saithrift - self.ip = ip - self.mask = mask - self.tag = tag - self.prefix = sai_thrift_ip_prefix_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, - addr=sai_thrift_ip_addr_t(ip4=self.ip), - mask=sai_thrift_ip_addr_t(ip4=self.mask)) - self.src_tag_entry = sai_thrift_src_tag_entry_t(switch_id=self.saithrift.switch_id, sip=self.prefix) - self.saithrift.create_entry(sai_thrift_create_src_tag_entry, - sai_thrift_remove_src_tag_entry, self.src_tag_entry, tag_map=self.tag) - self.dst_tag_entry = sai_thrift_dst_tag_entry_t(switch_id=self.saithrift.switch_id, dip=self.prefix) - self.saithrift.create_entry(sai_thrift_create_dst_tag_entry, - sai_thrift_remove_dst_tag_entry, self.dst_tag_entry, tag_map=self.tag) - - class AclRuleTest(object): def __init__(self, saithrift, acl_group, protocol = 17, - stag = None, - dtag = None, sip = None, dip = None, src_port = 1234, @@ -47,8 +28,6 @@ def __init__(self, self.priority = priority self.action = action self.exp_receive = exp_receive - self.stag = stag - self.dtag = dtag self.src_port = src_port self.dst_port = dst_port if self.dip: @@ -62,10 +41,6 @@ def __init__(self, sai_thrift_remove_dash_acl_rule, dash_acl_group_id=self.acl_group, protocol=self.protocol, - src_tag=self.stag, - src_tag_mask=self.stag, - dst_tag=self.dtag, - dst_tag_mask=self.dtag, sip=sip, dip=dip, src_port = self.src_port, @@ -278,58 +253,6 @@ def setupTest(self): action=SAI_DASH_ACL_RULE_ACTION_DENY, exp_receive=False)) - self.tag1 = Tag(self, ip = "10.1.2.4", mask = "255.255.255.254", tag = 0x11) - self.tests.append(AclRuleTest(self, - acl_group=self.out_v4_stage1_acl_group_id, - protocol=17, - stag = 0x1, - priority=3, - src_port=1234, - action=SAI_DASH_ACL_RULE_ACTION_PERMIT, - exp_receive=True, - test_sip = "10.1.2.4", - test_dip = self.dst_ca_ip)) - self.tests.append(AclRuleTest(self, - acl_group=None, - exp_receive=True, - src_port=1234, - test_sip = "10.1.2.5", - test_dip = self.dst_ca_ip)) - self.tests.append(AclRuleTest(self, - acl_group=self.out_v4_stage1_acl_group_id, - protocol=17, - stag = 0x10, - priority=3, - src_port=4321, - action=SAI_DASH_ACL_RULE_ACTION_DENY, - exp_receive=False, - test_sip = "10.1.2.4", - test_dip = self.dst_ca_ip)) - self.tests.append(AclRuleTest(self, - acl_group=None, - exp_receive=False, - src_port=4321, - test_sip = "10.1.2.5", - test_dip = self.dst_ca_ip)) - self.tests.append(AclRuleTest(self, - acl_group=None, - exp_receive=False, - src_port=1111, - test_sip = "10.1.2.4", - test_dip = self.dst_ca_ip)) - - self.tag2 = Tag(self, ip = self.dst_ca_ip, mask = "255.255.255.255", tag = 0x100) - self.tests.append(AclRuleTest(self, - acl_group=self.out_v4_stage1_acl_group_id, - protocol=17, - dtag = 0x100, - priority=3, - src_port=2222, - action=SAI_DASH_ACL_RULE_ACTION_PERMIT, - exp_receive=True, - test_sip = "10.1.2.6", - test_dip = self.dst_ca_ip)) - def setUp(self): super(SaiThriftDashAclTest, self).setUp() self.cleaned_up = False diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py index 073a17389..1a77ef25b 100644 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_simple.py @@ -139,8 +139,6 @@ def test_vnet_inbound_simple_create(self, dpu): def test_vnet_inbound_simple_packet_modification(self, dpu, dataplane): """Verify proper packet transformation.""" - dataplane.set_config() - SRC_VM_IP = "10.1.1.10" OUTER_SMAC = "00:00:05:06:06:06" OUR_MAC = "00:00:02:03:04:05" From 3bbe99f19cb047770e43d63204ff1e94ffadca27 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Thu, 7 Sep 2023 19:34:04 +0200 Subject: [PATCH 63/75] [dash-pipeline] Refactor Makefiles (#432) * [dash-pipeline] Refactor Makefiles * compile everything with host user id and group * reduce number of required libs * simplify Makefiles * make proper dependencies * Trigger ptf submodule init in SAI * [libsai] Return SAI_PORT_OPER_STATUS_UP on each port Speeds up ptf test execution, since all ports are already up --- dash-pipeline/Makefile | 58 ++++++++++------- dash-pipeline/SAI/saithrift/Makefile | 65 +++++++++---------- dash-pipeline/SAI/templates/Makefile.j2 | 56 ++++------------ dash-pipeline/SAI/templates/dashsai.cpp.j2 | 8 +++ .../SAI/templates/saifixedapis.cpp.j2 | 6 +- .../tests/libsai/init_switch/.gitignore | 3 +- .../tests/libsai/init_switch/Makefile | 43 +++++------- .../tests/libsai/init_switch/init_switch.cpp | 6 +- .../tests/libsai/vnet_out/.gitignore | 3 +- dash-pipeline/tests/libsai/vnet_out/Makefile | 40 +++++------- 10 files changed, 134 insertions(+), 154 deletions(-) diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index dc95de8fa..3a16cf365 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -23,6 +23,9 @@ DASH_UID ?=4321 DASH_GUID?=4321 DASH_HOST?=dash +HOST_USER := $(shell id -u) +HOST_GROUP := $(shell id -g) + ENABLE_DOCKER_PULL ?= y # Include file defines DOCKER_GRPC_IMG_NAME and DOCKER_GRPC_IMG_CTAG @@ -71,6 +74,7 @@ DOCKER_RUN := docker run \ -v $(PWD)/tests:/tests \ --network=host \ --rm \ + -u $(HOST_USER):$(HOST_GROUP) \ $(DOCKER_FLAGS) SHA1SUM := sha1sum | awk '{print substr($$1,0,11);}' @@ -93,20 +97,20 @@ P4_MAIN=bmv2/dash_pipeline.p4 P4_OUTDIR=bmv2/dash_pipeline.bmv2 P4_ARTIFACTS=$(P4_OUTDIR)/dash_pipeline.json $(P4_OUTDIR)/dash_pipeline_p4rt.txt -p4: $(P4_OUTDIR)/dash_pipeline.json +p4: $(P4_ARTIFACTS) .PHONY:p4-clean p4-clean: - -rm -rf $(P4_OUTDIR) + rm -rf $(P4_OUTDIR) + # Compile P4 into bmv2 .json fle and P4info for SAI header autogeneration $(P4_ARTIFACTS): $(P4_SRC) @echo "Compile P4 program $(P4_MAIN) for bmv2 ..." - mkdir -p $(P4_OUTDIR) && \ - chmod o+w $(P4_OUTDIR) && \ + mkdir -p $(P4_OUTDIR) docker run \ --rm \ --name dash-p4c-$(USER) \ - -u $(DASH_USER) \ + -u $(HOST_USER):$(HOST_GROUP) \ $(DOCKER_FLAGS) \ -v $(PWD)/bmv2:/bmv2 \ -w / \ @@ -123,12 +127,11 @@ P4_DPDK_OUTDIR=dpdk-pna/dash_pipeline.dpdk p4c-dpdk-pna: @echo "Compile P4 program $(P4_MAIN) for dpdk-pna ..." - mkdir -p $(P4_DPDK_OUTDIR) && \ - chmod o+w $(P4_DPDK_OUTDIR) && \ + mkdir -p $(P4_DPDK_OUTDIR) docker run \ --rm \ --name dash-p4c-dpdk-$(USER) \ - -u $(DASH_USER) \ + -u $(HOST_USER):$(HOST_GROUP) \ $(DOCKER_FLAGS) \ -v $(PWD)/bmv2:/bmv2 \ -v $(PWD)/dpdk-pna:/dpdk-pna \ @@ -140,7 +143,6 @@ p4c-dpdk-pna: --p4runtime-files $(P4_DPDK_OUTDIR)/dash_pipeline.p4.p4info.txt \ $(P4_MAIN) - # p4c-dpdk -DDPDK_PNA -DPNA_CONNTRACK --dump $(P4_DPDK_OUTDIR) --pp $(P4_DPDK_OUTDIR)/dash_pipeline.pp.p4 \ # -o $(P4_DPDK_OUTDIR)/dash_pipeline.spec --arch pna --bf-rt-schema $(P4_DPDK_OUTDIR)/dash_pipeline.p4.bfrt.json \ # --p4runtime-files $(P4_DPDK_OUTDIR)/dash_pipeline.p4.p4info.txt $(P4_MAIN) @@ -158,19 +160,22 @@ DOCKER_RUN_SAITHRIFT_BLDR =\ --name dash-saithrift-bldr-$(USER) \ -v $(PWD)/..:/dash -w /dash/dash-pipeline/SAI/saithrift \ -e SAIRPC_VENDOR_EXTRA_LIBS=$(SAIRPC_VENDOR_EXTRA_LIBS) \ + -u $(DASH_UID):$(DASH_GUID) \ + -e HOST_USER=$(HOST_USER) \ + -e HOST_GROUP=$(HOST_GROUP) \ $(DOCKER_SAITHRIFT_BLDR_IMG) \ # TODO - create separate rules for headers, libsai.so .PHONY:sai - -sai: sai-clean sai-headers sai-meta libsai +sai: sai-headers sai-meta libsai sai-headers: p4 docker-saithrift-bldr-image-exists | SAI/SAI @echo "Generate SAI library headers and implementation..." - mkdir -p SAI/lib && chmod -R o+w SAI && \ + mkdir -p SAI/lib $(DOCKER_RUN) \ $(DOCKER_FLAGS) \ --name build_sai-$(USER) \ + -u $(HOST_USER):$(HOST_GROUP) \ -w /SAI $(DOCKER_SAITHRIFT_BLDR_IMG) \ ./generate_dash_api.sh @@ -178,28 +183,34 @@ sai-meta: @echo "Generate SAI metadata..." # hack - remove scripts which cause Git ownership failures in CI pipelines # We don't need them, they're to check that SAI headers didn't experience enum changes etc. - sed -ie '/checkenumlock.sh/d' SAI/SAI/meta/Makefile - sed -ie '/checkancestry.sh/d' SAI/SAI/meta/Makefile + sed -i.bak '/checkenumlock.sh/d' SAI/SAI/meta/Makefile + sed -i.bak '/checkancestry.sh/d' SAI/SAI/meta/Makefile + sed -i.bak '/checkstructs.sh/d' SAI/SAI/meta/Makefile docker run \ $(DOCKER_FLAGS) \ --rm \ --name dash-saithrift-bldr-$(USER) \ - -v $(PWD)/..:/dash -w /dash/dash-pipeline/SAI/SAI/meta \ + -u $(HOST_USER):$(HOST_GROUP) \ + -v $(PWD)/..:/dash \ + -w /dash/dash-pipeline/SAI/SAI/meta \ $(DOCKER_SAITHRIFT_BLDR_IMG) \ make -# TODO - add SAI header dependencies -libsai: +libsai: SAI/lib/libsai.so + +SAI/lib/libsai.so: sai-headers sai-meta @echo "build libsai.so..." $(DOCKER_RUN) \ $(DOCKER_FLAGS) \ -w /SAI/lib \ --name build_libsai-$(USER) \ + -u $(HOST_USER):$(HOST_GROUP) \ $(DOCKER_BMV2_BLDR_IMG) \ make +.PHONY:libsai-clean libsai-clean: - -rm -rf SAI/lib/* + rm -rf SAI/lib/* .PHONY:sai-clean sai-clean: SAI/SAI libsai-clean saithrift-server-clean @@ -269,6 +280,7 @@ run-saithrift-server-bash: $(DOCKER_RUN_SAITHRIFT_SRVR) \ /bin/bash +.PHONY:saithrift-server-clean saithrift-server-clean: docker-saithrift-bldr-image-exists $(DOCKER_RUN_SAITHRIFT_BLDR) \ make $@ @@ -278,18 +290,18 @@ saithrift-server-clean: docker-saithrift-bldr-image-exists # SAI TEST TARGETS ############################### -.PHONY:test libsai-test -test:libsai-test +.PHONY:test +test: libsai-test +.PHONY:test-clean test-clean: make -C tests/libsai clean - .PHONY:libsai-test -libsai-test:SAI/SAI SAI/lib/libsai.so - chmod -R a+w tests/libsai +libsai-test: SAI/lib/libsai.so $(DOCKER_RUN) \ --name dash-build-test-$(USER) \ + -u $(HOST_USER):$(HOST_GROUP) \ -w /tests/libsai $(DOCKER_BMV2_BLDR_IMG) \ make diff --git a/dash-pipeline/SAI/saithrift/Makefile b/dash-pipeline/SAI/saithrift/Makefile index 581d396ef..969c68bde 100644 --- a/dash-pipeline/SAI/saithrift/Makefile +++ b/dash-pipeline/SAI/saithrift/Makefile @@ -9,62 +9,57 @@ META=../SAI/meta SAIRPC_VENDOR_EXTRA_LIBS?= SAIRPC_EXTRA_LIBS= "$(SAIRPC_VENDOR_EXTRA_LIBS) \ - -L/lib/x86_64-linux-gnu -Wl,-rpath=/lib/x86_64-linux-gnu -lm \ + -L/lib/x86_64-linux-gnu -Wl,-rpath=/lib/x86_64-linux-gnu \ -L/usr/local/lib/ -Wl,-rpath=/usr/local/lib \ - -lpthread \ - -lpiprotogrpc \ - -lpiprotobuf \ - -lprotobuf \ - -lgrpc++ \ - -lgrpc \ - -lpiall \ - -lpi_dummy \ - -lpthread \ - -labsl_synchronization \ - -labsl_status \ - -labsl_raw_hash_set \ - -lgpr \ - -lre2 \ - -lssl \ - -laddress_sorting" + -lprotobuf -lpiprotobuf -lpiprotogrpc -lgrpc++" + +HUSER=hostuser +HGROUP=hostgroup + +SUDO=sudo -u $(HUSER) -g $(HGROUP) + +host: + sudo groupadd -f -r -g $(HOST_GROUP) $(HGROUP) + sudo useradd $(HUSER) -l -u $(HOST_USER) -g $(HOST_GROUP) -d $(shell pwd) -m -s /usr/bin/bash # Below based on: https://github.com/opencomputeproject/SAI/blob/master/ptf/SAI_PTF_user-guide.md # Dependencies are assumed to be installed, e.g. in the docker container -saithrift-server: +saithrift-server: host # Copy headers to /usr/include/sai sudo mkdir -p /usr/include/sai - sudo cp $(SAI)/inc/sai*.h /usr/include/sai/ + sudo cp -a $(SAI)/inc/sai*.h /usr/include/sai/ # Following is workaround for https://github.com/opencomputeproject/SAI/issues/1537 - sudo cp $(SAI)/experimental/sai*.h /usr/include/sai/ - sudo cp -r $(SAI)/experimental/ /usr/include/ + sudo cp -a $(SAI)/experimental/sai*.h /usr/include/sai/ + sudo cp -ar $(SAI)/experimental/ /usr/include/ # Install vendor specific SAI library i.e. DASH bmv2 libsai.so in /usr/lib. sudo cp $(LIB)/libsai.so /usr/lib @echo "Build SAI thrift server and libraries..." - mkdir -p $(RPC_INST_DIR) && chmod a+w $(RPC_INST_DIR) + $(SUDO) mkdir -p $(RPC_INST_DIR) - cd $(SAI) && export SAITHRIFTV2=y && \ + $(SUDO) bash -c 'cd $(SAI) && \ + export SAITHRIFTV2=y && \ export GEN_SAIRPC_OPTS="-ve" && \ - export SAIRPC_EXTRA_LIBS=$(SAIRPC_EXTRA_LIBS) && \ + export SAIRPC_EXTRA_LIBS="$(shell echo $(SAIRPC_EXTRA_LIBS))" && \ make saithrift-build && \ - export DESTDIR=$(RPC_INST_DIR) && make saithrift-install + export DESTDIR=$(RPC_INST_DIR) && \ + make saithrift-install' # NOTE: commands below is a workaround (WA) and needed until packaging of SAI python is fixed. # Re-generate python SAI thrift library again + $(SUDO) bash -c 'cd $(SAI)/test/saithriftv2 && export DESTDIR=$(RPC_INST_DIR) && make install-pylib' - cd $(SAI)/test/saithriftv2 && export DESTDIR=$(RPC_INST_DIR) && make install-pylib # Copy auto-generated python SAI thrift library to your Test controller host. - cp $(SAI)/test/saithriftv2/dist/saithrift-0.9.tar.gz $(RPC_INST_DIR) + $(SUDO) cp $(SAI)/test/saithriftv2/dist/saithrift-0.9.tar.gz $(RPC_INST_DIR) # Copy thrift libs from builder image onto host - cp /usr/lib/libthrift*so* /usr/lib/thrift-0.11.0.tar.gz $(RPC_INST_DIR) - chmod -R a+w $(META)/generated $(META)/html $(META)/xml $(RPC_INST_DIR) + $(SUDO) cp /usr/lib/libthrift*so* /usr/lib/thrift-0.11.0.tar.gz $(RPC_INST_DIR) + +saithrift-server-clean: host + $(SUDO) bash -c 'cd $(SAI) && export SAITHRIFTV2=y && make clean' + $(SUDO) rm -rf $(SAI)/test/saithriftv2/gen-cpp/ + $(SUDO) rm -rf $(SAI)/test/saithriftv2/obj/ + $(SUDO) rm -rf $(RPC_INST_DIR) -saithrift-server-clean: - cd $(SAI) && export SAITHRIFTV2=y && make clean - rm -rf $(SAI)/test/saithriftv2/gen-cpp/ - rm -rf $(SAI)/test/saithriftv2/obj/ - rm -rf $(RPC_INST_DIR) - clean: saithrift-server-clean diff --git a/dash-pipeline/SAI/templates/Makefile.j2 b/dash-pipeline/SAI/templates/Makefile.j2 index 65f05ad7d..06b200a4b 100644 --- a/dash-pipeline/SAI/templates/Makefile.j2 +++ b/dash-pipeline/SAI/templates/Makefile.j2 @@ -50,52 +50,22 @@ CXXFLAGS_COMMON+= -Wno-unused-label # Sources from OCP SAI Repo: SAI_DIR=../SAI/meta/ -SAI_SRCS=saimetadatautils.c \ - saimetadata.c \ - saiserialize.c +SAI_INC=-I../SAI/meta -I../SAI/inc -I../SAI/experimental -SAI_SRC_PATHS=$(addprefix $(SAI_DIR),$(SAI_SRCS)) -SAI_OBJS=$(SAI_SRCS:.c=.o) +SAI_OBJS=saimetadatautils.o saimetadata.o saiserialize.o +SAI_OBJS_PATHS=$(addprefix $(SAI_DIR)/,$(SAI_OBJS)) -# DASH libsai "fixed" sources (not generated from P4 code) -DASH_FIXED_SAI_SRCS=utils.cpp \ - saifixedapis.cpp \ - logger.cpp \ - config.cpp \ - dashsai.cpp -DASH_FIXED_SAI_OBJ=$(DASH_FIXED_SAI_SRCS:.cpp=.o) +DASH_SAI_SRCS=$(wildcard *.cpp) +DASH_SAI_OBJS=$(DASH_SAI_SRCS:.cpp=.o) -# DASH libsai "generated" sources (from P4 code) -DASH_GEN_SAI_SRCS={% for api in api_names %}sai{{ api }}.cpp {% endfor %} -DASH_GEN_SAI_OBJ=$(DASH_GEN_SAI_SRCS:.cpp=.o) +%.o: %.cpp + g++ $(SAI_INC) $(GXX_FLAGS) $(CXXFLAGS_COMMON) -c $< -o $@ -libsai.so: $(DASH_FIXED_SAI_SRCS) $(DASH_GEN_SAI_SRCS) - gcc \ - -fPIC \ - -c \ - -I ../SAI/meta/ \ - -I ../SAI/inc/ \ - -I ../SAI/experimental/ \ - $(GXX_FLAGS) \ - $(SAI_SRC_PATHS) +all: libsai.so - g++ \ - -fpermissive \ - -c \ - -I ../SAI/meta/ \ - -I ../SAI/inc/ \ - -I ../SAI/experimental/ \ - -fPIC \ - -g \ - $(CXXFLAGS_COMMON) \ - $(GXX_FLAGS) \ - $(DASH_FIXED_SAI_SRCS) \ - $(DASH_GEN_SAI_SRCS) +libsai.so: $(SAI_OBJS_PATHS) $(DASH_SAI_OBJS) + g++ -shared -g -o $@ $^ - g++ \ - -shared \ - -g \ - -o libsai.so \ - $(DASH_FIXED_SAI_OBJ) \ - $(DASH_GEN_SAI_OBJ) \ - $(SAI_OBJS) +.PHONY: clean +clean: + rm -f *.o libsai.so diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/templates/dashsai.cpp.j2 index 8f8defaf1..e655ad947 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/templates/dashsai.cpp.j2 @@ -455,6 +455,14 @@ sai_status_t DashSai::getPortAttribute( break; + case SAI_PORT_ATTR_OPER_STATUS: + + attr->value.s32 = SAI_PORT_OPER_STATUS_UP; + + DASH_LOG_NOTICE("[%d] setting SAI_PORT_ATTR_OPER_STATUS=SAI_PORT_OPER_STATUS_UP for port %lx", i, port_id); + + break; + default: if (getenv(DASH_USE_NOT_SUPPORTED)) diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index 6dd5d6511..fbe659edc 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -102,7 +102,11 @@ sai_port_api_t dash_sai_port_api_impl = { .create_ports = 0, .remove_ports = 0, .set_ports_attribute = 0, - .get_ports_attribute = 0 + .get_ports_attribute = 0, + .create_port_serdess = 0, + .remove_port_serdess = 0, + .set_port_serdess_attribute = 0, + .get_port_serdess_attribute = 0, }; sai_status_t sai_api_query( diff --git a/dash-pipeline/tests/libsai/init_switch/.gitignore b/dash-pipeline/tests/libsai/init_switch/.gitignore index 8fe592fc2..6cb38916c 100644 --- a/dash-pipeline/tests/libsai/init_switch/.gitignore +++ b/dash-pipeline/tests/libsai/init_switch/.gitignore @@ -1 +1,2 @@ -init_switch \ No newline at end of file +init_switch +*.o diff --git a/dash-pipeline/tests/libsai/init_switch/Makefile b/dash-pipeline/tests/libsai/init_switch/Makefile index 786fa3f4f..9d3fa5207 100644 --- a/dash-pipeline/tests/libsai/init_switch/Makefile +++ b/dash-pipeline/tests/libsai/init_switch/Makefile @@ -1,33 +1,26 @@ -all:init_switch -init_switch: init_switch.cpp /SAI/lib/libsai.so + +INC=-I /SAI/SAI/inc -I /SAI/SAI/experimental/ +SRC=init_switch.cpp +OBJ=$(SRC:.cpp=.o) + +all: init_switch + +%.o: %.cpp + g++ $(INC) -c $< -o $@ + +init_switch: $(OBJ) /SAI/lib/libsai.so echo "building $@ ..." - g++ \ - -I /SAI/lib \ - -I /SAI/SAI/inc \ - -I /SAI/SAI/experimental/ \ - -o init_switch \ - init_switch.cpp \ + g++ $(OBJ) \ + -o $@ \ -Wl,-rpath,/SAI/lib \ -L/SAI/lib/ \ -lsai \ -L/usr/local/lib/ \ - -lpthread \ - -lpiprotogrpc \ - -lpiprotobuf \ -lprotobuf \ - -lgrpc++ \ - -lgrpc \ - -lpiall \ - -lpi_dummy \ - -lpthread \ - -labsl_synchronization \ - -labsl_status \ - -labsl_raw_hash_set \ - -lgpr \ - -lre2 \ - -lssl \ - -laddress_sorting \ - -g + -lpiprotobuf \ + -lpiprotogrpc \ + -lgrpc++ \ + -g clean: - rm -rf init_switch + rm -f init_switch *.o diff --git a/dash-pipeline/tests/libsai/init_switch/init_switch.cpp b/dash-pipeline/tests/libsai/init_switch/init_switch.cpp index 8d4826c0c..0bc22ab92 100644 --- a/dash-pipeline/tests/libsai/init_switch/init_switch.cpp +++ b/dash-pipeline/tests/libsai/init_switch/init_switch.cpp @@ -1,7 +1,9 @@ -#include "utils.h" - #include +extern "C" { +#include +} + // Run this program to indirectly cause simple_switch_grpc to load its P4 pipeline int main(int argc, char **argv) diff --git a/dash-pipeline/tests/libsai/vnet_out/.gitignore b/dash-pipeline/tests/libsai/vnet_out/.gitignore index 5c33f5dc4..6e704f68f 100644 --- a/dash-pipeline/tests/libsai/vnet_out/.gitignore +++ b/dash-pipeline/tests/libsai/vnet_out/.gitignore @@ -1 +1,2 @@ -vnet_out \ No newline at end of file +vnet_out +*.o diff --git a/dash-pipeline/tests/libsai/vnet_out/Makefile b/dash-pipeline/tests/libsai/vnet_out/Makefile index d96e3c6b1..badd9ced7 100644 --- a/dash-pipeline/tests/libsai/vnet_out/Makefile +++ b/dash-pipeline/tests/libsai/vnet_out/Makefile @@ -1,32 +1,26 @@ -all:vnet_out -vnet_out: vnet_out.cpp /SAI/lib/libsai.so + +INC=-I /SAI/SAI/inc -I /SAI/SAI/experimental/ +SRC=vnet_out.cpp +OBJ=$(SRC:.cpp=.o) + +all: vnet_out + +%.o: %.cpp + g++ $(INC) -c $< -o $@ + +vnet_out: $(OBJ) /SAI/lib/libsai.so echo "building $@ ..." - g++ \ - -I /SAI/SAI/inc \ - -I /SAI/SAI/experimental/ \ - -o vnet_out \ - vnet_out.cpp \ + g++ $(OBJ) \ + -o $@ \ -Wl,-rpath,/SAI/lib \ -L/SAI/lib/ \ -lsai \ -L/usr/local/lib/ \ - -lpthread \ - -lpiprotogrpc \ - -lpiprotobuf \ -lprotobuf \ - -lgrpc++ \ - -lgrpc \ - -lpiall \ - -lpi_dummy \ - -lpthread \ - -labsl_synchronization \ - -labsl_status \ - -labsl_raw_hash_set \ - -lgpr \ - -lre2 \ - -lssl \ - -laddress_sorting \ + -lpiprotobuf \ + -lpiprotogrpc \ + -lgrpc++ \ -g clean: - rm -rf vnet_out + rm -f vnet_out *.o From 5cc19b02205daaac184e1754580b91e06e75b88b Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 13 Sep 2023 15:56:52 +0200 Subject: [PATCH 64/75] [dash] Update SAI to latest v1.13 (#435) To get newest changes in SAI metdata repo --- dash-pipeline/SAI/SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash-pipeline/SAI/SAI b/dash-pipeline/SAI/SAI index 8a0be5e1e..7f7a7587d 160000 --- a/dash-pipeline/SAI/SAI +++ b/dash-pipeline/SAI/SAI @@ -1 +1 @@ -Subproject commit 8a0be5e1e335a4797904f107ececa246c65eb353 +Subproject commit 7f7a7587debf6b393118b29ca71c2d00722bb885 From 1729021f03bd855f049930f1472520da9742b9cc Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Sun, 17 Sep 2023 22:29:08 +0200 Subject: [PATCH 65/75] [dash] Refactor libsai (#438) * [dash] Refactor style for saiapi template and add logs For better understanding which attributes are not implemented yet * [dash] Move generate_dash_api.sh script to proper Makefile We will need makefile for movind source that don't need templates * [dash] Move out non template files to src directory This will separate files that nedd actual processing from files that are pure sources * [dash] Add Makefile include files dependencies For faster compilation * [dash] Dash SAI add quad generic api skeleton For base non dash apis * [dash] Add dash quad macros for quad SAI api Will be handy when adding support for more base objects * [dash] Extract port apis to separate file To make code more clear * [dash] Extract switch apis to separate file * [dash] Add ObjectIdManager class For managing all objects oids * [dash] Start using ObjectIdManager in DashSai For better managing all oids * [dash] Add dummy SAI base APIs Will be needed for swss orchagent to start properly * [dash] Fix vnet_out test It require to create switch first * Use actual switch id * Address comments --- dash-pipeline/Makefile | 4 +- dash-pipeline/SAI/Makefile | 28 +- dash-pipeline/SAI/generate_dash_api.sh | 5 - dash-pipeline/SAI/sai_api_gen.py | 10 +- .../{templates/Makefile.j2 => src/Makefile} | 17 +- .../config.cpp.j2 => src/config.cpp} | 0 .../{templates/config.h.j2 => src/config.h} | 0 .../dashsai.cpp.j2 => src/dashsai.cpp} | 182 ++++++++--- .../{templates/dashsai.h.j2 => src/dashsai.h} | 29 +- .../logger.cpp.j2 => src/logger.cpp} | 0 .../{templates/logger.h.j2 => src/logger.h} | 0 dash-pipeline/SAI/src/objectidmanager.cpp | 308 ++++++++++++++++++ dash-pipeline/SAI/src/objectidmanager.h | 134 ++++++++ dash-pipeline/SAI/src/sai_dash_hostif.cpp | 21 ++ dash-pipeline/SAI/src/sai_dash_neighbor.cpp | 58 ++++ dash-pipeline/SAI/src/sai_dash_next_hop.cpp | 13 + dash-pipeline/SAI/src/sai_dash_policer.cpp | 9 + dash-pipeline/SAI/src/sai_dash_port.cpp | 36 ++ .../SAI/src/sai_dash_router_interface.cpp | 9 + dash-pipeline/SAI/src/sai_dash_switch.cpp | 35 ++ .../{templates/saidash.h.j2 => src/saidash.h} | 0 .../{templates/utils.cpp.j2 => src/utils.cpp} | 0 .../SAI/{templates/utils.h.j2 => src/utils.h} | 0 dash-pipeline/SAI/templates/saiapi.cpp.j2 | 120 +++++-- .../SAI/templates/saifixedapis.cpp.j2 | 116 +------ dash-pipeline/SAI/templates/saiimpl.h.j2 | 85 ++++- .../tests/libsai/vnet_out/vnet_out.cpp | 12 + 27 files changed, 1008 insertions(+), 223 deletions(-) delete mode 100755 dash-pipeline/SAI/generate_dash_api.sh rename dash-pipeline/SAI/{templates/Makefile.j2 => src/Makefile} (91%) rename dash-pipeline/SAI/{templates/config.cpp.j2 => src/config.cpp} (100%) rename dash-pipeline/SAI/{templates/config.h.j2 => src/config.h} (100%) rename dash-pipeline/SAI/{templates/dashsai.cpp.j2 => src/dashsai.cpp} (78%) rename dash-pipeline/SAI/{templates/dashsai.h.j2 => src/dashsai.h} (74%) rename dash-pipeline/SAI/{templates/logger.cpp.j2 => src/logger.cpp} (100%) rename dash-pipeline/SAI/{templates/logger.h.j2 => src/logger.h} (100%) create mode 100644 dash-pipeline/SAI/src/objectidmanager.cpp create mode 100644 dash-pipeline/SAI/src/objectidmanager.h create mode 100644 dash-pipeline/SAI/src/sai_dash_hostif.cpp create mode 100644 dash-pipeline/SAI/src/sai_dash_neighbor.cpp create mode 100644 dash-pipeline/SAI/src/sai_dash_next_hop.cpp create mode 100644 dash-pipeline/SAI/src/sai_dash_policer.cpp create mode 100644 dash-pipeline/SAI/src/sai_dash_port.cpp create mode 100644 dash-pipeline/SAI/src/sai_dash_router_interface.cpp create mode 100644 dash-pipeline/SAI/src/sai_dash_switch.cpp rename dash-pipeline/SAI/{templates/saidash.h.j2 => src/saidash.h} (100%) rename dash-pipeline/SAI/{templates/utils.cpp.j2 => src/utils.cpp} (100%) rename dash-pipeline/SAI/{templates/utils.h.j2 => src/utils.h} (100%) diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index 3a16cf365..eecf8679f 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -177,7 +177,7 @@ sai-headers: p4 docker-saithrift-bldr-image-exists | SAI/SAI --name build_sai-$(USER) \ -u $(HOST_USER):$(HOST_GROUP) \ -w /SAI $(DOCKER_SAITHRIFT_BLDR_IMG) \ - ./generate_dash_api.sh + make sai-meta: @echo "Generate SAI metadata..." @@ -271,7 +271,7 @@ DOCKER_RUN_SAITHRIFT_SRVR =\ run-saithrift-server: $(DOCKER_RUN_SAITHRIFT_SRVR) \ - ./saiserver + bash -c './saiserver' kill-saithrift-server: -docker kill dash-saithrift-server-$(USER) diff --git a/dash-pipeline/SAI/Makefile b/dash-pipeline/SAI/Makefile index db818adb1..90e70e664 100644 --- a/dash-pipeline/SAI/Makefile +++ b/dash-pipeline/SAI/Makefile @@ -1,19 +1,13 @@ -dashone: test.cpp - g++ \ - -I SAI/inc \ - -I SAI/experimental/ \ - -o test test.cpp saidash.cpp \ - -L/usr/local/lib/ \ - -lpthread \ - -lpiprotogrpc \ - -lpiprotobuf \ - -lprotobuf \ - -lgrpc++ \ - -lgrpc \ - -lpiall \ - -lpi_dummy \ - -lpthread \ - -labsl_synchronization \ - -g +all: copysrc + ./sai_api_gen.py \ + /bmv2/dash_pipeline.bmv2/dash_pipeline_p4rt.json \ + --ignore-tables=appliance,eni_meter,slb_decap \ + dash +copysrc: + install -CDv src/Makefile src/*h src/*cpp lib/ + +.PHONY: clean +clean: + rm -f lib/* diff --git a/dash-pipeline/SAI/generate_dash_api.sh b/dash-pipeline/SAI/generate_dash_api.sh deleted file mode 100755 index d3c73ebe2..000000000 --- a/dash-pipeline/SAI/generate_dash_api.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -./sai_api_gen.py \ - /bmv2/dash_pipeline.bmv2/dash_pipeline_p4rt.json \ - --ignore-tables=appliance,eni_meter,slb_decap \ - dash diff --git a/dash-pipeline/SAI/sai_api_gen.py b/dash-pipeline/SAI/sai_api_gen.py index 71ff6cff3..498072004 100755 --- a/dash-pipeline/SAI/sai_api_gen.py +++ b/dash-pipeline/SAI/sai_api_gen.py @@ -382,17 +382,10 @@ def write_sai_impl_files(sai_api): sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], header_prefix = header_prefix) write_if_different('./lib/sai' + sai_api['app_name'].replace('_', '') + '.cpp',sai_impl_str) -def write_sai_makefile(sai_api_name_list, sai_api_full_name_list): - env = Environment(loader=FileSystemLoader('.')) - makefile_tm = env.get_template('/templates/Makefile.j2') - makefile_str = makefile_tm.render(api_names = sai_api_name_list) - - write_if_different('./lib/Makefile',makefile_str) - def write_sai_fixed_api_files(sai_api_full_name_list): env = Environment(loader=FileSystemLoader('.')) - for filename in ['utils.cpp', 'utils.h', 'saifixedapis.cpp', 'saiimpl.h', 'logger.h', 'logger.cpp', 'saidash.h', 'dashsai.h', 'dashsai.cpp', 'config.h', 'config.cpp']: + for filename in ['saifixedapis.cpp', 'saiimpl.h']: env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True) sai_impl_tm = env.get_template('/templates/%s.j2' % filename) sai_impl_str = sai_impl_tm.render(tables = sai_api[TABLES_TAG], app_name = sai_api['app_name'], api_names = sai_api_full_name_list) @@ -555,7 +548,6 @@ def write_sai_files(sai_api): write_if_different('./SAI/experimental/saitypesextensions.h',''.join(new_lines)) -write_sai_makefile(sai_api_name_list, sai_api_full_name_list) write_sai_fixed_api_files(sai_api_full_name_list) if args.print_sai_lib: diff --git a/dash-pipeline/SAI/templates/Makefile.j2 b/dash-pipeline/SAI/src/Makefile similarity index 91% rename from dash-pipeline/SAI/templates/Makefile.j2 rename to dash-pipeline/SAI/src/Makefile index 06b200a4b..9b93dd754 100644 --- a/dash-pipeline/SAI/templates/Makefile.j2 +++ b/dash-pipeline/SAI/src/Makefile @@ -1,7 +1,3 @@ -# DASH libsai.so Makefile -# THIS MAKEFILE IS AUTO-GENERATED FROM templates/Makefile.j2 -# DO NOT MODIFY - CXXFLAGS_COMMON= CXXFLAGS_COMMON+= -ansi CXXFLAGS_COMMON+= -fPIC @@ -58,11 +54,18 @@ SAI_OBJS_PATHS=$(addprefix $(SAI_DIR)/,$(SAI_OBJS)) DASH_SAI_SRCS=$(wildcard *.cpp) DASH_SAI_OBJS=$(DASH_SAI_SRCS:.cpp=.o) -%.o: %.cpp - g++ $(SAI_INC) $(GXX_FLAGS) $(CXXFLAGS_COMMON) -c $< -o $@ - all: libsai.so +%.d: %.cpp + g++ $(SAI_INC) $(GXX_FLAGS) $(CXXFLAGS_COMMON) -M $^ -o $@ + +DEPS := $(DASH_SAI_OBJS:.o=.d) + +-include $(DEPS) + +%.o: %.cpp + g++ $(SAI_INC) $(GXX_FLAGS) $(CXXFLAGS_COMMON) -MMD -c $< -o $@ + libsai.so: $(SAI_OBJS_PATHS) $(DASH_SAI_OBJS) g++ -shared -g -o $@ $^ diff --git a/dash-pipeline/SAI/templates/config.cpp.j2 b/dash-pipeline/SAI/src/config.cpp similarity index 100% rename from dash-pipeline/SAI/templates/config.cpp.j2 rename to dash-pipeline/SAI/src/config.cpp diff --git a/dash-pipeline/SAI/templates/config.h.j2 b/dash-pipeline/SAI/src/config.h similarity index 100% rename from dash-pipeline/SAI/templates/config.h.j2 rename to dash-pipeline/SAI/src/config.h diff --git a/dash-pipeline/SAI/templates/dashsai.cpp.j2 b/dash-pipeline/SAI/src/dashsai.cpp similarity index 78% rename from dash-pipeline/SAI/templates/dashsai.cpp.j2 rename to dash-pipeline/SAI/src/dashsai.cpp index e655ad947..69dbb4b81 100644 --- a/dash-pipeline/SAI/templates/dashsai.cpp.j2 +++ b/dash-pipeline/SAI/src/dashsai.cpp @@ -6,9 +6,6 @@ using namespace dash; #define DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES 0 -#define DASH_OBJECT_SHFT 48 -#define DASH_MAKE_OID(objtype, objval) (sai_object_id_t)(((sai_object_id_t)objtype< _lock(m_tableLock); -// TODO replace DASH_MAKE_OID with ObjectIdManager - DashSai::DashSai(): m_apiInitialized(false) { DASH_LOG_ENTER(); - // those oids are constant + // TODO move to switch state - m_switchId = DASH_MAKE_OID(SAI_OBJECT_TYPE_SWITCH, 1); - m_defaultCpuPortId = DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT, 64); - m_defaultVlanId = DASH_MAKE_OID(SAI_OBJECT_TYPE_VLAN, 1); - m_defaultVrfId = DASH_MAKE_OID(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, 1); - m_default1QBridgeId = DASH_MAKE_OID(SAI_OBJECT_TYPE_BRIDGE, 1); - m_defaultTrapGroup = DASH_MAKE_OID(SAI_OBJECT_TYPE_HOSTIF_TRAP_GROUP, 1); + m_switchId = SAI_OBJECT_TYPE_NULL; + m_defaultCpuPortId = SAI_OBJECT_TYPE_NULL; + m_defaultVlanId = SAI_OBJECT_TYPE_NULL; + m_defaultVrfId = SAI_OBJECT_TYPE_NULL; + m_default1QBridgeId = SAI_OBJECT_TYPE_NULL; + m_defaultTrapGroup = SAI_OBJECT_TYPE_NULL; } DashSai::~DashSai() @@ -79,22 +74,6 @@ sai_status_t DashSai::apiInitialize( DASH_LOG_NOTICE("config: %s", m_cfg->getConfigString().c_str()); - m_portList.clear(); - - for (uint32_t i = 1; i <= m_cfg->m_bmv2NumPorts; i++) - { - m_portList.push_back(DASH_MAKE_OID(SAI_OBJECT_TYPE_PORT,i)); - } - - if (m_cfg->m_bmv2NumPorts != (uint32_t)m_portList.size()) - { - DASH_LOG_ERROR("FATAL: number of ports is different: config: %u vs port list: %u", - m_cfg->m_bmv2NumPorts, - (uint32_t)m_portList.size()); - - return SAI_STATUS_FAILURE; - } - const grpc::string grpcTarget = m_cfg->m_grpcTarget; const char* test_json = m_cfg->m_pipelineJson.c_str(); const char* test_proto_json = m_cfg->m_pipelineProto.c_str(); @@ -189,6 +168,8 @@ sai_status_t DashSai::apiInitialize( config->release_p4info(); } + m_objectIdManager = std::make_shared(); + m_apiInitialized = true; return SAI_STATUS_SUCCESS; @@ -201,12 +182,10 @@ sai_status_t DashSai::apiUninitialize(void) m_cfg = nullptr; - m_portList.clear(); + m_portList.clear(); // TODO move to switch state class m_tableEntryMap.clear(); - m_nextId = 0; - m_grpcChannel = nullptr; m_stub = nullptr; @@ -215,6 +194,8 @@ sai_status_t DashSai::apiUninitialize(void) m_serviceMethodTable = nullptr; + m_objectIdManager = nullptr; + return SAI_STATUS_SUCCESS; } @@ -230,7 +211,7 @@ sai_object_type_t DashSai::objectTypeQuery( return SAI_OBJECT_TYPE_NULL; } - return sai_object_type_t(object_id >> (DASH_OBJECT_SHFT)); + return m_objectIdManager->objectTypeQuery(object_id); } sai_object_id_t DashSai::switchIdQuery( @@ -239,12 +220,7 @@ sai_object_id_t DashSai::switchIdQuery( DASH_LOG_ENTER(); DASH_CHECK_API_INITIALIZED(); - if (object_id == SAI_NULL_OBJECT_ID) - { - return SAI_NULL_OBJECT_ID; - } - - return m_switchId; + return m_objectIdManager->switchIdQuery(object_id); } sai_status_t DashSai::createSwitch( @@ -255,9 +231,44 @@ sai_status_t DashSai::createSwitch( DASH_LOG_ENTER(); DASH_CHECK_API_INITIALIZED(); + std::string hardwareInfo; + for (uint32_t i = 0; i < attr_count; i++) { DASH_LOG_WARN("attr id %d is NOT IMPLEMENTED, ignored", attr_list[i].id); + + if (attr_list[i].id == SAI_SWITCH_ATTR_SWITCH_HARDWARE_INFO) + { + DASH_LOG_WARN("attr SAI_SWITCH_ATTR_SWITCH_HARDWARE_INFO specified, but ignored, set to '%s', FIXME", + hardwareInfo.c_str()); + } + } + + // TODO add switch state and init switch method + + m_switchId = m_objectIdManager->allocateNewSwitchObjectId(hardwareInfo); + + if (m_switchId == SAI_NULL_OBJECT_ID) + { + DASH_LOG_ERROR("switch OID allocation failed"); + + return SAI_STATUS_FAILURE; + } + + // TODO move to switch state + + m_defaultCpuPortId = m_objectIdManager->allocateNewObjectId(SAI_OBJECT_TYPE_PORT, m_switchId); + m_defaultVlanId = m_objectIdManager->allocateNewObjectId(SAI_OBJECT_TYPE_VLAN, m_switchId); + m_defaultVrfId = m_objectIdManager->allocateNewObjectId(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, m_switchId); + m_default1QBridgeId = m_objectIdManager->allocateNewObjectId(SAI_OBJECT_TYPE_BRIDGE, m_switchId); + m_defaultTrapGroup = m_objectIdManager->allocateNewObjectId(SAI_OBJECT_TYPE_HOSTIF_TRAP_GROUP, m_switchId); + + m_portList.clear(); + + for (uint32_t i = 1; i <= m_cfg->m_bmv2NumPorts; i++) + { + // TODO in switch state must be internally calling create on this object + m_portList.push_back(m_objectIdManager->allocateNewObjectId(SAI_OBJECT_TYPE_PORT, m_switchId)); } *switch_id = m_switchId; @@ -280,6 +291,8 @@ sai_status_t DashSai::removeSwitch( return SAI_STATUS_INVALID_PARAMETER; } + m_objectIdManager->releaseObjectId(switch_id); + // dummy switch remove DASH_LOG_NOTICE("removing switch: 0x%lx", switch_id); @@ -459,7 +472,15 @@ sai_status_t DashSai::getPortAttribute( attr->value.s32 = SAI_PORT_OPER_STATUS_UP; - DASH_LOG_NOTICE("[%d] setting SAI_PORT_ATTR_OPER_STATUS=SAI_PORT_OPER_STATUS_UP for port %lx", i, port_id); + DASH_LOG_NOTICE("[%d] setting SAI_PORT_ATTR_OPER_STATUS=SAI_PORT_OPER_STATUS_UP for port 0x%lx", i, port_id); + + break; + + case SAI_PORT_ATTR_PORT_VLAN_ID: + + attr->value.u16 = 1; + + DASH_LOG_NOTICE("[%d] setting SAI_PORT_ATTR_PORT_VLAN_ID=1 for port 0x%lx", i, port_id); break; @@ -600,6 +621,7 @@ bool DashSai::insertInTable( return true; } +// TODO needs to be converted to create (with attributes) sai_object_id_t DashSai::getNextObjectId( _In_ sai_object_type_t objectType) { @@ -612,7 +634,14 @@ sai_object_id_t DashSai::getNextObjectId( return SAI_NULL_OBJECT_ID; } - return DASH_MAKE_OID(objectType, ++m_nextId); + if (m_switchId == SAI_NULL_OBJECT_ID) + { + DASH_LOG_ERROR("switch is not created, create switch first"); + + return SAI_NULL_OBJECT_ID; + } + + return m_objectIdManager->allocateNewObjectId(objectType, m_switchId); } bool DashSai::removeFromTable( @@ -655,3 +684,76 @@ bool DashSai::removeFromTable( return retCode == grpc::StatusCode::OK; } + +// QUAD generic api implementation + +sai_status_t DashSai::create( + _In_ sai_object_type_t objectType, + _Out_ sai_object_id_t* objectId, + _In_ sai_object_id_t switchId, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + return createSwitch(objectId, attr_count, attr_list); + + *objectId = m_objectIdManager->allocateNewObjectId(objectType, m_switchId); + + DASH_LOG_WARN("creating dummy object for object type %d: 0x%lx", objectType, *objectId); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::remove( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t objectId) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + return removeSwitch(objectId); + + DASH_LOG_WARN("dummy remove: 0x%lx", objectId); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::set( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t objectId, + _In_ const sai_attribute_t *attr) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + return setSwitchAttribute(objectId, attr); + + DASH_LOG_WARN("dummy set: 0x%lx, attr id: %d", objectId, attr->id); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DashSai::get( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t objectId, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + DASH_CHECK_API_INITIALIZED(); + + if (objectType == SAI_OBJECT_TYPE_PORT) + return getPortAttribute(objectId, attr_count, attr_list); + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + return getSwitchAttribute(objectId, attr_count, attr_list); + + DASH_LOG_ERROR("not implemented for object type %d", objectType); + + return SAI_STATUS_NOT_IMPLEMENTED; +} diff --git a/dash-pipeline/SAI/templates/dashsai.h.j2 b/dash-pipeline/SAI/src/dashsai.h similarity index 74% rename from dash-pipeline/SAI/templates/dashsai.h.j2 rename to dash-pipeline/SAI/src/dashsai.h index 2783461e3..53736eee7 100644 --- a/dash-pipeline/SAI/templates/dashsai.h.j2 +++ b/dash-pipeline/SAI/src/dashsai.h @@ -2,6 +2,7 @@ #include "utils.h" #include "config.h" +#include "objectidmanager.h" namespace dash { @@ -26,7 +27,31 @@ namespace dash sai_object_id_t switchIdQuery( _In_ sai_object_id_t object_id); - public: // QUAD api implementation + public: // QUAD generic api implementation + + sai_status_t create( + _In_ sai_object_type_t objectType, + _Out_ sai_object_id_t* objectId, + _In_ sai_object_id_t switchId, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list); + + sai_status_t remove( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t objectId); + + sai_status_t set( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t objectId, + _In_ const sai_attribute_t *attr); + + sai_status_t get( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t objectId, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list); + + private: // QUAD api implementation // switch @@ -111,5 +136,7 @@ namespace dash std::shared_ptr m_grpcChannel; std::unique_ptr m_stub; + + std::shared_ptr m_objectIdManager; }; } diff --git a/dash-pipeline/SAI/templates/logger.cpp.j2 b/dash-pipeline/SAI/src/logger.cpp similarity index 100% rename from dash-pipeline/SAI/templates/logger.cpp.j2 rename to dash-pipeline/SAI/src/logger.cpp diff --git a/dash-pipeline/SAI/templates/logger.h.j2 b/dash-pipeline/SAI/src/logger.h similarity index 100% rename from dash-pipeline/SAI/templates/logger.h.j2 rename to dash-pipeline/SAI/src/logger.h diff --git a/dash-pipeline/SAI/src/objectidmanager.cpp b/dash-pipeline/SAI/src/objectidmanager.cpp new file mode 100644 index 000000000..d9d2b2b00 --- /dev/null +++ b/dash-pipeline/SAI/src/objectidmanager.cpp @@ -0,0 +1,308 @@ +#include "objectidmanager.h" +#include "logger.h" + +#define SAI_OBJECT_ID_BITS_SIZE (8 * sizeof(sai_object_id_t)) + +static_assert(SAI_OBJECT_ID_BITS_SIZE == 64, "sai_object_id_t must have 64 bits"); +static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size should be uint64_t"); + +#define DASH_OID_RESERVED_BITS_SIZE ( 8 ) + +#define DASH_OBJECT_TYPE_BITS_SIZE ( 8 ) +#define DASH_OBJECT_TYPE_MASK ( (1ULL << DASH_OBJECT_TYPE_BITS_SIZE) - 1 ) +#define DASH_OBJECT_TYPE_MAX (DASH_OBJECT_TYPE_MASK) + +#define DASH_SWITCH_INDEX_BITS_SIZE ( 8 ) +#define DASH_SWITCH_INDEX_MASK ( (1ULL << DASH_SWITCH_INDEX_BITS_SIZE) - 1 ) +#define DASH_SWITCH_INDEX_MAX (DASH_SWITCH_INDEX_MASK) + +#define DASH_OBJECT_INDEX_BITS_SIZE ( 40 ) +#define DASH_OBJECT_INDEX_MASK ( (1ULL << DASH_OBJECT_INDEX_BITS_SIZE) - 1 ) +#define DASH_OBJECT_INDEX_MAX (DASH_OBJECT_INDEX_MASK) + +#define DASH_OBJECT_ID_BITS_SIZE (DASH_OID_RESERVED_BITS_SIZE + DASH_OBJECT_TYPE_BITS_SIZE + DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE) + +static_assert(DASH_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "dash object id size must be equal to SAI object id size"); + +static_assert(DASH_OBJECT_TYPE_MAX == 0xff, "invalid object type max size"); +static_assert(DASH_SWITCH_INDEX_MAX == 0xff, "invalid switch index max size"); +static_assert(DASH_OBJECT_INDEX_MAX == 0xffffffffff, "invalid object index max"); + +/* + * This condition must be met, since we need to be able to encode SAI object + * type in object id on defined number of bits. + */ +static_assert(SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END < DASH_OBJECT_TYPE_MAX, "dash max object type value must be greater than supported SAI max objeect type value"); + +/* + * Current OBJECT ID format: + * + * bits 63..56 - reserved (must be zero) + * bits 55..48 - SAI object type + * bits 47..40 - switch index + * bits 39..0 - object index + * + * So large number of bits is required, otherwise we would need to have map of + * OID to some struct that will have all those values. But having all this + * information in OID itself is more convenient. + */ + +#define DASH_GET_OBJECT_INDEX(oid) \ + ( ((uint64_t)oid) & ( DASH_OBJECT_INDEX_MASK ) ) + +#define DASH_GET_SWITCH_INDEX(oid) \ + ( (((uint64_t)oid) >> ( DASH_OBJECT_INDEX_BITS_SIZE) ) & ( DASH_SWITCH_INDEX_MASK ) ) + +#define DASH_GET_OBJECT_TYPE(oid) \ + ( (((uint64_t)oid) >> ( DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE ) ) & ( DASH_OBJECT_TYPE_MASK ) ) + +#define DASH_TEST_OID (0x0123456789abcdef) + +static_assert(DASH_GET_OBJECT_TYPE(DASH_TEST_OID) == 0x23, "test object type"); +static_assert(DASH_GET_SWITCH_INDEX(DASH_TEST_OID) == 0x45, "test switch index"); +static_assert(DASH_GET_OBJECT_INDEX(DASH_TEST_OID) == 0x6789abcdef, "test object index"); + +using namespace dash; + +sai_object_id_t ObjectIdManager::saiSwitchIdQuery( + _In_ sai_object_id_t objectId) const +{ + DASH_LOG_ENTER(); + + if (objectId == SAI_NULL_OBJECT_ID) + { + return SAI_NULL_OBJECT_ID; + } + + sai_object_type_t objectType = saiObjectTypeQuery(objectId); + + if (objectType == SAI_OBJECT_TYPE_NULL) + { + DASH_LOG_ERROR("invalid object type of oid 0x%lx", objectId); + + return SAI_NULL_OBJECT_ID; + } + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + { + return objectId; + } + + uint32_t switchIndex = (uint32_t)DASH_GET_SWITCH_INDEX(objectId); + + return constructObjectId(SAI_OBJECT_TYPE_SWITCH, switchIndex, switchIndex); +} + +sai_object_type_t ObjectIdManager::saiObjectTypeQuery( + _In_ sai_object_id_t objectId) const +{ + DASH_LOG_ENTER(); + + if (objectId == SAI_NULL_OBJECT_ID) + { + return SAI_OBJECT_TYPE_NULL; + } + + sai_object_type_t objectType = (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId)); + + if (objectType == SAI_OBJECT_TYPE_NULL || objectType >= (sai_object_type_t)SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END) + { + DASH_LOG_ERROR("invalid object id 0x%lx", objectId); + + return SAI_OBJECT_TYPE_NULL; + } + + return objectType; +} + +void ObjectIdManager::clear() +{ + DASH_LOG_ENTER(); + + DASH_LOG_NOTICE("clearing switch index set"); + + m_switchIndexes.clear(); + m_indexer.clear(); +} + +void ObjectIdManager::releaseSwitchIndex( + _In_ uint32_t index) +{ + DASH_LOG_ENTER(); + + auto it = m_switchIndexes.find(index); + + if (it == m_switchIndexes.end()) + { + DASH_LOG_ERROR("switch index 0x%x is invalid! programming error", index); + return; + } + + m_switchIndexes.erase(it); + + DASH_LOG_NOTICE("released switch index 0x%x", index); +} + +sai_object_id_t ObjectIdManager::allocateNewObjectId( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t switchId) +{ + DASH_LOG_ENTER(); + + if ((objectType <= SAI_OBJECT_TYPE_NULL) || (objectType >= (sai_object_type_t)SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END)) + { + DASH_LOG_ERROR("invalid objct type: %d", objectType); + + return SAI_NULL_OBJECT_ID; + } + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + { + DASH_LOG_ERROR("this function can't be used to allocate switch id"); + + return SAI_NULL_OBJECT_ID; + } + + sai_object_type_t switchObjectType = saiObjectTypeQuery(switchId); + + if (switchObjectType != SAI_OBJECT_TYPE_SWITCH) + { + DASH_LOG_ERROR("object type of switch 0x%lx is %d, should be SWITCH", switchId, switchObjectType); + + return SAI_NULL_OBJECT_ID; + } + + uint32_t switchIndex = (uint32_t)DASH_GET_SWITCH_INDEX(switchId); + + // count from zero + uint64_t objectIndex = m_indexer[objectType]++; // allocation ! + + if (objectIndex > DASH_OBJECT_INDEX_MAX) + { + DASH_LOG_ERROR("no more object indexes available, given: 0x%lx but limit is 0x%llx", + objectIndex, + DASH_OBJECT_INDEX_MAX); + + return SAI_NULL_OBJECT_ID; + } + + sai_object_id_t objectId = constructObjectId(objectType, switchIndex, objectIndex); + + DASH_LOG_INFO("allocated new object id 0x%lx", objectId); + + return objectId; +} + +sai_object_id_t ObjectIdManager::allocateNewSwitchObjectId( + _In_ const std::string& hardwareInfo) +{ + DASH_LOG_ENTER(); + + // TODO currently we support only empty hardware info and 1 switch + + if (hardwareInfo.size()) + { + DASH_LOG_ERROR("hardware info is '%s', not supported yet, switch OID allocation failed, FIXME", hardwareInfo.c_str()); + + return SAI_NULL_OBJECT_ID; + } + + uint32_t switchIndex = 0; // for empty hardware info + + if (switchIndex > DASH_SWITCH_INDEX_MAX) + { + DASH_LOG_ERROR("switch index %u > %llu (max)", switchIndex, DASH_SWITCH_INDEX_MAX); + + return SAI_NULL_OBJECT_ID; + } + + if (m_switchIndexes.find(switchIndex) != m_switchIndexes.end()) + { + DASH_LOG_ERROR("switch with index %d is alrady allocated, programming error!", switchIndex); + + return SAI_NULL_OBJECT_ID; + } + + m_switchIndexes.insert(switchIndex); + + sai_object_id_t objectId = constructObjectId(SAI_OBJECT_TYPE_SWITCH, switchIndex, switchIndex); + + DASH_LOG_NOTICE("allocated switch OID 0x%lx for hwinfo: '%s'", objectId, hardwareInfo.c_str()); + + return objectId; +} + +void ObjectIdManager::releaseObjectId( + _In_ sai_object_id_t objectId) +{ + DASH_LOG_ENTER(); + + if (saiObjectTypeQuery(objectId) == SAI_OBJECT_TYPE_SWITCH) + { + releaseSwitchIndex((uint32_t)DASH_GET_SWITCH_INDEX(objectId)); + } +} + +sai_object_id_t ObjectIdManager::constructObjectId( + _In_ sai_object_type_t objectType, + _In_ uint32_t switchIndex, + _In_ uint64_t objectIndex) +{ + DASH_LOG_ENTER(); + + return (sai_object_id_t)( + (((uint64_t)objectType & DASH_OBJECT_TYPE_MASK)<< ( DASH_SWITCH_INDEX_BITS_SIZE + DASH_OBJECT_INDEX_BITS_SIZE))| + (((uint64_t)switchIndex & DASH_SWITCH_INDEX_MASK)<< ( DASH_OBJECT_INDEX_BITS_SIZE )) | + (objectIndex & DASH_OBJECT_INDEX_MASK)); +} + +sai_object_id_t ObjectIdManager::switchIdQuery( + _In_ sai_object_id_t objectId) +{ + DASH_LOG_ENTER(); + + if (objectId == SAI_NULL_OBJECT_ID) + { + return SAI_NULL_OBJECT_ID; + } + + sai_object_type_t objectType = objectTypeQuery(objectId); + + if (objectType == SAI_OBJECT_TYPE_NULL) + { + DASH_LOG_ERROR("invalid object type of oid 0x%lx", objectId); + + return SAI_NULL_OBJECT_ID; + } + + if (objectType == SAI_OBJECT_TYPE_SWITCH) + { + return objectId; + } + + uint32_t switchIndex = (uint32_t)DASH_GET_SWITCH_INDEX(objectId); + + return constructObjectId(SAI_OBJECT_TYPE_SWITCH, switchIndex, switchIndex); +} + +sai_object_type_t ObjectIdManager::objectTypeQuery( + _In_ sai_object_id_t objectId) +{ + DASH_LOG_ENTER(); + + if (objectId == SAI_NULL_OBJECT_ID) + { + return SAI_OBJECT_TYPE_NULL; + } + + sai_object_type_t objectType = (sai_object_type_t)(DASH_GET_OBJECT_TYPE(objectId)); + + if (objectType == SAI_OBJECT_TYPE_NULL || objectType >= (sai_object_type_t)SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END) + { + DASH_LOG_ERROR("invalid object id 0x%lx", objectId); + + return SAI_OBJECT_TYPE_NULL; + } + + return objectType; +} diff --git a/dash-pipeline/SAI/src/objectidmanager.h b/dash-pipeline/SAI/src/objectidmanager.h new file mode 100644 index 000000000..d824f6832 --- /dev/null +++ b/dash-pipeline/SAI/src/objectidmanager.h @@ -0,0 +1,134 @@ +#pragma once + +extern "C" { +#include +#include +} + +#include +#include + +namespace dash +{ + class ObjectIdManager + { + public: + + ObjectIdManager() = default; + ~ObjectIdManager() = default; + + public: + + /** + * @brief Switch id query. + * + * Return switch object id for given object if. If object type is + * switch, it will return input value. + * + * Returns SAI_NULL_OBJECT_ID if input value is invalid. + * + * For SAI_NULL_OBJECT_ID input will return SAI_NULL_OBJECT_ID. + */ + sai_object_id_t saiSwitchIdQuery( + _In_ sai_object_id_t objectId) const; + + /** + * @brief Object type query. + * + * Returns object type for input object id. If object id is invalid + * then returns SAI_OBJECT_TYPE_NULL. + */ + sai_object_type_t saiObjectTypeQuery( + _In_ sai_object_id_t objectId) const; + + /** + * @brief Clear switch index set. + * + * New switch index allocation will start from the beginning. + */ + void clear(); + + /** + * @brief Allocate new object id on a given switch. + * + * Method can't be used to allocate switch object id. + * + * Returns SAI_NULL_OBJECT_ID if there are no more available + * switch indexes. + */ + sai_object_id_t allocateNewObjectId( + _In_ sai_object_type_t objectType, + _In_ sai_object_id_t switchId); + + /** + * @brief Allocate new switch object id. + * + * Return SAI_NULL_OBJECT_ID if allocation failed. + */ + sai_object_id_t allocateNewSwitchObjectId( + _In_ const std::string& hardwareInfo); + + /** + * @brief Release allocated object id. + * + * If object type is switch, then switch index will be released. + */ + void releaseObjectId( + _In_ sai_object_id_t objectId); + + public: + + /** + * @brief Switch id query. + * + * Return switch object id for given object if. If object type is + * switch, it will return input value. + * + * Return SAI_NULL_OBJECT_ID if given object id has invalid object type. + */ + static sai_object_id_t switchIdQuery( + _In_ sai_object_id_t objectId); + + /** + * @brief Object type query. + * + * Returns object type for input object id. If object id is invalid + * then returns SAI_OBJECT_TYPE_NULL. + */ + static sai_object_type_t objectTypeQuery( + _In_ sai_object_id_t objectId); + + private: + + /** + * @brief Release given switch index. + */ + void releaseSwitchIndex( + _In_ uint32_t index); + + /** + * @brief Construct object id. + * + * Using all input parameters to construct object id. + */ + static sai_object_id_t constructObjectId( + _In_ sai_object_type_t objectType, + _In_ uint32_t switchIndex, + _In_ uint64_t objectIndex); + + private: + + /** + * @brief Set of allocated switch indexes. + */ + std::set m_switchIndexes; + + /** + * @brief Object index indexer map. + * + * Each object type have its own starting index from zero for easy + * count how many objects of each type there are allocated. + */ + std::map m_indexer; + }; +} diff --git a/dash-pipeline/SAI/src/sai_dash_hostif.cpp b/dash-pipeline/SAI/src/sai_dash_hostif.cpp new file mode 100644 index 000000000..fc5b2da52 --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_hostif.cpp @@ -0,0 +1,21 @@ +#include "saiimpl.h" + +DASH_GENERIC_QUAD(HOSTIF,hostif); +DASH_GENERIC_QUAD(HOSTIF_TABLE_ENTRY,hostif_table_entry); +DASH_GENERIC_QUAD(HOSTIF_TRAP_GROUP,hostif_trap_group); +DASH_GENERIC_QUAD(HOSTIF_TRAP,hostif_trap); +DASH_GENERIC_QUAD(HOSTIF_USER_DEFINED_TRAP,hostif_user_defined_trap); + +sai_hostif_api_t dash_sai_hostif_api_impl = { + + DASH_GENERIC_QUAD_API(hostif) + DASH_GENERIC_QUAD_API(hostif_table_entry) + DASH_GENERIC_QUAD_API(hostif_trap_group) + DASH_GENERIC_QUAD_API(hostif_trap) + DASH_GENERIC_QUAD_API(hostif_user_defined_trap) + + .recv_hostif_packet = 0, + .send_hostif_packet = 0, + .allocate_hostif_packet = 0, + .free_hostif_packet = 0, +}; diff --git a/dash-pipeline/SAI/src/sai_dash_neighbor.cpp b/dash-pipeline/SAI/src/sai_dash_neighbor.cpp new file mode 100644 index 000000000..b52ddff33 --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_neighbor.cpp @@ -0,0 +1,58 @@ +#include "saiimpl.h" + +static sai_status_t dash_create_neighbor_entry( + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + + DASH_LOG_WARN("dummy create"); + + return SAI_STATUS_SUCCESS; +} + +static sai_status_t dash_remove_neighbor_entry( + _In_ const sai_neighbor_entry_t *neighbor_entry) +{ + DASH_LOG_ENTER(); + + DASH_LOG_WARN("dummy remove"); + + return SAI_STATUS_SUCCESS; +} + +static sai_status_t dash_set_neighbor_entry_attribute( + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const sai_attribute_t *attr) +{ + DASH_LOG_ENTER(); + + DASH_LOG_WARN("dummy set"); + + return SAI_STATUS_SUCCESS; +} + +static sai_status_t dash_get_neighbor_entry_attribute( + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + + DASH_LOG_ERROR("not implemented"); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_neighbor_api_t dash_sai_neighbor_api_impl = { + + DASH_GENERIC_QUAD_API(neighbor_entry) + + .remove_all_neighbor_entries = 0, + + .create_neighbor_entries = 0, + .remove_neighbor_entries = 0, + .set_neighbor_entries_attribute = 0, + .get_neighbor_entries_attribute = 0, +}; diff --git a/dash-pipeline/SAI/src/sai_dash_next_hop.cpp b/dash-pipeline/SAI/src/sai_dash_next_hop.cpp new file mode 100644 index 000000000..f12d6e6a1 --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_next_hop.cpp @@ -0,0 +1,13 @@ +#include "saiimpl.h" + +DASH_GENERIC_QUAD(NEXT_HOP,next_hop); + +sai_next_hop_api_t dash_sai_next_hop_api_impl = { + + DASH_GENERIC_QUAD_API(next_hop) + + .create_next_hops = 0, + .remove_next_hops = 0, + .set_next_hops_attribute = 0, + .get_next_hops_attribute = 0, +}; diff --git a/dash-pipeline/SAI/src/sai_dash_policer.cpp b/dash-pipeline/SAI/src/sai_dash_policer.cpp new file mode 100644 index 000000000..409369c06 --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_policer.cpp @@ -0,0 +1,9 @@ +#include "saiimpl.h" + +DASH_GENERIC_QUAD(POLICER,policer); + +sai_policer_api_t dash_sai_policer_api_impl = { + + DASH_GENERIC_QUAD_API(policer) + DASH_GENERIC_STATS_API(policer) +}; diff --git a/dash-pipeline/SAI/src/sai_dash_port.cpp b/dash-pipeline/SAI/src/sai_dash_port.cpp new file mode 100644 index 000000000..c863fc5c7 --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_port.cpp @@ -0,0 +1,36 @@ +#include "saiimpl.h" + +DASH_GENERIC_QUAD(PORT,port); + +sai_port_api_t dash_sai_port_api_impl = { + + DASH_GENERIC_QUAD_API(port) + + .get_port_stats = 0, + .get_port_stats_ext = 0, + .clear_port_stats = 0, + .clear_port_all_stats = 0, + .create_port_pool = 0, + .remove_port_pool = 0, + .set_port_pool_attribute = 0, + .get_port_pool_attribute = 0, + .get_port_pool_stats = 0, + .get_port_pool_stats_ext = 0, + .clear_port_pool_stats = 0, + .create_port_connector = 0, + .remove_port_connector = 0, + .set_port_connector_attribute = 0, + .get_port_connector_attribute = 0, + .create_port_serdes = 0, + .remove_port_serdes = 0, + .set_port_serdes_attribute = 0, + .get_port_serdes_attribute = 0, + .create_ports = 0, + .remove_ports = 0, + .set_ports_attribute = 0, + .get_ports_attribute = 0, + .create_port_serdess = 0, + .remove_port_serdess = 0, + .set_port_serdess_attribute = 0, + .get_port_serdess_attribute = 0, +}; diff --git a/dash-pipeline/SAI/src/sai_dash_router_interface.cpp b/dash-pipeline/SAI/src/sai_dash_router_interface.cpp new file mode 100644 index 000000000..5f8a45c51 --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_router_interface.cpp @@ -0,0 +1,9 @@ +#include "saiimpl.h" + +DASH_GENERIC_QUAD(ROUTER_INTERFACE,router_interface); + +sai_router_interface_api_t dash_sai_router_interface_api_impl = { + + DASH_GENERIC_QUAD_API(router_interface) + DASH_GENERIC_STATS_API(router_interface) +}; diff --git a/dash-pipeline/SAI/src/sai_dash_switch.cpp b/dash-pipeline/SAI/src/sai_dash_switch.cpp new file mode 100644 index 000000000..5c200e79e --- /dev/null +++ b/dash-pipeline/SAI/src/sai_dash_switch.cpp @@ -0,0 +1,35 @@ +#include "saiimpl.h" + +DASH_GENERIC_QUAD(SWITCH,switch); + +static sai_status_t dash_create_switch_uniq( + _Out_ sai_object_id_t *switch_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + DASH_LOG_ENTER(); + + return dash_create_switch( + switch_id, + SAI_NULL_OBJECT_ID, // no switch id since we create switch + attr_count, + attr_list); +} + +sai_switch_api_t dash_sai_switch_api_impl = { + .create_switch = dash_create_switch_uniq, + .remove_switch = dash_remove_switch, + .set_switch_attribute = dash_set_switch_attribute, + .get_switch_attribute = dash_get_switch_attribute, + .get_switch_stats = 0, + .get_switch_stats_ext = 0, + .clear_switch_stats = 0, + .switch_mdio_read = 0, + .switch_mdio_write = 0, + .create_switch_tunnel = 0, + .remove_switch_tunnel = 0, + .set_switch_tunnel_attribute = 0, + .get_switch_tunnel_attribute = 0, + .switch_mdio_cl22_read = 0, + .switch_mdio_cl22_write = 0, +}; diff --git a/dash-pipeline/SAI/templates/saidash.h.j2 b/dash-pipeline/SAI/src/saidash.h similarity index 100% rename from dash-pipeline/SAI/templates/saidash.h.j2 rename to dash-pipeline/SAI/src/saidash.h diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/src/utils.cpp similarity index 100% rename from dash-pipeline/SAI/templates/utils.cpp.j2 rename to dash-pipeline/SAI/src/utils.cpp diff --git a/dash-pipeline/SAI/templates/utils.h.j2 b/dash-pipeline/SAI/src/utils.h similarity index 100% rename from dash-pipeline/SAI/templates/utils.h.j2 rename to dash-pipeline/SAI/src/utils.h diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 7db54710d..a9289436b 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -42,6 +42,13 @@ static sai_status_t dash_sai_create_{{ table.name }}( //matchedParams = 0; objId = dashSai->getNextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}); + if (objId == SAI_NULL_OBJECT_ID) + { + DASH_LOG_ERROR("getNextObjectId failed for SAI_OBJECT_TYPE_{{ table.name | upper }}"); + // TODO clean resources + return SAI_STATUS_FAILURE; + } + matchActionEntry->set_table_id(tableId); {% if table['keys'] | length== 1 %} @@ -54,10 +61,13 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% else %} // SAI object table with multiple P4 table keys // Copy P4 table keys from appropriate SAI attributes - for (uint32_t i = 0; i < attr_count; i++) { - switch(attr_list[i].id) { + for (uint32_t i = 0; i < attr_count; i++) + { + switch(attr_list[i].id) + { {% for key in table['keys'] %} - case SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}: { + case SAI_{{ table.name | upper }}_ATTR_{{ key.sai_key_name | upper }}: + { auto mf = matchActionEntry->add_match(); mf->set_field_id({{key.id}}); {% if key.match_type == 'exact' %} @@ -102,17 +112,20 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% if table['keys'] | selectattr('match_type', 'ne', 'exact') | list | length > 0 %} {% if table['keys'] | selectattr('match_type', 'eq', 'lpm') | list | length == 0 %} // Table has non lpm ternary keys - add priority field - case SAI_{{ table.name | upper }}_ATTR_PRIORITY: { + case SAI_{{ table.name | upper }}_ATTR_PRIORITY: + { matchActionEntry->set_priority(attr_list[i].value.u32); break; } {% endif %} {% endif %} + default: + DASH_LOG_ERROR("attribute [%d] %d not supported yet", i, attr_list[i].id); + break; } } {% endif %} - // If there is only one action, simply set it. // Else, search in the attrs. {% if table.actions|length == 1 %} @@ -122,31 +135,41 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% endfor %} {% else %} // Search the action - for (uint32_t i = 0; i < attr_count; i++) { + for (uint32_t i = 0; i < attr_count; i++) + { if (SAI_{{ table.name | upper }}_ATTR_ACTION == attr_list[i].id) { - switch(attr_list[i].value.s32) { + switch(attr_list[i].value.s32) + { {% for action in table.actions %} - case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { + case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: + { actionId = {{action.id}}; //expectedParams = {{ action.params|length }}; break; } {% endfor %} + default: + DASH_LOG_ERROR("attribute value [%d] %d not supported yet", i, attr_list[i].value.s32); + break; } // only one action break; } } {% endif %} + action->set_action_id(actionId); - for (uint32_t i = 0; i < attr_count; i++) { - switch(attr_list[i].id) { + for (uint32_t i = 0; i < attr_count; i++) + { + switch(attr_list[i].id) + { {% for param in table.actionParams %} {% if param.skipattr == 'true' %} {% else %} - case SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}: { + case SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}: + { auto param = action->add_params(); param->set_param_id({{param.id}}); {{param.field}}SetVal(attr_list[i].value, param, {{param.bitwidth}}); @@ -164,6 +187,9 @@ static sai_status_t dash_sai_create_{{ table.name }}( } {% endif %} {% endfor %} + default: + DASH_LOG_ERROR("attribute [%d] %d not supported yet", i, attr_list[i].id); + break; } } @@ -198,14 +224,17 @@ static sai_status_t dash_sai_create_{{ table.name }}s( sai_status_t agg_status = SAI_STATUS_SUCCESS; - for (uint32_t i = 0; i < object_count; i++) { + for (uint32_t i = 0; i < object_count; i++) + { object_statuses[i] = dash_sai_create_{{ table.name }}(&object_id[i], switch_id, attr_count[i], attr_list[i]); - if (object_statuses[i] != SAI_STATUS_SUCCESS) { + if (object_statuses[i] != SAI_STATUS_SUCCESS) + { agg_status = SAI_STATUS_FAILURE; } - if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) + { return agg_status; } } @@ -213,7 +242,8 @@ static sai_status_t dash_sai_create_{{ table.name }}s( return agg_status; } -static sai_status_t dash_sai_remove_{{ table.name }}(_In_ sai_object_id_t {{ table.name }}_id) +static sai_status_t dash_sai_remove_{{ table.name }}( + _In_ sai_object_id_t {{ table.name }}_id) { DASH_LOG_ENTER(); @@ -235,14 +265,17 @@ static sai_status_t dash_sai_remove_{{ table.name }}s( sai_status_t agg_status = SAI_STATUS_SUCCESS; - for (uint32_t i = 0; i < object_count; i++) { + for (uint32_t i = 0; i < object_count; i++) + { object_statuses[i] = dash_sai_remove_{{ table.name }}(object_id[i]); - if (object_statuses[i] != SAI_STATUS_SUCCESS) { + if (object_statuses[i] != SAI_STATUS_SUCCESS) + { agg_status = SAI_STATUS_FAILURE; } - if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) + { return agg_status; } } @@ -330,15 +363,21 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% endfor %} {% else %} // Search the action - for (uint32_t i = 0; i < attr_count; i++) { - switch(attr_list[i].value.s32) { + for (uint32_t i = 0; i < attr_count; i++) + { + switch(attr_list[i].value.s32) + { {% for action in table.actions %} - case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { + case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: + { actionId = {{action.id}}; //expectedParams = {{ action.params|length }}; break; } {% endfor %} + default: + DASH_LOG_ERROR("attribute value [%d] %d not supported yet", i, attr_list[i].value.s32); + break; } // only one action break; @@ -346,12 +385,15 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% endif %} action->set_action_id(actionId); - for (uint32_t i = 0; i < attr_count; i++) { - switch(attr_list[i].id) { + for (uint32_t i = 0; i < attr_count; i++) + { + switch(attr_list[i].id) + { {% for param in table.actionParams %} {% if param.skipattr == 'true' %} {% else %} - case SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}: { + case SAI_{{ table.name | upper }}_ATTR_{{ param.name | upper }}: + { auto param = action->add_params(); param->set_param_id({{param.id}}); {{param.field}}SetVal(attr_list[i].value, param, {{param.bitwidth}}); @@ -369,6 +411,9 @@ static sai_status_t dash_sai_create_{{ table.name }}( } {% endif %} {% endfor %} + default: + DASH_LOG_ERROR("attribute [%d] %d not supported yet", i, attr_list[i].id); + break; } } @@ -379,7 +424,9 @@ static sai_status_t dash_sai_create_{{ table.name }}( //} // TODO: ternaly needs to set priority retCode = dashSai->mutateTableEntry(matchActionEntry, p4::v1::Update_Type_INSERT); - if (grpc::StatusCode::OK == retCode) { + + if (grpc::StatusCode::OK == retCode) + { return SAI_STATUS_SUCCESS; } ErrRet: @@ -398,20 +445,22 @@ static sai_status_t dash_sai_create_{{ table.name | replace("entry", "entries") sai_status_t agg_status = SAI_STATUS_SUCCESS; - for (uint32_t i = 0; i < object_count; i++) { + for (uint32_t i = 0; i < object_count; i++) + { object_statuses[i] = dash_sai_create_{{ table.name }}(&{{ table.name }}[i], attr_count[i], attr_list[i]); - if (object_statuses[i] != SAI_STATUS_SUCCESS) { + if (object_statuses[i] != SAI_STATUS_SUCCESS) + { agg_status = SAI_STATUS_FAILURE; } - if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) + { return agg_status; } } return agg_status; - } static sai_status_t dash_sai_remove_{{ table.name }}( @@ -422,7 +471,7 @@ static sai_status_t dash_sai_remove_{{ table.name }}( std::shared_ptr matchActionEntry = std::make_shared(); pi_p4_id_t tableId = {{table.id}}; matchActionEntry->set_table_id(tableId); - auto tableEntry = {{ table.name }}; + auto tableEntry = {{ table.name }}; grpc::StatusCode retCode; {% for key in table['keys'] %} @@ -480,14 +529,17 @@ static sai_status_t dash_sai_remove_{{ table.name | replace("entry", "entries") sai_status_t agg_status = SAI_STATUS_SUCCESS; - for (uint32_t i = 0; i < object_count; i++) { + for (uint32_t i = 0; i < object_count; i++) + { object_statuses[i] = dash_sai_remove_{{ table.name }}(&{{ table.name }}[i]); - if (object_statuses[i] != SAI_STATUS_SUCCESS) { + if (object_statuses[i] != SAI_STATUS_SUCCESS) + { agg_status = SAI_STATUS_FAILURE; } - if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) { + if (agg_status == SAI_STATUS_FAILURE && mode == SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR) + { return agg_status; } } @@ -551,7 +603,7 @@ sai_{{ app_name }}_api_t dash_sai_{{ app_name }}_api_impl = { {% for table in tables %} {% if table.name in registered_group %}{% continue %}{% endif %} {% do registered_group.append( table.name ) %} - .create_{{ table.name }} = dash_sai_create_{{ table.name }}, + .create_{{ table.name }} = dash_sai_create_{{ table.name }}, .remove_{{ table.name }} = dash_sai_remove_{{ table.name }}, .set_{{ table.name }}_attribute = dash_sai_set_{{ table.name }}_attribute, .get_{{ table.name }}_attribute = dash_sai_get_{{ table.name }}_attribute, diff --git a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 index fbe659edc..8ae3750c3 100644 --- a/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 +++ b/dash-pipeline/SAI/templates/saifixedapis.cpp.j2 @@ -10,104 +10,7 @@ std::shared_ptr dashSai = std::make_shared(); -static sai_status_t dash_sai_create_switch( - _Out_ sai_object_id_t *switch_id, - _In_ uint32_t attr_count, - _In_ const sai_attribute_t *attr_list) -{ - DASH_LOG_ENTER(); - - return dashSai->createSwitch(switch_id, attr_count, attr_list); -} - -static sai_status_t dash_sai_get_switch_attribute( - _In_ sai_object_id_t switch_id, - _In_ uint32_t attr_count, - _Inout_ sai_attribute_t *attr_list) -{ - DASH_LOG_ENTER(); - - return dashSai->getSwitchAttribute(switch_id, attr_count, attr_list); -} - -static sai_status_t dash_sai_remove_switch( - _In_ sai_object_id_t switch_id) -{ - DASH_LOG_ENTER(); - - return dashSai->removeSwitch(switch_id); -} - -static sai_status_t dash_sai_set_switch_attribute( - _In_ sai_object_id_t switch_id, - _In_ const sai_attribute_t *attr) -{ - DASH_LOG_ENTER(); - - return dashSai->setSwitchAttribute(switch_id, attr); -} - -sai_switch_api_t dash_sai_switch_api_impl = { - .create_switch = dash_sai_create_switch, - .remove_switch = dash_sai_remove_switch, - .set_switch_attribute = dash_sai_set_switch_attribute, - .get_switch_attribute = dash_sai_get_switch_attribute, - .get_switch_stats = 0, - .get_switch_stats_ext = 0, - .clear_switch_stats = 0, - .switch_mdio_read = 0, - .switch_mdio_write = 0, - .create_switch_tunnel = 0, - .remove_switch_tunnel = 0, - .set_switch_tunnel_attribute = 0, - .get_switch_tunnel_attribute = 0, - .switch_mdio_cl22_read = 0, - .switch_mdio_cl22_write = 0, -}; - -static sai_status_t dash_sai_get_port_attribute( - _In_ sai_object_id_t port_id, - _In_ uint32_t attr_count, - _Inout_ sai_attribute_t *attr_list) -{ - DASH_LOG_ENTER(); - - return dashSai->getPortAttribute(port_id, attr_count, attr_list); -} - -sai_port_api_t dash_sai_port_api_impl = { - .create_port = 0, - .remove_port = 0, - .set_port_attribute = 0, - .get_port_attribute = dash_sai_get_port_attribute, - .get_port_stats = 0, - .get_port_stats_ext = 0, - .clear_port_stats = 0, - .clear_port_all_stats = 0, - .create_port_pool = 0, - .remove_port_pool = 0, - .set_port_pool_attribute = 0, - .get_port_pool_attribute = 0, - .get_port_pool_stats = 0, - .get_port_pool_stats_ext = 0, - .clear_port_pool_stats = 0, - .create_port_connector = 0, - .remove_port_connector = 0, - .set_port_connector_attribute = 0, - .get_port_connector_attribute = 0, - .create_port_serdes = 0, - .remove_port_serdes = 0, - .set_port_serdes_attribute = 0, - .get_port_serdes_attribute = 0, - .create_ports = 0, - .remove_ports = 0, - .set_ports_attribute = 0, - .get_ports_attribute = 0, - .create_port_serdess = 0, - .remove_port_serdess = 0, - .set_port_serdess_attribute = 0, - .get_port_serdess_attribute = 0, -}; +#define API(A,api) case SAI_API_ ## A: *api_method_table = (void*)&dash_sai_ ## api ## _api_impl; break; sai_status_t sai_api_query( _In_ sai_api_t api, @@ -115,14 +18,15 @@ sai_status_t sai_api_query( { DASH_LOG_ENTER(); - switch((int)api) { - case SAI_API_SWITCH: - *api_method_table = (void *)&dash_sai_switch_api_impl; - break; - - case SAI_API_PORT: - *api_method_table = (void *)&dash_sai_port_api_impl; - break; + switch((int)api) + { + API(HOSTIF,hostif); + API(NEIGHBOR,neighbor); + API(NEXT_HOP,next_hop); + API(POLICER,policer); + API(PORT,port); + API(ROUTER_INTERFACE,router_interface); + API(SWITCH,switch); {% for api in api_names %} case SAI_API_{{ api | upper }}: diff --git a/dash-pipeline/SAI/templates/saiimpl.h.j2 b/dash-pipeline/SAI/templates/saiimpl.h.j2 index a0dad0c4e..052a0a3ac 100644 --- a/dash-pipeline/SAI/templates/saiimpl.h.j2 +++ b/dash-pipeline/SAI/templates/saiimpl.h.j2 @@ -4,11 +4,92 @@ #define DASH_PRIVATE __attribute__((visibility("hidden"))) -DASH_PRIVATE extern sai_switch_api_t dash_sai_switch_api_impl; -DASH_PRIVATE extern sai_port_api_t dash_sai_port_api_impl; +DASH_PRIVATE extern sai_hostif_api_t dash_sai_hostif_api_impl; +DASH_PRIVATE extern sai_neighbor_api_t dash_sai_neighbor_api_impl; +DASH_PRIVATE extern sai_next_hop_api_t dash_sai_next_hop_api_impl; +DASH_PRIVATE extern sai_policer_api_t dash_sai_policer_api_impl; +DASH_PRIVATE extern sai_port_api_t dash_sai_port_api_impl; +DASH_PRIVATE extern sai_router_interface_api_t dash_sai_router_interface_api_impl; +DASH_PRIVATE extern sai_switch_api_t dash_sai_switch_api_impl; {% for api in api_names %} DASH_PRIVATE extern sai_{{ api }}_api_t dash_sai_{{ api }}_api_impl; {% endfor %} DASH_PRIVATE extern std::shared_ptr dashSai; + +// QUAD OID + +#define DASH_CREATE(OT,ot) \ + static sai_status_t dash_create_ ## ot( \ + _Out_ sai_object_id_t *object_id, \ + _In_ sai_object_id_t switch_id, \ + _In_ uint32_t attr_count, \ + _In_ const sai_attribute_t *attr_list) \ +{ \ + DASH_LOG_ENTER(); \ + return dashSai->create( \ + (sai_object_type_t)SAI_OBJECT_TYPE_ ## OT, \ + object_id, \ + switch_id, \ + attr_count, \ + attr_list); \ +} + +#define DASH_REMOVE(OT,ot) \ + static sai_status_t dash_remove_ ## ot( \ + _In_ sai_object_id_t object_id) \ +{ \ + DASH_LOG_ENTER(); \ + return dashSai->remove( \ + (sai_object_type_t)SAI_OBJECT_TYPE_ ## OT, \ + object_id); \ +} + +#define DASH_SET(OT,ot) \ + static sai_status_t dash_set_ ## ot ## _attribute( \ + _In_ sai_object_id_t object_id, \ + _In_ const sai_attribute_t *attr) \ +{ \ + DASH_LOG_ENTER(); \ + return dashSai->set( \ + (sai_object_type_t)SAI_OBJECT_TYPE_ ## OT, \ + object_id, \ + attr); \ +} + +#define DASH_GET(OT,ot) \ + static sai_status_t dash_get_ ## ot ## _attribute( \ + _In_ sai_object_id_t object_id, \ + _In_ uint32_t attr_count, \ + _Inout_ sai_attribute_t *attr_list) \ +{ \ + DASH_LOG_ENTER(); \ + return dashSai->get( \ + (sai_object_type_t)SAI_OBJECT_TYPE_ ## OT, \ + object_id, \ + attr_count, \ + attr_list); \ +} + +// QUAD DECLARE + +#define DASH_GENERIC_QUAD(OT,ot) \ + DASH_CREATE(OT,ot); \ + DASH_REMOVE(OT,ot); \ + DASH_SET(OT,ot); \ + DASH_GET(OT,ot); + +// QUAD API + +#define DASH_GENERIC_QUAD_API(ot) \ + dash_create_ ## ot, \ + dash_remove_ ## ot, \ + dash_set_ ## ot ##_attribute, \ + dash_get_ ## ot ##_attribute, + +#define DASH_GENERIC_STATS_API(ot) \ + .get_ ## ot ## _stats = 0, \ + .get_ ## ot ## _stats_ext = 0, \ + .clear_ ## ot ## _stats = 0, + diff --git a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp index bebef12d1..fe08170cd 100644 --- a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp +++ b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp @@ -31,6 +31,18 @@ int main(int argc, char **argv) return 1; } + sai_switch_api_t *switch_api; + status = sai_api_query((sai_api_t)SAI_API_SWITCH, (void**)&switch_api); + QUERY_STATUS_CHECK(status, SAI_API_SWITCH); + + status = switch_api->create_switch(&switch_id, 0, NULL); + + if (status != SAI_STATUS_SUCCESS) + { + std::cout << "Failed to create switch" << std::endl; + return 1; + } + sai_dash_direction_lookup_api_t *dash_direction_lookup_api; status = sai_api_query((sai_api_t)SAI_API_DASH_DIRECTION_LOOKUP, (void**)&dash_direction_lookup_api); QUERY_STATUS_CHECK(status, SAI_API_DASH_DIRECTION_LOOKUP); From b63705c8768e26fc295f750ac9f865fb4c9d8066 Mon Sep 17 00:00:00 2001 From: vincent-xs <114104889+vincent-xs@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:48:13 -0400 Subject: [PATCH 66/75] update p4 compile dependancy to avoid parallel docker runs (#443) for both the json and the p4rt.txt --- dash-pipeline/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index eecf8679f..77eafe36b 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -103,8 +103,10 @@ p4: $(P4_ARTIFACTS) p4-clean: rm -rf $(P4_OUTDIR) +$(P4_OUTDIR)/dash_pipeline.json: $(P4_OUTDIR)/dash_pipeline_p4rt.txt + # Compile P4 into bmv2 .json fle and P4info for SAI header autogeneration -$(P4_ARTIFACTS): $(P4_SRC) +$(P4_OUTDIR)/dash_pipeline_p4rt.txt: $(P4_SRC) @echo "Compile P4 program $(P4_MAIN) for bmv2 ..." mkdir -p $(P4_OUTDIR) docker run \ From a3dd8f49e3d8914d8cceb5194682004e9f96d2cc Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Sat, 23 Sep 2023 20:37:15 +0200 Subject: [PATCH 67/75] [dash] Add libsai-debs target to create libsai debian packages (#444) Will create libsai and libsai-dev packages for usage in other projects --- dash-pipeline/Makefile | 8 +++++ dash-pipeline/SAI/debian/.gitignore | 3 ++ dash-pipeline/SAI/debian/Makefile | 29 +++++++++++++++++++ .../libsai-dev_1.0.0_amd64/DEBIAN/control | 8 +++++ .../debian/libsai_1.0.0_amd64/DEBIAN/control | 8 +++++ .../debian/libsai_1.0.0_amd64/DEBIAN/shlibs | 1 + .../debian/libsai_1.0.0_amd64/DEBIAN/triggers | 1 + 7 files changed, 58 insertions(+) create mode 100644 dash-pipeline/SAI/debian/.gitignore create mode 100644 dash-pipeline/SAI/debian/Makefile create mode 100644 dash-pipeline/SAI/debian/libsai-dev_1.0.0_amd64/DEBIAN/control create mode 100644 dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/control create mode 100644 dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/shlibs create mode 100644 dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/triggers diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index 77eafe36b..ae9dcc903 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -214,6 +214,14 @@ SAI/lib/libsai.so: sai-headers sai-meta libsai-clean: rm -rf SAI/lib/* +libsai-debs: libsai + @echo "build dash libsai debian packages ..." + cd SAI/debian && make + +.PHONY: libsai-debs-clean +libsai-debs-clean: + cd SAI/debian && make clean + .PHONY:sai-clean sai-clean: SAI/SAI libsai-clean saithrift-server-clean @echo "Restoring SAI subdirectories to baseline..." diff --git a/dash-pipeline/SAI/debian/.gitignore b/dash-pipeline/SAI/debian/.gitignore new file mode 100644 index 000000000..af8fc55cf --- /dev/null +++ b/dash-pipeline/SAI/debian/.gitignore @@ -0,0 +1,3 @@ +*.deb +**/usr +**/DEBIAN/md5sums diff --git a/dash-pipeline/SAI/debian/Makefile b/dash-pipeline/SAI/debian/Makefile new file mode 100644 index 000000000..87ace1d3a --- /dev/null +++ b/dash-pipeline/SAI/debian/Makefile @@ -0,0 +1,29 @@ + +# TODO lib directory could be changed to /usr/local/lib + +VERSION=1.0.0 + +all: debs + +debs: libsai-dev_$(VERSION)_amd64.deb libsai_$(VERSION)_amd64.deb + +libsai-dev_$(VERSION)_amd64.deb: ../SAI/inc/*.h ../SAI/experimental/*.h + mkdir -p -m 755 libsai-dev_$(VERSION)_amd64/usr/include/sai + find -type d |xargs chmod go-w + install -vCD -m 644 ../SAI/inc/*.h libsai-dev_$(VERSION)_amd64/usr/include/sai/ + install -vCD -m 644 ../SAI/experimental/*.h libsai-dev_$(VERSION)_amd64/usr/include/sai/ + cd libsai-dev_$(VERSION)_amd64 && find usr -type f | xargs md5sum > DEBIAN/md5sums + dpkg-deb --build --root-owner-group libsai-dev_$(VERSION)_amd64 + +libsai_$(VERSION)_amd64.deb: ../lib/libsai.so + mkdir -p -m 755 libsai_$(VERSION)_amd64/usr/lib/x86_64-linux-gnu/ + find -type d |xargs chmod go-w + install -vCD ../lib/libsai.so libsai_$(VERSION)_amd64/usr/lib/x86_64-linux-gnu/libsai.so + cd libsai_$(VERSION)_amd64 && find usr -type f | xargs md5sum > DEBIAN/md5sums + dpkg-deb --build --root-owner-group libsai_$(VERSION)_amd64 + +.PHONY: clean + +clean: + rm -f *.deb */DEBIAN/md5sums + rm -rf libsai_$(VERSION)_amd64/usr libsai-dev_$(VERSION)_amd64/usr diff --git a/dash-pipeline/SAI/debian/libsai-dev_1.0.0_amd64/DEBIAN/control b/dash-pipeline/SAI/debian/libsai-dev_1.0.0_amd64/DEBIAN/control new file mode 100644 index 000000000..d99790f45 --- /dev/null +++ b/dash-pipeline/SAI/debian/libsai-dev_1.0.0_amd64/DEBIAN/control @@ -0,0 +1,8 @@ +Package: libsai-dev +Source: dash +Version: 1.0.0 +Architecture: amd64 +Maintainer: Kamil Cudnik +Section: libdevel +Priority: optional +Description: This package contains development files for DASH libsai diff --git a/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/control b/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/control new file mode 100644 index 000000000..4b942a729 --- /dev/null +++ b/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/control @@ -0,0 +1,8 @@ +Package: libsai +Source: dash +Version: 1.0.0 +Architecture: amd64 +Maintainer: Kamil Cudnik +Section: libs +Priority: optional +Description: This package contains DASH libsai diff --git a/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/shlibs b/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/shlibs new file mode 100644 index 000000000..93ca2571f --- /dev/null +++ b/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/shlibs @@ -0,0 +1 @@ +libsai 0 libsai diff --git a/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/triggers b/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/triggers new file mode 100644 index 000000000..dd8660367 --- /dev/null +++ b/dash-pipeline/SAI/debian/libsai_1.0.0_amd64/DEBIAN/triggers @@ -0,0 +1 @@ +activate-noawait ldconfig From 18a4d1bc56a3757306e5c8247c4490c967f0e76a Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Wed, 27 Sep 2023 19:37:06 +0200 Subject: [PATCH 68/75] [SAI] Update SAI submodule to the latest origin/master (#446) Also compile libsaimetadata.so, so it wont be compiled as objects into saithrift server anymore, it will be used as external library --- dash-pipeline/Makefile | 2 +- dash-pipeline/SAI/SAI | 2 +- dash-pipeline/SAI/saithrift/Makefile | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dash-pipeline/Makefile b/dash-pipeline/Makefile index ae9dcc903..7fd327b0d 100644 --- a/dash-pipeline/Makefile +++ b/dash-pipeline/Makefile @@ -196,7 +196,7 @@ sai-meta: -v $(PWD)/..:/dash \ -w /dash/dash-pipeline/SAI/SAI/meta \ $(DOCKER_SAITHRIFT_BLDR_IMG) \ - make + make all libsaimetadata.so libsai: SAI/lib/libsai.so diff --git a/dash-pipeline/SAI/SAI b/dash-pipeline/SAI/SAI index 7f7a7587d..683d72720 160000 --- a/dash-pipeline/SAI/SAI +++ b/dash-pipeline/SAI/SAI @@ -1 +1 @@ -Subproject commit 7f7a7587debf6b393118b29ca71c2d00722bb885 +Subproject commit 683d72720b3318f83c54074edfa501ea6812550d diff --git a/dash-pipeline/SAI/saithrift/Makefile b/dash-pipeline/SAI/saithrift/Makefile index 969c68bde..eba801cac 100644 --- a/dash-pipeline/SAI/saithrift/Makefile +++ b/dash-pipeline/SAI/saithrift/Makefile @@ -34,6 +34,7 @@ saithrift-server: host # Install vendor specific SAI library i.e. DASH bmv2 libsai.so in /usr/lib. sudo cp $(LIB)/libsai.so /usr/lib + sudo cp $(META)/libsaimetadata.so /usr/lib @echo "Build SAI thrift server and libraries..." $(SUDO) mkdir -p $(RPC_INST_DIR) From 9fb130fc127566d9b65fc94820b598365ddd9df6 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 11 Oct 2023 10:47:29 -0700 Subject: [PATCH 69/75] Add Private Link mapping (#327) * Add Private Link mapping --- dash-pipeline/bmv2/dash_metadata.p4 | 3 + dash-pipeline/bmv2/dash_outbound.p4 | 73 +++++++++++++++---- dash-pipeline/bmv2/dash_pipeline.p4 | 20 +++-- .../tests/libsai/vnet_out/vnet_out.cpp | 13 ++++ .../pytest/vnet/test_saithrift_vnet.py | 9 +++ .../functional/ptf/sai_dash_utils.py | 3 + test/test-cases/functional/ptf/saidashacl.py | 9 +++ .../functional/ptf/saidashvnet_sanity.py | 9 +++ .../saic/config_bidir_setup_commands.py | 9 +++ .../saic/config_inbound_setup_commands.py | 12 +++ .../saic/config_outbound_setup_commands.json | 6 ++ .../saic/sai-api/test_sai_api_vnet_eni.py | 6 ++ .../sai-api/test_sai_api_vnet_in_route.py | 6 ++ .../sai-api/test_sai_api_vnet_out_route.py | 6 ++ ..._outbound_small_scale_config_via_dpugen.py | 10 ++- ..._small_scale_config_via_dpugen_create.json | 12 +++ .../saic/test_sai_vnet_outbound_scale.py | 10 ++- .../saic/vnet_inbound_setup_commands.json | 6 ++ .../vnet_outbound_setup_commands_scale.json | 6 ++ .../vnet_outbound_setup_commands_simple.json | 3 + ...et_route_setup_commands_bidirectional.json | 24 ++++++ ...t_route_setup_commands_unidirectional.json | 6 ++ 22 files changed, 233 insertions(+), 28 deletions(-) diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index d7611231f..78e31b26c 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -33,6 +33,9 @@ struct eni_data_t { bit<32> pps; bit<32> flows; bit<1> admin_state; + IPv6Address pl_sip; + IPv6Address pl_sip_mask; + IPv4Address pl_underlay_sip; } struct metadata_t { diff --git a/dash-pipeline/bmv2/dash_outbound.p4 b/dash-pipeline/bmv2/dash_outbound.p4 index 4609019cd..7e14f7aee 100644 --- a/dash-pipeline/bmv2/dash_outbound.p4 +++ b/dash-pipeline/bmv2/dash_outbound.p4 @@ -118,6 +118,14 @@ control outbound(inout headers_t hdr, #endif // TARGET_DPDK_PNA } + action set_tunnel(IPv4Address underlay_dip, + bit<16> meter_class, + bit<1> meter_class_override) { + meta.encap_data.underlay_dip = underlay_dip; + meta.mapping_meter_class = meter_class; + meta.mapping_meter_class_override = meter_class_override; + meta.encap_data.dash_encapsulation = dash_encapsulation_t.VXLAN; + } action set_tunnel_mapping(IPv4Address underlay_dip, EthernetAddress overlay_dmac, @@ -127,9 +135,32 @@ control outbound(inout headers_t hdr, if (use_dst_vnet_vni == 1) meta.vnet_id = meta.dst_vnet_id; meta.encap_data.overlay_dmac = overlay_dmac; - meta.encap_data.underlay_dip = underlay_dip; - meta.mapping_meter_class = meter_class; - meta.mapping_meter_class_override = meter_class_override; + + set_tunnel(underlay_dip, + meter_class, + meter_class_override); + } + + action set_private_link_mapping(IPv4Address underlay_dip, + IPv6Address overlay_sip, + IPv6Address overlay_dip, + dash_encapsulation_t dash_encapsulation, + bit<24> tunnel_key, + bit<16> meter_class, + bit<1> meter_class_override) { + meta.encap_data.overlay_dmac = hdr.ethernet.dst_addr; + meta.encap_data.dash_encapsulation = dash_encapsulation; + meta.encap_data.vni = tunnel_key; + + service_tunnel_encode(hdr, + overlay_dip, + 0xffffffffffffffffffffffff, + (overlay_sip & ~meta.eni_data.pl_sip_mask) | meta.eni_data.pl_sip | (IPv6Address)hdr.ipv4.dst_addr, + 0xffffffffffffffffffffffff); + + set_tunnel(underlay_dip, + meter_class, + meter_class_override); } #ifdef TARGET_BMV2_V1MODEL @@ -152,6 +183,7 @@ control outbound(inout headers_t hdr, actions = { set_tunnel_mapping; + set_private_link_mapping; @defaultonly drop; } const default_action = drop; @@ -209,16 +241,31 @@ control outbound(inout headers_t hdr, switch (routing.apply().action_run) { route_vnet_direct: route_vnet: { - ca_to_pa.apply(); - vnet.apply(); - - vxlan_encap(hdr, - meta.encap_data.underlay_dmac, - meta.encap_data.underlay_smac, - meta.encap_data.underlay_dip, - meta.encap_data.underlay_sip, - meta.encap_data.overlay_dmac, - meta.encap_data.vni); + switch (ca_to_pa.apply().action_run) { + set_tunnel_mapping: { + vnet.apply(); + } + } + + if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + vxlan_encap(hdr, + meta.encap_data.underlay_dmac, + meta.encap_data.underlay_smac, + meta.encap_data.underlay_dip, + meta.encap_data.underlay_sip, + meta.encap_data.overlay_dmac, + meta.encap_data.vni); + } else if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) { + nvgre_encap(hdr, + meta.encap_data.underlay_dmac, + meta.encap_data.underlay_smac, + meta.encap_data.underlay_dip, + meta.encap_data.underlay_sip, + meta.encap_data.overlay_dmac, + meta.encap_data.vni); + } else { + drop(); + } } route_service_tunnel: { if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index ea86d0205..a39641ea0 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -114,21 +114,27 @@ control dash_ingress( @Sai[type="sai_uint32_t"] bit<24> vm_vni, bit<16> vnet_id, + IPv6Address pl_sip, + IPv6Address pl_sip_mask, + IPv4Address pl_underlay_sip, bit<16> v4_meter_policy_id, bit<16> v6_meter_policy_id, ACL_GROUPS_PARAM(inbound_v4), ACL_GROUPS_PARAM(inbound_v6), ACL_GROUPS_PARAM(outbound_v4), ACL_GROUPS_PARAM(outbound_v6)) { - meta.eni_data.cps = cps; - meta.eni_data.pps = pps; - meta.eni_data.flows = flows; - meta.eni_data.admin_state = admin_state; - meta.encap_data.underlay_dip = vm_underlay_dip; + meta.eni_data.cps = cps; + meta.eni_data.pps = pps; + meta.eni_data.flows = flows; + meta.eni_data.admin_state = admin_state; + meta.eni_data.pl_sip = pl_sip; + meta.eni_data.pl_sip_mask = pl_sip_mask; + meta.eni_data.pl_underlay_sip = pl_underlay_sip; + meta.encap_data.underlay_dip = vm_underlay_dip; /* vm_vni is the encap VNI used for tunnel between inbound DPU -> VM * and not a VNET identifier */ - meta.encap_data.vni = vm_vni; - meta.vnet_id = vnet_id; + meta.encap_data.vni = vm_vni; + meta.vnet_id = vnet_id; if (meta.is_overlay_ip_v6 == 1) { if (meta.direction == dash_direction_t.OUTBOUND) { diff --git a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp index fe08170cd..bc5f27923 100644 --- a/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp +++ b/dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp @@ -177,7 +177,20 @@ int main(int argc, char **argv) attrs.push_back(attr); } + attr.id = SAI_ENI_ATTR_PL_SIP; + attr.value.u32 = 0; + attrs.push_back(attr); + + attr.id = SAI_ENI_ATTR_PL_SIP_MASK; + attr.value.u32 = 0; + attrs.push_back(attr); + + attr.id = SAI_ENI_ATTR_PL_UNDERLAY_SIP; + attr.value.u32 = 0; + attrs.push_back(attr); + status = dash_eni_api->create_eni(&eni_id, switch_id, attrs.size(), attrs.data()); + if (status != SAI_STATUS_SUCCESS) { std::cout << "Failed to create ENI object" << std::endl; diff --git a/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py b/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py index acb9cd20e..9fe640004 100644 --- a/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py +++ b/dash-pipeline/tests/saithrift/pytest/vnet/test_saithrift_vnet.py @@ -35,12 +35,21 @@ def test_sai_thrift_create_eni(saithrift_client): vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4="172.16.3.1")) + pl_sip_mask = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:0000:0000:0000")) + pl_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:8a2e:0370:7334")) + pl_underlay_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4="10.0.0.18")) eni = sai_thrift_create_eni(saithrift_client, cps=10000, pps=100000, flows=100000, admin_state=True, vm_underlay_dip=vm_underlay_dip, vm_vni=9, vnet_id=vnet, + pl_sip = pl_sip, + pl_sip_mask = pl_sip_mask, + pl_underlay_sip = pl_underlay_sip, v4_meter_policy_id = 0, v6_meter_policy_id = 0, inbound_v4_stage1_dash_acl_group_id = in_acl_group_id, diff --git a/test/test-cases/functional/ptf/sai_dash_utils.py b/test/test-cases/functional/ptf/sai_dash_utils.py index 1e702d8e9..856ccd46a 100644 --- a/test/test-cases/functional/ptf/sai_dash_utils.py +++ b/test/test-cases/functional/ptf/sai_dash_utils.py @@ -143,6 +143,9 @@ def eni_create(self, **kwargs): "vm_underlay_dip": sai_ipaddress("0.0.0.0"), "vm_vni": 1, "vnet_id": 1, + "pl_sip" : sai_ipaddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334"), + "pl_sip_mask": sai_ipaddress("2001:0db8:85a3:0000:0000:0000:0000:0000"), + "pl_underlay_sip": sai_ipaddress("10.0.0.18"), "v4_meter_policy_id": 0, "v6_meter_policy_id": 0, "inbound_v4_stage1_dash_acl_group_id": 0, diff --git a/test/test-cases/functional/ptf/saidashacl.py b/test/test-cases/functional/ptf/saidashacl.py index ee395ddeb..54415454b 100644 --- a/test/test-cases/functional/ptf/saidashacl.py +++ b/test/test-cases/functional/ptf/saidashacl.py @@ -177,12 +177,21 @@ def setUpSwitch(self): vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4=self.src_vm_pa_ip)) + pl_sip_mask = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:0000:0000:0000")) + pl_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:8a2e:0370:7334")) + pl_underlay_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4="10.0.0.18")) self.eni = self.create_obj(sai_thrift_create_eni, sai_thrift_remove_eni, cps=10000, pps=100000, flows=100000, admin_state=True, vm_underlay_dip=vm_underlay_dip, vm_vni=9, vnet_id=self.vnet, + pl_sip = pl_sip, + pl_sip_mask = pl_sip_mask, + pl_underlay_sip = pl_underlay_sip, v4_meter_policy_id=0, v6_meter_policy_id=0, inbound_v4_stage1_dash_acl_group_id=self.in_v4_stage1_acl_group_id, diff --git a/test/test-cases/functional/ptf/saidashvnet_sanity.py b/test/test-cases/functional/ptf/saidashvnet_sanity.py index 0e5849a72..73296af7e 100644 --- a/test/test-cases/functional/ptf/saidashvnet_sanity.py +++ b/test/test-cases/functional/ptf/saidashvnet_sanity.py @@ -56,12 +56,21 @@ def configureVnet(self): vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4=self.src_vm_pa_ip)) + pl_sip_mask = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:0000:0000:0000")) + pl_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:8a2e:0370:7334")) + pl_underlay_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4="10.0.0.18")) self.eni = sai_thrift_create_eni(self.client, cps=10000, pps=100000, flows=100000, admin_state=True, vm_underlay_dip=vm_underlay_dip, vm_vni=9, vnet_id=self.vnet, + pl_sip = pl_sip, + pl_sip_mask = pl_sip_mask, + pl_underlay_sip = pl_underlay_sip, v4_meter_policy_id = 0, v6_meter_policy_id = 0, # TODO: Enable ACL rule diff --git a/test/test-cases/functional/saic/config_bidir_setup_commands.py b/test/test-cases/functional/saic/config_bidir_setup_commands.py index 1457d85d4..776e3fb67 100644 --- a/test/test-cases/functional/saic/config_bidir_setup_commands.py +++ b/test/test-cases/functional/saic/config_bidir_setup_commands.py @@ -98,6 +98,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", ENI_VTEP_IP, "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", @@ -134,6 +137,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", NETWORK_VTEP_IP, "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", @@ -170,6 +176,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", NETWORK_VTEP_IP, "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", diff --git a/test/test-cases/functional/saic/config_inbound_setup_commands.py b/test/test-cases/functional/saic/config_inbound_setup_commands.py index 8eb829d2d..399e5ec98 100644 --- a/test/test-cases/functional/saic/config_inbound_setup_commands.py +++ b/test/test-cases/functional/saic/config_inbound_setup_commands.py @@ -109,6 +109,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet_#1", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "$acl_in_1", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", @@ -174,6 +180,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet_#1", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "$acl_in_1", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/functional/saic/config_outbound_setup_commands.json b/test/test-cases/functional/saic/config_outbound_setup_commands.json index a8d6ec526..4d87713f4 100644 --- a/test/test-cases/functional/saic/config_outbound_setup_commands.json +++ b/test/test-cases/functional/saic/config_outbound_setup_commands.json @@ -72,6 +72,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "221.0.1.11", "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", @@ -108,6 +111,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "221.0.2.101", "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py index 4732f4e5d..2fa7b3d9c 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_eni.py @@ -44,6 +44,12 @@ def test_vnet_eni_create(self, dpu): "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py index 42c09c0b1..ff3b70e94 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_in_route.py @@ -51,6 +51,12 @@ def test_vnet_inbound_routing_entry_create_setup(self, dpu): "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py index 12d337324..e57be29cc 100644 --- a/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py +++ b/test/test-cases/functional/saic/sai-api/test_sai_api_vnet_out_route.py @@ -50,6 +50,12 @@ def test_vnet_outbound_routing_entry_create(self, dpu): "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py index 2f071c497..328a4dc4e 100755 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen.py @@ -45,7 +45,7 @@ NUMBER_OF_IN_ACL_GROUP = 0 NUMBER_OF_OUT_ACL_GROUP = 0 -def add_meter_attrs(attr_type, attrs, ext): +def add_extra_attrs(attr_type, attrs, ext): i = 0 for item in attrs: if item['type'] == attr_type: @@ -59,12 +59,14 @@ def make_create_commands(self): """ conf = dpugen.sai.SaiConfig() conf.generate() - ret = add_meter_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0"]) + ret = add_extra_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0", + 'SAI_ENI_ATTR_PL_SIP', '2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'SAI_ENI_ATTR_PL_SIP_MASK', + '2001:0db8:85a3:0000:0000:0000:0000:0000', 'SAI_ENI_ATTR_PL_UNDERLAY_SIP', '10.0.0.18']) - ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0', + ret = add_extra_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0', 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE', 'True' ]) - ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True', + ret = add_extra_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True', 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS', '0' ]) return ret diff --git a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json index 1c0ff3b13..7530e7e3f 100644 --- a/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json +++ b/test/test-cases/functional/saic/tutorial/test_sai_vnet_outbound_small_scale_config_via_dpugen_create.json @@ -93,6 +93,12 @@ "5000", "SAI_ENI_ATTR_VNET_ID", "$vnet_#5000", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", @@ -158,6 +164,12 @@ "6000", "SAI_ENI_ATTR_VNET_ID", "$vnet_#6000", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py index 36dbed8c1..73d1a96f8 100755 --- a/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py +++ b/test/test-cases/scale/saic/test_sai_vnet_outbound_scale.py @@ -97,7 +97,7 @@ } } -def add_meter_attrs(attr_type, attrs, ext): +def add_extra_attrs(attr_type, attrs, ext): i = 0 for item in attrs: if item['type'] == attr_type: @@ -112,12 +112,14 @@ def make_create_vnet_config(self): conf = dpugen.sai.SaiConfig() conf.mergeParams(TEST_VNET_OUTBOUND_CONFIG_SCALE) conf.generate() - ret = add_meter_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0"]) + ret = add_extra_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0", + 'SAI_ENI_ATTR_PL_SIP', '2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'SAI_ENI_ATTR_PL_SIP_MASK', + '2001:0db8:85a3:0000:0000:0000:0000:0000', 'SAI_ENI_ATTR_PL_UNDERLAY_SIP', '10.0.0.18']) - ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0', + ret = add_extra_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0', 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE', 'True' ]) - ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True', + ret = add_extra_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True', 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS', '0' ]) return ret diff --git a/test/test-cases/scale/saic/vnet_inbound_setup_commands.json b/test/test-cases/scale/saic/vnet_inbound_setup_commands.json index a4e79a12c..6ba9f49e5 100644 --- a/test/test-cases/scale/saic/vnet_inbound_setup_commands.json +++ b/test/test-cases/scale/saic/vnet_inbound_setup_commands.json @@ -71,6 +71,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet_1", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "$acl_in_1", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json b/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json index 8b9a30762..0a28f3854 100644 --- a/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json +++ b/test/test-cases/scale/saic/vnet_outbound_setup_commands_scale.json @@ -107,6 +107,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "172.16.1.1", "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet_#4", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", @@ -143,6 +146,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "172.16.2.1", "SAI_ENI_ATTR_VM_VNI", "10", "SAI_ENI_ATTR_VNET_ID", "$vnet_#5", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", diff --git a/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json b/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json index 133adf5ae..be2fe3acb 100644 --- a/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json +++ b/test/test-cases/scale/saic/vnet_outbound_setup_commands_simple.json @@ -59,6 +59,9 @@ "SAI_ENI_ATTR_VM_UNDERLAY_DIP", "172.16.1.1", "SAI_ENI_ATTR_VM_VNI", "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0", diff --git a/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json b/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json index dbc951399..f0e1e2119 100644 --- a/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json +++ b/test/test-cases/scale/saic/vnet_route_setup_commands_bidirectional.json @@ -132,6 +132,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", @@ -197,6 +203,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", @@ -262,6 +274,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", @@ -327,6 +345,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", diff --git a/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json b/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json index 2cdec1c43..8cefdc7d7 100644 --- a/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json +++ b/test/test-cases/scale/saic/vnet_route_setup_commands_unidirectional.json @@ -71,6 +71,12 @@ "9", "SAI_ENI_ATTR_VNET_ID", "$vnet", + "SAI_ENI_ATTR_PL_SIP", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "SAI_ENI_ATTR_PL_SIP_MASK", + "2001:0db8:85a3:0000:0000:0000:0000:0000", + "SAI_ENI_ATTR_PL_UNDERLAY_SIP", + "10.0.0.18", "SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0", "SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", From c18ea3f844fbb0085f8ed53636e59813202f2f1c Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Tue, 17 Oct 2023 17:43:42 +0200 Subject: [PATCH 70/75] Build libsai deb packages in github workflow (#450) * Build libsai deb packages in github workflow Needed step for exposing later as artifacts to consume by other pipelines * Fix workflow name * Upload libsai debian packages artifact * Give full path * Fail as error if no files were found --- .github/workflows/dash-bmv2-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dash-bmv2-ci.yml b/.github/workflows/dash-bmv2-ci.yml index 7228b53fa..f1cb7b2e1 100644 --- a/.github/workflows/dash-bmv2-ci.yml +++ b/.github/workflows/dash-bmv2-ci.yml @@ -90,4 +90,10 @@ jobs: run: DOCKER_FLAGS=$docker_fg_flags make docker-saichallenger-client - name: Run SAI-Challenger Tests run: DOCKER_FLAGS=$docker_fg_root_flags make run-saichallenger-tests - + - name: Build libsai debian packages + run: DOCKER_FLAGS=$docker_fg_root_flags make libsai-debs + - uses: actions/upload-artifact@v3 + with: + name: libsai-debian-packages + path: /home/runner/work/DASH/DASH/dash-pipeline/SAI/debian/*deb + if-no-files-found: error From 778d92045910de71b3987c2f44edbe436af4e31c Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Sat, 21 Oct 2023 19:18:07 +0200 Subject: [PATCH 71/75] [libsai] Add attr name logging when doing get api (#451) * [libsai] Add attr name logging when doing get api Using metadata add generic code to obtain attr name and log it when attr is not supported * Add log attr name in auto generated dash api Also using metadata * Add more attr logging in DashSai For better debugging --- dash-pipeline/SAI/src/dashsai.cpp | 52 ++++++++++++++++++----- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 22 ++++++++-- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/dash-pipeline/SAI/src/dashsai.cpp b/dash-pipeline/SAI/src/dashsai.cpp index 69dbb4b81..91d7fad4a 100644 --- a/dash-pipeline/SAI/src/dashsai.cpp +++ b/dash-pipeline/SAI/src/dashsai.cpp @@ -1,5 +1,9 @@ #include "dashsai.h" +extern "C" { +#include "saimetadata.h" +} + #include using namespace dash; @@ -235,7 +239,11 @@ sai_status_t DashSai::createSwitch( for (uint32_t i = 0; i < attr_count; i++) { - DASH_LOG_WARN("attr id %d is NOT IMPLEMENTED, ignored", attr_list[i].id); + auto *md = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr_list[i].id); + + const char* attrName = md ? md->attridname : "unknown"; + + DASH_LOG_WARN("attr id %d %s is NOT IMPLEMENTED, ignored", attr_list[i].id, attrName); if (attr_list[i].id == SAI_SWITCH_ATTR_SWITCH_HARDWARE_INFO) { @@ -307,6 +315,10 @@ sai_status_t DashSai::setSwitchAttribute( DASH_LOG_ENTER(); DASH_CHECK_API_INITIALIZED(); + auto *md = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr->id); + + const char* attrName = md ? md->attridname : "unknown"; + switch (attr->id) { case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: @@ -317,13 +329,13 @@ sai_status_t DashSai::setSwitchAttribute( case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - DASH_LOG_NOTICE("setting dummy notification callback (attr id: %d)", attr->id); + DASH_LOG_NOTICE("setting dummy notification callback (attr id: %d %s)", attr->id, attrName); return SAI_STATUS_SUCCESS; default: - DASH_LOG_ERROR("set attr %d NOT IMPLEMENTED", attr->id); + DASH_LOG_ERROR("set attr %d %s NOT IMPLEMENTED", attr->id, attrName); return SAI_STATUS_NOT_IMPLEMENTED; } @@ -341,6 +353,10 @@ sai_status_t DashSai::getSwitchAttribute( for (uint32_t i = 0; i < attr_count ; i++, attr++) { + auto *md = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr->id); + + const char* attrName = md ? md->attridname : "unknown"; + switch(attr->id) { case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: @@ -421,12 +437,12 @@ sai_status_t DashSai::getSwitchAttribute( if (getenv(DASH_USE_NOT_SUPPORTED)) { - DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED", i, attr->id); + DASH_LOG_WARN("[%d] attr %d %s is NOT SUPPORTED", i, attr->id, attrName); return SAI_STATUS_NOT_SUPPORTED; } - DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); + DASH_LOG_WARN("[%d] attr %d %s is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id, attrName); memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage @@ -449,6 +465,10 @@ sai_status_t DashSai::getPortAttribute( for (uint32_t i = 0; i < attr_count ; i++, attr++) { + auto *md = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_PORT, attr->id); + + const char* attrName = md ? md->attridname : "unknown"; + switch(attr->id) { case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES: @@ -488,12 +508,12 @@ sai_status_t DashSai::getPortAttribute( if (getenv(DASH_USE_NOT_SUPPORTED)) { - DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED", i, attr->id); + DASH_LOG_WARN("[%d] attr %d %s is NOT SUPPORTED", i, attr->id, attrName); return SAI_STATUS_NOT_SUPPORTED; } - DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id); + DASH_LOG_WARN("[%d] attr %d %s is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id, attrName); memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage @@ -702,7 +722,11 @@ sai_status_t DashSai::create( *objectId = m_objectIdManager->allocateNewObjectId(objectType, m_switchId); - DASH_LOG_WARN("creating dummy object for object type %d: 0x%lx", objectType, *objectId); + auto* ot = sai_metadata_get_object_type_info(objectType); + + const char* otName = ot ? ot->objecttypename : "unknown"; + + DASH_LOG_WARN("creating dummy object for object type %d %s: 0x%lx", objectType, otName, *objectId); return SAI_STATUS_SUCCESS; } @@ -733,7 +757,11 @@ sai_status_t DashSai::set( if (objectType == SAI_OBJECT_TYPE_SWITCH) return setSwitchAttribute(objectId, attr); - DASH_LOG_WARN("dummy set: 0x%lx, attr id: %d", objectId, attr->id); + auto *md = sai_metadata_get_attr_metadata(objectType, attr->id); + + const char* attrName = md ? md->attridname : "unknown"; + + DASH_LOG_WARN("dummy set: 0x%lx, attr id: %d %s", objectId, attr->id, attrName); return SAI_STATUS_SUCCESS; } @@ -753,7 +781,11 @@ sai_status_t DashSai::get( if (objectType == SAI_OBJECT_TYPE_SWITCH) return getSwitchAttribute(objectId, attr_count, attr_list); - DASH_LOG_ERROR("not implemented for object type %d", objectType); + auto* ot = sai_metadata_get_object_type_info(objectType); + + const char* otName = ot ? ot->objecttypename : "unknown"; + + DASH_LOG_ERROR("not implemented for object type %d %s", objectType, otName); return SAI_STATUS_NOT_IMPLEMENTED; } diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index a9289436b..2ca9a3522 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -1,6 +1,10 @@ #include "utils.h" #include "saiimpl.h" +extern "C" { +#include "saimetadata.h" +} + using namespace dash::utils; {% set registered_group = [] %} @@ -63,6 +67,10 @@ static sai_status_t dash_sai_create_{{ table.name }}( // Copy P4 table keys from appropriate SAI attributes for (uint32_t i = 0; i < attr_count; i++) { + auto *md = sai_metadata_get_attr_metadata((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, attr_list[i].id); + + const char* attrName = md ? md->attridname : "unknown"; + switch(attr_list[i].id) { {% for key in table['keys'] %} @@ -120,7 +128,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% endif %} {% endif %} default: - DASH_LOG_ERROR("attribute [%d] %d not supported yet", i, attr_list[i].id); + DASH_LOG_ERROR("attribute [%d] %d %s not supported yet", i, attr_list[i].id, attrName); break; } } @@ -163,6 +171,10 @@ static sai_status_t dash_sai_create_{{ table.name }}( for (uint32_t i = 0; i < attr_count; i++) { + auto *md = sai_metadata_get_attr_metadata((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, attr_list[i].id); + + const char* attrName = md ? md->attridname : "unknown"; + switch(attr_list[i].id) { {% for param in table.actionParams %} @@ -188,7 +200,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% endif %} {% endfor %} default: - DASH_LOG_ERROR("attribute [%d] %d not supported yet", i, attr_list[i].id); + DASH_LOG_ERROR("attribute [%d] %d %s not supported yet", i, attr_list[i].id, attrName); break; } } @@ -387,6 +399,10 @@ static sai_status_t dash_sai_create_{{ table.name }}( for (uint32_t i = 0; i < attr_count; i++) { + auto *md = sai_metadata_get_attr_metadata((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, attr_list[i].id); + + const char* attrName = md ? md->attridname : "unknown"; + switch(attr_list[i].id) { {% for param in table.actionParams %} @@ -412,7 +428,7 @@ static sai_status_t dash_sai_create_{{ table.name }}( {% endif %} {% endfor %} default: - DASH_LOG_ERROR("attribute [%d] %d not supported yet", i, attr_list[i].id); + DASH_LOG_ERROR("attribute [%d] %d %s not supported yet", i, attr_list[i].id, attrName); break; } } From e560e19f7abdb2be9ae413bbae16aaf7494692ca Mon Sep 17 00:00:00 2001 From: Riff Date: Wed, 8 Nov 2023 09:54:24 -0800 Subject: [PATCH 72/75] DASH pipeline packet flow update proposal. (#449) * Packet flow. * Update packet flows. * minor update. * minor fix. * Update. * Update. * update. * More defined descriptions and examples. * more examples. * minor update. * Adding packet format section. * minor update. * minor update. * adding asymmetrical encap. * Update on conntrack updates and more examples. * Adding placeholder for flow resimulation. * Update the object schema to avoid confusion with SONiC DASH object. * Making stage more generic. * More update on pipeline profile. * adding data path logical architecture stack. * minor update on graph. * fix typo and update wordlist * adding parameter support for stage transitions. * Updating transition type and be more specific on routing type parameter population. * Meter update stage. * spellcheck. * Multi layer chaining. * minor fix. * Stateless decap and stateful decap. * minor fix. * Adding routing action definitions. * fix spellcheck. * fix spellcheck. * Adding DSCP and TTL handling (from sonic-dash-hld) and reverse tunnel action. * tunnel from encap action. * Adding encap preservation section. * addressing comment. * Update tunnel dscp fields. * Adding scale numbers. * Minor update on the metadata to be SAI compatiable. * fix spelling. * More update on multi-encap handling. * minor update. * fix spelling. * Rename tunnel 1 and tunnel 2 to underlay 1 and underlay 2 per feedback. * Adding dedicated packet parsing stage. * Update load balancer example with VTEP support. * fix spelling. * Update documentation/general/dash-sai-pipeline-packet-flow.md Co-authored-by: KrisNey-MSFT * Apply suggestions from code review Co-authored-by: KrisNey-MSFT * fix typo. * addressing comments. * Apply suggestions from code review Co-authored-by: KrisNey-MSFT * Apply suggestions from code review Co-authored-by: KrisNey-MSFT * Apply suggestions from code review Co-authored-by: KrisNey-MSFT --------- Co-authored-by: KrisNey-MSFT --- .wordlist.txt | 16 + .../dataplane/dash-routing-actions.md | 239 +++++ .../general/dash-sai-pipeline-packet-flow.md | 888 ++++++++++++++++++ .../images/dash-asymmetrical-encap.svg | 4 + .../images/dash-data-path-overview.svg | 4 + .../general/images/dash-tunnel-learning.svg | 4 + 6 files changed, 1155 insertions(+) create mode 100644 documentation/dataplane/dash-routing-actions.md create mode 100644 documentation/general/dash-sai-pipeline-packet-flow.md create mode 100644 documentation/general/images/dash-asymmetrical-encap.svg create mode 100644 documentation/general/images/dash-data-path-overview.svg create mode 100644 documentation/general/images/dash-tunnel-learning.svg diff --git a/.wordlist.txt b/.wordlist.txt index e4373f827..698eb0477 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -90,7 +90,9 @@ conf CONFDB confgen config +configurated configs +Conntrack Containerlab CP CreatedHalfOpenFlow @@ -134,6 +136,9 @@ de deallocating Decap decap +decap'ed +decap'ing +decaps deliverables DemoDays designator @@ -199,6 +204,7 @@ DUT's EasyCLA ECMP encap +encaps ENI eni Eni @@ -208,6 +214,7 @@ entrypoints enum EPUs EPYC +ethernet executables ExpressRoute failover @@ -267,6 +274,7 @@ INET INIT Init initializer +initialization integrations integrators interoperable @@ -324,6 +332,7 @@ Makefile Makefiles makefiles MAPs +maprouting MatchedHalfOpenFlow MatchedOtherFlow MatchedTcpFlow @@ -346,7 +355,9 @@ MTU MUX MUXes natively +nat natted +NAT'ing nb nd netdevs @@ -358,6 +369,7 @@ noautoconsole NonSynStateful NorthBound Novus +NPL NPUS NSG NSGs @@ -367,6 +379,7 @@ NVA NVidia nvgre Nvgre +NvGRE NVMe observability OCP @@ -447,6 +460,7 @@ qos QoS qos Radv +recirculation rdpty reachability reconvergence @@ -459,6 +473,7 @@ redis renderer repo repos +resimulated resimulation responder Resttapi @@ -578,6 +593,7 @@ TcpSynPacket TDI Teamd teardown +techonology templating TEP testbed diff --git a/documentation/dataplane/dash-routing-actions.md b/documentation/dataplane/dash-routing-actions.md new file mode 100644 index 000000000..5f41b21fd --- /dev/null +++ b/documentation/dataplane/dash-routing-actions.md @@ -0,0 +1,239 @@ +# DASH routing actions + +As [DASH packet flow HLD](../general/dash-sai-pipeline-packet-flow.md) describes, routing actions are the fundamental building blocks that describe the packet transformations and form the high level scenarios in DASH. And this doc is used to describe the routing action definitions in details. + +1. [Overview](#overview) +2. [Stage transition actions](#stage-transition-actions) + 1. [Basic stage transition actions](#basic-stage-transition-actions) + 1. [`drop` action](#drop-action) + 2. [`trap` action](#trap-action) + 2. [Matching stage transition actions](#matching-stage-transition-actions) + 1. [IP-based stage transition actions](#ip-based-stage-transition-actions) + 1. [`lpmrouting` action](#lpmrouting-action) + 2. [`maprouting` action](#maprouting-action) + 2. [Port-based stage transition actions](#port-based-stage-transition-actions) + 1. [`portmaprouting` action](#portmaprouting-action) +3. [Packet transformation actions](#packet-transformation-actions) + 1. [`staticencap` action](#staticencap-action) + 2. [`tunnel` action](#tunnel-action) + 3. [`tunnel_from_encap` action](#tunnel_from_encap-action) + 4. [`reverse_tunnel` action](#reverse_tunnel-action) + 5. [`4to6` action](#4to6-action) + 6. [`6to4` action](#6to4-action) + 7. [`nat` action](#nat-action) + +## Overview + +On high level, there are 2 types of routing actions: + +- Packet transformation actions: + - These actions are used to transform the packet header fields, such as modify the packet fields, adding encaps, etc. + - These actions can only be used in the routing types that specified in the `routing_type` field in each match stage entry. +- Stage transition actions: + - These actions are used to describe the stage transitions in the DASH pipeline, such as transit to maprouting stage. + - This actions can only be used in the routing types that specified in the `transition` field in each match stage entry. + +For how routing action works, please refer to the ["Routing action and routing types" section in DASH packet flow HLD](../general/dash-sai-pipeline-packet-flow.md#57-routing-actions-and-routing-types). + +## Stage transition actions + +### Basic stage transition actions + +#### `drop` action + +- Actions: + - Drop the packet after the entry is matched. + +#### `trap` action + +- Actions: + - Trap the packet to CPU after the entry is matched. + +### Matching stage transition actions + +All matching stage transition actions will support the following parameters: + +- `default_routing_type`: If no entry is found, use this routing type to route the packet. If `default_routing_type` is not set, the packet will be dropped by default. +- `stage_index`: If there are multiple stage of the same stage type, use this field to specify which stage to transit to. The index is starting from 0 and by default 0. + +#### IP-based stage transition actions + +All IP-based stage transition actions will support the following parameters: + +- `use_src_ip`: Use source IP in routing and mapping stages. +- `ip_mask`: IP mask to apply before matching the entries. + +##### `lpmrouting` action + +- Actions: + - The packet will be routed to the next LPM routing stage specified by the `stage_index` field. + +The port mapping entries can be described as below: + +```json +// Key Format: DASH_SAI_ROUTE_TABLE||| +"DASH_SAI_ROUTE_TABLE|123456789012|0|10.0.1.0/24": { + "transition": "some_transition", + "routing_type": "do_somethng", + + // Metadata properties ... +} +``` + +##### `maprouting` action + +- Actions: + - The packet will be routed to the next map routing stage specified by the `stage_index` field. + +A map routing entry can be described as below: + +```json +// Key Format: DASH_VNET_MAPPING_TABLE||| +"DASH_VNET_MAPPING_TABLE|Vnet1|0|10.0.1.1": { + "transition": "some_transition", + "routing_type": "do_somethng", + + // Metadata properties ... +} +``` + +#### Port-based stage transition actions + +##### `portmaprouting` action + +- Actions: + - The packet will be routed to the next stage with TCP or UDP port mapping. + +The port mapping entries can be described as below: + +```json +// Key Format: DASH_SAI_PORT_MAPPING_TABLE| +"DASH_SAI_PORT_MAPPING_TABLE|portmapping-0": [ + // ... + { + "transition": "some_transition", + "routing_type": "do_something", + + // Port range to match + "src_port_min": 0, + "src_port_max": 65535, + "dst_port_min": 2000, + "dst_port_max": 2099, + + // Metadata properties ... + } + // ... +] +``` + +## Packet transformation actions + +### `staticencap` action + +- Metadata parameters: + - `underlay_dip`: Destination IP used in encap. + - `underlay_sip`: Source IP used in encap. + - `encap_type`: Encap type: "nvgre|vxlan" + - `encap_key`: GRE key in NvGRE or VNI in VxLAN. + - `tunnel_dscp_mode`: DSCP handling mode: "preserve|pipe" + - `tunnel_dscp_value`: DSCP value to set in the encap header. +- Actions: + - Enable the underlay encap header based on the encap type. + - Update the underlay encap header with `encap_key`, `underlay_dip`, `underlay_sip`. + - If `underlay_dip` / `underlay_sip` is not set, use the original IP. + +### `tunnel` action + +- Action parameters: + - `target` = "underlay0|underlay1|underlay2|..." +- Metadata Parameters: + - `(underlay0|underlay1|underlay2|...)_tunnel_id`: The ID of the tunnel we are going to use. + - The definition of the tunnel can be found below. + - The ECMP hash is calculated based on the 5 tuple of the inner-most (overlay) packet. + - `tunnel_dscp_mode`: DSCP handling mode: "preserve|pipe" + - `tunnel_dscp_value`: DSCP value to set in the encap header. +- Actions: + - Enable the encap header based on the target tunnel and encap_type. + - Update the encap information with the `encap_key`, `dip` and `sip`. + +A tunnel entry can be described as below: + +```json +"DASH_SAI_TUNNEL_TABLE|":{ + "name": "tunnel-123", + "dips": "100.0.1.1", + "sip": "2.2.2.1", + "encap_type": "vxlan", + "encap_key": 101 +} +``` + +### `tunnel_from_encap` action + +- Parameters from action: + - `source`: "underlay0|underlay1|underlay2|..." + - `target`: "underlay0|underlay1|underlay2|..." +- Parameters from metadata: + - `tunnel_from_encap_(underlay0|underlay1|underlay2)_sip`: overrides the source ip in the specified target encap + - `tunnel_from_encap_(underlay0|underlay1|underlay2)_dip`: overrides the destination ip in the specified target encap +- Action: + - Enable the target encap by copying the information from the source encap. + - Copy the DSCP value and TTL value from the source encap. + - When overrides exists, uses the overridden one. + +### `reverse_tunnel` action + +- Action parameters: + - `target` = "underlay0|underlay1|underlay2|..." +- Metadata Parameters: + - `(underlay0|underlay1|underlay2|...)_tunnel_id`: The ID of the tunnel we are going to use. + - The definition of the tunnel can be found below. + - The ECMP hash is calculated based on the 5 tuple of the inner-most (overlay) packet. +- Actions: + - No packet transformation should be done on the packet. + - When creating the flow, in the reverse flow, + - Enable the encap header based on the target tunnel and encap_type. + - Update the encap information with the `encap_key`, `dip` and `sip`. + +The tunnel entry is the same as the one in `tunnel` action. + +### `4to6` action + +- Metadata parameters: + - `4to6_sip_encoding_value`: "value_bits" + - `4to6_sip_encoding_mask`: "mask_bits" + - `4to6_dip_encoding_value`: "value_bits" + - `4to6_dip_encoding_mask`: "mask_bits" +- Metadata merging in parameter evaluation: + - When same metadata is found during route action parameter evaluation process, value_bits and mask_bits will be reduced into one with following operation: + - new_value_bits = (old_value_bits & !mask_bits) | value_bits + - new_mask_bits = old_mask_bits | mask_bits +- Actions: + - New SIP/DIP v6 = (SIP/DIP v4 & !4to6_sip/dip_encoding_mask) | 4to6_sip/dip_encoding_value. + +### `6to4` action + +- Metadata parameters: + - `6to4_sip_encoding_value`: "value_bits" + - `6to4_sip_encoding_mask`: "mask_bits" + - `6to4_dip_encoding_value`: "value_bits" + - `6to4_dip_encoding_mask`: "mask_bits" +- Metadata merging in parameter evaluation: + - When same metadata is found during route action parameter evaluation process, value_bits and mask_bits will be reduced into one with following operation: + - new_value_bits = (old_value_bits & !mask_bits) | value_bits + - new_mask_bits = old_mask_bits | mask_bits +- Actions: + - New SIP/DIP = (SIP/DIP v6 with higher bits removed & !6to4_sip/dip_encoding_mask) | 6to4_sip/dip_encoding_value. + +### `nat` action + +- Metadata parameters: + - `nat_dip` / `nat_sip`: The destination / source IP that we need to update to. + - `nat_dport` / `nat_sport`: The destination / source port that we need to update to. + - `nat_dport_base` / `nat_sport_base`: The destination / source port that we use as the base port for NAT'ing. +- Action: + - `nat` action always works on the overlay (inner most) packet. + - It updates the IP and Port based on the metadata parameters: + - IP will be directly assigned without change. + - Port assignment: `dport/sport = (dport/sport - nat_dport/sport_base) + nat_dport/sport`. + - If IP version doesn’t match, this action will fail and acting as no-op. diff --git a/documentation/general/dash-sai-pipeline-packet-flow.md b/documentation/general/dash-sai-pipeline-packet-flow.md new file mode 100644 index 000000000..5aeb76e32 --- /dev/null +++ b/documentation/general/dash-sai-pipeline-packet-flow.md @@ -0,0 +1,888 @@ +# DASH-SAI pipeline packet flow + +1. [1. Overview](#1-overview) +2. [2. Data path logical architecture stack](#2-data-path-logical-architecture-stack) +3. [3. Packet Structure](#3-packet-structure) +4. [4. Pipeline Overview](#4-pipeline-overview) +5. [5. Pipeline components](#5-pipeline-components) + 1. [5.1. Per-packet metadata bus](#51-per-packet-metadata-bus) + 2. [5.2. Packet parsing](#52-packet-parsing) + 1. [5.2.1. Multi-layer encap parsing](#521-multi-layer-encap-parsing) + 3. [5.3. Direction Lookup](#53-direction-lookup) + 4. [5.4. Pipeline Lookup](#54-pipeline-lookup) + 5. [5.5. Packet Decap](#55-packet-decap) + 1. [5.5.1. Multi-layer encap handling](#551-multi-layer-encap-handling) + 2. [5.5.2. Stateless decap vs stateful decap](#552-stateless-decap-vs-stateful-decap) + 3. [5.5.3. Encap fields handling](#553-encap-fields-handling) + 1. [5.5.3.1. Handling DSCP](#5531-handling-dscp) + 2. [5.5.3.2. Handling TTL](#5532-handling-ttl) + 4. [5.5.4. Encap preservation](#554-encap-preservation) + 6. [5.6. Conntrack Lookup and Update](#56-conntrack-lookup-and-update) + 1. [5.6.1. Flow lookup](#561-flow-lookup) + 2. [5.6.2. Flow creation](#562-flow-creation) + 1. [5.6.2.1. Tunnel learning](#5621-tunnel-learning) + 2. [5.6.2.2. Asymmetrical encap handling](#5622-asymmetrical-encap-handling) + 3. [5.6.3. Flow resimulation](#563-flow-resimulation) + 7. [5.7. Pre-pipeline ACL and Post-pipeline ACL](#57-pre-pipeline-acl-and-post-pipeline-acl) + 8. [5.8. Routing actions and routing types](#58-routing-actions-and-routing-types) + 1. [5.8.1. Routing action](#581-routing-action) + 2. [5.8.2. Routing type](#582-routing-type) + 9. [5.9. Matching stages and metadata publishing](#59-matching-stages-and-metadata-publishing) + 1. [5.9.1. Matching stage](#591-matching-stage) + 2. [5.9.2. Pipeline profile and stage connections](#592-pipeline-profile-and-stage-connections) + 3. [5.9.3. Stage transitions](#593-stage-transitions) + 1. [5.9.3.1. Stage transition routing type](#5931-stage-transition-routing-type) + 2. [5.9.3.2. Stage skipping](#5932-stage-skipping) + 3. [5.9.3.3. Multi-stage chaining](#5933-multi-stage-chaining) + 4. [5.9.4. Action publishing](#594-action-publishing) + 5. [5.9.5. Metadata publishing](#595-metadata-publishing) + 10. [5.10. Action apply](#510-action-apply) + 11. [5.11. Meter update](#511-meter-update) +6. [6. Examples](#6-examples) + 1. [6.1. VNET routing](#61-vnet-routing) + 2. [6.2. VM level public IP inbound (L3 DNAT)](#62-vm-level-public-ip-inbound-l3-dnat) + 3. [6.3. VM level public IP outbound (L3 SNAT)](#63-vm-level-public-ip-outbound-l3-snat) + 4. [6.4. Load balancer (L4 DNAT)](#64-load-balancer-l4-dnat) + 5. [6.5. More](#65-more) + +## 1. Overview + +DASH-SAI pipeline packet flow is the core of the DASH project. It defines from device perspective, how the traffic is modeled in DASH, packets gets processed and transformation gets applied to the packets. + +DASH-SAI pipeline is designed to work as a general purpose network function pipeline. Similar to [SAI](https://github.com/opencomputeproject/SAI), it works as a shim layer on top of DPU/ASIC SDKs, provides a set of low level hardware agnostic APIs that exposes the generic DPU primitives to the upper layer. So, the pipeline itself is not limited to any specific network function, but can be used to implement any network function. + +## 2. Data path logical architecture stack + +[DASH HLD](https://github.com/sonic-net/DASH/blob/main/documentation/general/dash-high-level-design.md) + and and [SDN Pipeline Basic Elements](https://github.com/sonic-net/DASH/blob/main/documentation/general/sdn-pipeline-basic-elements.md) already provided a very good high level overview on the system architecture. And here, we are going to dive a bit deeper from the data path perspective. + +![DASH data path overview](./images/dash-data-path-overview.svg) + +DASH-SAI APIs are designed to be generic, with the intent to set up the data path in different ways as needed. + +- The simplest way to set up the data path is to use the DASH-SAI APIs to create your pipeline and offload all your policy to ASIC. +- If your application requires more advanced policy, then the techonology provider could also provide a inbox data plane app to implement these policies. And still, this is transparent to the upper layer, everything is hidden under the SAI level. +- If even more customized or complicated pipelines are needed for certain traffic, we could also provide our own customized data plane app and use the DASH policy to instruct the ASIC to trap these packets up when they shows up. + +## 3. Packet Structure + +Before diving into the pipeline and packet flow, to better describe the behaviors, let's first have a clear understanding on the packet structure that DASH supports. + +Overall, the high-level packet structure looks like below: + +- The inner most packet is the customer input, which is called overlay. +- The first encap is called underlay0, which is the most frequently used layer to implement any virtual network function, such as VNET routing, load balancer, etc. +- On top of underlay0, we can extend and have more layer of encaps, which can be used for implementing additional routing hops. + +| ... (Outer most) | 2 | 1 | 0 (Inner most) | +| - | - | - | - | +| **...** | **Underlay 1** | **Underlay 0** | **Overlay** | + +Today, DASH supports up to 2 layers of encaps: underlay0 and underlay1. + +## 4. Pipeline Overview + +DASH-SAI pipeline is modeled as a list of stages. Each stage defines its own tables, and use the table entries to match packets per the processing logic inside the match-action pipeline (key, action id, action data), and publish the corresponding metadata when an entry is matched. After all stages are processed, a list of final routing actions will be defined. Then, by executing these routing actions, the packet will be transformed accordingly, and corresponding flows will be generated for the direction of the packet. + +At a high level the pipeline looks like below: + +```mermaid +flowchart TB + PP[Packet
Parsing] + DL[Direction
Lookup] + PL[Pipeline
Lookup] + PD[Packet
Decap] + + subgraph P0[DASH Pipeline 0] + subgraph In0[Inbound Pipeline] + CTL0[Conntrack
Lookup] + PreACL0[Pre-pipeline
ACL] + MATS0[Matching
Stages] + AA0[Action
Apply] + PostACL0[Post-pipeline
ACL] + CTU0[Conntrack
Update] + MS0[Meter
Update] + end + + subgraph Out0[Outbound Pipeline] + CTL1[Conntrack
Lookup] + PreACL1[Pre-pipeline
ACL] + MATS1[Matching
Stages] + AA1[Action
Apply] + PostACL1[Post-pipeline
ACL] + CTU1[Conntrack
Update] + MS1[Meter
Update] + end + end + + subgraph P1[DASH Pipeline 1] + In1[Inbound Pipeline
...] + Out1[Outbound Pipeline
...] + end + + Out[Packet
Out] + + PP --> DL + DL --> PL + PL --> PD + + PD --> In0 + PD --> Out0 + PD --> In1 + PD --> Out1 + PD --> |No Pipeline
Match| Out + + CTL0 --> |Flow Miss| PreACL0 + CTL0 --> |Flow Hit| AA0 + PreACL0 --> MATS0 + MATS0 --> AA0 + AA0 --> |Flow Miss| PostACL0 + PostACL0 --> CTU0 + AA0 --> |Flow Hit| MS0 + AA0 --> |Flow Change| CTU0 + CTU0 --> MS0 + MS0 --> Out + + CTL1 --> |Flow Miss| PreACL1 + CTL1 --> |Flow Hit| AA1 + PreACL1 --> MATS1 + MATS1 --> AA1 + AA1 --> |Flow Miss| PostACL1 + PostACL1 --> CTU1 + AA1 --> |Flow Hit| MS1 + AA1 --> |Flow Change| CTU1 + CTU1 --> MS1 + MS1 --> Out +``` + +This design allows our upper layers to be flexible and doesn't limit to any specific object models for modeling their own policies. For example, [SONiC-DASH pipeline](https://github.com/sonic-net/SONiC/blob/master/doc/dash/dash-sonic-hld.md#2-packet-flows) uses DASH-SAI pipeline to implement VNET routing scenarios by translating the [SONiC DASH APIs](https://github.com/sonic-net/sonic-dash-api/tree/master/proto) to DASH-SAI model: + +- A DASH-SAI pipeline is used to represent a VM NIC (ENI). +- The VxLAN VNI is used to do the direction lookup. +- The inner MAC address is used for pipeline lookup, a.k.a. ENI lookup (ENI). +- Once it enters the corresponding DASH pipeline, the `outbound` pipeline will be used to process the packets sourced from the VM, while the `inbound` pipeline will be used to process the packets destined to the VM. + +## 5. Pipeline components + +### 5.1. Per-packet metadata bus + +First of all, since we have multiple matching stages in the pipeline, we need a way to pass the information from the matched entries in the earlier stages to the later ones to help us make final decisions on packet transformation. And this is what metadata bus is for. + +At high-level, the metadata bus is a set of fields that are carried throughout the pipeline along with the packet. It contains: + +- The information from the original packet, such as encap information. +- The information from each matched entry and related data structures, e.g., when a VNET mapping entry is matched, we will publish the information from VNET to the metadata bus. +- The routing action and its inline parameters from the matched entry. + +Implementation-wise, this is similar to Packet Header Vector or Bus in NPL. + +### 5.2. Packet parsing + +In an ASIC, the parser is usually the first stage of the pipeline. It parses the incoming packet and extracts the information into the metadata bus, such as the source and destination MAC, IP, etc. And based on this information, we will invoke the rest of pipeline. + +#### 5.2.1. Multi-layer encap parsing + +Multi-layer encap generates a problem in the packet parsing, because of the encap layer detection and overlay packet handling: + +1. In an ASIC, the parser is always parsing from the outermost bits to innermost bits. However, in DASH, the encap stack is defined reversely: underlay1 -> underlay0 -> overlay. Because the incoming packet could have various number of encaps, we need to be able to map the encaps to the right layer. +2. The overlay (customer) packet could be also using encaps, so we need to be able to tell which one is ours and which one is overlay. +3. The incoming packet could have various number of encaps, and each encap is not aware whether the inner packet is a overlay or not. For example, from the SDN pipeline basic element doc, the [Inbound from LB](./sdn-pipeline-basic-elements.md#inbound-from-lb) and [Internal Load Balancer in VNET communication](./sdn-pipeline-basic-elements.md#internal-load-balancer-in-vnet-communication) actually shares the same outer-most header. + +To solve this problems, we use 2 methods for encap handling: + +1. We can specify if parser should stop parsing more encaps or not for the VNI: + + ```json + { "DASH_SAI_VNI_TABLE|12345": { "direction": "outbound", "final_encap": true } } + ``` + + When `final_encap` is set to true, the VNI will be sent to parser to force the parser to treat the next layer as overlay packet. + +2. Since the parser doesn't know how many encaps existed prior, the parser can always start treating the outermost layer as underlay1. And whenever it sees that the protocol is not an encap, or the VNI is unknown, it will treat the packet as overlay packet. Then, after parsing is complete, we will fix the encap information in metadata bus. + + For example, in the [Inbound from LB](./sdn-pipeline-basic-elements.md#inbound-from-lb) case, the outer encap will initially be mapped to underlay1, the ethernet and IP part of the inner packet will be mapped into underlay0, while the TCP/UDP part will be mapped into overlay. Then, after parsing, we will extract the ethernet and IP parts in underlay0 as overlay, as well as extract the underlay1 as underlay0. + +### 5.3. Direction Lookup + +In the DASH-SAI pipeline, traffic has 2 directions: `inbound` and `outbound`. Each direction has its own pipeline (see pipeline overview above). When a new packet arrives, we will assign a direction to the packet, then process the packet in the corresponding pipeline. This ensures we match the flow and transform the packet correctly. + +### 5.4. Pipeline Lookup + +DASH supports a multi-tenancy model for traffic handling. A single device can have multiple pipelines, and each pipeline is used to handle traffic for a specific tenant, or the intended network function being modeled (such as a load balancer). When a packet arrives, besides direction lookup, we also need pipeline lookup to determine which pipeline to use for processing the packet. + +For example, if we like to implement a VM NIC with DASH-SAI pipeline, then we can model one pipeline as one NIC, then use the inner packet MAC to find the pipeline. However, if we would like to implement a load balancer, we can use a DASH-SAI pipeline to represent a load balancer instance and use the Public IP to find the pipeline. + +```mermaid +flowchart TD + subgraph ENI + EL[ENI Lookup] + + EP0[ENI 0 Pipeline] + EP1[ENI 1 Pipeline] + EP2[ENI 2 Pipeline] + end + + subgraph LoadBalancer + VL[Vip Lookup] + + LBP0[LB 0 Pipeline] + LBP1[LB 1 Pipeline] + LBP2[LB 2 Pipeline] + end + + EL --> |ENI 0| EP0 + EL --> |ENI 1| EP1 + EL --> |ENI 2| EP2 + + VL --> |LB 0| LBP0 + VL --> |LB 1| LBP1 + VL --> |LB 2| LBP2 +``` + +A pipeline can also define its initial matching stages, which will be used to start processing the packets if no flow is matched. + +> NOTE: +> +> The DASH-SAI pipeline is a logical concept. It doesn't have to be a 1 to 1 mapping to a physical ASIC pipeline. The underlying implementation can be as simple as a metadata field update with a specific value, when the entry is matched, e.g., `ENI = Inner Source/Destination MAC`. + +### 5.5. Packet Decap + +If a pipeline is found, all outer encaps will be decap'ed before processing the packets, exposing the inner most packet going through the pipeline. This simplifies the flow matching logic and also allow us to create the reverse flow properly. + +As [Packet Parsing](#52-packet-parsing) section described, this will not cause any key information to be lost, as they are saved in metadata bus, such as encap type, source IP and VNI / GRE Key. + +#### 5.5.1. Multi-layer encap handling + +The incoming packet to DASH pipeline could have multiple layers of encap, however, the ASIC capacity is usually limited. The more encaps we handle in the parser and decaps, adds latency. Furthermore, using packet recirculation is also not ideal, because it can greatly reduce throughput and increase latency. + +The limit of having 2 layers of encap at maximum is an attempt to help this problem and avoid the pipeline potentially experiencing unexpected latency. + +#### 5.5.2. Stateless decap vs stateful decap + +During the direction lookup stage, all other encaps will be examined, such as VNI lookup. For each VNI or GRE key, we can specify whether it is stateless or stateful. + +Although the encap information will still be saved in the metadata bus, however, for stateless decap, we will not create the encap for the reverse flow. Otherwise (for the stateful decap), we will create the encap for the reverse flow by reversing the source and destination information. + +```json +{ + "DASH_SAI_VNI_TABLE|12345": { "direction": "outbound", "stateless": false }, + "DASH_SAI_VNI_TABLE|12346": { "direction": "outbound", "stateless": true } +} +``` + +#### 5.5.3. Encap fields handling + +##### 5.5.3.1. Handling DSCP + +The DASH pipeline provides 2 modes for handling the DSCP: "Preserve model" and "Pipe model". + +Preserve model works very similar to `SAI_TUNNEL_DSCP_MODE_UNIFORM_MODEL` with a slight difference: + +- The DSCP value of outer most encap header will be preserved. +- When any encap being added, the preserved DSCP value will be copied to the new encap header. +- The DSCP value of overlay packet (customer packet) shall never be modified or preserved and copied to the outer header. + +On the other hand, pipe model works very similar to `SAI_TUNNEL_DSCP_MODE_PIPE_MODEL`: + +- The DSCP value of existing encaps will not be preserved. +- When any encap being added, the DASH pipeline will specify the DSCP value, and all routing action will take this value and copy it to the encaps. + +If no encaps are added, say, for traffic sending to Internet, the DSCP value of overlay packet will be exposed as it is, even-if original packet arrives with a non-zero value. + +This gives the cloud infra full control over the DSCP value and will prevent the customer from spoofing the fields. + +##### 5.5.3.2. Handling TTL + +TTL behavior for encap shall be "pipe" model (similar to SAI_TUNNEL_TTL_MODE_PIPE_MODEL): + +- When adding encaps, TTL value shall be default set to 64. +- DASH pipeline shall not modify the TTL values in the overlay packet (customer packet). + +#### 5.5.4. Encap preservation + +Sometimes, depending upon the scenario to implement, the customer might want to preserve certain original encaps in the outgoing traffic. For example, say we receive a packet with structure: overlay -> underlay0 -> underlay1 -> underlay2. And we want to remove or update underlay0, preserve underlay1 and remove underlay2. This gives us the problem of handling all the CRUD combinations of all encaps, including structure changes: after removing underlay0, should underlay1 becomes underlay0 or should we keep it as underlay1? All these questions affect the encap related routing actions and final packet we create. + +Since all of the encap information is preserved in the metadata bus for flow creation, to solve this problem, we can simply recreate them in the manner we want using the routing action: `tunnel_from_encap`. It allows the source and target encap and their override value to be set, which allows us to preserve the encaps exactly as intended, and also ensures the clarity of final transformation performed in the end. + +Please note that: Encap preservation will not affect the reverse tunnel creation as "Stateless decap vs stateful decap" section described above. A encap can be preserved as well as used in reverse tunnel creation at the same time, since they are essentially 2 different things. + +### 5.6. Conntrack Lookup and Update + +After entering a specific pipeline, the first stage will be the Conntrack Lookup stage, which performs the flow lookup. If any flow is matched, the saved actions will be applied, the metering counters will be updated, and the rest of pipeline will be exited. + +The core of the Conntrack Lookup and Update stage is the flow table. + +#### 5.6.1. Flow lookup + +First, let's define the flow lookup behavior. + +The flow lookup **MUST** use the information of inner most packet. And the matching keys can be configurated via the DASH flow APIs during the DASH initialization. This allows us to support different flow matching behaviors for specific cases. For example, in L3 level routing, we don't need to create 5 tuple flows. + +After the flow lookup, if a flow is matched, we will apply the saved actions in the flow direction and exit the rest of the pipeline. Otherwise, we will continue the pipeline processing. + +#### 5.6.2. Flow creation + +For new connections, after all packet transformations are applied, we will create a new flow in the flow table. + +Since a connection can be bi-directional, the flows need to be created as flow pairs: the one in the same direction as the packet is usually called forwarding flow, while the other direction is called reverse flow. Of course, the flow pairs **MUST** be stored based on the pipeline direction. + +- When the outbound pipeline creates a flow, the forwarding flow should be created on the outbound side, while the reverse flow should be created on the inbound side. +- When the inbound pipeline creates a flow, it creates the flow in reverse way. + +And here is how to create the flow pairs: + +- The forwarding flow creation is straight forward, because all the final transformations are defined in the flow actions and metadata bus. +- To properly create the reverse flow, we will learn the information from the original tunnels, and reverse them as return encaps, which is why we need to save all the original tunnel information when doing packet decaps. + +##### 5.6.2.1. Tunnel learning + +You might already notice that, although we uses the outer encap from the original packet to create the reverse flow, but the outer encaps are decap'ed and not used in flow matching. This creates a problem when source side fails over. Like the graph shows below, the traffic shifted from VTEP 1 (Green side) to VTEP 2 (Blue side), which changes the source IP in the encap. If we don't do anything (such as save the information), the existing reverse flow will continue to send the packet back to green side and cause the traffic to be dropped. + +![Tunnel learning](./images/dash-tunnel-learning.svg) + +To address this problem, the source information of each encap **MUST** be saved in the flow and compared during flow match. These information should no be part of the key, but whenever they change, we should reprocess the packet and update the saved reverse tunnel in the existing flow. + +##### 5.6.2.2. Asymmetrical encap handling + +There could be cases where the encaps are asymmetrical, which means the incoming packet and return packet use different encaps. For example, in the case below, the encap of step 2 and 4 are not symmetrical. This means we could never recreate the flow on the DASH pipeline 2 side to tunnel the packet into the extra hop first with our current flow creation logic. + +![Asymmetrical encap](./images/dash-asymmetrical-encap.svg) + +To fix this issue, a special action called `reverse_tunnel` is defined, which enables reverse side of the encaps. + +#### 5.6.3. Flow resimulation + +In the event of a policy change, we might need to update the flows associated with the policies. For example, when a VM is moved to another location, the VNET mapping entry will be changed, and we need to update the existing flows associated with the VNET mapping entry. Otherwise, the outgoing traffic will be tunneled to an incorrect location. This is called flow resimulation. + +However, the flow resimulation is not as simple as removing the flow and sending the packet through the pipeline again. For example: + +- When a ACL is changed in the outbound side, all flows needs to be resimulated. However, this cannot be implemented by removing all flow entries and let all flows to be recreated with the latest policy. The reason is that ACLs can be asymmetric and flows are created in pair. If the flows are removed, the inbound side traffic will be dropped immediately, because there is no inbound flow to make it bypass the ACLs. +- Certain actions might need to bypass the flow resimulation to maintain the per flow consistency. For example, in a load balancer case, we will want to ensure that flow resimulation will not cause the pipeline to forward existing connections to a different backend server. + +These requires us to implement the flow resimulation in a more sophisticated way, which is not fully modeled in DASH today. But we will come back to this design later. + +### 5.7. Pre-pipeline ACL and Post-pipeline ACL + +Pre-pipeline ACL and Post-pipeline ACL are used to drop the unexpected traffic before and after the packet transformation. It works as below: + +1. As the high-level pipeline shows above, if an incoming packet hits a flow (i.e. is in the FastPath), it will skip matching all the ACLs. If an incoming packet is denied by a ACL, the packet will be dropped without creating a flow. +2. Both the outbound and inbound pipeline have their own ACL stages, and are used for matching the packets in their own direction. + +A typical usage of the ACLs is to implement security policies. For example, in SONiC-DASH pipeline, we use the pre/post-pipeline ACLs to implement the underlay and overlay ACLs in both directions, where overlay ACLs will be used for implementing customer policies, while underlay ACLs will be used for implementing the infrastructure policies. + +```mermaid +flowchart TD + subgraph Outbound Pipeline + Out_PreACL[Overlay ACL
# Outbound Pre-Pipeline ACL #] + Out_MS[Match Stages] + Out_PostACL[Underlay ACL
# Outbound Post-Pipeline ACL #] + end + + subgraph Inbound Pipeline + In_PreACL[Underlay ACL
# Inbound Pre-Pipeline ACL #] + In_MS[Match Stages] + In_PostACL[Overlay ACL
# Inbound Post-Pipeline ACL #] + end + + Out_PreACL --> Out_MS + Out_MS --> Out_PostACL + + In_PreACL --> In_MS + In_MS --> In_PostACL +``` + +### 5.8. Routing actions and routing types + +#### 5.8.1. Routing action + +In DASH-SAI pipeline, routing actions are the fundamental building blocks for packet transformations. Each routing action is designed to work as below: + +1. Take a specific list of metadata fields as input parameters: + 1. For example, `staticencap` action will take the `underlay_dip`, `underlay_sip`, `encap_type` and `encap_key` to encapsulate the packet. + 2. The parameters can come from 2 places - the metadata defined associated with the entries in each table, or the routing action definition itself. More details will be discussed in the next section. +2. Transform the packet in a specific way, e.g., encapsulate the packet, NAT'ing the address and port, etc. +3. Independent to other actions. + 1. With this design, we don't have to worry about the order of the actions. + 2. This also enables the hardware to improve the E2E pipeline latency by executing the actions in parallel. + +Take `staticencap` as an example, it can be defined as below: + +- Action parameters: + - `encap_type`: "nvgre|vxlan|..." +- Metadata parameters: + - `underlay_dip`: Destination IP used in encap. + - `underlay_sip`: Source IP used in encap. + - `encap_key`: GRE key in NvGRE or VNI in VxLAN +- Actions: + - Enable the underlay0 encap header based on the `encap_type`. + - Update the underlay0 encap header with `encap_key`, `underlay_dip`, `underlay_sip`. + +More routing action definitions can be found in the doc here: [DASH routing actions](../dataplane/dash-routing-actions.md). + +#### 5.8.2. Routing type + +To implement a network function, we usually need to do multiple packet transformations, such as adding a tunnel and NAT'ing the address or port. This requires us to be able to combine multiple routing actions together, and this is what routing type is for. + +In DASH-SAI pipeline, routing type is defined as a list of routing actions. Each routing type can support at maximum 5 routing actions. And by combining different routing actions into different routing types, we will be able to implement different network functions. + +For example: + +- We can implement the VNET routing by creating a routing type named `vnet` with only 1 action `staticencap`, which takes the next hop information from the mapping table. +- We can also add additional hop to tunnel the traffic to an firewall or network virtual appliance first, which is known as [UDR](https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-udr-overview), by creating another routing type named `vnetfw` with a `staticencap` action and an extra `tunnel` actions. +- We can even use `tunnel` action with multiple destinations as ECMP group to implement a simple load balancer! + +This combination of routing actions is very flexible and powerful, and it enables us to implement any network function we want. + +### 5.9. Matching stages and metadata publishing + +#### 5.9.1. Matching stage + +Matching stage is the one of the core part of the DASH-SAI pipeline and the components that gives the pipeline flexibility. + +In DASH-SAI pipeline, a matching stage is a basic building block for packet matching and metadata publishing. And the DASH-SAI pipeline basically works as matching and metadata publishing until the final routing actions are executed. Currently, we support the following types of matching stages: + +| Stage type | Match Type | Match Fields | Metadata Behavior | +| ---------- | ---------- | ------------ | -------- | +| Routing | LPM | Source IP or Destination IP | Publish metadata from matched routing entry | +| IP Mapping | Exact Match | Source IP or Destination IP | Publish metadata from matched VNET and VNET mapping entry | +| Port Mapping | Range Match | Source Port + Destination Port | Publish metadata from matched port mapping entry | + +For more on the metadata publishing, please refer to the metadata publishing section below. + +#### 5.9.2. Pipeline profile and stage connections + +Ideally, when DASH initializes or whenever we create a new pipeline, by simply creating multiple numbers of different types of matching stages and connecting them in different ways, we can easily implement different pipeline and network functions. + +| Stage 0 | Stage 1 | Stage 2 | Stage 3 | Stage 4 | +| ------- | ------- | ------- | ------- | ------- | +| Routing 0 | IP Mapping 0 | Port Mapping | X | X | +| Routing 0 | Routing 1 | IP Mapping 0 | IP Mapping 1 | Port Mapping | +| Routing 0 | IP Mapping 0 | Port Mapping | Routing 1 | IP Mapping 1 | + +However, in reality, it might make the pipeline hard to implement, model, debug and validate or test at this moment. For example, changing matching fields, matching type and connection dynamically on pipeline creation is simply beyond the ability of P4, which is used by our behavior model today as well as many vendor's ASIC SDKs. + +To address this problem, a set of predefined pipeline profile are defined in DASH. And each profile has their own predefined stages and connections in the pipeline. + +For example, today the only profile we support is ENI, which is used to implement the VM NIC. To ensure we have enough flexibility: + +- The match stages are designed to be connected from larger range to smaller range as below. +- There are 2 routing and IP mapping stages in the pipeline, so we can support either source and destination IP matching, as well as 2 layers of routing. + +```mermaid +flowchart LR + Routing0[Routing 0] + Routing1[Routing 1] + Map0[IP Mapping 0] + Map1[IP Mapping 1] + TcpPortMap[TCP Port Mapping] + UdpPortMap[UDP Port Mapping] + + Routing0 --> | lpmrouting - 1 | Routing1 + Routing1 --> | maprouting - 0 | Map0 + Map0 --> | maprouting - 1 | Map1 + Map1 --> | portmaprouting | TcpPortMap + Map1 --> | portmaprouting | UdpPortMap +``` + +#### 5.9.3. Stage transitions + +##### 5.9.3.1. Stage transition routing type + +To transit between stages, we use `transition` field to specify the transition routing type. + +A transition routing type is a special type of [Routing Type](#572-routing-type): + +1. Each transition routing type can only have one single routing action. +2. Only a special list of routing actions will take effect in the routing types, which are all related to stage transitions, as listed below. +3. If `transition` field is not set, we consider the packet is reaching the end of the pipeline and start executing the final routing actions. + +| `action_type` value | Stage | +| ---------------- | ----- | +| `drop` | Drop the packet | +| `trap` | Sending it to CPU | +| `lpmrouting` | Skip to next routing stage | +| `maprouting` | Skip to next mapping stage | +| `portmaprouting` | Skip to next TCP or UDP Port Mapping stage | + +To help us to stay flexible, the transition routing actions can take a few parameters: + +- All transition routing actions other than `drop` and `trap`: + - `default_routing_type`: If no entry is found, use this routing type to route the packet. If `default_routing_type` is not set, the packet will be dropped by default. + - `stage_index`: If there are multiple stage of the same stage type, use this field to specify which stage to transit to. The index is starting from 0 and by default 0. +- IP-based routing actions (`lpmrouting` and `maprouting`): + - `use_src_ip`: Use source IP in routing and mapping stages. + - `ip_mask`: IP mask to apply before matching the entries. + +Here is an example that shows how the routing stage entry looks like: + +```json +// Routing stage entry: +// When this entry is matched, we will move to VNET mapping stage, which executes maprouting action and jump to VNET mapping stage. +"DASH_SAI_ROUTE_TABLE|123456789012|0|10.0.1.0/24": { + "transition": "vnetmap", + "vnet": "Vnet1" +} + +"DASH_SAI_ROUTING_TYPE_TABLE|vnetmap": [ + { + "action_type": "maprouting", + "stage_index": 0 + } +] +``` + +##### 5.9.3.2. Stage skipping + +To avoid loops appearing in the pipeline, the pipeline is designed to be forward only. When transition routing action is invoked, we can simply update the target stage in the metadata, then the transition behavior can simply be described by the code below: + +```c +apply { + // ... + if (meta.transit_to == DASH_MATCH_STAGE_MAPROUTING && meta.stage_index == 0) { + maprouting0.apply(); + } + if (meta.transit_to == DASH_MATCH_STAGE_MAPROUTING && meta.stage_index == 1) { + maprouting1.apply(); + } + // ... +} +``` + +This allows us easily bypass the stages as needed, also avoid loop being accidentally created. Take Routing stage + TCP flow as an example, it can use different transition to jump to different stages. + +```mermaid +flowchart LR + Routing0[Routing 0] + Routing1[Routing 1] + Map0[IP Mapping 0] + Map1[IP Mapping 1] + TcpPortMap[TCP Port Mapping] + UdpPortMap[UDP Port Mapping] + + Routing0 --> | lpmrouting - 1 | Routing1 + Routing0 --> | maprouting - 0 | Map0 + Routing0 --> | maprouting - 1 | Map1 + Routing0 --> | portmaprouting | TcpPortMap + Routing0 --> | portmaprouting | UdpPortMap + + Routing1 --> | maprouting - 0 | Map0 + Map0 --> | maprouting - 1 | Map1 + Map1 --> | portmaprouting | TcpPortMap + Map1 --> | portmaprouting | UdpPortMap +``` + +##### 5.9.3.3. Multi-stage chaining + +With multiple instances of the same stage type, we can chain the stages together to implement more complicated policies. + +For example, we can use 2 routing stages to implement 2 layers of routing with the second layer checking the source IP. + +```json +{ + "DASH_SAI_ROUTE_TABLE|123456789012|0|10.0.1.0/24": { + "transition": "srclpm", + // ... + }, + "DASH_SAI_ROUTING_TYPE_TABLE|srclpm": [{ "action_type": "lpmrouting", "stage_index": 1, "use_src_ip": true } ], + + "DASH_SAI_ROUTE_TABLE|123456789012|1|10.1.1.0/24": { + // ... + }, +} +``` + +Or, with a slight change, we can implement another routing policy to enable a tunnel for a special destination IP range. + +```json +{ + // First LPM + "DASH_SAI_ROUTE_TABLE|123456789012|0|10.0.1.0/24": { + "transition": "lpm2", + // ... + }, + "DASH_SAI_ROUTING_TYPE_TABLE|srclpm": [{ "action_type": "lpmrouting", "stage_index": 1 } ], + + // Second LPM + "DASH_SAI_ROUTE_TABLE|123456789012|1|10.0.1.128/25": { + "routing_type": "firewalltunnel", + "underlay1_tunnel_id": "firewall_tunnel_0" + }, + "DASH_SAI_ROUTING_TYPE_TABLE|firewalltunnel": [ { "action_type": "tunnel", "target": "underlay1" } ] +} +``` + +#### 5.9.4. Action publishing + +Each entry in the matching stages can specify a [routing type](#572-routing-type) that specifies the routing actions for specifying the packet transformations. When an entry is matched in the matching stages, the actions will be populated into the metadata bus, and the actions will be applied when the packet reaches the action apply stage. + +Populating the actions into the metadata bus are straightforward, which can be illustrated by the P4 code below: + +```c +enum bit<16> routing_action_type_t { + staticencap = 0, + nat = 1, + // ... +} + +action lpmrouting0_set_action(routing_action_type_t action0, ...) { + meta.stage0.action0 = action0; + // ... +} +``` + +Since we can specify the both transition and actions in a single entry, this allows us to stack the actions as the pipeline moves forward: + +```c +struct stage_actions_t { + bit<16> action0; + bit<16> action1; + // ... +} + +struct metadata_t { + stage_actions_t stage0; + stage_actions_t stage1; + // ... +} +``` + +#### 5.9.5. Metadata publishing + +Each entry in the matching stages can also specify a list of metadata. When an entry is matched in the matching stages, the metadata will be populated into the metadata bus, and the metadata will be used as the input parameters for the routing actions. These metadata are shared by all stages and actions, hence later ones will override the existing ones, if any. + +With this design, all the entries in each matching stage can all be defined similarly as below: + +```json +"DASH_SAI_SOME_ENTRY_TABLE|||": { + "transition": "", + "routing_type": "", + + // Metadata properties/attributes ... +} +``` + +Take the VNET mapping as an example. When following VNET mapping is matched, `underlay_dip`, `4to6_sip_encoding`, `4to6_dip_encoding` and `metering_class` will be published to the metadata bus. + +```json +// VNET mapping entry (VNET mapping stage) +"DASH_SAI_VNET_MAPPING_TABLE|Vnet1|0|10.0.1.1": { + "transition": "vnetportmap", + "routing_type": "do_something", + + // Underlay destination IP address. Used by staticencap action. + "underlay_dip": "3.3.3.1", + + // Overlay IP address encoding from v4 to v6. Used by 4to6 action. + "4to6_sip_encoding": "9988::/ffff::", + "4to6_dip_encoding": "1122:3344:5566:7788::0303:0301/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + + // Metering ID. Used in metering stage. + "metering_class": 60001 +} +``` + +This can be illustrated by the P4 code below: + +```c +struct metadata_t { + bit<32> underlay_dip; + // ... +} + +action vnetportmap0_set_metadata(bit<32> underlay_dip, ...) { + meta.underlay_dip = underlay_dip; + // ... +} +``` + +> NOTE: +> +> The Direction Lookup and Pipeline Lookup stages are also matching stages, so they can also populate metadatas too, e.g., ENI-level metadata for underlay encap. + +This design also allows us to decouples the time of fulfilling the routing actions and their parameters. + +For example, say, we have a network with this policy: all traffic that sends to an IP range needs to have a vxlan encap with encap key 12345, but different IP will have a different underlay IP. Also, for 10.0.1.1, a tunnel is enabled for tunneling traffic to a firewall first. Then this can be modeled as below: + +```json +{ + // Routing entry for the destiation. All destination shares the same encap. + "DASH_SAI_ROUTE_TABLE|123456789012|0|10.0.1.0/24": { + "transition": "vnetmap", + "routing_type": "vnetfwd", + "vnet": "Vnet1", + "encap_type": "vxlan", + "encap_key": "12345" + }, + "DASH_SAI_ROUTING_TYPE_TABLE|vnetmap": [ { "action_type": "maprouting" } ], + "DASH_SAI_ROUTING_TYPE_TABLE|vnetfwd": [ { "action_type": "static_encap" } ], + + // If we are sending to 10.0.1.1, this entry will be matched and delay set the underlay destination IP for staticencap action, also specify the tunnel action. + "DASH_SAI_VNET_MAPPING_TABLE|Vnet1|0|10.0.1.1": { + "routing_type": "firewalltunnel", + "underlay_dip": "3.3.3.1", + "underlay1_tunnel_id": "firewall_tunnel_0" + }, + "DASH_SAI_ROUTING_TYPE_TABLE|firewalltunnel": [ { "action_type": "tunnel", "target": "underlay1" } ] +} +``` + +### 5.10. Action apply + +After all matching stages are done, we will start applying all the actions. All the latest values in the metadata bus will be used as the input parameters for the routing actions. + +### 5.11. Meter update + +After all actions are applied, post-pipeline ACLs are passed, we will update the metering counters if any metering class is specified. + +## 6. Examples + +Here are some examples to demo how to apply the DASH-SAI pipeline to implement different network functions. They might not be up-to-date or complete policies, but mostly demoing the high level ideas. + +### 6.1. VNET routing + +```json +[ + // When sending to anywhere in the VNET, we start to lookup the destination + "DASH_SAI_ROUTE_TABLE|123456789012|0|10.0.1.0/24": { + "transition": "vnetmap", + "vnet": "Vnet1" + }, + "DASH_SAI_ROUTING_TYPE_TABLE|vnetmap": [ { "action_type": "maprouting" } ], + + // If we are sending to 10.0.1.1, this entry will be matched and set the underlay destination IP for staticencap action. + "DASH_SAI_VNET_MAPPING_TABLE|Vnet1|0|10.0.1.1": { + "routing_type": "vnetfwd", + "underlay_dip": "3.3.3.1", + } + + // The corresponding table level information will also be populated, in this case - "encap_key" + "DASH_SAI_VNET_TABLE|Vnet1": { + "name": "559c6ce8-26ab-4193-b946-ccc6e8f930b2", + "encap_key": 12345 + }, + + // This is the final routing type that gets executed because VNET mapping table gets matched, + // which addes the vxlan tunnel to the destination. + "DASH_SAI_ROUTING_TYPE_TABLE|vnetfwd": [ + { "action_type": "static_encap", "encap_type": "vxlan" } + ] +] +``` + +### 6.2. VM level public IP inbound (L3 DNAT) + +```json +[ + "DASH_SAI_ENI_TABLE|123456789012": { + "eni_id": "497f23d7-f0ac-4c99-a98f-59b470e8c7bd", + "admin_state": "enabled", + "mac_address": "12-34-56-78-90-12", + + // In inbound pipeline, this field will be published as underlay_dip used by staticencap action. + "underlay_ip": "100.0.0.1", + }, + + // Routing to the public IP. + "DASH_SAI_ROUTE_TABLE|123456789012|0|1.1.1.1/32": { + "routing_type": "l3nat", + + // Another way to implement the underlay encap is to use the underlay_dip in the routing entry. + "underlay_dip": "100.0.0.1", + + // NAT destination IP to VM IP. + "nat_dips": "10.0.0.1" + }, + + // This is the final routing type that gets executed. + // + // The nat action will nat the inner packet destination ip based on the nat_dips defined in the routing entry. + // If we have multiple IPs, they will be treated as an ECMP group. And algorithm can be defined as metadata in the routing entry as well. + "DASH_SAI_ROUTING_TYPE_TABLE|l3nat": [ + { "action_type": "nat" }, + { "action_type": "staticencap" } + ] +] +``` + +### 6.3. VM level public IP outbound (L3 SNAT) + +```json +[ + // Routing to Internet. + // This is a simple implementation, basically means if nothing else is matched. + "DASH_SAI_ROUTE_TABLE|123456789012|0|0.0.0.0/0": { + "routing_type": "l3nat", + "nat_sips": "1.1.1.1,2.2.2.2" + }, + + // This is the final routing type that gets executed. + // + // The nat action will nat the inner packet destination ip based on the nat_dips defined in the routing entry. + // If we have multiple IPs, they will be treated as an ECMP group. And algorithm can be defined as metadata in the routing entry as well. + "DASH_SAI_ROUTING_TYPE_TABLE|l3nat": [ + { "action_type": "nat" } + ] +] +``` + +### 6.4. Load balancer (L4 DNAT) + +```json +[ + // When any traffic is sent to any VIP that this DPU owns, we will start to lookup the destination. + "DASH_SAI_ROUTE_TABLE|123456789012|0|1.1.1.0/24": { + "transition": "vipmap", + "vnet": "vipmapping" + }, + "DASH_SAI_ROUTING_TYPE_TABLE|vipmap": [ { "action_type": "maprouting" } ], + + // If the packet is sent to 1.1.1.1, we start to do port mapping + "DASH_SAI_VNET_MAPPING_TABLE|Vnet1|0|1.1.1.1": { + "transition": "vipportmap", + "port_mapping_id": "lb-portmap-1-1-1-1" + } + "DASH_SAI_ROUTING_TYPE_TABLE|vipportmap": [ { "action_type": "maprouting" } ], + + // Load balancing rule for port 443. + "DASH_SAI_TCP_PORT_MAPPING_TABLE|lb-portmap-1-1-1-1": [ + { + "routing_type": "lbnat", + + "src_port_min": 0, + "src_port_max": 65535, + "dst_port_min": 443, + "dst_port_max": 443, + + // Specify the VTEP info for the backend pool. + "underlay0_tunnel_id": "lb-backend-pool-vtep-1-1-1-1-443", + + // NAT destination IP to multiple VM IPs as ECMP group and a different port. + "nat_dips": "10.0.0.1,10.0.0.2", + "nat_dport": "8443" + } + ] + + // Tunnel to VTEP for getting right underlay info. + "DASH_SAI_ROUTING_TUNNEL_TABLE|lb-backend-pool-vtep-1-1-1-1-443": { + "name": "lb-backend-pool-vtep-1-1-1-1-443", + "dips": "100.1.0.1,100.1.0.2", + "sip": "100.0.0.1", + "encap_type": "vxlan", + "encap_key": 12345 + } + + // This is the final routing type that gets executed. The tunnel_nat action will nat the inner packet destination + // from public ip to VM IP, also adds the corresponding vxlan tunnel to the destination. + // + // To start simple, all destination IPs can be treated as an ECMP group. And algorithm can be defined as metadata + // in the VIP entry as well. + "DASH_SAI_ROUTING_TYPE_TABLE|lbnat": [ + { "action_type": "tunnel", "target": "underlay0" }, + { "action_type": "nat" } + ] +] +``` + +### 6.5. More + +- [SONiC-DASH packet flows](https://github.com/sonic-net/SONiC/blob/master/doc/dash/dash-sonic-hld.md#2-packet-flows) diff --git a/documentation/general/images/dash-asymmetrical-encap.svg b/documentation/general/images/dash-asymmetrical-encap.svg new file mode 100644 index 000000000..f87d3dec6 --- /dev/null +++ b/documentation/general/images/dash-asymmetrical-encap.svg @@ -0,0 +1,4 @@ + + + +
2
2
DASH Pipeline 1
(IP: 1.1.1.1)
(ECMP Group Entry 1)
DASH Pipeline 1...
Extra Hop
(PA: 100.0.1.1)
Extra H...
3
3
From Extra Hop to VM
From Extra Hop to VM
Eth
Eth
SRC, DST=...
SRC, DST=...
NvGRE
NvGRE
DST=3.3.3.1
DST=3.3.3.1
Eth
Eth
SRC=<ER ENI MAC>
SRC=<ER ENI MAC>
IPv6
IPv6
DST=10.0.0.1
DST=10.0.0.1
From VM to DASH
From VM to DASH
Eth
Eth
SRC, DST = ...
SRC, DST = ...
NvGRE
NvGRE
SRC=3.3.3.1
SRC=3.3.3.1
Eth
Eth
DST=<ER ENI MAC>
DST=<ER ENI MAC>
IP
IP
SRC=10.0.0.1
SRC=10.0.0.1
4
4
VM
(Overlay IP: 10.0.0.1)
(Underlay IP: 3.3.3.1)
VM...
From DASH to Extra Hop
From DASH to Extra Hop
Eth
Eth
SRC, DST=...
SRC, DST=...
VxLan
VxLan
DST=100.0.1.1
DST=100.0.1.1
Eth
Eth
SRC, DST=...
SRC, DST=...
NvGRE
NvGRE
DST=3.3.3.1
DST=3.3.3.1
Eth
Eth
SRC=<ER ENI MAC>
SRC=<ER ENI MAC>
IP
IP
DST=10.0.0.1
DST=10.0.0.1
Incoming to DASH
Incoming to DASH
Eth
Eth
SRC, DST=...
SRC, DST=...
VxLan
VxLan
DST=1.1.1.1
DST=1.1.1.1
Eth
Eth
SRC=<ER ENI MAC>
SRC=<ER ENI MAC>
IPv6
IPv6
DST=10.0.0.1
DST=10.0.0.1
1
1
DASH Pipeline 2
(IP: 1.1.1.1)
(ECMP Group Entry 2)
DASH Pipeline 2...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/documentation/general/images/dash-data-path-overview.svg b/documentation/general/images/dash-data-path-overview.svg new file mode 100644 index 000000000..e02beba68 --- /dev/null +++ b/documentation/general/images/dash-data-path-overview.svg @@ -0,0 +1,4 @@ + + + +
Hardware
Hardware
DASH capable ASICs
DASH capable ASICs
Kernel Space
Kernel Space
ASIC Driver
ASIC Driver
User Space
User Space
Technology Provider ASIC SDK
Technology Provide...
DASH-SAI APIs
DASH-SAI APIs
Technology Provider Data Plane App
Technology Provider...
Customized Data Plane App
Customized Data Plane A...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/documentation/general/images/dash-tunnel-learning.svg b/documentation/general/images/dash-tunnel-learning.svg new file mode 100644 index 000000000..c1ce8bf5a --- /dev/null +++ b/documentation/general/images/dash-tunnel-learning.svg @@ -0,0 +1,4 @@ + + + +
DASH
DASH
From VM to DASH
From VM to DASH
Eth
Eth
SRC, DST = ...
SRC, DST = ...
NvGRE
NvGRE
SRC=3.3.3.2
SRC=3.3.3.2
Eth
Eth
DST=<ER ENI MAC>
DST=<ER ENI MAC>
IP
IP
SRC=10.0.0.1
SRC=10.0.0.1
VM
(IP: 10.0.0.1)
VM...
From VM to DASH
From VM to DASH
Eth
Eth
SRC, DST = ...
SRC, DST = ...
NvGRE
NvGRE
SRC=3.3.3.1
SRC=3.3.3.1
Eth
Eth
DST=<ER ENI MAC>
DST=<ER ENI MAC>
IP
IP
SRC=10.0.0.1
SRC=10.0.0.1
VTEP 1
(IP: 3.3.3.1)
VTEP 1...
VTEP 2
(IP: 3.3.3.2)
VTEP 2...
Text is not SVG - cannot display
\ No newline at end of file From 572fbb1c6b8e804e2510f92ff831ad2d513799a8 Mon Sep 17 00:00:00 2001 From: Riff Date: Tue, 21 Nov 2023 12:20:16 -0800 Subject: [PATCH 73/75] Fix incorrect IP in SONiC-DASH HLD VNET to VNET example. (#459) --- documentation/general/dash-sonic-hld.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/general/dash-sonic-hld.md b/documentation/general/dash-sonic-hld.md index 4f1cc5fe5..122d38ed7 100644 --- a/documentation/general/dash-sonic-hld.md +++ b/documentation/general/dash-sonic-hld.md @@ -1242,7 +1242,7 @@ For the example configuration above, the following is a brief explanation of loo For the inbound direction, after Route/ACL lookup, pipeline shall use the "underlay_ip" as specified in the ENI table to VXLAN encapsulate the packet and VNI shall be the ```vm_vni``` specified in the APPLIANCE table - 5. Inbound packet destined to 10.1.2.5 with source PA 101.1.2.3 and VNI 45654 + 5. Inbound packet destined to 10.1.1.1 with source PA 101.1.2.3 and VNI 45654 a. After setting direction to inbound, the Route Rule table is looked up based on priority b. First Inbound rule gets hit as PR prefix and VNI key match c. PA validation is set to true and Vnet is given as Vnet1. From a4009bae94ddfc2d03aca86edac2b9ca36f3cf0f Mon Sep 17 00:00:00 2001 From: Meyappan Kulandaiyan <127501651+meyappank@users.noreply.github.com> Date: Wed, 22 Nov 2023 06:08:50 +0530 Subject: [PATCH 74/75] [SAI] wrong code generated in libsai #415 (#463) --- dash-pipeline/SAI/templates/saiapi.cpp.j2 | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 2ca9a3522..ad2fbb8b0 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -61,7 +61,8 @@ static sai_status_t dash_sai_create_{{ table.name }}( auto mf = matchActionEntry->add_match(); mf->set_field_id({{table['keys'][0].id}}); auto mf_exact = mf->mutable_exact(); - {{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); + //{{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}}); + {{table['keys'][0].field}}SetVal(static_cast(objId), mf_exact, {{ table['keys'][0].bitwidth }}); {% else %} // SAI object table with multiple P4 table keys // Copy P4 table keys from appropriate SAI attributes @@ -339,7 +340,14 @@ static sai_status_t dash_sai_create_{{ table.name }}( mf->set_field_id({{key.id}}); {% if key.match_type == 'exact' %} auto mf_exact = mf->mutable_exact(); - {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + //{{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + {% set keyfield = key.field %} + {% set bitwidth = key.bitwidth %} + {% if keyfield in ['ipaddr','mac'] or bitwidth in [24] %} + {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + {% else %} + {{key.field}}SetVal(static_cast(tableEntry->{{ key.sai_key_name | lower }}), mf_exact, {{key.bitwidth}}); + {% endif %} {% elif key.match_type == 'lpm' %} auto mf_lpm = mf->mutable_lpm(); {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_lpm, {{key.bitwidth}}); @@ -496,7 +504,14 @@ static sai_status_t dash_sai_remove_{{ table.name }}( mf->set_field_id({{key.id}}); {% if key.match_type == 'exact' %} auto mf_exact = mf->mutable_exact(); - {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + {% set keyfield = key.field %} + {% set bitwidth = key.bitwidth %} + {% if keyfield in ['ipaddr','mac'] or bitwidth in [24] %} + {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); + {% else %} + {{key.field}}SetVal(static_cast(tableEntry->{{ key.sai_key_name | lower }}), mf_exact, {{key.bitwidth}}); + {% endif %} + //{{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_exact, {{key.bitwidth}}); {% elif key.match_type == 'lpm' %} auto mf_lpm = mf->mutable_lpm(); {{key.field}}SetVal(tableEntry->{{ key.sai_key_name | lower }}, mf_lpm, {{key.bitwidth}}); From 056d03e998796d2cee29d874b4e901298b557b46 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Fri, 24 Nov 2023 19:31:14 +0100 Subject: [PATCH 75/75] [dash-SAI] Enable warnings as errors (#466) * [dash-SAI] Enable warnings as errors For better catching mistakes and bugs * Add missing api * Fix api struct name --- dash-pipeline/SAI/src/Makefile | 2 +- dash-pipeline/SAI/src/sai_dash_router_interface.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dash-pipeline/SAI/src/Makefile b/dash-pipeline/SAI/src/Makefile index 9b93dd754..5bcabb278 100644 --- a/dash-pipeline/SAI/src/Makefile +++ b/dash-pipeline/SAI/src/Makefile @@ -8,7 +8,7 @@ CXXFLAGS_COMMON+= -Wcast-align CXXFLAGS_COMMON+= -Wcast-qual CXXFLAGS_COMMON+= -Wconversion CXXFLAGS_COMMON+= -Wdisabled-optimization -#CXXFLAGS_COMMON+= -Werror # disabled until warnings will be fixed +CXXFLAGS_COMMON+= -Werror CXXFLAGS_COMMON+= -Wextra CXXFLAGS_COMMON+= -Wfloat-equal CXXFLAGS_COMMON+= -Wformat=2 diff --git a/dash-pipeline/SAI/src/sai_dash_router_interface.cpp b/dash-pipeline/SAI/src/sai_dash_router_interface.cpp index 5f8a45c51..743308e92 100644 --- a/dash-pipeline/SAI/src/sai_dash_router_interface.cpp +++ b/dash-pipeline/SAI/src/sai_dash_router_interface.cpp @@ -6,4 +6,9 @@ sai_router_interface_api_t dash_sai_router_interface_api_impl = { DASH_GENERIC_QUAD_API(router_interface) DASH_GENERIC_STATS_API(router_interface) + + .create_router_interfaces = 0, + .remove_router_interfaces = 0, + .set_router_interfaces_attribute = 0, + .get_router_interfaces_attribute = 0, };
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

r-@!iIsEfF@hlDUJDVYmlOpM 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

LF9x5^(rNyhNc9 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ŭrJBIPR&qHol&FO-axJ*f?w7NS1FU&QHM!c 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