Skip to content

Commit

Permalink
Add routing groups
Browse files Browse the repository at this point in the history
Make an intermediate stage between ENI and routing
to be able to atomically bind/unbind an entire
LPM table to/from ENI.

Signed-off-by: Marian Pritsak <[email protected]>
  • Loading branch information
marian-pritsak committed Apr 19, 2024
1 parent 9eff6d7 commit 69d3d05
Show file tree
Hide file tree
Showing 23 changed files with 436 additions and 100 deletions.
2 changes: 2 additions & 0 deletions dash-pipeline/bmv2/dash_metadata.p4
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ struct eni_data_t {
IPv4Address pl_underlay_sip;
bit<6> dscp;
dash_tunnel_dscp_mode_t dscp_mode;
bit<16> routing_group_id;
bool routing_group_admin_state;
}

struct encap_data_t {
Expand Down
20 changes: 11 additions & 9 deletions dash-pipeline/bmv2/dash_pipeline.p4
Original file line number Diff line number Diff line change
Expand Up @@ -112,15 +112,17 @@ control dash_ingress(
ACL_GROUPS_PARAM(inbound_v6),
ACL_GROUPS_PARAM(outbound_v4),
ACL_GROUPS_PARAM(outbound_v6),
bit<1> disable_fast_path_icmp_flow_redirection) {
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;
bit<1> disable_fast_path_icmp_flow_redirection,
@SaiVal[type="sai_object_id_t"] bit<16> routing_group_id) {
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;
meta.eni_data.routing_group_id = routing_group_id;
if (dash_tunnel_dscp_mode == dash_tunnel_dscp_mode_t.PIPE_MODEL) {
meta.eni_data.dscp = dscp;
}
Expand Down
26 changes: 24 additions & 2 deletions dash-pipeline/bmv2/stages/outbound_routing.p4
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,29 @@
control outbound_routing_stage(inout headers_t hdr,
inout metadata_t meta)
{

action set_routing_group_version(bit<1> admin_state) {
meta.eni_data.routing_group_admin_state = (bool)admin_state;
}

@SaiTable[name = "routing_group", api = "dash_routing_group", isobject="true"]
table routing_group {
key = {
meta.eni_data.routing_group_id : exact @SaiVal[type="sai_object_id_t"];
}

actions = {
set_routing_group_version;
@defaultonly drop(meta);
}
}

DEFINE_TABLE_COUNTER(routing_counter)

@SaiTable[name = "outbound_routing", api = "dash_outbound_routing"]
table routing {
key = {
meta.eni_id : exact @SaiVal[type="sai_object_id_t"];
meta.eni_data.routing_group_id : exact @SaiVal[type="sai_object_id_t"];
meta.is_overlay_ip_v6 : exact @SaiVal[name = "destination_is_v6"];
meta.dst_ip_addr : lpm @SaiVal[name = "destination"];
}
Expand All @@ -33,8 +50,13 @@ control outbound_routing_stage(inout headers_t hdr,
return;
}

routing_group.apply();
if (meta.eni_data.routing_group_admin_state) {
routing.apply();
} else {
drop(meta);
}
}
}

#endif /* _DASH_STAGE_OUTBOUND_ROUTING_P4_ */
#endif /* _DASH_STAGE_OUTBOUND_ROUTING_P4_ */
4 changes: 4 additions & 0 deletions dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,10 @@ int main(int argc, char **argv)
attr.value.booldata = false;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_ROUTING_GROUP_ID;
attr.value.oid = SAI_NULL_OBJECT_ID;
attrs.push_back(attr);

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

if (status != SAI_STATUS_SUCCESS)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ def test_sai_thrift_create_eni(saithrift_client):
outbound_v6_stage3_dash_acl_group_id = 0,
outbound_v6_stage4_dash_acl_group_id = 0,
outbound_v6_stage5_dash_acl_group_id = 0,
disable_fast_path_icmp_flow_redirection = 0)
disable_fast_path_icmp_flow_redirection = 0,
routing_group_id = 0)
assert (eni != SAI_NULL_OBJECT_ID);

eam = sai_thrift_eni_ether_address_map_entry_t(switch_id=switch_id, address = eth_addr)
Expand Down
28 changes: 22 additions & 6 deletions test/test-cases/functional/ptf/sai_dash_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ def eni_create(self, **kwargs):
"outbound_v6_stage4_dash_acl_group_id": 0,
"outbound_v6_stage5_dash_acl_group_id": 0,
"disable_fast_path_icmp_flow_redirection": 0,
"routing_group_id": 0,
}
default_kwargs.update(kwargs)

Expand Down Expand Up @@ -236,6 +237,21 @@ def vnet_create(self, vni):
def vnet_remove(self, vnet_id):
sai_thrift_remove_vnet(self.client, vnet_id)

def routing_group_create(self, admin_state):
"""
Create routing group
"""

routing_group_id = sai_thrift_create_routing_group(self.client, admin_state=admin_state)
self.assertEqual(self.status(), SAI_STATUS_SUCCESS)
self.assertNotEqual(routing_group_id, 0)
self.add_teardown_obj(self.routing_group_remove, routing_group_id)

return routing_group_id

def routing_group_remove(self, routing_group_id):
sai_thrift_remove_routing_group(self.client, routing_group_id)

