diff mbox series

[v3,1/2] nl80211: Unsolicited broadcast probe response support

Message ID 20200715230514.26792-2-alokad@codeaurora.org (mailing list archive)
State Changes Requested
Delegated to: Johannes Berg
Headers show
Series Unsolicited broadcast probe resp support | expand

Commit Message

Aloka Dixit July 15, 2020, 11:05 p.m. UTC
This patch adds new attributes to support unsolicited broadcast
probe response transmission used for in-band
discovery in 6GHz band (IEEE P802.11ax/D6.0 26.17.2.3.2, AP behavior for
fast passive scanning).
The new attribute, NL80211_ATTR_UNSOL_BCAST_PROBE_RESP, is nested which
supports following parameters:
(1) NL80211_UNSOL_BCAST_PROBE_RESP_INT - Packet interval
(2) NL80211_UNSOL_BCAST_PROBE_RESP_TMPL - Template data

Signed-off-by: Aloka Dixit <alokad@codeaurora.org>
---
 include/net/cfg80211.h       | 18 ++++++++++++++
 include/uapi/linux/nl80211.h | 32 ++++++++++++++++++++++++
 net/wireless/nl80211.c       | 47 ++++++++++++++++++++++++++++++++++++
 3 files changed, 97 insertions(+)

Comments

