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 |
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,
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
> 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 --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,