Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions dash-pipeline/SAI/sai_api_gen.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,6 @@ def generate_sai_apis(program, ignore_tables):

if len(sai_table_data['keys']) == 1 and sai_table_data['keys'][0]['sai_key_name'].endswith(table_name.split('.')[-1] + '_id'):
sai_table_data['is_object'] = 'true'
# Object ID itself is a key
sai_table_data['keys'] = []
elif len(sai_table_data['keys']) > 5:
sai_table_data['is_object'] = 'true'
else:
Expand Down
17 changes: 14 additions & 3 deletions dash-pipeline/SAI/templates/saiapi.cpp.j2
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,23 @@ sai_status_t sai_create_{{ table.name }}(
auto action = entry->mutable_action();
auto expectedParams = 0;
auto matchedParams = 0;

// Search the action
sai_object_id_t objId = 0;
// Search the action
pi_p4_id_t actionId;

matchActionEntry->set_table_id(tableId);

{% if table['keys'] | length== 1 %}
// SAI object table with single P4 key - object ID itself is the P4 table key
// Generate a SAI object ID and fill it as the P4 table key
auto mf = matchActionEntry->add_match();
mf->set_field_id({{table['keys'][0].id}});
objId = NextObjIndex();
auto mf_exact = mf->mutable_exact();
{{table['keys'][0].sai_key_field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}});
{% else %}
// SAI object table with multiple P4 table keys
// Copy P4 table keys from appropriate SAI attributes
for (uint32_t i = 0; i < attr_count; i++) {
switch(attr_list[i].id) {
{% for key in table['keys'] %}
Expand Down Expand Up @@ -74,6 +85,7 @@ sai_status_t sai_create_{{ table.name }}(
{% endfor %}
}
}
{% endif %}


// If there is only one action, simply set it.
Expand Down Expand Up @@ -121,7 +133,6 @@ sai_status_t sai_create_{{ table.name }}(
goto ErrRet;
}
// TODO: ternaly needs to set priority
uint64_t objId;
if (true == InsertInTable(matchActionEntry, &objId)) {
*{{ table.name }}_id = objId;
return 0;
Expand Down
2 changes: 2 additions & 0 deletions dash-pipeline/SAI/templates/saiapi.h.j2
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ typedef enum _sai_{{ table.name }}_attr_t
{% set ns.firstattr = true %}
{% endif %}
{% if table.is_object == 'true' %}
{% if table['keys'] | length > 1 %}
{% for key in table['keys'] %}
/**
* @brief {{ key.match_type | capitalize | replace('Lpm', 'LPM') }} matched key {{ key.sai_key_name }}
Expand Down Expand Up @@ -140,6 +141,7 @@ typedef enum _sai_{{ table.name }}_attr_t

{% endfor %}
{% endif %}
{% endif %}
{% for param in table.actionParams %}
/**
* @brief Action {% for action in param.paramActions %}{{ action }}{{ ", " if not loop.last else "" }}{% endfor %} parameter {{ param.name | upper }}
Expand Down
12 changes: 11 additions & 1 deletion dash-pipeline/SAI/templates/utils.cpp.j2
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,18 @@ bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId) {
}

tableLock.lock();
*objId = nextId++;
if (*objId == 0) {
*objId = nextId++;
}
tableEntryMap[*objId] = entry;
tableLock.unlock();
return true;
}

sai_object_id_t NextObjIndex() {
return ++nextId;
}

bool RemoveFromTable(sai_object_id_t id) {
tableLock.lock();
auto itr = tableEntryMap.find(id);
Expand Down Expand Up @@ -258,6 +264,10 @@ sai_status_t sai_api_query(
*api_method_table = (void *)&sai_dash_api_impl;
break;

case SAI_API_DASH_ACL:
*api_method_table = (void *)&sai_dash_acl_api_impl;
break;

case SAI_API_DASH_VNET:
*api_method_table = (void *)&sai_dash_vnet_api_impl;
break;
Expand Down
2 changes: 2 additions & 0 deletions dash-pipeline/SAI/templates/utils.h.j2
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@ void ipaddrrangelistSetVal(const sai_attribute_value_t &value, T &t, int bits =

grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type updateType);

sai_object_id_t NextObjIndex();

bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId);

bool RemoveFromTable(sai_object_id_t id);
Expand Down
133 changes: 130 additions & 3 deletions dash-pipeline/tests/libsai/vnet_out/vnet_out.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string.h>

#include <sai.h>
Expand All @@ -26,13 +27,32 @@ extern sai_status_t sai_create_outbound_eni_to_vni_entry(
extern sai_status_t sai_remove_outbound_eni_to_vni_entry(
_In_ const sai_outbound_eni_to_vni_entry_t *outbound_eni_to_vni_entry);

extern sai_status_t sai_create_eni(
_Out_ sai_object_id_t *eni_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
extern sai_status_t sai_remove_eni(
_In_ sai_object_id_t eni_id);

extern sai_status_t sai_create_dash_acl_group(
_Out_ sai_object_id_t *acl_group_id,
_In_ sai_object_id_t switch_id,
_In_ uint32_t attr_count,
_In_ const sai_attribute_t *attr_list);
extern sai_status_t sai_remove_dash_acl_group(
_In_ sai_object_id_t eni_id);

extern sai_dash_api_t sai_dash_api_impl;

int main(int argc, char **argv)
{
sai_object_id_t switch_id = SAI_NULL_OBJECT_ID;
sai_attribute_t attr;
std::vector<sai_attribute_t> attrs;
sai_object_id_t in_acl_group_id;
sai_object_id_t out_acl_group_id;
sai_object_id_t eni_id;

sai_direction_lookup_entry_t dle = {};
dle.switch_id = switch_id;
Expand All @@ -52,6 +72,91 @@ int main(int argc, char **argv)

attrs.clear();

attr.id = SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY;
attr.value.s32 = SAI_IP_ADDR_FAMILY_IPV4;
attrs.push_back(attr);

/* status = sai_dash_api_impl.create_dash_acl_group(&group_id, switch_id, attrs.size(), attrs.data()); */
status = sai_create_dash_acl_group(&in_acl_group_id, switch_id, attrs.size(), attrs.data());
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to create inbound Dash ACL group" << std::endl;
return 1;
}
status = sai_create_dash_acl_group(&out_acl_group_id, switch_id, attrs.size(), attrs.data());
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to create outbound Dash ACL group" << std::endl;
return 1;
}

