15a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /*
25a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * SecY Operations
35a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * Copyright (c) 2013, Qualcomm Atheros, Inc.
45a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *
55a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * This software may be distributed under the terms of the BSD license.
65a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * See README for more details.
75a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt */
85a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
95a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "utils/includes.h"
105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "utils/common.h"
125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "utils/eloop.h"
135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "common/defs.h"
145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "drivers/driver.h"
155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "pae/ieee802_1x_kay.h"
165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "pae/ieee802_1x_kay_i.h"
175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "pae/ieee802_1x_secy_ops.h"
185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_validate_frames(struct ieee802_1x_kay *kay,
215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				    enum validate_frames vf)
225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	kay->vf = vf;
245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return 0;
255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_protect_frames(struct ieee802_1x_kay *kay, Boolean enabled)
295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->enable_protect_frames) {
395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy enable_protect_frames operation not supported");
415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->enable_protect_frames(ops->ctx, enabled);
455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
48abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidtint secy_cp_control_encrypt(struct ieee802_1x_kay *kay, Boolean enabled)
49abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt{
50abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
51abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt
52abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	if (!kay) {
53abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
54abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt		return -1;
55abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	}
56abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt
57abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	ops = kay->ctx;
58abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	if (!ops || !ops->enable_encrypt) {
59abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt		wpa_printf(MSG_ERROR,
60abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt			   "KaY: secy enable_encrypt operation not supported");
61abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt		return -1;
62abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	}
63abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt
64abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt	return ops->enable_encrypt(ops->ctx, enabled);
65abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt}
66abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt
67abb90a3fc1917e628167827cb14e742000605332Dmitry Shmidt
685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_replay(struct ieee802_1x_kay *kay, Boolean enabled, u32 win)
695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->set_replay_protect) {
795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy set_replay_protect operation not supported");
815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->set_replay_protect(ops->ctx, enabled, win);
855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
887d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidtint secy_cp_control_current_cipher_suite(struct ieee802_1x_kay *kay, u64 cs)
895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->set_current_cipher_suite) {
995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy set_current_cipher_suite operation not supported");
1015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1047d17530e229db79208e99741071df97ea4faeec6Dmitry Shmidt	return ops->set_current_cipher_suite(ops->ctx, cs);
1055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_confidentiality_offset(struct ieee802_1x_kay *kay,
1095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					   enum confidentiality_offset co)
1105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	kay->co = co;
1125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return 0;
1135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_enable_port(struct ieee802_1x_kay *kay, Boolean enabled)
1175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
1215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->enable_controlled_port) {
1275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy enable_controlled_port operation not supported");
1295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->enable_controlled_port(ops->ctx, enabled);
1335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1369839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_get_capability(struct ieee802_1x_kay *kay, enum macsec_cap *cap)
1375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1409839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!kay) {
1415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1469839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->macsec_get_capability) {
1475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1489839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			   "KaY: secy macsec_get_capability operation not supported");
1495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1529839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->macsec_get_capability(ops->ctx, cap);
1535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1569839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_get_receive_lowest_pn(struct ieee802_1x_kay *kay,
1579839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			       struct receive_sa *rxsa)
1585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1619839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!kay || !rxsa) {
1625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1679839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->get_receive_lowest_pn) {
1685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_receive_lowest_pn operation not supported");
1705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1739839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->get_receive_lowest_pn(ops->ctx, rxsa);
1745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1779839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_get_transmit_next_pn(struct ieee802_1x_kay *kay,
1785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			      struct transmit_sa *txsa)
1795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
1835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1889839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->get_transmit_next_pn) {
1895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_receive_lowest_pn operation not supported");
1915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1949839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->get_transmit_next_pn(ops->ctx, txsa);
1955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1989839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
1999839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			      struct transmit_sa *txsa)
2005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2039839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!kay || !txsa) {
2045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2099839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->set_transmit_next_pn) {
2105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2119839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			   "KaY: secy get_receive_lowest_pn operation not supported");
2125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2159839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->set_transmit_next_pn(ops->ctx, txsa);
2165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
2205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsc) {
2245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_receive_sc) {
2305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_receive_sc operation not supported");
2325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2359839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->create_receive_sc(ops->ctx, rxsc, kay->vf, kay->co);
2365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_delete_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
2405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsc) {
2445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->delete_receive_sc) {
2505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy delete_receive_sc operation not supported");
2525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2559839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->delete_receive_sc(ops->ctx, rxsc);
2565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
2605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
2645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_receive_sa) {
2705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_receive_sa operation not supported");
2725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2759839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->create_receive_sa(ops->ctx, rxsa);
2765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2799839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_delete_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
2805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
2845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2899839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->delete_receive_sa) {
2905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2919839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			   "KaY: secy delete_receive_sa operation not supported");
2925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2959839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->delete_receive_sa(ops->ctx, rxsa);
2965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2999839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_enable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
3005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
3045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3099839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->enable_receive_sa) {
3105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3119839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			   "KaY: secy enable_receive_sa operation not supported");
3125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3159839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	rxsa->enable_receive = TRUE;
3165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3179839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->enable_receive_sa(ops->ctx, rxsa);
3185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3219839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_disable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
3225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3259839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!kay || !rxsa) {
3265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3319839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->disable_receive_sa) {
3325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3339839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			   "KaY: secy disable_receive_sa operation not supported");
3345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3379839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	rxsa->enable_receive = FALSE;
3389839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
3399839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->disable_receive_sa(ops->ctx, rxsa);
3405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_transmit_sc(struct ieee802_1x_kay *kay,
3445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sc *txsc)
3455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsc) {
3495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_transmit_sc) {
3555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_transmit_sc operation not supported");
3575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3609839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->create_transmit_sc(ops->ctx, txsc, kay->co);
3615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_delete_transmit_sc(struct ieee802_1x_kay *kay,
3655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sc *txsc)
3665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsc) {
3705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->delete_transmit_sc) {
3765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy delete_transmit_sc operation not supported");
3785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3819839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->delete_transmit_sc(ops->ctx, txsc);
3825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_transmit_sa(struct ieee802_1x_kay *kay,
3865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sa *txsa)
3875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
3915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_transmit_sa) {
3975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_transmit_sa operation not supported");
3995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4029839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->create_transmit_sa(ops->ctx, txsa);
4039839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt}
4049839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
4059839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
4069839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidtint secy_delete_transmit_sa(struct ieee802_1x_kay *kay,
4079839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			    struct transmit_sa *txsa)
4089839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt{
4099839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4109839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
4119839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!kay || !txsa) {
4129839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4139839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt		return -1;
4149839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	}
4159839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
4169839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	ops = kay->ctx;
4179839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	if (!ops || !ops->delete_transmit_sa) {
4189839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt		wpa_printf(MSG_ERROR,
4199839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt			   "KaY: secy delete_transmit_sa operation not supported");
4209839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt		return -1;
4219839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	}
4229839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt
4239839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->delete_transmit_sa(ops->ctx, txsa);
4245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_enable_transmit_sa(struct ieee802_1x_kay *kay,
4285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sa *txsa)
4295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
4335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
4385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->enable_transmit_sa) {
4395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy enable_transmit_sa operation not supported");
4415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	txsa->enable_transmit = TRUE;
4455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4469839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->enable_transmit_sa(ops->ctx, txsa);
4475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_disable_transmit_sa(struct ieee802_1x_kay *kay,
4515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			     struct transmit_sa *txsa)
4525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
4565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
4615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->disable_transmit_sa) {
4625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy disable_transmit_sa operation not supported");
4645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	txsa->enable_transmit = FALSE;
4685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4699839ecd75c832023d4d13fd2917a8c28261ff668Dmitry Shmidt	return ops->disable_transmit_sa(ops->ctx, txsa);
4705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_init_macsec(struct ieee802_1x_kay *kay)
4745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int ret;
4765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct macsec_init_params params;
4785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
4805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
4855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->macsec_init) {
4865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy macsec_init operation not supported");
4885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	params.use_es = FALSE;
4925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	params.use_scb = FALSE;
4935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	params.always_include_sci = TRUE;
4945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ret = ops->macsec_init(ops->ctx, &params);
4965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ret;
4985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
5005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
5015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_deinit_macsec(struct ieee802_1x_kay *kay)
5025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
5035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
5045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
5055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
5065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
5075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
5085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
5095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
5105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
5115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->macsec_deinit) {
5125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
5135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy macsec_deinit operation not supported");
5145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
5155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
5165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
5175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->macsec_deinit(ops->ctx);
5185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
519