Commit 0692c33c authored by David S. Miller's avatar David S. Miller

Merge tag 'mac80211-for-net-2021-03-17' of...

Merge tag 'mac80211-for-net-2021-03-17' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211

Johannes Berg says:

====================
First round of fixes for 5.12-rc:
 * HE (802.11ax) elements can be extended, handle that
 * fix locking in network namespace changes that was
   broken due to the RTNL-redux work
 * various other small fixes
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents afa536d8 239729a2
...@@ -23,6 +23,7 @@ int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len, ...@@ -23,6 +23,7 @@ int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
struct aead_request *aead_req; struct aead_request *aead_req;
int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
u8 *__aad; u8 *__aad;
int ret;
aead_req = kzalloc(reqsize + aad_len, GFP_ATOMIC); aead_req = kzalloc(reqsize + aad_len, GFP_ATOMIC);
if (!aead_req) if (!aead_req)
...@@ -40,10 +41,10 @@ int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len, ...@@ -40,10 +41,10 @@ int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
aead_request_set_crypt(aead_req, sg, sg, data_len, b_0); aead_request_set_crypt(aead_req, sg, sg, data_len, b_0);
aead_request_set_ad(aead_req, sg[0].length); aead_request_set_ad(aead_req, sg[0].length);
crypto_aead_encrypt(aead_req); ret = crypto_aead_encrypt(aead_req);
kfree_sensitive(aead_req); kfree_sensitive(aead_req);
return 0; return ret;
} }
int aead_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len, int aead_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
......
...@@ -22,6 +22,7 @@ int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce, ...@@ -22,6 +22,7 @@ int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
struct aead_request *aead_req; struct aead_request *aead_req;
int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
const __le16 *fc; const __le16 *fc;
int ret;
if (data_len < GMAC_MIC_LEN) if (data_len < GMAC_MIC_LEN)
return -EINVAL; return -EINVAL;
...@@ -59,10 +60,10 @@ int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce, ...@@ -59,10 +60,10 @@ int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
aead_request_set_crypt(aead_req, sg, sg, 0, iv); aead_request_set_crypt(aead_req, sg, sg, 0, iv);
aead_request_set_ad(aead_req, GMAC_AAD_LEN + data_len); aead_request_set_ad(aead_req, GMAC_AAD_LEN + data_len);
crypto_aead_encrypt(aead_req); ret = crypto_aead_encrypt(aead_req);
kfree_sensitive(aead_req); kfree_sensitive(aead_req);
return 0; return ret;
} }
struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[], struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
......
...@@ -2950,14 +2950,14 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy, ...@@ -2950,14 +2950,14 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
continue; continue;
for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) { for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
if (~sdata->rc_rateidx_mcs_mask[i][j]) { if (sdata->rc_rateidx_mcs_mask[i][j] != 0xff) {
sdata->rc_has_mcs_mask[i] = true; sdata->rc_has_mcs_mask[i] = true;
break; break;
} }
} }
for (j = 0; j < NL80211_VHT_NSS_MAX; j++) { for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) { if (sdata->rc_rateidx_vht_mcs_mask[i][j] != 0xffff) {
sdata->rc_has_vht_mcs_mask[i] = true; sdata->rc_has_vht_mcs_mask[i] = true;
break; break;
} }
......
...@@ -1874,6 +1874,8 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) ...@@ -1874,6 +1874,8 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
/* remove beacon */ /* remove beacon */
kfree(sdata->u.ibss.ie); kfree(sdata->u.ibss.ie);
sdata->u.ibss.ie = NULL;
sdata->u.ibss.ie_len = 0;
/* on the next join, re-program HT parameters */ /* on the next join, re-program HT parameters */
memset(&ifibss->ht_capa, 0, sizeof(ifibss->ht_capa)); memset(&ifibss->ht_capa, 0, sizeof(ifibss->ht_capa));
......
...@@ -973,8 +973,19 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -973,8 +973,19 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
continue; continue;
if (!dflt_chandef.chan) { if (!dflt_chandef.chan) {
/*
* Assign the first enabled channel to dflt_chandef
* from the list of channels
*/
for (i = 0; i < sband->n_channels; i++)
if (!(sband->channels[i].flags &
IEEE80211_CHAN_DISABLED))
break;
/* if none found then use the first anyway */
if (i == sband->n_channels)
i = 0;
cfg80211_chandef_create(&dflt_chandef, cfg80211_chandef_create(&dflt_chandef,
&sband->channels[0], &sband->channels[i],
NL80211_CHAN_NO_HT); NL80211_CHAN_NO_HT);
/* init channel we're on */ /* init channel we're on */
if (!local->use_chanctx && !local->_oper_chandef.chan) { if (!local->use_chanctx && !local->_oper_chandef.chan) {
......
...@@ -5071,7 +5071,7 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, ...@@ -5071,7 +5071,7 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
he_oper_ie = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_OPERATION, he_oper_ie = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_OPERATION,
ies->data, ies->len); ies->data, ies->len);
if (he_oper_ie && if (he_oper_ie &&
he_oper_ie[1] == ieee80211_he_oper_size(&he_oper_ie[3])) he_oper_ie[1] >= ieee80211_he_oper_size(&he_oper_ie[3]))
he_oper = (void *)(he_oper_ie + 3); he_oper = (void *)(he_oper_ie + 3);
else else
he_oper = NULL; he_oper = NULL;
......
...@@ -805,7 +805,6 @@ minstrel_ht_group_min_rate_offset(struct minstrel_ht_sta *mi, int group, ...@@ -805,7 +805,6 @@ minstrel_ht_group_min_rate_offset(struct minstrel_ht_sta *mi, int group,
static u16 static u16
minstrel_ht_next_inc_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur) minstrel_ht_next_inc_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur)
{ {
struct minstrel_mcs_group_data *mg;
u8 type = MINSTREL_SAMPLE_TYPE_INC; u8 type = MINSTREL_SAMPLE_TYPE_INC;
int i, index = 0; int i, index = 0;
u8 group; u8 group;
...@@ -813,7 +812,6 @@ minstrel_ht_next_inc_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur) ...@@ -813,7 +812,6 @@ minstrel_ht_next_inc_rate(struct minstrel_ht_sta *mi, u32 fast_rate_dur)
group = mi->sample[type].sample_group; group = mi->sample[type].sample_group;
for (i = 0; i < ARRAY_SIZE(minstrel_mcs_groups); i++) { for (i = 0; i < ARRAY_SIZE(minstrel_mcs_groups); i++) {
group = (group + 1) % ARRAY_SIZE(minstrel_mcs_groups); group = (group + 1) % ARRAY_SIZE(minstrel_mcs_groups);
mg = &mi->groups[group];
index = minstrel_ht_group_min_rate_offset(mi, group, index = minstrel_ht_group_min_rate_offset(mi, group,
fast_rate_dur); fast_rate_dur);
......
...@@ -968,7 +968,7 @@ static void ieee80211_parse_extension_element(u32 *crc, ...@@ -968,7 +968,7 @@ static void ieee80211_parse_extension_element(u32 *crc,
break; break;
case WLAN_EID_EXT_HE_OPERATION: case WLAN_EID_EXT_HE_OPERATION:
if (len >= sizeof(*elems->he_operation) && if (len >= sizeof(*elems->he_operation) &&
len == ieee80211_he_oper_size(data) - 1) { len >= ieee80211_he_oper_size(data) - 1) {
if (crc) if (crc)
*crc = crc32_be(*crc, (void *)elem, *crc = crc32_be(*crc, (void *)elem,
elem->datalen + 2); elem->datalen + 2);
......
...@@ -70,7 +70,7 @@ __cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev, ...@@ -70,7 +70,7 @@ __cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev,
struct wireless_dev *result = NULL; struct wireless_dev *result = NULL;
bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; bool have_ifidx = attrs[NL80211_ATTR_IFINDEX];
bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; bool have_wdev_id = attrs[NL80211_ATTR_WDEV];
u64 wdev_id; u64 wdev_id = 0;
int wiphy_idx = -1; int wiphy_idx = -1;
int ifidx = -1; int ifidx = -1;
...@@ -14789,6 +14789,7 @@ static int nl80211_set_tid_config(struct sk_buff *skb, ...@@ -14789,6 +14789,7 @@ static int nl80211_set_tid_config(struct sk_buff *skb,
#define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\
NL80211_FLAG_CHECK_NETDEV_UP) NL80211_FLAG_CHECK_NETDEV_UP)
#define NL80211_FLAG_CLEAR_SKB 0x20 #define NL80211_FLAG_CLEAR_SKB 0x20
#define NL80211_FLAG_NO_WIPHY_MTX 0x40
static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info) struct genl_info *info)
...@@ -14840,7 +14841,7 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -14840,7 +14841,7 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
info->user_ptr[0] = rdev; info->user_ptr[0] = rdev;
} }
if (rdev) { if (rdev && !(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
wiphy_lock(&rdev->wiphy); wiphy_lock(&rdev->wiphy);
/* we keep the mutex locked until post_doit */ /* we keep the mutex locked until post_doit */
__release(&rdev->wiphy.mtx); __release(&rdev->wiphy.mtx);
...@@ -14865,7 +14866,8 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -14865,7 +14866,8 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
} }
} }
if (info->user_ptr[0]) { if (info->user_ptr[0] &&
!(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) {
struct cfg80211_registered_device *rdev = info->user_ptr[0]; struct cfg80211_registered_device *rdev = info->user_ptr[0];
/* we kept the mutex locked since pre_doit */ /* we kept the mutex locked since pre_doit */
...@@ -15329,7 +15331,9 @@ static const struct genl_small_ops nl80211_small_ops[] = { ...@@ -15329,7 +15331,9 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_wiphy_netns, .doit = nl80211_wiphy_netns,
.flags = GENL_UNS_ADMIN_PERM, .flags = GENL_UNS_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WIPHY, .internal_flags = NL80211_FLAG_NEED_WIPHY |
NL80211_FLAG_NEED_RTNL |
NL80211_FLAG_NO_WIPHY_MTX,
}, },
{ {
.cmd = NL80211_CMD_GET_SURVEY, .cmd = NL80211_CMD_GET_SURVEY,
......
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