Commit 18a83659 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

cfg80211: introduce scan IE limit attribute

This patch introduces a new attribute for a wiphy that tells
userspace how long the information elements added to a probe
request frame can be at most. It also updates the at76 to
advertise that it cannot support that, and, for now until I
can fix that, iwlwifi too.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 75c2148f
...@@ -2250,6 +2250,7 @@ static int at76_init_new_device(struct at76_priv *priv, ...@@ -2250,6 +2250,7 @@ static int at76_init_new_device(struct at76_priv *priv,
/* mac80211 initialisation */ /* mac80211 initialisation */
priv->hw->wiphy->max_scan_ssids = 1; priv->hw->wiphy->max_scan_ssids = 1;
priv->hw->wiphy->max_scan_ie_len = 0;
priv->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); priv->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &at76_supported_band; priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &at76_supported_band;
priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
......
...@@ -1306,6 +1306,7 @@ int iwl_setup_mac(struct iwl_priv *priv) ...@@ -1306,6 +1306,7 @@ int iwl_setup_mac(struct iwl_priv *priv)
hw->wiphy->custom_regulatory = true; hw->wiphy->custom_regulatory = true;
hw->wiphy->max_scan_ssids = 1; hw->wiphy->max_scan_ssids = 1;
hw->wiphy->max_scan_ie_len = 0; /* XXX for now */
/* Default value; 4 EDCA QOS priorities */ /* Default value; 4 EDCA QOS priorities */
hw->queues = 4; hw->queues = 4;
......
...@@ -390,6 +390,8 @@ enum nl80211_commands { ...@@ -390,6 +390,8 @@ enum nl80211_commands {
* *
* @NL80211_ATTR_MAX_NUM_SCAN_SSIDS: number of SSIDs you can scan with * @NL80211_ATTR_MAX_NUM_SCAN_SSIDS: number of SSIDs you can scan with
* a single scan request, a wiphy attribute. * a single scan request, a wiphy attribute.
* @NL80211_ATTR_MAX_SCAN_IE_LEN: maximum length of information elements
* that can be added to a scan request
* *
* @NL80211_ATTR_SCAN_FREQUENCIES: nested attribute with frequencies (in MHz) * @NL80211_ATTR_SCAN_FREQUENCIES: nested attribute with frequencies (in MHz)
* @NL80211_ATTR_SCAN_SSIDS: nested attribute with SSIDs, leave out for passive * @NL80211_ATTR_SCAN_SSIDS: nested attribute with SSIDs, leave out for passive
...@@ -507,6 +509,8 @@ enum nl80211_attrs { ...@@ -507,6 +509,8 @@ enum nl80211_attrs {
NL80211_ATTR_KEY_TYPE, NL80211_ATTR_KEY_TYPE,
NL80211_ATTR_MAX_SCAN_IE_LEN,
/* 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,
......
...@@ -222,6 +222,7 @@ struct wiphy { ...@@ -222,6 +222,7 @@ struct wiphy {
int bss_priv_size; int bss_priv_size;
u8 max_scan_ssids; u8 max_scan_ssids;
u16 max_scan_ie_len;
/* If multiple wiphys are registered and you're handed e.g. /* If multiple wiphys are registered and you're handed e.g.
* a regular netdev with assigned ieee80211_ptr, you won't * a regular netdev with assigned ieee80211_ptr, you won't
......
...@@ -728,7 +728,18 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, ...@@ -728,7 +728,18 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
return NULL; return NULL;
wiphy->privid = mac80211_wiphy_privid; wiphy->privid = mac80211_wiphy_privid;
if (!ops->hw_scan) {
/* For hw_scan, driver needs to set these up. */
wiphy->max_scan_ssids = 4; wiphy->max_scan_ssids = 4;
/* we support a maximum of 32 rates in cfg80211 */
wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN
- 2 - 32 /* SSID */
- 4 - 32 /* (ext) supp rates */;
}
/* Yes, putting cfg80211_bss into ieee80211_bss is a hack */ /* Yes, putting cfg80211_bss into ieee80211_bss is a hack */
wiphy->bss_priv_size = sizeof(struct ieee80211_bss) - wiphy->bss_priv_size = sizeof(struct ieee80211_bss) -
sizeof(struct cfg80211_bss); sizeof(struct cfg80211_bss);
......
...@@ -890,6 +890,8 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, ...@@ -890,6 +890,8 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
*pos = rate->bitrate / 5; *pos = rate->bitrate / 5;
} }
/* if adding more here, adjust max_scan_ie_len */
if (ie) if (ie)
memcpy(skb_put(skb, ie_len), ie, ie_len); memcpy(skb_put(skb, ie_len), ie, ie_len);
......
...@@ -181,6 +181,8 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags, ...@@ -181,6 +181,8 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy)); NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy));
NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, NLA_PUT_U8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
dev->wiphy.max_scan_ssids); dev->wiphy.max_scan_ssids);
NLA_PUT_U16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
dev->wiphy.max_scan_ie_len);
nl_modes = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_IFTYPES); nl_modes = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_IFTYPES);
if (!nl_modes) if (!nl_modes)
...@@ -2528,6 +2530,11 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) ...@@ -2528,6 +2530,11 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
else else
ie_len = 0; ie_len = 0;
if (ie_len > wiphy->max_scan_ie_len) {
err = -EINVAL;
goto out;
}
request = kzalloc(sizeof(*request) request = kzalloc(sizeof(*request)
+ sizeof(*ssid) * n_ssids + sizeof(*ssid) * n_ssids
+ sizeof(channel) * n_channels + sizeof(channel) * n_channels
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment