diff mbox

cfg80211: add extensible feature flag attribute

Message ID 1419350119-29166-1-git-send-email-arend@broadcom.com (mailing list archive)
State Accepted
Delegated to: Johannes Berg
Headers show

Commit Message

Arend van Spriel Dec. 23, 2014, 3:55 p.m. UTC
From: Gautam Kumar Shukla <gautams@broadcom.com>

With the wiphy::features flag being used up this patch adds a
new field wiphy::ext_features. Considering extensibility this
new field is declared as a byte array. This extensible flag is
exposed to user-space by NL80211_ATTR_EXT_FEATURES.

Cc: Avinash Patil <patila@marvell.com>
Signed-off-by: Gautam (Gautam Kumar) Shukla <gautams@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 include/net/cfg80211.h       | 39 +++++++++++++++++++++++++++++++++++++++
 include/uapi/linux/nl80211.h | 22 ++++++++++++++++++++++
 net/wireless/nl80211.c       |  5 +++++
 3 files changed, 66 insertions(+)

Comments

Johannes Berg Dec. 23, 2014, 3:58 p.m. UTC | #1
On Tue, 2014-12-23 at 16:55 +0100, Arend van Spriel wrote:
> From: Gautam Kumar Shukla <gautams@broadcom.com>
> 
> With the wiphy::features flag being used up this patch adds a
> new field wiphy::ext_features. Considering extensibility this
> new field is declared as a byte array. This extensible flag is
> exposed to user-space by NL80211_ATTR_EXT_FEATURES.

Ah, I guess this will compile without even any flags defined, so
Avinash, you can just build on top of this and define the first flag,
and for the sake of attribution I'll apply it as two separate patches.

Thanks Arend.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arend van Spriel Dec. 23, 2014, 4:05 p.m. UTC | #2
On 12/23/14 16:58, Johannes Berg wrote:
> On Tue, 2014-12-23 at 16:55 +0100, Arend van Spriel wrote:
>> From: Gautam Kumar Shukla<gautams@broadcom.com>
>>
>> With the wiphy::features flag being used up this patch adds a
>> new field wiphy::ext_features. Considering extensibility this
>> new field is declared as a byte array. This extensible flag is
>> exposed to user-space by NL80211_ATTR_EXT_FEATURES.
>
> Ah, I guess this will compile without even any flags defined, so
> Avinash, you can just build on top of this and define the first flag,
> and for the sake of attribution I'll apply it as two separate patches.

If Avinash keeps my signed-off-by and add note of what he changed below 
that I feel sufficiently attributed. Either way is fine by me.

It compiles, but I guess nla_put() will fail for u8[0+8-1/8] field.

Gr. AvS

> Thanks Arend.
>
> johannes
>

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Dec. 23, 2014, 4:07 p.m. UTC | #3
On Tue, 2014-12-23 at 17:05 +0100, Arend van Spriel wrote:

> It compiles, but I guess nla_put() will fail for u8[0+8-1/8] field.

I think it should work - the array is 0 bytes long, so sizeof() would
return 0, and that turns out to be equivalent to nla_put_flag().

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Arend van Spriel Dec. 23, 2014, 7:05 p.m. UTC | #4
On 12/23/14 17:07, Johannes Berg wrote:
> On Tue, 2014-12-23 at 17:05 +0100, Arend van Spriel wrote:
>
>> It compiles, but I guess nla_put() will fail for u8[0+8-1/8] field.
>
> I think it should work - the array is 0 bytes long, so sizeof() would
> return 0, and that turns out to be equivalent to nla_put_flag().

Another day, another lesson ;-) Wondered how netlink flags were 
transported in the message, but never bothered to look. Thanks.

Arend

> johannes
>

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Jan. 6, 2015, 10:35 a.m. UTC | #5
On Tue, 2014-12-23 at 16:55 +0100, Arend van Spriel wrote:
> From: Gautam Kumar Shukla <gautams@broadcom.com>
> 
> With the wiphy::features flag being used up this patch adds a
> new field wiphy::ext_features. Considering extensibility this
> new field is declared as a byte array. This extensible flag is
> exposed to user-space by NL80211_ATTR_EXT_FEATURES.

