Blame SOURCES/macsec-0008-mka-Remove-channel-hacks-from-the-stack-and-the-macs.patch

b645d2
From 6f551abdfca16021e7cd9d4ac891e3eb27010a90 Mon Sep 17 00:00:00 2001
b645d2
Message-Id: <6f551abdfca16021e7cd9d4ac891e3eb27010a90.1488376601.git.dcaratti@redhat.com>
b645d2
From: Sabrina Dubroca <sd@queasysnail.net>
b645d2
Date: Fri, 21 Oct 2016 14:45:26 +0200
b645d2
Subject: [PATCH] mka: Remove "channel" hacks from the stack and the macsec_qca
b645d2
 driver
b645d2
b645d2
This is specific to the macsec_qca driver. The core implementation
b645d2
shouldn't care about this, and only deal with the complete secure
b645d2
channel, and pass this down to the driver.
b645d2
b645d2
Drivers that have such limitations should take care of these in their
b645d2
->create functions and throw an error.
b645d2
b645d2
Since the core MKA no longer saves the channel number, the macsec_qca
b645d2
driver must be able to recover it. Add a map (which is just an array
b645d2
since it's quite short) to match SCIs to channel numbers, and lookup
b645d2
functions that will be called in every place where functions would get
b645d2
the channel from the core code. Getting an available channel should be
b645d2
part of channel creation, instead of being a preparation step.
b645d2
b645d2
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
b645d2
---
b645d2
 src/drivers/driver.h            |  16 ----
b645d2
 src/drivers/driver_macsec_qca.c | 174 +++++++++++++++++++++++++++++++++-------
b645d2
 src/pae/ieee802_1x_kay.c        |  41 +++-------
b645d2
 src/pae/ieee802_1x_kay.h        |   7 --
b645d2
 src/pae/ieee802_1x_secy_ops.c   |  40 ---------
b645d2
 src/pae/ieee802_1x_secy_ops.h   |   2 -
b645d2
 wpa_supplicant/driver_i.h       |  18 -----
b645d2
 wpa_supplicant/wpas_kay.c       |  14 ----
b645d2
 8 files changed, 159 insertions(+), 153 deletions(-)
b645d2
b645d2
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
b645d2
index aeb9694..54ae6b7 100644
b645d2
--- a/src/drivers/driver.h
b645d2
+++ b/src/drivers/driver.h
b645d2
@@ -3390,14 +3390,6 @@ struct wpa_driver_ops {
b645d2
 	int (*set_transmit_next_pn)(void *priv, struct transmit_sa *sa);
b645d2
 
b645d2
 	/**
b645d2
-	 * get_available_receive_sc - get available receive channel
b645d2
-	 * @priv: Private driver interface data
b645d2
-	 * @channel: secure channel
b645d2
-	 * Returns: 0 on success, -1 on failure (or if not supported)
b645d2
-	 */
b645d2
-	int (*get_available_receive_sc)(void *priv, u32 *channel);
b645d2
-
b645d2
-	/**
b645d2
 	 * create_receive_sc - create secure channel for receiving
b645d2
 	 * @priv: Private driver interface data
b645d2
 	 * @sc: secure channel
b645d2
@@ -3443,14 +3435,6 @@ struct wpa_driver_ops {
b645d2
 	int (*disable_receive_sa)(void *priv, struct receive_sa *sa);
b645d2
 
b645d2
 	/**
b645d2
-	 * get_available_transmit_sc - get available transmit channel
b645d2
-	 * @priv: Private driver interface data
b645d2
-	 * @channel: secure channel
b645d2
-	 * Returns: 0 on success, -1 on failure (or if not supported)
b645d2
-	 */
b645d2
-	int (*get_available_transmit_sc)(void *priv, u32 *channel);
b645d2
-
b645d2
-	/**
b645d2
 	 * create_transmit_sc - create secure connection for transmit
b645d2
 	 * @priv: private driver interface data from init()
b645d2
 	 * @sc: secure channel
b645d2
diff --git a/src/drivers/driver_macsec_qca.c b/src/drivers/driver_macsec_qca.c
b645d2
index 041bcf5..22d414c 100644
b645d2
--- a/src/drivers/driver_macsec_qca.c
b645d2
+++ b/src/drivers/driver_macsec_qca.c
b645d2
@@ -56,6 +56,10 @@
b645d2
 static const u8 pae_group_addr[ETH_ALEN] =
b645d2
 { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x03 };
b645d2
 
b645d2
+struct channel_map {
b645d2
+	struct ieee802_1x_mka_sci sci;
b645d2
+};
b645d2
+
b645d2
 struct macsec_qca_data {
b645d2
 	char ifname[IFNAMSIZ + 1];
b645d2
 	u32 secy_id;
b645d2
@@ -72,6 +76,9 @@ struct macsec_qca_data {
b645d2
 	Boolean protect_frames;
b645d2
 	Boolean replay_protect;
b645d2
 	u32 replay_window;
b645d2
+
b645d2
+	struct channel_map receive_channel_map[MAXSC];
b645d2
+	struct channel_map transmit_channel_map[MAXSC];
b645d2
 };
b645d2
 
b645d2
 
b645d2
@@ -526,6 +533,68 @@ static int macsec_qca_enable_controlled_port(void *priv, Boolean enabled)
b645d2
 }
b645d2
 
b645d2
 
b645d2
+static int macsec_qca_lookup_channel(struct channel_map *map,
b645d2
+				     struct ieee802_1x_mka_sci *sci,
b645d2
+				     u32 *channel)
b645d2
+{
b645d2
+	u32 i;
b645d2
+
b645d2
+	for (i = 0; i < MAXSC; i++) {
b645d2
+		if (os_memcmp(&map[i].sci, sci,
b645d2
+			      sizeof(struct ieee802_1x_mka_sci)) == 0) {
b645d2
+			*channel = i;
b645d2
+			return 0;
b645d2
+		}
b645d2
+	}
b645d2
+
b645d2
+	return -1;
b645d2
+}
b645d2
+
b645d2
+
b645d2
+static void macsec_qca_register_channel(struct channel_map *map,
b645d2
+					struct ieee802_1x_mka_sci *sci,
b645d2
+					u32 channel)
b645d2
+{
b645d2
+	os_memcpy(&map[channel].sci, sci, sizeof(struct ieee802_1x_mka_sci));
b645d2
+}
b645d2
+
b645d2
+
b645d2
+static int macsec_qca_lookup_receive_channel(struct macsec_qca_data *drv,
b645d2
+					     struct receive_sc *sc,
b645d2
+					     u32 *channel)
b645d2
+{
b645d2
+	return macsec_qca_lookup_channel(drv->receive_channel_map, &sc->sci,
b645d2
+					 channel);
b645d2
+}
b645d2
+
b645d2
+
b645d2
+static void macsec_qca_register_receive_channel(struct macsec_qca_data *drv,
b645d2
+						struct receive_sc *sc,
b645d2
+						u32 channel)
b645d2
+{
b645d2
+	macsec_qca_register_channel(drv->receive_channel_map, &sc->sci,
b645d2
+				    channel);
b645d2
+}
b645d2
+
b645d2
+
b645d2
+static int macsec_qca_lookup_transmit_channel(struct macsec_qca_data *drv,
b645d2
+					      struct transmit_sc *sc,
b645d2
+					      u32 *channel)
b645d2
+{
b645d2
+	return macsec_qca_lookup_channel(drv->transmit_channel_map, &sc->sci,
b645d2
+					 channel);
b645d2
+}
b645d2
+
b645d2
+
b645d2
+static void macsec_qca_register_transmit_channel(struct macsec_qca_data *drv,
b645d2
+						 struct transmit_sc *sc,
b645d2
+						 u32 channel)
b645d2
+{
b645d2
+	macsec_qca_register_channel(drv->transmit_channel_map, &sc->sci,
b645d2
+				    channel);
b645d2
+}
b645d2
+
b645d2
+
b645d2
 static int macsec_qca_get_receive_lowest_pn(void *priv, struct receive_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
@@ -533,7 +602,11 @@ static int macsec_qca_get_receive_lowest_pn(void *priv, struct receive_sa *sa)
b645d2
 	u32 next_pn = 0;
b645d2
 	bool enabled = FALSE;
b645d2
 	u32 win;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_receive_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	ret += nss_macsec_secy_rx_sa_next_pn_get(drv->secy_id, channel, sa->an,
b645d2
 						 &next_pn);
b645d2
@@ -557,7 +630,11 @@ static int macsec_qca_get_transmit_next_pn(void *priv, struct transmit_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
 	int ret = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_transmit_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	ret += nss_macsec_secy_tx_sa_next_pn_get(drv->secy_id, channel, sa->an,
b645d2
 						 &sa->next_pn);
b645d2
@@ -572,8 +649,11 @@ int macsec_qca_set_transmit_next_pn(void *priv, struct transmit_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
 	int ret = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	u32 channel;
b645d2
 
b645d2
+	ret = macsec_qca_lookup_transmit_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	ret += nss_macsec_secy_tx_sa_next_pn_set(drv->secy_id, channel, sa->an,
b645d2
 						 sa->next_pn);
b645d2
@@ -620,10 +700,14 @@ static int macsec_qca_create_receive_sc(void *priv, struct receive_sc *sc,
b645d2
 	fal_rx_prc_lut_t entry;
b645d2
 	fal_rx_sc_validate_frame_e vf;
b645d2
 	enum validate_frames validate_frames = validation;
b645d2
-	u32 channel = sc->channel;
b645d2
+	u32 channel;
b645d2
 	const u8 *sci_addr = sc->sci.addr;
b645d2
 	u16 sci_port = be_to_host16(sc->sci.port);
b645d2
 
b645d2
+	ret = macsec_qca_get_available_receive_sc(priv, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
+
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
b645d2
 
b645d2
 	/* rx prc lut */
b645d2
@@ -657,6 +741,8 @@ static int macsec_qca_create_receive_sc(void *priv, struct receive_sc *sc,
b645d2
 							    channel,
b645d2
 							    drv->replay_window);
b645d2
 
b645d2
+	macsec_qca_register_receive_channel(drv, sc, channel);
b645d2
+
b645d2
 	return ret;
b645d2
 }
b645d2
 
b645d2
@@ -664,9 +750,13 @@ static int macsec_qca_create_receive_sc(void *priv, struct receive_sc *sc,
b645d2
 static int macsec_qca_delete_receive_sc(void *priv, struct receive_sc *sc)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
+	int ret;
b645d2
 	fal_rx_prc_lut_t entry;
b645d2
-	u32 channel = sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_receive_channel(priv, sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
b645d2
 
b645d2
@@ -683,10 +773,14 @@ static int macsec_qca_delete_receive_sc(void *priv, struct receive_sc *sc)
b645d2
 static int macsec_qca_create_receive_sa(void *priv, struct receive_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
+	int ret;
b645d2
 	fal_rx_sak_t rx_sak;
b645d2
 	int i = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_receive_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s, channel=%d, an=%d, lpn=0x%x",
b645d2
 		   __func__, channel, sa->an, sa->lowest_pn);
b645d2
@@ -706,9 +800,12 @@ static int macsec_qca_create_receive_sa(void *priv, struct receive_sa *sa)
b645d2
 static int macsec_qca_enable_receive_sa(void *priv, struct receive_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	int ret;
b645d2
+	u32 channel;
b645d2
 
b645d2
+	ret = macsec_qca_lookup_receive_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel,
b645d2
 		   sa->an);
b645d2
@@ -723,8 +820,12 @@ static int macsec_qca_enable_receive_sa(void *priv, struct receive_sa *sa)
b645d2
 static int macsec_qca_disable_receive_sa(void *priv, struct receive_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	int ret;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_receive_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel,
b645d2
 		   sa->an);
b645d2
@@ -739,14 +840,12 @@ static int macsec_qca_disable_receive_sa(void *priv, struct receive_sa *sa)
b645d2
 static int macsec_qca_get_available_transmit_sc(void *priv, u32 *channel)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
 	u32 sc_ch = 0;
b645d2
 	bool in_use = FALSE;
b645d2
 
b645d2
 	for (sc_ch = 0; sc_ch < MAXSC; sc_ch++) {
b645d2
-		ret = nss_macsec_secy_tx_sc_in_used_get(drv->secy_id, sc_ch,
b645d2
-							&in_use);
b645d2
-		if (ret)
b645d2
+		if (nss_macsec_secy_tx_sc_in_used_get(drv->secy_id, sc_ch,
b645d2
+						      &in_use))
b645d2
 			continue;
b645d2
 
b645d2
 		if (!in_use) {
b645d2
@@ -767,10 +866,14 @@ static int macsec_qca_create_transmit_sc(void *priv, struct transmit_sc *sc,
b645d2
 					 unsigned int conf_offset)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
+	int ret;
b645d2
 	fal_tx_class_lut_t entry;
b645d2
 	u8 psci[ETH_ALEN + 2];
b645d2
-	u32 channel = sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_get_available_transmit_sc(priv, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
b645d2
 
b645d2
@@ -793,6 +896,8 @@ static int macsec_qca_create_transmit_sc(void *priv, struct transmit_sc *sc,
b645d2
 								channel,
b645d2
 								conf_offset);
b645d2
 
b645d2
+	macsec_qca_register_transmit_channel(drv, sc, channel);
b645d2
+
b645d2
 	return ret;
b645d2
 }
b645d2
 
b645d2
@@ -800,9 +905,13 @@ static int macsec_qca_create_transmit_sc(void *priv, struct transmit_sc *sc,
b645d2
 static int macsec_qca_delete_transmit_sc(void *priv, struct transmit_sc *sc)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
+	int ret;
b645d2
 	fal_tx_class_lut_t entry;
b645d2
-	u32 channel = sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_transmit_channel(priv, sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel);
b645d2
 
b645d2
@@ -819,11 +928,15 @@ static int macsec_qca_delete_transmit_sc(void *priv, struct transmit_sc *sc)
b645d2
 static int macsec_qca_create_transmit_sa(void *priv, struct transmit_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
+	int ret;
b645d2
 	u8 tci = 0;
b645d2
 	fal_tx_sak_t tx_sak;
b645d2
 	int i;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_transmit_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG,
b645d2
 		   "%s: channel=%d, an=%d, next_pn=0x%x, confidentiality=%d",
b645d2
@@ -858,9 +971,12 @@ static int macsec_qca_create_transmit_sa(void *priv, struct transmit_sa *sa)
b645d2
 static int macsec_qca_enable_transmit_sa(void *priv, struct transmit_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	int ret;
b645d2
+	u32 channel;
b645d2
 
b645d2
+	ret = macsec_qca_lookup_transmit_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel,
b645d2
 		   sa->an);
b645d2
@@ -875,8 +991,12 @@ static int macsec_qca_enable_transmit_sa(void *priv, struct transmit_sa *sa)
b645d2
 static int macsec_qca_disable_transmit_sa(void *priv, struct transmit_sa *sa)
b645d2
 {
b645d2
 	struct macsec_qca_data *drv = priv;
b645d2
-	int ret = 0;
b645d2
-	u32 channel = sa->sc->channel;
b645d2
+	int ret;
b645d2
+	u32 channel;
b645d2
+
b645d2
+	ret = macsec_qca_lookup_transmit_channel(priv, sa->sc, &channel);
b645d2
+	if (ret != 0)
b645d2
+		return ret;
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel,
b645d2
 		   sa->an);
b645d2
@@ -907,13 +1027,11 @@ const struct wpa_driver_ops wpa_driver_macsec_qca_ops = {
b645d2
 	.get_receive_lowest_pn = macsec_qca_get_receive_lowest_pn,
b645d2
 	.get_transmit_next_pn = macsec_qca_get_transmit_next_pn,
b645d2
 	.set_transmit_next_pn = macsec_qca_set_transmit_next_pn,
b645d2
-	.get_available_receive_sc = macsec_qca_get_available_receive_sc,
b645d2
 	.create_receive_sc = macsec_qca_create_receive_sc,
b645d2
 	.delete_receive_sc = macsec_qca_delete_receive_sc,
b645d2
 	.create_receive_sa = macsec_qca_create_receive_sa,
b645d2
 	.enable_receive_sa = macsec_qca_enable_receive_sa,
b645d2
 	.disable_receive_sa = macsec_qca_disable_receive_sa,
b645d2
-	.get_available_transmit_sc = macsec_qca_get_available_transmit_sc,
b645d2
 	.create_transmit_sc = macsec_qca_create_transmit_sc,
b645d2
 	.delete_transmit_sc = macsec_qca_delete_transmit_sc,
b645d2
 	.create_transmit_sa = macsec_qca_create_transmit_sa,
b645d2
diff --git a/src/pae/ieee802_1x_kay.c b/src/pae/ieee802_1x_kay.c
b645d2
index 52eeeff..38a8293 100644
b645d2
--- a/src/pae/ieee802_1x_kay.c
b645d2
+++ b/src/pae/ieee802_1x_kay.c
b645d2
@@ -440,8 +440,8 @@ ieee802_1x_kay_init_receive_sa(struct receive_sc *psc, u8 an, u32 lowest_pn,
b645d2
 
b645d2
 	dl_list_add(&psc->sa_list, &psa->list);
b645d2
 	wpa_printf(MSG_DEBUG,
b645d2
-		   "KaY: Create receive SA(AN: %hhu lowest_pn: %u of SC(channel: %d)",
b645d2
-		   an, lowest_pn, psc->channel);
b645d2
+		   "KaY: Create receive SA(AN: %hhu lowest_pn: %u of SC",
b645d2
+		   an, lowest_pn);
b645d2
 
b645d2
 	return psa;
b645d2
 }
b645d2
@@ -465,8 +465,7 @@ static void ieee802_1x_kay_deinit_receive_sa(struct receive_sa *psa)
b645d2
  * ieee802_1x_kay_init_receive_sc -
b645d2
  */
b645d2
 static struct receive_sc *
b645d2
-ieee802_1x_kay_init_receive_sc(const struct ieee802_1x_mka_sci *psci,
b645d2
-			       int channel)
b645d2
+ieee802_1x_kay_init_receive_sc(const struct ieee802_1x_mka_sci *psci)
b645d2
 {
b645d2
 	struct receive_sc *psc;
b645d2
 
b645d2
@@ -480,13 +479,12 @@ ieee802_1x_kay_init_receive_sc(const struct ieee802_1x_mka_sci *psci,
b645d2
 	}
b645d2
 
b645d2
 	os_memcpy(&psc->sci, psci, sizeof(psc->sci));
b645d2
-	psc->channel = channel;
b645d2
 
b645d2
 	os_get_time(&psc->created_time);
b645d2
 	psc->receiving = FALSE;
b645d2
 
b645d2
 	dl_list_init(&psc->sa_list);
b645d2
-	wpa_printf(MSG_DEBUG, "KaY: Create receive SC(channel: %d)", channel);
b645d2
+	wpa_printf(MSG_DEBUG, "KaY: Create receive SC");
b645d2
 	wpa_hexdump(MSG_DEBUG, "SCI: ", (u8 *)psci, sizeof(*psci));
b645d2
 
b645d2
 	return psc;
b645d2
@@ -502,8 +500,7 @@ ieee802_1x_kay_deinit_receive_sc(
b645d2
 {
b645d2
 	struct receive_sa *psa, *pre_sa;
b645d2
 
b645d2
-	wpa_printf(MSG_DEBUG, "KaY: Delete receive SC(channel: %d)",
b645d2
-		   psc->channel);
b645d2
+	wpa_printf(MSG_DEBUG, "KaY: Delete receive SC");
b645d2
 	dl_list_for_each_safe(psa, pre_sa, &psc->sa_list, struct receive_sa,
b645d2
 			      list)  {
b645d2
 		secy_disable_receive_sa(participant->kay, psa);
b645d2
@@ -552,7 +549,6 @@ ieee802_1x_kay_create_live_peer(struct ieee802_1x_mka_participant *participant,
b645d2
 {
b645d2
 	struct ieee802_1x_kay_peer *peer;
b645d2
 	struct receive_sc *rxsc;
b645d2
-	u32 sc_ch = 0;
b645d2
 
b645d2
 	peer = ieee802_1x_kay_create_peer(mi, mn);
b645d2
 	if (!peer)
b645d2
@@ -561,9 +557,7 @@ ieee802_1x_kay_create_live_peer(struct ieee802_1x_mka_participant *participant,
b645d2
 	os_memcpy(&peer->sci, &participant->current_peer_sci,
b645d2
 		  sizeof(peer->sci));
b645d2
 
b645d2
-	secy_get_available_receive_sc(participant->kay, &sc_ch);
b645d2
-
b645d2
-	rxsc = ieee802_1x_kay_init_receive_sc(&peer->sci, sc_ch);
b645d2
+	rxsc = ieee802_1x_kay_init_receive_sc(&peer->sci);
b645d2
 	if (!rxsc) {
b645d2
 		os_free(peer);
b645d2
 		return NULL;
b645d2
@@ -611,12 +605,10 @@ ieee802_1x_kay_move_live_peer(struct ieee802_1x_mka_participant *participant,
b645d2
 {
b645d2
 	struct ieee802_1x_kay_peer *peer;
b645d2
 	struct receive_sc *rxsc;
b645d2
-	u32 sc_ch = 0;
b645d2
 
b645d2
 	peer = ieee802_1x_kay_get_potential_peer(participant, mi);
b645d2
 
b645d2
-	rxsc = ieee802_1x_kay_init_receive_sc(&participant->current_peer_sci,
b645d2
-					      sc_ch);
b645d2
+	rxsc = ieee802_1x_kay_init_receive_sc(&participant->current_peer_sci);
b645d2
 	if (!rxsc)
b645d2
 		return NULL;
b645d2
 
b645d2
@@ -631,8 +623,6 @@ ieee802_1x_kay_move_live_peer(struct ieee802_1x_mka_participant *participant,
b645d2
 	dl_list_del(&peer->list);
b645d2
 	dl_list_add_tail(&participant->live_peers, &peer->list);
b645d2
 
b645d2
-	secy_get_available_receive_sc(participant->kay, &sc_ch);
b645d2
-
b645d2
 	dl_list_add(&participant->rxsc_list, &rxsc->list);
b645d2
 	secy_create_receive_sc(participant->kay, rxsc);
b645d2
 
b645d2
@@ -2438,8 +2428,8 @@ ieee802_1x_kay_init_transmit_sa(struct transmit_sc *psc, u8 an, u32 next_PN,
b645d2
 
b645d2
 	dl_list_add(&psc->sa_list, &psa->list);
b645d2
 	wpa_printf(MSG_DEBUG,
b645d2
-		   "KaY: Create transmit SA(an: %hhu, next_PN: %u) of SC(channel: %d)",
b645d2
-		   an, next_PN, psc->channel);
b645d2
+		   "KaY: Create transmit SA(an: %hhu, next_PN: %u) of SC",
b645d2
+		   an, next_PN);
b645d2
 
b645d2
 	return psa;
b645d2
 }
b645d2
@@ -2463,8 +2453,7 @@ static void ieee802_1x_kay_deinit_transmit_sa(struct transmit_sa *psa)
b645d2
  * init_transmit_sc -
b645d2
  */
b645d2
 static struct transmit_sc *
b645d2
-ieee802_1x_kay_init_transmit_sc(const struct ieee802_1x_mka_sci *sci,
b645d2
-				int channel)
b645d2
+ieee802_1x_kay_init_transmit_sc(const struct ieee802_1x_mka_sci *sci)
b645d2
 {
b645d2
 	struct transmit_sc *psc;
b645d2
 
b645d2
@@ -2474,7 +2463,6 @@ ieee802_1x_kay_init_transmit_sc(const struct ieee802_1x_mka_sci *sci,
b645d2
 		return NULL;
b645d2
 	}
b645d2
 	os_memcpy(&psc->sci, sci, sizeof(psc->sci));
b645d2
-	psc->channel = channel;
b645d2
 
b645d2
 	os_get_time(&psc->created_time);
b645d2
 	psc->transmitting = FALSE;
b645d2
@@ -2482,7 +2470,7 @@ ieee802_1x_kay_init_transmit_sc(const struct ieee802_1x_mka_sci *sci,
b645d2
 	psc->enciphering_sa = FALSE;
b645d2
 
b645d2
 	dl_list_init(&psc->sa_list);
b645d2
-	wpa_printf(MSG_DEBUG, "KaY: Create transmit SC(channel: %d)", channel);
b645d2
+	wpa_printf(MSG_DEBUG, "KaY: Create transmit SC");
b645d2
 	wpa_hexdump(MSG_DEBUG, "SCI: ", (u8 *)sci , sizeof(*sci));
b645d2
 
b645d2
 	return psc;
b645d2
@@ -2498,8 +2486,7 @@ ieee802_1x_kay_deinit_transmit_sc(
b645d2
 {
b645d2
 	struct transmit_sa *psa, *tmp;
b645d2
 
b645d2
-	wpa_printf(MSG_DEBUG, "KaY: Delete transmit SC(channel: %d)",
b645d2
-		   psc->channel);
b645d2
+	wpa_printf(MSG_DEBUG, "KaY: Delete transmit SC");
b645d2
 	dl_list_for_each_safe(psa, tmp, &psc->sa_list, struct transmit_sa,
b645d2
 			      list) {
b645d2
 		secy_disable_transmit_sa(participant->kay, psa);
b645d2
@@ -3089,7 +3076,6 @@ ieee802_1x_kay_init(struct ieee802_1x_kay_ctx *ctx, enum macsec_policy policy,
b645d2
 
b645d2
 	/* Initialize the SecY must be prio to CP, as CP will control SecY */
b645d2
 	secy_init_macsec(kay);
b645d2
-	secy_get_available_transmit_sc(kay, &kay->sc_ch);
b645d2
 
b645d2
 	wpa_printf(MSG_DEBUG, "KaY: secy init macsec done");
b645d2
 
b645d2
@@ -3250,8 +3236,7 @@ ieee802_1x_kay_create_mka(struct ieee802_1x_kay *kay, struct mka_key_name *ckn,
b645d2
 	dl_list_init(&participant->sak_list);
b645d2
 	participant->new_key = NULL;
b645d2
 	dl_list_init(&participant->rxsc_list);
b645d2
-	participant->txsc = ieee802_1x_kay_init_transmit_sc(&kay->actor_sci,
b645d2
-							    kay->sc_ch);
b645d2
+	participant->txsc = ieee802_1x_kay_init_transmit_sc(&kay->actor_sci);
b645d2
 	secy_cp_control_protect_frames(kay, kay->macsec_protect);
b645d2
 	secy_cp_control_replay(kay, kay->macsec_replay_protect,
b645d2
 			       kay->macsec_replay_window);
b645d2
diff --git a/src/pae/ieee802_1x_kay.h b/src/pae/ieee802_1x_kay.h
b645d2
index bf6fbe5..c6fa387 100644
b645d2
--- a/src/pae/ieee802_1x_kay.h
b645d2
+++ b/src/pae/ieee802_1x_kay.h
b645d2
@@ -80,8 +80,6 @@ struct transmit_sc {
b645d2
 	u8 enciphering_sa; /* AN encipheringSA (read only) */
b645d2
 
b645d2
 	/* not defined data */
b645d2
-	unsigned int channel;
b645d2
-
b645d2
 	struct dl_list list;
b645d2
 	struct dl_list sa_list;
b645d2
 };
b645d2
@@ -109,8 +107,6 @@ struct receive_sc {
b645d2
 
b645d2
 	struct os_time created_time; /* Time createdTime */
b645d2
 
b645d2
-	unsigned int channel;
b645d2
-
b645d2
 	struct dl_list list;
b645d2
 	struct dl_list sa_list;
b645d2
 };
b645d2
@@ -146,7 +142,6 @@ struct ieee802_1x_kay_ctx {
b645d2
 	int (*get_receive_lowest_pn)(void *ctx, struct receive_sa *sa);
b645d2
 	int (*get_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
b645d2
 	int (*set_transmit_next_pn)(void *ctx, struct transmit_sa *sa);
b645d2
-	int (*get_available_receive_sc)(void *ctx, u32 *channel);
b645d2
 	int (*create_receive_sc)(void *ctx, struct receive_sc *sc,
b645d2
 				 enum validate_frames vf,
b645d2
 				 enum confidentiality_offset co);
b645d2
@@ -154,7 +149,6 @@ struct ieee802_1x_kay_ctx {
b645d2
 	int (*create_receive_sa)(void *ctx, struct receive_sa *sa);
b645d2
 	int (*enable_receive_sa)(void *ctx, struct receive_sa *sa);
b645d2
 	int (*disable_receive_sa)(void *ctx, struct receive_sa *sa);
b645d2
-	int (*get_available_transmit_sc)(void *ctx, u32 *channel);
b645d2
 	int (*create_transmit_sc)(void *ctx, struct transmit_sc *sc,
b645d2
 				  enum confidentiality_offset co);
b645d2
 	int (*delete_transmit_sc)(void *ctx, struct transmit_sc *sc);
b645d2
@@ -209,7 +203,6 @@ struct ieee802_1x_kay {
b645d2
 
b645d2
 	u8 mka_version;
b645d2
 	u8 algo_agility[4];
b645d2
-	u32 sc_ch;
b645d2
 
b645d2
 	u32 pn_exhaustion;
b645d2
 	Boolean port_enable;
b645d2
diff --git a/src/pae/ieee802_1x_secy_ops.c b/src/pae/ieee802_1x_secy_ops.c
b645d2
index 32ee816..b57c670 100644
b645d2
--- a/src/pae/ieee802_1x_secy_ops.c
b645d2
+++ b/src/pae/ieee802_1x_secy_ops.c
b645d2
@@ -196,26 +196,6 @@ int secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
b645d2
 }
b645d2
 
b645d2
 
b645d2
-int secy_get_available_receive_sc(struct ieee802_1x_kay *kay, u32 *channel)
b645d2
-{
b645d2
-	struct ieee802_1x_kay_ctx *ops;
b645d2
-
b645d2
-	if (!kay) {
b645d2
-		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
b645d2
-		return -1;
b645d2
-	}
b645d2
-
b645d2
-	ops = kay->ctx;
b645d2
-	if (!ops || !ops->get_available_receive_sc) {
b645d2
-		wpa_printf(MSG_ERROR,
b645d2
-			   "KaY: secy get_available_receive_sc operation not supported");
b645d2
-		return -1;
b645d2
-	}
b645d2
-
b645d2
-	return ops->get_available_receive_sc(ops->ctx, channel);
b645d2
-}
b645d2
-
b645d2
-
b645d2
 int secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc)
b645d2
 {
b645d2
 	struct ieee802_1x_kay_ctx *ops;
b645d2
@@ -320,26 +300,6 @@ int secy_disable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa)
b645d2
 }
b645d2
 
b645d2
 
b645d2
-int secy_get_available_transmit_sc(struct ieee802_1x_kay *kay, u32 *channel)
b645d2
-{
b645d2
-	struct ieee802_1x_kay_ctx *ops;
b645d2
-
b645d2
-	if (!kay) {
b645d2
-		wpa_printf(MSG_ERROR, "KaY: %s params invalid", __func__);
b645d2
-		return -1;
b645d2
-	}
b645d2
-
b645d2
-	ops = kay->ctx;
b645d2
-	if (!ops || !ops->get_available_transmit_sc) {
b645d2
-		wpa_printf(MSG_ERROR,
b645d2
-			   "KaY: secy get_available_transmit_sc operation not supported");
b645d2
-		return -1;
b645d2
-	}
b645d2
-
b645d2
-	return ops->get_available_transmit_sc(ops->ctx, channel);
b645d2
-}
b645d2
-
b645d2
-
b645d2
 int secy_create_transmit_sc(struct ieee802_1x_kay *kay,
b645d2
 			    struct transmit_sc *txsc)
b645d2
 {
b645d2
diff --git a/src/pae/ieee802_1x_secy_ops.h b/src/pae/ieee802_1x_secy_ops.h
b645d2
index bfd5737..59f0baa 100644
b645d2
--- a/src/pae/ieee802_1x_secy_ops.h
b645d2
+++ b/src/pae/ieee802_1x_secy_ops.h
b645d2
@@ -35,7 +35,6 @@ int secy_get_transmit_next_pn(struct ieee802_1x_kay *kay,
b645d2
 			      struct transmit_sa *txsa);
b645d2
 int secy_set_transmit_next_pn(struct ieee802_1x_kay *kay,
b645d2
 			      struct transmit_sa *txsa);
b645d2
-int secy_get_available_receive_sc(struct ieee802_1x_kay *kay, u32 *channel);
b645d2
 int secy_create_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc);
b645d2
 int secy_delete_receive_sc(struct ieee802_1x_kay *kay, struct receive_sc *rxsc);
b645d2
 int secy_create_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa);
b645d2
@@ -43,7 +42,6 @@ int secy_enable_receive_sa(struct ieee802_1x_kay *kay, struct receive_sa *rxsa);
b645d2
 int secy_disable_receive_sa(struct ieee802_1x_kay *kay,
b645d2
 			    struct receive_sa *rxsa);
b645d2
 
b645d2
-int secy_get_available_transmit_sc(struct ieee802_1x_kay *kay, u32 *channel);
b645d2
 int secy_create_transmit_sc(struct ieee802_1x_kay *kay,
b645d2
 			    struct transmit_sc *txsc);
b645d2
 int secy_delete_transmit_sc(struct ieee802_1x_kay *kay,
b645d2
diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
b645d2
index f8efddc..244e386 100644
b645d2
--- a/wpa_supplicant/driver_i.h
b645d2
+++ b/wpa_supplicant/driver_i.h
b645d2
@@ -780,15 +780,6 @@ static inline int wpa_drv_set_transmit_next_pn(struct wpa_supplicant *wpa_s,
b645d2
 	return wpa_s->driver->set_transmit_next_pn(wpa_s->drv_priv, sa);
b645d2
 }
b645d2
 
b645d2
-static inline int wpa_drv_get_available_receive_sc(struct wpa_supplicant *wpa_s,
b645d2
-						   u32 *channel)
b645d2
-{
b645d2
-	if (!wpa_s->driver->get_available_receive_sc)
b645d2
-		return -1;
b645d2
-	return wpa_s->driver->get_available_receive_sc(wpa_s->drv_priv,
b645d2
-						       channel);
b645d2
-}
b645d2
-
b645d2
 static inline int
b645d2
 wpa_drv_create_receive_sc(struct wpa_supplicant *wpa_s, struct receive_sc *sc,
b645d2
 			  unsigned int conf_offset, int validation)
b645d2
@@ -832,15 +823,6 @@ static inline int wpa_drv_disable_receive_sa(struct wpa_supplicant *wpa_s,
b645d2
 }
b645d2
 
b645d2
 static inline int
b645d2
-wpa_drv_get_available_transmit_sc(struct wpa_supplicant *wpa_s, u32 *channel)
b645d2
-{
b645d2
-	if (!wpa_s->driver->get_available_transmit_sc)
b645d2
-		return -1;
b645d2
-	return wpa_s->driver->get_available_transmit_sc(wpa_s->drv_priv,
b645d2
-							channel);
b645d2
-}
b645d2
-
b645d2
-static inline int
b645d2
 wpa_drv_create_transmit_sc(struct wpa_supplicant *wpa_s, struct transmit_sc *sc,
b645d2
 			   unsigned int conf_offset)
b645d2
 {
b645d2
diff --git a/wpa_supplicant/wpas_kay.c b/wpa_supplicant/wpas_kay.c
b645d2
index 29b7b56..64364f7 100644
b645d2
--- a/wpa_supplicant/wpas_kay.c
b645d2
+++ b/wpa_supplicant/wpas_kay.c
b645d2
@@ -86,12 +86,6 @@ static int wpas_set_transmit_next_pn(void *wpa_s, struct transmit_sa *sa)
b645d2
 }
b645d2
 
b645d2
 
b645d2
-static int wpas_get_available_receive_sc(void *wpa_s, u32 *channel)
b645d2
-{
b645d2
-	return wpa_drv_get_available_receive_sc(wpa_s, channel);
b645d2
-}
b645d2
-
b645d2
-
b645d2
 static unsigned int conf_offset_val(enum confidentiality_offset co)
b645d2
 {
b645d2
 	switch (co) {
b645d2
@@ -138,12 +132,6 @@ static int wpas_disable_receive_sa(void *wpa_s, struct receive_sa *sa)
b645d2
 }
b645d2
 
b645d2
 
b645d2
-static int wpas_get_available_transmit_sc(void *wpa_s, u32 *channel)
b645d2
-{
b645d2
-	return wpa_drv_get_available_transmit_sc(wpa_s, channel);
b645d2
-}
b645d2
-
b645d2
-
b645d2
 static int
b645d2
 wpas_create_transmit_sc(void *wpa_s, struct transmit_sc *sc,
b645d2
 			enum confidentiality_offset co)
b645d2
@@ -205,13 +193,11 @@ int ieee802_1x_alloc_kay_sm(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
b645d2
 	kay_ctx->get_receive_lowest_pn = wpas_get_receive_lowest_pn;
b645d2
 	kay_ctx->get_transmit_next_pn = wpas_get_transmit_next_pn;
b645d2
 	kay_ctx->set_transmit_next_pn = wpas_set_transmit_next_pn;
b645d2
-	kay_ctx->get_available_receive_sc = wpas_get_available_receive_sc;
b645d2
 	kay_ctx->create_receive_sc = wpas_create_receive_sc;
b645d2
 	kay_ctx->delete_receive_sc = wpas_delete_receive_sc;
b645d2
 	kay_ctx->create_receive_sa = wpas_create_receive_sa;
b645d2
 	kay_ctx->enable_receive_sa = wpas_enable_receive_sa;
b645d2
 	kay_ctx->disable_receive_sa = wpas_disable_receive_sa;
b645d2
-	kay_ctx->get_available_transmit_sc = wpas_get_available_transmit_sc;
b645d2
 	kay_ctx->create_transmit_sc = wpas_create_transmit_sc;
b645d2
 	kay_ctx->delete_transmit_sc = wpas_delete_transmit_sc;
b645d2
 	kay_ctx->create_transmit_sa = wpas_create_transmit_sa;
b645d2
-- 
b645d2
2.7.4
b645d2