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

Adapt SAI v1.0 headers #1

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
2 changes: 1 addition & 1 deletion orchagent/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ else
DBGFLAGS = -g -DNDEBUG
endif

orchagent_SOURCES = main.cpp orchdaemon.cpp orch.cpp notifications.cpp routeorch.cpp neighorch.cpp intfsorch.cpp portsorch.cpp copporch.cpp tunneldecaporch.cpp qosorch.cpp bufferorch.cpp mirrororch.cpp fdborch.cpp aclorch.cpp
orchagent_SOURCES = main.cpp port.cpp orchdaemon.cpp orch.cpp notifications.cpp routeorch.cpp neighorch.cpp intfsorch.cpp portsorch.cpp copporch.cpp tunneldecaporch.cpp qosorch.cpp bufferorch.cpp mirrororch.cpp fdborch.cpp aclorch.cpp

orchagent_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
orchagent_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
Expand Down
126 changes: 57 additions & 69 deletions orchagent/aclorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ swss::Table AclOrch::m_countersTable(&m_db, "COUNTERS");
extern sai_acl_api_t* sai_acl_api;
extern sai_port_api_t* sai_port_api;
extern sai_switch_api_t* sai_switch_api;
extern sai_object_id_t gSwitchId;
extern PortsOrch* gPortsOrch;

acl_rule_attr_lookup_t aclMatchLookup =
{
Expand All @@ -32,15 +34,15 @@ acl_rule_attr_lookup_t aclMatchLookup =
{ MATCH_ETHER_TYPE, SAI_ACL_ENTRY_ATTR_FIELD_ETHER_TYPE },
{ MATCH_IP_PROTOCOL, SAI_ACL_ENTRY_ATTR_FIELD_IP_PROTOCOL },
{ MATCH_TCP_FLAGS, SAI_ACL_ENTRY_ATTR_FIELD_TCP_FLAGS },
{ MATCH_IP_TYPE, SAI_ACL_ENTRY_ATTR_FIELD_IP_TYPE },
{ MATCH_IP_TYPE, SAI_ACL_ENTRY_ATTR_FIELD_ACL_IP_TYPE },
{ MATCH_DSCP, SAI_ACL_ENTRY_ATTR_FIELD_DSCP },
{ MATCH_L4_SRC_PORT_RANGE, (sai_acl_entry_attr_t)SAI_ACL_RANGE_L4_SRC_PORT_RANGE },
{ MATCH_L4_DST_PORT_RANGE, (sai_acl_entry_attr_t)SAI_ACL_RANGE_L4_DST_PORT_RANGE },
{ MATCH_L4_SRC_PORT_RANGE, (sai_acl_entry_attr_t)SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE },
{ MATCH_L4_DST_PORT_RANGE, (sai_acl_entry_attr_t)SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE },
};

acl_rule_attr_lookup_t aclActionLookup =
{
{ ACTION_PACKET_ACTION, SAI_ACL_ENTRY_ATTR_PACKET_ACTION },
{ ACTION_PACKET_ACTION, SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION },
{ ACTION_MIRROR_ACTION, SAI_ACL_ENTRY_ATTR_ACTION_MIRROR_INGRESS }
};

