Various fixes:

* kernel-doc parsing fixes
  * incorrect debugfs string checks
  * locking fix in regulatory
  * some encryption-related fixes
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAmAF80wACgkQB8qZga/f
 l8RClw//TFzAO2PoGZk7+xWkzRFM7YIZuinHRVeAxaehwVM+9cLnL9YrC90qNX+J
 GwxTsZa5JjewQMrKPoBu+5TNRAqMu0Nf4t1hT1TfPLQKLrOtYfKui2PVUkG3Iqii
 6EtizjtmHS2UelLS+zMjpqG8NKD4hE6G0oxp/K8IEh5WygEvQhggi/6f5Ld9O0kx
 A1PAWrzDOAOMGZtY7IyhqDvwaTHJ2nMFkhsiZPXGbCUKT+xKFefmKRLsiqFXo3of
 ld3nQ3L1BgeLbqAxR7a3zDbRIfNVeZJvvwCtA7T3Gcuy0syqGfguKoGMSlkO6IAu
 aUlpSZaYSGcxGCWiWjTC1MIO2Sx6+Ug4dw+mDv2fEubA1d651yFqqFC9M95FOo5b
 4jCyaw9bG/0ceHChw71tpAdDgqCGeu3jw92SuVpjIzRqdRrLvQ1kxw+FKaWF++wH
 QgAKF7l+WsYJvFkJQhf/eGlhFk6K4Ez4T3/053Exq3OfHcYgPWdTxQcAZJ36GGl1
 kM01dki5j6YS0GMYo9RQIyag/yH72qv4fKK4hYtp7Mu/5W5J3lDV0fZzM5UOhc4+
 x8UPVbqLEUaRXHIJRks0KoRBWwr/NLb/w60xqPQIM1hbmImBfqLYLkmvOhTMJ8Dn
 1WsC2pevDSIjjto9lUCmB4/jHjhpkQ4c/m9bg4wE9Qd8Ha8aT/Q=
 =ea27
 -----END PGP SIGNATURE-----

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

Johannes Berg says:

====================
Various fixes:
 * kernel-doc parsing fixes
 * incorrect debugfs string checks
 * locking fix in regulatory
 * some encryption-related fixes

* tag 'mac80211-for-net-2021-01-18.2' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211:
  mac80211: check if atf has been disabled in __ieee80211_schedule_txq
  mac80211: do not drop tx nulldata packets on encrypted links
  mac80211: fix encryption key selection for 802.3 xmit
  mac80211: fix fast-rx encryption check
  mac80211: fix incorrect strlen of .write in debugfs
  cfg80211: fix a kerneldoc markup
  cfg80211: Save the regulatory domain with a lock
  cfg80211/mac80211: fix kernel-doc for SAR APIs
====================

Link: https://lore.kernel.org/r/20210118204750.7243-1-johannes@sipsolutions.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2021-01-18 14:23:57 -08:00
commit bde2c0af61
6 changed files with 53 additions and 39 deletions

View File

