Skip to content

Commit 0917157

Browse files
stepanblyschakprsunny
authored andcommitted
[aclorch] if vendor does not implement ACL action capability quieries… (#1106)
* [aclorch] if vendor does not implement ACL action capability quieries - use default capabilities (do not fail)
1 parent 2a1ffe8 commit 0917157

File tree

2 files changed

+113
-54
lines changed

2 files changed

+113
-54
lines changed

orchagent/aclorch.cpp

+111-54
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,20 @@ static acl_stage_type_lookup_t aclStageLookUp =
115115
{STAGE_EGRESS, ACL_STAGE_EGRESS }
116116
};
117117

118+
static const acl_capabilities_t defaultAclActionsSupported =
119+
{
120+
{
121+
ACL_STAGE_INGRESS,
122+
{
123+
SAI_ACL_ACTION_TYPE_PACKET_ACTION,
124+
SAI_ACL_ACTION_TYPE_MIRROR_INGRESS
125+
}
126+
},
127+
{
128+
ACL_STAGE_EGRESS, {}
129+
}
130+
};
131+
118132
static acl_ip_type_lookup_t aclIpTypeLookup =
119133
{
120134
{ IP_TYPE_ANY, SAI_ACL_IP_TYPE_ANY },
@@ -2129,68 +2143,59 @@ void AclOrch::queryAclActionCapability()
21292143
sai_status_t status {SAI_STATUS_FAILURE};
21302144
sai_attribute_t attr;
21312145
vector<int32_t> action_list;
2132-
vector<FieldValueTuple> fvVector;
21332146

21342147
attr.id = SAI_SWITCH_ATTR_MAX_ACL_ACTION_COUNT;
21352148
status = sai_switch_api->get_switch_attribute(gSwitchId, 1, &attr);
2136-
if (status != SAI_STATUS_SUCCESS)
2137-
{
2138-
SWSS_LOG_THROW("AclOrch initialization failed: "
2139-
"failed to query maximum ACL action count");
2140-
}
2141-
2142-
const auto max_action_count = attr.value.u32;
2143-
2144-
for (auto stage_attr: {SAI_SWITCH_ATTR_ACL_STAGE_INGRESS, SAI_SWITCH_ATTR_ACL_STAGE_EGRESS})
2149+
if (status == SAI_STATUS_SUCCESS)
21452150
{
2146-
auto stage = (stage_attr == SAI_SWITCH_ATTR_ACL_STAGE_INGRESS ? ACL_STAGE_INGRESS : ACL_STAGE_EGRESS);
2147-
auto stage_str = (stage_attr == SAI_SWITCH_ATTR_ACL_STAGE_INGRESS ? STAGE_INGRESS : STAGE_EGRESS);
2148-
action_list.resize(static_cast<size_t>(max_action_count));
2149-
2150-
attr.id = stage_attr;
2151-
attr.value.aclcapability.action_list.list = action_list.data();
2152-
attr.value.aclcapability.action_list.count = max_action_count;
2151+
const auto max_action_count = attr.value.u32;
21532152

2154-
status = sai_switch_api->get_switch_attribute(gSwitchId, 1, &attr);
2155-
if (status != SAI_STATUS_SUCCESS)
2153+
for (auto stage_attr: {SAI_SWITCH_ATTR_ACL_STAGE_INGRESS, SAI_SWITCH_ATTR_ACL_STAGE_EGRESS})
21562154
{
2157-
SWSS_LOG_THROW("AclOrch initialization failed: "
2158-
"failed to query supported %s ACL actions", stage_str);
2159-
}
2155+
auto stage = (stage_attr == SAI_SWITCH_ATTR_ACL_STAGE_INGRESS ? ACL_STAGE_INGRESS : ACL_STAGE_EGRESS);
2156+
auto stage_str = (stage_attr == SAI_SWITCH_ATTR_ACL_STAGE_INGRESS ? STAGE_INGRESS : STAGE_EGRESS);
2157+
action_list.resize(static_cast<size_t>(max_action_count));
21602158

2161-
SWSS_LOG_INFO("Supported %s action count %d:", stage_str,
2162-
attr.value.aclcapability.action_list.count);
2159+
attr.id = stage_attr;
2160+
attr.value.aclcapability.action_list.list = action_list.data();
2161+
attr.value.aclcapability.action_list.count = max_action_count;
21632162

2164-
for (size_t i = 0; i < static_cast<size_t>(attr.value.aclcapability.action_list.count); i++)
2165-
{
2166-
auto action = static_cast<sai_acl_action_type_t>(action_list[i]);
2167-
m_aclCapabilities[stage].insert(action);
2168-
SWSS_LOG_INFO(" %s", sai_serialize_enum(action, &sai_metadata_enum_sai_acl_action_type_t).c_str());
2169-
}
2170-
2171-
// put capabilities in state DB
2163+
status = sai_switch_api->get_switch_attribute(gSwitchId, 1, &attr);
2164+
if (status == SAI_STATUS_SUCCESS)
2165+
{
21722166

2173-
auto field = std::string("ACL_ACTIONS") + '|' + stage_str;
2174-
auto& acl_action_set = m_aclCapabilities[stage];
2167+
SWSS_LOG_INFO("Supported %s action count %d:", stage_str,
2168+
attr.value.aclcapability.action_list.count);
21752169

2176-
string delimiter;
2177-
ostringstream acl_action_value_stream;
2178-
2179-
for (const auto& action_map: {aclL3ActionLookup, aclMirrorStageLookup, aclDTelActionLookup})
2180-
{
2181-
for (const auto& it: action_map)
2182-
{
2183-
auto saiAction = getAclActionFromAclEntry(it.second);
2184-
if (acl_action_set.find(saiAction) != acl_action_set.cend())
2170+
for (size_t i = 0; i < static_cast<size_t>(attr.value.aclcapability.action_list.count); i++)
21852171
{
2186-
acl_action_value_stream << delimiter << it.first;
2187-
delimiter = comma;
2172+
auto action = static_cast<sai_acl_action_type_t>(action_list[i]);
2173+
m_aclCapabilities[stage].insert(action);
2174+
SWSS_LOG_INFO(" %s", sai_serialize_enum(action, &sai_metadata_enum_sai_acl_action_type_t).c_str());
21882175
}
21892176
}
2190-
}
2177+
else
2178+
{
2179+
SWSS_LOG_WARN("Failed to query ACL %s action capabilities - "
2180+
"API assumed to be not implemented, using defaults",
2181+
stage_str);
2182+
initDefaultAclActionCapabilities(stage);
2183+
}
21912184

2192-
fvVector.emplace_back(field, acl_action_value_stream.str());
2193-
m_switchTable.set("switch", fvVector);
2185+
// put capabilities in state DB
2186+
putAclActionCapabilityInDB(stage);
2187+
}
2188+
}
2189+
else
2190+
{
2191+
SWSS_LOG_WARN("Failed to query maximum ACL action count - "
2192+
"API assumed to be not implemented, using defaults capabilities for both %s and %s",
2193+
STAGE_INGRESS, STAGE_EGRESS);
2194+
for (auto stage: {ACL_STAGE_INGRESS, ACL_STAGE_EGRESS})
2195+
{
2196+
initDefaultAclActionCapabilities(stage);
2197+
putAclActionCapabilityInDB(stage);
2198+
}
21942199
}
21952200

21962201
/* For those ACL action entry attributes for which acl parameter is enumeration (metadata->isenum == true)
@@ -2209,6 +2214,50 @@ void AclOrch::queryAclActionCapability()
22092214
aclDTelFlowOpTypeLookup);
22102215
}
22112216

2217+
void AclOrch::putAclActionCapabilityInDB(acl_stage_type_t stage)
2218+
{
2219+
vector<FieldValueTuple> fvVector;
2220+
auto stage_str = (stage == ACL_STAGE_INGRESS ? STAGE_INGRESS : STAGE_EGRESS);
2221+
2222+
auto field = std::string("ACL_ACTIONS") + '|' + stage_str;
2223+
auto& acl_action_set = m_aclCapabilities[stage];
2224+
2225+
string delimiter;
2226+
ostringstream acl_action_value_stream;
2227+
2228+
for (const auto& action_map: {aclL3ActionLookup, aclMirrorStageLookup, aclDTelActionLookup})
2229+
{
2230+
for (const auto& it: action_map)
2231+
{
2232+
auto saiAction = getAclActionFromAclEntry(it.second);
2233+
if (acl_action_set.find(saiAction) != acl_action_set.cend())
2234+
{
2235+
acl_action_value_stream << delimiter << it.first;
2236+
delimiter = comma;
2237+
}
2238+
}
2239+
}
2240+
2241+
fvVector.emplace_back(field, acl_action_value_stream.str());
2242+
m_switchTable.set("switch", fvVector);
2243+
}
2244+
2245+
void AclOrch::initDefaultAclActionCapabilities(acl_stage_type_t stage)
2246+
{
2247+
m_aclCapabilities[stage] = defaultAclActionsSupported.at(stage);
2248+
2249+
SWSS_LOG_INFO("Assumed %s %zu actions to be supported:",
2250+
stage == ACL_STAGE_INGRESS ? STAGE_INGRESS : STAGE_EGRESS,
2251+
m_aclCapabilities[stage].size());
2252+
2253+
for (auto action: m_aclCapabilities[stage])
2254+
{
2255+
SWSS_LOG_INFO(" %s", sai_serialize_enum(action, &sai_metadata_enum_sai_acl_action_type_t).c_str());
2256+
}
2257+
// put capabilities in state DB
2258+
putAclActionCapabilityInDB(stage);
2259+
}
2260+
22122261
template<typename AclActionAttrLookupT>
22132262
void AclOrch::queryAclActionAttrEnumValues(const string &action_name,
22142263
const acl_rule_attr_lookup_t& ruleAttrLookupMap,
@@ -2251,15 +2300,23 @@ void AclOrch::queryAclActionAttrEnumValues(const string &action_name,
22512300
SAI_OBJECT_TYPE_ACL_ENTRY,
22522301
acl_attr,
22532302
&values);
2254-
if (status != SAI_STATUS_SUCCESS)
2303+
if (status == SAI_STATUS_SUCCESS)
22552304
{
2256-
SWSS_LOG_THROW("sai_query_attribute_enum_values_capability failed for %s",
2257-
action_name.c_str());
2305+
for (size_t i = 0; i < values.count; i++)
2306+
{
2307+
m_aclEnumActionCapabilities[acl_action].insert(values.list[i]);
2308+
}
22582309
}
2259-
2260-
for (size_t i = 0; i < values.count; i++)
2310+
else
22612311
{
2262-
m_aclEnumActionCapabilities[acl_action].insert(values.list[i]);
2312+
SWSS_LOG_WARN("Failed to query enum values supported for ACL action %s - ",
2313+
"API is not implemented, assuming all values are supported for this action",
2314+
action_name.c_str());
2315+
/* assume all enum values are supported */
2316+
for (size_t i = 0; i < meta->enummetadata->valuescount; i++)
2317+
{
2318+
m_aclEnumActionCapabilities[acl_action].insert(meta->enummetadata->values[i]);
2319+
}
22632320
}
22642321
#else
22652322
/* assume all enum values are supported untill sai object api is available */

orchagent/aclorch.h

+2
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,8 @@ class AclOrch : public Orch, public Observer
419419

420420
void queryMirrorTableCapability();
421421
void queryAclActionCapability();
422+
void initDefaultAclActionCapabilities(acl_stage_type_t);
423+
void putAclActionCapabilityInDB(acl_stage_type_t);
422424

423425
template<typename AclActionAttrLookupT>
424426
void queryAclActionAttrEnumValues(const string& action_name,

0 commit comments

Comments
 (0)