Another set of last-minute fixes:
* fix station double-removal when suspending while associating * fix the HT (802.11n) header length calculation * fix the CCK radiotap flag used for monitoring, a pretty old regression but a simple one-liner * fix per-station group-key handling -----BEGIN PGP SIGNATURE----- iQIcBAABCAAGBQJUwmkTAAoJEDBSmw7B7bqr3X0P/3Y/2UnQSBSi2LnqmsuV8igR noAwaPuCf2ASs25v9nQv64JM1qC0kiemYesi3fFWHiqPhoxx9WrMSvjXdarynrQN LwBG74tcQVEeW70w+36yeKCS+wMU35eTzDDxdnYOfJeNOhW2rQE7WVT2drkc6lVL hvGRhqlBx0mVLQ3VCW5c1kmMN/VAttZKx5WWWurmA8OSQzcHJGZW6ZTuqwpDx4RT iqwi5uBtMkqTQV+22Zb4xI+YxLGwcGiYjy15KksPsrSZZeS5pJzeyovrDhACBVpE aVj3K+OAGVmXCN7HVpQ3tTqCaQea5o+EDqtnT/IQrjnmw6p4mC3co6ShiVn+DkTX 6nv/ka92k9q1LMGIzl+lje2cNmaerVrDa84gUqnHXbTr80+ugKu4NpZowQgdW4yG Qu4kQALkTRhUoNf+RUzXKcFqAW2qLKf83qLcrhbQWkSrY0hzLVWKI/1/FAkCyo6I zKhsB44mHMMaKGVq5qsHTD0E89PtiJuizDLiU04uJExYJCi1FCh9NDlc+HaVlTnt 5LHFbrsPDuAUKoKSiJmJUIyueL+Of5N34+epuLRZb55aE2AQhApg6Nxd+FMuro1m 0aeHEREEO04QZ7IUrYgBA4G7L1dsZJDD8auU6Y4V3chAg6ArbswbtzAv8ON1tAk+ pr0kThACKqkfg2tN5fny =DhIp -----END PGP SIGNATURE----- Merge tag 'mac80211-for-davem-2015-01-23' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211 Another set of last-minute fixes: * fix station double-removal when suspending while associating * fix the HT (802.11n) header length calculation * fix the CCK radiotap flag used for monitoring, a pretty old regression but a simple one-liner * fix per-station group-key handling Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
7d63585bf0
|
@ -86,20 +86,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tear down aggregation sessions and remove STAs */
|
|
||||||
mutex_lock(&local->sta_mtx);
|
|
||||||
list_for_each_entry(sta, &local->sta_list, list) {
|
|
||||||
if (sta->uploaded) {
|
|
||||||
enum ieee80211_sta_state state;
|
|
||||||
|
|
||||||
state = sta->sta_state;
|
|
||||||
for (; state > IEEE80211_STA_NOTEXIST; state--)
|
|
||||||
WARN_ON(drv_sta_state(local, sta->sdata, sta,
|
|
||||||
state, state - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex_unlock(&local->sta_mtx);
|
|
||||||
|
|
||||||
/* remove all interfaces that were created in the driver */
|
/* remove all interfaces that were created in the driver */
|
||||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||||
if (!ieee80211_sdata_running(sdata))
|
if (!ieee80211_sdata_running(sdata))
|
||||||
|
@ -111,6 +97,21 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||||
case NL80211_IFTYPE_STATION:
|
case NL80211_IFTYPE_STATION:
|
||||||
ieee80211_mgd_quiesce(sdata);
|
ieee80211_mgd_quiesce(sdata);
|
||||||
break;
|
break;
|
||||||
|
case NL80211_IFTYPE_WDS:
|
||||||
|
/* tear down aggregation sessions and remove STAs */
|
||||||
|
mutex_lock(&local->sta_mtx);
|
||||||
|
sta = sdata->u.wds.sta;
|
||||||
|
if (sta && sta->uploaded) {
|
||||||
|
enum ieee80211_sta_state state;
|
||||||
|
|
||||||
|
state = sta->sta_state;
|
||||||
|
for (; state > IEEE80211_STA_NOTEXIST; state--)
|
||||||
|
WARN_ON(drv_sta_state(local, sta->sdata,
|
||||||
|
sta, state,
|
||||||
|
state - 1));
|
||||||
|
}
|
||||||
|
mutex_unlock(&local->sta_mtx);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,7 +272,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
|
||||||
else if (rate && rate->flags & IEEE80211_RATE_ERP_G)
|
else if (rate && rate->flags & IEEE80211_RATE_ERP_G)
|
||||||
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
|
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
|
||||||
else if (rate)
|
else if (rate)
|
||||||
channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ;
|
channel_flags |= IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ;
|
||||||
else
|
else
|
||||||
channel_flags |= IEEE80211_CHAN_2GHZ;
|
channel_flags |= IEEE80211_CHAN_2GHZ;
|
||||||
put_unaligned_le16(channel_flags, pos);
|
put_unaligned_le16(channel_flags, pos);
|
||||||
|
|
|
@ -2854,6 +2854,9 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||||
if (!rdev->ops->get_key)
|
if (!rdev->ops->get_key)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -2873,10 +2876,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||||
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
|
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (pairwise && mac_addr &&
|
|
||||||
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
|
||||||
return -ENOENT;
|
|
||||||
|
|
||||||
err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
|
err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
|
||||||
get_key_callback);
|
get_key_callback);
|
||||||
|
|
||||||
|
@ -3047,7 +3046,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||||
wdev_lock(dev->ieee80211_ptr);
|
wdev_lock(dev->ieee80211_ptr);
|
||||||
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
||||||
|
|
||||||
if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr &&
|
if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
|
||||||
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||||
err = -ENOENT;
|
err = -ENOENT;
|
||||||
|
|
||||||
|
|
|
@ -308,6 +308,12 @@ unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ieee80211_is_mgmt(fc)) {
|
||||||
|
if (ieee80211_has_order(fc))
|
||||||
|
hdrlen += IEEE80211_HT_CTL_LEN;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (ieee80211_is_ctl(fc)) {
|
if (ieee80211_is_ctl(fc)) {
|
||||||
/*
|
/*
|
||||||
* ACK and CTS are 10 bytes, all others 16. To see how
|
* ACK and CTS are 10 bytes, all others 16. To see how
|
||||||
|
|
Loading…
Reference in New Issue