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
485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_replay(struct ieee802_1x_kay *kay, Boolean enabled, u32 win)
495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->set_replay_protect) {
595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy set_replay_protect operation not supported");
615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->set_replay_protect(ops->ctx, enabled, win);
655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_current_cipher_suite(struct ieee802_1x_kay *kay,
695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					 const u8 *cs, size_t cs_len)
705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->set_current_cipher_suite) {
805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy set_current_cipher_suite operation not supported");
825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->set_current_cipher_suite(ops->ctx, cs, cs_len);
865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_confidentiality_offset(struct ieee802_1x_kay *kay,
905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					   enum confidentiality_offset co)
915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	kay->co = co;
935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return 0;
945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_cp_control_enable_port(struct ieee802_1x_kay *kay, Boolean enabled)
985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
1025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->enable_controlled_port) {
1085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy enable_controlled_port operation not supported");
1105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->enable_controlled_port(ops->ctx, enabled);
1145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_get_receive_lowest_pn(struct ieee802_1x_kay *kay,
1185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			       struct receive_sa *rxsa)
1195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
1235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->get_receive_lowest_pn) {
1295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_receive_lowest_pn operation not supported");
1315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->get_receive_lowest_pn(ops->ctx,
1355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					rxsa->sc->channel,
1365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					rxsa->an,
1375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					&rxsa->lowest_pn);
1385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_get_transmit_next_pn(struct ieee802_1x_kay *kay,
1425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			      struct transmit_sa *txsa)
1435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
1475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->get_transmit_next_pn) {
1535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_receive_lowest_pn operation not supported");
1555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->get_transmit_next_pn(ops->ctx,
1595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->sc->channel,
1605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->an,
1615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					&txsa->next_pn);
1625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
1665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			      struct transmit_sa *txsa)
1675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
1715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->set_transmit_next_pn) {
1775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
1785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_receive_lowest_pn operation not supported");
1795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->set_transmit_next_pn(ops->ctx,
1835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->sc->channel,
1845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->an,
1855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->next_pn);
1865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
1875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_get_available_receive_sc(struct ieee802_1x_kay *kay, u32 *channel)
1905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
1915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
1925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
1945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
1955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
1965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
1975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
1985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
1995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->get_available_receive_sc) {
2005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_available_receive_sc operation not supported");
2025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->get_available_receive_sc(ops->ctx, channel);
2065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
2105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsc) {
2145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_receive_sc) {
2205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_receive_sc operation not supported");
2225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->create_receive_sc(ops->ctx, rxsc->channel, &rxsc->sci,
2265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				      kay->vf, kay->co);
2275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_delete_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
2315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsc) {
2355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->delete_receive_sc) {
2415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy delete_receive_sc operation not supported");
2435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->delete_receive_sc(ops->ctx, rxsc->channel);
2475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
2515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
2555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_receive_sa) {
2615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_receive_sa operation not supported");
2635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->create_receive_sa(ops->ctx, rxsa->sc->channel, rxsa->an,
2675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				      rxsa->lowest_pn, rxsa->pkey->key);
2685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_enable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
2725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
2765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
2815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->enable_receive_sa) {
2825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
2835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy enable_receive_sa operation not supported");
2845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
2855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
2865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	rxsa->enable_receive = TRUE;
2885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->enable_receive_sa(ops->ctx, rxsa->sc->channel, rxsa->an);
2905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
2915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_disable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
2945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
2955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
2965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
2975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !rxsa) {
2985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
2995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->disable_receive_sa) {
3045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy disable_receive_sa operation not supported");
3065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	rxsa->enable_receive = FALSE;
3105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->disable_receive_sa(ops->ctx, rxsa->sc->channel, rxsa->an);
3125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_get_available_transmit_sc(struct ieee802_1x_kay *kay, u32 *channel)
3165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
3205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->get_available_transmit_sc) {
3265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy get_available_transmit_sc operation not supported");
3285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->get_available_transmit_sc(ops->ctx, channel);
3325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_transmit_sc(struct ieee802_1x_kay *kay,
3365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sc *txsc)
3375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsc) {
3415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_transmit_sc) {
3475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_transmit_sc operation not supported");
3495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->create_transmit_sc(ops->ctx, txsc->channel, &txsc->sci,
3535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt				       kay->co);
3545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_delete_transmit_sc(struct ieee802_1x_kay *kay,
3585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sc *txsc)
3595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsc) {
3635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->delete_transmit_sc) {
3695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy delete_transmit_sc operation not supported");
3715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->delete_transmit_sc(ops->ctx, txsc->channel);
3755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_create_transmit_sa(struct ieee802_1x_kay *kay,
3795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sa *txsa)
3805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
3815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
3825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
3845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
3855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
3895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->create_transmit_sa) {
3905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
3915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy create_transmit_sa operation not supported");
3925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
3935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
3945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
3955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->create_transmit_sa(ops->ctx, txsa->sc->channel, txsa->an,
3965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->next_pn, txsa->confidentiality,
3975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt					txsa->pkey->key);
3985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
3995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_enable_transmit_sa(struct ieee802_1x_kay *kay,
4025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			    struct transmit_sa *txsa)
4035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
4075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
4125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->enable_transmit_sa) {
4135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy enable_transmit_sa operation not supported");
4155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	txsa->enable_transmit = TRUE;
4195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->enable_transmit_sa(ops->ctx, txsa->sc->channel, txsa->an);
4215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_disable_transmit_sa(struct ieee802_1x_kay *kay,
4255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			     struct transmit_sa *txsa)
4265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay || !txsa) {
4305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
4355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->disable_transmit_sa) {
4365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy disable_transmit_sa operation not supported");
4385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	txsa->enable_transmit = FALSE;
4425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->disable_transmit_sa(ops->ctx, txsa->sc->channel, txsa->an);
4445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_init_macsec(struct ieee802_1x_kay *kay)
4485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	int ret;
4505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
4515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct macsec_init_params params;
4525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!kay) {
4545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
4555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ops = kay->ctx;
4595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	if (!ops || !ops->macsec_init) {
4605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy macsec_init operation not supported");
4625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	params.use_es = FALSE;
4665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	params.use_scb = FALSE;
4675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	params.always_include_sci = TRUE;
4685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	ret = ops->macsec_init(ops->ctx, &params);
4705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ret;
4725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
4735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint secy_deinit_macsec(struct ieee802_1x_kay *kay)
4765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{
4775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	struct ieee802_1x_kay_ctx *ops;
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_deinit) {
4865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		wpa_printf(MSG_ERROR,
4875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt			   "KaY: secy macsec_deinit operation not supported");
4885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt		return -1;
4895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	}
4905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
4915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	return ops->macsec_deinit(ops->ctx);
4925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}
493