Skip to content

Commit 3304daa

Browse files
PterosaurUbuntu
and
Ubuntu
authored
[vslib]: Add MACsec xpn support (sonic-net#924)
* Add macsec xpn support Signed-off-by: Ze Gan <[email protected]> * Add unit test for loadMACsecAttrFromMACsecSC Signed-off-by: Ze Gan <[email protected]> * Add SWSS_LOG_ENTER Signed-off-by: Ze Gan <[email protected]> * Fix bug and refactor code Signed-off-by: Ubuntu <zegan@zegan-test-hk.0y0yh0pwahvetntlrcfftojvof.hx.internal.cloudapp.net> Co-authored-by: Ubuntu <zegan@zegan-test-hk.0y0yh0pwahvetntlrcfftojvof.hx.internal.cloudapp.net>
1 parent a3143da commit 3304daa

File tree

6 files changed

+133
-1
lines changed

6 files changed

+133
-1
lines changed

unittest/vslib/Makefile.am

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ tests_SOURCES = main.cpp \
4242
TestSwitchBCM56850.cpp \
4343
TestSwitchBCM81724.cpp
4444

45-
tests_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON)
45+
tests_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) -fno-access-control
4646
tests_LDADD = $(LDADD_GTEST) $(top_srcdir)/vslib/libSaiVS.a -lhiredis -lswsscommon -lnl-genl-3 -lnl-nf-3 -lnl-route-3 -lnl-3 \
4747
-lpthread -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq $(CODE_COVERAGE_LIBS)
4848

unittest/vslib/TestMACsecAttr.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,36 @@ TEST(MACsecAttr, dtr)
1313
{
1414
MACsecAttr sec;
1515
}
16+
17+
TEST(MACsecAttr, get_cipher_name)
18+
{
19+
EXPECT_EQ(MACsecAttr::get_cipher_name(sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_128), MACsecAttr::CIPHER_NAME_GCM_AES_128);
20+
21+
EXPECT_EQ(MACsecAttr::get_cipher_name(sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_256), MACsecAttr::CIPHER_NAME_GCM_AES_256);
22+
23+
EXPECT_EQ(MACsecAttr::get_cipher_name(sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_XPN_128), MACsecAttr::CIPHER_NAME_GCM_AES_XPN_128);
24+
25+
EXPECT_EQ(MACsecAttr::get_cipher_name(sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_XPN_256), MACsecAttr::CIPHER_NAME_GCM_AES_XPN_256);
26+
27+
EXPECT_EQ(MACsecAttr::get_cipher_name(100), MACsecAttr::CIPHER_NAME_INVALID);
28+
}
29+
30+
TEST(MACsecAttr, is_xpn)
31+
{
32+
MACsecAttr attr;
33+
attr.m_cipher = MACsecAttr::CIPHER_NAME_GCM_AES_128;
34+
35+
EXPECT_FALSE(attr.is_xpn());
36+
37+
attr.m_cipher = MACsecAttr::CIPHER_NAME_GCM_AES_256;
38+
39+
EXPECT_FALSE(attr.is_xpn());
40+
41+
attr.m_cipher = MACsecAttr::CIPHER_NAME_GCM_AES_XPN_128;
42+
43+
EXPECT_TRUE(attr.is_xpn());
44+
45+
attr.m_cipher = MACsecAttr::CIPHER_NAME_GCM_AES_XPN_256;
46+
47+
EXPECT_TRUE(attr.is_xpn());
48+
}

vslib/MACsecAttr.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
#include "MACsecAttr.h"
22

3+
#include "saimacsec.h"
34
#include "swss/logger.h"
45

56
using namespace saivs;
67

8+
const std::string MACsecAttr::CIPHER_NAME_INVALID = "";
9+
10+
const std::string MACsecAttr::CIPHER_NAME_GCM_AES_128 = "GCM-AES-128";
11+
12+
const std::string MACsecAttr::CIPHER_NAME_GCM_AES_256 = "GCM-AES-256";
13+
14+
const std::string MACsecAttr::CIPHER_NAME_GCM_AES_XPN_128 = "GCM-AES-XPN-128";
15+
16+
const std::string MACsecAttr::CIPHER_NAME_GCM_AES_XPN_256 = "GCM-AES-XPN-256";
17+
18+
const std::string MACsecAttr::DEFAULT_CIPHER_NAME = MACsecAttr::CIPHER_NAME_GCM_AES_128;
19+
720
MACsecAttr::MACsecAttr()
821
{
922
SWSS_LOG_ENTER();
@@ -17,3 +30,35 @@ MACsecAttr::~MACsecAttr()
1730

1831
// empty intentionally
1932
}
33+
34+
const std::string & MACsecAttr::get_cipher_name(std::int32_t cipher_id)
35+
{
36+
SWSS_LOG_ENTER();
37+
38+
switch(cipher_id)
39+
{
40+
case sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_128:
41+
return CIPHER_NAME_GCM_AES_128;
42+
43+
case sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_256:
44+
return CIPHER_NAME_GCM_AES_256;
45+
46+
case sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_XPN_128:
47+
return CIPHER_NAME_GCM_AES_XPN_128;
48+
49+
case sai_macsec_cipher_suite_t::SAI_MACSEC_CIPHER_SUITE_GCM_AES_XPN_256:
50+
return CIPHER_NAME_GCM_AES_XPN_256;
51+
52+
default:
53+
SWSS_LOG_ERROR("Unkown MACsec cipher %d", cipher_id);
54+
55+
return CIPHER_NAME_INVALID;
56+
}
57+
}
58+
59+
bool MACsecAttr::is_xpn() const
60+
{
61+
SWSS_LOG_ENTER();
62+
63+
return m_cipher == CIPHER_NAME_GCM_AES_XPN_128 || m_cipher == CIPHER_NAME_GCM_AES_XPN_256;
64+
}

