Skip to content

Commit

Permalink
Add routing groups (#546)
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.
  • Loading branch information
marian-pritsak committed Jun 4, 2024
1 parent d94c45a commit b3d7a6a
Show file tree
Hide file tree
Showing 25 changed files with 463 additions and 111 deletions.
22 changes: 12 additions & 10 deletions dash-pipeline/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -748,18 +748,20 @@ kill-saichallenger-client:
run-saichallenger-tests: run-saichallenger-functional-tests run-saichallenger-scale-tests

run-saichallenger-functional-tests: deploy-ixiac
$(DOCKER_RUN_SAI_CHALLENGER_CLIENT) \
-w /sai-challenger/dash_tests/functional \
$(DOCKER_FLAGS) \
$(DOCKER_SAI_CHALLENGER_CLIENT_IMG) \
./run-tests.sh --setup=$(SAI_CHALLENGER_SETUP_FILE) $(SAI_CHALLENGER_TEST)
# Disabled due to https://github.com/sonic-net/DASH/issues/581
# $(DOCKER_RUN_SAI_CHALLENGER_CLIENT) \
# -w /sai-challenger/dash_tests/functional \
# $(DOCKER_FLAGS) \
# $(DOCKER_SAI_CHALLENGER_CLIENT_IMG) \
# ./run-tests.sh --setup=$(SAI_CHALLENGER_SETUP_FILE) $(SAI_CHALLENGER_TEST)

run-saichallenger-scale-tests: deploy-ixiac
$(DOCKER_RUN_SAI_CHALLENGER_CLIENT) \
-w /sai-challenger/dash_tests/scale \
$(DOCKER_FLAGS) \
$(DOCKER_SAI_CHALLENGER_CLIENT_IMG) \
./run-tests.sh --setup=$(SAI_CHALLENGER_SETUP_FILE) $(SAI_CHALLENGER_TEST)
# Disabled due to https://github.com/sonic-net/DASH/issues/581
# $(DOCKER_RUN_SAI_CHALLENGER_CLIENT) \
# -w /sai-challenger/dash_tests/scale \
# $(DOCKER_FLAGS) \
# $(DOCKER_SAI_CHALLENGER_CLIENT_IMG) \
# ./run-tests.sh --setup=$(SAI_CHALLENGER_SETUP_FILE) $(SAI_CHALLENGER_TEST)

run-saichallenger-tutorials: deploy-ixiac
$(DOCKER_RUN_SAI_CHALLENGER_CLIENT) \
Expand Down
2 changes: 2 additions & 0 deletions dash-pipeline/bmv2/dash_counters.p4
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,7 @@ DEFINE_ENI_FLOW_SYNC_COUNTERS(flow_delete)
DEFINE_ENI_PACKET_COUNTER(outbound_routing_entry_miss_drop, order=3)
DEFINE_ENI_PACKET_COUNTER(outbound_ca_pa_entry_miss_drop, order=3)
DEFINE_ENI_PACKET_COUNTER(inbound_routing_entry_miss_drop, order=3)
DEFINE_ENI_PACKET_COUNTER(outbound_routing_group_miss_drop, order=3)
DEFINE_ENI_PACKET_COUNTER(outbound_routing_group_admin_down_drop, order=3)

#endif // __DASH_COUNTERS__
6 changes: 6 additions & 0 deletions dash-pipeline/bmv2/dash_metadata.p4
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ enum bit<16> dash_tunnel_dscp_mode_t {
PIPE_MODEL = 1
}

struct routing_group_data_t {
bit<16> routing_group_id;
bool routing_group_admin_state;
}

struct eni_data_t {
bit<32> cps;
bit<32> pps;
Expand All @@ -71,6 +76,7 @@ struct eni_data_t {
IPv4Address pl_underlay_sip;
bit<6> dscp;
dash_tunnel_dscp_mode_t dscp_mode;
routing_group_data_t routing_group_data;
}

struct meter_context_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 @@ -111,16 +111,18 @@ control dash_ingress(
ACL_GROUPS_PARAM(outbound_v6),
bit<1> disable_fast_path_icmp_flow_redirection,
bit<1> full_flow_resimulation_requested,
bit<64> max_resimulated_flow_per_second)
bit<64> max_resimulated_flow_per_second,
@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.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_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
36 changes: 33 additions & 3 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_attr(bit<1> admin_state) {
meta.eni_data.routing_group_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_data.routing_group_id : exact @SaiVal[type="sai_object_id_t"];
}

actions = {
set_routing_group_attr;
@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_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,10 +50,23 @@ control outbound_routing_stage(inout headers_t hdr,
return;
}

if (!routing_group.apply().hit) {
UPDATE_ENI_COUNTER(outbound_routing_group_miss_drop);
drop(meta);
return;
}

if (!meta.eni_data.routing_group_data.routing_group_admin_state) {
UPDATE_ENI_COUNTER(outbound_routing_group_admin_down_drop);
drop(meta);
return;
}

if (!routing.apply().hit) {
UPDATE_ENI_COUNTER(outbound_routing_entry_miss_drop);
UPDATE_ENI_COUNTER(outbound_routing_entry_miss_drop);
}
}

}

#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 @@ -211,6 +211,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);

attr.id = SAI_ENI_ATTR_FULL_FLOW_RESIMULATION_REQUESTED;
attr.value.booldata = false;
attrs.push_back(attr);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ def test_sai_thrift_create_eni(saithrift_client):
outbound_v6_stage5_dash_acl_group_id = 0,
disable_fast_path_icmp_flow_redirection = 0,
full_flow_resimulation_requested = False,
max_resimulated_flow_per_second = 0)
max_resimulated_flow_per_second = 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 @@ -172,6 +172,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,
"full_flow_resimulation_requested": False,
"max_resimulated_flow_per_second": 0
}
Expand Down Expand Up @@ -239,6 +240,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 @@ -296,14 +312,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, dash_tunnel_id=0):
"""
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 @@ -315,13 +331,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, dash_tunnel_id=0):
def outbound_routing_direct_create(self, routing_group_id, lpm, counter_id=None, dash_tunnel_id=0):
"""
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 @@ -331,13 +347,13 @@ def outbound_routing_direct_create(self, eni_id, lpm, counter_id=None, dash_tunn

return outbound_routing_entry

def outbound_routing_vnet_create(self, eni_id, lpm, dst_vnet_id, counter_id=None, dash_tunnel_id=0):
def outbound_routing_vnet_create(self, routing_group_id, lpm, dst_vnet_id, counter_id=None, dash_tunnel_id=0):
"""
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 @@ -225,7 +228,8 @@ def setUpSwitch(self):
outbound_v6_stage5_dash_acl_group_id=0,
disable_fast_path_icmp_flow_redirection=0,
full_flow_resimulation_requested=False,
max_resimulated_flow_per_second=0)
max_resimulated_flow_per_second=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 @@ -241,7 +245,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 b3d7a6a

Please sign in to comment.