in vslib/VirtualSwitchSaiInterface.cpp [826:883]
sai_status_t VirtualSwitchSaiInterface::objectTypeGetAvailability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
_In_ uint32_t attrCount,
_In_ const sai_attribute_t *attrList,
_Out_ uint64_t *count)
{
SWSS_LOG_ENTER();
// TODO: We should generate this metadata for the virtual switch rather
// than hard-coding it here.
if (objectType == SAI_OBJECT_TYPE_DEBUG_COUNTER)
{
*count = 3;
return SAI_STATUS_SUCCESS;
}
// MPLS Inseg and MPLS NH CRM use sai_object_type_get_availability() API.
else if ((objectType == SAI_OBJECT_TYPE_INSEG_ENTRY) ||
((objectType == SAI_OBJECT_TYPE_NEXT_HOP) &&
(attrCount == 1) && attrList &&
(attrList[0].id == SAI_NEXT_HOP_ATTR_TYPE) &&
(attrList[0].value.s32 == SAI_NEXT_HOP_TYPE_MPLS)))
{
std::string cmd_str("sysctl net.mpls.platform_labels");
std::string ret_str;
*count = 1000;
if (!swss::exec(cmd_str, ret_str))
{
std::string match("net.mpls.platform_labels = ");
if (ret_str.find(match) != std::string::npos)
{
*count = std::stoul(ret_str.substr(match.length()).c_str());
}
}
return SAI_STATUS_SUCCESS;
}
else if (objectType == SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MAP)
{
*count = 512;
return SAI_STATUS_SUCCESS;
}
else if ((objectType == (sai_object_type_t)SAI_OBJECT_TYPE_VNET) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_ENI) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP) ||
(objectType == (sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_RULE))
{
*count = 100000;
return SAI_STATUS_SUCCESS;
}
return SAI_STATUS_NOT_SUPPORTED;
}