diff mbox series

[4/6] bss coloring: add the switch_color handler to the nl80211 driver

Message ID eba9d1024574df24120c302c1e2993a5bf7dac43.1631091272.git.ryder.lee@mediatek.com
State Deferred
Headers show
Series [1/6] bss coloring: add support for handling collision events and triggering CCA | expand

Commit Message

Ryder Lee Sept. 8, 2021, 9:18 a.m. UTC
From: John Crispin <john@phrozen.org>

In order to start the CCA process we need to send NL80211_CMD_COLOR_CHANGE
to the kernel. This patch adds the required code.

Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: John Crispin <john@phrozen.org>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
---
 src/drivers/driver_nl80211.c | 79 ++++++++++++++++++++++++++++++++++++
 1 file changed, 79 insertions(+)

Comments

Ryder Lee Sept. 27, 2021, 6:22 p.m. UTC | #1
Just a gentle ping as kernel part has been merged.

On Wed, 2021-09-08 at 17:18 +0800, Ryder Lee wrote:
> From: John Crispin <john@phrozen.org>
> 
> In order to start the CCA process we need to send
> NL80211_CMD_COLOR_CHANGE
> to the kernel. This patch adds the required code.
> 
> Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Signed-off-by: John Crispin <john@phrozen.org>
> Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
> ---
>  src/drivers/driver_nl80211.c | 79
> ++++++++++++++++++++++++++++++++++++
>  1 file changed, 79 insertions(+)
> 
> diff --git a/src/drivers/driver_nl80211.c
> b/src/drivers/driver_nl80211.c
> index f04934454..927d879de 100644
> --- a/src/drivers/driver_nl80211.c
> +++ b/src/drivers/driver_nl80211.c
> @@ -9925,6 +9925,82 @@ error:
>  }
>  
>  
> +#ifdef CONFIG_IEEE80211AX
> +static int nl80211_switch_color(void *priv, struct cca_settings
> *settings)
> +{
> +	struct nl_msg *msg;
> +	struct i802_bss *bss = priv;
> +	struct wpa_driver_nl80211_data *drv = bss->drv;
> +	struct nlattr *beacon_cca;
> +	int ret = -ENOBUFS;
> +
> +	wpa_printf(MSG_DEBUG, "nl80211: Color change request
> (cca_count=%u color=%d)",
> +		   settings->cca_count, settings->cca_color);
> +
> +	if (drv->nlmode != NL80211_IFTYPE_AP)
> +		return -EOPNOTSUPP;
> +
> +	if (!settings->beacon_cca.tail)
> +		return -EINVAL;
> +
> +	if ((settings->beacon_cca.tail_len <= settings-
> >counter_offset_beacon) ||
> +	    (settings->beacon_cca.tail[settings->counter_offset_beacon] 
> !=
> +		     settings->cca_count))
> +		return -EINVAL;
> +
> +	if (settings->beacon_cca.probe_resp &&
> +	    ((settings->beacon_cca.probe_resp_len <=
> +			settings->counter_offset_presp) ||
> +	     (settings->beacon_cca.probe_resp[settings-
> >counter_offset_presp] !=
> +			settings->cca_count)))
> +		return -EINVAL;
> +
> +	if (!(msg = nl80211_bss_msg(bss, 0,
> NL80211_CMD_COLOR_CHANGE_REQUEST)) ||
> +	    nla_put_u8(msg, NL80211_ATTR_COLOR_CHANGE_COUNT,
> +			settings->cca_count) ||
> +	    nla_put_u8(msg, NL80211_ATTR_COLOR_CHANGE_COLOR,
> +			settings->cca_color))
> +		goto error;
> +
> +	/* beacon_after params */
> +	ret = set_beacon_data(msg, &settings->beacon_after);
> +	if (ret)
> +		goto error;
> +
> +	/* beacon_csa params */
> +	beacon_cca = nla_nest_start(msg,
> NL80211_ATTR_COLOR_CHANGE_ELEMS);
> +	if (!beacon_cca)
> +		goto fail;
> +
> +	ret = set_beacon_data(msg, &settings->beacon_cca);
> +	if (ret)
> +		goto error;
> +
> +	if (nla_put_u16(msg, NL80211_ATTR_CNTDWN_OFFS_BEACON,
> +			settings->counter_offset_beacon) ||
> +	    (settings->beacon_cca.probe_resp &&
> +	     nla_put_u16(msg, NL80211_ATTR_CNTDWN_OFFS_PRESP,
> +			 settings->counter_offset_presp)))
> +		goto fail;
> +
> +	nla_nest_end(msg, beacon_cca);
> +	ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
> +	if (ret) {
> +		wpa_printf(MSG_DEBUG, "nl80211: switch_color failed
> err=%d (%s)",
> +			   ret, strerror(-ret));
> +	}
> +	return ret;
> +
> +fail:
> +	ret = -ENOBUFS;
> +error:
> +	nlmsg_free(msg);
> +	wpa_printf(MSG_DEBUG, "nl80211: Could not build color switch
> request");
> +	return ret;
> +}
> +#endif
> +
> +
>  static int nl80211_add_ts(void *priv, u8 tsid, const u8 *addr,
>  			  u8 user_priority, u16 admitted_time)
>  {
> @@ -12187,6 +12263,9 @@ const struct wpa_driver_ops
> wpa_driver_nl80211_ops = {
>  	.get_survey = wpa_driver_nl80211_get_survey,
>  	.status = wpa_driver_nl80211_status,
>  	.switch_channel = nl80211_switch_channel,
> +#ifdef CONFIG_IEEE80211AX
> +	.switch_color = nl80211_switch_color,
> +#endif
>  #ifdef ANDROID_P2P
>  	.set_noa = wpa_driver_set_p2p_noa,
>  	.get_noa = wpa_driver_get_p2p_noa,
Ryder Lee Nov. 1, 2021, 6:43 a.m. UTC | #2
On Wed, 2021-09-08 at 17:18 +0800, Ryder Lee wrote:
> From: John Crispin <john@phrozen.org>
> 
> In order to start the CCA process we need to send
> NL80211_CMD_COLOR_CHANGE
> to the kernel. This patch adds the required code.
> 
> Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Signed-off-by: John Crispin <john@phrozen.org>
> Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
> ---
>  src/drivers/driver_nl80211.c | 79
> ++++++++++++++++++++++++++++++++++++
>  1 file changed, 79 insertions(+)

Hi Jouni,

Any comments on this series?

Ryder
Lorenzo Bianconi Nov. 1, 2021, 8:33 a.m. UTC | #3
> On Wed, 2021-09-08 at 17:18 +0800, Ryder Lee wrote:
> > From: John Crispin <john@phrozen.org>
> > 
> > In order to start the CCA process we need to send
> > NL80211_CMD_COLOR_CHANGE
> > to the kernel. This patch adds the required code.
> > 
> > Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> > Signed-off-by: John Crispin <john@phrozen.org>
> > Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
> > ---
> >  src/drivers/driver_nl80211.c | 79
> > ++++++++++++++++++++++++++++++++++++
> >  1 file changed, 79 insertions(+)
> 
> Hi Jouni,
> 
> Any comments on this series?

I guess the kernel part is stable now so we can move on with userspace one.

Regards,
Lorenzo

> 
> Ryder
> 
>
diff mbox series

Patch

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index f04934454..927d879de 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -9925,6 +9925,82 @@  error:
 }
 
 
+#ifdef CONFIG_IEEE80211AX
+static int nl80211_switch_color(void *priv, struct cca_settings *settings)
+{
+	struct nl_msg *msg;
+	struct i802_bss *bss = priv;
+	struct wpa_driver_nl80211_data *drv = bss->drv;
+	struct nlattr *beacon_cca;
+	int ret = -ENOBUFS;
+
+	wpa_printf(MSG_DEBUG, "nl80211: Color change request (cca_count=%u color=%d)",
+		   settings->cca_count, settings->cca_color);
+
+	if (drv->nlmode != NL80211_IFTYPE_AP)
+		return -EOPNOTSUPP;
+
+	if (!settings->beacon_cca.tail)
+		return -EINVAL;
+
+	if ((settings->beacon_cca.tail_len <= settings->counter_offset_beacon) ||
+	    (settings->beacon_cca.tail[settings->counter_offset_beacon] !=
+		     settings->cca_count))
+		return -EINVAL;
+
+	if (settings->beacon_cca.probe_resp &&
+	    ((settings->beacon_cca.probe_resp_len <=
+			settings->counter_offset_presp) ||
+	     (settings->beacon_cca.probe_resp[settings->counter_offset_presp] !=
+			settings->cca_count)))
+		return -EINVAL;
+
+	if (!(msg = nl80211_bss_msg(bss, 0, NL80211_CMD_COLOR_CHANGE_REQUEST)) ||
+	    nla_put_u8(msg, NL80211_ATTR_COLOR_CHANGE_COUNT,
+			settings->cca_count) ||
+	    nla_put_u8(msg, NL80211_ATTR_COLOR_CHANGE_COLOR,
+			settings->cca_color))
+		goto error;
+
+	/* beacon_after params */
+	ret = set_beacon_data(msg, &settings->beacon_after);
+	if (ret)
+		goto error;
+
+	/* beacon_csa params */
+	beacon_cca = nla_nest_start(msg, NL80211_ATTR_COLOR_CHANGE_ELEMS);
+	if (!beacon_cca)
+		goto fail;
+
+	ret = set_beacon_data(msg, &settings->beacon_cca);
+	if (ret)
+		goto error;
+
+	if (nla_put_u16(msg, NL80211_ATTR_CNTDWN_OFFS_BEACON,
+			settings->counter_offset_beacon) ||
+	    (settings->beacon_cca.probe_resp &&
+	     nla_put_u16(msg, NL80211_ATTR_CNTDWN_OFFS_PRESP,
+			 settings->counter_offset_presp)))
+		goto fail;
+
+	nla_nest_end(msg, beacon_cca);
+	ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
+	if (ret) {
+		wpa_printf(MSG_DEBUG, "nl80211: switch_color failed err=%d (%s)",
+			   ret, strerror(-ret));
+	}
+	return ret;
+
+fail:
+	ret = -ENOBUFS;
+error:
+	nlmsg_free(msg);
+	wpa_printf(MSG_DEBUG, "nl80211: Could not build color switch request");
+	return ret;
+}
+#endif
+
+
 static int nl80211_add_ts(void *priv, u8 tsid, const u8 *addr,
 			  u8 user_priority, u16 admitted_time)
 {
@@ -12187,6 +12263,9 @@  const struct wpa_driver_ops wpa_driver_nl80211_ops = {
 	.get_survey = wpa_driver_nl80211_get_survey,
 	.status = wpa_driver_nl80211_status,
 	.switch_channel = nl80211_switch_channel,
+#ifdef CONFIG_IEEE80211AX
+	.switch_color = nl80211_switch_color,
+#endif
 #ifdef ANDROID_P2P
 	.set_noa = wpa_driver_set_p2p_noa,
 	.get_noa = wpa_driver_get_p2p_noa,