From b3f24b06e30411e1d4af06945b43eb4db0ac3394 Mon Sep 17 00:00:00 2001 From: xiaofeis Date: Wed, 22 Aug 2018 17:00:28 +0800 Subject: [PATCH] mka: Fix confidentiality offset issue in macsec_qca driver interface Confidentiality offset from MKA should be configured to the driver/hardware when creating SA. Signed-off-by: xiaofeis --- src/drivers/driver_macsec_qca.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/drivers/driver_macsec_qca.c b/src/drivers/driver_macsec_qca.c index 6e3d0ab11..e397950c6 100644 --- a/src/drivers/driver_macsec_qca.c +++ b/src/drivers/driver_macsec_qca.c @@ -515,6 +515,8 @@ static int macsec_qca_create_receive_sa(void *priv, struct receive_sa *sa) fal_rx_sak_t rx_sak; int i = 0; u32 channel; + fal_rx_prc_lut_t entry; + u32 offset; ret = macsec_qca_lookup_receive_channel(priv, sa->sc, &channel); if (ret != 0) @@ -537,6 +539,17 @@ static int macsec_qca_create_receive_sa(void *priv, struct receive_sa *sa) return -1; } + if (sa->pkey->confidentiality_offset == CONFIDENTIALITY_OFFSET_0) + offset = 0; + else if (sa->pkey->confidentiality_offset == CONFIDENTIALITY_OFFSET_30) + offset = 30; + else if (sa->pkey->confidentiality_offset == CONFIDENTIALITY_OFFSET_50) + offset = 50; + else + return -1; + ret += nss_macsec_secy_rx_prc_lut_get(drv->secy_id, channel, &entry); + entry.offset = offset; + ret += nss_macsec_secy_rx_prc_lut_set(drv->secy_id, channel, &entry); ret += nss_macsec_secy_rx_sa_create(drv->secy_id, channel, sa->an); ret += nss_macsec_secy_rx_sak_set(drv->secy_id, channel, sa->an, &rx_sak); @@ -682,6 +695,7 @@ static int macsec_qca_create_transmit_sa(void *priv, struct transmit_sa *sa) fal_tx_sak_t tx_sak; int i; u32 channel; + u32 offset; ret = macsec_qca_lookup_transmit_channel(priv, sa->sc, &channel); if (ret != 0) @@ -715,6 +729,17 @@ static int macsec_qca_create_transmit_sa(void *priv, struct transmit_sa *sa) return -1; } + if (sa->pkey->confidentiality_offset == CONFIDENTIALITY_OFFSET_0) + offset = 0; + else if (sa->pkey->confidentiality_offset == CONFIDENTIALITY_OFFSET_30) + offset = 30; + else if (sa->pkey->confidentiality_offset == CONFIDENTIALITY_OFFSET_50) + offset = 50; + else + return -1; + ret += nss_macsec_secy_tx_sc_confidentiality_offset_set(drv->secy_id, + channel, + offset); ret += nss_macsec_secy_tx_sa_next_pn_set(drv->secy_id, channel, sa->an, sa->next_pn); ret += nss_macsec_secy_tx_sak_set(drv->secy_id, channel, sa->an,