]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - src/drivers/driver_macsec_qca.c
mka: Add driver op to get macsec capabilities
[thirdparty/hostap.git] / src / drivers / driver_macsec_qca.c
index 9bfc9a474c34264607d6012a80d26c027a8d75f1..041bcf5f9fee38367f2c20f8ca60694edfd3731c 100644 (file)
@@ -458,6 +458,16 @@ static int macsec_qca_macsec_deinit(void *priv)
 }
 
 
+static int macsec_qca_get_capability(void *priv, enum macsec_cap *cap)
+{
+       wpa_printf(MSG_DEBUG, "%s", __func__);
+
+       *cap = MACSEC_CAP_INTEG_AND_CONF_0_30_50;
+
+       return 0;
+}
+
+
 static int macsec_qca_enable_protect_frames(void *priv, Boolean enabled)
 {
        struct macsec_qca_data *drv = priv;
@@ -601,8 +611,7 @@ static int macsec_qca_get_available_receive_sc(void *priv, u32 *channel)
 }
 
 
-static int macsec_qca_create_receive_sc(void *priv, u32 channel,
-                                       const u8 *sci_addr, u16 sci_port,
+static int macsec_qca_create_receive_sc(void *priv, struct receive_sc *sc,
                                        unsigned int conf_offset,
                                        int validation)
 {
@@ -611,6 +620,9 @@ static int macsec_qca_create_receive_sc(void *priv, u32 channel,
        fal_rx_prc_lut_t entry;
        fal_rx_sc_validate_frame_e vf;
        enum validate_frames validate_frames = validation;
+       u32 channel = sc->channel;
+       const u8 *sci_addr = sc->sci.addr;
+       u16 sci_port = be_to_host16(sc->sci.port);
 
        wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
 
@@ -649,11 +661,12 @@ static int macsec_qca_create_receive_sc(void *priv, u32 channel,
 }
 
 
-static int macsec_qca_delete_receive_sc(void *priv, u32 channel)
+static int macsec_qca_delete_receive_sc(void *priv, struct receive_sc *sc)
 {
        struct macsec_qca_data *drv = priv;
        int ret = 0;
        fal_rx_prc_lut_t entry;
+       u32 channel = sc->channel;
 
        wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
 
@@ -667,49 +680,57 @@ static int macsec_qca_delete_receive_sc(void *priv, u32 channel)
 }
 
 
-static int macsec_qca_create_receive_sa(void *priv, u32 channel, u8 an,
-                                       u32 lowest_pn, const u8 *sak)
+static int macsec_qca_create_receive_sa(void *priv, struct receive_sa *sa)
 {
        struct macsec_qca_data *drv = priv;
        int ret = 0;
        fal_rx_sak_t rx_sak;
        int i = 0;
+       u32 channel = sa->sc->channel;
 
        wpa_printf(MSG_DEBUG, "%s, channel=%d, an=%d, lpn=0x%x",
-                  __func__, channel, an, lowest_pn);
+                  __func__, channel, sa->an, sa->lowest_pn);
 
        os_memset(&rx_sak, 0, sizeof(rx_sak));
        for (i = 0; i < 16; i++)
-               rx_sak.sak[i] = sak[15 - i];
+               rx_sak.sak[i] = sa->pkey->key[15 - i];
 
-       ret += nss_macsec_secy_rx_sa_create(drv->secy_id, channel, an);
-       ret += nss_macsec_secy_rx_sak_set(drv->secy_id, channel, an, &rx_sak);
+       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);
 
        return ret;
 }
 
 
-static int macsec_qca_enable_receive_sa(void *priv, u32 channel, u8 an)
+static int macsec_qca_enable_receive_sa(void *priv, struct receive_sa *sa)
 {
        struct macsec_qca_data *drv = priv;
        int ret = 0;
+       u32 channel = sa->sc->channel;
 
-       wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an);
 
-       ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, an, TRUE);
+       wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel,
+                  sa->an);
+
+       ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, sa->an,
+                                           TRUE);
 
        return ret;
 }
 
 
-static int macsec_qca_disable_receive_sa(void *priv, u32 channel, u8 an)
+static int macsec_qca_disable_receive_sa(void *priv, struct receive_sa *sa)
 {
        struct macsec_qca_data *drv = priv;
        int ret = 0;
+       u32 channel = sa->sc->channel;
 
-       wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an);
+       wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel,
+                  sa->an);
 
-       ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, an, FALSE);
+       ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, sa->an,
+                                           FALSE);
 
        return ret;
 }
@@ -742,14 +763,14 @@ static int macsec_qca_get_available_transmit_sc(void *priv, u32 *channel)
 }
 
 
-static int macsec_qca_create_transmit_sc(void *priv, u32 channel,
-                                        const u8 *sci_addr, u16 sci_port,
+static int macsec_qca_create_transmit_sc(void *priv, struct transmit_sc *sc,
                                         unsigned int conf_offset)
 {
        struct macsec_qca_data *drv = priv;
        int ret = 0;
        fal_tx_class_lut_t entry;
        u8 psci[ETH_ALEN + 2];
+       u32 channel = sc->channel;
 
        wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
 
@@ -760,9 +781,9 @@ static int macsec_qca_create_transmit_sc(void *priv, u32 channel,
        entry.action = FAL_TX_CLASS_ACTION_FORWARD;
        entry.channel = channel;
 
-       os_memcpy(psci, sci_addr, ETH_ALEN);
-       psci[6] = (sci_port >> 8) & 0xf;
-       psci[7] = sci_port & 0xf;
+       os_memcpy(psci, sc->sci.addr, ETH_ALEN);
+       psci[6] = (sc->sci.port >> 8) & 0xf;
+       psci[7] = sc->sci.port & 0xf;
 
        ret += nss_macsec_secy_tx_class_lut_set(drv->secy_id, channel, &entry);
        ret += nss_macsec_secy_tx_sc_create(drv->secy_id, channel, psci, 8);
@@ -776,11 +797,12 @@ static int macsec_qca_create_transmit_sc(void *priv, u32 channel,
 }
 
 
-static int macsec_qca_delete_transmit_sc(void *priv, u32 channel)
+static int macsec_qca_delete_transmit_sc(void *priv, struct transmit_sc *sc)
 {
        struct macsec_qca_data *drv = priv;
        int ret = 0;
        fal_tx_class_lut_t entry;
+       u32 channel = sc->channel;
 
        wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
 
@@ -877,6 +899,7 @@ const struct wpa_driver_ops wpa_driver_macsec_qca_ops = {
 
        .macsec_init = macsec_qca_macsec_init,
        .macsec_deinit = macsec_qca_macsec_deinit,
+       .macsec_get_capability = macsec_qca_get_capability,
        .enable_protect_frames = macsec_qca_enable_protect_frames,
        .set_replay_protect = macsec_qca_set_replay_protect,
        .set_current_cipher_suite = macsec_qca_set_current_cipher_suite,