Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
This commit is contained in:
@@ -5285,12 +5285,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||
goto unlock;
|
||||
}
|
||||
} else {
|
||||
enum ieee80211_band band;
|
||||
n_channels = 0;
|
||||
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++)
|
||||
if (wiphy->bands[band])
|
||||
n_channels += wiphy->bands[band]->n_channels;
|
||||
n_channels = ieee80211_get_num_supported_channels(wiphy);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
|
||||
@@ -5498,11 +5493,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
||||
if (!n_channels)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
n_channels = 0;
|
||||
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++)
|
||||
if (wiphy->bands[band])
|
||||
n_channels += wiphy->bands[band]->n_channels;
|
||||
n_channels = ieee80211_get_num_supported_channels(wiphy);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
|
||||
@@ -6795,6 +6786,55 @@ __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
|
||||
enum nl80211_commands cmd,
|
||||
enum nl80211_attrs attr,
|
||||
int vendor_event_idx,
|
||||
int approxlen, gfp_t gfp)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
||||
const struct nl80211_vendor_cmd_info *info;
|
||||
|
||||
switch (cmd) {
|
||||
case NL80211_CMD_TESTMODE:
|
||||
if (WARN_ON(vendor_event_idx != -1))
|
||||
return NULL;
|
||||
info = NULL;
|
||||
break;
|
||||
case NL80211_CMD_VENDOR:
|
||||
if (WARN_ON(vendor_event_idx < 0 ||
|
||||
vendor_event_idx >= wiphy->n_vendor_events))
|
||||
return NULL;
|
||||
info = &wiphy->vendor_events[vendor_event_idx];
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0,
|
||||
cmd, attr, info, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
|
||||
|
||||
void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
|
||||
void *hdr = ((void **)skb->cb)[1];
|
||||
struct nlattr *data = ((void **)skb->cb)[2];
|
||||
enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
|
||||
|
||||
nla_nest_end(skb, data);
|
||||
genlmsg_end(skb, hdr);
|
||||
|
||||
if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
|
||||
mcgrp = NL80211_MCGRP_VENDOR;
|
||||
|
||||
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
|
||||
mcgrp, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL(__cfg80211_send_event_skb);
|
||||
|
||||
#ifdef CONFIG_NL80211_TESTMODE
|
||||
static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
@@ -6921,55 +6961,6 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
|
||||
rtnl_unlock();
|
||||
return err;
|
||||
}
|
||||
|
||||
struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
|
||||
enum nl80211_commands cmd,
|
||||
enum nl80211_attrs attr,
|
||||
int vendor_event_idx,
|
||||
int approxlen, gfp_t gfp)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
||||
const struct nl80211_vendor_cmd_info *info;
|
||||
|
||||
switch (cmd) {
|
||||
case NL80211_CMD_TESTMODE:
|
||||
if (WARN_ON(vendor_event_idx != -1))
|
||||
return NULL;
|
||||
info = NULL;
|
||||
break;
|
||||
case NL80211_CMD_VENDOR:
|
||||
if (WARN_ON(vendor_event_idx < 0 ||
|
||||
vendor_event_idx >= wiphy->n_vendor_events))
|
||||
return NULL;
|
||||
info = &wiphy->vendor_events[vendor_event_idx];
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0,
|
||||
cmd, attr, info, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
|
||||
|
||||
void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
|
||||
void *hdr = ((void **)skb->cb)[1];
|
||||
struct nlattr *data = ((void **)skb->cb)[2];
|
||||
enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
|
||||
|
||||
nla_nest_end(skb, data);
|
||||
genlmsg_end(skb, hdr);
|
||||
|
||||
if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
|
||||
mcgrp = NL80211_MCGRP_VENDOR;
|
||||
|
||||
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
|
||||
mcgrp, gfp);
|
||||
}
|
||||
EXPORT_SYMBOL(__cfg80211_send_event_skb);
|
||||
#endif
|
||||
|
||||
static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
|
@@ -1089,11 +1089,8 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
||||
/* Determine number of channels, needed to allocate creq */
|
||||
if (wreq && wreq->num_channels)
|
||||
n_channels = wreq->num_channels;
|
||||
else {
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++)
|
||||
if (wiphy->bands[band])
|
||||
n_channels += wiphy->bands[band]->n_channels;
|
||||
}
|
||||
else
|
||||
n_channels = ieee80211_get_num_supported_channels(wiphy);
|
||||
|
||||
creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
|
||||
n_channels * sizeof(void *),
|
||||
|
@@ -70,18 +70,11 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
|
||||
if (rdev->scan_req)
|
||||
return -EBUSY;
|
||||
|
||||
if (wdev->conn->params.channel) {
|
||||
if (wdev->conn->params.channel)
|
||||
n_channels = 1;
|
||||
} else {
|
||||
enum ieee80211_band band;
|
||||
n_channels = 0;
|
||||
else
|
||||
n_channels = ieee80211_get_num_supported_channels(wdev->wiphy);
|
||||
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||
if (!wdev->wiphy->bands[band])
|
||||
continue;
|
||||
n_channels += wdev->wiphy->bands[band]->n_channels;
|
||||
}
|
||||
}
|
||||
request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) +
|
||||
sizeof(request->channels[0]) * n_channels,
|
||||
GFP_KERNEL);
|
||||
|
@@ -879,7 +879,9 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
|
||||
|
||||
dev->ieee80211_ptr->use_4addr = false;
|
||||
dev->ieee80211_ptr->mesh_id_up_len = 0;
|
||||
wdev_lock(dev->ieee80211_ptr);
|
||||
rdev_set_qos_map(rdev, dev, NULL);
|
||||
wdev_unlock(dev->ieee80211_ptr);
|
||||
|
||||
switch (otype) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
@@ -1479,6 +1481,19 @@ int ieee80211_get_ratemask(struct ieee80211_supported_band *sband,
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy)
|
||||
{
|
||||
enum ieee80211_band band;
|
||||
unsigned int n_channels = 0;
|
||||
|
||||
for (band = 0; band < IEEE80211_NUM_BANDS; band++)
|
||||
if (wiphy->bands[band])
|
||||
n_channels += wiphy->bands[band]->n_channels;
|
||||
|
||||
return n_channels;
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_get_num_supported_channels);
|
||||
|
||||
/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
|
||||
/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
|
||||
const unsigned char rfc1042_header[] __aligned(2) =
|
||||
|
@@ -370,7 +370,7 @@ static int cfg80211_wext_siwretry(struct net_device *dev,
|
||||
u8 oshort = wdev->wiphy->retry_short;
|
||||
int err;
|
||||
|
||||
if (retry->disabled ||
|
||||
if (retry->disabled || retry->value < 1 || retry->value > 255 ||
|
||||
(retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -412,9 +412,9 @@ int cfg80211_wext_giwretry(struct net_device *dev,
|
||||
* First return short value, iwconfig will ask long value
|
||||
* later if needed
|
||||
*/
|
||||
retry->flags |= IW_RETRY_LIMIT;
|
||||
retry->flags |= IW_RETRY_LIMIT | IW_RETRY_SHORT;
|
||||
retry->value = wdev->wiphy->retry_short;
|
||||
if (wdev->wiphy->retry_long != wdev->wiphy->retry_short)
|
||||
if (wdev->wiphy->retry_long == wdev->wiphy->retry_short)
|
||||
retry->flags |= IW_RETRY_LONG;
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user