vslib/MACsecAttr.h

+21
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,44 @@ namespace saivs
1010
using macsec_sci_t = std::string;
1111
using macsec_an_t = std::uint16_t;
1212
using macsec_pn_t = std::uint64_t;
13+
using macsec_ssci_t = std::uint32_t;
1314

1415
struct MACsecAttr
1516
{
17+
18+
static const std::string CIPHER_NAME_INVALID;
19+
20+
static const std::string CIPHER_NAME_GCM_AES_128;
21+
22+
static const std::string CIPHER_NAME_GCM_AES_256;
23+
24+
static const std::string CIPHER_NAME_GCM_AES_XPN_128;
25+
26+
static const std::string CIPHER_NAME_GCM_AES_XPN_256;
27+
28+
static const std::string DEFAULT_CIPHER_NAME;
29+
1630
// Explicitly declare constructor and destructor as non-inline functions
1731
// to avoid 'call is unlikely and code size would grow [-Werror=inline]'
1832
MACsecAttr();
1933

2034
~MACsecAttr();
2135

36+
static const std::string &get_cipher_name(std::int32_t cipher_id);
37+
38+
bool is_xpn() const;
39+
40+
std::string m_cipher;
2241
std::string m_vethName;
2342
std::string m_macsecName;
2443
std::string m_authKey;
2544
std::string m_sak;
2645
std::string m_sci;
46+
std::string m_salt;
2747

2848
macsec_an_t m_an;
2949
macsec_pn_t m_pn;
50+
macsec_ssci_t m_ssci;
3051

3152
bool m_sendSci;
3253
bool m_encryptionEnable;

vslib/MACsecManager.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <cstring>
1212
#include <system_error>
1313
#include <cinttypes>
14+
#include <string>
1415

1516
using namespace saivs;
1617

@@ -360,6 +361,7 @@ bool MACsecManager::create_macsec_egress_sc(
360361
<< " type macsec "
361362
<< " sci " << attr.m_sci
362363
<< " encrypt " << (attr.m_encryptionEnable ? " on " : " off ")
364+
<< " cipher " << attr.m_cipher
363365
<< " && ip link set dev "
364366
<< shellquote(attr.m_macsecName)
365367
<< " up";
@@ -412,6 +414,10 @@ bool MACsecManager::create_macsec_egress_sa(
412414
<< attr.m_an
413415
<< " pn "
414416
<< attr.m_pn
417+
<< ( attr.is_xpn() ? " ssci " : "" )
418+
<< ( attr.is_xpn() ? std::to_string(attr.m_ssci) : "" )
419+
<< ( attr.is_xpn() ? " salt " : "" )
420+
<< ( attr.is_xpn() ? attr.m_salt : "" )
415421
<< " on key "
416422
<< attr.m_authKey
417423
<< " "

vslib/SwitchStateBaseMACsec.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,15 @@ sai_status_t SwitchStateBase::loadMACsecAttrFromMACsecSC(
463463

464464
const sai_attribute_t *attr = nullptr;
465465

466+
SAI_METADATA_GET_ATTR_BY_ID(attr, SAI_MACSEC_SC_ATTR_MACSEC_CIPHER_SUITE, attrCount, attrList);
467+
468+
macsecAttr.m_cipher = MACsecAttr::get_cipher_name(attr->value.s32);
469+
470+
if (macsecAttr.m_cipher == MACsecAttr::CIPHER_NAME_INVALID)
471+
{
472+
return SAI_STATUS_FAILURE;
473+
}
474+
466475
SAI_METADATA_GET_ATTR_BY_ID(attr, SAI_MACSEC_SC_ATTR_MACSEC_DIRECTION, attrCount, attrList);
467476

468477
macsecAttr.m_direction = attr->value.s32;
@@ -541,6 +550,13 @@ sai_status_t SwitchStateBase::loadMACsecAttrFromMACsecSA(
541550

542551
CHECK_STATUS(get(SAI_OBJECT_TYPE_MACSEC_SC, attr->value.oid, static_cast<uint32_t>(attrs.size()), attrs.data()));
543552

553+
macsecAttr.m_cipher = MACsecAttr::get_cipher_name(attr->value.s32);
554+
555+
if (macsecAttr.m_cipher == MACsecAttr::CIPHER_NAME_INVALID)
556+
{
557+
return SAI_STATUS_FAILURE;
558+
}
559+
544560
auto flow_id = attrs[0].value.oid;
545561
auto sci = attrs[1].value.u64;
546562
std::stringstream sciHexStr;
@@ -612,6 +628,17 @@ sai_status_t SwitchStateBase::loadMACsecAttrFromMACsecSA(
612628

613629
macsecAttr.m_pn = attr->value.u64;
614630

631+
if (macsecAttr.is_xpn())
632+
{
633+
SAI_METADATA_GET_ATTR_BY_ID(attr, SAI_MACSEC_SA_ATTR_MACSEC_SSCI, attrCount, attrList);
634+
635+
macsecAttr.m_ssci = attr->value.u32;
636+
637+
SAI_METADATA_GET_ATTR_BY_ID(attr, SAI_MACSEC_SA_ATTR_SALT, attrCount, attrList);
638+
639+
macsecAttr.m_salt = sai_serialize_hex_binary(attr->value.macsecsalt);
640+
}
641+
615642
return SAI_STATUS_SUCCESS;
616643
}
617644

0 commit comments

Comments
 (0)