Skip to content

Commit 2338dc0

Browse files
authored
[vslib]: Add MACsec state to state base (sonic-net#722)
Signed-off-by: Ze Gan <ganze718@gmail.com>
1 parent 1321175 commit 2338dc0

5 files changed

+182
-64
lines changed

vslib/inc/SwitchStateBase.h

+94
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "SwitchConfig.h"
88
#include "RealObjectIdManager.h"
99
#include "EventPayloadNetLinkMsg.h"
10+
#include "MACsecManager.h"
1011

1112
#include <set>
1213
#include <unordered_set>
@@ -137,6 +138,9 @@ namespace saivs
137138
virtual sai_status_t refresh_system_port_list(
138139
_In_ const sai_attr_metadata_t *meta);
139140

141+
virtual sai_status_t refresh_macsec_sci_in_ingress_macsec_acl(
142+
_In_ sai_object_id_t object_id);
143+
140144
public:
141145

142146
virtual sai_status_t warm_boot_initialize_objects();
@@ -451,6 +455,96 @@ namespace saivs
451455
_In_ const sai_object_id_t object_id,
452456
_Out_ std::vector<sai_attribute_t> &attrs);
453457

458+
protected:
459+
460+
sai_status_t setAclEntry(
461+
_In_ sai_object_id_t entry_id,
462+
_In_ const sai_attribute_t* attr);
463+
464+
sai_status_t setAclEntryMACsecFlowActive(
465+
_In_ sai_object_id_t entry_id,
466+
_In_ const sai_attribute_t* attr);
467+
468+
sai_status_t createMACsecPort(
469+
_In_ sai_object_id_t macsec_sa_id,
470+
_In_ sai_object_id_t switch_id,
471+
_In_ uint32_t attr_count,
472+
_In_ const sai_attribute_t *attr_list);
473+
474+
sai_status_t createMACsecSA(
475+
_In_ sai_object_id_t macsec_sa_id,
476+
_In_ sai_object_id_t switch_id,
477+
_In_ uint32_t attr_count,
478+
_In_ const sai_attribute_t *attr_list);
479+
480+
sai_status_t createMACsecSC(
481+
_In_ sai_object_id_t macsec_sa_id,
482+
_In_ sai_object_id_t switch_id,
483+
_In_ uint32_t attr_count,
484+
_In_ const sai_attribute_t *attr_list);
485+
486+
sai_status_t removeMACsecPort(
487+
_In_ sai_object_id_t macsec_port_id);
488+
489+
sai_status_t removeMACsecSC(
490+
_In_ sai_object_id_t macsec_sc_id);
491+
492+
sai_status_t removeMACsecSA(
493+
_In_ sai_object_id_t macsec_sa_id);
494+
495+
sai_status_t getACLTable(
496+
_In_ sai_object_id_t entry_id,
497+
_Out_ sai_object_id_t &table_id);
498+
499+
sai_status_t findPortByMACsecFlow(
500+
_In_ sai_object_id_t macsec_flow_id,
501+
_Out_ sai_object_id_t &line_port_id);
502+
503+
std::shared_ptr<HostInterfaceInfo> findHostInterfaceInfoByPort(
504+
_In_ sai_object_id_t line_port_id);
505+
506+
sai_status_t loadMACsecAttrFromMACsecPort(
507+
_In_ sai_object_id_t object_id,
508+
_In_ uint32_t attr_count,
509+
_In_ const sai_attribute_t *attr_list,
510+
_Out_ MACsecAttr &macsec_attr);
511+
512+
sai_status_t loadMACsecAttrFromMACsecSC(
513+
_In_ sai_object_id_t object_id,
514+
_In_ uint32_t attr_count,
515+
_In_ const sai_attribute_t *attr_list,
516+
_Out_ MACsecAttr &macsec_attr);
517+
518+
sai_status_t loadMACsecAttrFromMACsecSA(
519+
_In_ sai_object_id_t object_id,
520+
_In_ uint32_t attr_count,
521+
_In_ const sai_attribute_t *attr_list,
522+
_Out_ MACsecAttr &macsec_attr);
523+
524+
sai_status_t loadMACsecAttr(
525+
_In_ sai_object_type_t object_type,
526+
_In_ sai_object_id_t object_id,
527+
_In_ uint32_t attr_count,
528+
_In_ const sai_attribute_t *attr_list,
529+
_Out_ MACsecAttr &macsec_attr);
530+
531+
sai_status_t loadMACsecAttr(
532+
_In_ sai_object_type_t object_type,
533+
_In_ sai_object_id_t object_id,
534+
_Out_ MACsecAttr &macsec_attr);
535+
536+
sai_status_t loadMACsecAttrsFromACLEntry(
537+
_In_ sai_object_id_t entry_id,
538+
_In_ const sai_attribute_t* entry_attr,
539+
_In_ sai_object_type_t object_type,
540+
_Out_ std::vector<MACsecAttr> &macsec_attrs);
541+
542+
sai_status_t getMACsecSAPacketNumber(
543+
_In_ sai_object_id_t macsec_sa_id,
544+
_Out_ sai_attribute_t &attr);
545+
546+
MACsecManager m_macsecManager;
547+
454548
protected:
455549

