Skip to content

Commit

Permalink
Add Private Link mapping (#327)
Browse files Browse the repository at this point in the history
* Add Private Link mapping
  • Loading branch information
marian-pritsak authored Oct 11, 2023
1 parent 18a4d1b commit 9fb130f
Show file tree
Hide file tree
Showing 22 changed files with 233 additions and 28 deletions.
3 changes: 3 additions & 0 deletions dash-pipeline/bmv2/dash_metadata.p4
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ struct eni_data_t {
bit<32> pps;
bit<32> flows;
bit<1> admin_state;
IPv6Address pl_sip;
IPv6Address pl_sip_mask;
IPv4Address pl_underlay_sip;
}

struct metadata_t {
Expand Down
73 changes: 60 additions & 13 deletions dash-pipeline/bmv2/dash_outbound.p4
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,14 @@ control outbound(inout headers_t hdr,
#endif // TARGET_DPDK_PNA
}

action set_tunnel(IPv4Address underlay_dip,
bit<16> meter_class,
bit<1> meter_class_override) {
meta.encap_data.underlay_dip = underlay_dip;
meta.mapping_meter_class = meter_class;
meta.mapping_meter_class_override = meter_class_override;
meta.encap_data.dash_encapsulation = dash_encapsulation_t.VXLAN;
}

action set_tunnel_mapping(IPv4Address underlay_dip,
EthernetAddress overlay_dmac,
Expand All @@ -127,9 +135,32 @@ control outbound(inout headers_t hdr,
if (use_dst_vnet_vni == 1)
meta.vnet_id = meta.dst_vnet_id;
meta.encap_data.overlay_dmac = overlay_dmac;
meta.encap_data.underlay_dip = underlay_dip;
meta.mapping_meter_class = meter_class;
meta.mapping_meter_class_override = meter_class_override;

set_tunnel(underlay_dip,
meter_class,
meter_class_override);
}

action set_private_link_mapping(IPv4Address underlay_dip,
IPv6Address overlay_sip,
IPv6Address overlay_dip,
dash_encapsulation_t dash_encapsulation,
bit<24> tunnel_key,
bit<16> meter_class,
bit<1> meter_class_override) {
meta.encap_data.overlay_dmac = hdr.ethernet.dst_addr;
meta.encap_data.dash_encapsulation = dash_encapsulation;
meta.encap_data.vni = tunnel_key;

service_tunnel_encode(hdr,
overlay_dip,
0xffffffffffffffffffffffff,
(overlay_sip & ~meta.eni_data.pl_sip_mask) | meta.eni_data.pl_sip | (IPv6Address)hdr.ipv4.dst_addr,
0xffffffffffffffffffffffff);

set_tunnel(underlay_dip,
meter_class,
meter_class_override);
}

#ifdef TARGET_BMV2_V1MODEL
Expand All @@ -152,6 +183,7 @@ control outbound(inout headers_t hdr,

actions = {
set_tunnel_mapping;
set_private_link_mapping;
@defaultonly drop;
}
const default_action = drop;
Expand Down Expand Up @@ -209,16 +241,31 @@ control outbound(inout headers_t hdr,
switch (routing.apply().action_run) {
route_vnet_direct:
route_vnet: {
ca_to_pa.apply();
vnet.apply();

vxlan_encap(hdr,
meta.encap_data.underlay_dmac,
meta.encap_data.underlay_smac,
meta.encap_data.underlay_dip,
meta.encap_data.underlay_sip,
meta.encap_data.overlay_dmac,
meta.encap_data.vni);
switch (ca_to_pa.apply().action_run) {
set_tunnel_mapping: {
vnet.apply();
}
}

if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) {
vxlan_encap(hdr,
meta.encap_data.underlay_dmac,
meta.encap_data.underlay_smac,
meta.encap_data.underlay_dip,
meta.encap_data.underlay_sip,
meta.encap_data.overlay_dmac,
meta.encap_data.vni);
} else if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.NVGRE) {
nvgre_encap(hdr,
meta.encap_data.underlay_dmac,
meta.encap_data.underlay_smac,
meta.encap_data.underlay_dip,
meta.encap_data.underlay_sip,
meta.encap_data.overlay_dmac,
meta.encap_data.vni);
} else {
drop();
}
}
route_service_tunnel: {
if (meta.encap_data.dash_encapsulation == dash_encapsulation_t.VXLAN) {
Expand Down
20 changes: 13 additions & 7 deletions dash-pipeline/bmv2/dash_pipeline.p4
Original file line number Diff line number Diff line change
Expand Up @@ -114,21 +114,27 @@ control dash_ingress(
@Sai[type="sai_uint32_t"]
bit<24> vm_vni,
bit<16> vnet_id,
IPv6Address pl_sip,
IPv6Address pl_sip_mask,
IPv4Address pl_underlay_sip,
bit<16> v4_meter_policy_id,
bit<16> v6_meter_policy_id,
ACL_GROUPS_PARAM(inbound_v4),
ACL_GROUPS_PARAM(inbound_v6),
ACL_GROUPS_PARAM(outbound_v4),
ACL_GROUPS_PARAM(outbound_v6)) {
meta.eni_data.cps = cps;
meta.eni_data.pps = pps;
meta.eni_data.flows = flows;
meta.eni_data.admin_state = admin_state;
meta.encap_data.underlay_dip = vm_underlay_dip;
meta.eni_data.cps = cps;
meta.eni_data.pps = pps;
meta.eni_data.flows = flows;
meta.eni_data.admin_state = admin_state;
meta.eni_data.pl_sip = pl_sip;
meta.eni_data.pl_sip_mask = pl_sip_mask;
meta.eni_data.pl_underlay_sip = pl_underlay_sip;
meta.encap_data.underlay_dip = vm_underlay_dip;
/* vm_vni is the encap VNI used for tunnel between inbound DPU -> VM
* and not a VNET identifier */
meta.encap_data.vni = vm_vni;
meta.vnet_id = vnet_id;
meta.encap_data.vni = vm_vni;
meta.vnet_id = vnet_id;

if (meta.is_overlay_ip_v6 == 1) {
if (meta.direction == dash_direction_t.OUTBOUND) {
Expand Down
13 changes: 13 additions & 0 deletions dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,20 @@ int main(int argc, char **argv)
attrs.push_back(attr);
}

attr.id = SAI_ENI_ATTR_PL_SIP;
attr.value.u32 = 0;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_PL_SIP_MASK;
attr.value.u32 = 0;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_PL_UNDERLAY_SIP;
attr.value.u32 = 0;
attrs.push_back(attr);

status = dash_eni_api->create_eni(&eni_id, switch_id, attrs.size(), attrs.data());

if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to create ENI object" << std::endl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,21 @@ def test_sai_thrift_create_eni(saithrift_client):

vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
addr=sai_thrift_ip_addr_t(ip4="172.16.3.1"))
pl_sip_mask = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6,
addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:0000:0000:0000"))
pl_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6,
addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
pl_underlay_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
addr=sai_thrift_ip_addr_t(ip4="10.0.0.18"))
eni = sai_thrift_create_eni(saithrift_client, cps=10000,
pps=100000, flows=100000,
admin_state=True,
vm_underlay_dip=vm_underlay_dip,
vm_vni=9,
vnet_id=vnet,
pl_sip = pl_sip,
pl_sip_mask = pl_sip_mask,
pl_underlay_sip = pl_underlay_sip,
v4_meter_policy_id = 0,
v6_meter_policy_id = 0,
inbound_v4_stage1_dash_acl_group_id = in_acl_group_id,
Expand Down
3 changes: 3 additions & 0 deletions test/test-cases/functional/ptf/sai_dash_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ def eni_create(self, **kwargs):
"vm_underlay_dip": sai_ipaddress("0.0.0.0"),
"vm_vni": 1,
"vnet_id": 1,
"pl_sip" : sai_ipaddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334"),
"pl_sip_mask": sai_ipaddress("2001:0db8:85a3:0000:0000:0000:0000:0000"),
"pl_underlay_sip": sai_ipaddress("10.0.0.18"),
"v4_meter_policy_id": 0,
"v6_meter_policy_id": 0,
"inbound_v4_stage1_dash_acl_group_id": 0,
Expand Down
9 changes: 9 additions & 0 deletions test/test-cases/functional/ptf/saidashacl.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,21 @@ def setUpSwitch(self):

vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
addr=sai_thrift_ip_addr_t(ip4=self.src_vm_pa_ip))
pl_sip_mask = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6,
addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:0000:0000:0000"))
pl_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6,
addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
pl_underlay_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
addr=sai_thrift_ip_addr_t(ip4="10.0.0.18"))
self.eni = self.create_obj(sai_thrift_create_eni, sai_thrift_remove_eni, cps=10000,
pps=100000, flows=100000,
admin_state=True,
vm_underlay_dip=vm_underlay_dip,
vm_vni=9,
vnet_id=self.vnet,
pl_sip = pl_sip,
pl_sip_mask = pl_sip_mask,
pl_underlay_sip = pl_underlay_sip,
v4_meter_policy_id=0,
v6_meter_policy_id=0,
inbound_v4_stage1_dash_acl_group_id=self.in_v4_stage1_acl_group_id,
Expand Down
9 changes: 9 additions & 0 deletions test/test-cases/functional/ptf/saidashvnet_sanity.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,21 @@ def configureVnet(self):

vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
addr=sai_thrift_ip_addr_t(ip4=self.src_vm_pa_ip))
pl_sip_mask = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6,
addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:0000:0000:0000"))
pl_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6,
addr=sai_thrift_ip_addr_t(ip6="2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
pl_underlay_sip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4,
addr=sai_thrift_ip_addr_t(ip4="10.0.0.18"))
self.eni = sai_thrift_create_eni(self.client, cps=10000,
pps=100000, flows=100000,
admin_state=True,
vm_underlay_dip=vm_underlay_dip,
vm_vni=9,
vnet_id=self.vnet,
pl_sip = pl_sip,
pl_sip_mask = pl_sip_mask,
pl_underlay_sip = pl_underlay_sip,
v4_meter_policy_id = 0,
v6_meter_policy_id = 0,
# TODO: Enable ACL rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@
"SAI_ENI_ATTR_VM_UNDERLAY_DIP", ENI_VTEP_IP,
"SAI_ENI_ATTR_VM_VNI", "9",
"SAI_ENI_ATTR_VNET_ID", "$vnet",
"SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0",
Expand Down Expand Up @@ -134,6 +137,9 @@
"SAI_ENI_ATTR_VM_UNDERLAY_DIP", NETWORK_VTEP_IP,
"SAI_ENI_ATTR_VM_VNI", "9",
"SAI_ENI_ATTR_VNET_ID", "$vnet",
"SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0",
Expand Down Expand Up @@ -170,6 +176,9 @@
"SAI_ENI_ATTR_VM_UNDERLAY_DIP", NETWORK_VTEP_IP,
"SAI_ENI_ATTR_VM_VNI", "9",
"SAI_ENI_ATTR_VNET_ID", "$vnet",
"SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0",
Expand Down
12 changes: 12 additions & 0 deletions test/test-cases/functional/saic/config_inbound_setup_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,12 @@
"9",
"SAI_ENI_ATTR_VNET_ID",
"$vnet_#1",
"SAI_ENI_ATTR_PL_SIP",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK",
"2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP",
"10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID",
"$acl_in_1",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID",
Expand Down Expand Up @@ -174,6 +180,12 @@
"9",
"SAI_ENI_ATTR_VNET_ID",
"$vnet_#1",
"SAI_ENI_ATTR_PL_SIP",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK",
"2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP",
"10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID",
"$acl_in_1",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@
"SAI_ENI_ATTR_VM_UNDERLAY_DIP", "221.0.1.11",
"SAI_ENI_ATTR_VM_VNI", "9",
"SAI_ENI_ATTR_VNET_ID", "$vnet",
"SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0",
Expand Down Expand Up @@ -108,6 +111,9 @@
"SAI_ENI_ATTR_VM_UNDERLAY_DIP", "221.0.2.101",
"SAI_ENI_ATTR_VM_VNI", "9",
"SAI_ENI_ATTR_VNET_ID", "$vnet",
"SAI_ENI_ATTR_PL_SIP", "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK", "2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP", "10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID", "0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID", "0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ def test_vnet_eni_create(self, dpu):
"9",
"SAI_ENI_ATTR_VNET_ID",
"$vnet",
"SAI_ENI_ATTR_PL_SIP",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK",
"2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP",
"10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID",
"0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ def test_vnet_inbound_routing_entry_create_setup(self, dpu):
"9",
"SAI_ENI_ATTR_VNET_ID",
"$vnet",
"SAI_ENI_ATTR_PL_SIP",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK",
"2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP",
"10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID",
"0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ def test_vnet_outbound_routing_entry_create(self, dpu):
"9",
"SAI_ENI_ATTR_VNET_ID",
"$vnet",
"SAI_ENI_ATTR_PL_SIP",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"SAI_ENI_ATTR_PL_SIP_MASK",
"2001:0db8:85a3:0000:0000:0000:0000:0000",
"SAI_ENI_ATTR_PL_UNDERLAY_SIP",
"10.0.0.18",
"SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID",
"0",
"SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
NUMBER_OF_IN_ACL_GROUP = 0
NUMBER_OF_OUT_ACL_GROUP = 0

def add_meter_attrs(attr_type, attrs, ext):
def add_extra_attrs(attr_type, attrs, ext):
i = 0
for item in attrs:
if item['type'] == attr_type:
Expand All @@ -59,12 +59,14 @@ def make_create_commands(self):
"""
conf = dpugen.sai.SaiConfig()
conf.generate()
ret = add_meter_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0"])
ret = add_extra_attrs('SAI_OBJECT_TYPE_ENI', conf.items(), ["SAI_ENI_ATTR_V4_METER_POLICY_ID", "0", "SAI_ENI_ATTR_V6_METER_POLICY_ID", "0",
'SAI_ENI_ATTR_PL_SIP', '2001:0db8:85a3:0000:0000:8a2e:0370:7334', 'SAI_ENI_ATTR_PL_SIP_MASK',
'2001:0db8:85a3:0000:0000:0000:0000:0000', 'SAI_ENI_ATTR_PL_UNDERLAY_SIP', '10.0.0.18'])

ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0',
ret = add_extra_attrs('SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY', ret, [ 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS', '0',
'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_METER_CLASS_OVERRIDE', 'True' ])

ret = add_meter_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True',
ret = add_extra_attrs('SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY', ret, [ 'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_POLICY_EN', 'True',
'SAI_OUTBOUND_ROUTING_ENTRY_ATTR_METER_CLASS', '0' ])
return ret

Expand Down
Loading

0 comments on commit 9fb130f

Please sign in to comment.