cfg80211: add extensible feature flag attribute
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> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
1803f594cb
Коммит
d75bb06b61
|
@ -3016,6 +3016,8 @@ struct wiphy_vendor_command {
|
||||||
* @regulatory_flags: wiphy regulatory flags, see
|
* @regulatory_flags: wiphy regulatory flags, see
|
||||||
* &enum ieee80211_regulatory_flags
|
* &enum ieee80211_regulatory_flags
|
||||||
* @features: features advertised to nl80211, see &enum nl80211_feature_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,
|
* @bss_priv_size: each BSS struct has private data allocated with it,
|
||||||
* this variable determines its size
|
* this variable determines its size
|
||||||
* @max_scan_ssids: maximum number of SSIDs the device can scan for in
|
* @max_scan_ssids: maximum number of SSIDs the device can scan for in
|
||||||
|
@ -3125,6 +3127,7 @@ struct wiphy {
|
||||||
u16 max_acl_mac_addrs;
|
u16 max_acl_mac_addrs;
|
||||||
|
|
||||||
u32 flags, regulatory_flags, features;
|
u32 flags, regulatory_flags, features;
|
||||||
|
u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)];
|
||||||
|
|
||||||
u32 ap_sme_capa;
|
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);
|
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 */
|
/* ethtool helper */
|
||||||
void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
|
void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
|
||||||
|
|
|
@ -1713,6 +1713,13 @@ enum nl80211_commands {
|
||||||
* obtained from it is coming from the device's wiphy and not the global
|
* obtained from it is coming from the device's wiphy and not the global
|
||||||
* cfg80211 regdomain.
|
* 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
|
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||||
|
@ -2072,6 +2079,8 @@ enum nl80211_attrs {
|
||||||
|
|
||||||
NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
|
NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
|
||||||
|
|
||||||
|
NL80211_ATTR_EXT_FEATURES,
|
||||||
|
|
||||||
/* add attributes here, update the policy in nl80211.c */
|
/* add attributes here, update the policy in nl80211.c */
|
||||||
|
|
||||||
__NL80211_ATTR_AFTER_LAST,
|
__NL80211_ATTR_AFTER_LAST,
|
||||||
|
@ -4223,6 +4232,19 @@ enum nl80211_feature_flags {
|
||||||
NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 1 << 31,
|
NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 1 << 31,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
* enum nl80211_probe_resp_offload_support_attr - optional supported
|
||||||
* protocols for probe-response offloading by the driver/FW.
|
* protocols for probe-response offloading by the driver/FW.
|
||||||
|
|
|
@ -1706,6 +1706,11 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
||||||
nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
|
nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
|
||||||
goto nla_put_failure;
|
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 */
|
/* done */
|
||||||
state->split_start = 0;
|
state->split_start = 0;
|
||||||
break;
|
break;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче