mirror of https://gitee.com/openkylin/linux.git
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:
commit
bde2c0af61
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue