diff --git a/dash-pipeline/SAI/specs/dash_acl.yaml b/dash-pipeline/SAI/specs/dash_acl.yaml index 378ccb2c5..879eca6f7 100644 --- a/dash-pipeline/SAI/specs/dash_acl.yaml +++ b/dash-pipeline/SAI/specs/dash_acl.yaml @@ -27,11 +27,11 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 50200087 + id: 37949057 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 25655048 + id: 21989040 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api.SaiApi name: dash_acl_rule @@ -194,116 +194,116 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 41950136 + id: 43936368 actions: SAI_DASH_ACL_RULE_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT - id: 32161567 + id: 24892843 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE - id: 20706700 + id: 26577723 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY - id: 28146588 + id: 31332881 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE - id: 31424218 + id: 24146215 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 43016664 + id: 48549629 actions: SAI_DASH_ACL_RULE_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT - id: 32161567 + id: 24892843 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE - id: 20706700 + id: 26577723 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY - id: 28146588 + id: 31332881 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE - id: 31424218 + id: 24146215 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 49695908 + id: 40869404 actions: SAI_DASH_ACL_RULE_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT - id: 32161567 + id: 24892843 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE - id: 20706700 + id: 26577723 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY - id: 28146588 + id: 31332881 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE - id: 31424218 + id: 24146215 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 49209582 + id: 49672642 actions: SAI_DASH_ACL_RULE_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT - id: 18858683 + id: 22622424 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE - id: 24263137 + id: 27458076 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY - id: 29962337 + id: 27228779 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE - id: 26077229 + id: 29275145 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 36478314 + id: 37932124 actions: SAI_DASH_ACL_RULE_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT - id: 18858683 + id: 22622424 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE - id: 24263137 + id: 27458076 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY - id: 29962337 + id: 27228779 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE - id: 26077229 + id: 29275145 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 39012793 + id: 46113118 actions: SAI_DASH_ACL_RULE_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT - id: 18858683 + id: 22622424 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE - id: 24263137 + id: 27458076 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY - id: 29962337 + id: 27228779 attr_param_id: {} SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE - id: 26077229 + id: 29275145 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_appliance.yaml b/dash-pipeline/SAI/specs/dash_appliance.yaml index 8119addc1..19f412e59 100644 --- a/dash-pipeline/SAI/specs/dash_appliance.yaml +++ b/dash-pipeline/SAI/specs/dash_appliance.yaml @@ -27,9 +27,9 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 41082190 + id: 45177948 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 29775410 + id: 17143042 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_direction_lookup.yaml b/dash-pipeline/SAI/specs/dash_direction_lookup.yaml index d92d63487..14cd33034 100644 --- a/dash-pipeline/SAI/specs/dash_direction_lookup.yaml +++ b/dash-pipeline/SAI/specs/dash_direction_lookup.yaml @@ -64,10 +64,10 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 44703784 + id: 49875338 actions: SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION - id: 17408972 + id: 32588257 attr_param_id: SAI_DIRECTION_LOOKUP_ENTRY_ATTR_DASH_ENI_MAC_OVERRIDE_TYPE: 1 diff --git a/dash-pipeline/SAI/specs/dash_eni.yaml b/dash-pipeline/SAI/specs/dash_eni.yaml index 25f5e2ff9..0651f9011 100644 --- a/dash-pipeline/SAI/specs/dash_eni.yaml +++ b/dash-pipeline/SAI/specs/dash_eni.yaml @@ -64,11 +64,11 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 36648123 + id: 39883185 actions: SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ACTION_SET_ENI: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ACTION_SET_ENI - id: 24618133 + id: 19019152 attr_param_id: SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID: 1 - !!python/object:utils.sai_spec.sai_api.SaiApi @@ -1642,9 +1642,9 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 45859274 + id: 38483381 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 27167550 + id: 30359009 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_flow.yaml b/dash-pipeline/SAI/specs/dash_flow.yaml index 5cf17b09b..fdbdd73a6 100644 --- a/dash-pipeline/SAI/specs/dash_flow.yaml +++ b/dash-pipeline/SAI/specs/dash_flow.yaml @@ -529,6 +529,45 @@ sai_apis: valid_only: null is_vlan: false deprecated: false + - !!python/object:utils.sai_spec.sai_attribute.SaiAttribute + name: SAI_FLOW_ENTRY_ATTR_DASH_FLOW_SYNC_STATE + description: Action parameter DASH flow sync state + type: sai_dash_flow_sync_state_t + attr_value_field: s32 + default: SAI_DASH_FLOW_SYNC_STATE_FLOW_MISS + isresourcetype: false + flags: CREATE_AND_SET + object_name: null + allow_null: false + valid_only: null + is_vlan: false + deprecated: false + - !!python/object:utils.sai_spec.sai_attribute.SaiAttribute + name: SAI_FLOW_ENTRY_ATTR_UNDERLAY0_SMAC + description: Action parameter underlay0 source MAC + type: sai_mac_t + attr_value_field: mac + default: vendor + isresourcetype: false + flags: CREATE_AND_SET + object_name: null + allow_null: false + valid_only: null + is_vlan: false + deprecated: false + - !!python/object:utils.sai_spec.sai_attribute.SaiAttribute + name: SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DMAC + description: Action parameter underlay0 destination MAC + type: sai_mac_t + attr_value_field: mac + default: vendor + isresourcetype: false + flags: CREATE_AND_SET + object_name: null + allow_null: false + valid_only: null + is_vlan: false + deprecated: false stats: [] p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: @@ -544,30 +583,33 @@ sai_apis: SAI_FLOW_ENTRY_ATTR_DASH_FLOW_ACTION: 3 SAI_FLOW_ENTRY_ATTR_METER_CLASS: 4 SAI_FLOW_ENTRY_ATTR_IS_UNIDIRECTIONAL_FLOW: 5 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_ENI_MAC: 6 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_VNET_ID: 7 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_IP_PROTO: 8 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_SRC_IP: 9 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_DST_IP: 10 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_SRC_PORT: 11 - SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_DST_PORT: 12 - SAI_FLOW_ENTRY_ATTR_UNDERLAY0_VNET_ID: 13 - SAI_FLOW_ENTRY_ATTR_UNDERLAY0_SIP: 14 - SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DIP: 15 - SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DASH_ENCAPSULATION: 16 - SAI_FLOW_ENTRY_ATTR_UNDERLAY1_VNET_ID: 17 - SAI_FLOW_ENTRY_ATTR_UNDERLAY1_SIP: 18 - SAI_FLOW_ENTRY_ATTR_UNDERLAY1_DIP: 19 - SAI_FLOW_ENTRY_ATTR_UNDERLAY1_SMAC: 20 - SAI_FLOW_ENTRY_ATTR_UNDERLAY1_DMAC: 21 - SAI_FLOW_ENTRY_ATTR_UNDERLAY1_DASH_ENCAPSULATION: 22 - SAI_FLOW_ENTRY_ATTR_DST_MAC: 23 - SAI_FLOW_ENTRY_ATTR_SIP: 24 - SAI_FLOW_ENTRY_ATTR_DIP: 25 - SAI_FLOW_ENTRY_ATTR_SIP_MASK: 26 - SAI_FLOW_ENTRY_ATTR_DIP_MASK: 27 - SAI_FLOW_ENTRY_ATTR_VENDOR_METADATA: 28 - SAI_FLOW_ENTRY_ATTR_FLOW_DATA_PB: 29 + SAI_FLOW_ENTRY_ATTR_DASH_FLOW_SYNC_STATE: 6 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_ENI_MAC: 7 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_VNET_ID: 8 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_IP_PROTO: 9 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_SRC_IP: 10 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_DST_IP: 11 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_SRC_PORT: 12 + SAI_FLOW_ENTRY_ATTR_REVERSE_FLOW_DST_PORT: 13 + SAI_FLOW_ENTRY_ATTR_UNDERLAY0_VNET_ID: 15 + SAI_FLOW_ENTRY_ATTR_UNDERLAY0_SIP: 16 + SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DIP: 17 + SAI_FLOW_ENTRY_ATTR_UNDERLAY0_SMAC: 18 + SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DMAC: 19 + SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DASH_ENCAPSULATION: 20 + SAI_FLOW_ENTRY_ATTR_UNDERLAY1_VNET_ID: 21 + SAI_FLOW_ENTRY_ATTR_UNDERLAY1_SIP: 22 + SAI_FLOW_ENTRY_ATTR_UNDERLAY1_DIP: 23 + SAI_FLOW_ENTRY_ATTR_UNDERLAY1_SMAC: 24 + SAI_FLOW_ENTRY_ATTR_UNDERLAY1_DMAC: 25 + SAI_FLOW_ENTRY_ATTR_UNDERLAY1_DASH_ENCAPSULATION: 26 + SAI_FLOW_ENTRY_ATTR_DST_MAC: 27 + SAI_FLOW_ENTRY_ATTR_SIP: 28 + SAI_FLOW_ENTRY_ATTR_DIP: 29 + SAI_FLOW_ENTRY_ATTR_SIP_MASK: 30 + SAI_FLOW_ENTRY_ATTR_DIP_MASK: 31 + SAI_FLOW_ENTRY_ATTR_VENDOR_METADATA: 33 + SAI_FLOW_ENTRY_ATTR_FLOW_DATA_PB: 34 - !!python/object:utils.sai_spec.sai_api.SaiApi name: flow_entry_bulk_get_session_filter description: flow entry bulk get session filter diff --git a/dash-pipeline/SAI/specs/dash_inbound_routing.yaml b/dash-pipeline/SAI/specs/dash_inbound_routing.yaml index 3a18d08f8..228223821 100644 --- a/dash-pipeline/SAI/specs/dash_inbound_routing.yaml +++ b/dash-pipeline/SAI/specs/dash_inbound_routing.yaml @@ -81,8 +81,8 @@ sai_apis: object_name: null allow_null: false valid_only: null - deprecated: false is_vlan: false + deprecated: false - !!python/object:utils.sai_spec.sai_attribute.SaiAttribute name: SAI_INBOUND_ROUTING_ENTRY_ATTR_METER_CLASS_OR description: Action parameter meter class or @@ -135,32 +135,32 @@ sai_apis: object_name: null allow_null: false valid_only: null - deprecated: false is_vlan: false + deprecated: false stats: [] p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 48545572 + id: 35881437 actions: SAI_INBOUND_ROUTING_ENTRY_ACTION_TUNNEL_DECAP: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_INBOUND_ROUTING_ENTRY_ACTION_TUNNEL_DECAP - id: 20241846 + id: 26741158 attr_param_id: SAI_INBOUND_ROUTING_ENTRY_ATTR_METER_CLASS_OR: 1 SAI_INBOUND_ROUTING_ENTRY_ATTR_METER_CLASS_AND: 2 SAI_INBOUND_ROUTING_ENTRY_ACTION_TUNNEL_DECAP_PA_VALIDATE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_INBOUND_ROUTING_ENTRY_ACTION_TUNNEL_DECAP_PA_VALIDATE - id: 32575252 + id: 26064107 attr_param_id: SAI_INBOUND_ROUTING_ENTRY_ATTR_SRC_VNET_ID: 1 SAI_INBOUND_ROUTING_ENTRY_ATTR_METER_CLASS_OR: 2 SAI_INBOUND_ROUTING_ENTRY_ATTR_METER_CLASS_AND: 3 SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP - id: 30272260 + id: 24482615 attr_param_id: {} SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE - id: 24066060 + id: 24695752 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_outbound_ca_to_pa.yaml b/dash-pipeline/SAI/specs/dash_outbound_ca_to_pa.yaml index 685d7142e..7c594d82e 100644 --- a/dash-pipeline/SAI/specs/dash_outbound_ca_to_pa.yaml +++ b/dash-pipeline/SAI/specs/dash_outbound_ca_to_pa.yaml @@ -261,7 +261,7 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 43335456 + id: 48765007 actions: SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_TUNNEL_MAPPING: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_TUNNEL_MAPPING diff --git a/dash-pipeline/SAI/specs/dash_outbound_routing.yaml b/dash-pipeline/SAI/specs/dash_outbound_routing.yaml index 8b8f499a1..05effc7b2 100644 --- a/dash-pipeline/SAI/specs/dash_outbound_routing.yaml +++ b/dash-pipeline/SAI/specs/dash_outbound_routing.yaml @@ -294,7 +294,7 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 44010720 + id: 38546097 actions: SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET @@ -367,9 +367,9 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 34522254 + id: 40572680 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 20489967 + id: 30077100 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_pa_validation.yaml b/dash-pipeline/SAI/specs/dash_pa_validation.yaml index 2c5728405..7a80e2d53 100644 --- a/dash-pipeline/SAI/specs/dash_pa_validation.yaml +++ b/dash-pipeline/SAI/specs/dash_pa_validation.yaml @@ -51,8 +51,8 @@ sai_apis: object_name: null allow_null: false valid_only: null - deprecated: false is_vlan: false + deprecated: false - !!python/object:utils.sai_spec.sai_attribute.SaiAttribute name: SAI_PA_VALIDATION_ENTRY_ATTR_IP_ADDR_FAMILY description: IP address family for resource accounting @@ -64,15 +64,15 @@ sai_apis: object_name: null allow_null: false valid_only: null - deprecated: false is_vlan: false + deprecated: false stats: [] p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 41827129 + id: 49415809 actions: SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT - id: 31497578 + id: 17521061 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_tunnel.yaml b/dash-pipeline/SAI/specs/dash_tunnel.yaml index d90724899..688357744 100644 --- a/dash-pipeline/SAI/specs/dash_tunnel.yaml +++ b/dash-pipeline/SAI/specs/dash_tunnel.yaml @@ -79,11 +79,11 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 44400659 + id: 49206552 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 27891720 + id: 27084508 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api.SaiApi name: dash_tunnel_member @@ -122,11 +122,11 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 40012474 + id: 41269458 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 23738116 + id: 19698973 attr_param_id: {} - !!python/object:utils.sai_spec.sai_api.SaiApi name: dash_tunnel_next_hop @@ -152,9 +152,9 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 34229686 + id: 37329198 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 31749609 + id: 17571304 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_vip.yaml b/dash-pipeline/SAI/specs/dash_vip.yaml index d0701c1a0..ff280333f 100644 --- a/dash-pipeline/SAI/specs/dash_vip.yaml +++ b/dash-pipeline/SAI/specs/dash_vip.yaml @@ -45,8 +45,8 @@ sai_apis: object_name: null allow_null: false valid_only: null - deprecated: false is_vlan: false + deprecated: false - !!python/object:utils.sai_spec.sai_attribute.SaiAttribute name: SAI_VIP_ENTRY_ATTR_IP_ADDR_FAMILY description: IP address family for resource accounting @@ -58,15 +58,15 @@ sai_apis: object_name: null allow_null: false valid_only: null - deprecated: false is_vlan: false + deprecated: false stats: [] p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 43450617 + id: 36083221 actions: SAI_VIP_ENTRY_ACTION_ACCEPT: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: SAI_VIP_ENTRY_ACTION_ACCEPT - id: 22888270 + id: 21715559 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/dash_vnet.yaml b/dash-pipeline/SAI/specs/dash_vnet.yaml index 594d0bddb..8240bcab4 100644 --- a/dash-pipeline/SAI/specs/dash_vnet.yaml +++ b/dash-pipeline/SAI/specs/dash_vnet.yaml @@ -27,9 +27,9 @@ sai_apis: p4_meta: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4Meta tables: - !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaTable - id: 49590243 + id: 39583935 actions: default: !!python/object:utils.sai_spec.sai_api_p4_meta.SaiApiP4MetaAction name: default - id: 20510911 + id: 28116018 attr_param_id: {} diff --git a/dash-pipeline/SAI/specs/sai_spec.yaml b/dash-pipeline/SAI/specs/sai_spec.yaml index 8f39c52f7..9d8bc26df 100644 --- a/dash-pipeline/SAI/specs/sai_spec.yaml +++ b/dash-pipeline/SAI/specs/sai_spec.yaml @@ -333,6 +333,46 @@ enums: name: NONE description: '' value: '0' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: ENCAP_U0 + description: '' + value: '1' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: ENCAP_U1 + description: '' + value: '2' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: SET_SMAC + description: '' + value: '4' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: SET_DMAC + description: '' + value: '8' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: SNAT + description: '' + value: '16' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: DNAT + description: '' + value: '32' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: NAT46 + description: '' + value: '64' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: NAT64 + description: '' + value: '128' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: SNAT_PORT + description: '' + value: '256' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: DNAT_PORT + description: '' + value: '512' - !!python/object:utils.sai_spec.sai_enum.SaiEnum name: sai_dash_ha_state_t description: '' @@ -405,6 +445,30 @@ enums: name: DST_MAC description: '' value: '2' +- !!python/object:utils.sai_spec.sai_enum.SaiEnum + name: sai_dash_flow_sync_state_t + description: '' + members: + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: FLOW_MISS + description: '' + value: '0' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: FLOW_CREATED + description: '' + value: '1' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: FLOW_SYNCED + description: '' + value: '2' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: FLOW_PENDING_DELETE + description: '' + value: '3' + - !!python/object:utils.sai_spec.sai_enum_member.SaiEnumMember + name: FLOW_PENDING_RESIMULATION + description: '' + value: '4' port_extenstion: !!python/object:utils.sai_spec.sai_api_extension.SaiApiExtension attributes: [] stats: diff --git a/dash-pipeline/SAI/src/utils.h b/dash-pipeline/SAI/src/utils.h index 211463112..e468911d8 100644 --- a/dash-pipeline/SAI/src/utils.h +++ b/dash-pipeline/SAI/src/utils.h @@ -285,7 +285,7 @@ namespace dash template void u8listSetVal(const sai_attribute_value_t &value, T &t, int bits = -1) { - assert (0 && "NYI"); + t->set_value(value.u8list.list, value.u8list.count); } template diff --git a/dash-pipeline/SAI/utils/sai_spec/sai_spec_utils.py b/dash-pipeline/SAI/utils/sai_spec/sai_spec_utils.py index daf0d465b..791a4896e 100644 --- a/dash-pipeline/SAI/utils/sai_spec/sai_spec_utils.py +++ b/dash-pipeline/SAI/utils/sai_spec/sai_spec_utils.py @@ -24,6 +24,7 @@ def load_word_fixers() -> None: "pb": "protocol buffer", "proto": "protocol", "smac": "source MAC", + "dest": "destination", "dpu": "DPU" } diff --git a/dash-pipeline/bmv2/dash_conntrack.p4 b/dash-pipeline/bmv2/dash_conntrack.p4 index d4e1cb582..1b6195920 100644 --- a/dash-pipeline/bmv2/dash_conntrack.p4 +++ b/dash-pipeline/bmv2/dash_conntrack.p4 @@ -48,7 +48,7 @@ control ConntrackIn(inout headers_t hdr, } restart_expire_timer(); // reset expiration timer for entry meta.conntrack_data.allow_in = true; - meta.overlay_data.is_ipv6 = false; + meta.overlay_data.is_ipv6 = 0; meta.overlay_data.sip = (IPv4ORv6Address)original_overlay_sip; meta.overlay_data.dip = (IPv4ORv6Address)original_overlay_dip; } diff --git a/dash-pipeline/bmv2/dash_headers.p4 b/dash-pipeline/bmv2/dash_headers.p4 index 60fc1d0f5..1b3b6085e 100644 --- a/dash-pipeline/bmv2/dash_headers.p4 +++ b/dash-pipeline/bmv2/dash_headers.p4 @@ -6,6 +6,65 @@ typedef bit<32> IPv4Address; typedef bit<128> IPv6Address; typedef bit<128> IPv4ORv6Address; +enum bit<16> dash_direction_t { + INVALID = 0, + OUTBOUND = 1, + INBOUND = 2 +}; + +typedef bit<32> dash_meter_class_t; + +enum bit<8> dash_packet_source_t { + EXTERNAL = 0, // Packets from external sources. + PIPELINE = 1, // Packets from P4 pipeline. + DPAPP = 2, // Packets from data plane app. + PEER = 3 // Packets from the paired DPU. +}; + +enum bit<4> dash_packet_type_t { + REGULAR = 0, // Regular packets from external sources. + FLOW_SYNC_REQ = 1, // Flow sync request packet. + FLOW_SYNC_ACK = 2, // Flow sync ack packet. + DP_PROBE_REQ = 3, // Data plane probe packet. + DP_PROBE_ACK = 4 // Data plane probe ack packet. +}; + +// Packet subtype for one kind of packet type +enum bit<4> dash_packet_subtype_t { + NONE = 0, // no op + FLOW_CREATE = 1, // New flow creation. + FLOW_UPDATE = 2, // Flow resimulation or any other reason causing existing flow to be updated. + FLOW_DELETE = 3 // Flow deletion. +}; + +enum bit<16> dash_encapsulation_t { + INVALID = 0, + VXLAN = 1, + NVGRE = 2 +} + +header encap_data_t { + bit<24> vni; + bit<8> reserved; + IPv4Address underlay_sip; + IPv4Address underlay_dip; + EthernetAddress underlay_smac; + EthernetAddress underlay_dmac; + dash_encapsulation_t dash_encapsulation; +} +const bit<16> ENCAP_DATA_HDR_SIZE=encap_data_t.minSizeInBytes(); + +header overlay_rewrite_data_t { + EthernetAddress dmac; + IPv4ORv6Address sip; + IPv4ORv6Address dip; + IPv6Address sip_mask; + IPv6Address dip_mask; + bit<7> reserved; + bit<1> is_ipv6; +} +const bit<16> OVERLAY_REWRITE_DATA_HDR_SIZE=overlay_rewrite_data_t.minSizeInBytes(); + header ethernet_t { EthernetAddress dst_addr; EthernetAddress src_addr; @@ -93,7 +152,120 @@ header ipv6_t { const bit<16> IPV6_HDR_SIZE=320/8; + +// Flow sync state +enum bit<8> dash_flow_sync_state_t { + FLOW_MISS = 0, // Flow not created yet + FLOW_CREATED = 1, // Flow is created but not synched or waiting for ack + FLOW_SYNCED = 2, // Flow has been synched to its peer + FLOW_PENDING_DELETE = 3, // Flow is pending deletion, waiting for ack + FLOW_PENDING_RESIMULATION = 4 // Flow is marked as pending resimulation +} + +enum bit<32> dash_flow_action_t { + NONE = 0, + ENCAP_U0 = (1 << 0), + ENCAP_U1 = (1 << 1), + SET_SMAC = (1 << 2), + SET_DMAC = (1 << 3), + SNAT = (1 << 4), + DNAT = (1 << 5), + NAT46 = (1 << 6), + NAT64 = (1 << 7), + SNAT_PORT = (1 << 8), + DNAT_PORT = (1 << 9) +} + +enum bit<16> dash_flow_enabled_key_t { + ENI_MAC = (1 << 0), + VNI = (1 << 1), + PROTOCOL = (1 << 2), + SRC_IP = (1 << 3), + DST_IP = (1 << 4), + SRC_PORT = (1 << 5), + DST_PORT = (1 << 6) +} + +enum bit<16> dash_flow_entry_bulk_get_session_mode_t { + SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_GRPC = 0, + SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_VENDOR = 1, + SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_EVENT = 2, + SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_EVENT_WITHOUT_FLOW_STATE = 3 +} + +enum bit<16> dash_flow_entry_bulk_get_session_filter_key_t { + INVAILD = 0, + FLOW_TABLE_ID = 1, + ENI_MAC = 2, + IP_PROTOCOL = 3, + SRC_IP_ADDR = 4, + DST_IP_ADDR = 5, + SRC_L4_PORT = 6, + DST_L4_PORT = 7, + KEY_VERSION = 8 +} + +enum bit<8> dash_flow_entry_bulk_get_session_op_key_t { + FILTER_OP_INVALID = 0, + FILTER_OP_EQUAL_TO = 1, + FILTER_OP_GREATER_THAN = 2, + FILTER_OP_GREATER_THAN_OR_EQUAL_TO = 3, + FILTER_OP_LESS_THAN = 4, + FILTER_OP_LESS_THAN_OR_EQUAL_TO = 5 +} + +struct flow_table_data_t { + bit<16> id; + bit<32> max_flow_count; + bit<16> flow_enabled_key; + bit<32> flow_ttl_in_milliseconds; +} + +header flow_key_t { + EthernetAddress eni_mac; + bit<16> vnet_id; + IPv4ORv6Address src_ip; + IPv4ORv6Address dst_ip; + bit<16> src_port; + bit<16> dst_port; + bit<8> ip_proto; + bit<7> reserved; + bit<1> is_ip_v6; +} +const bit<16> FLOW_KEY_HDR_SIZE=flow_key_t.minSizeInBytes(); + +header flow_data_t { + bit<7> reserved; + bit<1> is_unidirectional; + dash_direction_t direction; + bit<32> version; + dash_flow_action_t actions; + dash_meter_class_t meter_class; +} +const bit<16> FLOW_DATA_HDR_SIZE=flow_data_t.minSizeInBytes(); + +// dash packet metadata +header dash_packet_meta_t { + dash_packet_source_t packet_source; + dash_packet_type_t packet_type; + dash_packet_subtype_t packet_subtype; + bit<16> length; +} +const bit<16> PACKET_META_HDR_SIZE=dash_packet_meta_t.minSizeInBytes(); + +#define DASH_ETHTYPE 0x876d +#define DPAPP_MAC 0x02fe23f0e413 /* FIXME temp hardcode */ + struct headers_t { + /* packet metadata headers */ + ethernet_t dp_ethernet; + dash_packet_meta_t packet_meta; + flow_key_t flow_key; + flow_data_t flow_data; // flow common data + overlay_rewrite_data_t flow_overlay_data; + encap_data_t flow_u0_encap_data; + encap_data_t flow_u1_encap_data; + /* Underlay 1 headers */ ethernet_t u1_ethernet; ipv4_t u1_ipv4; @@ -122,10 +294,4 @@ struct headers_t { tcp_t customer_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 14c39590c..9a087c479 100644 --- a/dash-pipeline/bmv2/dash_inbound.p4 +++ b/dash-pipeline/bmv2/dash_inbound.p4 @@ -39,13 +39,12 @@ control inbound(inout headers_t hdr, do_tunnel_encap(hdr, meta, - meta.overlay_data.dmac, - meta.encap_data.underlay_dmac, - meta.encap_data.underlay_smac, - meta.encap_data.underlay_dip, - meta.encap_data.underlay_sip, + meta.u0_encap_data.underlay_dmac, + meta.u0_encap_data.underlay_smac, + meta.u0_encap_data.underlay_dip, + meta.u0_encap_data.underlay_sip, dash_encapsulation_t.VXLAN, - meta.encap_data.vni); + meta.u0_encap_data.vni); } } diff --git a/dash-pipeline/bmv2/dash_metadata.p4 b/dash-pipeline/bmv2/dash_metadata.p4 index 14ad72ab1..e7415f59d 100644 --- a/dash-pipeline/bmv2/dash_metadata.p4 +++ b/dash-pipeline/bmv2/dash_metadata.p4 @@ -6,35 +6,7 @@ #define MAX_ENI 64 #define MAX_HA_SET 1 -enum bit<32> dash_routing_actions_t { - STATIC_ENCAP = (1 << 0), - NAT = (1 << 1), - NAT46 = (1 << 2), - NAT64 = (1 << 3), - NAT_PORT = (1 << 4), - TUNNEL = (1 << 5), - REVERSE_TUNNEL = (1 << 6) -}; - -enum bit<16> dash_direction_t { - INVALID = 0, - OUTBOUND = 1, - INBOUND = 2 -}; - -enum bit<8> dash_packet_source_t { - EXTERNAL = 0, // Packets from external sources. - DPAPP = 1, // Packets from data plane app. - PEER = 2 // Packets from the paired DPU. -}; - -enum bit<8> dash_packet_type_t { - REGULAR = 0, // Regular packets from external sources. - FLOW_SYNC_REQ = 1, // Flow sync request packet. - FLOW_SYNC_ACK = 2, // Flow sync ack packet. - DP_PROBE_REQ = 3, // Data plane probe packet. - DP_PROBE_ACK = 4 // Data plane probe ack packet. -}; +typedef dash_flow_action_t dash_routing_actions_t; // Pipeline stages: enum bit<16> dash_pipeline_stage_t { @@ -54,74 +26,6 @@ enum bit<16> dash_pipeline_stage_t { ROUTING_ACTION_APPLY = 300 }; -enum bit<16> dash_flow_enabled_key_t { - ENI_MAC = (1 << 0), - VNI = (1 << 1), - PROTOCOL = (1 << 2), - SRC_IP = (1 << 3), - DST_IP = (1 << 4), - SRC_PORT = (1 << 5), - DST_PORT = (1 << 6) -} - -struct flow_table_data_t { - bit<16> id; - bit<32> max_flow_count; - dash_flow_enabled_key_t flow_enabled_key; - bit<32> flow_ttl_in_milliseconds; -} - -enum bit<32> dash_flow_action_t { - NONE = 0 -} - -struct flow_key_t { - EthernetAddress eni_mac; - bit<8> ip_proto; - bit<16> vnet_id; - IPv4ORv6Address src_ip; - IPv4ORv6Address dst_ip; - bit<16> src_port; - bit<16> dst_port; - bool is_ipv6; -} - -struct flow_data_t { - bit<32> version; - dash_direction_t dash_direction; - dash_flow_action_t actions; -} - -enum bit<16> dash_flow_entry_bulk_get_session_mode_t { - SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_GRPC = 0, - SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_VENDOR = 1, - SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_EVENT = 2, - SAI_DASH_FLOW_ENTRY_BULK_GET_SESSION_MODE_EVENT_WITHOUT_FLOW_STATE = 3 -} - -enum bit<16> dash_flow_entry_bulk_get_session_filter_key_t -{ - INVAILD = 0, - FLOW_TABLE_ID = 1, - ENI_MAC = 2, - IP_PROTOCOL = 3, - SRC_IP_ADDR = 4, - DST_IP_ADDR = 5, - SRC_L4_PORT = 6, - DST_L4_PORT = 7, - KEY_VERSION = 8 -} - -enum bit<8> dash_flow_entry_bulk_get_session_op_key_t -{ - FILTER_OP_INVALID = 0, - FILTER_OP_EQUAL_TO = 1, - FILTER_OP_GREATER_THAN = 2, - FILTER_OP_GREATER_THAN_OR_EQUAL_TO = 3, - FILTER_OP_LESS_THAN = 4, - FILTER_OP_LESS_THAN_OR_EQUAL_TO = 5 -} - enum bit<8> dash_eni_mac_override_type_t { NONE = 0, SRC_MAC = 1, @@ -136,14 +40,6 @@ enum bit<8> dash_eni_mac_type_t { struct conntrack_data_t { bool allow_in; bool allow_out; - flow_table_data_t flow_table; - EthernetAddress eni_mac; - flow_data_t flow_data; - flow_key_t flow_key; - flow_key_t reverse_flow_key; - bit<1> is_unidirectional_flow; - bit<16> bulk_get_session_id; - bit<16> bulk_get_session_filter_id; } enum bit<16> dash_tunnel_dscp_mode_t { @@ -177,24 +73,6 @@ struct meter_context_t { IPv4ORv6Address meter_policy_lookup_ip; } -struct encap_data_t { - bit<24> vni; - IPv4Address underlay_sip; - IPv4Address underlay_dip; - dash_encapsulation_t dash_encapsulation; - EthernetAddress underlay_smac; - EthernetAddress underlay_dmac; -} - -struct overlay_rewrite_data_t { - bool is_ipv6; - EthernetAddress dmac; - IPv4ORv6Address sip; - IPv4ORv6Address dip; - IPv6Address sip_mask; - IPv6Address dip_mask; -} - // HA roles enum bit<8> dash_ha_role_t { DEAD = 0, @@ -233,22 +111,6 @@ enum bit<8> dash_ha_state_t { SWITCHING_TO_STANDALONE = 12 }; -// Flow sync state -enum bit<8> dash_ha_flow_sync_state_t { - FLOW_MISS = 0, // Flow not created yet - FLOW_CREATED = 1, // Flow is created but not synched or waiting for ack - FLOW_SYNCED = 2, // Flow has been synched to its peer - FLOW_PENDING_DELETE = 3, // Flow is pending deletion, waiting for ack - FLOW_PENDING_RESIMULATION = 4 // Flow is marked as pending resimulation -}; - -// HA flow sync operations -enum bit<8> dash_ha_flow_sync_op_t { - FLOW_CREATE = 0, // New flow creation. - FLOW_UPDATE = 1, // Flow resimulation or any other reason causing existing flow to be updated. - FLOW_DELETE = 2 // Flow deletion. -}; - struct ha_data_t { // HA scope settings bit<16> ha_scope_id; @@ -263,10 +125,41 @@ struct ha_data_t { bit<16> dp_channel_dst_port; bit<16> dp_channel_src_port_min; bit<16> dp_channel_src_port_max; +} - // HA packet/flow state - dash_ha_flow_sync_state_t flow_sync_state; +#ifdef TARGET_DPDK_PNA +// redefine encap_data_t -> meta_encap_data_t +// redefine overlay_rewrite_data_t -> meta_overlay_rewrite_data_t +// header in struct is not well supported for target dpdk-pna +struct meta_flow_data_t { + bit<7> reserved; + bit<1> is_unidirectional; + dash_flow_sync_state_t sync_state; + dash_direction_t direction; + bit<32> version; + dash_flow_action_t actions; + dash_meter_class_t meter_class; } +struct meta_encap_data_t { + bit<24> vni; + bit<8> reserved; + IPv4Address underlay_sip; + IPv4Address underlay_dip; + EthernetAddress underlay_smac; + EthernetAddress underlay_dmac; + dash_encapsulation_t dash_encapsulation; +} + +struct meta_overlay_rewrite_data_t { + EthernetAddress dmac; + IPv4ORv6Address sip; + IPv4ORv6Address dip; + IPv6Address sip_mask; + IPv6Address dip_mask; + bit<7> reserved; + bit<1> is_ipv6; +} +#endif // TARGET_DPDK_PNA struct metadata_t { // Packet type @@ -277,7 +170,11 @@ struct metadata_t { dash_direction_t direction; dash_eni_mac_type_t eni_mac_type; dash_eni_mac_override_type_t eni_mac_override_type; +#ifdef TARGET_DPDK_PNA + meta_encap_data_t rx_encap; +#else encap_data_t rx_encap; +#endif // TARGET_DPDK_PNA EthernetAddress eni_addr; bit<16> vnet_id; bit<16> dst_vnet_id; @@ -308,23 +205,37 @@ struct metadata_t { // Flow data conntrack_data_t conntrack_data; +#ifdef TARGET_DPDK_PNA + meta_flow_data_t flow_data; +#else + flow_data_t flow_data; +#endif // TARGET_DPDK_PNA + dash_flow_sync_state_t flow_sync_state; + flow_table_data_t flow_table; + bit<16> bulk_get_session_id; + bit<16> bulk_get_session_filter_id; + bool flow_enabled; + bool to_dpapp; // Stage transition control dash_pipeline_stage_t target_stage; // Actions bit<32> routing_actions; - bit<32> flow_actions; // Action data bool dropped; - // encap_data is for underlay - encap_data_t encap_data; - // tunnel_data is used by dash_tunnel_id - encap_data_t tunnel_data; +#ifdef TARGET_DPDK_PNA + meta_encap_data_t u0_encap_data; + meta_encap_data_t u1_encap_data; + meta_overlay_rewrite_data_t overlay_data; +#else + encap_data_t u0_encap_data; + encap_data_t u1_encap_data; + overlay_rewrite_data_t overlay_data; +#endif // TARGET_DPDK_PNA bit<1> enable_reverse_tunnel_learning; IPv4Address reverse_tunnel_sip; - overlay_rewrite_data_t overlay_data; bit<16> dash_tunnel_id; bit<32> dash_tunnel_max_member_size; bit<16> dash_tunnel_member_index; diff --git a/dash-pipeline/bmv2/dash_parser.p4 b/dash-pipeline/bmv2/dash_parser.p4 index d6eed01fc..fcb6929f5 100644 --- a/dash-pipeline/bmv2/dash_parser.p4 +++ b/dash-pipeline/bmv2/dash_parser.p4 @@ -29,14 +29,51 @@ parser dash_parser( ) { state start { + // By default, packet is REGULAR from EXTERNAL + hd.packet_meta.setValid(); + hd.packet_meta.packet_source = dash_packet_source_t.EXTERNAL; + hd.packet_meta.packet_type = dash_packet_type_t.REGULAR; + hd.packet_meta.packet_subtype = dash_packet_subtype_t.NONE; + hd.packet_meta.length = PACKET_META_HDR_SIZE; + packet.extract(hd.u0_ethernet); transition select(hd.u0_ethernet.ether_type) { IPV4_ETHTYPE: parse_u0_ipv4; IPV6_ETHTYPE: parse_u0_ipv6; + DASH_ETHTYPE: parse_dash_hdr; default: accept; } } + state parse_dash_hdr { + packet.extract(hd.packet_meta); + if (hd.packet_meta.packet_subtype == dash_packet_subtype_t.FLOW_CREATE + || hd.packet_meta.packet_subtype == dash_packet_subtype_t.FLOW_UPDATE + || hd.packet_meta.packet_subtype == dash_packet_subtype_t.FLOW_DELETE) { + // Flow create/update/delete, extract flow_key + packet.extract(hd.flow_key); + } + + if (hd.packet_meta.packet_subtype == dash_packet_subtype_t.FLOW_DELETE) { + // Flow delete, extract flow_data ... + packet.extract(hd.flow_data); + + if (hd.flow_data.actions != 0) { + packet.extract(hd.flow_overlay_data); + } + + if (hd.flow_data.actions & dash_routing_actions_t.ENCAP_U0 != 0) { + packet.extract(hd.flow_u0_encap_data); + } + + if (hd.flow_data.actions & dash_routing_actions_t.ENCAP_U1 != 0) { + packet.extract(hd.flow_u1_encap_data); + } + } + + transition parse_customer_ethernet; + } + state parse_u0_ipv4 { packet.extract(hd.u0_ipv4); verify(hd.u0_ipv4.version == 4w4, error.IPv4IncorrectVersion); @@ -138,7 +175,15 @@ control dash_deparser( ) { apply { - packet.emit(hdr.u0_ethernet); + packet.emit(hdr.dp_ethernet); + packet.emit(hdr.packet_meta); + packet.emit(hdr.flow_key); + packet.emit(hdr.flow_data); + packet.emit(hdr.flow_overlay_data); + packet.emit(hdr.flow_u0_encap_data); + packet.emit(hdr.flow_u1_encap_data); + + packet.emit(hdr.u0_ethernet); packet.emit(hdr.u0_ipv4); packet.emit(hdr.u0_ipv4options); packet.emit(hdr.u0_ipv6); diff --git a/dash-pipeline/bmv2/dash_pipeline.p4 b/dash-pipeline/bmv2/dash_pipeline.p4 index db45d4f41..49a737cd9 100644 --- a/dash-pipeline/bmv2/dash_pipeline.p4 +++ b/dash-pipeline/bmv2/dash_pipeline.p4 @@ -18,27 +18,11 @@ #include "stages/metering_update.p4" #include "underlay.p4" -control dash_ingress( +control dash_eni_stage( 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 - , inout pna_main_output_metadata_t ostd -#endif // TARGET_DPDK_PNA ) { - action drop_action() { -#ifdef TARGET_BMV2_V1MODEL - mark_to_drop(standard_metadata); -#endif // TARGET_BMV2_V1MODEL -#ifdef TARGET_DPDK_PNA - drop_packet(); -#endif // TARGET_DPDK_PNA - } - action deny() { meta.dropped = true; } @@ -91,21 +75,19 @@ control dash_ingress( 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; + meta.u0_encap_data.underlay_dip = vm_underlay_dip; meta.eni_data.outbound_routing_group_data.outbound_routing_group_id = outbound_routing_group_id; if (dash_tunnel_dscp_mode == dash_tunnel_dscp_mode_t.PIPE_MODEL) { meta.eni_data.dscp = dscp; } /* 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.u0_encap_data.vni = vm_vni; meta.vnet_id = vnet_id; meta.enable_reverse_tunnel_learning = enable_reverse_tunnel_learning; meta.reverse_tunnel_sip = reverse_tunnel_sip; - meta.routing_actions = meta.routing_actions | dash_routing_actions_t.REVERSE_TUNNEL; - if (meta.is_overlay_ip_v6 == 1) { if (meta.direction == dash_direction_t.OUTBOUND) { ACL_GROUPS_COPY_TO_META(outbound_v6); @@ -145,6 +127,55 @@ control dash_ingress( const default_action = deny; } + apply { + if (!eni.apply().hit) { + UPDATE_COUNTER(eni_miss_drop, 0); + } + } +} + +// direction lookup, eni lookup, etc +control dash_lookup_stage( + inout headers_t hdr + , inout metadata_t meta + ) +{ + action deny() { + meta.dropped = true; + } + + apply { + pre_pipeline_stage.apply(hdr, meta); + direction_lookup_stage.apply(hdr, meta); + eni_lookup_stage.apply(hdr, meta); + + dash_eni_stage.apply(hdr, meta); + + if (meta.eni_data.admin_state == 0) { + deny(); + } + + UPDATE_ENI_COUNTER(eni_rx); + + if (meta.direction == dash_direction_t.OUTBOUND) { + UPDATE_ENI_COUNTER(eni_outbound_rx); + } else if (meta.direction == dash_direction_t.INBOUND) { + UPDATE_ENI_COUNTER(eni_inbound_rx); + } + + if (meta.is_fast_path_icmp_flow_redirection_packet) { + UPDATE_ENI_COUNTER(eni_lb_fast_path_icmp_in); + } + + do_tunnel_decap(hdr, meta); + } +} + +control dash_match_stage( + inout headers_t hdr + , inout metadata_t meta + ) +{ action set_acl_group_attrs(@SaiVal[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) { @@ -168,6 +199,50 @@ control dash_ingress( } apply { + acl_group.apply(); + + if (meta.direction == dash_direction_t.OUTBOUND) { + meta.target_stage = dash_pipeline_stage_t.OUTBOUND_ROUTING; + outbound.apply(hdr, meta); + } else if (meta.direction == dash_direction_t.INBOUND) { + meta.target_stage = dash_pipeline_stage_t.INBOUND_ROUTING; + inbound.apply(hdr, meta); + } + + } +} + +control dash_ingress( + 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 + , inout pna_main_output_metadata_t ostd +#endif // TARGET_DPDK_PNA + ) +{ + action drop_action() { +#ifdef TARGET_BMV2_V1MODEL + mark_to_drop(standard_metadata); +#endif // TARGET_BMV2_V1MODEL +#ifdef TARGET_DPDK_PNA + drop_packet(); +#endif // TARGET_DPDK_PNA + } + + apply { + meta.flow_enabled = false; + +#ifndef TARGET_DPDK_PNA + meta.rx_encap.setValid(); + meta.flow_data.setValid(); + meta.u0_encap_data.setValid(); + meta.u1_encap_data.setValid(); + meta.overlay_data.setValid(); +#endif // TARGET_DPDK_PNA #ifdef TARGET_DPDK_PNA #ifdef DPDK_PNA_SEND_TO_PORT_FIX_MERGED @@ -183,53 +258,48 @@ control dash_ingress( #endif // DPDK_PNA_SEND_TO_PORT_FIX_MERGED #endif // TARGET_DPDK_PNA - pre_pipeline_stage.apply(hdr, meta); - direction_lookup_stage.apply(hdr, meta); - eni_lookup_stage.apply(hdr, meta); - - if (!eni.apply().hit) { - UPDATE_COUNTER(eni_miss_drop, 0); - deny(); + // If packet is from DPAPP, not do common lookup + if (hdr.packet_meta.packet_source != dash_packet_source_t.DPAPP) { + dash_lookup_stage.apply(hdr, meta); } - - if (meta.eni_data.admin_state == 0) { - deny(); + else { + meta.flow_enabled = true; } - conntrack_lookup_stage.apply(hdr, meta); - - UPDATE_ENI_COUNTER(eni_rx); - - if (meta.direction == dash_direction_t.OUTBOUND) { - UPDATE_ENI_COUNTER(eni_outbound_rx); - } else if (meta.direction == dash_direction_t.INBOUND) { - UPDATE_ENI_COUNTER(eni_inbound_rx); - } - - if (meta.is_fast_path_icmp_flow_redirection_packet) { - UPDATE_ENI_COUNTER(eni_lb_fast_path_icmp_in); + if (meta.flow_enabled) { + conntrack_lookup_stage.apply(hdr, meta); } - do_tunnel_decap(hdr, meta); - ha_stage.apply(hdr, meta); - acl_group.apply(); - - if (meta.direction == dash_direction_t.OUTBOUND) { - meta.target_stage = dash_pipeline_stage_t.OUTBOUND_ROUTING; - outbound.apply(hdr, meta); - } else if (meta.direction == dash_direction_t.INBOUND) { - meta.target_stage = dash_pipeline_stage_t.INBOUND_ROUTING; - inbound.apply(hdr, meta); + if (!meta.flow_enabled || + (meta.flow_sync_state == dash_flow_sync_state_t.FLOW_MISS && + hdr.packet_meta.packet_source == dash_packet_source_t.EXTERNAL)) + { + dash_match_stage.apply(hdr, meta); + if (meta.dropped) { + drop_action(); + return; + } } - tunnel_stage.apply(hdr, meta); + if (meta.flow_enabled) { + conntrack_flow_handle.apply(hdr, meta); + if (meta.to_dpapp) { +#ifdef TARGET_BMV2_V1MODEL + standard_metadata.egress_spec = 2; //FIXME hard-code vpp port +#else //FIXME DPDK_PNA + drop_action(); +#endif // TARGET_BMV2_V1MODEL + return; + } + } + else { + hdr.packet_meta.setInvalid(); + } routing_action_apply.apply(hdr, meta); - tunnel_stage_encap.apply(hdr, meta); - /* Underlay routing */ meta.dst_ip_addr = (bit<128>)hdr.u0_ipv4.dst_addr; diff --git a/dash-pipeline/bmv2/dash_routing_types.p4 b/dash-pipeline/bmv2/dash_routing_types.p4 index ee2d4fa3f..dca3d1f52 100644 --- a/dash-pipeline/bmv2/dash_routing_types.p4 +++ b/dash-pipeline/bmv2/dash_routing_types.p4 @@ -123,14 +123,16 @@ action route_service_tunnel( #ifndef DISABLE_128BIT_ARITHMETIC // As of 2024-Feb-09, p4c-dpdk does not yet support arithmetic on 128-bit operands. // This lack of support extends to cast operations. - push_action_static_encap(hdr = hdr, - meta = meta, - encap = dash_encapsulation, - vni = tunnel_key, - underlay_sip = underlay_sip == 0 ? hdr.u0_ipv4.src_addr : (IPv4Address)underlay_sip, - underlay_dip = underlay_dip == 0 ? hdr.u0_ipv4.dst_addr : (IPv4Address)underlay_dip, - overlay_dmac = hdr.u0_ethernet.dst_addr); - + push_action_set_dmac(hdr, + meta, + hdr.u0_ethernet.dst_addr); + + push_action_encap_u0(hdr = hdr, + meta = meta, + encap = dash_encapsulation, + vni = tunnel_key, + underlay_sip = underlay_sip == 0 ? hdr.u0_ipv4.src_addr : (IPv4Address)underlay_sip, + underlay_dip = underlay_dip == 0 ? hdr.u0_ipv4.dst_addr : (IPv4Address)underlay_dip); #endif set_meter_attrs(meta, meter_class_or, meter_class_and); @@ -154,10 +156,13 @@ action set_tunnel_mapping( if (use_dst_vnet_vni == 1) meta.vnet_id = meta.dst_vnet_id; - push_action_static_encap(hdr = hdr, - meta = meta, - underlay_dip = underlay_dip, - overlay_dmac = overlay_dmac); + push_action_set_dmac(hdr, + meta, + overlay_dmac); + + push_action_encap_u0(hdr = hdr, + meta = meta, + underlay_dip = underlay_dip); set_meter_attrs(meta, meter_class_or, 0xffffffff); } @@ -181,14 +186,17 @@ action set_private_link_mapping( meta.target_stage = dash_pipeline_stage_t.OUTBOUND_PRE_ROUTING_ACTION_APPLY; meta.dash_tunnel_id = dash_tunnel_id; - push_action_static_encap(hdr = hdr, - meta = meta, - encap = dash_encapsulation, - vni = tunnel_key, - // PL has its own underlay SIP, so override - underlay_sip = meta.eni_data.pl_underlay_sip, - underlay_dip = underlay_dip, - overlay_dmac = hdr.u0_ethernet.dst_addr); + push_action_set_dmac(hdr, + meta, + hdr.u0_ethernet.dst_addr); + + push_action_encap_u0(hdr = hdr, + meta = meta, + encap = dash_encapsulation, + vni = tunnel_key, + // PL has its own underlay SIP, so override + underlay_sip = meta.eni_data.pl_underlay_sip, + underlay_dip = underlay_dip); #ifndef DISABLE_128BIT_ARITHMETIC // As of 2024-Feb-09, p4c-dpdk does not yet support arithmetic on diff --git a/dash-pipeline/bmv2/dash_tunnel.p4 b/dash-pipeline/bmv2/dash_tunnel.p4 index 4d39f5e65..d1e4238fe 100644 --- a/dash-pipeline/bmv2/dash_tunnel.p4 +++ b/dash-pipeline/bmv2/dash_tunnel.p4 @@ -6,13 +6,11 @@ #ifdef TARGET_BMV2_V1MODEL #define PUSH_VXLAN_TUNNEL_DEF(underlay_id, overlay_id) \ action push_vxlan_tunnel_ ## underlay_id ## (inout headers_t hdr, \ - in EthernetAddress overlay_dmac, \ in EthernetAddress underlay_dmac, \ in EthernetAddress underlay_smac, \ in IPv4Address underlay_dip, \ in IPv4Address underlay_sip, \ in bit<24> tunnel_key) { \ - hdr. ## overlay_id ## _ethernet.dst_addr = (overlay_dmac == 0) ? hdr. ## overlay_id ## _ethernet.dst_addr : overlay_dmac; \ hdr. ## underlay_id ## _ethernet.setValid(); \ hdr. ## underlay_id ## _ethernet.dst_addr = underlay_dmac; \ hdr. ## underlay_id ## _ethernet.src_addr = underlay_smac; \ @@ -60,13 +58,11 @@ action push_vxlan_tunnel_ ## underlay_id ## (inout headers_t hdr, \ #ifdef TARGET_DPDK_PNA #define PUSH_VXLAN_TUNNEL_DEF(underlay_id, overlay_id) \ action push_vxlan_tunnel_ ## underlay_id ## (inout headers_t hdr, \ - in EthernetAddress overlay_dmac, \ in EthernetAddress underlay_dmac, \ in EthernetAddress underlay_smac, \ in IPv4Address underlay_dip, \ in IPv4Address underlay_sip, \ in bit<24> tunnel_key) { \ - hdr. ## overlay_id ## _ethernet.dst_addr = overlay_dmac; \ hdr. ## underlay_id ## _ethernet.setValid(); \ hdr. ## underlay_id ## _ethernet.dst_addr = underlay_dmac; \ hdr. ## underlay_id ## _ethernet.src_addr = underlay_smac; \ @@ -113,13 +109,11 @@ action push_vxlan_tunnel_ ## underlay_id ## (inout headers_t hdr, \ #ifdef TARGET_BMV2_V1MODEL #define PUSH_NVGRE_TUNNEL_DEF(underlay_id, overlay_id) \ action push_nvgre_tunnel_ ## underlay_id ## (inout headers_t hdr, \ - in EthernetAddress overlay_dmac, \ in EthernetAddress underlay_dmac, \ in EthernetAddress underlay_smac, \ in IPv4Address underlay_dip, \ in IPv4Address underlay_sip, \ in bit<24> tunnel_key) { \ - hdr. ## overlay_id ## _ethernet.dst_addr = overlay_dmac; \ hdr. ## underlay_id ## _ethernet.setValid(); \ hdr. ## underlay_id ## _ethernet.dst_addr = underlay_dmac; \ hdr. ## underlay_id ## _ethernet.src_addr = underlay_smac; \ @@ -159,13 +153,11 @@ action push_nvgre_tunnel_ ## underlay_id ## (inout headers_t hdr, \ #ifdef TARGET_DPDK_PNA #define PUSH_NVGRE_TUNNEL_DEF(underlay_id, overlay_id) \ action push_nvgre_tunnel_ ## underlay_id ## (inout headers_t hdr, \ - in EthernetAddress overlay_dmac, \ in EthernetAddress underlay_dmac, \ in EthernetAddress underlay_smac, \ in IPv4Address underlay_dip, \ in IPv4Address underlay_sip, \ in bit<24> tunnel_key) { \ - hdr. ## overlay_id ## _ethernet.dst_addr = overlay_dmac; \ hdr. ## underlay_id ## _ethernet.setValid(); \ hdr. ## underlay_id ## _ethernet.dst_addr = underlay_dmac; \ hdr. ## underlay_id ## _ethernet.src_addr = underlay_smac; \ @@ -213,7 +205,6 @@ PUSH_NVGRE_TUNNEL_DEF(u1, u0) #define do_tunnel_encap(hdr, \ meta, \ - overlay_dmac, \ underlay_dmac, \ underlay_smac, \ underlay_dip, \ @@ -223,7 +214,6 @@ PUSH_NVGRE_TUNNEL_DEF(u1, u0) if (dash_encapsulation == dash_encapsulation_t.VXLAN) { \ if (meta.tunnel_pointer == 0) { \ push_vxlan_tunnel_u0(hdr, \ - overlay_dmac, \ underlay_dmac, \ underlay_smac, \ underlay_dip, \ @@ -231,7 +221,6 @@ PUSH_NVGRE_TUNNEL_DEF(u1, u0) tunnel_key); \ } else if (meta.tunnel_pointer == 1) { \ push_vxlan_tunnel_u1(hdr, \ - overlay_dmac, \ underlay_dmac, \ underlay_smac, \ underlay_dip, \ @@ -241,7 +230,6 @@ PUSH_NVGRE_TUNNEL_DEF(u1, u0) } else if (dash_encapsulation == dash_encapsulation_t.NVGRE) { \ if (meta.tunnel_pointer == 0) { \ push_nvgre_tunnel_u0(hdr, \ - overlay_dmac, \ underlay_dmac, \ underlay_smac, \ underlay_dip, \ @@ -249,7 +237,6 @@ PUSH_NVGRE_TUNNEL_DEF(u1, u0) tunnel_key); \ } else if (meta.tunnel_pointer == 1) { \ push_nvgre_tunnel_u1(hdr, \ - overlay_dmac, \ underlay_dmac, \ underlay_smac, \ underlay_dip, \ diff --git a/dash-pipeline/bmv2/routing_actions/routing_action_encap_underlay.p4 b/dash-pipeline/bmv2/routing_actions/routing_action_encap_underlay.p4 new file mode 100644 index 000000000..ebe27c786 --- /dev/null +++ b/dash-pipeline/bmv2/routing_actions/routing_action_encap_underlay.p4 @@ -0,0 +1,102 @@ +#ifndef _DASH_ROUTING_ACTION_ENCAP_UNDERLAY_P4_ +#define _DASH_ROUTING_ACTION_ENCAP_UNDERLAY_P4_ + +action push_action_encap_u0( + in headers_t hdr, + inout metadata_t meta, + in dash_encapsulation_t encap = dash_encapsulation_t.VXLAN, + in bit<24> vni = 0, + in IPv4Address underlay_sip = 0, + in IPv4Address underlay_dip = 0, + in EthernetAddress underlay_smac = 0, + in EthernetAddress underlay_dmac = 0) +{ + meta.routing_actions = meta.routing_actions | dash_routing_actions_t.ENCAP_U0; + + meta.u0_encap_data.dash_encapsulation = encap; + meta.u0_encap_data.vni = vni == 0 ? meta.u0_encap_data.vni : vni; + + meta.u0_encap_data.underlay_smac = underlay_smac == 0 ? meta.u0_encap_data.underlay_smac : underlay_smac; + meta.u0_encap_data.underlay_dmac = underlay_dmac == 0 ? meta.u0_encap_data.underlay_dmac : underlay_dmac; + meta.u0_encap_data.underlay_sip = underlay_sip == 0 ? meta.u0_encap_data.underlay_sip : underlay_sip; + meta.u0_encap_data.underlay_dip = underlay_dip == 0 ? meta.u0_encap_data.underlay_dip : underlay_dip; +} + +action push_action_encap_u1( + in headers_t hdr, + inout metadata_t meta, + in dash_encapsulation_t encap = dash_encapsulation_t.VXLAN, + in bit<24> vni = 0, + in IPv4Address underlay_sip = 0, + in IPv4Address underlay_dip = 0, + in EthernetAddress underlay_smac = 0, + in EthernetAddress underlay_dmac = 0) +{ + meta.routing_actions = meta.routing_actions | dash_routing_actions_t.ENCAP_U1; + + meta.u1_encap_data.dash_encapsulation = encap; + meta.u1_encap_data.vni = vni == 0 ? meta.u1_encap_data.vni : vni; + + meta.u1_encap_data.underlay_smac = underlay_smac == 0 ? meta.u1_encap_data.underlay_smac : underlay_smac; + meta.u1_encap_data.underlay_dmac = underlay_dmac == 0 ? meta.u1_encap_data.underlay_dmac : underlay_dmac; + meta.u1_encap_data.underlay_sip = underlay_sip == 0 ? meta.u1_encap_data.underlay_sip : underlay_sip; + meta.u1_encap_data.underlay_dip = underlay_dip == 0 ? meta.u1_encap_data.underlay_dip : underlay_dip; +} + +control do_action_encap_u0( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + if (meta.routing_actions & dash_routing_actions_t.ENCAP_U0 == 0) { + return; + } + + if (meta.u0_encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + push_vxlan_tunnel_u0(hdr, + meta.u0_encap_data.underlay_dmac, + meta.u0_encap_data.underlay_smac, + meta.u0_encap_data.underlay_dip, + meta.u0_encap_data.underlay_sip, + meta.u0_encap_data.vni); + } + else if (meta.u0_encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) { + push_nvgre_tunnel_u0(hdr, + meta.u0_encap_data.underlay_dmac, + meta.u0_encap_data.underlay_smac, + meta.u0_encap_data.underlay_dip, + meta.u0_encap_data.underlay_sip, + meta.u0_encap_data.vni); + } + } +} + +control do_action_encap_u1( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + if (meta.routing_actions & dash_routing_actions_t.ENCAP_U1 == 0) { + return; + } + + if (meta.u0_encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { + push_vxlan_tunnel_u1(hdr, + meta.u0_encap_data.underlay_dmac, + meta.u0_encap_data.underlay_smac, + meta.u0_encap_data.underlay_dip, + meta.u0_encap_data.underlay_sip, + meta.u0_encap_data.vni); + } + else if (meta.u0_encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) { + push_nvgre_tunnel_u1(hdr, + meta.u0_encap_data.underlay_dmac, + meta.u0_encap_data.underlay_smac, + meta.u0_encap_data.underlay_dip, + meta.u0_encap_data.underlay_sip, + meta.u0_encap_data.vni); + } + } +} + +#endif /* _DASH_ROUTING_ACTION_ENCAP_UNDERLAY_P4_ */ diff --git a/dash-pipeline/bmv2/routing_actions/routing_action_nat46.p4 b/dash-pipeline/bmv2/routing_actions/routing_action_nat46.p4 index 06948c45a..ae774e5bf 100644 --- a/dash-pipeline/bmv2/routing_actions/routing_action_nat46.p4 +++ b/dash-pipeline/bmv2/routing_actions/routing_action_nat46.p4 @@ -11,7 +11,7 @@ action push_action_nat46( { meta.routing_actions = meta.routing_actions | dash_routing_actions_t.NAT46; - meta.overlay_data.is_ipv6 = true; + meta.overlay_data.is_ipv6 = 1; meta.overlay_data.sip = sip; meta.overlay_data.sip_mask = sip_mask; meta.overlay_data.dip = dip; @@ -27,7 +27,7 @@ control do_action_nat46( return; } - REQUIRES(meta.overlay_data.is_ipv6 == true); + REQUIRES(meta.overlay_data.is_ipv6 == 1); hdr.u0_ipv6.setValid(); hdr.u0_ipv6.version = 6; @@ -48,4 +48,4 @@ control do_action_nat46( } } -#endif /* _DASH_ROUTING_ACTION_NAT46_P4_ */ \ No newline at end of file +#endif /* _DASH_ROUTING_ACTION_NAT46_P4_ */ diff --git a/dash-pipeline/bmv2/routing_actions/routing_action_nat64.p4 b/dash-pipeline/bmv2/routing_actions/routing_action_nat64.p4 index 1f3bebab7..3b56e3964 100644 --- a/dash-pipeline/bmv2/routing_actions/routing_action_nat64.p4 +++ b/dash-pipeline/bmv2/routing_actions/routing_action_nat64.p4 @@ -9,7 +9,7 @@ action push_action_nat64( { meta.routing_actions = meta.routing_actions | dash_routing_actions_t.NAT64; - meta.overlay_data.is_ipv6 = false; + meta.overlay_data.is_ipv6 = 0; meta.overlay_data.sip = (IPv4ORv6Address)src; meta.overlay_data.dip = (IPv4ORv6Address)dst; } @@ -23,7 +23,7 @@ control do_action_nat64( return; } - REQUIRES(meta.overlay_data.is_ipv6 == false); + REQUIRES(meta.overlay_data.is_ipv6 == 0); hdr.u0_ipv4.setValid(); hdr.u0_ipv4.version = 4; @@ -44,4 +44,4 @@ control do_action_nat64( } } -#endif /* _DASH_ROUTING_ACTION_NAT64_P4_ */ \ No newline at end of file +#endif /* _DASH_ROUTING_ACTION_NAT64_P4_ */ diff --git a/dash-pipeline/bmv2/routing_actions/routing_action_set_mac.p4 b/dash-pipeline/bmv2/routing_actions/routing_action_set_mac.p4 new file mode 100644 index 000000000..03963d9af --- /dev/null +++ b/dash-pipeline/bmv2/routing_actions/routing_action_set_mac.p4 @@ -0,0 +1,43 @@ +#ifndef _DASH_ROUTING_ACTION_SET_MAC_P4_ +#define _DASH_ROUTING_ACTION_SET_MAC_P4_ + +action push_action_set_smac( + in headers_t hdr, + inout metadata_t meta, + in EthernetAddress overlay_dmac) +{ + // not used by now +} + +action push_action_set_dmac( + in headers_t hdr, + inout metadata_t meta, + in EthernetAddress overlay_dmac) +{ + meta.routing_actions = meta.routing_actions | dash_routing_actions_t.SET_DMAC; + meta.overlay_data.dmac = overlay_dmac; +} + +control do_action_set_smac( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + // not used by now + } +} + +control do_action_set_dmac( + inout headers_t hdr, + inout metadata_t meta) +{ + apply { + if (meta.routing_actions & dash_routing_actions_t.SET_DMAC == 0) { + return; + } + + hdr.customer_ethernet.dst_addr = meta.overlay_data.dmac; + } +} + +#endif /* _DASH_ROUTING_ACTION_SET_MAC_P4_ */ diff --git a/dash-pipeline/bmv2/routing_actions/routing_action_static_encap.p4 b/dash-pipeline/bmv2/routing_actions/routing_action_static_encap.p4 deleted file mode 100644 index 17d37cd0d..000000000 --- a/dash-pipeline/bmv2/routing_actions/routing_action_static_encap.p4 +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef _DASH_ROUTING_ACTION_STATIC_ENCAP_P4_ -#define _DASH_ROUTING_ACTION_STATIC_ENCAP_P4_ - -action push_action_static_encap( - in headers_t hdr, - inout metadata_t meta, - in dash_encapsulation_t encap = dash_encapsulation_t.VXLAN, - in bit<24> vni = 0, - in IPv4Address underlay_sip = 0, - in IPv4Address underlay_dip = 0, - in EthernetAddress underlay_smac = 0, - in EthernetAddress underlay_dmac = 0, - in EthernetAddress overlay_dmac = 0) -{ - meta.routing_actions = meta.routing_actions | dash_routing_actions_t.STATIC_ENCAP; - - meta.encap_data.dash_encapsulation = encap; - meta.encap_data.vni = vni == 0 ? meta.encap_data.vni : vni; - - meta.encap_data.underlay_smac = underlay_smac == 0 ? meta.encap_data.underlay_smac : underlay_smac; - meta.encap_data.underlay_dmac = underlay_dmac == 0 ? meta.encap_data.underlay_dmac : underlay_dmac; - meta.encap_data.underlay_sip = underlay_sip == 0 ? meta.encap_data.underlay_sip : underlay_sip; - meta.encap_data.underlay_dip = underlay_dip == 0 ? meta.encap_data.underlay_dip : underlay_dip; - - meta.overlay_data.dmac = overlay_dmac == 0 ? meta.overlay_data.dmac : overlay_dmac; -} - -control do_action_static_encap( - inout headers_t hdr, - inout metadata_t meta) -{ - apply { - if (meta.routing_actions & dash_routing_actions_t.STATIC_ENCAP == 0) { - return; - } - - if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) { - push_vxlan_tunnel_u0(hdr, - meta.overlay_data.dmac, - meta.encap_data.underlay_dmac, - meta.encap_data.underlay_smac, - meta.encap_data.underlay_dip, - meta.encap_data.underlay_sip, - meta.encap_data.vni); - } - else if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) { - push_vxlan_tunnel_u0(hdr, - meta.overlay_data.dmac, - meta.encap_data.underlay_dmac, - meta.encap_data.underlay_smac, - meta.encap_data.underlay_dip, - meta.encap_data.underlay_sip, - meta.encap_data.vni); - } - - meta.tunnel_pointer = meta.tunnel_pointer + 1; - } -} - -#endif /* _DASH_ROUTING_ACTION_STATIC_ENCAP_P4_ */ diff --git a/dash-pipeline/bmv2/routing_actions/routing_actions.p4 b/dash-pipeline/bmv2/routing_actions/routing_actions.p4 index 3dbaa49c8..eb228c9a4 100644 --- a/dash-pipeline/bmv2/routing_actions/routing_actions.p4 +++ b/dash-pipeline/bmv2/routing_actions/routing_actions.p4 @@ -1,8 +1,9 @@ #ifndef _DASH_ROUTING_ACTIONS_P4_ #define _DASH_ROUTING_ACTIONS_P4_ -#include "routing_action_static_encap.p4" +#include "routing_action_encap_underlay.p4" +#include "routing_action_set_mac.p4" #include "routing_action_nat46.p4" #include "routing_action_nat64.p4" -#endif /* _DASH_ROUTING_ACTIONS_P4_ */ \ No newline at end of file +#endif /* _DASH_ROUTING_ACTIONS_P4_ */ diff --git a/dash-pipeline/bmv2/stages/conntrack_lookup.p4 b/dash-pipeline/bmv2/stages/conntrack_lookup.p4 index 2dbd0d41a..c55f17da1 100644 --- a/dash-pipeline/bmv2/stages/conntrack_lookup.p4 +++ b/dash-pipeline/bmv2/stages/conntrack_lookup.p4 @@ -3,6 +3,193 @@ #include "../dash_metadata.p4" +action conntrack_set_meta_from_dash_header(in headers_t hdr, out metadata_t meta) +{ + /* basic metadata */ + meta.direction = hdr.flow_data.direction; + meta.dash_tunnel_id = 0; + meta.routing_actions = (bit<32>)hdr.flow_data.actions; + meta.meter_class = hdr.flow_data.meter_class; + + /* encapsulation metadata */ +#ifdef TARGET_DPDK_PNA + meta.u0_encap_data.vni = hdr.flow_u0_encap_data.vni; + meta.u0_encap_data.underlay_sip = hdr.flow_u0_encap_data.underlay_sip; + meta.u0_encap_data.underlay_dip = hdr.flow_u0_encap_data.underlay_dip; + meta.u0_encap_data.underlay_smac = hdr.flow_u0_encap_data.underlay_smac; + meta.u0_encap_data.underlay_dmac = hdr.flow_u0_encap_data.underlay_dmac; + meta.u0_encap_data.dash_encapsulation = hdr.flow_u0_encap_data.dash_encapsulation; +#else + meta.u0_encap_data = hdr.flow_u0_encap_data; +#endif // TARGET_DPDK_PNA + + /* tunnel metadata */ +#ifdef TARGET_DPDK_PNA + meta.u1_encap_data.vni = hdr.flow_u1_encap_data.vni; + meta.u1_encap_data.underlay_sip = hdr.flow_u1_encap_data.underlay_sip; + meta.u1_encap_data.underlay_dip = hdr.flow_u1_encap_data.underlay_dip; + meta.u1_encap_data.underlay_smac = hdr.flow_u1_encap_data.underlay_smac; + meta.u1_encap_data.underlay_dmac = hdr.flow_u1_encap_data.underlay_dmac; + meta.u1_encap_data.dash_encapsulation = hdr.flow_u1_encap_data.dash_encapsulation; +#else + meta.u1_encap_data = hdr.flow_u1_encap_data; +#endif // TARGET_DPDK_PNA + + /* overlay rewrite metadata */ +#ifdef TARGET_DPDK_PNA + meta.overlay_data.dmac = hdr.flow_overlay_data.dmac; + meta.overlay_data.sip = hdr.flow_overlay_data.sip; + meta.overlay_data.dip = hdr.flow_overlay_data.dip; + meta.overlay_data.sip_mask = hdr.flow_overlay_data.sip_mask; + meta.overlay_data.dip_mask = hdr.flow_overlay_data.dip_mask; + meta.overlay_data.is_ipv6 = hdr.flow_overlay_data.is_ipv6; +#else + meta.overlay_data = hdr.flow_overlay_data; +#endif // TARGET_DPDK_PNA +} + +action conntrack_strip_dash_header(inout headers_t hdr) +{ + hdr.dp_ethernet.setInvalid(); + hdr.packet_meta.setInvalid(); + hdr.flow_key.setInvalid(); + hdr.flow_data.setInvalid(); + hdr.flow_overlay_data.setInvalid(); + hdr.flow_u0_encap_data.setInvalid(); + hdr.flow_u1_encap_data.setInvalid(); +} + +control conntrack_build_dash_header(inout headers_t hdr, in metadata_t meta, + dash_packet_subtype_t packet_subtype) +{ + apply { + bit<16> length = 0; + + hdr.flow_data.setValid(); + hdr.flow_data.is_unidirectional = 0; + hdr.flow_data.version = 0; + hdr.flow_data.direction = meta.direction; + hdr.flow_data.actions = (dash_flow_action_t)meta.routing_actions; + hdr.flow_data.meter_class = meta.meter_class; + length = length + FLOW_DATA_HDR_SIZE; + + if (meta.routing_actions & dash_routing_actions_t.ENCAP_U0 != 0) { +#ifdef TARGET_DPDK_PNA + hdr.flow_u0_encap_data.setValid(); + hdr.flow_u0_encap_data.vni = meta.u0_encap_data.vni; + hdr.flow_u0_encap_data.underlay_sip = meta.u0_encap_data.underlay_sip; + hdr.flow_u0_encap_data.underlay_dip = meta.u0_encap_data.underlay_dip; + hdr.flow_u0_encap_data.underlay_smac = meta.u0_encap_data.underlay_smac; + hdr.flow_u0_encap_data.underlay_dmac = meta.u0_encap_data.underlay_dmac; + hdr.flow_u0_encap_data.dash_encapsulation = meta.u0_encap_data.dash_encapsulation; +#else + hdr.flow_u0_encap_data= meta.u0_encap_data; +#endif // TARGET_DPDK_PNA + length = length + ENCAP_DATA_HDR_SIZE; + } + + if (meta.routing_actions & dash_routing_actions_t.ENCAP_U1 != 0) { +#ifdef TARGET_DPDK_PNA + hdr.flow_u1_encap_data.setValid(); + hdr.flow_u1_encap_data.vni = meta.u1_encap_data.vni; + hdr.flow_u1_encap_data.underlay_sip = meta.u1_encap_data.underlay_sip; + hdr.flow_u1_encap_data.underlay_dip = meta.u1_encap_data.underlay_dip; + hdr.flow_u1_encap_data.underlay_smac = meta.u1_encap_data.underlay_smac; + hdr.flow_u1_encap_data.underlay_dmac = meta.u1_encap_data.underlay_dmac; + hdr.flow_u1_encap_data.dash_encapsulation = meta.u1_encap_data.dash_encapsulation; +#else + hdr.flow_u1_encap_data= meta.u1_encap_data; +#endif // TARGET_DPDK_PNA + length = length + ENCAP_DATA_HDR_SIZE; + } + + if (meta.routing_actions != 0) { +#ifdef TARGET_DPDK_PNA + hdr.flow_overlay_data.setValid(); + hdr.flow_overlay_data.dmac = meta.overlay_data.dmac; + hdr.flow_overlay_data.sip = meta.overlay_data.sip; + hdr.flow_overlay_data.dip = meta.overlay_data.dip; + hdr.flow_overlay_data.sip_mask = meta.overlay_data.sip_mask; + hdr.flow_overlay_data.dip_mask = meta.overlay_data.dip_mask; + hdr.flow_overlay_data.is_ipv6 = meta.overlay_data.is_ipv6; +#else + hdr.flow_overlay_data= meta.overlay_data; +#endif // TARGET_DPDK_PNA + length = length + OVERLAY_REWRITE_DATA_HDR_SIZE; + } + + length = length + FLOW_KEY_HDR_SIZE; + + hdr.packet_meta.setValid(); + hdr.packet_meta.packet_source = dash_packet_source_t.PIPELINE; + hdr.packet_meta.packet_type = dash_packet_type_t.REGULAR; + hdr.packet_meta.packet_subtype = packet_subtype; + hdr.packet_meta.length = length + PACKET_META_HDR_SIZE; + + hdr.dp_ethernet.setValid(); + hdr.dp_ethernet.dst_addr = DPAPP_MAC; + hdr.dp_ethernet.src_addr = meta.u0_encap_data.underlay_smac; + hdr.dp_ethernet.ether_type = DASH_ETHTYPE; + } +} + +control conntrack_flow_miss_handle(inout headers_t hdr, inout metadata_t meta) +{ + apply { + if ((hdr.customer_tcp.isValid() && hdr.customer_tcp.flags == 0x2 /* SYN */) + || hdr.customer_udp.isValid()) { + conntrack_build_dash_header.apply(hdr, meta, dash_packet_subtype_t.FLOW_CREATE); + meta.to_dpapp = true; // trap to dpapp + return; + } + else if ((hdr.customer_tcp.flags & 0b000101 /* FIN/RST */) != 0 + && hdr.packet_meta.packet_source == dash_packet_source_t.DPAPP) { + /* Flow should be just deleted by dpapp */ + conntrack_set_meta_from_dash_header(hdr, meta); + return; + } + + // should not reach here + meta.dropped = true; // drop it + } +} + +control conntrack_flow_created_handle(inout headers_t hdr, inout metadata_t meta) +{ + apply { + if (hdr.customer_tcp.isValid()) { + if ((hdr.customer_tcp.flags & 0b000101 /* FIN/RST */) != 0) { + conntrack_build_dash_header.apply(hdr, meta, dash_packet_subtype_t.FLOW_DELETE); + meta.to_dpapp = true; // trap to dpapp + return; + } + } + + // TODO update flow timestamp for aging + } +} + + +control conntrack_flow_handle(inout headers_t hdr, inout metadata_t meta) +{ + apply { + switch (meta.flow_sync_state) { + dash_flow_sync_state_t.FLOW_MISS: { + conntrack_flow_miss_handle.apply(hdr, meta); + } + dash_flow_sync_state_t.FLOW_CREATED: { + conntrack_flow_created_handle.apply(hdr, meta); + } + } + + // Drop dash header if not sending to dpapp + if (!meta.to_dpapp) { + conntrack_strip_dash_header(hdr); + } + } +} + + control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { // // Flow table: @@ -12,15 +199,15 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { @SaiVal[type="sai_dash_flow_enabled_key_t"] dash_flow_enabled_key_t dash_flow_enabled_key, bit<32> flow_ttl_in_milliseconds) { - meta.conntrack_data.flow_table.max_flow_count = max_flow_count; - meta.conntrack_data.flow_table.flow_enabled_key = dash_flow_enabled_key; - meta.conntrack_data.flow_table.flow_ttl_in_milliseconds = flow_ttl_in_milliseconds; + meta.flow_table.max_flow_count = max_flow_count; + meta.flow_table.flow_enabled_key = dash_flow_enabled_key; + meta.flow_table.flow_ttl_in_milliseconds = flow_ttl_in_milliseconds; } @SaiTable[name = "flow_table", api = "dash_flow", order = 0, isobject="true"] table flow_table { key = { - meta.conntrack_data.flow_table.id : exact; + meta.flow_table.id : exact; } actions = { @@ -38,70 +225,75 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { @SaiVal[type="sai_dash_flow_action_t"] dash_flow_action_t dash_flow_action, bit<32> meter_class, bit<1> is_unidirectional_flow, + @SaiVal[type="sai_dash_flow_sync_state_t"] dash_flow_sync_state_t dash_flow_sync_state, - /* Reverse flow key */ + /* Reverse flow key */ EthernetAddress reverse_flow_eni_mac, bit<16> reverse_flow_vnet_id, bit<8> reverse_flow_ip_proto, IPv4ORv6Address reverse_flow_src_ip, - IPv4ORv6Address reverse_flow_dst_ip, + IPv4ORv6Address reverse_flow_dst_ip, bit<16> reverse_flow_src_port, bit<16> reverse_flow_dst_port, + bit<1> reverse_flow_dst_ip_is_v6, /* Flow encap related attributes */ bit<24> underlay0_vnet_id, - IPv4Address underlay0_sip, + IPv4Address underlay0_sip, IPv4Address underlay0_dip, + EthernetAddress underlay0_smac, + EthernetAddress underlay0_dmac, @SaiVal[type="sai_dash_encapsulation_t"] dash_encapsulation_t underlay0_dash_encapsulation, - + bit<24> underlay1_vnet_id, - IPv4Address underlay1_sip, + IPv4Address underlay1_sip, IPv4Address underlay1_dip, EthernetAddress underlay1_smac, EthernetAddress underlay1_dmac, @SaiVal[type="sai_dash_encapsulation_t"] dash_encapsulation_t underlay1_dash_encapsulation, - + /* Flow overlay rewrite related attributes */ EthernetAddress dst_mac, IPv4ORv6Address sip, IPv4ORv6Address dip, IPv6Address sip_mask, IPv6Address dip_mask, - - /* Extra flow metadata */ + bit<1> dip_is_v6, + + /* Extra flow metadata */ @SaiVal[type="sai_u8_list_t"] bit<16> vendor_metadata, @SaiVal[type="sai_u8_list_t"] bit<16> flow_data_pb) { /* Set Flow basic metadata */ - meta.conntrack_data.flow_data.version = version; - meta.conntrack_data.flow_data.dash_direction = dash_direction; - meta.conntrack_data.flow_data.actions = dash_flow_action; + meta.flow_data.version = version; + meta.flow_data.direction = dash_direction; + meta.flow_data.actions = dash_flow_action; + meta.flow_data.meter_class = meter_class; + meta.flow_data.is_unidirectional= is_unidirectional_flow; + + /* Also set basic metadata */ + meta.flow_sync_state = dash_flow_sync_state; + meta.direction = dash_direction; + meta.routing_actions = dash_flow_action; meta.meter_class = meter_class; - meta.conntrack_data.is_unidirectional_flow = is_unidirectional_flow; - - /* Set reverse flow key */ - meta.conntrack_data.reverse_flow_key.eni_mac = reverse_flow_eni_mac; - meta.conntrack_data.reverse_flow_key.vnet_id = reverse_flow_vnet_id; - meta.conntrack_data.reverse_flow_key.ip_proto = reverse_flow_ip_proto; - meta.conntrack_data.reverse_flow_key.src_ip = reverse_flow_src_ip; - meta.conntrack_data.reverse_flow_key.dst_ip = reverse_flow_dst_ip; - meta.conntrack_data.reverse_flow_key.src_port = reverse_flow_src_port; - meta.conntrack_data.reverse_flow_key.dst_port = reverse_flow_dst_port; + /* Reverse flow key is not used by now */ + ; /* Set encapsulation metadata */ - meta.encap_data.vni = underlay0_vnet_id; - meta.encap_data.underlay_sip = underlay0_sip; - meta.encap_data.underlay_dip = underlay0_dip; - meta.encap_data.dash_encapsulation = underlay0_dash_encapsulation; - - meta.tunnel_data.vni = underlay1_vnet_id; - meta.tunnel_data.underlay_sip = underlay1_sip; - meta.tunnel_data.underlay_dip = underlay1_dip; - meta.tunnel_data.dash_encapsulation = underlay1_dash_encapsulation; - meta.tunnel_data.underlay_smac = underlay1_smac; - meta.tunnel_data.underlay_dmac = underlay1_dmac; + meta.u0_encap_data.vni = underlay0_vnet_id; + meta.u0_encap_data.underlay_sip = underlay0_sip; + meta.u0_encap_data.underlay_dip = underlay0_dip; + meta.u0_encap_data.dash_encapsulation = underlay0_dash_encapsulation; + meta.u0_encap_data.underlay_smac = underlay0_smac; + meta.u0_encap_data.underlay_dmac = underlay0_dmac; + meta.u1_encap_data.vni = underlay1_vnet_id; + meta.u1_encap_data.underlay_sip = underlay1_sip; + meta.u1_encap_data.underlay_dip = underlay1_dip; + meta.u1_encap_data.dash_encapsulation = underlay1_dash_encapsulation; + meta.u1_encap_data.underlay_smac = underlay1_smac; + meta.u1_encap_data.underlay_dmac = underlay1_dmac; /* Set overlay rewrite metadata */ meta.overlay_data.dmac = dst_mac; @@ -109,32 +301,39 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { meta.overlay_data.dip = dip; meta.overlay_data.sip_mask = sip_mask; meta.overlay_data.dip_mask = dip_mask; + meta.overlay_data.is_ipv6 = dip_is_v6; + } + + action flow_miss() { + meta.flow_sync_state = dash_flow_sync_state_t.FLOW_MISS; } @SaiTable[name = "flow", api = "dash_flow", order = 1, enable_bulk_get_api = "true", enable_bulk_get_server = "true"] table flow_entry { key = { - meta.conntrack_data.flow_key.eni_mac : exact; - meta.conntrack_data.flow_key.vnet_id : exact; - meta.conntrack_data.flow_key.ip_proto : exact; - meta.conntrack_data.flow_key.src_ip : exact; - meta.conntrack_data.flow_key.dst_ip : exact; - meta.conntrack_data.flow_key.src_port : exact; - meta.conntrack_data.flow_key.dst_port : exact; - meta.conntrack_data.flow_key.is_ipv6 : exact @SaiVal[name = "src_ip_is_v6"]; + hdr.flow_key.eni_mac : exact; + hdr.flow_key.vnet_id : exact; + hdr.flow_key.src_ip : exact; + hdr.flow_key.dst_ip : exact; + hdr.flow_key.src_port : exact; + hdr.flow_key.dst_port : exact; + hdr.flow_key.ip_proto : exact; + hdr.flow_key.is_ip_v6 : exact @SaiVal[name = "src_ip_is_v6"]; } actions = { set_flow_entry_attr; + @defaultonly flow_miss; } + const default_action = flow_miss; } - + // // Flow bulk get session filter: // For API generation only and has no effect on the dataplane // action set_flow_entry_bulk_get_session_filter_attr( - @SaiVal[type="sai_dash_flow_entry_bulk_get_session_filter_key_t"] dash_flow_entry_bulk_get_session_filter_key_t dash_flow_entry_bulk_get_session_filter_key, + @SaiVal[type="sai_dash_flow_entry_bulk_get_session_filter_key_t"] dash_flow_entry_bulk_get_session_filter_key_t dash_flow_entry_bulk_get_session_filter_key, @SaiVal[type="sai_dash_flow_entry_bulk_get_session_op_key_t"] dash_flow_entry_bulk_get_session_op_key_t dash_flow_entry_bulk_get_session_op_key, bit<64> int_value, IPv4ORv6Address ip_value, @@ -148,14 +347,14 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { // action set_flow_entry_bulk_get_session_attr( /* Mode and limitation */ - @SaiVal[type="sai_dash_flow_entry_bulk_get_session_mode_t"] dash_flow_entry_bulk_get_session_mode_t dash_flow_entry_bulk_get_session_mode, + @SaiVal[type="sai_dash_flow_entry_bulk_get_session_mode_t"] dash_flow_entry_bulk_get_session_mode_t dash_flow_entry_bulk_get_session_mode, bit<32> bulk_get_entry_limitation, - + /* GRPC Session server IP and port */ IPv4ORv6Address bulk_get_session_server_ip, bit<16> bulk_get_session_server_port, - /* Session filters */ + /* Session filters */ @SaiVal[type="sai_object_id_t"] bit<16> first_flow_entry_bulk_get_session_filter_id, @SaiVal[type="sai_object_id_t"] bit<16> second_flow_entry_bulk_get_session_filter_id, @SaiVal[type="sai_object_id_t"] bit<16> third_flow_entry_bulk_get_session_filter_id, @@ -164,12 +363,11 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { { } - @SaiTable[name = "flow_entry_bulk_get_session_filter", api = "dash_flow", order = 2, isobject="true"] table flow_entry_bulk_get_session_filter { key = { - meta.conntrack_data.bulk_get_session_filter_id: exact @SaiVal[name = "bulk_get_session_filter_id", type="sai_object_id_t"]; + meta.bulk_get_session_filter_id: exact @SaiVal[name = "bulk_get_session_filter_id", type="sai_object_id_t"]; } actions = { @@ -180,7 +378,7 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { @SaiTable[name = "flow_entry_bulk_get_session", api = "dash_flow", order = 3, isobject="true"] table flow_entry_bulk_get_session { key = { - meta.conntrack_data.bulk_get_session_id: exact @SaiVal[name = "bulk_get_session_id", type="sai_object_id_t"]; + meta.bulk_get_session_id: exact @SaiVal[name = "bulk_get_session_id", type="sai_object_id_t"]; } actions = { @@ -188,33 +386,48 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { } } - apply { - flow_table.apply(); + action set_flow_key() + { + hdr.flow_key.setValid(); + hdr.flow_key.is_ip_v6 = meta.is_overlay_ip_v6; + // TODO remove hardcode flow_enabled_key later + meta.flow_table.flow_enabled_key = dash_flow_enabled_key_t.ENI_MAC | + dash_flow_enabled_key_t.VNI | + dash_flow_enabled_key_t.PROTOCOL | + dash_flow_enabled_key_t.SRC_IP | + dash_flow_enabled_key_t.DST_IP | + dash_flow_enabled_key_t.SRC_PORT | + dash_flow_enabled_key_t.DST_PORT; - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.ENI_MAC != 0) { - meta.conntrack_data.flow_key.eni_mac = meta.eni_addr; + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.ENI_MAC != 0) { + hdr.flow_key.eni_mac = meta.eni_addr; } - - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.VNI != 0) { - meta.conntrack_data.flow_key.vnet_id = meta.vnet_id; - } - - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.PROTOCOL != 0) { - meta.conntrack_data.flow_key.ip_proto = meta.ip_protocol; + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.VNI != 0) { + hdr.flow_key.vnet_id = meta.vnet_id; + } + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.PROTOCOL != 0) { + hdr.flow_key.ip_proto = meta.ip_protocol; } - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.SRC_IP != 0) { - meta.conntrack_data.flow_key.src_ip = meta.src_ip_addr; + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.SRC_IP != 0) { + hdr.flow_key.src_ip = meta.src_ip_addr; } - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.DST_IP != 0) { - meta.conntrack_data.flow_key.dst_ip = meta.dst_ip_addr; + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.DST_IP != 0) { + hdr.flow_key.dst_ip = meta.dst_ip_addr; } - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.SRC_PORT != 0) { - meta.conntrack_data.flow_key.src_port = meta.src_l4_port; + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.SRC_PORT != 0) { + hdr.flow_key.src_port = meta.src_l4_port; } - if (meta.conntrack_data.flow_table.flow_enabled_key & dash_flow_enabled_key_t.DST_PORT != 0) { - meta.conntrack_data.flow_key.dst_port = meta.dst_l4_port; + if (meta.flow_table.flow_enabled_key & dash_flow_enabled_key_t.DST_PORT != 0) { + hdr.flow_key.dst_port = meta.dst_l4_port; + } + } + + apply { + if (!hdr.flow_key.isValid()) { + flow_table.apply(); + set_flow_key(); } flow_entry.apply(); @@ -222,5 +435,4 @@ control conntrack_lookup_stage(inout headers_t hdr, inout metadata_t meta) { flow_entry_bulk_get_session.apply(); } } - #endif /* _DASH_STAGE_CONNTRACK_LOOKUP_P4 */ diff --git a/dash-pipeline/bmv2/stages/outbound_mapping.p4 b/dash-pipeline/bmv2/stages/outbound_mapping.p4 index 83e7be65f..e44624d16 100644 --- a/dash-pipeline/bmv2/stages/outbound_mapping.p4 +++ b/dash-pipeline/bmv2/stages/outbound_mapping.p4 @@ -30,7 +30,7 @@ control outbound_mapping_stage( } action set_vnet_attrs(bit<24> vni) { - meta.encap_data.vni = vni; + meta.u0_encap_data.vni = vni; } @SaiTable[name = "vnet", api = "dash_vnet", isobject="true"] diff --git a/dash-pipeline/bmv2/stages/outbound_pre_routing_action_apply.p4 b/dash-pipeline/bmv2/stages/outbound_pre_routing_action_apply.p4 index 74329f13d..5b536e959 100644 --- a/dash-pipeline/bmv2/stages/outbound_pre_routing_action_apply.p4 +++ b/dash-pipeline/bmv2/stages/outbound_pre_routing_action_apply.p4 @@ -1,6 +1,8 @@ #ifndef _DASH_STAGE_OUTBOUND_PRE_ROUTING_ACTION_APPLY_P4_ #define _DASH_STAGE_OUTBOUND_PRE_ROUTING_ACTION_APPLY_P4_ +#include "tunnel_stage.p4" + control outbound_pre_routing_action_apply_stage( inout headers_t hdr, inout metadata_t meta) @@ -11,9 +13,11 @@ control outbound_pre_routing_action_apply_stage( return; } + tunnel_stage.apply(hdr, meta); + // Once it is done, move to routing action apply stage. meta.target_stage = dash_pipeline_stage_t.ROUTING_ACTION_APPLY; } } -#endif /* _DASH_STAGE_OUTBOUND_PRE_ROUTING_ACTION_APPLY_P4_ */ \ No newline at end of file +#endif /* _DASH_STAGE_OUTBOUND_PRE_ROUTING_ACTION_APPLY_P4_ */ diff --git a/dash-pipeline/bmv2/stages/pre_pipeline.p4 b/dash-pipeline/bmv2/stages/pre_pipeline.p4 index 8edfcd602..fc94c672b 100644 --- a/dash-pipeline/bmv2/stages/pre_pipeline.p4 +++ b/dash-pipeline/bmv2/stages/pre_pipeline.p4 @@ -25,8 +25,8 @@ control pre_pipeline_stage(inout headers_t hdr, action set_underlay_mac(EthernetAddress neighbor_mac, EthernetAddress mac) { - meta.encap_data.underlay_dmac = neighbor_mac; - meta.encap_data.underlay_smac = mac; + meta.u0_encap_data.underlay_dmac = neighbor_mac; + meta.u0_encap_data.underlay_smac = mac; } /* This table API should be implemented manually using underlay SAI */ @@ -109,7 +109,7 @@ control pre_pipeline_stage(inout headers_t hdr, if (vip.apply().hit) { /* Use the same VIP that was in packet's destination if it's present in the VIP table */ - meta.encap_data.underlay_sip = meta.rx_encap.underlay_dip; + meta.u0_encap_data.underlay_sip = meta.rx_encap.underlay_dip; } else { UPDATE_COUNTER(vip_miss_drop, 0); diff --git a/dash-pipeline/bmv2/stages/routing_action_apply.p4 b/dash-pipeline/bmv2/stages/routing_action_apply.p4 index 9543060fd..bb54c4245 100644 --- a/dash-pipeline/bmv2/stages/routing_action_apply.p4 +++ b/dash-pipeline/bmv2/stages/routing_action_apply.p4 @@ -2,7 +2,6 @@ #define _DASH_STAGE_ACTION_APPLY_P4_ #include "../routing_actions/routing_actions.p4" -#include "tunnel_stage.p4" control routing_action_apply( inout headers_t hdr, @@ -11,11 +10,13 @@ control routing_action_apply( apply { do_action_nat46.apply(hdr, meta); do_action_nat64.apply(hdr, meta); + do_action_set_dmac.apply(hdr, meta); // Encaps needs to be added after all other transforms, from inner ones to outer ones, // because it requires the transforms on the inner packet to be finished in order to // get the correct inner packet size and other informations. - do_action_static_encap.apply(hdr, meta); + do_action_encap_u0.apply(hdr, meta); + do_action_encap_u1.apply(hdr, meta); } } diff --git a/dash-pipeline/bmv2/stages/tunnel_stage.p4 b/dash-pipeline/bmv2/stages/tunnel_stage.p4 index 66194c667..254f1b447 100644 --- a/dash-pipeline/bmv2/stages/tunnel_stage.p4 +++ b/dash-pipeline/bmv2/stages/tunnel_stage.p4 @@ -5,6 +5,12 @@ control tunnel_stage( inout headers_t hdr, inout metadata_t meta) { +#ifdef TARGET_DPDK_PNA + meta_encap_data_t tunnel_data; +#else + encap_data_t tunnel_data; +#endif // TARGET_DPDK_PNA + action set_tunnel_attrs( @SaiVal[type="sai_dash_encapsulation_t", default_value="SAI_DASH_ENCAPSULATION_VXLAN", create_only="true"] dash_encapsulation_t dash_encapsulation, @@ -23,10 +29,10 @@ control tunnel_stage( { meta.dash_tunnel_max_member_size = max_member_size; - meta.tunnel_data.dash_encapsulation = dash_encapsulation; - meta.tunnel_data.vni = tunnel_key; - meta.tunnel_data.underlay_sip = sip == 0 ? hdr.u0_ipv4.src_addr : sip; - meta.tunnel_data.underlay_dip = dip; + tunnel_data.dash_encapsulation = dash_encapsulation; + tunnel_data.vni = tunnel_key; + tunnel_data.underlay_sip = sip == 0 ? hdr.u0_ipv4.src_addr : sip; + tunnel_data.underlay_dip = dip; } @SaiTable[name = "dash_tunnel", api = "dash_tunnel", order = 0, isobject="true"] @@ -85,7 +91,8 @@ control tunnel_stage( @SaiVal[type="sai_ip_address_t"] IPv4Address dip) { - meta.tunnel_data.underlay_dip = dip == 0 ? meta.tunnel_data.underlay_dip : dip; + REQUIRES(dip != 0); + tunnel_data.underlay_dip = dip; } @SaiTable[name = "dash_tunnel_next_hop", api = "dash_tunnel", order = 2, isobject="true"] @@ -125,30 +132,23 @@ control tunnel_stage( tunnel_next_hop.apply(); } - push_action_static_encap(hdr = hdr, + if (meta.routing_actions & dash_routing_actions_t.ENCAP_U0 == 0) { + meta.tunnel_pointer = 0; + push_action_encap_u0(hdr = hdr, meta = meta, - encap = meta.tunnel_data.dash_encapsulation, - vni = meta.tunnel_data.vni, - underlay_sip = meta.tunnel_data.underlay_sip, - underlay_dip = meta.tunnel_data.underlay_dip, - overlay_dmac = hdr.u0_ethernet.dst_addr); - } -} - -control tunnel_stage_encap( - inout headers_t hdr, - inout metadata_t meta) -{ - apply { - if (meta.dash_tunnel_id != 0) { - do_tunnel_encap(hdr, meta, - meta.overlay_data.dmac, - meta.tunnel_data.underlay_dmac, - meta.tunnel_data.underlay_smac, - meta.tunnel_data.underlay_dip, - meta.tunnel_data.underlay_sip, - meta.tunnel_data.dash_encapsulation, - meta.tunnel_data.vni); + encap = tunnel_data.dash_encapsulation, + vni = tunnel_data.vni, + underlay_sip = tunnel_data.underlay_sip, + underlay_dip = tunnel_data.underlay_dip); + } + else { + meta.tunnel_pointer = 1; + push_action_encap_u1(hdr = hdr, + meta = meta, + encap = tunnel_data.dash_encapsulation, + vni = tunnel_data.vni, + underlay_sip = tunnel_data.underlay_sip, + underlay_dip = tunnel_data.underlay_dip); } } } diff --git a/dash-pipeline/bmv2/underlay.p4 b/dash-pipeline/bmv2/underlay.p4 index a55e71dcd..ec242d214 100644 --- a/dash-pipeline/bmv2/underlay.p4 +++ b/dash-pipeline/bmv2/underlay.p4 @@ -50,7 +50,12 @@ control underlay( action def_act() { #ifdef TARGET_BMV2_V1MODEL - standard_metadata.egress_spec = standard_metadata.ingress_port; + if (hdr.packet_meta.packet_source == dash_packet_source_t.DPAPP) { + standard_metadata.egress_spec = 0; /* FIXME */ + } + else { + standard_metadata.egress_spec = standard_metadata.ingress_port; + } #endif // TARGET_BMV2_V1MODEL #ifdef TARGET_DPDK_PNA @@ -82,6 +87,8 @@ control underlay( /* Send packet on same port it arrived (echo) by default */ @defaultonly def_act; } + + const default_action = def_act; } apply { diff --git a/documentation/dataplane/dash-flow-api.md b/documentation/dataplane/dash-flow-api.md index 5710bce10..bb5286728 100644 --- a/documentation/dataplane/dash-flow-api.md +++ b/documentation/dataplane/dash-flow-api.md @@ -3,6 +3,7 @@ | Rev | Date | Author | Change Description | | --- | ---- | ------ | ------------------ | | 0.1 | 03/20/2024 | Zhixiong Niu | Initial version | +| 0.2 | 09/10/2024 | Junhua Zhai | Added flow attributes - flow_sync_state, underlay0 SMAC/DMAC | ## Table of Contents @@ -207,6 +208,7 @@ These are the basic attributes of flow entry. | SAI_FLOW_ENTRY_ATTR_DASH_FLOW_ACTION | `sai_dash_flow_action_t` | Action to be applied on the flow | | SAI_FLOW_ENTRY_ATTR_METER_CLASS | `sai_uint32_t` | Meter class for flow entry, used for traffic metering and policing. | | SAI_FLOW_ENTRY_ATTR_IS_UNIDIRECTIONAL_FLOW | `bool` | Indicates if the flow is unidirectional | +| SAI_FLOW_ENTRY_ATTR_DASH_FLOW_SYNC_STATE | `sai_dash_flow_sync_state_t` | [Flow sync state](https://github.com/sonic-net/DASH/blob/main/documentation/high-avail/ha-api-hld.md#44-flow) | #### Reverse flow key @@ -231,6 +233,8 @@ These are the related attributes of flow encapsulation. | SAI_FLOW_ENTRY_ATTR_UNDERLAY0_VNI | `sai_uint32_t` | Destination VNI in the underlay network | | SAI_FLOW_ENTRY_ATTR_UNDERLAY0_SIP | `sai_uint32_t` | Source IP address in the underlay network | | SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DIP | `sai_uint32_t` | Destination IP address in the underlay network | +| SAI_FLOW_ENTRY_ATTR_UNDERLAY0_SMAC | `sai_mac_t` | Source MAC address in the underlay network | +| SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DMAC | `sai_mac_t` | Destination MAC address in the underlay network | | SAI_FLOW_ENTRY_ATTR_UNDERLAY0_DASH_ENCAPSULATION | `sai_dash_encapsulation_t` | Encapsulation method for DASH traffic in the underlay network | | SAI_FLOW_ENTRY_ATTR_UNDERLAY1_VNI | `sai_uint32_t` | Destination VNI in the 2nd underlay network | | SAI_FLOW_ENTRY_ATTR_UNDERLAY1_SIP | `sai_uint32_t` | Source IP address in the 2nd underlay network | diff --git a/documentation/high-avail/ha-api-hld.md b/documentation/high-avail/ha-api-hld.md index 30406b894..39aff79ab 100644 --- a/documentation/high-avail/ha-api-hld.md +++ b/documentation/high-avail/ha-api-hld.md @@ -9,6 +9,7 @@ | 0.5 | 04/08/2024 | Riff Jiang | Added support for bulk sync. | | 0.6 | 04/09/2024 | Riff Jiang | Added support for flow reconcile for planned and unplanned switchover. | | 0.7 | 06/20/2024 | Mukesh Velayudhan | Added DPU scope DPU driven attributes and description. | +| 0.8 | 09/10/2024 | Junhua Zhai| Updated flow attr name and type for flow sync state. | 1. [1. Terminology](#1-terminology) 2. [2. Background](#2-background) @@ -175,20 +176,20 @@ To support HA, each flow contains the following SAI attributes: | Attribute name | Type | Description | | -------------- | ---- | ----------- | -| SAI_FLOW_ATTR_FLOW_VERSION | `sai_uint32_t` | The flow version. | -| SAI_FLOW_ATTR_FLOW_SYNC_STATE | `sai_dash_ha_flow_sync_state_t` | The flow sync state. | +| SAI_FLOW_ENTRY_ATTR_VERSION | `sai_uint32_t` | The flow version. | +| SAI_FLOW_ENTRY_ATTR_DASH_FLOW_SYNC_STATE | `sai_dash_flow_sync_state_t` | The flow sync state. | The flow sync state is defined as below: ```c -typedef enum _sai_dash_ha_flow_sync_state_t +typedef enum _sai_dash_flow_sync_state_t { - SAI_DASH_HA_FLOW_SYNC_STATE_FLOW_MISS, - SAI_DASH_HA_FLOW_SYNC_STATE_FLOW_CREATED, - SAI_DASH_HA_FLOW_SYNC_STATE_FLOW_SYNCED, - SAI_DASH_HA_FLOW_SYNC_STATE_FLOW_PENDING_DELETE, - SAI_DASH_HA_FLOW_SYNC_STATE_FLOW_PENDING_RESIMULATION -} sai_dash_ha_flow_sync_state_t; + SAI_DASH_FLOW_SYNC_STATE_FLOW_MISS, + SAI_DASH_FLOW_SYNC_STATE_FLOW_CREATED, + SAI_DASH_FLOW_SYNC_STATE_FLOW_SYNCED, + SAI_DASH_FLOW_SYNC_STATE_FLOW_PENDING_DELETE, + SAI_DASH_FLOW_SYNC_STATE_FLOW_PENDING_RESIMULATION +} sai_dash_flow_sync_state_t; ``` The flow sync state is a small state machine that represents if the flow is synched or not, so we can make the packet processing decision accordingly to achieve HA. diff --git a/test/test-cases/functional/ptf/saidashacl.py b/test/test-cases/functional/ptf/saidashacl.py index 192779bf6..34dff83f2 100644 --- a/test/test-cases/functional/ptf/saidashacl.py +++ b/test/test-cases/functional/ptf/saidashacl.py @@ -229,7 +229,7 @@ def setUpSwitch(self): disable_fast_path_icmp_flow_redirection=0, full_flow_resimulation_requested=False, max_resimulated_flow_per_second=0, - outbound_routing_group_id=0) + outbound_routing_group_id=self.outbound_routing_group) self.eam = sai_thrift_eni_ether_address_map_entry_t( switch_id=self.switch_id, address=self.eni_mac)