Johannes Berg Aug. 3, 2020, 10:18 a.m. UTC | #1
> +/**
> + * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited broadcast probe
> + *	response configuration. Applicable only in 6GHz.
> + *
> + * @__NL80211_UNSOL_BCAST_PROBE_RESP_INVALID: Invalid
> + *
> + * @NL80211_UNSOL_BCAST_PROBE_RESP_INT: Maximum packet interval (u32, TU).
> + *	Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
> + *	26.17.2.3.2 (AP behavior for fast passive scanning.

nit: that "(" never closes

> +	tmpl = tb[NL80211_UNSOL_BCAST_PROBE_RESP_TMPL];
> +	if (tmpl) {
> +		presp->tmpl = nla_data(tmpl);
> +		presp->tmpl_len = nla_len(tmpl);
> +	}
> 
So, hmm. Similar question here - what do you do without a template? Or
OTOH, why do you even need a template? Would you advertise something
that's *different* from the regular probe response template you already
get for offloaded probe request/response support?

johannes
Johannes Berg Aug. 3, 2020, 10:20 a.m. UTC | #2
Also,

> +/**
> + * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited broadcast probe
> + *	response configuration. Applicable only in 6GHz.
> + *
> + * @__NL80211_UNSOL_BCAST_PROBE_RESP_INVALID: Invalid
> + *
> + * @NL80211_UNSOL_BCAST_PROBE_RESP_INT: Maximum packet interval (u32, TU).
> + *	Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0

0 doesn't make sense, you should disallow that.

I see you used it for "turn off" at least in the mac80211 patch but it
seems to me that should have a more explicit way at least in the
external API? At the very least it needs to documentation.

johannes
Johannes Berg Aug. 3, 2020, 10:20 a.m. UTC | #3
On Wed, 2020-07-15 at 16:05 -0700, Aloka Dixit wrote:
> This patch adds new attributes to support unsolicited broadcast
> probe response transmission used for in-band
> discovery in 6GHz band (IEEE P802.11ax/D6.0 26.17.2.3.2, AP behavior for
> fast passive scanning).
> The new attribute, NL80211_ATTR_UNSOL_BCAST_PROBE_RESP, is nested which
> supports following parameters:
> (1) NL80211_UNSOL_BCAST_PROBE_RESP_INT - Packet interval
> (2) NL80211_UNSOL_BCAST_PROBE_RESP_TMPL - Template data

And maybe some driver support flag is needed?

johannes
Johannes Berg Aug. 3, 2020, 10:21 a.m. UTC | #4
On Mon, 2020-08-03 at 12:20 +0200, Johannes Berg wrote:
> On Wed, 2020-07-15 at 16:05 -0700, Aloka Dixit wrote:
> > This patch adds new attributes to support unsolicited broadcast
> > probe response transmission used for in-band
> > discovery in 6GHz band (IEEE P802.11ax/D6.0 26.17.2.3.2, AP behavior for
> > fast passive scanning).
> > The new attribute, NL80211_ATTR_UNSOL_BCAST_PROBE_RESP, is nested which
> > supports following parameters:
> > (1) NL80211_UNSOL_BCAST_PROBE_RESP_INT - Packet interval
> > (2) NL80211_UNSOL_BCAST_PROBE_RESP_TMPL - Template data
> 
> And maybe some driver support flag is needed?

Possibly even per band, like our discussion on the other patches?

johannes
Aloka Dixit Aug. 3, 2020, 5:28 p.m. UTC | #5
On 2020-08-03 03:18, Johannes Berg wrote:
>> +/**
>> + * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited 
>> broadcast probe
>> + *	response configuration. Applicable only in 6GHz.
>> + *
>> + * @__NL80211_UNSOL_BCAST_PROBE_RESP_INVALID: Invalid
>> + *
>> + * @NL80211_UNSOL_BCAST_PROBE_RESP_INT: Maximum packet interval (u32, 
>> TU).
>> + *	Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
>> + *	26.17.2.3.2 (AP behavior for fast passive scanning.
> 
> nit: that "(" never closes
> 
>> +	tmpl = tb[NL80211_UNSOL_BCAST_PROBE_RESP_TMPL];
>> +	if (tmpl) {
>> +		presp->tmpl = nla_data(tmpl);
>> +		presp->tmpl_len = nla_len(tmpl);
>> +	}
>> 
> So, hmm. Similar question here - what do you do without a template? Or
> OTOH, why do you even need a template? Would you advertise something
> that's *different* from the regular probe response template you already
> get for offloaded probe request/response support?
> 

The template will be same as the probe response, except for the 
destination MAC address as this one is broadcast.
Main reason is that this unsolicited broadcast probe response 
transmission is specific to 6GHz and not applicable to lower bands. 
Having a separate netlink command allowed not messing with the existing 
probe response offload feature which is for all bands. Thanks.

> johannes
Aloka Dixit Aug. 3, 2020, 5:30 p.m. UTC | #6
On 2020-08-03 03:20, Johannes Berg wrote:
> Also,
> 
>> +/**
>> + * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited 
>> broadcast probe
>> + *	response configuration. Applicable only in 6GHz.
>> + *
>> + * @__NL80211_UNSOL_BCAST_PROBE_RESP_INVALID: Invalid
>> + *
>> + * @NL80211_UNSOL_BCAST_PROBE_RESP_INT: Maximum packet interval (u32, 
>> TU).
>> + *	Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
> 
> 0 doesn't make sense, you should disallow that.
> 
> I see you used it for "turn off" at least in the mac80211 patch but it
> seems to me that should have a more explicit way at least in the
> external API? At the very least it needs to documentation.
> 
> johannes


Hi Johannes, interval=0 means 'disable' is given in the specification, 
will extend the documentation to mention that.
Aloka Dixit Aug. 3, 2020, 5:33 p.m. UTC | #7
On 2020-08-03 03:20, Johannes Berg wrote:
> On Wed, 2020-07-15 at 16:05 -0700, Aloka Dixit wrote:
>> This patch adds new attributes to support unsolicited broadcast
>> probe response transmission used for in-band
>> discovery in 6GHz band (IEEE P802.11ax/D6.0 26.17.2.3.2, AP behavior 
>> for
>> fast passive scanning).
>> The new attribute, NL80211_ATTR_UNSOL_BCAST_PROBE_RESP, is nested 
>> which
>> supports following parameters:
>> (1) NL80211_UNSOL_BCAST_PROBE_RESP_INT - Packet interval
>> (2) NL80211_UNSOL_BCAST_PROBE_RESP_TMPL - Template data
> 
> And maybe some driver support flag is needed?
> 
> johannes

Are you referring to enable/disable flag separate from the interval 
field being used for that? Or a different command/event from driver to 
netlink advertising if the driver supports this feature?

If former, it isn't needed because interval=0 means disable.

Thanks.
diff mbox series

Patch

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index fc7e8807838d..884050bf5c74 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1047,6 +1047,22 @@  struct cfg80211_acl_data {
 	struct mac_address mac_addrs[];
 };
 
+/**
+ * struct cfg80211_unsol_bcast_probe_resp - Unsolicited broadcast probe
+ *	response parameters in 6GHz.
+ *
+ * @interval: Packet interval in TUs. Maximum allowed is 20 TU, as mentioned
+ *	in IEEE P802.11ax/D6.0 26.17.2.3.2 - AP behavior for fast passive
+ *	scanning
+ * @tmpl_len: Template length
+ * @tmpl: Template data for probe response
+ */
+struct cfg80211_unsol_bcast_probe_resp {
+	u32 interval;
+	size_t tmpl_len;
+	const u8 *tmpl;
+};
+
 /**
  * enum cfg80211_ap_settings_flags - AP settings flags
  *
@@ -1094,6 +1110,7 @@  enum cfg80211_ap_settings_flags {
  * @he_obss_pd: OBSS Packet Detection settings
  * @he_bss_color: BSS Color settings
  * @he_oper: HE operation IE (or %NULL if HE isn't enabled)
+ * @unsol_bcast_probe_resp: Unsolicited broadcast probe response parameters
  */
 struct cfg80211_ap_settings {
 	struct cfg80211_chan_def chandef;
@@ -1124,6 +1141,7 @@  struct cfg80211_ap_settings {
 	u32 flags;
 	struct ieee80211_he_obss_pd he_obss_pd;
 	struct cfg80211_he_bss_color he_bss_color;
+	struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp;
 };
 
 /**
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 4e6339ab1fce..f3e6a37f0df8 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -2505,6 +2505,10 @@  enum nl80211_commands {
  * @NL80211_ATTR_HE_6GHZ_CAPABILITY: HE 6 GHz Band Capability element (from
  *	association request when used with NL80211_CMD_NEW_STATION).
  *
+ * @NL80211_ATTR_UNSOL_BCAST_PROBE_RESP: Optional parameter to configure
+ *	unsolicited broadcast probe response. It is a nested attribute, see
+ *	&enum nl80211_unsol_bcast_probe_resp_attributes.
+ *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2987,6 +2991,8 @@  enum nl80211_attrs {
 
 	NL80211_ATTR_HE_6GHZ_CAPABILITY,
 
+	NL80211_ATTR_UNSOL_BCAST_PROBE_RESP,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
@@ -6922,4 +6928,30 @@  enum nl80211_iftype_akm_attributes {
 	NL80211_IFTYPE_AKM_ATTR_MAX = __NL80211_IFTYPE_AKM_ATTR_LAST - 1,
 };
 
+/**
+ * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited broadcast probe
+ *	response configuration. Applicable only in 6GHz.
+ *
+ * @__NL80211_UNSOL_BCAST_PROBE_RESP_INVALID: Invalid
+ *
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_INT: Maximum packet interval (u32, TU).
+ *	Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
+ *	26.17.2.3.2 (AP behavior for fast passive scanning.
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_TMPL: Unsolicited broadcast probe response
+ *	frame template (binary).
+ *
+ * @__NL80211_UNSOL_BCAST_PROBE_RESP_LAST: Internal
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_MAX: highest attribute
+ */
+enum nl80211_unsol_bcast_probe_resp_attributes {
+	__NL80211_UNSOL_BCAST_PROBE_RESP_INVALID,
+
+	NL80211_UNSOL_BCAST_PROBE_RESP_INT,
+	NL80211_UNSOL_BCAST_PROBE_RESP_TMPL,
+
+	/* keep last */
+	__NL80211_UNSOL_BCAST_PROBE_RESP_LAST,
+	NL80211_UNSOL_BCAST_PROBE_RESP_MAX =
+		__NL80211_UNSOL_BCAST_PROBE_RESP_LAST - 1
+};
 #endif /* __LINUX_NL80211_H */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 263ae395ad44..d42056421e55 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -338,6 +338,13 @@  static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = {
 	[NL80211_TXRATE_GI] = { .type = NLA_U8 },
 };
 
