Skip to content

Commit 828cccf

Browse files
[crm] Use sai_object_type_get_availability() API to get counters (sonic-net#2098)
*Aligned supported CRM resources with the newest way to get counters using sai_object_type_get_availability() API. Signed-off-by: Volodymyr Samotiy <[email protected]>
1 parent 18c73a1 commit 828cccf

File tree

2 files changed

+111
-139
lines changed

2 files changed

+111
-139
lines changed

orchagent/crmorch.cpp

+110-139
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,49 @@ const map<CrmResourceType, uint32_t> crmResSaiAvailAttrMap =
6666
{ CrmResourceType::CRM_IPMC_ENTRY, SAI_SWITCH_ATTR_AVAILABLE_IPMC_ENTRY},
6767
{ CrmResourceType::CRM_SNAT_ENTRY, SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY },
6868
{ CrmResourceType::CRM_DNAT_ENTRY, SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY },
69+
};
70+
71+
const map<CrmResourceType, sai_object_type_t> crmResSaiObjAttrMap =
72+
{
73+
{ CrmResourceType::CRM_IPV4_ROUTE, SAI_OBJECT_TYPE_ROUTE_ENTRY },
74+
{ CrmResourceType::CRM_IPV6_ROUTE, SAI_OBJECT_TYPE_ROUTE_ENTRY },
75+
{ CrmResourceType::CRM_IPV4_NEXTHOP, SAI_OBJECT_TYPE_NULL },
76+
{ CrmResourceType::CRM_IPV6_NEXTHOP, SAI_OBJECT_TYPE_NULL },
77+
{ CrmResourceType::CRM_IPV4_NEIGHBOR, SAI_OBJECT_TYPE_NEIGHBOR_ENTRY },
78+
{ CrmResourceType::CRM_IPV6_NEIGHBOR, SAI_OBJECT_TYPE_NEIGHBOR_ENTRY },
79+
{ CrmResourceType::CRM_NEXTHOP_GROUP_MEMBER, SAI_OBJECT_TYPE_NULL },
80+
{ CrmResourceType::CRM_NEXTHOP_GROUP, SAI_OBJECT_TYPE_NEXT_HOP_GROUP },
81+
{ CrmResourceType::CRM_ACL_TABLE, SAI_OBJECT_TYPE_NULL },
82+
{ CrmResourceType::CRM_ACL_GROUP, SAI_OBJECT_TYPE_NULL },
83+
{ CrmResourceType::CRM_ACL_ENTRY, SAI_OBJECT_TYPE_NULL },
84+
{ CrmResourceType::CRM_ACL_COUNTER, SAI_OBJECT_TYPE_NULL },
85+
{ CrmResourceType::CRM_FDB_ENTRY, SAI_OBJECT_TYPE_FDB_ENTRY },
86+
{ CrmResourceType::CRM_IPMC_ENTRY, SAI_OBJECT_TYPE_NULL},
87+
{ CrmResourceType::CRM_SNAT_ENTRY, SAI_OBJECT_TYPE_NULL },
88+
{ CrmResourceType::CRM_DNAT_ENTRY, SAI_OBJECT_TYPE_NULL },
6989
{ CrmResourceType::CRM_MPLS_INSEG, SAI_OBJECT_TYPE_INSEG_ENTRY },
7090
{ CrmResourceType::CRM_MPLS_NEXTHOP, SAI_OBJECT_TYPE_NEXT_HOP },
7191
{ CrmResourceType::CRM_SRV6_MY_SID_ENTRY, SAI_OBJECT_TYPE_MY_SID_ENTRY },
7292
{ CrmResourceType::CRM_SRV6_NEXTHOP, SAI_OBJECT_TYPE_NEXT_HOP },
7393
{ CrmResourceType::CRM_NEXTHOP_GROUP_MAP, SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MAP },
7494
};
7595

