Home | History | Annotate | Download | only in drivers
      1 /*
      2  * Driver interaction with Linux MACsec kernel module
      3  * Copyright (c) 2016, Sabrina Dubroca <sd (at) queasysnail.net> and Red Hat, Inc.
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #include "includes.h"
     10 #include <sys/ioctl.h>
     11 #include <net/if.h>
     12 #include <netpacket/packet.h>
     13 #include <net/if_arp.h>
     14 #include <net/if.h>
     15 #include <netlink/netlink.h>
     16 #include <netlink/genl/genl.h>
     17 #include <netlink/genl/ctrl.h>
     18 #include <netlink/route/link.h>
     19 #include <netlink/route/link/macsec.h>
     20 #include <linux/if_macsec.h>
     21 #include <inttypes.h>
     22 
     23 #include "utils/common.h"
     24 #include "utils/eloop.h"
     25 #include "pae/ieee802_1x_kay.h"
     26 #include "driver.h"
     27 #include "driver_wired_common.h"
     28 
     29 #define DRV_PREFIX "macsec_linux: "
     30 
     31 #define UNUSED_SCI 0xffffffffffffffff
     32 
     33 struct cb_arg {
     34 	struct macsec_drv_data *drv;
     35 	u32 *pn;
     36 	int ifindex;
     37 	u8 txsa;
     38 	u8 rxsa;
     39 	u64 rxsci;
     40 };
     41 
     42 struct macsec_genl_ctx {
     43 	struct nl_sock *sk;
     44 	int macsec_genl_id;
     45 	struct cb_arg cb_arg;
     46 };
     47 
     48 struct macsec_drv_data {
     49 	struct driver_wired_common_data common;
     50 	struct rtnl_link *link;
     51 	struct nl_cache *link_cache;
     52 	struct nl_sock *sk;
     53 	struct macsec_genl_ctx ctx;
     54 
     55 	struct netlink_data *netlink;
     56 	struct nl_handle *nl;
     57 	char ifname[IFNAMSIZ + 1];
     58 	int ifi;
     59 	int parent_ifi;
     60 
     61 	Boolean created_link;
     62 
     63 	Boolean controlled_port_enabled;
     64 	Boolean controlled_port_enabled_set;
     65 
     66 	Boolean protect_frames;
     67 	Boolean protect_frames_set;
     68 
     69 	Boolean encrypt;
     70 	Boolean encrypt_set;
     71 
     72 	Boolean replay_protect;
     73 	Boolean replay_protect_set;
     74 
     75 	u32 replay_window;
     76 
     77 	u8 encoding_sa;
     78 	Boolean encoding_sa_set;
     79 };
     80 
     81 
     82 static int dump_callback(struct nl_msg *msg, void *argp);
     83 
     84 
     85 static struct nl_msg * msg_prepare(enum macsec_nl_commands cmd,
     86 				   const struct macsec_genl_ctx *ctx,
     87 				   unsigned int ifindex)
     88 {
     89 	struct nl_msg *msg;
     90 
     91 	msg = nlmsg_alloc();
     92 	if (!msg) {
     93 		wpa_printf(MSG_ERROR, DRV_PREFIX "failed to alloc message");
     94 		return NULL;
     95 	}
     96 
     97 	if (!genlmsg_put(msg, 0, 0, ctx->macsec_genl_id, 0, 0, cmd, 0)) {
     98 		wpa_printf(MSG_ERROR, DRV_PREFIX "failed to put header");
     99 		goto nla_put_failure;
    100 	}
    101 
    102 	NLA_PUT_U32(msg, MACSEC_ATTR_IFINDEX, ifindex);
    103 
    104 	return msg;
    105 
    106 nla_put_failure:
    107 	nlmsg_free(msg);
    108 	return NULL;
    109 }
    110 
    111 
    112 static int nla_put_rxsc_config(struct nl_msg *msg, u64 sci)
    113 {
    114 	struct nlattr *nest = nla_nest_start(msg, MACSEC_ATTR_RXSC_CONFIG);
    115 
    116 	if (!nest)
    117 		return -1;
    118 
    119 	NLA_PUT_U64(msg, MACSEC_RXSC_ATTR_SCI, sci);
    120 
    121 	nla_nest_end(msg, nest);
    122 
    123 	return 0;
    124 
    125 nla_put_failure:
    126 	return -1;
    127 }
    128 
    129 
    130 static int init_genl_ctx(struct macsec_drv_data *drv)
    131 {
    132 	struct macsec_genl_ctx *ctx = &drv->ctx;
    133 
    134 	ctx->sk = nl_socket_alloc();
    135 	if (!ctx->sk) {
    136 		wpa_printf(MSG_ERROR, DRV_PREFIX "failed to alloc genl socket");
    137 		return -1;
    138 	}
    139 
    140 	if (genl_connect(ctx->sk) < 0) {
    141 		wpa_printf(MSG_ERROR,
    142 			   DRV_PREFIX "connection to genl socket failed");
    143 		goto out_free;
    144 	}
    145 
    146 	ctx->macsec_genl_id = genl_ctrl_resolve(ctx->sk, "macsec");
    147 	if (ctx->macsec_genl_id < 0) {
    148 		wpa_printf(MSG_ERROR, DRV_PREFIX "genl resolve failed");
    149 		goto out_free;
    150 	}
    151 
    152 	memset(&ctx->cb_arg, 0, sizeof(ctx->cb_arg));
    153 	ctx->cb_arg.drv = drv;
    154 
    155 	nl_socket_modify_cb(ctx->sk, NL_CB_VALID, NL_CB_CUSTOM, dump_callback,
    156 			    &ctx->cb_arg);
    157 
    158 	return 0;
    159 
    160 out_free:
    161 	nl_socket_free(ctx->sk);
    162 	ctx->sk = NULL;
    163 	return -1;
    164 }
    165 
    166 
    167 static int try_commit(struct macsec_drv_data *drv)
    168 {
    169 	int err;
    170 
    171 	if (!drv->link)
    172 		return 0;
    173 
    174 	if (drv->controlled_port_enabled_set) {
    175 		struct rtnl_link *change = rtnl_link_alloc();
    176 
    177 		if (!change)
    178 			return -1;
    179 
    180 		rtnl_link_set_name(change, drv->ifname);
    181 
    182 		if (drv->controlled_port_enabled)
    183 			rtnl_link_set_flags(change, IFF_UP);
    184 		else
    185 			rtnl_link_unset_flags(change, IFF_UP);
    186 
    187 		err = rtnl_link_change(drv->sk, change, change, 0);
    188 		if (err < 0)
    189 			return err;
    190 
    191 		rtnl_link_put(change);
    192 
    193 		drv->controlled_port_enabled_set = FALSE;
    194 	}
    195 
    196 	if (drv->protect_frames_set)
    197 		rtnl_link_macsec_set_protect(drv->link, drv->protect_frames);
    198 
    199 	if (drv->encrypt_set)
    200 		rtnl_link_macsec_set_encrypt(drv->link, drv->encrypt);
    201 
    202 	if (drv->replay_protect_set) {
    203 		rtnl_link_macsec_set_replay_protect(drv->link,
    204 						    drv->replay_protect);
    205 		if (drv->replay_protect)
    206 			rtnl_link_macsec_set_window(drv->link,
    207 						    drv->replay_window);
    208 	}
    209 
    210 	if (drv->encoding_sa_set)
    211 		rtnl_link_macsec_set_encoding_sa(drv->link, drv->encoding_sa);
    212 
    213 	err = rtnl_link_add(drv->sk, drv->link, 0);
    214 	if (err < 0)
    215 		return err;
    216 
    217 	drv->protect_frames_set = FALSE;
    218 	drv->encrypt_set = FALSE;
    219 	drv->replay_protect_set = FALSE;
    220 
    221 	return 0;
    222 }
    223 
    224 
    225 static void macsec_drv_wpa_deinit(void *priv)
    226 {
    227 	struct macsec_drv_data *drv = priv;
    228 
    229 	driver_wired_deinit_common(&drv->common);
    230 	os_free(drv);
    231 }
    232 
    233 
    234 static void * macsec_drv_wpa_init(void *ctx, const char *ifname)
    235 {
    236 	struct macsec_drv_data *drv;
    237 
    238 	drv = os_zalloc(sizeof(*drv));
    239 	if (!drv)
    240 		return NULL;
    241 
    242 	if (driver_wired_init_common(&drv->common, ifname, ctx) < 0) {
    243 		os_free(drv);
    244 		return NULL;
    245 	}
    246 
    247 	return drv;
    248 }
    249 
    250 
    251 static int macsec_drv_macsec_init(void *priv, struct macsec_init_params *params)
    252 {
    253 	struct macsec_drv_data *drv = priv;
    254 	int err;
    255 
    256 	wpa_printf(MSG_DEBUG, "%s", __func__);
    257 
    258 	drv->sk = nl_socket_alloc();
    259 	if (!drv->sk)
    260 		return -1;
    261 
    262 	err = nl_connect(drv->sk, NETLINK_ROUTE);
    263 	if (err < 0) {
    264 		wpa_printf(MSG_ERROR, DRV_PREFIX
    265 			   "Unable to connect NETLINK_ROUTE socket: %s",
    266 			   strerror(errno));
    267 		goto sock;
    268 	}
    269 
    270 	err = rtnl_link_alloc_cache(drv->sk, AF_UNSPEC, &drv->link_cache);
    271 	if (err < 0) {
    272 		wpa_printf(MSG_ERROR, DRV_PREFIX "Unable to get link cache: %s",
    273 			   strerror(errno));
    274 		goto sock;
    275 	}
    276 
    277 	drv->parent_ifi = rtnl_link_name2i(drv->link_cache, drv->common.ifname);
    278 	if (drv->parent_ifi == 0) {
    279 		wpa_printf(MSG_ERROR, DRV_PREFIX
    280 			   "couldn't find ifindex for interface %s",
    281 			   drv->common.ifname);
    282 		goto cache;
    283 	}
    284 
    285 	err = init_genl_ctx(drv);
    286 	if (err < 0)
    287 		goto cache;
    288 
    289 	return 0;
    290 
    291 cache:
    292 	nl_cache_free(drv->link_cache);
    293 	drv->link_cache = NULL;
    294 sock:
    295 	nl_socket_free(drv->sk);
    296 	drv->sk = NULL;
    297 	return -1;
    298 }
    299 
    300 
    301 static int macsec_drv_macsec_deinit(void *priv)
    302 {
    303 	struct macsec_drv_data *drv = priv;
    304 
    305 	wpa_printf(MSG_DEBUG, "%s", __func__);
    306 
    307 	if (drv->sk)
    308 		nl_socket_free(drv->sk);
    309 	drv->sk = NULL;
    310 
    311 	if (drv->link_cache)
    312 		nl_cache_free(drv->link_cache);
    313 	drv->link_cache = NULL;
    314 
    315 	if (drv->ctx.sk)
    316 		nl_socket_free(drv->ctx.sk);
    317 
    318 	return 0;
    319 }
    320 
    321 
    322 static int macsec_drv_get_capability(void *priv, enum macsec_cap *cap)
    323 {
    324 	wpa_printf(MSG_DEBUG, "%s", __func__);
    325 
    326 	*cap = MACSEC_CAP_INTEG_AND_CONF;
    327 
    328 	return 0;
    329 }
    330 
    331 
    332 /**
    333  * macsec_drv_enable_protect_frames - Set protect frames status
    334  * @priv: Private driver interface data
    335  * @enabled: TRUE = protect frames enabled
    336  *           FALSE = protect frames disabled
    337  * Returns: 0 on success, -1 on failure (or if not supported)
    338  */
    339 static int macsec_drv_enable_protect_frames(void *priv, Boolean enabled)
    340 {
    341 	struct macsec_drv_data *drv = priv;
    342 
    343 	wpa_printf(MSG_DEBUG, "%s -> %s", __func__, enabled ? "TRUE" : "FALSE");
    344 
    345 	drv->protect_frames_set = TRUE;
    346 	drv->protect_frames = enabled;
    347 
    348 	return try_commit(drv);
    349 }
    350 
    351 
    352 /**
    353  * macsec_drv_enable_encrypt - Set protect frames status
    354  * @priv: Private driver interface data
    355  * @enabled: TRUE = protect frames enabled
    356  *           FALSE = protect frames disabled
    357  * Returns: 0 on success, -1 on failure (or if not supported)
    358  */
    359 static int macsec_drv_enable_encrypt(void *priv, Boolean enabled)
    360 {
    361 	struct macsec_drv_data *drv = priv;
    362 
    363 	wpa_printf(MSG_DEBUG, "%s -> %s", __func__, enabled ? "TRUE" : "FALSE");
    364 
    365 	drv->encrypt_set = TRUE;
    366 	drv->encrypt = enabled;
    367 
    368 	return try_commit(drv);
    369 }
    370 
    371 
    372 /**
    373  * macsec_drv_set_replay_protect - Set replay protect status and window size
    374  * @priv: Private driver interface data
    375  * @enabled: TRUE = replay protect enabled
    376  *           FALSE = replay protect disabled
    377  * @window: replay window size, valid only when replay protect enabled
    378  * Returns: 0 on success, -1 on failure (or if not supported)
    379  */
    380 static int macsec_drv_set_replay_protect(void *priv, Boolean enabled,
    381 					 u32 window)
    382 {
    383 	struct macsec_drv_data *drv = priv;
    384 
    385 	wpa_printf(MSG_DEBUG, "%s -> %s, %u", __func__,
    386 		   enabled ? "TRUE" : "FALSE", window);
    387 
    388 	drv->replay_protect_set = TRUE;
    389 	drv->replay_protect = enabled;
    390 	if (enabled)
    391 		drv->replay_window = window;
    392 
    393 	return try_commit(drv);
    394 }
    395 
    396 
    397 /**
    398  * macsec_drv_set_current_cipher_suite - Set current cipher suite
    399  * @priv: Private driver interface data
    400  * @cs: EUI64 identifier
    401  * Returns: 0 on success, -1 on failure (or if not supported)
    402  */
    403 static int macsec_drv_set_current_cipher_suite(void *priv, u64 cs)
    404 {
    405 	wpa_printf(MSG_DEBUG, "%s -> %016" PRIx64, __func__, cs);
    406 	return 0;
    407 }
    408 
    409 
    410 /**
    411  * macsec_drv_enable_controlled_port - Set controlled port status
    412  * @priv: Private driver interface data
    413  * @enabled: TRUE = controlled port enabled
    414  *           FALSE = controlled port disabled
    415  * Returns: 0 on success, -1 on failure (or if not supported)
    416  */
    417 static int macsec_drv_enable_controlled_port(void *priv, Boolean enabled)
    418 {
    419 	struct macsec_drv_data *drv = priv;
    420 
    421 	wpa_printf(MSG_DEBUG, "%s -> %s", __func__, enabled ? "TRUE" : "FALSE");
    422 
    423 	drv->controlled_port_enabled = enabled;
    424 	drv->controlled_port_enabled_set = TRUE;
    425 
    426 	return try_commit(drv);
    427 }
    428 
    429 
    430 static struct nla_policy sa_policy[MACSEC_SA_ATTR_MAX + 1] = {
    431 	[MACSEC_SA_ATTR_AN] = { .type = NLA_U8 },
    432 	[MACSEC_SA_ATTR_ACTIVE] = { .type = NLA_U8 },
    433 	[MACSEC_SA_ATTR_PN] = { .type = NLA_U32 },
    434 	[MACSEC_SA_ATTR_KEYID] = { .type = NLA_BINARY },
    435 };
    436 
    437 static struct nla_policy sc_policy[MACSEC_RXSC_ATTR_MAX + 1] = {
    438 	[MACSEC_RXSC_ATTR_SCI] = { .type = NLA_U64 },
    439 	[MACSEC_RXSC_ATTR_ACTIVE] = { .type = NLA_U8 },
    440 	[MACSEC_RXSC_ATTR_SA_LIST] = { .type = NLA_NESTED },
    441 };
    442 
    443 static struct nla_policy main_policy[MACSEC_ATTR_MAX + 1] = {
    444 	[MACSEC_ATTR_IFINDEX] = { .type = NLA_U32 },
    445 	[MACSEC_ATTR_SECY] = { .type = NLA_NESTED },
    446 	[MACSEC_ATTR_TXSA_LIST] = { .type = NLA_NESTED },
    447 	[MACSEC_ATTR_RXSC_LIST] = { .type = NLA_NESTED },
    448 };
    449 
    450 static int dump_callback(struct nl_msg *msg, void *argp)
    451 {
    452 	struct nlmsghdr *ret_hdr = nlmsg_hdr(msg);
    453 	struct nlattr *tb_msg[MACSEC_ATTR_MAX + 1];
    454 	struct cb_arg *arg = (struct cb_arg *) argp;
    455 	struct genlmsghdr *gnlh = (struct genlmsghdr *) nlmsg_data(ret_hdr);
    456 	int err;
    457 
    458 	if (ret_hdr->nlmsg_type != arg->drv->ctx.macsec_genl_id)
    459 		return 0;
    460 
    461 	err = nla_parse(tb_msg, MACSEC_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
    462 			genlmsg_attrlen(gnlh, 0), main_policy);
    463 	if (err < 0)
    464 		return 0;
    465 
    466 	if (!tb_msg[MACSEC_ATTR_IFINDEX])
    467 		return 0;
    468 
    469 	if (nla_get_u32(tb_msg[MACSEC_ATTR_IFINDEX]) != (u32) arg->ifindex)
    470 		return 0;
    471 
    472 	if (arg->txsa < 4 && !tb_msg[MACSEC_ATTR_TXSA_LIST]) {
    473 		return 0;
    474 	} else if (arg->txsa < 4) {
    475 		struct nlattr *nla;
    476 		int rem;
    477 
    478 		nla_for_each_nested(nla, tb_msg[MACSEC_ATTR_TXSA_LIST], rem) {
    479 			struct nlattr *tb[MACSEC_SA_ATTR_MAX + 1];
    480 
    481 			err = nla_parse_nested(tb, MACSEC_SA_ATTR_MAX, nla,
    482 					       sa_policy);
    483 			if (err < 0)
    484 				continue;
    485 			if (!tb[MACSEC_SA_ATTR_AN])
    486 				continue;
    487 			if (nla_get_u8(tb[MACSEC_SA_ATTR_AN]) != arg->txsa)
    488 				continue;
    489 			if (!tb[MACSEC_SA_ATTR_PN])
    490 				return 0;
    491 			*arg->pn = nla_get_u32(tb[MACSEC_SA_ATTR_PN]);
    492 			return 0;
    493 		}
    494 
    495 		return 0;
    496 	}
    497 
    498 	if (arg->rxsci == UNUSED_SCI)
    499 		return 0;
    500 
    501 	if (tb_msg[MACSEC_ATTR_RXSC_LIST]) {
    502 		struct nlattr *nla;
    503 		int rem;
    504 
    505 		nla_for_each_nested(nla, tb_msg[MACSEC_ATTR_RXSC_LIST], rem) {
    506 			struct nlattr *tb[MACSEC_RXSC_ATTR_MAX + 1];
    507 
    508 			err = nla_parse_nested(tb, MACSEC_RXSC_ATTR_MAX, nla,
    509 					       sc_policy);
    510 			if (err < 0)
    511 				return 0;
    512 			if (!tb[MACSEC_RXSC_ATTR_SCI])
    513 				continue;
    514 			if (nla_get_u64(tb[MACSEC_RXSC_ATTR_SCI]) != arg->rxsci)
    515 				continue;
    516 			if (!tb[MACSEC_RXSC_ATTR_SA_LIST])
    517 				return 0;
    518 
    519 			nla_for_each_nested(nla, tb[MACSEC_RXSC_ATTR_SA_LIST],
    520 					    rem) {
    521 				struct nlattr *tb_sa[MACSEC_SA_ATTR_MAX + 1];
    522 
    523 				err = nla_parse_nested(tb_sa,
    524 						       MACSEC_SA_ATTR_MAX, nla,
    525 						       sa_policy);
    526 				if (err < 0)
    527 					continue;
    528 				if (!tb_sa[MACSEC_SA_ATTR_AN])
    529 					continue;
    530 				if (nla_get_u8(tb_sa[MACSEC_SA_ATTR_AN]) !=
    531 				    arg->rxsa)
    532 					continue;
    533 				if (!tb_sa[MACSEC_SA_ATTR_PN])
    534 					return 0;
    535 				*arg->pn =
    536 					nla_get_u32(tb_sa[MACSEC_SA_ATTR_PN]);
    537 
    538 				return 0;
    539 			}
    540 
    541 			return 0;
    542 		}
    543 
    544 		return 0;
    545 	}
    546 
    547 	return 0;
    548 }
    549 
    550 
    551 static int nl_send_recv(struct nl_sock *sk, struct nl_msg *msg)
    552 {
    553 	int ret;
    554 
    555 	ret = nl_send_auto_complete(sk, msg);
    556 	if (ret < 0) {
    557 		wpa_printf(MSG_ERROR, DRV_PREFIX "%s: failed to send: %d (%s)",
    558 			   __func__, ret, nl_geterror(-ret));
    559 		return ret;
    560 	}
    561 
    562 	ret = nl_recvmsgs_default(sk);
    563 	if (ret < 0) {
    564 		wpa_printf(MSG_ERROR, DRV_PREFIX "%s: failed to recv: %d (%s)",
    565 			   __func__, ret, nl_geterror(-ret));
    566 	}
    567 
    568 	return ret;
    569 }
    570 
    571 
    572 static int do_dump(struct macsec_drv_data *drv, u8 txsa, u64 rxsci, u8 rxsa,
    573 		   u32 *pn)
    574 {
    575 	struct macsec_genl_ctx *ctx = &drv->ctx;
    576 	struct nl_msg *msg;
    577 	int ret = 1;
    578 
    579 	ctx->cb_arg.ifindex = drv->ifi;
    580 	ctx->cb_arg.rxsci = rxsci;
    581 	ctx->cb_arg.rxsa = rxsa;
    582 	ctx->cb_arg.txsa = txsa;
    583 	ctx->cb_arg.pn = pn;
    584 
    585 	msg = nlmsg_alloc();
    586 	if (!msg) {
    587 		wpa_printf(MSG_ERROR, DRV_PREFIX "%s: failed to alloc message",
    588 			   __func__);
    589 		return 1;
    590 	}
    591 
    592 	if (!genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, ctx->macsec_genl_id, 0,
    593 			 NLM_F_DUMP, MACSEC_CMD_GET_TXSC, 0)) {
    594 		wpa_printf(MSG_ERROR, DRV_PREFIX "%s: failed to put header",
    595 			   __func__);
    596 		goto out_free_msg;
    597 	}
    598 
    599 	ret = nl_send_recv(ctx->sk, msg);
    600 	if (ret < 0)
    601 		wpa_printf(MSG_ERROR,
    602 			   DRV_PREFIX "failed to communicate: %d (%s)",
    603 			   ret, nl_geterror(-ret));
    604 
    605 	ctx->cb_arg.pn = 0;
    606 
    607 out_free_msg:
    608 	nlmsg_free(msg);
    609 	return ret;
    610 }
    611 
    612 
    613 /**
    614  * macsec_drv_get_receive_lowest_pn - Get receive lowest PN
    615  * @priv: Private driver interface data
    616  * @sa: secure association
    617  * Returns: 0 on success, -1 on failure (or if not supported)
    618  */
    619 static int macsec_drv_get_receive_lowest_pn(void *priv, struct receive_sa *sa)
    620 {
    621 	struct macsec_drv_data *drv = priv;
    622 	int err;
    623 
    624 	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s", __func__);
    625 
    626 	err = do_dump(drv, 0xff, mka_sci_u64(&sa->sc->sci), sa->an,
    627 		      &sa->lowest_pn);
    628 	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: result %d", __func__,
    629 		   sa->lowest_pn);
    630 
    631 	return err;
    632 }
    633 
    634 
    635 /**
    636  * macsec_drv_get_transmit_next_pn - Get transmit next PN
    637  * @priv: Private driver interface data
    638  * @sa: secure association
    639  * Returns: 0 on success, -1 on failure (or if not supported)
    640  */
    641 static int macsec_drv_get_transmit_next_pn(void *priv, struct transmit_sa *sa)
    642 {
    643 	struct macsec_drv_data *drv = priv;
    644 	int err;
    645 
    646 	wpa_printf(MSG_DEBUG, "%s", __func__);
    647 
    648 	err = do_dump(drv, sa->an, UNUSED_SCI, 0xff, &sa->next_pn);
    649 	wpa_printf(MSG_DEBUG, DRV_PREFIX "%s: err %d result %d", __func__, err,
    650 		   sa->next_pn);
    651 	return err;
    652 }
    653 
    654 
    655 /**
    656  * macsec_drv_set_transmit_next_pn - Set transmit next pn
    657  * @priv: Private driver interface data
    658  * @sa: secure association
    659  * Returns: 0 on success, -1 on failure (or if not supported)
    660  */
    661 static int macsec_drv_set_transmit_next_pn(void *priv, struct transmit_sa *sa)
    662 {
    663 	struct macsec_drv_data *drv = priv;
    664 	struct macsec_genl_ctx *ctx = &drv->ctx;
    665 	struct nl_msg *msg;
    666 	struct nlattr *nest;
    667 	int ret = -1;
    668 
    669 	wpa_printf(MSG_DEBUG, "%s -> %d: %d", __func__, sa->an, sa->next_pn);
    670 
    671 	msg = msg_prepare(MACSEC_CMD_UPD_TXSA, ctx, drv->ifi);
    672 	if (!msg)
    673 		return ret;
    674 
    675 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
    676 	if (!nest)
    677 		goto nla_put_failure;
    678 
    679 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, sa->an);
    680 	NLA_PUT_U32(msg, MACSEC_SA_ATTR_PN, sa->next_pn);
    681 
    682 	nla_nest_end(msg, nest);
    683 
    684 	ret = nl_send_recv(ctx->sk, msg);
    685 	if (ret < 0) {
    686 		wpa_printf(MSG_ERROR,
    687 			   DRV_PREFIX "failed to communicate: %d (%s)",
    688 			   ret, nl_geterror(-ret));
    689 	}
    690 
    691 nla_put_failure:
    692 	nlmsg_free(msg);
    693 	return ret;
    694 }
    695 
    696 
    697 #define SCISTR MACSTR "::%hx"
    698 #define SCI2STR(addr, port) MAC2STR(addr), htons(port)
    699 
    700 /**
    701  * macsec_drv_create_receive_sc - Create secure channel for receiving
    702  * @priv: Private driver interface data
    703  * @sc: secure channel
    704  * @sci_addr: secure channel identifier - address
    705  * @sci_port: secure channel identifier - port
    706  * @conf_offset: confidentiality offset (0, 30, or 50)
    707  * @validation: frame validation policy (0 = Disabled, 1 = Checked,
    708  *	2 = Strict)
    709  * Returns: 0 on success, -1 on failure (or if not supported)
    710  */
    711 static int macsec_drv_create_receive_sc(void *priv, struct receive_sc *sc,
    712 					unsigned int conf_offset,
    713 					int validation)
    714 {
    715 	struct macsec_drv_data *drv = priv;
    716 	struct macsec_genl_ctx *ctx = &drv->ctx;
    717 	struct nl_msg *msg;
    718 	int ret = -1;
    719 
    720 	wpa_printf(MSG_DEBUG, "%s -> " SCISTR, __func__,
    721 		   SCI2STR(sc->sci.addr, sc->sci.port));
    722 
    723 	msg = msg_prepare(MACSEC_CMD_ADD_RXSC, ctx, drv->ifi);
    724 	if (!msg)
    725 		return ret;
    726 
    727 	if (nla_put_rxsc_config(msg, mka_sci_u64(&sc->sci)))
    728 		goto nla_put_failure;
    729 
    730 	ret = nl_send_recv(ctx->sk, msg);
    731 	if (ret < 0) {
    732 		wpa_printf(MSG_ERROR,
    733 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
    734 			   __func__, ret, nl_geterror(-ret));
    735 	}
    736 
    737 nla_put_failure:
    738 	nlmsg_free(msg);
    739 	return ret;
    740 }
    741 
    742 
    743 /**
    744  * macsec_drv_delete_receive_sc - Delete secure connection for receiving
    745  * @priv: private driver interface data from init()
    746  * @sc: secure channel
    747  * Returns: 0 on success, -1 on failure
    748  */
    749 static int macsec_drv_delete_receive_sc(void *priv, struct receive_sc *sc)
    750 {
    751 	struct macsec_drv_data *drv = priv;
    752 	struct macsec_genl_ctx *ctx = &drv->ctx;
    753 	struct nl_msg *msg;
    754 	int ret = -1;
    755 
    756 	wpa_printf(MSG_DEBUG, "%s -> " SCISTR, __func__,
    757 		   SCI2STR(sc->sci.addr, sc->sci.port));
    758 
    759 	msg = msg_prepare(MACSEC_CMD_DEL_RXSC, ctx, drv->ifi);
    760 	if (!msg)
    761 		return ret;
    762 
    763 	if (nla_put_rxsc_config(msg, mka_sci_u64(&sc->sci)))
    764 		goto nla_put_failure;
    765 
    766 	ret = nl_send_recv(ctx->sk, msg);
    767 	if (ret < 0) {
    768 		wpa_printf(MSG_ERROR,
    769 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
    770 			   __func__, ret, nl_geterror(-ret));
    771 	}
    772 
    773 nla_put_failure:
    774 	nlmsg_free(msg);
    775 	return ret;
    776 }
    777 
    778 
    779 /**
    780  * macsec_drv_create_receive_sa - Create secure association for receive
    781  * @priv: private driver interface data from init()
    782  * @sa: secure association
    783  * Returns: 0 on success, -1 on failure
    784  */
    785 static int macsec_drv_create_receive_sa(void *priv, struct receive_sa *sa)
    786 {
    787 	struct macsec_drv_data *drv = priv;
    788 	struct macsec_genl_ctx *ctx = &drv->ctx;
    789 	struct nl_msg *msg;
    790 	struct nlattr *nest;
    791 	int ret = -1;
    792 
    793 	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
    794 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
    795 
    796 	msg = msg_prepare(MACSEC_CMD_ADD_RXSA, ctx, drv->ifi);
    797 	if (!msg)
    798 		return ret;
    799 
    800 	if (nla_put_rxsc_config(msg, mka_sci_u64(&sa->sc->sci)))
    801 		goto nla_put_failure;
    802 
    803 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
    804 	if (!nest)
    805 		goto nla_put_failure;
    806 
    807 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, sa->an);
    808 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_ACTIVE, sa->enable_receive);
    809 	NLA_PUT_U32(msg, MACSEC_SA_ATTR_PN, sa->next_pn);
    810 	NLA_PUT(msg, MACSEC_SA_ATTR_KEYID, sizeof(sa->pkey->key_identifier),
    811 		&sa->pkey->key_identifier);
    812 	NLA_PUT(msg, MACSEC_SA_ATTR_KEY, sa->pkey->key_len, sa->pkey->key);
    813 
    814 	nla_nest_end(msg, nest);
    815 
    816 	ret = nl_send_recv(ctx->sk, msg);
    817 	if (ret < 0) {
    818 		wpa_printf(MSG_ERROR,
    819 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
    820 			   __func__, ret, nl_geterror(-ret));
    821 	}
    822 
    823 nla_put_failure:
    824 	nlmsg_free(msg);
    825 	return ret;
    826 }
    827 
    828 
    829 /**
    830  * macsec_drv_delete_receive_sa - Delete secure association for receive
    831  * @priv: private driver interface data from init()
    832  * @sa: secure association
    833  * Returns: 0 on success, -1 on failure
    834  */
    835 static int macsec_drv_delete_receive_sa(void *priv, struct receive_sa *sa)
    836 {
    837 	struct macsec_drv_data *drv = priv;
    838 	struct macsec_genl_ctx *ctx = &drv->ctx;
    839 	struct nl_msg *msg;
    840 	struct nlattr *nest;
    841 	int ret = -1;
    842 
    843 	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
    844 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
    845 
    846 	msg = msg_prepare(MACSEC_CMD_DEL_RXSA, ctx, drv->ifi);
    847 	if (!msg)
    848 		return ret;
    849 
    850 	if (nla_put_rxsc_config(msg, mka_sci_u64(&sa->sc->sci)))
    851 		goto nla_put_failure;
    852 
    853 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
    854 	if (!nest)
    855 		goto nla_put_failure;
    856 
    857 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, sa->an);
    858 
    859 	nla_nest_end(msg, nest);
    860 
    861 	ret = nl_send_recv(ctx->sk, msg);
    862 	if (ret < 0) {
    863 		wpa_printf(MSG_ERROR,
    864 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
    865 			   __func__, ret, nl_geterror(-ret));
    866 	}
    867 
    868 nla_put_failure:
    869 	nlmsg_free(msg);
    870 	return ret;
    871 }
    872 
    873 
    874 static int set_active_rx_sa(const struct macsec_genl_ctx *ctx, int ifindex,
    875 			    u64 sci, unsigned char an, Boolean state)
    876 {
    877 	struct nl_msg *msg;
    878 	struct nlattr *nest;
    879 	int ret = -1;
    880 
    881 	msg = msg_prepare(MACSEC_CMD_UPD_RXSA, ctx, ifindex);
    882 	if (!msg)
    883 		return ret;
    884 
    885 	if (nla_put_rxsc_config(msg, sci))
    886 		goto nla_put_failure;
    887 
    888 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
    889 	if (!nest)
    890 		goto nla_put_failure;
    891 
    892 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, an);
    893 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_ACTIVE, !!state);
    894 
    895 	nla_nest_end(msg, nest);
    896 
    897 	ret = nl_send_recv(ctx->sk, msg);
    898 	if (ret < 0)
    899 		wpa_printf(MSG_ERROR,
    900 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
    901 			   __func__, ret, nl_geterror(-ret));
    902 
    903 nla_put_failure:
    904 	nlmsg_free(msg);
    905 	return ret;
    906 }
    907 
    908 
    909 /**
    910  * macsec_drv_enable_receive_sa - Enable the SA for receive
    911  * @priv: private driver interface data from init()
    912  * @sa: secure association
    913  * Returns: 0 on success, -1 on failure
    914  */
    915 static int macsec_drv_enable_receive_sa(void *priv, struct receive_sa *sa)
    916 {
    917 	struct macsec_drv_data *drv = priv;
    918 	struct macsec_genl_ctx *ctx = &drv->ctx;
    919 
    920 	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
    921 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
    922 
    923 	return set_active_rx_sa(ctx, drv->ifi, mka_sci_u64(&sa->sc->sci),
    924 				sa->an, TRUE);
    925 }
    926 
    927 
    928 /**
    929  * macsec_drv_disable_receive_sa - Disable SA for receive
    930  * @priv: private driver interface data from init()
    931  * @sa: secure association
    932  * Returns: 0 on success, -1 on failure
    933  */
    934 static int macsec_drv_disable_receive_sa(void *priv, struct receive_sa *sa)
    935 {
    936 	struct macsec_drv_data *drv = priv;
    937 	struct macsec_genl_ctx *ctx = &drv->ctx;
    938 
    939 	wpa_printf(MSG_DEBUG, "%s -> %d on " SCISTR, __func__, sa->an,
    940 		   SCI2STR(sa->sc->sci.addr, sa->sc->sci.port));
    941 
    942 	return set_active_rx_sa(ctx, drv->ifi, mka_sci_u64(&sa->sc->sci),
    943 				sa->an, FALSE);
    944 }
    945 
    946 
    947 static struct rtnl_link * lookup_sc(struct nl_cache *cache, int parent, u64 sci)
    948 {
    949 	struct rtnl_link *needle;
    950 	void *match;
    951 
    952 	needle = rtnl_link_macsec_alloc();
    953 	if (!needle)
    954 		return NULL;
    955 
    956 	rtnl_link_set_link(needle, parent);
    957 	rtnl_link_macsec_set_sci(needle, sci);
    958 
    959 	match = nl_cache_find(cache, (struct nl_object *) needle);
    960 	rtnl_link_put(needle);
    961 
    962 	return (struct rtnl_link *) match;
    963 }
    964 
    965 
    966 /**
    967  * macsec_drv_create_transmit_sc - Create secure connection for transmit
    968  * @priv: private driver interface data from init()
    969  * @sc: secure channel
    970  * @conf_offset: confidentiality offset
    971  * Returns: 0 on success, -1 on failure
    972  */
    973 static int macsec_drv_create_transmit_sc(
    974 	void *priv, struct transmit_sc *sc,
    975 	enum confidentiality_offset conf_offset)
    976 {
    977 	struct macsec_drv_data *drv = priv;
    978 	struct rtnl_link *link;
    979 	char *ifname;
    980 	u64 sci;
    981 	int err;
    982 
    983 	wpa_printf(MSG_DEBUG, "%s", __func__);
    984 
    985 	link = rtnl_link_macsec_alloc();
    986 	if (!link) {
    987 		wpa_printf(MSG_ERROR, DRV_PREFIX "couldn't allocate link");
    988 		return -1;
    989 	}
    990 
    991 	rtnl_link_set_link(link, drv->parent_ifi);
    992 
    993 	sci = mka_sci_u64(&sc->sci);
    994 	rtnl_link_macsec_set_sci(link, sci);
    995 
    996 	drv->created_link = TRUE;
    997 
    998 	err = rtnl_link_add(drv->sk, link, NLM_F_CREATE);
    999 	if (err == -NLE_BUSY) {
   1000 		wpa_printf(MSG_INFO,
   1001 			   DRV_PREFIX "link already exists, using it");
   1002 		drv->created_link = FALSE;
   1003 	} else if (err < 0) {
   1004 		rtnl_link_put(link);
   1005 		wpa_printf(MSG_ERROR, DRV_PREFIX "couldn't create link: err %d",
   1006 			   err);
   1007 		return err;
   1008 	}
   1009 
   1010 	rtnl_link_put(link);
   1011 
   1012 	nl_cache_refill(drv->sk, drv->link_cache);
   1013 	link = lookup_sc(drv->link_cache, drv->parent_ifi, sci);
   1014 	if (!link) {
   1015 		wpa_printf(MSG_ERROR, DRV_PREFIX "couldn't find link");
   1016 		return -1;
   1017 	}
   1018 
   1019 	drv->ifi = rtnl_link_get_ifindex(link);
   1020 	ifname = rtnl_link_get_name(link);
   1021 	os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
   1022 	rtnl_link_put(link);
   1023 
   1024 	drv->link = rtnl_link_macsec_alloc();
   1025 	if (!drv->link) {
   1026 		wpa_printf(MSG_ERROR, DRV_PREFIX "couldn't allocate link");
   1027 		return -1;
   1028 	}
   1029 
   1030 	rtnl_link_set_name(drv->link, drv->ifname);
   1031 
   1032 	/* In case some settings have already been done but we couldn't apply
   1033 	 * them. */
   1034 	return try_commit(drv);
   1035 }
   1036 
   1037 
   1038 /**
   1039  * macsec_drv_delete_transmit_sc - Delete secure connection for transmit
   1040  * @priv: private driver interface data from init()
   1041  * @sc: secure channel
   1042  * Returns: 0 on success, -1 on failure
   1043  */
   1044 static int macsec_drv_delete_transmit_sc(void *priv, struct transmit_sc *sc)
   1045 {
   1046 	struct macsec_drv_data *drv = priv;
   1047 	int err;
   1048 
   1049 	wpa_printf(MSG_DEBUG, "%s", __func__);
   1050 
   1051 	if (!drv->created_link) {
   1052 		rtnl_link_put(drv->link);
   1053 		drv->link = NULL;
   1054 		wpa_printf(MSG_DEBUG, DRV_PREFIX
   1055 			   "we didn't create the link, leave it alone");
   1056 		return 0;
   1057 	}
   1058 
   1059 	err = rtnl_link_delete(drv->sk, drv->link);
   1060 	if (err < 0)
   1061 		wpa_printf(MSG_ERROR, DRV_PREFIX "couldn't delete link");
   1062 	rtnl_link_put(drv->link);
   1063 	drv->link = NULL;
   1064 
   1065 	return err;
   1066 }
   1067 
   1068 
   1069 /**
   1070  * macsec_drv_create_transmit_sa - Create secure association for transmit
   1071  * @priv: private driver interface data from init()
   1072  * @sa: secure association
   1073  * Returns: 0 on success, -1 on failure
   1074  */
   1075 static int macsec_drv_create_transmit_sa(void *priv, struct transmit_sa *sa)
   1076 {
   1077 	struct macsec_drv_data *drv = priv;
   1078 	struct macsec_genl_ctx *ctx = &drv->ctx;
   1079 	struct nl_msg *msg;
   1080 	struct nlattr *nest;
   1081 	int ret = -1;
   1082 
   1083 	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
   1084 
   1085 	msg = msg_prepare(MACSEC_CMD_ADD_TXSA, ctx, drv->ifi);
   1086 	if (!msg)
   1087 		return ret;
   1088 
   1089 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
   1090 	if (!nest)
   1091 		goto nla_put_failure;
   1092 
   1093 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, sa->an);
   1094 	NLA_PUT_U32(msg, MACSEC_SA_ATTR_PN, sa->next_pn);
   1095 	NLA_PUT(msg, MACSEC_SA_ATTR_KEYID, sizeof(sa->pkey->key_identifier),
   1096 		&sa->pkey->key_identifier);
   1097 	NLA_PUT(msg, MACSEC_SA_ATTR_KEY, sa->pkey->key_len, sa->pkey->key);
   1098 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_ACTIVE, sa->enable_transmit);
   1099 
   1100 	nla_nest_end(msg, nest);
   1101 
   1102 	ret = nl_send_recv(ctx->sk, msg);
   1103 	if (ret < 0) {
   1104 		wpa_printf(MSG_ERROR,
   1105 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
   1106 			   __func__, ret, nl_geterror(-ret));
   1107 	}
   1108 
   1109 nla_put_failure:
   1110 	nlmsg_free(msg);
   1111 	return ret;
   1112 }
   1113 
   1114 
   1115 /**
   1116  * macsec_drv_delete_transmit_sa - Delete secure association for transmit
   1117  * @priv: private driver interface data from init()
   1118  * @sa: secure association
   1119  * Returns: 0 on success, -1 on failure
   1120  */
   1121 static int macsec_drv_delete_transmit_sa(void *priv, struct transmit_sa *sa)
   1122 {
   1123 	struct macsec_drv_data *drv = priv;
   1124 	struct macsec_genl_ctx *ctx = &drv->ctx;
   1125 	struct nl_msg *msg;
   1126 	struct nlattr *nest;
   1127 	int ret = -1;
   1128 
   1129 	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
   1130 
   1131 	msg = msg_prepare(MACSEC_CMD_DEL_TXSA, ctx, drv->ifi);
   1132 	if (!msg)
   1133 		return ret;
   1134 
   1135 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
   1136 	if (!nest)
   1137 		goto nla_put_failure;
   1138 
   1139 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, sa->an);
   1140 
   1141 	nla_nest_end(msg, nest);
   1142 
   1143 	ret = nl_send_recv(ctx->sk, msg);
   1144 	if (ret < 0) {
   1145 		wpa_printf(MSG_ERROR,
   1146 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
   1147 			   __func__, ret, nl_geterror(-ret));
   1148 	}
   1149 
   1150 nla_put_failure:
   1151 	nlmsg_free(msg);
   1152 	return ret;
   1153 }
   1154 
   1155 
   1156 static int set_active_tx_sa(const struct macsec_genl_ctx *ctx, int ifindex,
   1157 			    unsigned char an, Boolean state)
   1158 {
   1159 	struct nl_msg *msg;
   1160 	struct nlattr *nest;
   1161 	int ret = -1;
   1162 
   1163 	msg = msg_prepare(MACSEC_CMD_UPD_TXSA, ctx, ifindex);
   1164 	if (!msg)
   1165 		return ret;
   1166 
   1167 	nest = nla_nest_start(msg, MACSEC_ATTR_SA_CONFIG);
   1168 	if (!nest)
   1169 		goto nla_put_failure;
   1170 
   1171 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_AN, an);
   1172 	NLA_PUT_U8(msg, MACSEC_SA_ATTR_ACTIVE, !!state);
   1173 
   1174 	nla_nest_end(msg, nest);
   1175 
   1176 	ret = nl_send_recv(ctx->sk, msg);
   1177 	if (ret < 0) {
   1178 		wpa_printf(MSG_ERROR,
   1179 			   DRV_PREFIX "%s: failed to communicate: %d (%s)",
   1180 			   __func__, ret, nl_geterror(-ret));
   1181 	}
   1182 
   1183 nla_put_failure:
   1184 	nlmsg_free(msg);
   1185 	return ret;
   1186 }
   1187 
   1188 
   1189 /**
   1190  * macsec_drv_enable_transmit_sa - Enable SA for transmit
   1191  * @priv: private driver interface data from init()
   1192  * @sa: secure association
   1193  * Returns: 0 on success, -1 on failure
   1194  */
   1195 static int macsec_drv_enable_transmit_sa(void *priv, struct transmit_sa *sa)
   1196 {
   1197 	struct macsec_drv_data *drv = priv;
   1198 	struct macsec_genl_ctx *ctx = &drv->ctx;
   1199 	int ret;
   1200 
   1201 	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
   1202 
   1203 	ret = set_active_tx_sa(ctx, drv->ifi, sa->an, TRUE);
   1204 	if (ret < 0) {
   1205 		wpa_printf(MSG_ERROR, DRV_PREFIX "failed to enable txsa");
   1206 		return ret;
   1207 	}
   1208 
   1209 	drv->encoding_sa_set = TRUE;
   1210 	drv->encoding_sa = sa->an;
   1211 
   1212 	return try_commit(drv);
   1213 }
   1214 
   1215 
   1216 /**
   1217  * macsec_drv_disable_transmit_sa - Disable SA for transmit
   1218  * @priv: private driver interface data from init()
   1219  * @sa: secure association
   1220  * Returns: 0 on success, -1 on failure
   1221  */
   1222 static int macsec_drv_disable_transmit_sa(void *priv, struct transmit_sa *sa)
   1223 {
   1224 	struct macsec_drv_data *drv = priv;
   1225 	struct macsec_genl_ctx *ctx = &drv->ctx;
   1226 
   1227 	wpa_printf(MSG_DEBUG, "%s -> %d", __func__, sa->an);
   1228 
   1229 	return set_active_tx_sa(ctx, drv->ifi, sa->an, FALSE);
   1230 }
   1231 
   1232 
   1233 const struct wpa_driver_ops wpa_driver_macsec_linux_ops = {
   1234 	.name = "macsec_linux",
   1235 	.desc = "MACsec Ethernet driver for Linux",
   1236 	.get_ssid = driver_wired_get_ssid,
   1237 	.get_bssid = driver_wired_get_bssid,
   1238 	.get_capa = driver_wired_get_capa,
   1239 	.init = macsec_drv_wpa_init,
   1240 	.deinit = macsec_drv_wpa_deinit,
   1241 
   1242 	.macsec_init = macsec_drv_macsec_init,
   1243 	.macsec_deinit = macsec_drv_macsec_deinit,
   1244 	.macsec_get_capability = macsec_drv_get_capability,
   1245 	.enable_protect_frames = macsec_drv_enable_protect_frames,
   1246 	.enable_encrypt = macsec_drv_enable_encrypt,
   1247 	.set_replay_protect = macsec_drv_set_replay_protect,
   1248 	.set_current_cipher_suite = macsec_drv_set_current_cipher_suite,
   1249 	.enable_controlled_port = macsec_drv_enable_controlled_port,
   1250 	.get_receive_lowest_pn = macsec_drv_get_receive_lowest_pn,
   1251 	.get_transmit_next_pn = macsec_drv_get_transmit_next_pn,
   1252 	.set_transmit_next_pn = macsec_drv_set_transmit_next_pn,
   1253 	.create_receive_sc = macsec_drv_create_receive_sc,
   1254 	.delete_receive_sc = macsec_drv_delete_receive_sc,
   1255 	.create_receive_sa = macsec_drv_create_receive_sa,
   1256 	.delete_receive_sa = macsec_drv_delete_receive_sa,
   1257 	.enable_receive_sa = macsec_drv_enable_receive_sa,
   1258 	.disable_receive_sa = macsec_drv_disable_receive_sa,
   1259 	.create_transmit_sc = macsec_drv_create_transmit_sc,
   1260 	.delete_transmit_sc = macsec_drv_delete_transmit_sc,
   1261 	.create_transmit_sa = macsec_drv_create_transmit_sa,
   1262 	.delete_transmit_sa = macsec_drv_delete_transmit_sa,
   1263 	.enable_transmit_sa = macsec_drv_enable_transmit_sa,
   1264 	.disable_transmit_sa = macsec_drv_disable_transmit_sa,
   1265 };
   1266