Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SAI] Fix NextObjIndex method to embed objeect type into generated OID #420

Merged
merged 4 commits into from
Aug 8, 2023
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
4 changes: 2 additions & 2 deletions dash-pipeline/SAI/templates/saiapi.cpp.j2
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static sai_status_t dash_sai_create_{{ table.name }}(
// 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();
objId = NextObjectId((sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }});
auto mf_exact = mf->mutable_exact();
{{table['keys'][0].field}}SetVal(objId, mf_exact, {{table['keys'][0].bitwidth}});
{% else %}
Expand Down Expand Up @@ -170,7 +170,7 @@ static sai_status_t dash_sai_create_{{ table.name }}(
//if (matchedParams != expectedParams) {
// goto ErrRet;
//}
if (false == InsertInTable(matchActionEntry, &objId)) {
if (false == InsertInTable(matchActionEntry, (sai_object_type_t)SAI_OBJECT_TYPE_{{ table.name | upper }}, &objId)) {
goto ErrRet;
}

Expand Down
18 changes: 9 additions & 9 deletions dash-pipeline/SAI/templates/saifixedapis.cpp.j2
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static sai_status_t dash_sai_get_switch_attribute(

attr->value.u32 = cfg->m_bmv2NumPorts;

DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->id, attr->value.u32);
DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS = %d", i, attr->value.u32);

break;

Expand All @@ -73,45 +73,45 @@ static sai_status_t dash_sai_get_switch_attribute(
attr->value.objlist.list[j] = port_list.at(j);
}

DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, attr->id, cfg->m_bmv2NumPorts);
DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_PORT_LIST = [%d objids]", i, cfg->m_bmv2NumPorts);

break;

case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID:

attr->value.oid = DASH_BMV2_DEFAULT_VLAN_ID;

DASH_LOG_NOTICE("[%d] attr %d SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->id, attr->value.oid);
DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VLAN_ID = %lx", i, attr->value.oid);

break;

case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID:

attr->value.oid = DASH_BMV2_DEFAULT_VRF_ID;

DASH_LOG_NOTICE("attr %d SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", attr->id, attr->value.oid);
DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID = %lx", i, attr->value.oid);

break;

case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID:

attr->value.oid = DASH_BMV2_DEFAULT_1Q_BRIDGE_ID;

DASH_LOG_NOTICE("attr %d SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", attr->id, attr->value.oid);
DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID = %lx", i, attr->value.oid);

break;

case SAI_SWITCH_ATTR_CPU_PORT:

attr->value.oid = DASH_BMV2_DEFAULT_CPU_PORT_ID;

DASH_LOG_NOTICE("[%d] attr %d DASH_BMV2_DEFAULT_CPU_PORT_ID = %lx", i, attr->id, attr->value.oid);
DASH_LOG_NOTICE("[%d] SAI_SWITCH_ATTR_CPU_PORT = %lx", i, attr->value.oid);

break;

default:

DASH_LOG_WARN("attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", attr->id);
DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id);

memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage

Expand Down Expand Up @@ -159,13 +159,13 @@ static sai_status_t dash_sai_get_port_attribute(

attr->value.u32 = DASH_BMV2_CPU_QOS_NUMBER_OF_QUEUES;

DASH_LOG_NOTICE("attr %d SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", attr->id, attr->value.u32);
DASH_LOG_NOTICE("[%d] SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES = %d", i, attr->value.u32);

break;

default:

DASH_LOG_WARN("attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", attr->id);
DASH_LOG_WARN("[%d] attr %d is NOT SUPPORTED, but returning SAI_STATUS_SUCCESS", i, attr->id);

memset(&attr->value, 0, sizeof(attr->value)); // clear potential caller garbage

Expand Down
35 changes: 25 additions & 10 deletions dash-pipeline/SAI/templates/utils.cpp.j2
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ static std::unordered_multimap<sai_object_id_t, std::shared_ptr<p4::v1::TableEnt
static std::mutex tableLock;
static std::atomic<sai_object_id_t> nextId;

#define MUTEX std::lock_guard<std::mutex> _lock(tableLock);

std::unique_ptr<p4::v1::P4Runtime::Stub> stub;

void correctIpPrefix(void *ip, const void *mask, size_t length)
Expand Down Expand Up @@ -43,7 +45,7 @@ int leadingNonZeroBits(const sai_ip6_t ipv6) {
}


int GetDeviceId()
static int GetDeviceId()
{
DASH_LOG_ENTER();

Expand Down Expand Up @@ -94,38 +96,47 @@ grpc::StatusCode MutateTableEntry(std::shared_ptr<p4::v1::TableEntry> entry, p4:
return status.error_code();
}

bool InsertInTable(std::shared_ptr<p4::v1::TableEntry> entry, sai_object_id_t *objId)
bool InsertInTable(std::shared_ptr<p4::v1::TableEntry> entry, sai_object_type_t objectType, sai_object_id_t *objId)
{
DASH_LOG_ENTER();

auto retCode = MutateTableEntry(entry, p4::v1::Update_Type_INSERT);
if (grpc::StatusCode::OK != retCode) {

if (grpc::StatusCode::OK != retCode)
{
return false;
}

std::lock_guard<std::mutex> lock(tableLock);
MUTEX;

if (*objId == 0)
{
*objId = NextObjIndex();
*objId = NextObjectId(objectType);
}

tableEntryMap.insert(std::make_pair(*objId, entry));

return true;
}

sai_object_id_t NextObjIndex()
// TODO to be removed and merged
#define DASH_OBJECT_SHFT 48
#define DASH_MAKE_OID(_objtype, _objval) (sai_object_id_t)(((sai_object_id_t)_objtype<<DASH_OBJECT_SHFT)+(sai_object_id_t)_objval)
sai_object_id_t NextObjectId(sai_object_type_t objectType)
{
DASH_LOG_ENTER();

return ++nextId;
return DASH_MAKE_OID(objectType, ++nextId);
}

bool RemoveFromTable(sai_object_id_t id)
{
DASH_LOG_ENTER();

std::lock_guard<std::mutex> lock(tableLock);
MUTEX;

auto range = tableEntryMap.equal_range(id);

if (range.first == range.second)
{
DASH_LOG_ERROR("id: %ld not present in the table for deletion!", id);
Expand All @@ -135,14 +146,18 @@ bool RemoveFromTable(sai_object_id_t id)

grpc::StatusCode retCode = grpc::StatusCode::OK;

for (auto itr = range.first; itr != range.second; ++itr) {
for (auto itr = range.first; itr != range.second; ++itr)
{
auto entry = itr->second;
auto tempRet = MutateTableEntry(entry, p4::v1::Update_Type_DELETE);
if (grpc::StatusCode::OK != tempRet) {

if (grpc::StatusCode::OK != tempRet)
{
retCode = tempRet;
}
}

tableEntryMap.erase(id);

return retCode == grpc::StatusCode::OK;
}
6 changes: 2 additions & 4 deletions dash-pipeline/SAI/templates/utils.h.j2
Original file line number Diff line number Diff line change
Expand Up @@ -313,10 +313,8 @@ void u64SetMask(const sai_uint64_t &value, T &t, int bits = 64) {

grpc::StatusCode MutateTableEntry(std::shared_ptr<p4::v1::TableEntry>, p4::v1::Update_Type updateType);

sai_object_id_t NextObjIndex();
sai_object_id_t NextObjectId(sai_object_type_t objectType);

bool InsertInTable(std::shared_ptr<p4::v1::TableEntry> entry, sai_object_id_t *objId);
bool InsertInTable(std::shared_ptr<p4::v1::TableEntry> entry, sai_object_type_t objectType, sai_object_id_t *objId);

bool RemoveFromTable(sai_object_id_t id);

int GetDeviceId();
26 changes: 17 additions & 9 deletions dash-pipeline/tests/libsai/init_switch/init_switch.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
#include <iostream>
#include "utils.h"

/*
Run this program to indirectly cause simple_switch_grpc to load its P4 pipeline
*/
#include <iostream>

// Run this program to indirectly cause simple_switch_grpc to load its P4 pipeline

int main(int argc, char **argv)
{
// Make one benign call into libsai; it will force library load and
// invoke static lib initializer Init() which calls SetForwardingPipelineConfigRequest()
GetDeviceId();
std::cout << "Switch is initialized." << std::endl;
// try initialize SAI api, this will load sai library and initialize P4 GRPC

sai_status_t status = sai_api_initialize(0, nullptr);

if (status == SAI_STATUS_SUCCESS)
{
std::cout << "sai_api_initialize success" << std::endl;

return 0;
}

std::cout << "sai_api_initialize failed: " << status << std::endl;

return 0;
return 1;
}