Skip to content

Commit 02a57a6

Browse files
authored
[vs] Add CRM SAI attributes to virtual switch interface (sonic-net#673)
Signed-off-by: Danny Allen <[email protected]>
1 parent 609445a commit 02a57a6

File tree

2 files changed

+111
-15
lines changed

2 files changed

+111
-15
lines changed

vslib/inc/SwitchStateBase.h

+29
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ namespace saivs
8282

8383
virtual sai_status_t set_number_of_ecmp_groups();
8484

85+
virtual sai_status_t set_static_crm_values();
86+
87+
virtual sai_status_t set_static_acl_resource_list(
88+
_In_ sai_switch_attr_t acl_resource,
89+
_In_ int max_count);
90+
8591
public:
8692

8793
virtual sai_status_t initialize_default_objects();
@@ -409,6 +415,29 @@ namespace saivs
409415
sai_object_id_t m_default_bridge_port_1q_router;
410416
sai_object_id_t m_default_vlan_id;
411417

418+
protected:
419+
420+
constexpr static const int m_maxIPv4RouteEntries = 100000;
421+
constexpr static const int m_maxIPv6RouteEntries = 10000;
422+
423+
constexpr static const int m_maxIPv4NextHopEntries = 32000;
424+
constexpr static const int m_maxIPv6NextHopEntries = 32000;
425+
426+
constexpr static const int m_maxIPv4NeighborEntries = 4000;
427+
constexpr static const int m_maxIPv6NeighborEntries = 2000;
428+
429+
constexpr static const int m_maxNextHopGroupMemberEntries = 16000;
430+
constexpr static const int m_maxNextHopGroupEntries = 400;
431+
432+
constexpr static const int m_maxFdbEntries = 800;
433+
434+
constexpr static const int m_maxSNATEntries = 100;
435+
constexpr static const int m_maxDNATEntries = 100;
436+
constexpr static const int m_maxDoubleNATEntries = 50; /* Half of single NAT entry */
437+
438+
constexpr static const int m_maxAclTables = 3;
439+
constexpr static const int m_maxAclTableGroups = 200;
440+
412441
public: // TODO private
413442

414443
std::set<FdbInfo> m_fdb_info_set;

vslib/src/SwitchStateBase.cpp

+82-15
Original file line numberDiff line numberDiff line change
@@ -701,21 +701,6 @@ sai_status_t SwitchStateBase::set_switch_default_attributes()
701701

702702
sai_attribute_t attr;
703703

704-
attr.id = SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY;
705-
attr.value.u32 = 100;
706-
707-
CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr));
708-
709-
attr.id = SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY;
710-
attr.value.u32 = 100;
711-
712-
CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr));
713-
714-
attr.id = SAI_SWITCH_ATTR_AVAILABLE_DOUBLE_NAT_ENTRY;
715-
attr.value.u32 = 50; /* Half of single NAT entry */
716-
717-
CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr));
718-
719704
attr.id = SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY;
720705
attr.value.ptr = NULL;
721706

@@ -746,6 +731,76 @@ sai_status_t SwitchStateBase::set_switch_default_attributes()
746731
return set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr);
747732
}
748733