def inbound_routing_decap_validate_create(self, eni_id, vni, sip, sip_mask, src_vnet_id):
"""
Create inbound routing entry with
Expand Down Expand Up @@ -291,14 +307,14 @@ def pa_validation_create(self, sip, vnet_id):
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,
def outbound_routing_vnet_direct_create(self, routing_group_id, lpm, dst_vnet_id,
overlay_ip, counter_id=None):
"""
Create outband vnet direct routing entry
"""

outbound_routing_entry = sai_thrift_outbound_routing_entry_t(
switch_id=self.switch_id, eni_id=eni_id,
switch_id=self.switch_id, routing_group_id=routing_group_id,
destination=sai_ipprefix(lpm))
sai_thrift_create_outbound_routing_entry(self.client,
outbound_routing_entry, dst_vnet_id=dst_vnet_id,
Expand All @@ -310,13 +326,13 @@ def outbound_routing_vnet_direct_create(self, eni_id, lpm, dst_vnet_id,

return outbound_routing_entry

def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None):
def outbound_routing_direct_create(self, routing_group_id, lpm, counter_id=None):
"""
Create outband vnet direct routing entry
"""

outbound_routing_entry = sai_thrift_outbound_routing_entry_t(
switch_id=self.switch_id, eni_id=eni_id,
switch_id=self.switch_id, routing_group_id=routing_group_id,
destination=sai_ipprefix(lpm))
sai_thrift_create_outbound_routing_entry(self.client, outbound_routing_entry, counter_id=counter_id,
action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT,
Expand All @@ -326,13 +342,13 @@ def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None):

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, routing_group_id, lpm, dst_vnet_id, counter_id=None):
"""
Create outbound vnet routing entry
"""

outbound_routing_entry = sai_thrift_outbound_routing_entry_t(
switch_id=self.switch_id, eni_id=eni_id,
switch_id=self.switch_id, routing_group_id=routing_group_id,
destination=sai_ipprefix(lpm))
sai_thrift_create_outbound_routing_entry(self.client,
outbound_routing_entry, dst_vnet_id=dst_vnet_id,
Expand Down
8 changes: 6 additions & 2 deletions test/test-cases/functional/ptf/saidashacl.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,9 @@ def setUpSwitch(self):
self.vnet = self.create_obj(
sai_thrift_create_vnet, sai_thrift_remove_vnet, vni=self.vnet_vni)

self.routing_group = self.create_obj(
sai_thrift_create_routing_group, sai_thrift_remove_routing_group, admin_state=True)

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,
Expand Down Expand Up @@ -222,7 +225,8 @@ def setUpSwitch(self):
outbound_v6_stage3_dash_acl_group_id=self.out_v6_stage3_acl_group_id,
outbound_v6_stage4_dash_acl_group_id=0,
outbound_v6_stage5_dash_acl_group_id=0,
disable_fast_path_icmp_flow_redirection=0)
disable_fast_path_icmp_flow_redirection=0,
routing_group_id=0)

self.eam = sai_thrift_eni_ether_address_map_entry_t(
switch_id=self.switch_id, address=self.eni_mac)
Expand All @@ -238,7 +242,7 @@ def setUpSwitch(self):
ip4="10.1.0.0"),
mask=sai_thrift_ip_addr_t(ip4="255.255.0.0"))
self.ore = sai_thrift_outbound_routing_entry_t(
switch_id=self.switch_id, eni_id=self.eni, destination=ca_prefix)
switch_id=self.switch_id, routing_group_id=self.routing_group, destination=ca_prefix)

self.create_entry(sai_thrift_create_outbound_routing_entry, sai_thrift_remove_outbound_routing_entry,
self.ore, action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET, dst_vnet_id=self.vnet,
Expand Down
6 changes: 4 additions & 2 deletions test/test-cases/functional/ptf/saidasheni.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,10 @@ def createOutboundRoutingEntryTest(self):
Note: test should be run after createEniTest
"""
self.overlay_ip = "192.168.2.22"
routing_group_id = self.routing_group_create(admin_state=True)

self.outbound_routing_entry = self.outbound_routing_vnet_direct_create(
eni_id=self.eni,
routing_group_id=routing_group_id,
lpm="192.168.2.0/24",
dst_vnet_id=self.outbound_vnet,
overlay_ip=self.overlay_ip)
Expand Down Expand Up @@ -1057,6 +1058,7 @@ def eniScaleTest(self):

self.outbound_vni += 1
outbound_vnet = self.vnet_create(vni=self.outbound_vni)
routing_group_id = self.routing_group_create(admin_state=True)

# create inbound_routing_entry
self.inbound_routing_decap_create(eni_id=eni,
Expand All @@ -1065,7 +1067,7 @@ def eniScaleTest(self):
sip_mask="255.255.255.0")

# create outbound_routing_entry
self.outbound_routing_vnet_direct_create(eni_id=eni,
self.outbound_routing_vnet_direct_create(routing_group_id=routing_group_id,
lpm="192.168.1.0/24",
dst_vnet_id=outbound_vnet,
overlay_ip="192.168.1.10")
Expand Down
Loading

0 comments on commit 69d3d05

Please sign in to comment.