|
@@ -557,18 +557,6 @@ static int nl80211_msg_put_channel(struct sk_buff *msg,
|
|
if ((chan->flags & IEEE80211_CHAN_RADAR) &&
|
|
if ((chan->flags & IEEE80211_CHAN_RADAR) &&
|
|
nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
|
|
nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
- if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) &&
|
|
|
|
- nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS))
|
|
|
|
- goto nla_put_failure;
|
|
|
|
- if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) &&
|
|
|
|
- nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS))
|
|
|
|
- goto nla_put_failure;
|
|
|
|
- if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) &&
|
|
|
|
- nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ))
|
|
|
|
- goto nla_put_failure;
|
|
|
|
- if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) &&
|
|
|
|
- nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ))
|
|
|
|
- goto nla_put_failure;
|
|
|
|
|
|
|
|
if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
|
|
if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
|
|
DBM_TO_MBM(chan->max_power)))
|
|
DBM_TO_MBM(chan->max_power)))
|
|
@@ -1310,15 +1298,6 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 portid, u32 seq, int flag
|
|
dev->wiphy.max_acl_mac_addrs))
|
|
dev->wiphy.max_acl_mac_addrs))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|
|
- if (dev->wiphy.extended_capabilities &&
|
|
|
|
- (nla_put(msg, NL80211_ATTR_EXT_CAPA,
|
|
|
|
- dev->wiphy.extended_capabilities_len,
|
|
|
|
- dev->wiphy.extended_capabilities) ||
|
|
|
|
- nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
|
|
|
|
- dev->wiphy.extended_capabilities_len,
|
|
|
|
- dev->wiphy.extended_capabilities_mask)))
|
|
|
|
- goto nla_put_failure;
|
|
|
|
-
|
|
|
|
return genlmsg_end(msg, hdr);
|
|
return genlmsg_end(msg, hdr);
|
|
|
|
|
|
nla_put_failure:
|
|
nla_put_failure:
|
|
@@ -1328,7 +1307,7 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 portid, u32 seq, int flag
|
|
|
|
|
|
static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
|
|
static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
|
|
{
|
|
{
|
|
- int idx = 0;
|
|
|
|
|
|
+ int idx = 0, ret;
|
|
int start = cb->args[0];
|
|
int start = cb->args[0];
|
|
struct cfg80211_registered_device *dev;
|
|
struct cfg80211_registered_device *dev;
|
|
|
|
|
|
@@ -1338,9 +1317,29 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
|
|
continue;
|
|
continue;
|
|
if (++idx <= start)
|
|
if (++idx <= start)
|
|
continue;
|
|
continue;
|
|
- if (nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).portid,
|
|
|
|
- cb->nlh->nlmsg_seq, NLM_F_MULTI,
|
|
|
|
- dev) < 0) {
|
|
|
|
|
|
+ ret = nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).portid,
|
|
|
|
+ cb->nlh->nlmsg_seq, NLM_F_MULTI,
|
|
|
|
+ dev);
|
|
|
|
+ if (ret < 0) {
|
|
|
|
+ /*
|
|
|
|
+ * If sending the wiphy data didn't fit (ENOBUFS or
|
|
|
|
+ * EMSGSIZE returned), this SKB is still empty (so
|
|
|
|
+ * it's not too big because another wiphy dataset is
|
|
|
|
+ * already in the skb) and we've not tried to adjust
|
|
|
|
+ * the dump allocation yet ... then adjust the alloc
|
|
|
|
+ * size to be bigger, and return 1 but with the empty
|
|
|
|
+ * skb. This results in an empty message being RX'ed
|
|
|
|
+ * in userspace, but that is ignored.
|
|
|
|
+ *
|
|
|
|
+ * We can then retry with the larger buffer.
|
|
|
|
+ */
|
|
|
|
+ if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
|
|
|
|
+ !skb->len &&
|
|
|
|
+ cb->min_dump_alloc < 4096) {
|
|
|
|
+ cb->min_dump_alloc = 4096;
|
|
|
|
+ mutex_unlock(&cfg80211_mutex);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
idx--;
|
|
idx--;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1357,7 +1356,7 @@ static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
|
|
struct sk_buff *msg;
|
|
struct sk_buff *msg;
|
|
struct cfg80211_registered_device *dev = info->user_ptr[0];
|
|
struct cfg80211_registered_device *dev = info->user_ptr[0];
|
|
|
|
|
|
- msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
|
|
|
|
|
+ msg = nlmsg_new(4096, GFP_KERNEL);
|
|
if (!msg)
|
|
if (!msg)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|