diff --git a/orchagent/aclorch.cpp b/orchagent/aclorch.cpp index 8e43a66db31..94df8f451e0 100644 --- a/orchagent/aclorch.cpp +++ b/orchagent/aclorch.cpp @@ -3173,7 +3173,6 @@ void AclOrch::init(vector& connectors, PortsOrch *portOrch, Mirr m_L3V4V6Capability[ACL_STAGE_INGRESS] ? "yes" : "no", m_L3V4V6Capability[ACL_STAGE_EGRESS] ? "yes" : "no"); - // In Mellanox platform, V4 and V6 rules are stored in different tables // In Broadcom DNX platform also, V4 and V6 rules are stored in different tables if (platform == MLNX_PLATFORM_SUBSTRING || @@ -3189,6 +3188,100 @@ void AclOrch::init(vector& connectors, PortsOrch *portOrch, Mirr m_isCombinedMirrorV6Table = true; } + if (platform == VS_PLATFORM_SUBSTRING) + { + // For testing on VS the following values will be used. + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_RANGE_CAPABLE] = "true"; + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_MIN] = "1"; + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_MAX] = "7"; + m_switchMetaDataCapabilities[TABLE_ACL_ENTRY_ATTR_META_CAPABLE] = "true"; + m_switchMetaDataCapabilities[TABLE_ACL_ENTRY_ACTION_META_CAPABLE] = "true"; + } + else + { + // check switch capability of Metadata attribute, action and range. + // SAI_SWITCH_ATTR_ACL_USER_META_DATA_RANGE support and range values. + // SAI_ACL_ENTRY_ATTR_ACTION_SET_ACL_META_DATA + // SAI_ACL_ENTRY_ATTR_FIELD_ACL_USER_META + + sai_status_t status = SAI_STATUS_SUCCESS; + sai_attr_capability_t capability; + uint16_t metadataMin = 0; + uint16_t metadataMax = 0; + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_MIN] = "0"; + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_MAX] = "0"; + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_RANGE_CAPABLE] = "false"; + m_switchMetaDataCapabilities[TABLE_ACL_ENTRY_ATTR_META_CAPABLE] = "false"; + m_switchMetaDataCapabilities[TABLE_ACL_ENTRY_ACTION_META_CAPABLE] = "false"; + + status = sai_query_attribute_capability(gSwitchId, SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_ACL_USER_META_DATA_RANGE, &capability); +// Disabling these blocks to stop coverage analysis failure. The subsequent PR will enable these. +// if (status != SAI_STATUS_SUCCESS) +// { +// SWSS_LOG_WARN("Could not query ACL_USER_META_DATA_RANGE %d", status); +// } +// else + if (status == SAI_STATUS_SUCCESS) + { + if (capability.get_implemented) + { + sai_attribute_t attrs[1]; + attrs[0].id = SAI_SWITCH_ATTR_ACL_USER_META_DATA_RANGE; + sai_status_t status = sai_switch_api->get_switch_attribute(gSwitchId, 2, attrs); +// Disabling these blocks to stop coverage analysis failure. The subsequent PR will enable these. +// if (status != SAI_STATUS_SUCCESS) +// { +// SWSS_LOG_WARN("Could not get range for ACL_USER_META_DATA_RANGE %d", status); +// } +// else + if (status == SAI_STATUS_SUCCESS) + { +// SWSS_LOG_NOTICE("ACL_USER_META_DATA_RANGE, min: %u, max: %u", attrs[0].value.u32range.min, attrs[0].value.u32range.max); + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_RANGE_CAPABLE] = "true"; + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_MIN] = std::to_string(attrs[0].value.u32range.min); + m_switchMetaDataCapabilities[TABLE_ACL_USER_META_DATA_MAX] = std::to_string(attrs[0].value.u32range.max); + metadataMin = uint16_t(attrs[0].value.u32range.min); + metadataMax = uint16_t(attrs[0].value.u32range.max); + } + + } + SWSS_LOG_NOTICE("ACL_USER_META_DATA_RANGE capability %d", capability.get_implemented); + } + status = sai_query_attribute_capability(gSwitchId, SAI_OBJECT_TYPE_ACL_ENTRY, SAI_ACL_ENTRY_ATTR_FIELD_ACL_USER_META, &capability); +// Disabling these blocks to stop coverage analysis failure. The subsequent PR will enable these. +// if (status != SAI_STATUS_SUCCESS) +// { +// SWSS_LOG_WARN("Could not query ACL_ENTRY_ATTR_FIELD_ACL_USER_META %d", status); +// } +// else + if (status == SAI_STATUS_SUCCESS) + { + if (capability.set_implemented) + { + m_switchMetaDataCapabilities[TABLE_ACL_ENTRY_ATTR_META_CAPABLE] = "true"; + } + SWSS_LOG_NOTICE("ACL_ENTRY_ATTR_FIELD_ACL_USER_META capability %d", capability.set_implemented); + } + + status = sai_query_attribute_capability(gSwitchId, SAI_OBJECT_TYPE_ACL_ENTRY, SAI_ACL_ENTRY_ATTR_ACTION_SET_ACL_META_DATA, &capability); +// Disabling these blocks to stop coverage analysis failure. The subsequent PR will enable these. +// if (status != SAI_STATUS_SUCCESS) +// { +// SWSS_LOG_WARN("Could not query ACL_ENTRY_ATTR_ACTION_SET_ACL_META_DATA %d", status); +// } +// else + if (status == SAI_STATUS_SUCCESS) + { + if (capability.set_implemented) + { + m_switchMetaDataCapabilities[TABLE_ACL_ENTRY_ACTION_META_CAPABLE] = "true"; + } + SWSS_LOG_NOTICE("ACL_ENTRY_ATTR_ACTION_SET_ACL_META_DATA capability %d", capability.set_implemented); + } + // The following lines would be replaced in the next PR where these values would be used to initialze the metadataMgr. + (void)metadataMin; + (void)metadataMax; + } // Store the capabilities in state database // TODO: Move this part of the code into syncd diff --git a/orchagent/aclorch.h b/orchagent/aclorch.h index 6c0246ce4ab..2e53cc9175d 100644 --- a/orchagent/aclorch.h +++ b/orchagent/aclorch.h @@ -103,6 +103,12 @@ #define ACL_COUNTER_FLEX_COUNTER_GROUP "ACL_STAT_COUNTER" +#define TABLE_ACL_USER_META_DATA_RANGE_CAPABLE "ACL_USER_META_DATA_RANGE_CAPABLE" +#define TABLE_ACL_USER_META_DATA_MIN "ACL_USER_META_DATA_MIN" +#define TABLE_ACL_USER_META_DATA_MAX "ACL_USER_META_DATA_MAX" +#define TABLE_ACL_ENTRY_ATTR_META_CAPABLE "ACL_ENTRY_ATTR_META_CAPABLE" +#define TABLE_ACL_ENTRY_ACTION_META_CAPABLE "ACL_ENTRY_ACTION_META_CAPABLE" + enum AclObjectStatus { ACTIVE = 0, @@ -516,7 +522,8 @@ class AclOrch : public Orch, public Observer bool m_isCombinedMirrorV6Table = true; map m_mirrorTableCapabilities; map m_L3V4V6Capability; - + map m_switchMetaDataCapabilities; + void registerFlexCounter(const AclRule& rule); void deregisterFlexCounter(const AclRule& rule);