attrs.clear();

attr.id = SAI_ENI_ATTR_CPS;
attr.value.u32 = 10000;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_PPS;
attr.value.u32 = 100000;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_FLOWS;
attr.value.u32 = 100000;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_ADMIN_STATE;
attr.value.booldata = true;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_VM_UNDERLAY_DIP;
sai_ip_addr_t u_dip_addr = {.ip4 = 0x010310ac};
sai_ip_address_t u_dip = {.addr_family = SAI_IP_ADDR_FAMILY_IPV4,
.addr = u_dip_addr};
attr.value.ipaddr = u_dip;
attrs.push_back(attr);

attr.id = SAI_ENI_ATTR_VM_VNI;
attr.value.u32 = 9;
attrs.push_back(attr);

std::unordered_map<uint32_t, uint16_t> acl_group_ids = {
{SAI_ENI_ATTR_INBOUND_V4_STAGE1_DASH_ACL_GROUP_ID, in_acl_group_id},
{SAI_ENI_ATTR_INBOUND_V4_STAGE2_DASH_ACL_GROUP_ID, in_acl_group_id},
{SAI_ENI_ATTR_INBOUND_V4_STAGE3_DASH_ACL_GROUP_ID, in_acl_group_id},
{SAI_ENI_ATTR_INBOUND_V4_STAGE4_DASH_ACL_GROUP_ID, in_acl_group_id},
{SAI_ENI_ATTR_INBOUND_V4_STAGE5_DASH_ACL_GROUP_ID, in_acl_group_id},
{SAI_ENI_ATTR_OUTBOUND_V4_STAGE1_DASH_ACL_GROUP_ID, out_acl_group_id},
{SAI_ENI_ATTR_OUTBOUND_V4_STAGE2_DASH_ACL_GROUP_ID, out_acl_group_id},
{SAI_ENI_ATTR_OUTBOUND_V4_STAGE3_DASH_ACL_GROUP_ID, out_acl_group_id},
{SAI_ENI_ATTR_OUTBOUND_V4_STAGE4_DASH_ACL_GROUP_ID, out_acl_group_id},
{SAI_ENI_ATTR_OUTBOUND_V4_STAGE5_DASH_ACL_GROUP_ID, out_acl_group_id},
{SAI_ENI_ATTR_INBOUND_V6_STAGE1_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_INBOUND_V6_STAGE2_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_INBOUND_V6_STAGE3_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_INBOUND_V6_STAGE4_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_INBOUND_V6_STAGE5_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_OUTBOUND_V6_STAGE1_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_OUTBOUND_V6_STAGE2_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_OUTBOUND_V6_STAGE3_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_OUTBOUND_V6_STAGE4_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
{SAI_ENI_ATTR_OUTBOUND_V6_STAGE5_DASH_ACL_GROUP_ID, SAI_NULL_OBJECT_ID},
};
for (const auto& acl_grp_pair : acl_group_ids) {
attr.id = acl_grp_pair.first;
attr.value.oid = acl_grp_pair.second;
attrs.push_back(attr);
}

/* status = sai_dash_api_impl.create_eni(&eni_id, switch_id, attrs.size(), attrs.data()); */
status = sai_create_eni(&eni_id, switch_id, attrs.size(), attrs.data());
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to create ENI object" << std::endl;
return 1;
}

attrs.clear();

sai_eni_ether_address_map_entry_t eam;
eam.switch_id = switch_id;
eam.address[0] = 0xaa;
Expand All @@ -62,7 +167,7 @@ int main(int argc, char **argv)
eam.address[5] = 0xcc;

attr.id = SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID;
attr.value.u16 = 7;
attr.value.u16 = eni_id;
attrs.push_back(attr);

status = sai_create_eni_ether_address_map_entry(&eam, attrs.size(), attrs.data());
Expand All @@ -76,7 +181,7 @@ int main(int argc, char **argv)

sai_outbound_eni_to_vni_entry_t e2v = {};
e2v.switch_id = switch_id;
e2v.eni_id = 7;
e2v.eni_id = eni_id;

attr.id = SAI_OUTBOUND_ENI_TO_VNI_ENTRY_ATTR_VNI;
attr.value.u32 = 9;
Expand Down Expand Up @@ -106,14 +211,36 @@ int main(int argc, char **argv)
return 1;
}

status = sai_remove_eni(eni_id);
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to remove ENI object " << eni_id << std::endl;
return 1;
}

status = sai_remove_dash_acl_group(out_acl_group_id);
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to remove Outbound ACL group object "
<< out_acl_group_id << std::endl;
return 1;
}

status = sai_remove_dash_acl_group(in_acl_group_id);
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to remove Inbound ACL group object "
<< in_acl_group_id << std::endl;
return 1;
}

status = sai_remove_direction_lookup_entry(&dle);
if (status != SAI_STATUS_SUCCESS)
{
std::cout << "Failed to remove Direction Lookup Entry" << std::endl;
return 1;
}


std::cout << "Done." << std::endl;

return 0;
Expand Down
Loading