xref: /openbmc/linux/drivers/net/netdevsim/macsec.c (revision 02b34d03)
1*02b34d03SSabrina Dubroca // SPDX-License-Identifier: GPL-2.0
2*02b34d03SSabrina Dubroca 
3*02b34d03SSabrina Dubroca #include <net/macsec.h>
4*02b34d03SSabrina Dubroca #include "netdevsim.h"
5*02b34d03SSabrina Dubroca 
sci_to_cpu(sci_t sci)6*02b34d03SSabrina Dubroca static inline u64 sci_to_cpu(sci_t sci)
7*02b34d03SSabrina Dubroca {
8*02b34d03SSabrina Dubroca 	return be64_to_cpu((__force __be64)sci);
9*02b34d03SSabrina Dubroca }
10*02b34d03SSabrina Dubroca 
nsim_macsec_find_secy(struct netdevsim * ns,sci_t sci)11*02b34d03SSabrina Dubroca static int nsim_macsec_find_secy(struct netdevsim *ns, sci_t sci)
12*02b34d03SSabrina Dubroca {
13*02b34d03SSabrina Dubroca 	int i;
14*02b34d03SSabrina Dubroca 
15*02b34d03SSabrina Dubroca 	for (i = 0; i < NSIM_MACSEC_MAX_SECY_COUNT; i++) {
16*02b34d03SSabrina Dubroca 		if (ns->macsec.nsim_secy[i].sci == sci)
17*02b34d03SSabrina Dubroca 			return i;
18*02b34d03SSabrina Dubroca 	}
19*02b34d03SSabrina Dubroca 
20*02b34d03SSabrina Dubroca 	return -1;
21*02b34d03SSabrina Dubroca }
22*02b34d03SSabrina Dubroca 
nsim_macsec_find_rxsc(struct nsim_secy * ns_secy,sci_t sci)23*02b34d03SSabrina Dubroca static int nsim_macsec_find_rxsc(struct nsim_secy *ns_secy, sci_t sci)
24*02b34d03SSabrina Dubroca {
25*02b34d03SSabrina Dubroca 	int i;
26*02b34d03SSabrina Dubroca 
27*02b34d03SSabrina Dubroca 	for (i = 0; i < NSIM_MACSEC_MAX_RXSC_COUNT; i++) {
28*02b34d03SSabrina Dubroca 		if (ns_secy->nsim_rxsc[i].sci == sci)
29*02b34d03SSabrina Dubroca 			return i;
30*02b34d03SSabrina Dubroca 	}
31*02b34d03SSabrina Dubroca 
32*02b34d03SSabrina Dubroca 	return -1;
33*02b34d03SSabrina Dubroca }
34*02b34d03SSabrina Dubroca 
nsim_macsec_add_secy(struct macsec_context * ctx)35*02b34d03SSabrina Dubroca static int nsim_macsec_add_secy(struct macsec_context *ctx)
36*02b34d03SSabrina Dubroca {
37*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
38*02b34d03SSabrina Dubroca 	int idx;
39*02b34d03SSabrina Dubroca 
40*02b34d03SSabrina Dubroca 	if (ns->macsec.nsim_secy_count == NSIM_MACSEC_MAX_SECY_COUNT)
41*02b34d03SSabrina Dubroca 		return -ENOSPC;
42*02b34d03SSabrina Dubroca 
43*02b34d03SSabrina Dubroca 	for (idx = 0; idx < NSIM_MACSEC_MAX_SECY_COUNT; idx++) {
44*02b34d03SSabrina Dubroca 		if (!ns->macsec.nsim_secy[idx].used)
45*02b34d03SSabrina Dubroca 			break;
46*02b34d03SSabrina Dubroca 	}
47*02b34d03SSabrina Dubroca 
48*02b34d03SSabrina Dubroca 	if (idx == NSIM_MACSEC_MAX_SECY_COUNT) {
49*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: nsim_secy_count not full but all SecYs used\n",
50*02b34d03SSabrina Dubroca 			   __func__);
51*02b34d03SSabrina Dubroca 		return -ENOSPC;
52*02b34d03SSabrina Dubroca 	}
53*02b34d03SSabrina Dubroca 
54*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: adding new secy with sci %08llx at index %d\n",
55*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), idx);
56*02b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].used = true;
57*02b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].nsim_rxsc_count = 0;
58*02b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].sci = ctx->secy->sci;
59*02b34d03SSabrina Dubroca 	ns->macsec.nsim_secy_count++;
60*02b34d03SSabrina Dubroca 
61*02b34d03SSabrina Dubroca 	return 0;
62*02b34d03SSabrina Dubroca }
63*02b34d03SSabrina Dubroca 
nsim_macsec_upd_secy(struct macsec_context * ctx)64*02b34d03SSabrina Dubroca static int nsim_macsec_upd_secy(struct macsec_context *ctx)
65*02b34d03SSabrina Dubroca {
66*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
67*02b34d03SSabrina Dubroca 	int idx;
68*02b34d03SSabrina Dubroca 
69*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
70*02b34d03SSabrina Dubroca 	if (idx < 0) {
71*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
72*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
73*02b34d03SSabrina Dubroca 		return -ENOENT;
74*02b34d03SSabrina Dubroca 	}
75*02b34d03SSabrina Dubroca 
76*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: updating secy with sci %08llx at index %d\n",
77*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), idx);
78*02b34d03SSabrina Dubroca 
79*02b34d03SSabrina Dubroca 	return 0;
80*02b34d03SSabrina Dubroca }
81*02b34d03SSabrina Dubroca 
nsim_macsec_del_secy(struct macsec_context * ctx)82*02b34d03SSabrina Dubroca static int nsim_macsec_del_secy(struct macsec_context *ctx)
83*02b34d03SSabrina Dubroca {
84*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
85*02b34d03SSabrina Dubroca 	int idx;
86*02b34d03SSabrina Dubroca 
87*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
88*02b34d03SSabrina Dubroca 	if (idx < 0) {
89*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
90*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
91*02b34d03SSabrina Dubroca 		return -ENOENT;
92*02b34d03SSabrina Dubroca 	}
93*02b34d03SSabrina Dubroca 
94*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: removing SecY with SCI %08llx at index %d\n",
95*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), idx);
96*02b34d03SSabrina Dubroca 
97*02b34d03SSabrina Dubroca 	ns->macsec.nsim_secy[idx].used = false;
98*02b34d03SSabrina Dubroca 	memset(&ns->macsec.nsim_secy[idx], 0, sizeof(ns->macsec.nsim_secy[idx]));
99*02b34d03SSabrina Dubroca 	ns->macsec.nsim_secy_count--;
100*02b34d03SSabrina Dubroca 
101*02b34d03SSabrina Dubroca 	return 0;
102*02b34d03SSabrina Dubroca }
103*02b34d03SSabrina Dubroca 
nsim_macsec_add_rxsc(struct macsec_context * ctx)104*02b34d03SSabrina Dubroca static int nsim_macsec_add_rxsc(struct macsec_context *ctx)
105*02b34d03SSabrina Dubroca {
106*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
107*02b34d03SSabrina Dubroca 	struct nsim_secy *secy;
108*02b34d03SSabrina Dubroca 	int idx;
109*02b34d03SSabrina Dubroca 
110*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
111*02b34d03SSabrina Dubroca 	if (idx < 0) {
112*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
113*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
114*02b34d03SSabrina Dubroca 		return -ENOENT;
115*02b34d03SSabrina Dubroca 	}
116*02b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
117*02b34d03SSabrina Dubroca 
118*02b34d03SSabrina Dubroca 	if (secy->nsim_rxsc_count == NSIM_MACSEC_MAX_RXSC_COUNT)
119*02b34d03SSabrina Dubroca 		return -ENOSPC;
120*02b34d03SSabrina Dubroca 
121*02b34d03SSabrina Dubroca 	for (idx = 0; idx < NSIM_MACSEC_MAX_RXSC_COUNT; idx++) {
122*02b34d03SSabrina Dubroca 		if (!secy->nsim_rxsc[idx].used)
123*02b34d03SSabrina Dubroca 			break;
124*02b34d03SSabrina Dubroca 	}
125*02b34d03SSabrina Dubroca 
126*02b34d03SSabrina Dubroca 	if (idx == NSIM_MACSEC_MAX_RXSC_COUNT)
127*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: nsim_rxsc_count not full but all RXSCs used\n",
128*02b34d03SSabrina Dubroca 			   __func__);
129*02b34d03SSabrina Dubroca 
130*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: adding new rxsc with sci %08llx at index %d\n",
131*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->rx_sc->sci), idx);
132*02b34d03SSabrina Dubroca 	secy->nsim_rxsc[idx].used = true;
133*02b34d03SSabrina Dubroca 	secy->nsim_rxsc[idx].sci = ctx->rx_sc->sci;
134*02b34d03SSabrina Dubroca 	secy->nsim_rxsc_count++;
135*02b34d03SSabrina Dubroca 
136*02b34d03SSabrina Dubroca 	return 0;
137*02b34d03SSabrina Dubroca }
138*02b34d03SSabrina Dubroca 
nsim_macsec_upd_rxsc(struct macsec_context * ctx)139*02b34d03SSabrina Dubroca static int nsim_macsec_upd_rxsc(struct macsec_context *ctx)
140*02b34d03SSabrina Dubroca {
141*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
142*02b34d03SSabrina Dubroca 	struct nsim_secy *secy;
143*02b34d03SSabrina Dubroca 	int idx;
144*02b34d03SSabrina Dubroca 
145*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
146*02b34d03SSabrina Dubroca 	if (idx < 0) {
147*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
148*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
149*02b34d03SSabrina Dubroca 		return -ENOENT;
150*02b34d03SSabrina Dubroca 	}
151*02b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
152*02b34d03SSabrina Dubroca 
153*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->rx_sc->sci);
154*02b34d03SSabrina Dubroca 	if (idx < 0) {
155*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n",
156*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->rx_sc->sci));
157*02b34d03SSabrina Dubroca 		return -ENOENT;
158*02b34d03SSabrina Dubroca 	}
159*02b34d03SSabrina Dubroca 
160*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: updating RXSC with sci %08llx at index %d\n",
161*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->rx_sc->sci), idx);
162*02b34d03SSabrina Dubroca 
163*02b34d03SSabrina Dubroca 	return 0;
164*02b34d03SSabrina Dubroca }
165*02b34d03SSabrina Dubroca 
nsim_macsec_del_rxsc(struct macsec_context * ctx)166*02b34d03SSabrina Dubroca static int nsim_macsec_del_rxsc(struct macsec_context *ctx)
167*02b34d03SSabrina Dubroca {
168*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
169*02b34d03SSabrina Dubroca 	struct nsim_secy *secy;
170*02b34d03SSabrina Dubroca 	int idx;
171*02b34d03SSabrina Dubroca 
172*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
173*02b34d03SSabrina Dubroca 	if (idx < 0) {
174*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
175*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
176*02b34d03SSabrina Dubroca 		return -ENOENT;
177*02b34d03SSabrina Dubroca 	}
178*02b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
179*02b34d03SSabrina Dubroca 
180*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->rx_sc->sci);
181*02b34d03SSabrina Dubroca 	if (idx < 0) {
182*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n",
183*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->rx_sc->sci));
184*02b34d03SSabrina Dubroca 		return -ENOENT;
185*02b34d03SSabrina Dubroca 	}
186*02b34d03SSabrina Dubroca 
187*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: removing RXSC with sci %08llx at index %d\n",
188*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->rx_sc->sci), idx);
189*02b34d03SSabrina Dubroca 
190*02b34d03SSabrina Dubroca 	secy->nsim_rxsc[idx].used = false;
191*02b34d03SSabrina Dubroca 	memset(&secy->nsim_rxsc[idx], 0, sizeof(secy->nsim_rxsc[idx]));
192*02b34d03SSabrina Dubroca 	secy->nsim_rxsc_count--;
193*02b34d03SSabrina Dubroca 
194*02b34d03SSabrina Dubroca 	return 0;
195*02b34d03SSabrina Dubroca }
196*02b34d03SSabrina Dubroca 
nsim_macsec_add_rxsa(struct macsec_context * ctx)197*02b34d03SSabrina Dubroca static int nsim_macsec_add_rxsa(struct macsec_context *ctx)
198*02b34d03SSabrina Dubroca {
199*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
200*02b34d03SSabrina Dubroca 	struct nsim_secy *secy;
201*02b34d03SSabrina Dubroca 	int idx;
202*02b34d03SSabrina Dubroca 
203*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
204*02b34d03SSabrina Dubroca 	if (idx < 0) {
205*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
206*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
207*02b34d03SSabrina Dubroca 		return -ENOENT;
208*02b34d03SSabrina Dubroca 	}
209*02b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
210*02b34d03SSabrina Dubroca 
211*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci);
212*02b34d03SSabrina Dubroca 	if (idx < 0) {
213*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n",
214*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci));
215*02b34d03SSabrina Dubroca 		return -ENOENT;
216*02b34d03SSabrina Dubroca 	}
217*02b34d03SSabrina Dubroca 
218*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: RXSC with sci %08llx, AN %u\n",
219*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num);
220*02b34d03SSabrina Dubroca 
221*02b34d03SSabrina Dubroca 	return 0;
222*02b34d03SSabrina Dubroca }
223*02b34d03SSabrina Dubroca 
nsim_macsec_upd_rxsa(struct macsec_context * ctx)224*02b34d03SSabrina Dubroca static int nsim_macsec_upd_rxsa(struct macsec_context *ctx)
225*02b34d03SSabrina Dubroca {
226*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
227*02b34d03SSabrina Dubroca 	struct nsim_secy *secy;
228*02b34d03SSabrina Dubroca 	int idx;
229*02b34d03SSabrina Dubroca 
230*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
231*02b34d03SSabrina Dubroca 	if (idx < 0) {
232*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
233*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
234*02b34d03SSabrina Dubroca 		return -ENOENT;
235*02b34d03SSabrina Dubroca 	}
236*02b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
237*02b34d03SSabrina Dubroca 
238*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci);
239*02b34d03SSabrina Dubroca 	if (idx < 0) {
240*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n",
241*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci));
242*02b34d03SSabrina Dubroca 		return -ENOENT;
243*02b34d03SSabrina Dubroca 	}
244*02b34d03SSabrina Dubroca 
245*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: RXSC with sci %08llx, AN %u\n",
246*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num);
247*02b34d03SSabrina Dubroca 
248*02b34d03SSabrina Dubroca 	return 0;
249*02b34d03SSabrina Dubroca }
250*02b34d03SSabrina Dubroca 
nsim_macsec_del_rxsa(struct macsec_context * ctx)251*02b34d03SSabrina Dubroca static int nsim_macsec_del_rxsa(struct macsec_context *ctx)
252*02b34d03SSabrina Dubroca {
253*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
254*02b34d03SSabrina Dubroca 	struct nsim_secy *secy;
255*02b34d03SSabrina Dubroca 	int idx;
256*02b34d03SSabrina Dubroca 
257*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
258*02b34d03SSabrina Dubroca 	if (idx < 0) {
259*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
260*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
261*02b34d03SSabrina Dubroca 		return -ENOENT;
262*02b34d03SSabrina Dubroca 	}
263*02b34d03SSabrina Dubroca 	secy = &ns->macsec.nsim_secy[idx];
264*02b34d03SSabrina Dubroca 
265*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_rxsc(secy, ctx->sa.rx_sa->sc->sci);
266*02b34d03SSabrina Dubroca 	if (idx < 0) {
267*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in RXSC table\n",
268*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci));
269*02b34d03SSabrina Dubroca 		return -ENOENT;
270*02b34d03SSabrina Dubroca 	}
271*02b34d03SSabrina Dubroca 
272*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: RXSC with sci %08llx, AN %u\n",
273*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->sa.rx_sa->sc->sci), ctx->sa.assoc_num);
274*02b34d03SSabrina Dubroca 
275*02b34d03SSabrina Dubroca 	return 0;
276*02b34d03SSabrina Dubroca }
277*02b34d03SSabrina Dubroca 
nsim_macsec_add_txsa(struct macsec_context * ctx)278*02b34d03SSabrina Dubroca static int nsim_macsec_add_txsa(struct macsec_context *ctx)
279*02b34d03SSabrina Dubroca {
280*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
281*02b34d03SSabrina Dubroca 	int idx;
282*02b34d03SSabrina Dubroca 
283*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
284*02b34d03SSabrina Dubroca 	if (idx < 0) {
285*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
286*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
287*02b34d03SSabrina Dubroca 		return -ENOENT;
288*02b34d03SSabrina Dubroca 	}
289*02b34d03SSabrina Dubroca 
290*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: SECY with sci %08llx, AN %u\n",
291*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num);
292*02b34d03SSabrina Dubroca 
293*02b34d03SSabrina Dubroca 	return 0;
294*02b34d03SSabrina Dubroca }
295*02b34d03SSabrina Dubroca 
nsim_macsec_upd_txsa(struct macsec_context * ctx)296*02b34d03SSabrina Dubroca static int nsim_macsec_upd_txsa(struct macsec_context *ctx)
297*02b34d03SSabrina Dubroca {
298*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
299*02b34d03SSabrina Dubroca 	int idx;
300*02b34d03SSabrina Dubroca 
301*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
302*02b34d03SSabrina Dubroca 	if (idx < 0) {
303*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
304*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
305*02b34d03SSabrina Dubroca 		return -ENOENT;
306*02b34d03SSabrina Dubroca 	}
307*02b34d03SSabrina Dubroca 
308*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: SECY with sci %08llx, AN %u\n",
309*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num);
310*02b34d03SSabrina Dubroca 
311*02b34d03SSabrina Dubroca 	return 0;
312*02b34d03SSabrina Dubroca }
313*02b34d03SSabrina Dubroca 
nsim_macsec_del_txsa(struct macsec_context * ctx)314*02b34d03SSabrina Dubroca static int nsim_macsec_del_txsa(struct macsec_context *ctx)
315*02b34d03SSabrina Dubroca {
316*02b34d03SSabrina Dubroca 	struct netdevsim *ns = netdev_priv(ctx->netdev);
317*02b34d03SSabrina Dubroca 	int idx;
318*02b34d03SSabrina Dubroca 
319*02b34d03SSabrina Dubroca 	idx = nsim_macsec_find_secy(ns, ctx->secy->sci);
320*02b34d03SSabrina Dubroca 	if (idx < 0) {
321*02b34d03SSabrina Dubroca 		netdev_err(ctx->netdev, "%s: sci %08llx not found in secy table\n",
322*02b34d03SSabrina Dubroca 			   __func__, sci_to_cpu(ctx->secy->sci));
323*02b34d03SSabrina Dubroca 		return -ENOENT;
324*02b34d03SSabrina Dubroca 	}
325*02b34d03SSabrina Dubroca 
326*02b34d03SSabrina Dubroca 	netdev_dbg(ctx->netdev, "%s: SECY with sci %08llx, AN %u\n",
327*02b34d03SSabrina Dubroca 		   __func__, sci_to_cpu(ctx->secy->sci), ctx->sa.assoc_num);
328*02b34d03SSabrina Dubroca 
329*02b34d03SSabrina Dubroca 	return 0;
330*02b34d03SSabrina Dubroca }
331*02b34d03SSabrina Dubroca 
332*02b34d03SSabrina Dubroca static const struct macsec_ops nsim_macsec_ops = {
333*02b34d03SSabrina Dubroca 	.mdo_add_secy = nsim_macsec_add_secy,
334*02b34d03SSabrina Dubroca 	.mdo_upd_secy = nsim_macsec_upd_secy,
335*02b34d03SSabrina Dubroca 	.mdo_del_secy = nsim_macsec_del_secy,
336*02b34d03SSabrina Dubroca 	.mdo_add_rxsc = nsim_macsec_add_rxsc,
337*02b34d03SSabrina Dubroca 	.mdo_upd_rxsc = nsim_macsec_upd_rxsc,
338*02b34d03SSabrina Dubroca 	.mdo_del_rxsc = nsim_macsec_del_rxsc,
339*02b34d03SSabrina Dubroca 	.mdo_add_rxsa = nsim_macsec_add_rxsa,
340*02b34d03SSabrina Dubroca 	.mdo_upd_rxsa = nsim_macsec_upd_rxsa,
341*02b34d03SSabrina Dubroca 	.mdo_del_rxsa = nsim_macsec_del_rxsa,
342*02b34d03SSabrina Dubroca 	.mdo_add_txsa = nsim_macsec_add_txsa,
343*02b34d03SSabrina Dubroca 	.mdo_upd_txsa = nsim_macsec_upd_txsa,
344*02b34d03SSabrina Dubroca 	.mdo_del_txsa = nsim_macsec_del_txsa,
345*02b34d03SSabrina Dubroca };
346*02b34d03SSabrina Dubroca 
nsim_macsec_init(struct netdevsim * ns)347*02b34d03SSabrina Dubroca void nsim_macsec_init(struct netdevsim *ns)
348*02b34d03SSabrina Dubroca {
349*02b34d03SSabrina Dubroca 	ns->netdev->macsec_ops = &nsim_macsec_ops;
350*02b34d03SSabrina Dubroca 	ns->netdev->features |= NETIF_F_HW_MACSEC;
351*02b34d03SSabrina Dubroca 	memset(&ns->macsec, 0, sizeof(ns->macsec));
352*02b34d03SSabrina Dubroca }
353*02b34d03SSabrina Dubroca 
nsim_macsec_teardown(struct netdevsim * ns)354*02b34d03SSabrina Dubroca void nsim_macsec_teardown(struct netdevsim *ns)
355*02b34d03SSabrina Dubroca {
356*02b34d03SSabrina Dubroca }
357