xref: /linux-6.15/drivers/net/netdevsim/macsec.c (revision 1a629afd)
102b34d03SSabrina Dubroca // SPDX-License-Identifier: GPL-2.0
202b34d03SSabrina Dubroca 
302b34d03SSabrina Dubroca #include <net/macsec.h>
402b34d03SSabrina Dubroca #include "netdevsim.h"
502b34d03SSabrina Dubroca 
nsim_macsec_find_secy(struct netdevsim * ns,sci_t sci)602b34d03SSabrina Dubroca static int nsim_macsec_find_secy(struct netdevsim *ns, sci_t sci)
702b34d03SSabrina Dubroca {
802b34d03SSabrina Dubroca 	int i;
902b34d03SSabrina Dubroca 
1002b34d03SSabrina Dubroca 	for (i = 0; i < NSIM_MACSEC_MAX_SECY_COUNT; i++) {
1102b34d03SSabrina Dubroca 		if (ns->macsec.nsim_secy[i].sci == sci)
1202b34d03SSabrina Dubroca 			return i;
1302b34d03SSabrina Dubroca 	}
1402b34d03SSabrina Dubroca 
1502b34d03SSabrina Dubroca 	return -1;
1602b34d03SSabrina Dubroca }
1702b34d03SSabrina Dubroca 
nsim_macsec_find_rxsc(struct nsim_secy * ns_secy,sci_t sci)1802b34d03SSabrina Dubroca static int nsim_macsec_find_rxsc(struct nsim_secy *ns_secy, sci_t sci)
1902b34d03SSabrina Dubroca {
2002b34d03SSabrina Dubroca 	int i;
2102b34d03SSabrina Dubroca 
2202b34d03SSabrina Dubroca 	for (i = 0; i < NSIM_MACSEC_MAX_RXSC_COUNT; i++) {
2302b34d03SSabrina Dubroca 		if (ns_secy->nsim_rxsc[i].sci == sci)
2402b34d03SSabrina Dubroca 			return i;
2502b34d03SSabrina Dubroca 	}
2602b34d03SSabrina Dubroca 
2702b34d03SSabrina Dubroca 	return -1;
2802b34d03SSabrina Dubroca }
2902b34d03SSabrina Dubroca 
nsim_macsec_add_secy(struct macsec_context * ctx)3002b34d03SSabrina Dubroca static int nsim_macsec_add_secy(struct macsec_context *ctx)
3102b34d03SSabrina Dubroca {
3202b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
3302b34d03SSabrina Dubroca 	int idx;
3402b34d03SSabrina Dubroca 
3502b34d03SSabrina Dubroca 	if (ns->macsec.nsim_secy_count == NSIM_MACSEC_MAX_SECY_COUNT)
3602b34d03SSabrina Dubroca 		return -ENOSPC;
3702b34d03SSabrina Dubroca 
3802b34d03SSabrina Dubroca 	for (idx = 0; idx < NSIM_MACSEC_MAX_SECY_COUNT; idx++) {
3902b34d03SSabrina Dubroca 		if (!ns->macsec.nsim_secy[idx].used)
4002b34d03SSabrina Dubroca 			break;
4102b34d03SSabrina Dubroca 	}
4202b34d03SSabrina Dubroca 
4302b34d03SSabrina Dubroca 	if (idx == NSIM_MACSEC_MAX_SECY_COUNT) {
4402b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: nsim_secy_count not full but all SecYs used\n",
4502b34d03SSabrina Dubroca 			   __func__);
4602b34d03SSabrina Dubroca 		return -ENOSPC;
4702b34d03SSabrina Dubroca 	}
4802b34d03SSabrina Dubroca 
49*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: adding new secy with sci %016llx at index %d\n",
5002b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), idx);
5102b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].used = true;
5202b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].nsim_rxsc_count = 0;
5302b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].sci = ctx->secy->sci;
5402b34d03SSabrina Dubroca 	ns->macsec.nsim_secy_count++;
5502b34d03SSabrina Dubroca 
5602b34d03SSabrina Dubroca 	return 0;
5702b34d03SSabrina Dubroca }
5802b34d03SSabrina Dubroca 
nsim_macsec_upd_secy(struct macsec_context * ctx)5902b34d03SSabrina Dubroca static int nsim_macsec_upd_secy(struct macsec_context *ctx)
6002b34d03SSabrina Dubroca {
6102b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
6202b34d03SSabrina Dubroca 	int idx;
6302b34d03SSabrina Dubroca 
6402b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
6502b34d03SSabrina Dubroca 	if (idx < 0) {
66*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
6702b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
6802b34d03SSabrina Dubroca 		return -ENOENT;
6902b34d03SSabrina Dubroca 	}
7002b34d03SSabrina Dubroca 
71*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: updating secy with sci %016llx at index %d\n",
7202b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), idx);
7302b34d03SSabrina Dubroca 
7402b34d03SSabrina Dubroca 	return 0;
7502b34d03SSabrina Dubroca }
7602b34d03SSabrina Dubroca 
nsim_macsec_del_secy(struct macsec_context * ctx)7702b34d03SSabrina Dubroca static int nsim_macsec_del_secy(struct macsec_context *ctx)
7802b34d03SSabrina Dubroca {
7902b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
8002b34d03SSabrina Dubroca 	int idx;
8102b34d03SSabrina Dubroca 
8202b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
8302b34d03SSabrina Dubroca 	if (idx < 0) {
84*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
8502b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
8602b34d03SSabrina Dubroca 		return -ENOENT;
8702b34d03SSabrina Dubroca 	}
8802b34d03SSabrina Dubroca 
89*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: removing SecY with SCI %016llx at index %d\n",
9002b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), idx);
9102b34d03SSabrina Dubroca 
9202b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].used = false;
9302b34d03SSabrina Dubroca 	memset(&ns->macsec.nsim_secy[idx], 0, sizeof(ns->macsec.nsim_secy[idx]));
9402b34d03SSabrina Dubroca 	ns->macsec.nsim_secy_count--;
9502b34d03SSabrina Dubroca 
9602b34d03SSabrina Dubroca 	return 0;
9702b34d03SSabrina Dubroca }
9802b34d03SSabrina Dubroca 
nsim_macsec_add_rxsc(struct macsec_context * ctx)9902b34d03SSabrina Dubroca static int nsim_macsec_add_rxsc(struct macsec_context *ctx)
10002b34d03SSabrina Dubroca {
10102b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
10202b34d03SSabrina Dubroca 	struct nsim_secy *secy;
10302b34d03SSabrina Dubroca 	int idx;
10402b34d03SSabrina Dubroca 
10502b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
10602b34d03SSabrina Dubroca 	if (idx < 0) {
107*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
10802b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
10902b34d03SSabrina Dubroca 		return -ENOENT;
11002b34d03SSabrina Dubroca 	}
11102b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
11202b34d03SSabrina Dubroca 
11302b34d03SSabrina Dubroca 	if (secy->nsim_rxsc_count == NSIM_MACSEC_MAX_RXSC_COUNT)
11402b34d03SSabrina Dubroca 		return -ENOSPC;
11502b34d03SSabrina Dubroca 
11602b34d03SSabrina Dubroca 	for (idx = 0; idx < NSIM_MACSEC_MAX_RXSC_COUNT; idx++) {
11702b34d03SSabrina Dubroca 		if (!secy->nsim_rxsc[idx].used)
11802b34d03SSabrina Dubroca 			break;
11902b34d03SSabrina Dubroca 	}
12002b34d03SSabrina Dubroca 
12102b34d03SSabrina Dubroca 	if (idx == NSIM_MACSEC_MAX_RXSC_COUNT)
12202b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: nsim_rxsc_count not full but all RXSCs used\n",
12302b34d03SSabrina Dubroca 			   __func__);
12402b34d03SSabrina Dubroca 
125*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: adding new rxsc with sci %016llx at index %d\n",
12602b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->rx_sc->sci), idx);
12702b34d03SSabrina Dubroca 	secy->nsim_rxsc[idx].used = true;
12802b34d03SSabrina Dubroca 	secy->nsim_rxsc[idx].sci = ctx->rx_sc->sci;
12902b34d03SSabrina Dubroca 	secy->nsim_rxsc_count++;
13002b34d03SSabrina Dubroca 
13102b34d03SSabrina Dubroca 	return 0;
13202b34d03SSabrina Dubroca }
13302b34d03SSabrina Dubroca 
nsim_macsec_upd_rxsc(struct macsec_context * ctx)13402b34d03SSabrina Dubroca static int nsim_macsec_upd_rxsc(struct macsec_context *ctx)
13502b34d03SSabrina Dubroca {
13602b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
13702b34d03SSabrina Dubroca 	struct nsim_secy *secy;
13802b34d03SSabrina Dubroca 	int idx;
13902b34d03SSabrina Dubroca 
14002b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
14102b34d03SSabrina Dubroca 	if (idx < 0) {
142*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
14302b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
14402b34d03SSabrina Dubroca 		return -ENOENT;
14502b34d03SSabrina Dubroca 	}
14602b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
14702b34d03SSabrina Dubroca 
14802b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->rx_sc->sci);
14902b34d03SSabrina Dubroca 	if (idx < 0) {
150*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in RXSC table\n",
15102b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->rx_sc->sci));
15202b34d03SSabrina Dubroca 		return -ENOENT;
15302b34d03SSabrina Dubroca 	}
15402b34d03SSabrina Dubroca 
155*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: updating RXSC with sci %016llx at index %d\n",
15602b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->rx_sc->sci), idx);
15702b34d03SSabrina Dubroca 
15802b34d03SSabrina Dubroca 	return 0;
15902b34d03SSabrina Dubroca }
16002b34d03SSabrina Dubroca 
nsim_macsec_del_rxsc(struct macsec_context * ctx)16102b34d03SSabrina Dubroca static int nsim_macsec_del_rxsc(struct macsec_context *ctx)
16202b34d03SSabrina Dubroca {
16302b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
16402b34d03SSabrina Dubroca 	struct nsim_secy *secy;
16502b34d03SSabrina Dubroca 	int idx;
16602b34d03SSabrina Dubroca 
16702b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
16802b34d03SSabrina Dubroca 	if (idx < 0) {
169*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
17002b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
17102b34d03SSabrina Dubroca 		return -ENOENT;
17202b34d03SSabrina Dubroca 	}
17302b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
17402b34d03SSabrina Dubroca 
17502b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->rx_sc->sci);
17602b34d03SSabrina Dubroca 	if (idx < 0) {
177*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in RXSC table\n",
17802b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->rx_sc->sci));
17902b34d03SSabrina Dubroca 		return -ENOENT;
18002b34d03SSabrina Dubroca 	}
18102b34d03SSabrina Dubroca 
182*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: removing RXSC with sci %016llx at index %d\n",
18302b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->rx_sc->sci), idx);
18402b34d03SSabrina Dubroca 
18502b34d03SSabrina Dubroca 	secy->nsim_rxsc[idx].used = false;
18602b34d03SSabrina Dubroca 	memset(&secy->nsim_rxsc[idx], 0, sizeof(secy->nsim_rxsc[idx]));
18702b34d03SSabrina Dubroca 	secy->nsim_rxsc_count--;
18802b34d03SSabrina Dubroca 
18902b34d03SSabrina Dubroca 	return 0;
19002b34d03SSabrina Dubroca }
19102b34d03SSabrina Dubroca 
nsim_macsec_add_rxsa(struct macsec_context * ctx)19202b34d03SSabrina Dubroca static int nsim_macsec_add_rxsa(struct macsec_context *ctx)
19302b34d03SSabrina Dubroca {
19402b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
19502b34d03SSabrina Dubroca 	struct nsim_secy *secy;
19602b34d03SSabrina Dubroca 	int idx;
19702b34d03SSabrina Dubroca 
19802b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
19902b34d03SSabrina Dubroca 	if (idx < 0) {
200*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
20102b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
20202b34d03SSabrina Dubroca 		return -ENOENT;
20302b34d03SSabrina Dubroca 	}
20402b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
20502b34d03SSabrina Dubroca 
20602b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci);
20702b34d03SSabrina Dubroca 	if (idx < 0) {
208*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in RXSC table\n",
20902b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci));
21002b34d03SSabrina Dubroca 		return -ENOENT;
21102b34d03SSabrina Dubroca 	}
21202b34d03SSabrina Dubroca 
213*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: RXSC with sci %016llx, AN %u\n",
21402b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num);
21502b34d03SSabrina Dubroca 
21602b34d03SSabrina Dubroca 	return 0;
21702b34d03SSabrina Dubroca }
21802b34d03SSabrina Dubroca 
nsim_macsec_upd_rxsa(struct macsec_context * ctx)21902b34d03SSabrina Dubroca static int nsim_macsec_upd_rxsa(struct macsec_context *ctx)
22002b34d03SSabrina Dubroca {
22102b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
22202b34d03SSabrina Dubroca 	struct nsim_secy *secy;
22302b34d03SSabrina Dubroca 	int idx;
22402b34d03SSabrina Dubroca 
22502b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
22602b34d03SSabrina Dubroca 	if (idx < 0) {
227*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
22802b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
22902b34d03SSabrina Dubroca 		return -ENOENT;
23002b34d03SSabrina Dubroca 	}
23102b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
23202b34d03SSabrina Dubroca 
23302b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci);
23402b34d03SSabrina Dubroca 	if (idx < 0) {
235*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in RXSC table\n",
23602b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci));
23702b34d03SSabrina Dubroca 		return -ENOENT;
23802b34d03SSabrina Dubroca 	}
23902b34d03SSabrina Dubroca 
240*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: RXSC with sci %016llx, AN %u\n",
24102b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num);
24202b34d03SSabrina Dubroca 
24302b34d03SSabrina Dubroca 	return 0;
24402b34d03SSabrina Dubroca }
24502b34d03SSabrina Dubroca 
nsim_macsec_del_rxsa(struct macsec_context * ctx)24602b34d03SSabrina Dubroca static int nsim_macsec_del_rxsa(struct macsec_context *ctx)
24702b34d03SSabrina Dubroca {
24802b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
24902b34d03SSabrina Dubroca 	struct nsim_secy *secy;
25002b34d03SSabrina Dubroca 	int idx;
25102b34d03SSabrina Dubroca 
25202b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
25302b34d03SSabrina Dubroca 	if (idx < 0) {
254*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
25502b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
25602b34d03SSabrina Dubroca 		return -ENOENT;
25702b34d03SSabrina Dubroca 	}
25802b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
25902b34d03SSabrina Dubroca 
26002b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci);
26102b34d03SSabrina Dubroca 	if (idx < 0) {
262*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in RXSC table\n",
26302b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci));
26402b34d03SSabrina Dubroca 		return -ENOENT;
26502b34d03SSabrina Dubroca 	}
26602b34d03SSabrina Dubroca 
267*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: RXSC with sci %016llx, AN %u\n",
26802b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num);
26902b34d03SSabrina Dubroca 
27002b34d03SSabrina Dubroca 	return 0;
27102b34d03SSabrina Dubroca }
27202b34d03SSabrina Dubroca 
nsim_macsec_add_txsa(struct macsec_context * ctx)27302b34d03SSabrina Dubroca static int nsim_macsec_add_txsa(struct macsec_context *ctx)
27402b34d03SSabrina Dubroca {
27502b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
27602b34d03SSabrina Dubroca 	int idx;
27702b34d03SSabrina Dubroca 
27802b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
27902b34d03SSabrina Dubroca 	if (idx < 0) {
280*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
28102b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
28202b34d03SSabrina Dubroca 		return -ENOENT;
28302b34d03SSabrina Dubroca 	}
28402b34d03SSabrina Dubroca 
285*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: SECY with sci %016llx, AN %u\n",
28602b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num);
28702b34d03SSabrina Dubroca 
28802b34d03SSabrina Dubroca 	return 0;
28902b34d03SSabrina Dubroca }
29002b34d03SSabrina Dubroca 
nsim_macsec_upd_txsa(struct macsec_context * ctx)29102b34d03SSabrina Dubroca static int nsim_macsec_upd_txsa(struct macsec_context *ctx)
29202b34d03SSabrina Dubroca {
29302b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
29402b34d03SSabrina Dubroca 	int idx;
29502b34d03SSabrina Dubroca 
29602b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
29702b34d03SSabrina Dubroca 	if (idx < 0) {
298*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
29902b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
30002b34d03SSabrina Dubroca 		return -ENOENT;
30102b34d03SSabrina Dubroca 	}
30202b34d03SSabrina Dubroca 
303*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: SECY with sci %016llx, AN %u\n",
30402b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num);
30502b34d03SSabrina Dubroca 
30602b34d03SSabrina Dubroca 	return 0;
30702b34d03SSabrina Dubroca }
30802b34d03SSabrina Dubroca 
nsim_macsec_del_txsa(struct macsec_context * ctx)30902b34d03SSabrina Dubroca static int nsim_macsec_del_txsa(struct macsec_context *ctx)
31002b34d03SSabrina Dubroca {
31102b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
31202b34d03SSabrina Dubroca 	int idx;
31302b34d03SSabrina Dubroca 
31402b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
31502b34d03SSabrina Dubroca 	if (idx < 0) {
316*1a629afdSAles Nezbeda 		netdev_err(ctx->netdev, "%s: sci %016llx not found in secy table\n",
31702b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
31802b34d03SSabrina Dubroca 		return -ENOENT;
31902b34d03SSabrina Dubroca 	}
32002b34d03SSabrina Dubroca 
321*1a629afdSAles Nezbeda 	netdev_dbg(ctx->netdev, "%s: SECY with sci %016llx, AN %u\n",
32202b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num);
32302b34d03SSabrina Dubroca 
32402b34d03SSabrina Dubroca 	return 0;
32502b34d03SSabrina Dubroca }
32602b34d03SSabrina Dubroca 
32702b34d03SSabrina Dubroca static const struct macsec_ops nsim_macsec_ops = {
32802b34d03SSabrina Dubroca 	.mdo_add_secy = nsim_macsec_add_secy,
32902b34d03SSabrina Dubroca 	.mdo_upd_secy = nsim_macsec_upd_secy,
33002b34d03SSabrina Dubroca 	.mdo_del_secy = nsim_macsec_del_secy,
33102b34d03SSabrina Dubroca 	.mdo_add_rxsc = nsim_macsec_add_rxsc,
33202b34d03SSabrina Dubroca 	.mdo_upd_rxsc = nsim_macsec_upd_rxsc,
33302b34d03SSabrina Dubroca 	.mdo_del_rxsc = nsim_macsec_del_rxsc,
33402b34d03SSabrina Dubroca 	.mdo_add_rxsa = nsim_macsec_add_rxsa,
33502b34d03SSabrina Dubroca 	.mdo_upd_rxsa = nsim_macsec_upd_rxsa,
33602b34d03SSabrina Dubroca 	.mdo_del_rxsa = nsim_macsec_del_rxsa,
33702b34d03SSabrina Dubroca 	.mdo_add_txsa = nsim_macsec_add_txsa,
33802b34d03SSabrina Dubroca 	.mdo_upd_txsa = nsim_macsec_upd_txsa,
33902b34d03SSabrina Dubroca 	.mdo_del_txsa = nsim_macsec_del_txsa,
34002b34d03SSabrina Dubroca };
34102b34d03SSabrina Dubroca 
nsim_macsec_init(struct netdevsim * ns)34202b34d03SSabrina Dubroca void nsim_macsec_init(struct netdevsim *ns)
34302b34d03SSabrina Dubroca {
34402b34d03SSabrina Dubroca 	ns->netdev->macsec_ops = &nsim_macsec_ops;
34502b34d03SSabrina Dubroca 	ns->netdev->features |= NETIF_F_HW_MACSEC;
34602b34d03SSabrina Dubroca 	memset(&ns->macsec, 0, sizeof(ns->macsec));
34702b34d03SSabrina Dubroca }
34802b34d03SSabrina Dubroca 
nsim_macsec_teardown(struct netdevsim * ns)34902b34d03SSabrina Dubroca void nsim_macsec_teardown(struct netdevsim *ns)
35002b34d03SSabrina Dubroca {
35102b34d03SSabrina Dubroca }
352