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

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