+static const struct nla_policy
+unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_MAX + 1] = {
+	[NL80211_UNSOL_BCAST_PROBE_RESP_INT] = NLA_POLICY_MAX(NLA_U32, 20),
+	[NL80211_UNSOL_BCAST_PROBE_RESP_TMPL] = { .type = NLA_BINARY,
+						  .len = IEEE80211_MAX_DATA_LEN }
+};
+
 static const struct nla_policy
 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = {
 	[NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 },
@@ -658,6 +665,9 @@  static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
 		.type = NLA_EXACT_LEN,
 		.len = sizeof(struct ieee80211_he_6ghz_capa),
 	},
+
+	[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] =
+		NLA_POLICY_NESTED(unsol_bcast_probe_resp_policy),
 };
 
 /* policy for the key attributes */
@@ -4721,6 +4731,35 @@  static int nl80211_parse_he_bss_color(struct nlattr *attrs,
 	return 0;
 }
 
+static int
+nl80211_parse_unsol_bcast_probe_resp(struct nlattr *attrs,
+				     struct cfg80211_ap_settings *params)
+{
+	struct nlattr *tmpl;
+	struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_MAX + 1];
+	int ret;
+	struct cfg80211_unsol_bcast_probe_resp *presp =
+					&params->unsol_bcast_probe_resp;
+
+	ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_MAX, attrs,
+			       unsol_bcast_probe_resp_policy, NULL);
+	if (ret)
+		return ret;
+
+	if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_INT])
+		return -EINVAL;
+
+	presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_INT]);
+
+	tmpl = tb[NL80211_UNSOL_BCAST_PROBE_RESP_TMPL];
+	if (tmpl) {
+		presp->tmpl = nla_data(tmpl);
+		presp->tmpl_len = nla_len(tmpl);
+	}
+
+	return 0;
+}
+
 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
 					    const u8 *rates)
 {
@@ -5027,6 +5066,14 @@  static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
 			return err;
 	}
 
+	if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
+		err = nl80211_parse_unsol_bcast_probe_resp(
+			info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
+			&params);
+		if (err)
+			return err;
+	}
+
 	nl80211_calculate_ap_params(&params);
 
 	if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])