@ -1756,7 +1756,7 @@ struct cfg80211_sar_specs {
/** /**
* @struct cfg80211_sar_chan_ranges - sar frequency ranges * struct cfg80211_sar_freq_ranges - sar frequency ranges
* @start_freq: start range edge frequency * @start_freq: start range edge frequency
* @end_freq: end range edge frequency * @end_freq: end range edge frequency
*/ */
@ -3972,6 +3972,8 @@ struct mgmt_frame_regs {
* This callback may sleep. * This callback may sleep.
* @reset_tid_config: Reset TID specific configuration for the peer, for the * @reset_tid_config: Reset TID specific configuration for the peer, for the
* given TIDs. This callback may sleep. * given TIDs. This callback may sleep.
*
* @set_sar_specs: Update the SAR (TX power) settings.
*/ */
struct cfg80211_ops { struct cfg80211_ops {
int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
@ -4929,6 +4931,7 @@ struct wiphy_iftype_akm_suites {
* @max_data_retry_count: maximum supported per TID retry count for * @max_data_retry_count: maximum supported per TID retry count for
* configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and * configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and
* %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes * %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes
* @sar_capa: SAR control capabilities
*/ */
struct wiphy { struct wiphy {
/* assign these fields before you register the wiphy */ /* assign these fields before you register the wiphy */

View File

@ -3880,6 +3880,7 @@ enum ieee80211_reconfig_type {
* This callback may sleep. * This callback may sleep.
* @sta_set_4addr: Called to notify the driver when a station starts/stops using * @sta_set_4addr: Called to notify the driver when a station starts/stops using
* 4-address mode * 4-address mode
* @set_sar_specs: Update the SAR (TX power) settings.
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,

View File

@ -120,18 +120,17 @@ static ssize_t aqm_write(struct file *file,
{ {
struct ieee80211_local *local = file->private_data; struct ieee80211_local *local = file->private_data;
char buf[100]; char buf[100];
size_t len;
if (count > sizeof(buf)) if (count >= sizeof(buf))
return -EINVAL; return -EINVAL;
if (copy_from_user(buf, user_buf, count)) if (copy_from_user(buf, user_buf, count))
return -EFAULT; return -EFAULT;
buf[sizeof(buf) - 1] = '\0'; if (count && buf[count - 1] == '\n')
len = strlen(buf); buf[count - 1] = '\0';
if (len > 0 && buf[len-1] == '\n') else
buf[len-1] = 0; buf[count] = '\0';
if (sscanf(buf, "fq_limit %u", &local->fq.limit) == 1) if (sscanf(buf, "fq_limit %u", &local->fq.limit) == 1)
return count; return count;
@ -177,18 +176,17 @@ static ssize_t airtime_flags_write(struct file *file,
{ {
struct ieee80211_local *local = file->private_data; struct ieee80211_local *local = file->private_data;
char buf[16]; char buf[16];
size_t len;
if (count > sizeof(buf)) if (count >= sizeof(buf))
return -EINVAL; return -EINVAL;
if (copy_from_user(buf, user_buf, count)) if (copy_from_user(buf, user_buf, count))
return -EFAULT; return -EFAULT;
buf[sizeof(buf) - 1] = 0; if (count && buf[count - 1] == '\n')
len = strlen(buf); buf[count - 1] = '\0';
if (len > 0 && buf[len - 1] == '\n') else
buf[len - 1] = 0; buf[count] = '\0';
if (kstrtou16(buf, 0, &local->airtime_flags)) if (kstrtou16(buf, 0, &local->airtime_flags))
return -EINVAL; return -EINVAL;
@ -237,20 +235,19 @@ static ssize_t aql_txq_limit_write(struct file *file,
{ {
struct ieee80211_local *local = file->private_data; struct ieee80211_local *local = file->private_data;
char buf[100]; char buf[100];
size_t len;
u32 ac, q_limit_low, q_limit_high, q_limit_low_old, q_limit_high_old; u32 ac, q_limit_low, q_limit_high, q_limit_low_old, q_limit_high_old;
struct sta_info *sta; struct sta_info *sta;
if (count > sizeof(buf)) if (count >= sizeof(buf))
return -EINVAL; return -EINVAL;
if (copy_from_user(buf, user_buf, count)) if (copy_from_user(buf, user_buf, count))
return -EFAULT; return -EFAULT;
buf[sizeof(buf) - 1] = 0; if (count && buf[count - 1] == '\n')
len = strlen(buf); buf[count - 1] = '\0';
if (len > 0 && buf[len - 1] == '\n') else
buf[len - 1] = 0; buf[count] = '\0';
if (sscanf(buf, "%u %u %u", &ac, &q_limit_low, &q_limit_high) != 3) if (sscanf(buf, "%u %u %u", &ac, &q_limit_low, &q_limit_high) != 3)
return -EINVAL; return -EINVAL;
@ -306,18 +303,17 @@ static ssize_t force_tx_status_write(struct file *file,
{ {
struct ieee80211_local *local = file->private_data; struct ieee80211_local *local = file->private_data;
char buf[3]; char buf[3];
size_t len;
if (count > sizeof(buf)) if (count >= sizeof(buf))
return -EINVAL; return -EINVAL;
if (copy_from_user(buf, user_buf, count)) if (copy_from_user(buf, user_buf, count))
return -EFAULT; return -EFAULT;
buf[sizeof(buf) - 1] = '\0'; if (count && buf[count - 1] == '\n')
len = strlen(buf); buf[count - 1] = '\0';
if (len > 0 && buf[len - 1] == '\n') else
buf[len - 1] = 0; buf[count] = '\0';
if (buf[0] == '0' && buf[1] == '\0') if (buf[0] == '0' && buf[1] == '\0')
local->force_tx_status = 0; local->force_tx_status = 0;

View File

@ -4176,6 +4176,8 @@ void ieee80211_check_fast_rx(struct sta_info *sta)
rcu_read_lock(); rcu_read_lock();
key = rcu_dereference(sta->ptk[sta->ptk_idx]); key = rcu_dereference(sta->ptk[sta->ptk_idx]);
if (!key)
key = rcu_dereference(sdata->default_unicast_key);
if (key) { if (key) {
switch (key->conf.cipher) { switch (key->conf.cipher) {
case WLAN_CIPHER_SUITE_TKIP: case WLAN_CIPHER_SUITE_TKIP:

View File

@ -649,7 +649,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
if (!skip_hw && tx->key && if (!skip_hw && tx->key &&
tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
info->control.hw_key = &tx->key->conf; info->control.hw_key = &tx->key->conf;
} else if (!ieee80211_is_mgmt(hdr->frame_control) && tx->sta && } else if (ieee80211_is_data_present(hdr->frame_control) && tx->sta &&
test_sta_flag(tx->sta, WLAN_STA_USES_ENCRYPTION)) { test_sta_flag(tx->sta, WLAN_STA_USES_ENCRYPTION)) {
return TX_DROP; return TX_DROP;
} }
@ -3809,7 +3809,7 @@ void __ieee80211_schedule_txq(struct ieee80211_hw *hw,
* get immediately moved to the back of the list on the next * get immediately moved to the back of the list on the next
* call to ieee80211_next_txq(). * call to ieee80211_next_txq().
*/ */
if (txqi->txq.sta && if (txqi->txq.sta && local->airtime_flags &&
wiphy_ext_feature_isset(local->hw.wiphy, wiphy_ext_feature_isset(local->hw.wiphy,
NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) NL80211_EXT_FEATURE_AIRTIME_FAIRNESS))
list_add(&txqi->schedule_order, list_add(&txqi->schedule_order,
@ -4251,7 +4251,6 @@ netdev_tx_t ieee80211_subif_start_xmit_8023(struct sk_buff *skb,
struct ethhdr *ehdr = (struct ethhdr *)skb->data; struct ethhdr *ehdr = (struct ethhdr *)skb->data;
struct ieee80211_key *key; struct ieee80211_key *key;
struct sta_info *sta; struct sta_info *sta;
bool offload = true;
if (unlikely(skb->len < ETH_HLEN)) { if (unlikely(skb->len < ETH_HLEN)) {
kfree_skb(skb); kfree_skb(skb);
@ -4267,18 +4266,22 @@ netdev_tx_t ieee80211_subif_start_xmit_8023(struct sk_buff *skb,
if (unlikely(IS_ERR_OR_NULL(sta) || !sta->uploaded || if (unlikely(IS_ERR_OR_NULL(sta) || !sta->uploaded ||
!test_sta_flag(sta, WLAN_STA_AUTHORIZED) || !test_sta_flag(sta, WLAN_STA_AUTHORIZED) ||
sdata->control_port_protocol == ehdr->h_proto)) sdata->control_port_protocol == ehdr->h_proto))
offload = false; goto skip_offload;
else if ((key = rcu_dereference(sta->ptk[sta->ptk_idx])) &&
(!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) ||
key->conf.cipher == WLAN_CIPHER_SUITE_TKIP))
offload = false;
if (offload) key = rcu_dereference(sta->ptk[sta->ptk_idx]);
ieee80211_8023_xmit(sdata, dev, sta, key, skb); if (!key)
else key = rcu_dereference(sdata->default_unicast_key);
ieee80211_subif_start_xmit(skb, dev);
if (key && (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) ||
key->conf.cipher == WLAN_CIPHER_SUITE_TKIP))
goto skip_offload;
ieee80211_8023_xmit(sdata, dev, sta, key, skb);
goto out;
skip_offload:
ieee80211_subif_start_xmit(skb, dev);
out: out:
rcu_read_unlock(); rcu_read_unlock();

View File

@ -5,7 +5,7 @@
* Copyright 2008-2011 Luis R. Rodriguez <mcgrof@qca.qualcomm.com> * Copyright 2008-2011 Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
* Copyright 2013-2014 Intel Mobile Communications GmbH * Copyright 2013-2014 Intel Mobile Communications GmbH
* Copyright 2017 Intel Deutschland GmbH * Copyright 2017 Intel Deutschland GmbH
* Copyright (C) 2018 - 2019 Intel Corporation * Copyright (C) 2018 - 2021 Intel Corporation
* *
* Permission to use, copy, modify, and/or distribute this software for any * Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * purpose with or without fee is hereby granted, provided that the above
@ -139,6 +139,11 @@ static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
return rcu_dereference_rtnl(cfg80211_regdomain); return rcu_dereference_rtnl(cfg80211_regdomain);
} }
/*
* Returns the regulatory domain associated with the wiphy.
*
* Requires either RTNL or RCU protection
*/
const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy) const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
{ {
return rcu_dereference_rtnl(wiphy->regd); return rcu_dereference_rtnl(wiphy->regd);
@ -2571,9 +2576,13 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
if (IS_ERR(new_regd)) if (IS_ERR(new_regd))
return; return;
rtnl_lock();
tmp = get_wiphy_regdom(wiphy); tmp = get_wiphy_regdom(wiphy);
rcu_assign_pointer(wiphy->regd, new_regd); rcu_assign_pointer(wiphy->regd, new_regd);
rcu_free_regdom(tmp); rcu_free_regdom(tmp);
rtnl_unlock();
} }
EXPORT_SYMBOL(wiphy_apply_custom_regulatory); EXPORT_SYMBOL(wiphy_apply_custom_regulatory);