2 * Wired Ethernet driver interface for QCA MACsec driver
3 * Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2004, Gunter Burchardt <tira@isx.de>
5 * Copyright (c) 2013-2014, Qualcomm Atheros, Inc.
7 * This software may be distributed under the terms of the BSD license.
8 * See README for more details.
12 #include <sys/ioctl.h>
16 #include <netpacket/packet.h>
17 #include <net/if_arp.h>
19 #endif /* __linux__ */
20 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
21 #include <net/if_dl.h>
22 #include <net/if_media.h>
23 #endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) */
25 #include <sys/sockio.h>
28 #include "utils/common.h"
29 #include "utils/eloop.h"
30 #include "common/defs.h"
31 #include "common/ieee802_1x_defs.h"
34 #include "nss_macsec_secy.h"
35 #include "nss_macsec_secy_rx.h"
36 #include "nss_macsec_secy_tx.h"
40 /* TCI field definition */
55 static const u8 pae_group_addr[ETH_ALEN] =
56 { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x03 };
58 struct macsec_qca_data {
59 char ifname[IFNAMSIZ + 1];
63 int sock; /* raw packet socket for driver access */
65 int membership, multi, iff_allmulti, iff_up;
68 Boolean always_include_sci;
71 Boolean protect_frames;
72 Boolean replay_protect;
77 static int macsec_qca_multicast_membership(int sock, int ifindex,
78 const u8 *addr, int add)
81 struct packet_mreq mreq;
86 os_memset(&mreq, 0, sizeof(mreq));
87 mreq.mr_ifindex = ifindex;
88 mreq.mr_type = PACKET_MR_MULTICAST;
89 mreq.mr_alen = ETH_ALEN;
90 os_memcpy(mreq.mr_address, addr, ETH_ALEN);
92 if (setsockopt(sock, SOL_PACKET,
93 add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
94 &mreq, sizeof(mreq)) < 0) {
95 wpa_printf(MSG_ERROR, "setsockopt: %s", strerror(errno));
101 #endif /* __linux__ */
105 static int macsec_qca_get_ssid(void *priv, u8 *ssid)
112 static int macsec_qca_get_bssid(void *priv, u8 *bssid)
114 /* Report PAE group address as the "BSSID" for macsec connection. */
115 os_memcpy(bssid, pae_group_addr, ETH_ALEN);
120 static int macsec_qca_get_capa(void *priv, struct wpa_driver_capa *capa)
122 os_memset(capa, 0, sizeof(*capa));
123 capa->flags = WPA_DRIVER_FLAGS_WIRED;
128 static int macsec_qca_get_ifflags(const char *ifname, int *flags)
133 s = socket(PF_INET, SOCK_DGRAM, 0);
135 wpa_printf(MSG_ERROR, "socket: %s", strerror(errno));
139 os_memset(&ifr, 0, sizeof(ifr));
140 os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
141 if (ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) {
142 wpa_printf(MSG_ERROR, "ioctl[SIOCGIFFLAGS]: %s",
148 *flags = ifr.ifr_flags & 0xffff;
153 static int macsec_qca_set_ifflags(const char *ifname, int flags)
158 s = socket(PF_INET, SOCK_DGRAM, 0);
160 wpa_printf(MSG_ERROR, "socket: %s", strerror(errno));
164 os_memset(&ifr, 0, sizeof(ifr));
165 os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
166 ifr.ifr_flags = flags & 0xffff;
167 if (ioctl(s, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) {
168 wpa_printf(MSG_ERROR, "ioctl[SIOCSIFFLAGS]: %s",
178 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
179 static int macsec_qca_get_ifstatus(const char *ifname, int *status)
181 struct ifmediareq ifmr;
184 s = socket(PF_INET, SOCK_DGRAM, 0);
186 wpa_print(MSG_ERROR, "socket: %s", strerror(errno));
190 os_memset(&ifmr, 0, sizeof(ifmr));
191 os_strlcpy(ifmr.ifm_name, ifname, IFNAMSIZ);
192 if (ioctl(s, SIOCGIFMEDIA, (caddr_t) &ifmr) < 0) {
193 wpa_printf(MSG_ERROR, "ioctl[SIOCGIFMEDIA]: %s",
199 *status = (ifmr.ifm_status & (IFM_ACTIVE | IFM_AVALID)) ==
200 (IFM_ACTIVE | IFM_AVALID);
204 #endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(FreeBSD_kernel__) */
207 static int macsec_qca_multi(const char *ifname, const u8 *addr, int add)
216 s = socket(PF_INET, SOCK_DGRAM, 0);
218 wpa_printf(MSG_ERROR, "socket: %s", strerror(errno));
222 os_memset(&ifr, 0, sizeof(ifr));
223 os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
225 ifr.ifr_hwaddr.sa_family = AF_UNSPEC;
226 os_memcpy(ifr.ifr_hwaddr.sa_data, addr, ETH_ALEN);
227 #endif /* __linux__ */
228 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
230 struct sockaddr_dl *dlp;
231 dlp = (struct sockaddr_dl *) &ifr.ifr_addr;
232 dlp->sdl_len = sizeof(struct sockaddr_dl);
233 dlp->sdl_family = AF_LINK;
236 dlp->sdl_alen = ETH_ALEN;
238 os_memcpy(LLADDR(dlp), addr, ETH_ALEN);
240 #endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(FreeBSD_kernel__) */
241 #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
243 struct sockaddr *sap;
244 sap = (struct sockaddr *) &ifr.ifr_addr;
245 sap->sa_len = sizeof(struct sockaddr);
246 sap->sa_family = AF_UNSPEC;
247 os_memcpy(sap->sa_data, addr, ETH_ALEN);
249 #endif /* defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) */
251 if (ioctl(s, add ? SIOCADDMULTI : SIOCDELMULTI, (caddr_t) &ifr) < 0) {
252 wpa_printf(MSG_ERROR, "ioctl[SIOC{ADD/DEL}MULTI]: %s",
262 static void __macsec_drv_init(struct macsec_qca_data *drv)
265 fal_rx_ctl_filt_t rx_ctl_filt;
266 fal_tx_ctl_filt_t tx_ctl_filt;
268 wpa_printf(MSG_INFO, "%s: secy_id=%d", __func__, drv->secy_id);
270 /* Enable Secy and Let EAPoL bypass */
271 ret = nss_macsec_secy_en_set(drv->secy_id, TRUE);
273 wpa_printf(MSG_ERROR, "nss_macsec_secy_en_set: FAIL");
275 ret = nss_macsec_secy_sc_sa_mapping_mode_set(drv->secy_id,
278 wpa_printf(MSG_ERROR,
279 "nss_macsec_secy_sc_sa_mapping_mode_set: FAIL");
281 os_memset(&rx_ctl_filt, 0, sizeof(rx_ctl_filt));
282 rx_ctl_filt.bypass = 1;
283 rx_ctl_filt.match_type = IG_CTL_COMPARE_ETHER_TYPE;
284 rx_ctl_filt.match_mask = 0xffff;
285 rx_ctl_filt.ether_type_da_range = 0x888e;
286 ret = nss_macsec_secy_rx_ctl_filt_set(drv->secy_id, 0, &rx_ctl_filt);
288 wpa_printf(MSG_ERROR, "nss_macsec_secy_rx_ctl_filt_set: FAIL");
290 os_memset(&tx_ctl_filt, 0, sizeof(tx_ctl_filt));
291 tx_ctl_filt.bypass = 1;
292 tx_ctl_filt.match_type = EG_CTL_COMPARE_ETHER_TYPE;
293 tx_ctl_filt.match_mask = 0xffff;
294 tx_ctl_filt.ether_type_da_range = 0x888e;
295 ret = nss_macsec_secy_tx_ctl_filt_set(drv->secy_id, 0, &tx_ctl_filt);
297 wpa_printf(MSG_ERROR, "nss_macsec_secy_tx_ctl_filt_set: FAIL");
301 static void __macsec_drv_deinit(struct macsec_qca_data *drv)
303 nss_macsec_secy_en_set(drv->secy_id, FALSE);
304 nss_macsec_secy_rx_sc_del_all(drv->secy_id);
305 nss_macsec_secy_tx_sc_del_all(drv->secy_id);
309 static void * macsec_qca_init(void *ctx, const char *ifname)
311 struct macsec_qca_data *drv;
314 drv = os_zalloc(sizeof(*drv));
317 os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
320 /* Board specific settings */
321 if (os_memcmp("eth2", drv->ifname, 4) == 0)
323 else if (os_memcmp("eth3", drv->ifname, 4) == 0)
329 drv->pf_sock = socket(PF_PACKET, SOCK_DGRAM, 0);
330 if (drv->pf_sock < 0)
331 wpa_printf(MSG_ERROR, "socket(PF_PACKET): %s", strerror(errno));
332 #else /* __linux__ */
334 #endif /* __linux__ */
336 if (macsec_qca_get_ifflags(ifname, &flags) == 0 &&
338 macsec_qca_set_ifflags(ifname, flags | IFF_UP) == 0) {
342 if (macsec_qca_multicast_membership(drv->pf_sock,
343 if_nametoindex(drv->ifname),
344 pae_group_addr, 1) == 0) {
345 wpa_printf(MSG_DEBUG,
346 "%s: Added multicast membership with packet socket",
349 } else if (macsec_qca_multi(ifname, pae_group_addr, 1) == 0) {
350 wpa_printf(MSG_DEBUG,
351 "%s: Added multicast membership with SIOCADDMULTI",
354 } else if (macsec_qca_get_ifflags(ifname, &flags) < 0) {
355 wpa_printf(MSG_INFO, "%s: Could not get interface flags",
359 } else if (flags & IFF_ALLMULTI) {
360 wpa_printf(MSG_DEBUG,
361 "%s: Interface is already configured for multicast",
363 } else if (macsec_qca_set_ifflags(ifname, flags | IFF_ALLMULTI) < 0) {
364 wpa_printf(MSG_INFO, "%s: Failed to enable allmulti",
369 wpa_printf(MSG_DEBUG, "%s: Enabled allmulti mode", __func__);
370 drv->iff_allmulti = 1;
372 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
375 wpa_printf(MSG_DEBUG, "%s: waiting for link to become active",
377 while (macsec_qca_get_ifstatus(ifname, &status) == 0 &&
381 #endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(FreeBSD_kernel__) */
387 static void macsec_qca_deinit(void *priv)
389 struct macsec_qca_data *drv = priv;
392 if (drv->membership &&
393 macsec_qca_multicast_membership(drv->pf_sock,
394 if_nametoindex(drv->ifname),
395 pae_group_addr, 0) < 0) {
396 wpa_printf(MSG_DEBUG,
397 "%s: Failed to remove PAE multicast group (PACKET)",
402 macsec_qca_multi(drv->ifname, pae_group_addr, 0) < 0) {
403 wpa_printf(MSG_DEBUG,
404 "%s: Failed to remove PAE multicast group (SIOCDELMULTI)",
408 if (drv->iff_allmulti &&
409 (macsec_qca_get_ifflags(drv->ifname, &flags) < 0 ||
410 macsec_qca_set_ifflags(drv->ifname, flags & ~IFF_ALLMULTI) < 0)) {
411 wpa_printf(MSG_DEBUG, "%s: Failed to disable allmulti mode",
416 macsec_qca_get_ifflags(drv->ifname, &flags) == 0 &&
418 macsec_qca_set_ifflags(drv->ifname, flags & ~IFF_UP) < 0) {
419 wpa_printf(MSG_DEBUG, "%s: Failed to set the interface down",
423 if (drv->pf_sock != -1)
430 static int macsec_qca_macsec_init(void *priv, struct macsec_init_params *params)
432 struct macsec_qca_data *drv = priv;
434 drv->always_include_sci = params->always_include_sci;
435 drv->use_es = params->use_es;
436 drv->use_scb = params->use_scb;
438 wpa_printf(MSG_DEBUG, "%s: es=%d, scb=%d, sci=%d",
439 __func__, drv->use_es, drv->use_scb,
440 drv->always_include_sci);
442 __macsec_drv_init(drv);
448 static int macsec_qca_macsec_deinit(void *priv)
450 struct macsec_qca_data *drv = priv;
452 wpa_printf(MSG_DEBUG, "%s", __func__);
454 __macsec_drv_deinit(drv);
460 static int macsec_qca_enable_protect_frames(void *priv, Boolean enabled)
462 struct macsec_qca_data *drv = priv;
465 wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);
467 drv->protect_frames = enabled;
473 static int macsec_qca_set_replay_protect(void *priv, Boolean enabled,
476 struct macsec_qca_data *drv = priv;
479 wpa_printf(MSG_DEBUG, "%s: enabled=%d, win=%u",
480 __func__, enabled, window);
482 drv->replay_protect = enabled;
483 drv->replay_window = window;
489 static int macsec_qca_set_current_cipher_suite(void *priv, u64 cs)
491 if (cs != CS_ID_GCM_AES_128) {
492 wpa_printf(MSG_ERROR,
493 "%s: NOT supported CipherSuite: %016" PRIx64,
498 /* Support default Cipher Suite 0080020001000001 (GCM-AES-128) */
499 wpa_printf(MSG_DEBUG, "%s: default support aes-gcm-128", __func__);
505 static int macsec_qca_enable_controlled_port(void *priv, Boolean enabled)
507 struct macsec_qca_data *drv = priv;
510 wpa_printf(MSG_DEBUG, "%s: enable=%d", __func__, enabled);
512 ret += nss_macsec_secy_controlled_port_en_set(drv->secy_id, enabled);
518 static int macsec_qca_get_receive_lowest_pn(void *priv, u32 channel, u8 an,
521 struct macsec_qca_data *drv = priv;
524 bool enabled = FALSE;
527 ret += nss_macsec_secy_rx_sa_next_pn_get(drv->secy_id, channel, an,
529 ret += nss_macsec_secy_rx_sc_replay_protect_get(drv->secy_id, channel,
531 ret += nss_macsec_secy_rx_sc_anti_replay_window_get(drv->secy_id,
535 *lowest_pn = (next_pn > win) ? (next_pn - win) : 1;
537 *lowest_pn = next_pn;
539 wpa_printf(MSG_DEBUG, "%s: lpn=0x%x", __func__, *lowest_pn);
545 static int macsec_qca_get_transmit_next_pn(void *priv, u32 channel, u8 an,
548 struct macsec_qca_data *drv = priv;
551 ret += nss_macsec_secy_tx_sa_next_pn_get(drv->secy_id, channel, an,
554 wpa_printf(MSG_DEBUG, "%s: npn=0x%x", __func__, *next_pn);
560 int macsec_qca_set_transmit_next_pn(void *priv, u32 channel, u8 an, u32 next_pn)
562 struct macsec_qca_data *drv = priv;
565 ret += nss_macsec_secy_tx_sa_next_pn_set(drv->secy_id, channel, an,
568 wpa_printf(MSG_INFO, "%s: npn=0x%x", __func__, next_pn);
574 static int macsec_qca_get_available_receive_sc(void *priv, u32 *channel)
576 struct macsec_qca_data *drv = priv;
581 for (sc_ch = 0; sc_ch < MAXSC; sc_ch++) {
582 ret = nss_macsec_secy_rx_sc_in_used_get(drv->secy_id, sc_ch,
589 wpa_printf(MSG_DEBUG, "%s: channel=%d",
595 wpa_printf(MSG_DEBUG, "%s: no available channel", __func__);
601 static int macsec_qca_create_receive_sc(void *priv, u32 channel,
602 const u8 *sci_addr, u16 sci_port,
603 unsigned int conf_offset,
606 struct macsec_qca_data *drv = priv;
608 fal_rx_prc_lut_t entry;
609 fal_rx_sc_validate_frame_e vf;
610 enum validate_frames validate_frames = validation;
612 wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
615 os_memset(&entry, 0, sizeof(entry));
617 os_memcpy(entry.sci, sci_addr, ETH_ALEN);
618 entry.sci[6] = (sci_port >> 8) & 0xf;
619 entry.sci[7] = sci_port & 0xf;
620 entry.sci_mask = 0xf;
623 entry.channel = channel;
624 entry.action = FAL_RX_PRC_ACTION_PROCESS;
625 entry.offset = conf_offset;
627 /* rx validate frame */
628 if (validate_frames == Strict)
629 vf = FAL_RX_SC_VALIDATE_FRAME_STRICT;
630 else if (validate_frames == Checked)
631 vf = FAL_RX_SC_VALIDATE_FRAME_CHECK;
633 vf = FAL_RX_SC_VALIDATE_FRAME_DISABLED;
635 ret += nss_macsec_secy_rx_prc_lut_set(drv->secy_id, channel, &entry);
636 ret += nss_macsec_secy_rx_sc_create(drv->secy_id, channel);
637 ret += nss_macsec_secy_rx_sc_validate_frame_set(drv->secy_id, channel,
639 ret += nss_macsec_secy_rx_sc_replay_protect_set(drv->secy_id, channel,
640 drv->replay_protect);
641 ret += nss_macsec_secy_rx_sc_anti_replay_window_set(drv->secy_id,
649 static int macsec_qca_delete_receive_sc(void *priv, u32 channel)
651 struct macsec_qca_data *drv = priv;
653 fal_rx_prc_lut_t entry;
655 wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
658 os_memset(&entry, 0, sizeof(entry));
660 ret += nss_macsec_secy_rx_sc_del(drv->secy_id, channel);
661 ret += nss_macsec_secy_rx_prc_lut_set(drv->secy_id, channel, &entry);
667 static int macsec_qca_create_receive_sa(void *priv, u32 channel, u8 an,
668 u32 lowest_pn, const u8 *sak)
670 struct macsec_qca_data *drv = priv;
675 wpa_printf(MSG_DEBUG, "%s, channel=%d, an=%d, lpn=0x%x",
676 __func__, channel, an, lowest_pn);
678 os_memset(&rx_sak, 0, sizeof(rx_sak));
679 for (i = 0; i < 16; i++)
680 rx_sak.sak[i] = sak[15 - i];
682 ret += nss_macsec_secy_rx_sa_create(drv->secy_id, channel, an);
683 ret += nss_macsec_secy_rx_sak_set(drv->secy_id, channel, an, &rx_sak);
689 static int macsec_qca_enable_receive_sa(void *priv, u32 channel, u8 an)
691 struct macsec_qca_data *drv = priv;
694 wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an);
696 ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, an, TRUE);
702 static int macsec_qca_disable_receive_sa(void *priv, u32 channel, u8 an)
704 struct macsec_qca_data *drv = priv;
707 wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an);
709 ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, an, FALSE);
715 static int macsec_qca_get_available_transmit_sc(void *priv, u32 *channel)
717 struct macsec_qca_data *drv = priv;
722 for (sc_ch = 0; sc_ch < MAXSC; sc_ch++) {
723 ret = nss_macsec_secy_tx_sc_in_used_get(drv->secy_id, sc_ch,
730 wpa_printf(MSG_DEBUG, "%s: channel=%d",
736 wpa_printf(MSG_DEBUG, "%s: no avaiable channel", __func__);
742 static int macsec_qca_create_transmit_sc(void *priv, u32 channel,
743 const u8 *sci_addr, u16 sci_port,
744 unsigned int conf_offset)
746 struct macsec_qca_data *drv = priv;
748 fal_tx_class_lut_t entry;
749 u8 psci[ETH_ALEN + 2];
751 wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
754 os_memset(&entry, 0, sizeof(entry));
757 entry.action = FAL_TX_CLASS_ACTION_FORWARD;
758 entry.channel = channel;
760 os_memcpy(psci, sci_addr, ETH_ALEN);
761 psci[6] = (sci_port >> 8) & 0xf;
762 psci[7] = sci_port & 0xf;
764 ret += nss_macsec_secy_tx_class_lut_set(drv->secy_id, channel, &entry);
765 ret += nss_macsec_secy_tx_sc_create(drv->secy_id, channel, psci, 8);
766 ret += nss_macsec_secy_tx_sc_protect_set(drv->secy_id, channel,
767 drv->protect_frames);
768 ret += nss_macsec_secy_tx_sc_confidentiality_offset_set(drv->secy_id,
776 static int macsec_qca_delete_transmit_sc(void *priv, u32 channel)
778 struct macsec_qca_data *drv = priv;
780 fal_tx_class_lut_t entry;
782 wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
785 os_memset(&entry, 0, sizeof(entry));
787 ret += nss_macsec_secy_tx_class_lut_set(drv->secy_id, channel, &entry);
788 ret += nss_macsec_secy_tx_sc_del(drv->secy_id, channel);
794 static int macsec_qca_create_transmit_sa(void *priv, u32 channel, u8 an,
795 u32 next_pn, Boolean confidentiality,
798 struct macsec_qca_data *drv = priv;
804 wpa_printf(MSG_DEBUG,
805 "%s: channel=%d, an=%d, next_pn=0x%x, confidentiality=%d",
806 __func__, channel, an, next_pn, confidentiality);
808 if (drv->always_include_sci)
810 else if (drv->use_es)
812 else if (drv->use_scb)
816 tci |= TCI_E | TCI_C;
818 os_memset(&tx_sak, 0, sizeof(tx_sak));
819 for (i = 0; i < 16; i++)
820 tx_sak.sak[i] = sak[15 - i];
822 ret += nss_macsec_secy_tx_sa_next_pn_set(drv->secy_id, channel, an,
824 ret += nss_macsec_secy_tx_sak_set(drv->secy_id, channel, an, &tx_sak);
825 ret += nss_macsec_secy_tx_sc_tci_7_2_set(drv->secy_id, channel,
827 ret += nss_macsec_secy_tx_sc_an_set(drv->secy_id, channel, an);
833 static int macsec_qca_enable_transmit_sa(void *priv, u32 channel, u8 an)
835 struct macsec_qca_data *drv = priv;
838 wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an);
840 ret += nss_macsec_secy_tx_sa_en_set(drv->secy_id, channel, an, TRUE);
846 static int macsec_qca_disable_transmit_sa(void *priv, u32 channel, u8 an)
848 struct macsec_qca_data *drv = priv;
851 wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an);
853 ret += nss_macsec_secy_tx_sa_en_set(drv->secy_id, channel, an, FALSE);
859 const struct wpa_driver_ops wpa_driver_macsec_qca_ops = {
860 .name = "macsec_qca",
861 .desc = "QCA MACsec Ethernet driver",
862 .get_ssid = macsec_qca_get_ssid,
863 .get_bssid = macsec_qca_get_bssid,
864 .get_capa = macsec_qca_get_capa,
865 .init = macsec_qca_init,
866 .deinit = macsec_qca_deinit,
868 .macsec_init = macsec_qca_macsec_init,
869 .macsec_deinit = macsec_qca_macsec_deinit,
870 .enable_protect_frames = macsec_qca_enable_protect_frames,
871 .set_replay_protect = macsec_qca_set_replay_protect,
872 .set_current_cipher_suite = macsec_qca_set_current_cipher_suite,
873 .enable_controlled_port = macsec_qca_enable_controlled_port,
874 .get_receive_lowest_pn = macsec_qca_get_receive_lowest_pn,
875 .get_transmit_next_pn = macsec_qca_get_transmit_next_pn,
876 .set_transmit_next_pn = macsec_qca_set_transmit_next_pn,
877 .get_available_receive_sc = macsec_qca_get_available_receive_sc,
878 .create_receive_sc = macsec_qca_create_receive_sc,
879 .delete_receive_sc = macsec_qca_delete_receive_sc,
880 .create_receive_sa = macsec_qca_create_receive_sa,
881 .enable_receive_sa = macsec_qca_enable_receive_sa,
882 .disable_receive_sa = macsec_qca_disable_receive_sa,
883 .get_available_transmit_sc = macsec_qca_get_available_transmit_sc,
884 .create_transmit_sc = macsec_qca_create_transmit_sc,
885 .delete_transmit_sc = macsec_qca_delete_transmit_sc,
886 .create_transmit_sa = macsec_qca_create_transmit_sa,
887 .enable_transmit_sa = macsec_qca_enable_transmit_sa,
888 .disable_transmit_sa = macsec_qca_disable_transmit_sa,