1*a1157835SDaniel Fojt /*
2*a1157835SDaniel Fojt * SecY Operations
3*a1157835SDaniel Fojt * Copyright (c) 2013, Qualcomm Atheros, Inc.
4*a1157835SDaniel Fojt *
5*a1157835SDaniel Fojt * This software may be distributed under the terms of the BSD license.
6*a1157835SDaniel Fojt * See README for more details.
7*a1157835SDaniel Fojt */
8*a1157835SDaniel Fojt
9*a1157835SDaniel Fojt #include "utils/includes.h"
10*a1157835SDaniel Fojt
11*a1157835SDaniel Fojt #include "utils/common.h"
12*a1157835SDaniel Fojt #include "utils/eloop.h"
13*a1157835SDaniel Fojt #include "common/defs.h"
14*a1157835SDaniel Fojt #include "drivers/driver.h"
15*a1157835SDaniel Fojt #include "pae/ieee802_1x_kay.h"
16*a1157835SDaniel Fojt #include "pae/ieee802_1x_kay_i.h"
17*a1157835SDaniel Fojt #include "pae/ieee802_1x_secy_ops.h"
18*a1157835SDaniel Fojt
19*a1157835SDaniel Fojt
secy_cp_control_validate_frames(struct ieee802_1x_kay * kay,enum validate_frames vf)20*a1157835SDaniel Fojt int secy_cp_control_validate_frames(struct ieee802_1x_kay *kay,
21*a1157835SDaniel Fojt enum validate_frames vf)
22*a1157835SDaniel Fojt {
23*a1157835SDaniel Fojt kay->vf = vf;
24*a1157835SDaniel Fojt return 0;
25*a1157835SDaniel Fojt }
26*a1157835SDaniel Fojt
27*a1157835SDaniel Fojt
secy_cp_control_protect_frames(struct ieee802_1x_kay * kay,Boolean enabled)28*a1157835SDaniel Fojt int secy_cp_control_protect_frames(struct ieee802_1x_kay *kay, Boolean enabled)
29*a1157835SDaniel Fojt {
30*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
31*a1157835SDaniel Fojt
32*a1157835SDaniel Fojt if (!kay) {
33*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
34*a1157835SDaniel Fojt return -1;
35*a1157835SDaniel Fojt }
36*a1157835SDaniel Fojt
37*a1157835SDaniel Fojt ops = kay->ctx;
38*a1157835SDaniel Fojt if (!ops || !ops->enable_protect_frames) {
39*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
40*a1157835SDaniel Fojt "KaY: secy enable_protect_frames operation not supported");
41*a1157835SDaniel Fojt return -1;
42*a1157835SDaniel Fojt }
43*a1157835SDaniel Fojt
44*a1157835SDaniel Fojt return ops->enable_protect_frames(ops->ctx, enabled);
45*a1157835SDaniel Fojt }
46*a1157835SDaniel Fojt
47*a1157835SDaniel Fojt
secy_cp_control_encrypt(struct ieee802_1x_kay * kay,Boolean enabled)48*a1157835SDaniel Fojt int secy_cp_control_encrypt(struct ieee802_1x_kay *kay, Boolean enabled)
49*a1157835SDaniel Fojt {
50*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
51*a1157835SDaniel Fojt
52*a1157835SDaniel Fojt if (!kay) {
53*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
54*a1157835SDaniel Fojt return -1;
55*a1157835SDaniel Fojt }
56*a1157835SDaniel Fojt
57*a1157835SDaniel Fojt ops = kay->ctx;
58*a1157835SDaniel Fojt if (!ops || !ops->enable_encrypt) {
59*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
60*a1157835SDaniel Fojt "KaY: secy enable_encrypt operation not supported");
61*a1157835SDaniel Fojt return -1;
62*a1157835SDaniel Fojt }
63*a1157835SDaniel Fojt
64*a1157835SDaniel Fojt return ops->enable_encrypt(ops->ctx, enabled);
65*a1157835SDaniel Fojt }
66*a1157835SDaniel Fojt
67*a1157835SDaniel Fojt
secy_cp_control_replay(struct ieee802_1x_kay * kay,Boolean enabled,u32 win)68*a1157835SDaniel Fojt int secy_cp_control_replay(struct ieee802_1x_kay *kay, Boolean enabled, u32 win)
69*a1157835SDaniel Fojt {
70*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
71*a1157835SDaniel Fojt
72*a1157835SDaniel Fojt if (!kay) {
73*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
74*a1157835SDaniel Fojt return -1;
75*a1157835SDaniel Fojt }
76*a1157835SDaniel Fojt
77*a1157835SDaniel Fojt ops = kay->ctx;
78*a1157835SDaniel Fojt if (!ops || !ops->set_replay_protect) {
79*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
80*a1157835SDaniel Fojt "KaY: secy set_replay_protect operation not supported");
81*a1157835SDaniel Fojt return -1;
82*a1157835SDaniel Fojt }
83*a1157835SDaniel Fojt
84*a1157835SDaniel Fojt return ops->set_replay_protect(ops->ctx, enabled, win);
85*a1157835SDaniel Fojt }
86*a1157835SDaniel Fojt
87*a1157835SDaniel Fojt
secy_cp_control_current_cipher_suite(struct ieee802_1x_kay * kay,u64 cs)88*a1157835SDaniel Fojt int secy_cp_control_current_cipher_suite(struct ieee802_1x_kay *kay, u64 cs)
89*a1157835SDaniel Fojt {
90*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
91*a1157835SDaniel Fojt
92*a1157835SDaniel Fojt if (!kay) {
93*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
94*a1157835SDaniel Fojt return -1;
95*a1157835SDaniel Fojt }
96*a1157835SDaniel Fojt
97*a1157835SDaniel Fojt ops = kay->ctx;
98*a1157835SDaniel Fojt if (!ops || !ops->set_current_cipher_suite) {
99*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
100*a1157835SDaniel Fojt "KaY: secy set_current_cipher_suite operation not supported");
101*a1157835SDaniel Fojt return -1;
102*a1157835SDaniel Fojt }
103*a1157835SDaniel Fojt
104*a1157835SDaniel Fojt return ops->set_current_cipher_suite(ops->ctx, cs);
105*a1157835SDaniel Fojt }
106*a1157835SDaniel Fojt
107*a1157835SDaniel Fojt
secy_cp_control_confidentiality_offset(struct ieee802_1x_kay * kay,enum confidentiality_offset co)108*a1157835SDaniel Fojt int secy_cp_control_confidentiality_offset(struct ieee802_1x_kay *kay,
109*a1157835SDaniel Fojt enum confidentiality_offset co)
110*a1157835SDaniel Fojt {
111*a1157835SDaniel Fojt kay->co = co;
112*a1157835SDaniel Fojt return 0;
113*a1157835SDaniel Fojt }
114*a1157835SDaniel Fojt
115*a1157835SDaniel Fojt
secy_cp_control_enable_port(struct ieee802_1x_kay * kay,Boolean enabled)116*a1157835SDaniel Fojt int secy_cp_control_enable_port(struct ieee802_1x_kay *kay, Boolean enabled)
117*a1157835SDaniel Fojt {
118*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
119*a1157835SDaniel Fojt
120*a1157835SDaniel Fojt if (!kay) {
121*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
122*a1157835SDaniel Fojt return -1;
123*a1157835SDaniel Fojt }
124*a1157835SDaniel Fojt
125*a1157835SDaniel Fojt ops = kay->ctx;
126*a1157835SDaniel Fojt if (!ops || !ops->enable_controlled_port) {
127*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
128*a1157835SDaniel Fojt "KaY: secy enable_controlled_port operation not supported");
129*a1157835SDaniel Fojt return -1;
130*a1157835SDaniel Fojt }
131*a1157835SDaniel Fojt
132*a1157835SDaniel Fojt return ops->enable_controlled_port(ops->ctx, enabled);
133*a1157835SDaniel Fojt }
134*a1157835SDaniel Fojt
135*a1157835SDaniel Fojt
secy_get_capability(struct ieee802_1x_kay * kay,enum macsec_cap * cap)136*a1157835SDaniel Fojt int secy_get_capability(struct ieee802_1x_kay *kay, enum macsec_cap *cap)
137*a1157835SDaniel Fojt {
138*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
139*a1157835SDaniel Fojt
140*a1157835SDaniel Fojt if (!kay) {
141*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
142*a1157835SDaniel Fojt return -1;
143*a1157835SDaniel Fojt }
144*a1157835SDaniel Fojt
145*a1157835SDaniel Fojt ops = kay->ctx;
146*a1157835SDaniel Fojt if (!ops || !ops->macsec_get_capability) {
147*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
148*a1157835SDaniel Fojt "KaY: secy macsec_get_capability operation not supported");
149*a1157835SDaniel Fojt return -1;
150*a1157835SDaniel Fojt }
151*a1157835SDaniel Fojt
152*a1157835SDaniel Fojt return ops->macsec_get_capability(ops->ctx, cap);
153*a1157835SDaniel Fojt }
154*a1157835SDaniel Fojt
155*a1157835SDaniel Fojt
secy_get_receive_lowest_pn(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)156*a1157835SDaniel Fojt int secy_get_receive_lowest_pn(struct ieee802_1x_kay *kay,
157*a1157835SDaniel Fojt struct receive_sa *rxsa)
158*a1157835SDaniel Fojt {
159*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
160*a1157835SDaniel Fojt
161*a1157835SDaniel Fojt if (!kay || !rxsa) {
162*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
163*a1157835SDaniel Fojt return -1;
164*a1157835SDaniel Fojt }
165*a1157835SDaniel Fojt
166*a1157835SDaniel Fojt ops = kay->ctx;
167*a1157835SDaniel Fojt if (!ops || !ops->get_receive_lowest_pn) {
168*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
169*a1157835SDaniel Fojt "KaY: secy get_receive_lowest_pn operation not supported");
170*a1157835SDaniel Fojt return -1;
171*a1157835SDaniel Fojt }
172*a1157835SDaniel Fojt
173*a1157835SDaniel Fojt return ops->get_receive_lowest_pn(ops->ctx, rxsa);
174*a1157835SDaniel Fojt }
175*a1157835SDaniel Fojt
176*a1157835SDaniel Fojt
secy_get_transmit_next_pn(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)177*a1157835SDaniel Fojt int secy_get_transmit_next_pn(struct ieee802_1x_kay *kay,
178*a1157835SDaniel Fojt struct transmit_sa *txsa)
179*a1157835SDaniel Fojt {
180*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
181*a1157835SDaniel Fojt
182*a1157835SDaniel Fojt if (!kay || !txsa) {
183*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
184*a1157835SDaniel Fojt return -1;
185*a1157835SDaniel Fojt }
186*a1157835SDaniel Fojt
187*a1157835SDaniel Fojt ops = kay->ctx;
188*a1157835SDaniel Fojt if (!ops || !ops->get_transmit_next_pn) {
189*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
190*a1157835SDaniel Fojt "KaY: secy get_transmit_next_pn operation not supported");
191*a1157835SDaniel Fojt return -1;
192*a1157835SDaniel Fojt }
193*a1157835SDaniel Fojt
194*a1157835SDaniel Fojt return ops->get_transmit_next_pn(ops->ctx, txsa);
195*a1157835SDaniel Fojt }
196*a1157835SDaniel Fojt
197*a1157835SDaniel Fojt
secy_set_transmit_next_pn(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)198*a1157835SDaniel Fojt int secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
199*a1157835SDaniel Fojt struct transmit_sa *txsa)
200*a1157835SDaniel Fojt {
201*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
202*a1157835SDaniel Fojt
203*a1157835SDaniel Fojt if (!kay || !txsa) {
204*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
205*a1157835SDaniel Fojt return -1;
206*a1157835SDaniel Fojt }
207*a1157835SDaniel Fojt
208*a1157835SDaniel Fojt ops = kay->ctx;
209*a1157835SDaniel Fojt if (!ops || !ops->set_transmit_next_pn) {
210*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
211*a1157835SDaniel Fojt "KaY: secy set_transmit_next_pn operation not supported");
212*a1157835SDaniel Fojt return -1;
213*a1157835SDaniel Fojt }
214*a1157835SDaniel Fojt
215*a1157835SDaniel Fojt return ops->set_transmit_next_pn(ops->ctx, txsa);
216*a1157835SDaniel Fojt }
217*a1157835SDaniel Fojt
218*a1157835SDaniel Fojt
secy_set_receive_lowest_pn(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)219*a1157835SDaniel Fojt int secy_set_receive_lowest_pn(struct ieee802_1x_kay *kay,
220*a1157835SDaniel Fojt struct receive_sa *rxsa)
221*a1157835SDaniel Fojt {
222*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
223*a1157835SDaniel Fojt
224*a1157835SDaniel Fojt if (!kay || !rxsa) {
225*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
226*a1157835SDaniel Fojt return -1;
227*a1157835SDaniel Fojt }
228*a1157835SDaniel Fojt
229*a1157835SDaniel Fojt ops = kay->ctx;
230*a1157835SDaniel Fojt if (!ops || !ops->set_receive_lowest_pn) {
231*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
232*a1157835SDaniel Fojt "KaY: secy set_receive_lowest_pn operation not supported");
233*a1157835SDaniel Fojt return -1;
234*a1157835SDaniel Fojt }
235*a1157835SDaniel Fojt
236*a1157835SDaniel Fojt return ops->set_receive_lowest_pn(ops->ctx, rxsa);
237*a1157835SDaniel Fojt }
238*a1157835SDaniel Fojt
239*a1157835SDaniel Fojt
secy_create_receive_sc(struct ieee802_1x_kay * kay,struct receive_sc * rxsc)240*a1157835SDaniel Fojt int secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
241*a1157835SDaniel Fojt {
242*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
243*a1157835SDaniel Fojt
244*a1157835SDaniel Fojt if (!kay || !rxsc) {
245*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
246*a1157835SDaniel Fojt return -1;
247*a1157835SDaniel Fojt }
248*a1157835SDaniel Fojt
249*a1157835SDaniel Fojt ops = kay->ctx;
250*a1157835SDaniel Fojt if (!ops || !ops->create_receive_sc) {
251*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
252*a1157835SDaniel Fojt "KaY: secy create_receive_sc operation not supported");
253*a1157835SDaniel Fojt return -1;
254*a1157835SDaniel Fojt }
255*a1157835SDaniel Fojt
256*a1157835SDaniel Fojt return ops->create_receive_sc(ops->ctx, rxsc, kay->vf, kay->co);
257*a1157835SDaniel Fojt }
258*a1157835SDaniel Fojt
259*a1157835SDaniel Fojt
secy_delete_receive_sc(struct ieee802_1x_kay * kay,struct receive_sc * rxsc)260*a1157835SDaniel Fojt int secy_delete_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
261*a1157835SDaniel Fojt {
262*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
263*a1157835SDaniel Fojt
264*a1157835SDaniel Fojt if (!kay || !rxsc) {
265*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
266*a1157835SDaniel Fojt return -1;
267*a1157835SDaniel Fojt }
268*a1157835SDaniel Fojt
269*a1157835SDaniel Fojt ops = kay->ctx;
270*a1157835SDaniel Fojt if (!ops || !ops->delete_receive_sc) {
271*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
272*a1157835SDaniel Fojt "KaY: secy delete_receive_sc operation not supported");
273*a1157835SDaniel Fojt return -1;
274*a1157835SDaniel Fojt }
275*a1157835SDaniel Fojt
276*a1157835SDaniel Fojt return ops->delete_receive_sc(ops->ctx, rxsc);
277*a1157835SDaniel Fojt }
278*a1157835SDaniel Fojt
279*a1157835SDaniel Fojt
secy_create_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)280*a1157835SDaniel Fojt int secy_create_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
281*a1157835SDaniel Fojt {
282*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
283*a1157835SDaniel Fojt
284*a1157835SDaniel Fojt if (!kay || !rxsa) {
285*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
286*a1157835SDaniel Fojt return -1;
287*a1157835SDaniel Fojt }
288*a1157835SDaniel Fojt
289*a1157835SDaniel Fojt ops = kay->ctx;
290*a1157835SDaniel Fojt if (!ops || !ops->create_receive_sa) {
291*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
292*a1157835SDaniel Fojt "KaY: secy create_receive_sa operation not supported");
293*a1157835SDaniel Fojt return -1;
294*a1157835SDaniel Fojt }
295*a1157835SDaniel Fojt
296*a1157835SDaniel Fojt return ops->create_receive_sa(ops->ctx, rxsa);
297*a1157835SDaniel Fojt }
298*a1157835SDaniel Fojt
299*a1157835SDaniel Fojt
secy_delete_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)300*a1157835SDaniel Fojt int secy_delete_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
301*a1157835SDaniel Fojt {
302*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
303*a1157835SDaniel Fojt
304*a1157835SDaniel Fojt if (!kay || !rxsa) {
305*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
306*a1157835SDaniel Fojt return -1;
307*a1157835SDaniel Fojt }
308*a1157835SDaniel Fojt
309*a1157835SDaniel Fojt ops = kay->ctx;
310*a1157835SDaniel Fojt if (!ops || !ops->delete_receive_sa) {
311*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
312*a1157835SDaniel Fojt "KaY: secy delete_receive_sa operation not supported");
313*a1157835SDaniel Fojt return -1;
314*a1157835SDaniel Fojt }
315*a1157835SDaniel Fojt
316*a1157835SDaniel Fojt return ops->delete_receive_sa(ops->ctx, rxsa);
317*a1157835SDaniel Fojt }
318*a1157835SDaniel Fojt
319*a1157835SDaniel Fojt
secy_enable_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)320*a1157835SDaniel Fojt int secy_enable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
321*a1157835SDaniel Fojt {
322*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
323*a1157835SDaniel Fojt
324*a1157835SDaniel Fojt if (!kay || !rxsa) {
325*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
326*a1157835SDaniel Fojt return -1;
327*a1157835SDaniel Fojt }
328*a1157835SDaniel Fojt
329*a1157835SDaniel Fojt ops = kay->ctx;
330*a1157835SDaniel Fojt if (!ops || !ops->enable_receive_sa) {
331*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
332*a1157835SDaniel Fojt "KaY: secy enable_receive_sa operation not supported");
333*a1157835SDaniel Fojt return -1;
334*a1157835SDaniel Fojt }
335*a1157835SDaniel Fojt
336*a1157835SDaniel Fojt rxsa->enable_receive = TRUE;
337*a1157835SDaniel Fojt
338*a1157835SDaniel Fojt return ops->enable_receive_sa(ops->ctx, rxsa);
339*a1157835SDaniel Fojt }
340*a1157835SDaniel Fojt
341*a1157835SDaniel Fojt
secy_disable_receive_sa(struct ieee802_1x_kay * kay,struct receive_sa * rxsa)342*a1157835SDaniel Fojt int secy_disable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
343*a1157835SDaniel Fojt {
344*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
345*a1157835SDaniel Fojt
346*a1157835SDaniel Fojt if (!kay || !rxsa) {
347*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
348*a1157835SDaniel Fojt return -1;
349*a1157835SDaniel Fojt }
350*a1157835SDaniel Fojt
351*a1157835SDaniel Fojt ops = kay->ctx;
352*a1157835SDaniel Fojt if (!ops || !ops->disable_receive_sa) {
353*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
354*a1157835SDaniel Fojt "KaY: secy disable_receive_sa operation not supported");
355*a1157835SDaniel Fojt return -1;
356*a1157835SDaniel Fojt }
357*a1157835SDaniel Fojt
358*a1157835SDaniel Fojt rxsa->enable_receive = FALSE;
359*a1157835SDaniel Fojt
360*a1157835SDaniel Fojt return ops->disable_receive_sa(ops->ctx, rxsa);
361*a1157835SDaniel Fojt }
362*a1157835SDaniel Fojt
363*a1157835SDaniel Fojt
secy_create_transmit_sc(struct ieee802_1x_kay * kay,struct transmit_sc * txsc)364*a1157835SDaniel Fojt int secy_create_transmit_sc(struct ieee802_1x_kay *kay,
365*a1157835SDaniel Fojt struct transmit_sc *txsc)
366*a1157835SDaniel Fojt {
367*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
368*a1157835SDaniel Fojt
369*a1157835SDaniel Fojt if (!kay || !txsc) {
370*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
371*a1157835SDaniel Fojt return -1;
372*a1157835SDaniel Fojt }
373*a1157835SDaniel Fojt
374*a1157835SDaniel Fojt ops = kay->ctx;
375*a1157835SDaniel Fojt if (!ops || !ops->create_transmit_sc) {
376*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
377*a1157835SDaniel Fojt "KaY: secy create_transmit_sc operation not supported");
378*a1157835SDaniel Fojt return -1;
379*a1157835SDaniel Fojt }
380*a1157835SDaniel Fojt
381*a1157835SDaniel Fojt return ops->create_transmit_sc(ops->ctx, txsc, kay->co);
382*a1157835SDaniel Fojt }
383*a1157835SDaniel Fojt
384*a1157835SDaniel Fojt
secy_delete_transmit_sc(struct ieee802_1x_kay * kay,struct transmit_sc * txsc)385*a1157835SDaniel Fojt int secy_delete_transmit_sc(struct ieee802_1x_kay *kay,
386*a1157835SDaniel Fojt struct transmit_sc *txsc)
387*a1157835SDaniel Fojt {
388*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
389*a1157835SDaniel Fojt
390*a1157835SDaniel Fojt if (!kay || !txsc) {
391*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
392*a1157835SDaniel Fojt return -1;
393*a1157835SDaniel Fojt }
394*a1157835SDaniel Fojt
395*a1157835SDaniel Fojt ops = kay->ctx;
396*a1157835SDaniel Fojt if (!ops || !ops->delete_transmit_sc) {
397*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
398*a1157835SDaniel Fojt "KaY: secy delete_transmit_sc operation not supported");
399*a1157835SDaniel Fojt return -1;
400*a1157835SDaniel Fojt }
401*a1157835SDaniel Fojt
402*a1157835SDaniel Fojt return ops->delete_transmit_sc(ops->ctx, txsc);
403*a1157835SDaniel Fojt }
404*a1157835SDaniel Fojt
405*a1157835SDaniel Fojt
secy_create_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)406*a1157835SDaniel Fojt int secy_create_transmit_sa(struct ieee802_1x_kay *kay,
407*a1157835SDaniel Fojt struct transmit_sa *txsa)
408*a1157835SDaniel Fojt {
409*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
410*a1157835SDaniel Fojt
411*a1157835SDaniel Fojt if (!kay || !txsa) {
412*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
413*a1157835SDaniel Fojt return -1;
414*a1157835SDaniel Fojt }
415*a1157835SDaniel Fojt
416*a1157835SDaniel Fojt ops = kay->ctx;
417*a1157835SDaniel Fojt if (!ops || !ops->create_transmit_sa) {
418*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
419*a1157835SDaniel Fojt "KaY: secy create_transmit_sa operation not supported");
420*a1157835SDaniel Fojt return -1;
421*a1157835SDaniel Fojt }
422*a1157835SDaniel Fojt
423*a1157835SDaniel Fojt return ops->create_transmit_sa(ops->ctx, txsa);
424*a1157835SDaniel Fojt }
425*a1157835SDaniel Fojt
426*a1157835SDaniel Fojt
secy_delete_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)427*a1157835SDaniel Fojt int secy_delete_transmit_sa(struct ieee802_1x_kay *kay,
428*a1157835SDaniel Fojt struct transmit_sa *txsa)
429*a1157835SDaniel Fojt {
430*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
431*a1157835SDaniel Fojt
432*a1157835SDaniel Fojt if (!kay || !txsa) {
433*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
434*a1157835SDaniel Fojt return -1;
435*a1157835SDaniel Fojt }
436*a1157835SDaniel Fojt
437*a1157835SDaniel Fojt ops = kay->ctx;
438*a1157835SDaniel Fojt if (!ops || !ops->delete_transmit_sa) {
439*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
440*a1157835SDaniel Fojt "KaY: secy delete_transmit_sa operation not supported");
441*a1157835SDaniel Fojt return -1;
442*a1157835SDaniel Fojt }
443*a1157835SDaniel Fojt
444*a1157835SDaniel Fojt return ops->delete_transmit_sa(ops->ctx, txsa);
445*a1157835SDaniel Fojt }
446*a1157835SDaniel Fojt
447*a1157835SDaniel Fojt
secy_enable_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)448*a1157835SDaniel Fojt int secy_enable_transmit_sa(struct ieee802_1x_kay *kay,
449*a1157835SDaniel Fojt struct transmit_sa *txsa)
450*a1157835SDaniel Fojt {
451*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
452*a1157835SDaniel Fojt
453*a1157835SDaniel Fojt if (!kay || !txsa) {
454*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
455*a1157835SDaniel Fojt return -1;
456*a1157835SDaniel Fojt }
457*a1157835SDaniel Fojt
458*a1157835SDaniel Fojt ops = kay->ctx;
459*a1157835SDaniel Fojt if (!ops || !ops->enable_transmit_sa) {
460*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
461*a1157835SDaniel Fojt "KaY: secy enable_transmit_sa operation not supported");
462*a1157835SDaniel Fojt return -1;
463*a1157835SDaniel Fojt }
464*a1157835SDaniel Fojt
465*a1157835SDaniel Fojt txsa->enable_transmit = TRUE;
466*a1157835SDaniel Fojt
467*a1157835SDaniel Fojt return ops->enable_transmit_sa(ops->ctx, txsa);
468*a1157835SDaniel Fojt }
469*a1157835SDaniel Fojt
470*a1157835SDaniel Fojt
secy_disable_transmit_sa(struct ieee802_1x_kay * kay,struct transmit_sa * txsa)471*a1157835SDaniel Fojt int secy_disable_transmit_sa(struct ieee802_1x_kay *kay,
472*a1157835SDaniel Fojt struct transmit_sa *txsa)
473*a1157835SDaniel Fojt {
474*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
475*a1157835SDaniel Fojt
476*a1157835SDaniel Fojt if (!kay || !txsa) {
477*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
478*a1157835SDaniel Fojt return -1;
479*a1157835SDaniel Fojt }
480*a1157835SDaniel Fojt
481*a1157835SDaniel Fojt ops = kay->ctx;
482*a1157835SDaniel Fojt if (!ops || !ops->disable_transmit_sa) {
483*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
484*a1157835SDaniel Fojt "KaY: secy disable_transmit_sa operation not supported");
485*a1157835SDaniel Fojt return -1;
486*a1157835SDaniel Fojt }
487*a1157835SDaniel Fojt
488*a1157835SDaniel Fojt txsa->enable_transmit = FALSE;
489*a1157835SDaniel Fojt
490*a1157835SDaniel Fojt return ops->disable_transmit_sa(ops->ctx, txsa);
491*a1157835SDaniel Fojt }
492*a1157835SDaniel Fojt
493*a1157835SDaniel Fojt
secy_init_macsec(struct ieee802_1x_kay * kay)494*a1157835SDaniel Fojt int secy_init_macsec(struct ieee802_1x_kay *kay)
495*a1157835SDaniel Fojt {
496*a1157835SDaniel Fojt int ret;
497*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
498*a1157835SDaniel Fojt struct macsec_init_params params;
499*a1157835SDaniel Fojt
500*a1157835SDaniel Fojt if (!kay) {
501*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
502*a1157835SDaniel Fojt return -1;
503*a1157835SDaniel Fojt }
504*a1157835SDaniel Fojt
505*a1157835SDaniel Fojt ops = kay->ctx;
506*a1157835SDaniel Fojt if (!ops || !ops->macsec_init) {
507*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
508*a1157835SDaniel Fojt "KaY: secy macsec_init operation not supported");
509*a1157835SDaniel Fojt return -1;
510*a1157835SDaniel Fojt }
511*a1157835SDaniel Fojt
512*a1157835SDaniel Fojt params.use_es = FALSE;
513*a1157835SDaniel Fojt params.use_scb = FALSE;
514*a1157835SDaniel Fojt params.always_include_sci = TRUE;
515*a1157835SDaniel Fojt
516*a1157835SDaniel Fojt ret = ops->macsec_init(ops->ctx, ¶ms);
517*a1157835SDaniel Fojt
518*a1157835SDaniel Fojt return ret;
519*a1157835SDaniel Fojt }
520*a1157835SDaniel Fojt
521*a1157835SDaniel Fojt
secy_deinit_macsec(struct ieee802_1x_kay * kay)522*a1157835SDaniel Fojt int secy_deinit_macsec(struct ieee802_1x_kay *kay)
523*a1157835SDaniel Fojt {
524*a1157835SDaniel Fojt struct ieee802_1x_kay_ctx *ops;
525*a1157835SDaniel Fojt
526*a1157835SDaniel Fojt if (!kay) {
527*a1157835SDaniel Fojt wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
528*a1157835SDaniel Fojt return -1;
529*a1157835SDaniel Fojt }
530*a1157835SDaniel Fojt
531*a1157835SDaniel Fojt ops = kay->ctx;
532*a1157835SDaniel Fojt if (!ops || !ops->macsec_deinit) {
533*a1157835SDaniel Fojt wpa_printf(MSG_ERROR,
534*a1157835SDaniel Fojt "KaY: secy macsec_deinit operation not supported");
535*a1157835SDaniel Fojt return -1;
536*a1157835SDaniel Fojt }
537*a1157835SDaniel Fojt
538*a1157835SDaniel Fojt return ops->macsec_deinit(ops->ctx);
539*a1157835SDaniel Fojt }
540