@@ -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+
76112const 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+
467571void 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 ;
0 commit comments