11
11
#include < regex>
12
12
13
13
#include < net/if.h>
14
+ #include < arpa/inet.h>
14
15
#include < byteswap.h>
15
16
16
17
using namespace saivs ;
@@ -589,11 +590,12 @@ sai_status_t SwitchStateBase::loadMACsecAttrFromMACsecSA(
589
590
SAI_METADATA_GET_ATTR_BY_ID (attr, SAI_MACSEC_SA_ATTR_SC_ID, attrCount, attrList);
590
591
591
592
// Find MACsec SC attributes
592
- std::vector<sai_attribute_t > attrs (4 );
593
+ std::vector<sai_attribute_t > attrs (5 );
593
594
attrs[0 ].id = SAI_MACSEC_SC_ATTR_FLOW_ID;
594
595
attrs[1 ].id = SAI_MACSEC_SC_ATTR_MACSEC_SCI;
595
596
attrs[2 ].id = SAI_MACSEC_SC_ATTR_ENCRYPTION_ENABLE;
596
597
attrs[3 ].id = SAI_MACSEC_SC_ATTR_MACSEC_CIPHER_SUITE;
598
+ attrs[4 ].id = SAI_MACSEC_SC_ATTR_MACSEC_EXPLICIT_SCI_ENABLE;
597
599
598
600
CHECK_STATUS (get (SAI_OBJECT_TYPE_MACSEC_SC, attr->value .oid , static_cast <uint32_t >(attrs.size ()), attrs.data ()));
599
601
@@ -609,6 +611,7 @@ sai_status_t SwitchStateBase::loadMACsecAttrFromMACsecSA(
609
611
std::stringstream sciHexStr;
610
612
macsecAttr.m_encryptionEnable = attrs[2 ].value .booldata ;
611
613
bool is_sak_128_bit = (attrs[3 ].value .s32 == SAI_MACSEC_CIPHER_SUITE_GCM_AES_128 || attrs[3 ].value .s32 == SAI_MACSEC_CIPHER_SUITE_GCM_AES_XPN_128);
614
+ macsecAttr.m_sendSci = attrs[4 ].value .booldata ;
612
615
613
616
sciHexStr << std::setw (MACSEC_SCI_LENGTH) << std::setfill (' 0' );
614
617
@@ -679,7 +682,9 @@ sai_status_t SwitchStateBase::loadMACsecAttrFromMACsecSA(
679
682
{
680
683
SAI_METADATA_GET_ATTR_BY_ID (attr, SAI_MACSEC_SA_ATTR_MACSEC_SSCI, attrCount, attrList);
681
684
682
- macsecAttr.m_ssci = attr->value .u32 ;
685
+ // The Linux kernel directly uses ssci to XOR with the salt that is network order,
686
+ // So, this conversion is useful to convert SSCI from the host order to network order.
687
+ macsecAttr.m_ssci = htonl (attr->value .u32 );
683
688
684
689
SAI_METADATA_GET_ATTR_BY_ID (attr, SAI_MACSEC_SA_ATTR_SALT, attrCount, attrList);
685
690
0 commit comments