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

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