@@ -66,13 +66,49 @@ const map<CrmResourceType, uint32_t> crmResSaiAvailAttrMap =
66
66
{ CrmResourceType::CRM_IPMC_ENTRY, SAI_SWITCH_ATTR_AVAILABLE_IPMC_ENTRY},
67
67
{ CrmResourceType::CRM_SNAT_ENTRY, SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY },
68
68
{ 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 },
69
89
{ CrmResourceType::CRM_MPLS_INSEG, SAI_OBJECT_TYPE_INSEG_ENTRY },
70
90
{ CrmResourceType::CRM_MPLS_NEXTHOP, SAI_OBJECT_TYPE_NEXT_HOP },
71
91
{ CrmResourceType::CRM_SRV6_MY_SID_ENTRY, SAI_OBJECT_TYPE_MY_SID_ENTRY },
72
92
{ CrmResourceType::CRM_SRV6_NEXTHOP, SAI_OBJECT_TYPE_NEXT_HOP },
73
93
{ CrmResourceType::CRM_NEXTHOP_GROUP_MAP, SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MAP },
74
94
};
75
95
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
+
76
112
const map<string, CrmResourceType> crmThreshTypeResMap =
77
113
{
78
114
{ " ipv4_route_threshold_type" , CrmResourceType::CRM_IPV4_ROUTE },
@@ -464,6 +500,74 @@ void CrmOrch::doTask(SelectableTimer &timer)
464
500
checkCrmThresholds ();
465
501
}
466
502
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
+
467
571
void CrmOrch::getResAvailableCounters ()
468
572
{
469
573
SWSS_LOG_ENTER ();
@@ -490,33 +594,13 @@ void CrmOrch::getResAvailableCounters()
490
594
case CrmResourceType::CRM_IPMC_ENTRY:
491
595
case CrmResourceType::CRM_SNAT_ENTRY:
492
596
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:
493
602
{
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 );
520
604
break ;
521
605
}
522
606
@@ -578,119 +662,6 @@ void CrmOrch::getResAvailableCounters()
578
662
break ;
579
663
}
580
664
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
-
694
665
default :
695
666
SWSS_LOG_ERROR (" Failed to get CRM resource type %u. Unknown resource type.\n " , static_cast <uint32_t >(res.first ));
696
667
return ;
0 commit comments