Since it's quite clear that *somebody* will soon use this, I've applied
it now.

Thanks.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index bd672ea..f38645f 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -3016,6 +3016,8 @@  struct wiphy_vendor_command {
  * @regulatory_flags: wiphy regulatory flags, see
  *	&enum ieee80211_regulatory_flags
  * @features: features advertised to nl80211, see &enum nl80211_feature_flags.
+ * @ext_features: extended features advertised to nl80211, see
+ *	&enum nl80211_ext_feature_index.
  * @bss_priv_size: each BSS struct has private data allocated with it,
  *	this variable determines its size
  * @max_scan_ssids: maximum number of SSIDs the device can scan for in
@@ -3125,6 +3127,7 @@  struct wiphy {
 	u16 max_acl_mac_addrs;
 
 	u32 flags, regulatory_flags, features;
+	u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)];
 
 	u32 ap_sme_capa;
 
@@ -5052,6 +5055,42 @@  void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev,
  */
 void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy);
 
+/**
+ * wiphy_ext_feature_set - set the extended feature flag
+ *
+ * @wiphy: the wiphy to modify.
+ * @ftidx: extended feature bit index.
+ *
+ * The extended features are flagged in multiple bytes (see
+ * &struct wiphy.@ext_features)
+ */
+static inline void wiphy_ext_feature_set(struct wiphy *wiphy,
+					 enum nl80211_ext_feature_index ftidx)
+{
+	u8 *ft_byte;
+
+	ft_byte = &wiphy->ext_features[ftidx / 8];
+	*ft_byte |= BIT(ftidx % 8);
+}
+
+/**
+ * wiphy_ext_feature_isset - check the extended feature flag
+ *
+ * @wiphy: the wiphy to modify.
+ * @ftidx: extended feature bit index.
+ *
+ * The extended features are flagged in multiple bytes (see
+ * &struct wiphy.@ext_features)
+ */
+static inline bool
+wiphy_ext_feature_isset(struct wiphy *wiphy,
+			enum nl80211_ext_feature_index ftidx)
+{
+	u8 ft_byte;
+
+	ft_byte = wiphy->ext_features[ftidx / 8];
+	return (ft_byte & BIT(ftidx % 8)) != 0;
+}
 
 /* ethtool helper */
 void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 18cb0aa..0fe36b4 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1713,6 +1713,13 @@  enum nl80211_commands {
  *	obtained from it is coming from the device's wiphy and not the global
  *	cfg80211 regdomain.
  *
+ * @NL80211_ATTR_EXT_FEATURES: extended feature flags contained in a byte
+ *	array. The feature flags are identified by their bit index (see &enum
+ *	nl80211_ext_feature_index). The bit index is ordered starting at the
+ *	least-significant bit of the first byte in the array, ie. bit index 0
+ *	is located at bit 0 of byte 0. bit index 25 would be located at bit 1
+ *	of byte 3 (u8 array).
+ *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2072,6 +2079,8 @@  enum nl80211_attrs {
 
 	NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
 
+	NL80211_ATTR_EXT_FEATURES,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
@@ -4221,6 +4230,19 @@  enum nl80211_feature_flags {
 };
 
 /**
+ * enum nl80211_ext_feature_index - bit index of extended features.
+ *
+ * @NUM_NL80211_EXT_FEATURES: number of extended features.
+ * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
+ */
+enum nl80211_ext_feature_index {
+
+	/* add new features before the definition below */
+	NUM_NL80211_EXT_FEATURES,
+	MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1
+};
+
+/**
  * enum nl80211_probe_resp_offload_support_attr - optional supported
  *	protocols for probe-response offloading by the driver/FW.
  *	To be used with the %NL80211_ATTR_PROBE_RESP_OFFLOAD attribute.
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 7029201..689e1a8 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1706,6 +1706,11 @@  static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
 		    nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
 			goto nla_put_failure;
 
+		if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
+			    sizeof(rdev->wiphy.ext_features),
+			    rdev->wiphy.ext_features))
+			goto nla_put_failure;
+
 		/* done */
 		state->split_start = 0;
 		break;