Expand All @@ -55,10 +57,10 @@ static acl_ip_type_lookup_t aclIpTypeLookup =
{ IP_TYPE_ANY, SAI_ACL_IP_TYPE_ANY },
{ IP_TYPE_IP, SAI_ACL_IP_TYPE_IP },
{ IP_TYPE_NON_IP, SAI_ACL_IP_TYPE_NON_IP },
{ IP_TYPE_IPv4ANY, SAI_ACL_IP_TYPE_IPv4ANY },
{ IP_TYPE_NON_IPv4, SAI_ACL_IP_TYPE_NON_IPv4 },
{ IP_TYPE_IPv6ANY, SAI_ACL_IP_TYPE_IPv6ANY },
{ IP_TYPE_NON_IPv6, SAI_ACL_IP_TYPE_NON_IPv6 },
{ IP_TYPE_IPv4ANY, SAI_ACL_IP_TYPE_IPV4ANY },
{ IP_TYPE_NON_IPv4, SAI_ACL_IP_TYPE_NON_IPV4 },
{ IP_TYPE_IPv6ANY, SAI_ACL_IP_TYPE_IPV6ANY },
{ IP_TYPE_NON_IPv6, SAI_ACL_IP_TYPE_NON_IPV6 },
{ IP_TYPE_ARP, SAI_ACL_IP_TYPE_ARP },
{ IP_TYPE_ARP_REQUEST, SAI_ACL_IP_TYPE_ARP_REQUEST },
{ IP_TYPE_ARP_REPLY, SAI_ACL_IP_TYPE_ARP_REPLY }
Expand Down Expand Up @@ -297,8 +299,8 @@ bool AclRule::create()
for (auto it : m_matches)
{
// collect ranges and add them later as a list
if (((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_L4_SRC_PORT_RANGE) ||
((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_L4_DST_PORT_RANGE))
if (((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE) ||
((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE))
{
SWSS_LOG_INFO("Creating range object %u..%u", it.second.u32range.min, it.second.u32range.max);

Expand Down Expand Up @@ -326,7 +328,7 @@ bool AclRule::create()
// store ranges if any
if (range_object_list.count > 0)
{
attr.id = SAI_ACL_ENTRY_ATTR_FIELD_RANGE;
attr.id = SAI_ACL_ENTRY_ATTR_FIELD_ACL_RANGE_TYPE;
attr.value.aclfield.enable = true;
attr.value.aclfield.data.objlist = range_object_list;
rule_attrs.push_back(attr);
Expand All @@ -340,7 +342,7 @@ bool AclRule::create()
rule_attrs.push_back(attr);
}

status = sai_acl_api->create_acl_entry(&m_ruleOid, rule_attrs.size(), rule_attrs.data());
status = sai_acl_api->create_acl_entry(&m_ruleOid, gSwitchId, rule_attrs.size(), rule_attrs.data());
if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to create ACL rule");
Expand All @@ -355,7 +357,7 @@ bool AclRule::remove()
SWSS_LOG_ENTER();
sai_status_t res;

if (sai_acl_api->delete_acl_entry(m_ruleOid) != SAI_STATUS_SUCCESS)
if (sai_acl_api->remove_acl_entry(m_ruleOid) != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to delete ACL rule");
return false;
Expand Down Expand Up @@ -419,7 +421,7 @@ bool AclRule::createCounter()
attr.value.booldata = true;
counter_attrs.push_back(attr);

if (sai_acl_api->create_acl_counter(&m_counterOid, counter_attrs.size(), counter_attrs.data()) != SAI_STATUS_SUCCESS)
if (sai_acl_api->create_acl_counter(&m_counterOid, gSwitchId, counter_attrs.size(), counter_attrs.data()) != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to create counter for the rule %s in table %s", m_id.c_str(), m_tableId.c_str());
return false;
Expand All @@ -433,8 +435,8 @@ bool AclRule::removeRanges()
SWSS_LOG_ENTER();
for (auto it : m_matches)
{
if (((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_L4_SRC_PORT_RANGE) ||
((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_L4_DST_PORT_RANGE))
if (((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE) ||
((sai_acl_range_type_t)it.first == SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE))
{
return AclRange::remove((sai_acl_range_type_t)it.first, it.second.u32range.min, it.second.u32range.max);
}
Expand All @@ -451,7 +453,7 @@ bool AclRule::removeCounter()
return true;
}

if (sai_acl_api->delete_acl_counter(m_counterOid) != SAI_STATUS_SUCCESS)
if (sai_acl_api->remove_acl_entry(m_counterOid) != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to remove ACL counter for rule %s in table %s", m_id.c_str(), m_tableId.c_str());
return false;
Expand Down Expand Up @@ -720,7 +722,7 @@ AclRange *AclRange::create(sai_acl_range_type_t type, int min, int max)
attr.value.u32range.max = max;
range_attrs.push_back(attr);

status = sai_acl_api->create_acl_range(&range_oid, range_attrs.size(), range_attrs.data());
status = sai_acl_api->create_acl_range(&range_oid, gSwitchId, range_attrs.size(), range_attrs.data());
if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to create range object");
Expand Down Expand Up @@ -819,7 +821,7 @@ AclOrch::AclOrch(DBConnector *db, vector<string> tableNames, PortsOrch *portOrch
};

// get min/max allowed priority
if (sai_switch_api->get_switch_attribute(sizeof(attrs)/sizeof(attrs[0]), attrs) == SAI_STATUS_SUCCESS)
if (sai_switch_api->get_switch_attribute(gSwitchId, sizeof(attrs)/sizeof(attrs[0]), attrs) == SAI_STATUS_SUCCESS)
{
SWSS_LOG_INFO("Got ACL entry priority values, min: %u, max: %u", attrs[0].value.u32, attrs[1].value.u32);
AclRule::setRulePriorities(attrs[0].value.u32, attrs[1].value.u32);
Expand Down Expand Up @@ -1225,31 +1227,31 @@ sai_status_t AclOrch::createBindAclTable(AclTable &aclTable, sai_object_id_t &ta
sai_status_t status;
sai_attribute_t attr;
vector<sai_attribute_t> table_attrs;
// workaround until SAI is fixed
#if 0
int32_t range_types_list[] =
{ SAI_ACL_RANGE_L4_DST_PORT_RANGE,
SAI_ACL_RANGE_L4_SRC_PORT_RANGE
{ SAI_ACL_RANGE_TYPE_L4_DST_PORT_RANGE,
SAI_ACL_RANGE_TYPE_L4_SRC_PORT_RANGE
};
#endif

attr.id = SAI_ACL_TABLE_ATTR_BIND_POINT;
attr.value.s32 = SAI_ACL_BIND_POINT_PORT;
attr.id = SAI_ACL_TABLE_ATTR_ACL_BIND_POINT_TYPE_LIST;
vector<int32_t> bpoint_list;
bpoint_list.push_back(SAI_ACL_BIND_POINT_TYPE_PORT);
attr.value.s32list.count = 1;
attr.value.s32list.list = bpoint_list.data();
table_attrs.push_back(attr);

attr.id = SAI_ACL_TABLE_ATTR_STAGE;
attr.id = SAI_ACL_TABLE_ATTR_ACL_STAGE;
attr.value.s32 = SAI_ACL_STAGE_INGRESS;
table_attrs.push_back(attr);

attr.id = SAI_ACL_TABLE_ATTR_PRIORITY;
attr.id = SAI_ACL_TABLE_GROUP_MEMBER_ATTR_PRIORITY;
attr.value.u32 = DEFAULT_TABLE_PRIORITY;
table_attrs.push_back(attr);

attr.id = SAI_ACL_TABLE_ATTR_FIELD_ETHER_TYPE;
attr.value.booldata = true;
table_attrs.push_back(attr);

attr.id = SAI_ACL_TABLE_ATTR_FIELD_IP_TYPE;
attr.id = SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE;
attr.value.booldata = true;
table_attrs.push_back(attr);

Expand Down Expand Up @@ -1284,18 +1286,12 @@ sai_status_t AclOrch::createBindAclTable(AclTable &aclTable, sai_object_id_t &ta
table_attrs.push_back(attr);
}

attr.id = SAI_ACL_TABLE_ATTR_FIELD_RANGE;
// workaround until SAI is fixed
#if 0
attr.id = SAI_ACL_TABLE_ATTR_FIELD_ACL_RANGE_TYPE;
attr.value.s32list.count = sizeof(range_types_list) / sizeof(range_types_list[0]);
attr.value.s32list.list = range_types_list;
table_attrs.push_back(attr);
#else
attr.value.s32list.count = 0;
table_attrs.push_back(attr);
#endif

status = sai_acl_api->create_acl_table(&table_oid, table_attrs.size(), table_attrs.data());
status = sai_acl_api->create_acl_table(&table_oid, gSwitchId, table_attrs.size(), table_attrs.data());

if (status == SAI_STATUS_SUCCESS)
{
Expand All @@ -1319,7 +1315,7 @@ sai_status_t AclOrch::deleteUnbindAclTable(sai_object_id_t table_oid)
return status;
}

return sai_acl_api->delete_acl_table(table_oid);
return sai_acl_api->remove_acl_table(table_oid);
}

void AclOrch::collectCountersThread(AclOrch* pAclOrch)
Expand Down Expand Up @@ -1386,42 +1382,34 @@ sai_status_t AclOrch::bindAclTable(sai_object_id_t table_oid, AclTable &aclTable
}
}

for (const auto& portOid : aclTable.ports)
if (bind)
{
auto& portAcls = m_portBind[portOid];

sai_attribute_t attr;
attr.id = SAI_PORT_ATTR_INGRESS_ACL_LIST;

if (bind)
for (const auto& portOid : aclTable.ports)
{
portAcls.push_back(table_oid);
}
else
{
auto iter = portAcls.begin();
while (iter != portAcls.end())
{
if (*iter == table_oid)
{
portAcls.erase(iter);
break;
}
++iter;
Port port;
gPortsOrch->getPort(portOid, port);
assert(port.m_type == Port::PHY);

sai_object_id_t group_member_oid;
status = port.bindAclTable(group_member_oid, table_oid);
if (status != SAI_STATUS_SUCCESS) {
return status;
}
m_AclTableGroupMembers.emplace(table_oid, group_member_oid);
}

attr.value.objlist.list = portAcls.data();
attr.value.objlist.count = portAcls.size();

status = sai_port_api->set_port_attribute(portOid, &attr);
if (status != SAI_STATUS_SUCCESS)
}
else
{
auto range = m_AclTableGroupMembers.equal_range(table_oid);
for (auto iter = range.first; iter != range.second; iter++)
{
SWSS_LOG_ERROR("Failed to %s ACL table %s %s port %lu",
bind ? "bind" : "unbind", aclTable.id.c_str(),
bind ? "to" : "from",
portOid);
return status;
sai_object_id_t member = iter->second;
status = sai_acl_api->remove_acl_table_group_member(member);
if (status != SAI_STATUS_SUCCESS) {
SWSS_LOG_ERROR("Failed to unbind table %lu as member %lu from ACL table: %d",
table_oid, member, status);
return status;
}
}
}

Expand Down
5 changes: 3 additions & 2 deletions orchagent/aclorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <thread>
#include <mutex>
#include <tuple>
#include <map>
#include <condition_variable>
#include "orch.h"
#include "portsorch.h"
Expand Down Expand Up @@ -259,8 +260,8 @@ class AclOrch : public Orch, public Observer

//vector <AclTable> m_AclTables;
map <sai_object_id_t, AclTable> m_AclTables;
// Port OID to vector of ACL OIDs
map <sai_object_id_t, vector<sai_object_id_t>> m_portBind;
// ACL table OID to multiple ACL table group member
multimap <sai_object_id_t, sai_object_id_t> m_AclTableGroupMembers;

static mutex m_countersMutex;
static condition_variable m_sleepGuard;
Expand Down
21 changes: 11 additions & 10 deletions orchagent/bufferorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ extern sai_switch_api_t *sai_switch_api;
extern sai_buffer_api_t *sai_buffer_api;

extern PortsOrch *gPortsOrch;
extern sai_object_id_t gSwitchId;

using namespace std;

Expand Down Expand Up @@ -77,11 +78,11 @@ task_process_status BufferOrch::processBufferPool(Consumer &consumer)
string type = fvValue(*i);
if (type == buffer_value_ingress)
{
attr.value.u32 = SAI_BUFFER_POOL_INGRESS;
attr.value.u32 = SAI_BUFFER_POOL_TYPE_INGRESS;
}
else if (type == buffer_value_egress)
{
attr.value.u32 = SAI_BUFFER_POOL_EGRESS;
attr.value.u32 = SAI_BUFFER_POOL_TYPE_EGRESS;
}
else
{
Expand All @@ -96,18 +97,18 @@ task_process_status BufferOrch::processBufferPool(Consumer &consumer)
string mode = fvValue(*i);
if (mode == buffer_pool_mode_dynamic_value)
{
attr.value.u32 = SAI_BUFFER_THRESHOLD_MODE_DYNAMIC;
attr.value.u32 = SAI_BUFFER_POOL_THRESHOLD_MODE_DYNAMIC;
}
else if (mode == buffer_pool_mode_static_value)
{
attr.value.u32 = SAI_BUFFER_THRESHOLD_MODE_STATIC;
attr.value.u32 = SAI_BUFFER_POOL_THRESHOLD_MODE_STATIC;
}
else
{
SWSS_LOG_ERROR("Unknown pool mode specified:%s", mode.c_str());
return task_process_status::task_invalid_entry;
}
attr.id = SAI_BUFFER_POOL_ATTR_TH_MODE;
attr.id = SAI_BUFFER_POOL_ATTR_THRESHOLD_MODE;
attribs.push_back(attr);
}
else
Expand All @@ -119,7 +120,7 @@ task_process_status BufferOrch::processBufferPool(Consumer &consumer)
if (SAI_NULL_OBJECT_ID != sai_object)
{
SWSS_LOG_DEBUG("Modifying existing sai object:%lx ", sai_object);
sai_status = sai_buffer_api->set_buffer_pool_attr(sai_object, &attribs[0]);
sai_status = sai_buffer_api->set_buffer_pool_attribute(sai_object, &attribs[0]);
if (SAI_STATUS_SUCCESS != sai_status)
{
SWSS_LOG_ERROR("Failed to modify buffer pool, name:%s, sai object:%lx, status:%d", object_name.c_str(), sai_object, sai_status);
Expand All @@ -130,7 +131,7 @@ task_process_status BufferOrch::processBufferPool(Consumer &consumer)
else
{
SWSS_LOG_DEBUG("Creating new sai object");
sai_status = sai_buffer_api->create_buffer_pool(&sai_object, attribs.size(), attribs.data());
sai_status = sai_buffer_api->create_buffer_pool(&sai_object, gSwitchId, attribs.size(), attribs.data());
if (SAI_STATUS_SUCCESS != sai_status)
{
SWSS_LOG_ERROR("Failed to create buffer pool, name:%s, status:%d", object_name.c_str(), sai_status);
Expand Down Expand Up @@ -241,7 +242,7 @@ task_process_status BufferOrch::processBufferProfile(Consumer &consumer)
if (SAI_NULL_OBJECT_ID != sai_object)
{
SWSS_LOG_DEBUG("Modifying existing sai object:%lx ", sai_object);
sai_status = sai_buffer_api->set_buffer_profile_attr(sai_object, &attribs[0]);
sai_status = sai_buffer_api->set_buffer_profile_attribute(sai_object, &attribs[0]);
if (SAI_STATUS_SUCCESS != sai_status)
{
SWSS_LOG_ERROR("Failed to modify buffer profile, name:%s, sai object:%lx, status:%d", object_name.c_str(), sai_object, sai_status);
Expand All @@ -251,7 +252,7 @@ task_process_status BufferOrch::processBufferProfile(Consumer &consumer)
else
{
SWSS_LOG_DEBUG("Creating new sai object");
sai_status = sai_buffer_api->create_buffer_profile(&sai_object, attribs.size(), attribs.data());
sai_status = sai_buffer_api->create_buffer_profile(&sai_object, gSwitchId, attribs.size(), attribs.data());
if (SAI_STATUS_SUCCESS != sai_status)
{
SWSS_LOG_ERROR("Failed to create buffer profile, name:%s, status:%d", object_name.c_str(), sai_status);
Expand Down Expand Up @@ -412,7 +413,7 @@ task_process_status BufferOrch::processPriorityGroup(Consumer &consumer)
}
pg_id = port.m_priority_group_ids[ind];
SWSS_LOG_DEBUG("Applying buffer profile:0x%lx to port:%s pg index:%zd, pg sai_id:0x%lx", sai_buffer_profile, port_name.c_str(), ind, pg_id);
sai_status_t sai_status = sai_buffer_api->set_ingress_priority_group_attr(pg_id, &attr);
sai_status_t sai_status = sai_buffer_api->set_ingress_priority_group_attribute(pg_id, &attr);
if (sai_status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to set port:%s pg:%zd buffer profile attribute, status:%d", port_name.c_str(), ind, sai_status);
Expand Down
Loading