96+
const map<CrmResourceType, sai_attr_id_t> crmResAddrFamilyAttrMap =
97+
{
98+
{ CrmResourceType::CRM_IPV4_ROUTE, SAI_ROUTE_ENTRY_ATTR_IP_ADDR_FAMILY },
99+
{ CrmResourceType::CRM_IPV6_ROUTE, SAI_ROUTE_ENTRY_ATTR_IP_ADDR_FAMILY },
100+
{ CrmResourceType::CRM_IPV4_NEIGHBOR, SAI_NEIGHBOR_ENTRY_ATTR_IP_ADDR_FAMILY },
101+
{ CrmResourceType::CRM_IPV6_NEIGHBOR, SAI_NEIGHBOR_ENTRY_ATTR_IP_ADDR_FAMILY },
102+
};
103+
104+
const map<CrmResourceType, sai_ip_addr_family_t> crmResAddrFamilyValMap =
105+
{
106+
{ CrmResourceType::CRM_IPV4_ROUTE, SAI_IP_ADDR_FAMILY_IPV4 },
107+
{ CrmResourceType::CRM_IPV6_ROUTE, SAI_IP_ADDR_FAMILY_IPV6 },
108+
{ CrmResourceType::CRM_IPV4_NEIGHBOR, SAI_IP_ADDR_FAMILY_IPV4 },
109+
{ CrmResourceType::CRM_IPV6_NEIGHBOR, SAI_IP_ADDR_FAMILY_IPV6 },
110+
};
111+
76112
const map<string, CrmResourceType> crmThreshTypeResMap =
77113
{
78114
{ "ipv4_route_threshold_type", CrmResourceType::CRM_IPV4_ROUTE },
@@ -464,6 +500,74 @@ void CrmOrch::doTask(SelectableTimer &timer)
464500
checkCrmThresholds();
465501
}
466502

503+
bool CrmOrch::getResAvailability(CrmResourceType type, CrmResourceEntry &res)
504+
{
505+
sai_attribute_t attr;
506+
uint64_t availCount = 0;
507+
sai_status_t status = SAI_STATUS_SUCCESS;
508+
509+
sai_object_type_t objType = crmResSaiObjAttrMap.at(type);
510+
511+
if (objType != SAI_OBJECT_TYPE_NULL)
512+
{
513+
uint32_t attrCount = 0;
514+
515+
if ((type == CrmResourceType::CRM_IPV4_ROUTE) || (type == CrmResourceType::CRM_IPV6_ROUTE) ||
516+
(type == CrmResourceType::CRM_IPV4_NEIGHBOR) || (type == CrmResourceType::CRM_IPV6_NEIGHBOR))
517+
{
518+
attr.id = crmResAddrFamilyAttrMap.at(type);
519+
attr.value.s32 = crmResAddrFamilyValMap.at(type);
520+
attrCount = 1;
521+
}
522+
else if (type == CrmResourceType::CRM_MPLS_NEXTHOP)
523+
{
524+
attr.id = SAI_NEXT_HOP_ATTR_TYPE;
525+
attr.value.s32 = SAI_NEXT_HOP_TYPE_MPLS;
526+
attrCount = 1;
527+
}
528+
else if (type == CrmResourceType::CRM_SRV6_NEXTHOP)
529+
{
530+
attr.id = SAI_NEXT_HOP_ATTR_TYPE;
531+
attr.value.s32 = SAI_NEXT_HOP_TYPE_SRV6_SIDLIST;
532+
attrCount = 1;
533+
}
534+
535+
status = sai_object_type_get_availability(gSwitchId, objType, attrCount, &attr, &availCount);
536+
}
537+
538+
if ((status != SAI_STATUS_SUCCESS) || (objType == SAI_OBJECT_TYPE_NULL))
539+
{
540+
if (crmResSaiAvailAttrMap.find(type) != crmResSaiAvailAttrMap.end())
541+
{
542+
attr.id = crmResSaiAvailAttrMap.at(type);
543+
status = sai_switch_api->get_switch_attribute(gSwitchId, 1, &attr);
544+
}
545+
546+
if ((status == SAI_STATUS_NOT_SUPPORTED) ||
547+
(status == SAI_STATUS_NOT_IMPLEMENTED) ||
548+
SAI_STATUS_IS_ATTR_NOT_SUPPORTED(status) ||
549+
SAI_STATUS_IS_ATTR_NOT_IMPLEMENTED(status))
550+
{
551+
// mark unsupported resources
552+
res.resStatus = CrmResourceStatus::CRM_RES_NOT_SUPPORTED;
553+
SWSS_LOG_NOTICE("CRM resource %s not supported", crmResTypeNameMap.at(type).c_str());
554+
return false;
555+
}
556+
557+
if (status != SAI_STATUS_SUCCESS)
558+
{
559+
SWSS_LOG_ERROR("Failed to get availability counter for %s CRM resourse", crmResTypeNameMap.at(type).c_str());
560+
return false;
561+
}
562+
563+
availCount = attr.value.u32;
564+
}
565+
566+
res.countersMap[CRM_COUNTERS_TABLE_KEY].availableCounter = static_cast<uint32_t>(availCount);
567+
568+
return true;
569+
}
570+
467571
void CrmOrch::getResAvailableCounters()
468572
{
469573
SWSS_LOG_ENTER();
@@ -490,33 +594,13 @@ void CrmOrch::getResAvailableCounters()
490594
case CrmResourceType::CRM_IPMC_ENTRY:
491595
case CrmResourceType::CRM_SNAT_ENTRY:
492596
case CrmResourceType::CRM_DNAT_ENTRY:
597+
case CrmResourceType::CRM_MPLS_INSEG:
598+
case CrmResourceType::CRM_NEXTHOP_GROUP_MAP:
599+
case CrmResourceType::CRM_SRV6_MY_SID_ENTRY:
600+
case CrmResourceType::CRM_MPLS_NEXTHOP:
601+
case CrmResourceType::CRM_SRV6_NEXTHOP:
493602
{
494-
sai_attribute_t attr;
495-
attr.id = crmResSaiAvailAttrMap.at(res.first);
496-
497-
sai_status_t status = sai_switch_api->get_switch_attribute(gSwitchId, 1, &attr);
498-
if (status != SAI_STATUS_SUCCESS)
499-
{
500-
if ((status == SAI_STATUS_NOT_SUPPORTED) ||
501-
(status == SAI_STATUS_NOT_IMPLEMENTED) ||
502-
SAI_STATUS_IS_ATTR_NOT_SUPPORTED(status) ||
503-
SAI_STATUS_IS_ATTR_NOT_IMPLEMENTED(status))
504-
{
505-
// mark unsupported resources
506-
res.second.resStatus = CrmResourceStatus::CRM_RES_NOT_SUPPORTED;
507-
SWSS_LOG_NOTICE("Switch attribute %u not supported", attr.id);
508-
break;
509-
}
510-
SWSS_LOG_ERROR("Failed to get switch attribute %u , rv:%d", attr.id, status);
511-
task_process_status handle_status = handleSaiGetStatus(SAI_API_SWITCH, status);
512-
if (handle_status != task_process_status::task_success)
513-
{
514-
break;
515-
}
516-
}
517-
518-
res.second.countersMap[CRM_COUNTERS_TABLE_KEY].availableCounter = attr.value.u32;
519-
603+
getResAvailability(res.first, res.second);
520604
break;
521605
}
522606

@@ -578,119 +662,6 @@ void CrmOrch::getResAvailableCounters()
578662
break;
579663
}
580664

