Skip to content

Commit

Permalink
Add tunnel stage (#556)
Browse files Browse the repository at this point in the history
Add an extra tunnel stage for a second layer of encapsulation
  • Loading branch information
marian-pritsak authored May 30, 2024
1 parent e39249b commit 6b9c3be
Show file tree
Hide file tree
Showing 20 changed files with 169 additions and 51 deletions.
4 changes: 4 additions & 0 deletions dash-pipeline/bmv2/dash_metadata.p4
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,12 @@ struct metadata_t {

// 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;
overlay_rewrite_data_t overlay_data;
bit<16> dash_tunnel_id;
bit<32> meter_class;
}

Expand Down
4 changes: 4 additions & 0 deletions dash-pipeline/bmv2/dash_pipeline.p4
Original file line number Diff line number Diff line change
Expand Up @@ -353,8 +353,12 @@ control dash_ingress(
inbound.apply(hdr, meta);
}

tunnel_stage.apply(hdr, meta);

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;

Expand Down
17 changes: 16 additions & 1 deletion dash-pipeline/bmv2/dash_routing_types.p4
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,13 @@ action route_vnet(
inout headers_t hdr,
inout metadata_t meta,
@SaiVal[type="sai_object_id_t"] bit<16> dst_vnet_id,
@SaiVal[type="sai_object_id_t"] bit<16> dash_tunnel_id,
bit<32> meter_class_or,
@SaiVal[default_value="4294967295"] bit<32> meter_class_and,
dash_routing_actions_t routing_actions_disabled_in_flow_resimulation)
{
meta.dash_tunnel_id = dash_tunnel_id;

meta.target_stage = dash_pipeline_stage_t.OUTBOUND_MAPPING;
meta.dst_vnet_id = dst_vnet_id;
set_meter_attrs(meta, meter_class_or, meter_class_and);
Expand All @@ -42,13 +45,16 @@ action route_vnet_direct(
inout headers_t hdr,
inout metadata_t meta,
bit<16> dst_vnet_id,
@SaiVal[type="sai_object_id_t"] bit<16> dash_tunnel_id,
bit<1> overlay_ip_is_v6,
@SaiVal[type="sai_ip_address_t"]
IPv4ORv6Address overlay_ip,
bit<32> meter_class_or,
@SaiVal[default_value="4294967295"] bit<32> meter_class_and,
dash_routing_actions_t routing_actions_disabled_in_flow_resimulation)
{
meta.dash_tunnel_id = dash_tunnel_id;

meta.target_stage = dash_pipeline_stage_t.OUTBOUND_MAPPING;
meta.dst_vnet_id = dst_vnet_id;
meta.lkup_dst_ip_addr = overlay_ip;
Expand All @@ -62,12 +68,14 @@ action route_vnet_direct(
action route_direct(
inout headers_t hdr,
inout metadata_t meta,
@SaiVal[type="sai_object_id_t"] bit<16> dash_tunnel_id,
bit<32> meter_class_or,
@SaiVal[default_value="4294967295"] bit<32> meter_class_and,
dash_routing_actions_t routing_actions_disabled_in_flow_resimulation)
{
meta.target_stage = dash_pipeline_stage_t.OUTBOUND_PRE_ROUTING_ACTION_APPLY;
set_meter_attrs(meta, meter_class_or, meter_class_and);
meta.dash_tunnel_id = dash_tunnel_id;
}

// Routing Type - servicetunnel
Expand All @@ -91,10 +99,13 @@ action route_service_tunnel(
@SaiVal[type="sai_dash_encapsulation_t", default_value="SAI_DASH_ENCAPSULATION_VXLAN"]
dash_encapsulation_t dash_encapsulation,
bit<24> tunnel_key,
@SaiVal[type="sai_object_id_t"] bit<16> dash_tunnel_id,
bit<32> meter_class_or,
@SaiVal[default_value="4294967295"] bit<32> meter_class_and,
dash_routing_actions_t routing_actions_disabled_in_flow_resimulation)
{
meta.dash_tunnel_id = dash_tunnel_id;

/* Assume the overlay addresses provided are always IPv6 and the original are IPv4 */
/* assert(overlay_dip_is_v6 == 1 && overlay_sip_is_v6 == 1);
assert(overlay_dip_mask_is_v6 == 1 && overlay_sip_mask_is_v6 == 1);
Expand Down Expand Up @@ -133,10 +144,12 @@ action set_tunnel_mapping(
EthernetAddress overlay_dmac,
bit<1> use_dst_vnet_vni,
bit<32> meter_class_or,
@SaiVal[type="sai_object_id_t"] bit<16> dash_tunnel_id,
bit<1> flow_resimulation_requested,
dash_routing_actions_t routing_actions_disabled_in_flow_resimulation)
{
meta.target_stage = dash_pipeline_stage_t.OUTBOUND_PRE_ROUTING_ACTION_APPLY;
meta.dash_tunnel_id = dash_tunnel_id;

if (use_dst_vnet_vni == 1)
meta.vnet_id = meta.dst_vnet_id;
Expand All @@ -159,10 +172,12 @@ action set_private_link_mapping(
@SaiVal[type="sai_dash_encapsulation_t"] dash_encapsulation_t dash_encapsulation,
bit<24> tunnel_key,
bit<32> meter_class_or,
@SaiVal[type="sai_object_id_t"] bit<16> dash_tunnel_id,
bit<1> flow_resimulation_requested,
dash_routing_actions_t routing_actions_disabled_in_flow_resimulation)
{
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,
Expand Down Expand Up @@ -190,4 +205,4 @@ action set_private_link_mapping(
set_meter_attrs(meta, meter_class_or, 0xffffffff);
}

#endif /* _DASH_ROUTING_TYPES_P4_ */
#endif /* _DASH_ROUTING_TYPES_P4_ */
52 changes: 16 additions & 36 deletions dash-pipeline/bmv2/routing_actions/routing_action_static_encap.p4
Original file line number Diff line number Diff line change
Expand Up @@ -35,46 +35,26 @@ control do_action_static_encap(
}

if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) {
if (meta.tunnel_pointer == 0) {
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.tunnel_pointer == 1) {
push_vxlan_tunnel_u1(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);
}
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) {
if (meta.tunnel_pointer == 0) {
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.tunnel_pointer == 1) {
push_vxlan_tunnel_u1(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);
}
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_ */
#endif /* _DASH_ROUTING_ACTION_STATIC_ENCAP_P4_ */
2 changes: 1 addition & 1 deletion dash-pipeline/bmv2/stages/outbound_mapping.p4
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,4 @@ control outbound_mapping_stage(inout headers_t hdr,
}
}

#endif /* _DASH_STAGE_OUTBOUND_MAPPING_P4_ */
#endif /* _DASH_STAGE_OUTBOUND_MAPPING_P4_ */
3 changes: 2 additions & 1 deletion dash-pipeline/bmv2/stages/routing_action_apply.p4
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define _DASH_STAGE_ACTION_APPLY_P4_

#include "../routing_actions/routing_actions.p4"
#include "tunnel_stage.p4"

control routing_action_apply(
inout headers_t hdr,
Expand All @@ -18,4 +19,4 @@ control routing_action_apply(
}
}

#endif /* _DASH_STAGE_ACTION_APPLY_P4_ */
#endif /* _DASH_STAGE_ACTION_APPLY_P4_ */
57 changes: 57 additions & 0 deletions dash-pipeline/bmv2/stages/tunnel_stage.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#ifndef _DASH_STAGE_TUNNEL_P4_
#define _DASH_STAGE_TUNNEL_P4_

control tunnel_stage(
inout headers_t hdr,
inout metadata_t meta)
{
action set_tunnel_attrs(
@SaiVal[type="sai_ip_address_t"]
IPv4Address dip,
@SaiVal[type="sai_dash_encapsulation_t", default_value="SAI_DASH_ENCAPSULATION_VXLAN"]
dash_encapsulation_t dash_encapsulation,
bit<24> tunnel_key) {
push_action_static_encap(hdr = hdr,
meta = meta,
encap = dash_encapsulation,
vni = tunnel_key,
underlay_sip = hdr.u0_ipv4.src_addr,
underlay_dip = dip,
overlay_dmac = hdr.u0_ethernet.dst_addr);
}

@SaiTable[name = "dash_tunnel", api = "dash_tunnel", order = 0, isobject="true"]
table tunnel {
key = {
meta.dash_tunnel_id : exact @SaiVal[type="sai_object_id_t"];
}

actions = {
set_tunnel_attrs;
}
}

apply {
tunnel.apply();
}
}

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);
}
}
}

