Skip to content

Commit a6d60f2

Browse files
wendanilguohan
authored andcommitted
Create egress ACL table group during the PFCWD stats list installment (#787)
* Create egress table group during the PFCWD stats list installment Signed-off-by: Wenda <wenni@microsoft.com> * Introduce function bindAclTableGroup() to create and bind ACL table group to a port, which can be physical, vlan, or lag Signed-off-by: Wenda <wenni@microsoft.com> * Rename function to createBindAclTableGroup() Signed-off-by: Wenda Ni <wenni@microsoft.com> * Check the validity of ACL table oid Signed-off-by: Wenda Ni <wenni@microsoft.com>
1 parent 52de963 commit a6d60f2

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

orchagent/pfcwdorch.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,10 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
525525
PfcWdOrch<DropHandler, ForwardHandler>::getCountersTable(),
526526
sai_serialize_object_id(queueId));
527527
}
528+
529+
// Create egress ACL table group for each port of pfcwd's interest
530+
sai_object_id_t groupId;
531+
gPortsOrch->createBindAclTableGroup(port.m_port_id, groupId, ACL_STAGE_EGRESS);
528532
}
529533

530534
template <typename DropHandler, typename ForwardHandler>

orchagent/portsorch.cpp

+42-21
Original file line numberDiff line numberDiff line change
@@ -706,35 +706,33 @@ bool PortsOrch::setPortPfcAsym(Port &port, string pfc_asym)
706706
return true;
707707
}
708708

709-
bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_object_id_t &group_member_oid, acl_stage_type_t acl_stage)
709+
bool PortsOrch::createBindAclTableGroup(sai_object_id_t id, sai_object_id_t &group_oid, acl_stage_type_t acl_stage)
710710
{
711711
SWSS_LOG_ENTER();
712712

713713
if (acl_stage == ACL_STAGE_UNKNOWN)
714714
{
715-
SWSS_LOG_ERROR("Unknown ACL stage for ACL table %lx", table_oid);
715+
SWSS_LOG_ERROR("unknown ACL stage for table group creation");
716716
return false;
717717
}
718718

719-
sai_status_t status;
720-
sai_object_id_t groupOid;
721-
722719
Port port;
723720
if (!getPort(id, port))
724721
{
725722
SWSS_LOG_ERROR("Failed to get port by port ID %lx", id);
726723
return false;
727724
}
728725

729-
if (acl_stage == ACL_STAGE_INGRESS && port.m_ingress_acl_table_group_id != 0)
726+
sai_status_t status;
727+
if ((acl_stage == ACL_STAGE_INGRESS) && (port.m_ingress_acl_table_group_id != 0))
730728
{
731-
groupOid = port.m_ingress_acl_table_group_id;
729+
group_oid = port.m_ingress_acl_table_group_id;
732730
}
733-
else if (acl_stage == ACL_STAGE_EGRESS && port.m_egress_acl_table_group_id != 0)
731+
else if ((acl_stage == ACL_STAGE_EGRESS) && (port.m_egress_acl_table_group_id != 0))
734732
{
735-
groupOid = port.m_egress_acl_table_group_id;
733+
group_oid = port.m_egress_acl_table_group_id;
736734
}
737-
// If port ACL table group does not exist, create one
735+
// Port ACL table group does not exist, create one
738736
else if (acl_stage == ACL_STAGE_INGRESS or acl_stage == ACL_STAGE_EGRESS)
739737
{
740738
bool ingress = acl_stage == ACL_STAGE_INGRESS ? true : false;
@@ -775,7 +773,7 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
775773
group_attr.value.s32 = SAI_ACL_TABLE_GROUP_TYPE_PARALLEL;
776774
group_attrs.push_back(group_attr);
777775

778-
status = sai_acl_api->create_acl_table_group(&groupOid, gSwitchId, (uint32_t)group_attrs.size(), group_attrs.data());
776+
status = sai_acl_api->create_acl_table_group(&group_oid, gSwitchId, (uint32_t)group_attrs.size(), group_attrs.data());
779777
if (status != SAI_STATUS_SUCCESS)
780778
{
781779
SWSS_LOG_ERROR("Failed to create ACL table group, rv:%d", status);
@@ -784,11 +782,11 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
784782

785783
if (ingress)
786784
{
787-
port.m_ingress_acl_table_group_id = groupOid;
785+
port.m_ingress_acl_table_group_id = group_oid;
788786
}
789787
else
790788
{
791-
port.m_egress_acl_table_group_id = groupOid;
789+
port.m_egress_acl_table_group_id = group_oid;
792790
}
793791

794792
setPort(port.m_alias, port);
@@ -802,13 +800,13 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
802800
// Bind this ACL group to physical port
803801
sai_attribute_t port_attr;
804802
port_attr.id = ingress ? SAI_PORT_ATTR_INGRESS_ACL : SAI_PORT_ATTR_EGRESS_ACL;
805-
port_attr.value.oid = groupOid;
803+
port_attr.value.oid = group_oid;
806804

807805
status = sai_port_api->set_port_attribute(port.m_port_id, &port_attr);
808806
if (status != SAI_STATUS_SUCCESS)
809807
{
810808
SWSS_LOG_ERROR("Failed to bind port %s to ACL table group %lx, rv:%d",
811-
port.m_alias.c_str(), groupOid, status);
809+
port.m_alias.c_str(), group_oid, status);
812810
return status;
813811
}
814812
break;
@@ -818,13 +816,13 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
818816
// Bind this ACL group to LAG
819817
sai_attribute_t lag_attr;
820818
lag_attr.id = ingress ? SAI_LAG_ATTR_INGRESS_ACL : SAI_LAG_ATTR_EGRESS_ACL;
821-
lag_attr.value.oid = groupOid;
819+
lag_attr.value.oid = group_oid;
822820

823821
status = sai_lag_api->set_lag_attribute(port.m_lag_id, &lag_attr);
824822
if (status != SAI_STATUS_SUCCESS)
825823
{
826824
SWSS_LOG_ERROR("Failed to bind LAG %s to ACL table group %lx, rv:%d",
827-
port.m_alias.c_str(), groupOid, status);
825+
port.m_alias.c_str(), group_oid, status);
828826
return status;
829827
}
830828
break;
@@ -834,13 +832,13 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
834832
// Bind this ACL group to VLAN
835833
sai_attribute_t vlan_attr;
836834
vlan_attr.id = ingress ? SAI_VLAN_ATTR_INGRESS_ACL : SAI_VLAN_ATTR_EGRESS_ACL;
837-
vlan_attr.value.oid = groupOid;
835+
vlan_attr.value.oid = group_oid;
838836

839837
status = sai_vlan_api->set_vlan_attribute(port.m_vlan_info.vlan_oid, &vlan_attr);
840838
if (status != SAI_STATUS_SUCCESS)
841839
{
842840
SWSS_LOG_ERROR("Failed to bind VLAN %s to ACL table group %lx, rv:%d",
843-
port.m_alias.c_str(), groupOid, status);
841+
port.m_alias.c_str(), group_oid, status);
844842
return status;
845843
}
846844
break;
@@ -855,6 +853,29 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
855853
SWSS_LOG_NOTICE("Create ACL table group and bind port %s to it", port.m_alias.c_str());
856854
}
857855