456550
constexpr static const int maxDebugCounters = 32;

vslib/src/MACsecManager.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
using namespace saivs;
1414

15-
#define MAX_MACSEC_SA_NUMBER 3
15+
static constexpr macsec_an_t MAX_MACSEC_SA_NUMBER = 3;
1616

1717
MACsecManager::MACsecManager()
1818
{
@@ -818,7 +818,7 @@ size_t MACsecManager::get_macsec_sa_count(
818818

819819
size_t sa_count = 0;
820820

821-
for (macsec_an_t an = 0; an <= MAX_MACSEC_SA_NUMBER; an++)
821+
for (macsec_an_t an = 0; an <= MAX_MACSEC_SA_NUMBER; an++) // lgtm [cpp/constant-comparison]
822822
{
823823
if (is_macsec_sa_existing(macsecDevice, direction, sci, an))
824824
{

vslib/src/Makefile.am

+4-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ libSaiVS_a_SOURCES = \
5959
MACsecIngressFilter.cpp \
6060
TrafficForwarder.cpp \
6161
MACsecForwarder.cpp \
62-
TrafficFilterPipes.cpp
62+
TrafficFilterPipes.cpp \
63+
SwitchStateBaseMACsec.cpp \
64+
MACsecAttr.cpp \
65+
MACsecManager.cpp
6366

6467
libsaivs_la_SOURCES = \
6568
sai_vs_fdb.cpp \

vslib/src/SwitchStateBase.cpp

+81
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ sai_status_t SwitchStateBase::create(
154154
return createHostif(object_id, switch_id, attr_count, attr_list);
155155
}
156156

157+
if (object_type == SAI_OBJECT_TYPE_MACSEC_SC)
158+
{
159+
sai_object_id_t object_id;
160+
sai_deserialize_object_id(serializedObjectId, object_id);
161+
return createMACsecSC(object_id, switch_id, attr_count, attr_list);
162+
}
163+
164+
if (object_type == SAI_OBJECT_TYPE_MACSEC_SA)
165+
{
166+
sai_object_id_t object_id;
167+
sai_deserialize_object_id(serializedObjectId, object_id);
168+
return createMACsecSA(object_id, switch_id, attr_count, attr_list);
169+
}
170+
157171
return create_internal(object_type, serializedObjectId, switch_id, attr_count, attr_list);
158172
}
159173

@@ -348,6 +362,25 @@ sai_status_t SwitchStateBase::remove(
348362
return removeHostif(objectId);
349363
}
350364

365+
if (object_type == SAI_OBJECT_TYPE_MACSEC_PORT)
366+
{
367+
sai_object_id_t objectId;
368+
sai_deserialize_object_id(serializedObjectId, objectId);
369+
return removeMACsecPort(objectId);
370+
}
371+
else if (object_type == SAI_OBJECT_TYPE_MACSEC_SC)
372+
{
373+
sai_object_id_t objectId;
374+
sai_deserialize_object_id(serializedObjectId, objectId);
375+
return removeMACsecSC(objectId);
376+
}
377+
else if (object_type == SAI_OBJECT_TYPE_MACSEC_SA)
378+
{
379+
sai_object_id_t objectId;
380+
sai_deserialize_object_id(serializedObjectId, objectId);
381+
return removeMACsecSA(objectId);
382+
}
383+
351384
return remove_internal(object_type, serializedObjectId);
352385
}
353386

@@ -433,6 +466,22 @@ sai_status_t SwitchStateBase::setPort(
433466
return set_internal(SAI_OBJECT_TYPE_PORT, sid, attr);
434467
}
435468

469+
sai_status_t SwitchStateBase::setAclEntry(
470+
_In_ sai_object_id_t entry_id,
471+
_In_ const sai_attribute_t* attr)
472+
{
473+
SWSS_LOG_ENTER();
474+
475+
if (attr && attr->id == SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW)
476+
{
477+
return setAclEntryMACsecFlowActive(entry_id, attr);
478+
}
479+
480+
auto sid = sai_serialize_object_id(entry_id);
481+
482+
return set_internal(SAI_OBJECT_TYPE_ACL_ENTRY, sid, attr);
483+
}
484+
436485
sai_status_t SwitchStateBase::set(
437486
_In_ sai_object_type_t objectType,
438487
_In_ const std::string &serializedObjectId,
@@ -447,6 +496,13 @@ sai_status_t SwitchStateBase::set(
447496
return setPort(objectId, attr);
448497
}
449498

499+
if (objectType == SAI_OBJECT_TYPE_ACL_ENTRY)
500+
{
501+
sai_object_id_t objectId;
502+
sai_deserialize_object_id(serializedObjectId, objectId);
503+
return setAclEntry(objectId, attr);
504+
}
505+
450506
return set_internal(objectType, serializedObjectId, attr);
451507
}
452508

@@ -1741,6 +1797,26 @@ sai_status_t SwitchStateBase::refresh_port_list(
17411797
return SAI_STATUS_SUCCESS;
17421798
}
17431799

1800+
sai_status_t SwitchStateBase::refresh_macsec_sci_in_ingress_macsec_acl(
1801+
_In_ sai_object_id_t object_id)
1802+
{
1803+
SWSS_LOG_ENTER();
1804+
1805+
/*
1806+
* SAI_MACSEC_ATTR_SCI_IN_INGRESS_MACSEC_ACL indicates the MACsec ASIC capability
1807+
* of whether SCI can only be used as ACL field.
1808+
* To set SAI_MACSEC_ATTR_SCI_IN_INGRESS_MACSEC_ACL is always true,
1809+
* which indicates that here is emulating a kind of MACsec ASIC that use SCI as ACL field.
1810+
*/
1811+
sai_attribute_t attr;
1812+
attr.id = SAI_MACSEC_ATTR_SCI_IN_INGRESS_MACSEC_ACL;
1813+
attr.value.booldata = true;
1814+
1815+
CHECK_STATUS(set(SAI_OBJECT_TYPE_MACSEC, object_id, &attr));
1816+
1817+
return SAI_STATUS_SUCCESS;
1818+
}
1819+
17441820
// XXX extra work may be needed on GET api if N on list will be > then actual
17451821

17461822
/*
@@ -1877,6 +1953,11 @@ sai_status_t SwitchStateBase::refresh_read_only(
18771953
return SAI_STATUS_SUCCESS;
18781954
}
18791955

1956+
if (meta->objecttype == SAI_OBJECT_TYPE_MACSEC && meta->attrid == SAI_MACSEC_ATTR_SCI_IN_INGRESS_MACSEC_ACL)
1957+
{
1958+
return refresh_macsec_sci_in_ingress_macsec_acl(object_id);
1959+
}
1960+
18801961
auto mmeta = m_meta.lock();
18811962

18821963
if (mmeta)

vslib/src/SwitchStateBaseMACsec.cpp

+1-61
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ sai_status_t SwitchStateBase::loadMACsecAttr(
601601
return loadMACsecAttrFromMACsecSA(objectId, attrCount, attrList, macsecAttr);
602602

603603
default:
604-
SWSS_LOG_ERROR("Wrong type %s", sai_serialize_object_type(objectType));
604+
SWSS_LOG_ERROR("Wrong type %s", sai_serialize_object_type(objectType).c_str());
605605

606606
break;
607607
}
@@ -748,66 +748,6 @@ sai_status_t SwitchStateBase::loadMACsecAttrsFromACLEntry(
748748
return SAI_STATUS_NOT_IMPLEMENTED;
749749
}
750750

751-
sai_status_t SwitchStateBase::getMACsecAttr(
752-
_In_ const std::string &serializedObjectId,
753-
_In_ uint32_t attrCount,
754-
_Out_ sai_attribute_t *attrList)
755-
{
756-
SWSS_LOG_ENTER();
757-
758-
for (uint32_t i = 0; i < attrCount; i++)
759-
{
760-
if (attrList[i].id == SAI_MACSEC_ATTR_SCI_IN_INGRESS_MACSEC_ACL)
761-
{
762-
attrList[i].value.booldata = true;
763-
}
764-
else
765-
{
766-
auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_MACSEC, attrList[i].id);
767-
768-
SWSS_LOG_WARN("Cannot get attribute %s", meta->attridname);
769-
770-
return SAI_STATUS_NOT_IMPLEMENTED;
771-
}
772-
}
773-
774-
return SAI_STATUS_SUCCESS;
775-
}
776-
777-
sai_status_t SwitchStateBase::getMACsecSAAttr(
778-
_In_ const std::string &serializedObjectId,
779-
_In_ uint32_t attrCount,
780-
_Out_ sai_attribute_t *attrList)
781-
{
782-
SWSS_LOG_ENTER();
783-
784-
CHECK_STATUS(get_internal(SAI_OBJECT_TYPE_MACSEC_SA, serializedObjectId, attrCount, attrList));
785-
786-
sai_status_t ret = SAI_STATUS_SUCCESS;
787-
sai_object_id_t macsec_id = SAI_NULL_OBJECT_ID;
788-
789-
sai_deserialize_object_id(serializedObjectId, macsec_id);
790-
791-
for (uint32_t i = 0; i < attrCount; i++)
792-
{
793-
if (attrList[i].id == SAI_MACSEC_SA_ATTR_XPN)
794-
{
795-
ret = getMACsecSAPacketNumber(macsec_id, attrList[i]);
796-
}
797-
else if (attrList[i].id == SAI_MACSEC_SA_ATTR_MINIMUM_XPN)
798-
{
799-
ret = getMACsecSAPacketNumber(macsec_id, attrList[i]);
800-
}
801-
802-
if (ret != SAI_STATUS_SUCCESS)
803-
{
804-
return ret;
805-
}
806-
}
807-
808-
return SAI_STATUS_SUCCESS;
809-
}
810-
811751
sai_status_t SwitchStateBase::getMACsecSAPacketNumber(
812752
_In_ sai_object_id_t macsecSaId,
813753
_Out_ sai_attribute_t &attr)

0 commit comments

Comments
 (0)