#endif /* _DASH_STAGE_TUNNEL_P4_ */
16 changes: 9 additions & 7 deletions test/test-cases/functional/ptf/sai_dash_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ def pa_validation_remove(self, pa_validation_entry):
sai_thrift_remove_pa_validation_entry(self.client, pa_validation_entry)

def outbound_routing_vnet_direct_create(self, eni_id, lpm, dst_vnet_id,
overlay_ip, counter_id=None):
overlay_ip, counter_id=None, dash_tunnel_id=0):
"""
Create outband vnet direct routing entry
"""
Expand All @@ -309,13 +309,13 @@ def outbound_routing_vnet_direct_create(self, eni_id, lpm, dst_vnet_id,
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,
meter_class_or=0, meter_class_and=-1, routing_actions_disabled_in_flow_resimulation = 0)
meter_class_or=0, meter_class_and=-1, dash_tunnel_id=dash_tunnel_id, routing_actions_disabled_in_flow_resimulation = 0)
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):
def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None, dash_tunnel_id=0):
"""
Create outband vnet direct routing entry
"""
Expand All @@ -325,13 +325,13 @@ def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None):
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,
meter_class_or=0, meter_class_and=-1, routing_actions_disabled_in_flow_resimulation = 0)
meter_class_or=0, meter_class_and=-1, dash_tunnel_id=dash_tunnel_id, routing_actions_disabled_in_flow_resimulation = 0)
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):
def outbound_routing_vnet_create(self, eni_id, lpm, dst_vnet_id, counter_id=None, dash_tunnel_id=0):
"""
Create outbound vnet routing entry
"""
Expand All @@ -343,15 +343,16 @@ def outbound_routing_vnet_create(self, eni_id, lpm, dst_vnet_id, counter_id=None
outbound_routing_entry, dst_vnet_id=dst_vnet_id,
counter_id=counter_id,
action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET,
meter_class_or=0, meter_class_and=-1, routing_actions_disabled_in_flow_resimulation = 0)
meter_class_or=0, meter_class_and=-1,
dash_tunnel_id=dash_tunnel_id, routing_actions_disabled_in_flow_resimulation = 0)
self.assertEqual(self.status(), SAI_STATUS_SUCCESS)
self.add_teardown_obj(self.outbound_routing_vnet_direct_remove, outbound_routing_entry)