581-
case CrmResourceType::CRM_MPLS_INSEG:
582-
case CrmResourceType::CRM_NEXTHOP_GROUP_MAP:
583-
{
584-
sai_object_type_t objType = static_cast<sai_object_type_t>(crmResSaiAvailAttrMap.at(res.first));
585-
uint64_t availCount = 0;
586-
sai_status_t status = sai_object_type_get_availability(gSwitchId, objType, 0, nullptr, &availCount);
587-
if (status != SAI_STATUS_SUCCESS)
588-
{
589-
if ((status == SAI_STATUS_NOT_SUPPORTED) ||
590-
(status == SAI_STATUS_NOT_IMPLEMENTED) ||
591-
SAI_STATUS_IS_ATTR_NOT_SUPPORTED(status) ||
592-
SAI_STATUS_IS_ATTR_NOT_IMPLEMENTED(status))
593-
{
594-
// mark unsupported resources
595-
res.second.resStatus = CrmResourceStatus::CRM_RES_NOT_SUPPORTED;
596-
SWSS_LOG_NOTICE("CRM Resource %s not supported", crmResTypeNameMap.at(res.first).c_str());
597-
break;
598-
}
599-
SWSS_LOG_ERROR("Failed to get availability for object_type %u , rv:%d", objType, status);
600-
break;
601-
}
602-
603-
res.second.countersMap[CRM_COUNTERS_TABLE_KEY].availableCounter = static_cast<uint32_t>(availCount);
604-
605-
break;
606-
}
607-
608-
case CrmResourceType::CRM_MPLS_NEXTHOP:
609-
{
610-
sai_object_type_t objType = static_cast<sai_object_type_t>(crmResSaiAvailAttrMap.at(res.first));
611-
sai_attribute_t attr;
612-
uint64_t availCount = 0;
613-
614-
attr.id = SAI_NEXT_HOP_ATTR_TYPE;
615-
attr.value.s32 = SAI_NEXT_HOP_TYPE_MPLS;
616-
sai_status_t status = sai_object_type_get_availability(gSwitchId, objType, 1, &attr, &availCount);
617-
if (status != SAI_STATUS_SUCCESS)
618-
{
619-
if ((status == SAI_STATUS_NOT_SUPPORTED) ||
620-
(status == SAI_STATUS_NOT_IMPLEMENTED) ||
621-
SAI_STATUS_IS_ATTR_NOT_SUPPORTED(status) ||
622-
SAI_STATUS_IS_ATTR_NOT_IMPLEMENTED(status))
623-
{
624-
// mark unsupported resources
625-
res.second.resStatus = CrmResourceStatus::CRM_RES_NOT_SUPPORTED;
626-
SWSS_LOG_NOTICE("CRM Resource %s not supported", crmResTypeNameMap.at(res.first).c_str());
627-
break;
628-
}
629-
SWSS_LOG_ERROR("Failed to get availability for object_type %u , rv:%d", objType, status);
630-
break;
631-
}
632-
633-
res.second.countersMap[CRM_COUNTERS_TABLE_KEY].availableCounter = static_cast<uint32_t>(availCount);
634-
635-
break;
636-
}
637-
638-
case CrmResourceType::CRM_SRV6_MY_SID_ENTRY:
639-
{
640-
sai_object_type_t objType = static_cast<sai_object_type_t>(crmResSaiAvailAttrMap.at(res.first));
641-
uint64_t availCount = 0;
642-
sai_status_t status = sai_object_type_get_availability(gSwitchId, objType, 0, nullptr, &availCount);
643-
if (status != SAI_STATUS_SUCCESS)
644-
{
645-
if ((status == SAI_STATUS_NOT_SUPPORTED) ||
646-
(status == SAI_STATUS_NOT_IMPLEMENTED) ||
647-
SAI_STATUS_IS_ATTR_NOT_SUPPORTED(status) ||
648-
SAI_STATUS_IS_ATTR_NOT_IMPLEMENTED(status))
649-
{
650-
// mark unsupported resources
651-
res.second.resStatus = CrmResourceStatus::CRM_RES_NOT_SUPPORTED;
652-
SWSS_LOG_NOTICE("CRM Resource %s not supported", crmResTypeNameMap.at(res.first).c_str());
653-
break;
654-
}
655-
SWSS_LOG_ERROR("Failed to get availability for object_type %u , rv:%d", objType, status);
656-
break;
657-
}
658-
659-
res.second.countersMap[CRM_COUNTERS_TABLE_KEY].availableCounter = static_cast<uint32_t>(availCount);
660-
661-
break;
662-
}
663-
664-
case CrmResourceType::CRM_SRV6_NEXTHOP:
665-
{
666-
sai_object_type_t objType = static_cast<sai_object_type_t>(crmResSaiAvailAttrMap.at(res.first));
667-
sai_attribute_t attr;
668-
uint64_t availCount = 0;
669-
670-
attr.id = SAI_NEXT_HOP_ATTR_TYPE;
671-
attr.value.s32 = SAI_NEXT_HOP_TYPE_SRV6_SIDLIST;
672-
sai_status_t status = sai_object_type_get_availability(gSwitchId, objType, 1, &attr, &availCount);
673-
if (status != SAI_STATUS_SUCCESS)
674-
{
675-
if ((status == SAI_STATUS_NOT_SUPPORTED) ||
676-
(status == SAI_STATUS_NOT_IMPLEMENTED) ||
677-
SAI_STATUS_IS_ATTR_NOT_SUPPORTED(status) ||
678-
SAI_STATUS_IS_ATTR_NOT_IMPLEMENTED(status))
679-
{
680-
// mark unsupported resources
681-
res.second.resStatus = CrmResourceStatus::CRM_RES_NOT_SUPPORTED;
682-
SWSS_LOG_NOTICE("CRM Resource %s not supported", crmResTypeNameMap.at(res.first).c_str());
683-
break;
684-
}
685-
SWSS_LOG_ERROR("Failed to get availability for object_type %u , rv:%d", objType, status);
686-
break;
687-
}
688-
689-
res.second.countersMap[CRM_COUNTERS_TABLE_KEY].availableCounter = static_cast<uint32_t>(availCount);
690-
691-
break;
692-
}
693-
694665
default:
695666
SWSS_LOG_ERROR("Failed to get CRM resource type %u. Unknown resource type.\n", static_cast<uint32_t>(res.first));
696667
return;

orchagent/crmorch.h

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class CrmOrch : public Orch
9898
void doTask(Consumer &consumer);
9999
void handleSetCommand(const std::string& key, const std::vector<swss::FieldValueTuple>& data);
100100
void doTask(swss::SelectableTimer &timer);
101+
bool getResAvailability(CrmResourceType type, CrmResourceEntry &res);
101102
void getResAvailableCounters();
102103
void updateCrmCountersTable();
103104
void checkCrmThresholds();

0 commit comments

Comments
 (0)