734+
sai_status_t SwitchStateBase::set_static_crm_values()
735+
{
736+
SWSS_LOG_ENTER();
737+
738+
std::map<sai_switch_attr_t, int> crm_resource_lookup = {
739+
{ SAI_SWITCH_ATTR_AVAILABLE_IPV4_ROUTE_ENTRY, m_maxIPv4RouteEntries },
740+
{ SAI_SWITCH_ATTR_AVAILABLE_IPV6_ROUTE_ENTRY, m_maxIPv6RouteEntries },
741+
{ SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEXTHOP_ENTRY, m_maxIPv4NextHopEntries },
742+
{ SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEXTHOP_ENTRY, m_maxIPv6NextHopEntries },
743+
{ SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEIGHBOR_ENTRY, m_maxIPv4NeighborEntries },
744+
{ SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEIGHBOR_ENTRY, m_maxIPv6NeighborEntries },
745+
{ SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_MEMBER_ENTRY, m_maxNextHopGroupMemberEntries },
746+
{ SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_ENTRY, m_maxNextHopGroupEntries },
747+
{ SAI_SWITCH_ATTR_AVAILABLE_FDB_ENTRY, m_maxFdbEntries },
748+
{ SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY, m_maxSNATEntries },
749+
{ SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY, m_maxDNATEntries },
750+
{ SAI_SWITCH_ATTR_AVAILABLE_DOUBLE_NAT_ENTRY, m_maxDoubleNATEntries }
751+
};
752+
753+
for (auto const &resource: crm_resource_lookup)
754+
{
755+
sai_attribute_t attr;
756+
attr.id = resource.first;
757+
attr.value.u32 = resource.second;
758+
CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr));
759+
}
760+
761+
CHECK_STATUS(set_static_acl_resource_list(SAI_SWITCH_ATTR_AVAILABLE_ACL_TABLE, m_maxAclTables));
762+
763+
return set_static_acl_resource_list(SAI_SWITCH_ATTR_AVAILABLE_ACL_TABLE_GROUP, m_maxAclTableGroups);
764+
}
765+
766+
sai_status_t SwitchStateBase::set_static_acl_resource_list(
767+
_In_ sai_switch_attr_t acl_resource,
768+
_In_ int max_count)
769+
{
770+
auto acl_stages = {SAI_ACL_STAGE_INGRESS, SAI_ACL_STAGE_EGRESS};
771+
auto acl_bind_points = {
772+
SAI_ACL_BIND_POINT_TYPE_PORT,
773+
SAI_ACL_BIND_POINT_TYPE_LAG,
774+
SAI_ACL_BIND_POINT_TYPE_VLAN,
775+
SAI_ACL_BIND_POINT_TYPE_ROUTER_INTERFACE,
776+
SAI_ACL_BIND_POINT_TYPE_SWITCH
777+
};
778+
779+
std::vector<sai_acl_resource_t> acl_resource_list;
780+
for (auto stage: acl_stages)
781+
{
782+
for (auto bp: acl_bind_points)
783+
{
784+
sai_acl_resource_t acl_resource_count;
785+
acl_resource_count.stage = stage;
786+
acl_resource_count.bind_point = bp;
787+
acl_resource_count.avail_num = max_count;
788+
789+
acl_resource_list.push_back(acl_resource_count);
790+
}
791+
}
792+
793+
sai_acl_resource_list_t available_acl_resources;
794+
available_acl_resources.count = static_cast<uint32_t>(acl_resource_list.size());
795+
available_acl_resources.list = acl_resource_list.data();
796+
797+
sai_attribute_t attr;
798+
attr.id = acl_resource;
799+
attr.value.aclresource = available_acl_resources;
800+
801+
return set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr);
802+
}
803+
749804
sai_status_t SwitchStateBase::create_default_vlan()
750805
{
751806
SWSS_LOG_ENTER();
@@ -1261,6 +1316,7 @@ sai_status_t SwitchStateBase::initialize_default_objects()
12611316
CHECK_STATUS(set_number_of_ecmp_groups());
12621317
CHECK_STATUS(set_switch_default_attributes());
12631318
CHECK_STATUS(create_scheduler_groups());
1319+
CHECK_STATUS(set_static_crm_values());
12641320

12651321
return SAI_STATUS_SUCCESS;
12661322
}
@@ -1576,6 +1632,17 @@ sai_status_t SwitchStateBase::refresh_read_only(
15761632
case SAI_SWITCH_ATTR_QOS_MAX_NUMBER_OF_CHILDS_PER_SCHEDULER_GROUP:
15771633
return SAI_STATUS_SUCCESS;
15781634

1635+
case SAI_SWITCH_ATTR_AVAILABLE_IPV4_ROUTE_ENTRY:
1636+
case SAI_SWITCH_ATTR_AVAILABLE_IPV6_ROUTE_ENTRY:
1637+
case SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEXTHOP_ENTRY:
1638+
case SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEXTHOP_ENTRY:
1639+
case SAI_SWITCH_ATTR_AVAILABLE_IPV4_NEIGHBOR_ENTRY:
1640+
case SAI_SWITCH_ATTR_AVAILABLE_IPV6_NEIGHBOR_ENTRY:
1641+
case SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_MEMBER_ENTRY:
1642+
case SAI_SWITCH_ATTR_AVAILABLE_NEXT_HOP_GROUP_ENTRY:
1643+
case SAI_SWITCH_ATTR_AVAILABLE_FDB_ENTRY:
1644+
case SAI_SWITCH_ATTR_AVAILABLE_ACL_TABLE:
1645+
case SAI_SWITCH_ATTR_AVAILABLE_ACL_TABLE_GROUP:
15791646
case SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY:
15801647
case SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY:
15811648
case SAI_SWITCH_ATTR_AVAILABLE_DOUBLE_NAT_ENTRY:

0 commit comments

Comments
 (0)