def outbound_routing_vnet_direct_remove(self, entry):
sai_thrift_remove_outbound_routing_entry(self.client, entry)

def outbound_ca_to_pa_create(self, dst_vnet_id, dip, underlay_dip,
use_dst_vnet_vni=True, overlay_dmac=None):
use_dst_vnet_vni=True, overlay_dmac=None, dash_tunnel_id=0):
"""
Create outband CA PA mapping
"""
Expand All @@ -365,6 +366,7 @@ def outbound_ca_to_pa_create(self, dst_vnet_id, dip, underlay_dip,
use_dst_vnet_vni=use_dst_vnet_vni,
overlay_dmac=overlay_dmac,
meter_class_or=0,
dash_tunnel_id=dash_tunnel_id,
flow_resimulation_requested = False,
routing_actions_disabled_in_flow_resimulation = 0)
self.assertEqual(self.status(), SAI_STATUS_SUCCESS)
Expand Down
5 changes: 3 additions & 2 deletions test/test-cases/functional/ptf/saidashacl.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ def setUpSwitch(self):

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,
meter_class_or=0, meter_class_and=-1, routing_actions_disabled_in_flow_resimulation = 0)
meter_class_or=0, meter_class_and=-1, dash_tunnel_id=0, routing_actions_disabled_in_flow_resimulation = 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))
Expand All @@ -255,7 +255,8 @@ def setUpSwitch(self):
self.create_entry(sai_thrift_create_outbound_ca_to_pa_entry, sai_thrift_remove_outbound_ca_to_pa_entry,
self.ocpe, action=SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_TUNNEL_MAPPING,
underlay_dip=underlay_dip, overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni=True,
meter_class_or=0, flow_resimulation_requested = False, routing_actions_disabled_in_flow_resimulation = 0)
meter_class_or=0, dash_tunnel_id=0,
flow_resimulation_requested = False, routing_actions_disabled_in_flow_resimulation = 0)

def setupTest(self):
self.tests.append(AclRuleTest(self,
Expand Down
4 changes: 2 additions & 2 deletions test/test-cases/functional/ptf/saidashvnet_sanity.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ def configureVnet(self):
action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET,
dst_vnet_id=self.vnet,
meter_class_or=0, meter_class_and=-1,
routing_actions_disabled_in_flow_resimulation = 0)
dash_tunnel_id=0, routing_actions_disabled_in_flow_resimulation = 0)
assert(status == SAI_STATUS_SUCCESS)

underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
Expand All @@ -143,7 +143,7 @@ def configureVnet(self):
status = sai_thrift_create_outbound_ca_to_pa_entry(self.client, self.ocpe, action=SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_TUNNEL_MAPPING,
underlay_dip = underlay_dip,
overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni = True,
meter_class_or=0, flow_resimulation_requested = False,
meter_class_or=0, flow_resimulation_requested = False, dash_tunnel_id=0,
routing_actions_disabled_in_flow_resimulation = 0)
assert(status == SAI_STATUS_SUCCESS)

Expand Down
Loading

0 comments on commit 6b9c3be

Please sign in to comment.