856+
return true;
857+
}
858+
859+
bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_object_id_t &group_member_oid, acl_stage_type_t acl_stage)
860+
{
861+
SWSS_LOG_ENTER();
862+
863+
if (table_oid == SAI_NULL_OBJECT_ID)
864+
{
865+
SWSS_LOG_ERROR("Invalid ACL table %lx", table_oid);
866+
return false;
867+
}
868+
869+
sai_status_t status;
870+
sai_object_id_t groupOid;
871+
872+
// Create an ACL table group and bind to port
873+
if (!createBindAclTableGroup(id, groupOid, acl_stage))
874+
{
875+
SWSS_LOG_ERROR("Fail to create or bind to port %lx ACL table group", id);
876+
return false;
877+
}
878+
858879
// Create an ACL group member with table_oid and groupOid
859880
vector<sai_attribute_t> member_attrs;
860881

@@ -874,8 +895,8 @@ bool PortsOrch::bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_
874895
status = sai_acl_api->create_acl_table_group_member(&group_member_oid, gSwitchId, (uint32_t)member_attrs.size(), member_attrs.data());
875896
if (status != SAI_STATUS_SUCCESS)
876897
{
877-
SWSS_LOG_ERROR("Failed to create member in ACL table group %lx for ACL table group %lx, rv:%d",
878-
table_oid, groupOid, status);
898+
SWSS_LOG_ERROR("Failed to create member in ACL table group %lx for ACL table %lx, rv:%d",
899+
groupOid, table_oid, status);
879900
return false;
880901
}
881902

orchagent/portsorch.h

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class PortsOrch : public Orch, public Subject
7373

7474
bool setHostIntfsOperStatus(const Port& port, bool up) const;
7575
void updateDbPortOperStatus(const Port& port, sai_port_oper_status_t status) const;
76+
bool createBindAclTableGroup(sai_object_id_t id, sai_object_id_t &group_oid, acl_stage_type_t acl_stage = ACL_STAGE_EGRESS);
7677
bool bindAclTable(sai_object_id_t id, sai_object_id_t table_oid, sai_object_id_t &group_member_oid, acl_stage_type_t acl_stage = ACL_STAGE_INGRESS);
7778

7879
bool getPortPfc(sai_object_id_t portId, uint8_t *pfc_bitmask);

0 commit comments

Comments
 (0)