You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'mac80211-next-for-davem-2018-01-04' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says: ==================== We have things all over the place, no point listing them. One thing is notable: I applied two patches and later reverted them - we'll get back to that once all the driver situation is sorted out. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -728,16 +728,21 @@ static int hwsim_fops_ps_write(void *dat, u64 val)
|
||||
val != PS_MANUAL_POLL)
|
||||
return -EINVAL;
|
||||
|
||||
if (val == PS_MANUAL_POLL) {
|
||||
if (data->ps != PS_ENABLED)
|
||||
return -EINVAL;
|
||||
local_bh_disable();
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
data->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
hwsim_send_ps_poll, data);
|
||||
local_bh_enable();
|
||||
return 0;
|
||||
}
|
||||
old_ps = data->ps;
|
||||
data->ps = val;
|
||||
|
||||
local_bh_disable();
|
||||
if (val == PS_MANUAL_POLL) {
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
data->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
hwsim_send_ps_poll, data);
|
||||
data->ps_poll_pending = true;
|
||||
} else if (old_ps == PS_DISABLED && val != PS_DISABLED) {
|
||||
if (old_ps == PS_DISABLED && val != PS_DISABLED) {
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
data->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||
hwsim_send_nullfunc_ps, data);
|
||||
|
||||
+15
-2
@@ -1773,6 +1773,8 @@ enum cfg80211_signal_type {
|
||||
* by %parent_bssid.
|
||||
* @parent_bssid: the BSS according to which %parent_tsf is set. This is set to
|
||||
* the BSS that requested the scan in which the beacon/probe was received.
|
||||
* @chains: bitmask for filled values in @chain_signal.
|
||||
* @chain_signal: per-chain signal strength of last received BSS in dBm.
|
||||
*/
|
||||
struct cfg80211_inform_bss {
|
||||
struct ieee80211_channel *chan;
|
||||
@@ -1781,6 +1783,8 @@ struct cfg80211_inform_bss {
|
||||
u64 boottime_ns;
|
||||
u64 parent_tsf;
|
||||
u8 parent_bssid[ETH_ALEN] __aligned(2);
|
||||
u8 chains;
|
||||
s8 chain_signal[IEEE80211_MAX_CHAINS];
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1824,6 +1828,8 @@ struct cfg80211_bss_ies {
|
||||
* that holds the beacon data. @beacon_ies is still valid, of course, and
|
||||
* points to the same data as hidden_beacon_bss->beacon_ies in that case.
|
||||
* @signal: signal strength value (type depends on the wiphy's signal_type)
|
||||
* @chains: bitmask for filled values in @chain_signal.
|
||||
* @chain_signal: per-chain signal strength of last received BSS in dBm.
|
||||
* @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
|
||||
*/
|
||||
struct cfg80211_bss {
|
||||
@@ -1842,6 +1848,8 @@ struct cfg80211_bss {
|
||||
u16 capability;
|
||||
|
||||
u8 bssid[ETH_ALEN];
|
||||
u8 chains;
|
||||
s8 chain_signal[IEEE80211_MAX_CHAINS];
|
||||
|
||||
u8 priv[0] __aligned(sizeof(void *));
|
||||
};
|
||||
@@ -2021,6 +2029,9 @@ struct cfg80211_disassoc_request {
|
||||
* @ht_capa: HT Capabilities over-rides. Values set in ht_capa_mask
|
||||
* will be used in ht_capa. Un-supported values will be ignored.
|
||||
* @ht_capa_mask: The bits of ht_capa which are to be used.
|
||||
* @wep_keys: static WEP keys, if not NULL points to an array of
|
||||
* CFG80211_MAX_WEP_KEYS WEP keys
|
||||
* @wep_tx_key: key index (0..3) of the default TX static WEP key
|
||||
*/
|
||||
struct cfg80211_ibss_params {
|
||||
const u8 *ssid;
|
||||
@@ -2037,6 +2048,8 @@ struct cfg80211_ibss_params {
|
||||
int mcast_rate[NUM_NL80211_BANDS];
|
||||
struct ieee80211_ht_cap ht_capa;
|
||||
struct ieee80211_ht_cap ht_capa_mask;
|
||||
struct key_params *wep_keys;
|
||||
int wep_tx_key;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -5575,7 +5588,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
|
||||
* cfg80211_rx_mgmt - notification of received, unprocessed management frame
|
||||
* @wdev: wireless device receiving the frame
|
||||
* @freq: Frequency on which the frame was received in MHz
|
||||
* @sig_dbm: signal strength in mBm, or 0 if unknown
|
||||
* @sig_dbm: signal strength in dBm, or 0 if unknown
|
||||
* @buf: Management frame (header + body)
|
||||
* @len: length of the frame data
|
||||
* @flags: flags, as defined in enum nl80211_rxmgmt_flags
|
||||
@@ -5754,7 +5767,7 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
|
||||
* @frame: the frame
|
||||
* @len: length of the frame
|
||||
* @freq: frequency the frame was received on
|
||||
* @sig_dbm: signal strength in mBm, or 0 if unknown
|
||||
* @sig_dbm: signal strength in dBm, or 0 if unknown
|
||||
*
|
||||
* Use this function to report to userspace when a beacon was
|
||||
* received. It is not useful to call this when there is no
|
||||
|
||||
@@ -1552,6 +1552,9 @@ struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif);
|
||||
* @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the
|
||||
* driver for a key to indicate that sufficient tailroom must always
|
||||
* be reserved for ICV or MIC, even when HW encryption is enabled.
|
||||
* @IEEE80211_KEY_FLAG_PUT_MIC_SPACE: This flag should be set by the driver for
|
||||
* a TKIP key if it only requires MIC space. Do not set together with
|
||||
* @IEEE80211_KEY_FLAG_GENERATE_MMIC on the same key.
|
||||
*/
|
||||
enum ieee80211_key_flags {
|
||||
IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0),
|
||||
@@ -1562,6 +1565,7 @@ enum ieee80211_key_flags {
|
||||
IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5),
|
||||
IEEE80211_KEY_FLAG_RX_MGMT = BIT(6),
|
||||
IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(7),
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE = BIT(8),
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1593,8 +1597,8 @@ struct ieee80211_key_conf {
|
||||
u8 icv_len;
|
||||
u8 iv_len;
|
||||
u8 hw_key_idx;
|
||||
u8 flags;
|
||||
s8 keyidx;
|
||||
u16 flags;
|
||||
u8 keylen;
|
||||
u8 key[0];
|
||||
};
|
||||
@@ -2056,6 +2060,9 @@ struct ieee80211_txq {
|
||||
* The stack will not do fragmentation.
|
||||
* The callback for @set_frag_threshold should be set as well.
|
||||
*
|
||||
* @IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA: Hardware supports buffer STA on
|
||||
* TDLS links.
|
||||
*
|
||||
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
|
||||
*/
|
||||
enum ieee80211_hw_flags {
|
||||
@@ -2098,6 +2105,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_TX_FRAG_LIST,
|
||||
IEEE80211_HW_REPORTS_LOW_ACK,
|
||||
IEEE80211_HW_SUPPORTS_TX_FRAG,
|
||||
IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,
|
||||
|
||||
/* keep last, obviously */
|
||||
NUM_IEEE80211_HW_FLAGS
|
||||
|
||||
@@ -3862,6 +3862,9 @@ enum nl80211_bss_scan_width {
|
||||
* @NL80211_BSS_PARENT_BSSID. (u64).
|
||||
* @NL80211_BSS_PARENT_BSSID: the BSS according to which @NL80211_BSS_PARENT_TSF
|
||||
* is set.
|
||||
* @NL80211_BSS_CHAIN_SIGNAL: per-chain signal strength of last BSS update.
|
||||
* Contains a nested array of signal strength attributes (u8, dBm),
|
||||
* using the nesting index as the antenna number.
|
||||
* @__NL80211_BSS_AFTER_LAST: internal
|
||||
* @NL80211_BSS_MAX: highest BSS attribute
|
||||
*/
|
||||
@@ -3885,6 +3888,7 @@ enum nl80211_bss {
|
||||
NL80211_BSS_PAD,
|
||||
NL80211_BSS_PARENT_TSF,
|
||||
NL80211_BSS_PARENT_BSSID,
|
||||
NL80211_BSS_CHAIN_SIGNAL,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_BSS_AFTER_LAST,
|
||||
|
||||
+8
-18
@@ -153,27 +153,16 @@ EXPORT_SYMBOL(ieee80211_stop_rx_ba_session);
|
||||
*/
|
||||
static void sta_rx_agg_session_timer_expired(struct timer_list *t)
|
||||
{
|
||||
struct tid_ampdu_rx *tid_rx_timer =
|
||||
from_timer(tid_rx_timer, t, session_timer);
|
||||
struct sta_info *sta = tid_rx_timer->sta;
|
||||
u8 tid = tid_rx_timer->tid;
|
||||
struct tid_ampdu_rx *tid_rx;
|
||||
struct tid_ampdu_rx *tid_rx = from_timer(tid_rx, t, session_timer);
|
||||
struct sta_info *sta = tid_rx->sta;
|
||||
u8 tid = tid_rx->tid;
|
||||
unsigned long timeout;
|
||||
|
||||
rcu_read_lock();
|
||||
tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);
|
||||
if (!tid_rx) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
timeout = tid_rx->last_rx + TU_TO_JIFFIES(tid_rx->timeout);
|
||||
if (time_is_after_jiffies(timeout)) {
|
||||
mod_timer(&tid_rx->session_timer, timeout);
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
ht_dbg(sta->sdata, "RX session timer expired on %pM tid %d\n",
|
||||
sta->sta.addr, tid);
|
||||
@@ -415,10 +404,11 @@ end:
|
||||
timeout);
|
||||
}
|
||||
|
||||
void __ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
u8 dialog_token, u16 timeout,
|
||||
u16 start_seq_num, u16 ba_policy, u16 tid,
|
||||
u16 buf_size, bool tx, bool auto_seq)
|
||||
static void __ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
u8 dialog_token, u16 timeout,
|
||||
u16 start_seq_num, u16 ba_policy,
|
||||
u16 tid, u16 buf_size, bool tx,
|
||||
bool auto_seq)
|
||||
{
|
||||
mutex_lock(&sta->ampdu_mlme.mtx);
|
||||
___ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
|
||||
|
||||
+10
-24
@@ -392,7 +392,8 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
|
||||
* telling the driver. New packets will not go through since
|
||||
* the aggregation session is no longer OPERATIONAL.
|
||||
*/
|
||||
synchronize_net();
|
||||
if (!local->in_reconfig)
|
||||
synchronize_net();
|
||||
|
||||
tid_tx->stop_initiator = reason == AGG_STOP_PEER_REQUEST ?
|
||||
WLAN_BACK_RECIPIENT :
|
||||
@@ -429,18 +430,12 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
|
||||
*/
|
||||
static void sta_addba_resp_timer_expired(struct timer_list *t)
|
||||
{
|
||||
struct tid_ampdu_tx *tid_tx_timer =
|
||||
from_timer(tid_tx_timer, t, addba_resp_timer);
|
||||
struct sta_info *sta = tid_tx_timer->sta;
|
||||
u8 tid = tid_tx_timer->tid;
|
||||
struct tid_ampdu_tx *tid_tx;
|
||||
struct tid_ampdu_tx *tid_tx = from_timer(tid_tx, t, addba_resp_timer);
|
||||
struct sta_info *sta = tid_tx->sta;
|
||||
u8 tid = tid_tx->tid;
|
||||
|
||||
/* check if the TID waits for addBA response */
|
||||
rcu_read_lock();
|
||||
tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
|
||||
if (!tid_tx ||
|
||||
test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) {
|
||||
rcu_read_unlock();
|
||||
if (test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) {
|
||||
ht_dbg(sta->sdata,
|
||||
"timer expired on %pM tid %d not expecting addBA response\n",
|
||||
sta->sta.addr, tid);
|
||||
@@ -451,7 +446,6 @@ static void sta_addba_resp_timer_expired(struct timer_list *t)
|
||||
sta->sta.addr, tid);
|
||||
|
||||
ieee80211_stop_tx_ba_session(&sta->sta, tid);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
|
||||
@@ -529,29 +523,21 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
|
||||
*/
|
||||
static void sta_tx_agg_session_timer_expired(struct timer_list *t)
|
||||
{
|
||||
struct tid_ampdu_tx *tid_tx_timer =
|
||||
from_timer(tid_tx_timer, t, session_timer);
|
||||
struct sta_info *sta = tid_tx_timer->sta;
|
||||
u8 tid = tid_tx_timer->tid;
|
||||
struct tid_ampdu_tx *tid_tx;
|
||||
struct tid_ampdu_tx *tid_tx = from_timer(tid_tx, t, session_timer);
|
||||
struct sta_info *sta = tid_tx->sta;
|
||||
u8 tid = tid_tx->tid;
|
||||
unsigned long timeout;
|
||||
|
||||
rcu_read_lock();
|
||||
tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
|
||||
if (!tid_tx || test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
|
||||
rcu_read_unlock();
|
||||
if (test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) {
|
||||
return;
|
||||
}
|
||||
|
||||
timeout = tid_tx->last_tx + TU_TO_JIFFIES(tid_tx->timeout);
|
||||
if (time_is_after_jiffies(timeout)) {
|
||||
mod_timer(&tid_tx->session_timer, timeout);
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
ht_dbg(sta->sdata, "tx session timer expired on %pM tid %d\n",
|
||||
sta->sta.addr, tid);
|
||||
|
||||
|
||||
+30
-1
@@ -573,10 +573,12 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
|
||||
offsetof(typeof(kseq), aes_cmac));
|
||||
/* fall through */
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
|
||||
offsetof(typeof(kseq), aes_gmac));
|
||||
/* fall through */
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
|
||||
@@ -2205,6 +2207,7 @@ static int ieee80211_scan(struct wiphy *wiphy,
|
||||
* for now fall through to allow scanning only when
|
||||
* beaconing hasn't been configured yet
|
||||
*/
|
||||
/* fall through */
|
||||
case NL80211_IFTYPE_AP:
|
||||
/*
|
||||
* If the scan has been forced (and the driver supports
|
||||
@@ -2373,10 +2376,17 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
enum nl80211_tx_power_setting txp_type = type;
|
||||
bool update_txp_type = false;
|
||||
bool has_monitor = false;
|
||||
|
||||
if (wdev) {
|
||||
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
|
||||
sdata = rtnl_dereference(local->monitor_sdata);
|
||||
if (!sdata)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case NL80211_TX_POWER_AUTOMATIC:
|
||||
sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
@@ -2415,15 +2425,34 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
|
||||
has_monitor = true;
|
||||
continue;
|
||||
}
|
||||
sdata->user_power_level = local->user_power_level;
|
||||
if (txp_type != sdata->vif.bss_conf.txpower_type)
|
||||
update_txp_type = true;
|
||||
sdata->vif.bss_conf.txpower_type = txp_type;
|
||||
}
|
||||
list_for_each_entry(sdata, &local->interfaces, list)
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
|
||||
continue;
|
||||
ieee80211_recalc_txpower(sdata, update_txp_type);
|
||||
}
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
if (has_monitor) {
|
||||
sdata = rtnl_dereference(local->monitor_sdata);
|
||||
if (sdata) {
|
||||
sdata->user_power_level = local->user_power_level;
|
||||
if (txp_type != sdata->vif.bss_conf.txpower_type)
|
||||
update_txp_type = true;
|
||||
sdata->vif.bss_conf.txpower_type = txp_type;
|
||||
|
||||
ieee80211_recalc_txpower(sdata, update_txp_type);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -211,6 +211,7 @@ static const char *hw_flag_names[] = {
|
||||
FLAG(TX_FRAG_LIST),
|
||||
FLAG(REPORTS_LOW_ACK),
|
||||
FLAG(SUPPORTS_TX_FRAG),
|
||||
FLAG(SUPPORTS_TDLS_BUFFER_STA),
|
||||
#undef FLAG
|
||||
};
|
||||
|
||||
|
||||
@@ -165,7 +165,8 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local,
|
||||
if (WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE ||
|
||||
sdata->vif.type == NL80211_IFTYPE_NAN ||
|
||||
(sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||
!sdata->vif.mu_mimo_owner)))
|
||||
!sdata->vif.mu_mimo_owner &&
|
||||
!(changed & BSS_CHANGED_TXPOWER))))
|
||||
return;
|
||||
|
||||
if (!check_sdata_in_driver(sdata))
|
||||
|
||||
@@ -492,6 +492,7 @@ int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
|
||||
case IEEE80211_SMPS_AUTOMATIC:
|
||||
case IEEE80211_SMPS_NUM_MODES:
|
||||
WARN_ON(1);
|
||||
/* fall through */
|
||||
case IEEE80211_SMPS_OFF:
|
||||
action_frame->u.action.u.ht_smps.smps_control =
|
||||
WLAN_HT_SMPS_CONTROL_DISABLED;
|
||||
|
||||
@@ -1757,10 +1757,6 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
||||
u16 initiator, u16 reason, bool stop);
|
||||
void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
||||
u16 initiator, u16 reason, bool stop);
|
||||
void __ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
u8 dialog_token, u16 timeout,
|
||||
u16 start_seq_num, u16 ba_policy, u16 tid,
|
||||
u16 buf_size, bool tx, bool auto_seq);
|
||||
void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
|
||||
u8 dialog_token, u16 timeout,
|
||||
u16 start_seq_num, u16 ba_policy, u16 tid,
|
||||
|
||||
@@ -1474,7 +1474,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||
break;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
BUG();
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1633,7 +1633,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
/* otherwise fall through */
|
||||
/* fall through */
|
||||
default:
|
||||
/* assign a new address if possible -- try n_addresses first */
|
||||
for (i = 0; i < local->hw.wiphy->n_addresses; i++) {
|
||||
|
||||
+9
-3
@@ -178,13 +178,17 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
||||
if (!ret) {
|
||||
key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
|
||||
|
||||
if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
|
||||
if (!((key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE)) ||
|
||||
(key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
|
||||
decrease_tailroom_need_count(sdata, 1);
|
||||
|
||||
WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
|
||||
(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV));
|
||||
|
||||
WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) &&
|
||||
(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -237,7 +241,8 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
|
||||
sta = key->sta;
|
||||
sdata = key->sdata;
|
||||
|
||||
if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
|
||||
if (!((key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE)) ||
|
||||
(key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
|
||||
increment_tailroom_need_count(sdata);
|
||||
|
||||
@@ -1104,7 +1109,8 @@ void ieee80211_remove_key(struct ieee80211_key_conf *keyconf)
|
||||
if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
|
||||
key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
|
||||
|
||||
if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
|
||||
if (!((key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE)) ||
|
||||
(key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
|
||||
increment_tailroom_need_count(key->sdata);
|
||||
}
|
||||
|
||||
@@ -263,6 +263,9 @@ static void ieee80211_restart_work(struct work_struct *work)
|
||||
flush_delayed_work(&local->roc_work);
|
||||
flush_work(&local->hw_roc_done);
|
||||
|
||||
/* wait for all packet processing to be done */
|
||||
synchronize_net();
|
||||
|
||||
ieee80211_reconfig(local);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
@@ -989,8 +989,10 @@ ieee80211_mesh_process_chnswitch(struct ieee80211_sub_if_data *sdata,
|
||||
switch (sdata->vif.bss_conf.chandef.width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
sta_flags |= IEEE80211_STA_DISABLE_HT;
|
||||
/* fall through */
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
sta_flags |= IEEE80211_STA_DISABLE_40MHZ;
|
||||
/* fall through */
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
sta_flags |= IEEE80211_STA_DISABLE_VHT;
|
||||
break;
|
||||
|
||||
@@ -1250,6 +1250,7 @@ void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata)
|
||||
break;
|
||||
case IEEE80211_PROACTIVE_PREQ_WITH_PREP:
|
||||
flags |= IEEE80211_PREQ_PROACTIVE_PREP_FLAG;
|
||||
/* fall through */
|
||||
case IEEE80211_PROACTIVE_PREQ_NO_PREP:
|
||||
interval = ifmsh->mshcfg.dot11MeshHWMPactivePathToRootTimeout;
|
||||
target_flags |= IEEE80211_PREQ_TO_FLAG |
|
||||
|
||||
@@ -672,7 +672,7 @@ void mesh_plink_timer(struct timer_list *t)
|
||||
break;
|
||||
}
|
||||
reason = WLAN_REASON_MESH_MAX_RETRIES;
|
||||
/* fall through on else */
|
||||
/* fall through */
|
||||
case NL80211_PLINK_CNF_RCVD:
|
||||
/* confirm timer */
|
||||
if (!reason)
|
||||
|
||||
+6
-4
@@ -473,6 +473,7 @@ static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata,
|
||||
case IEEE80211_SMPS_AUTOMATIC:
|
||||
case IEEE80211_SMPS_NUM_MODES:
|
||||
WARN_ON(1);
|
||||
/* fall through */
|
||||
case IEEE80211_SMPS_OFF:
|
||||
cap |= WLAN_HT_CAP_SM_PS_DISABLED <<
|
||||
IEEE80211_HT_CAP_SM_PS_SHIFT;
|
||||
@@ -2861,10 +2862,11 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
||||
aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
|
||||
capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
|
||||
|
||||
if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
|
||||
sdata_info(sdata, "invalid AID value 0x%x; bits 15:14 not set\n",
|
||||
aid);
|
||||
aid &= ~(BIT(15) | BIT(14));
|
||||
/*
|
||||
* The 5 MSB of the AID field are reserved
|
||||
* (802.11-2016 9.4.1.8 AID field)
|
||||
*/
|
||||
aid &= 0x7ff;
|
||||
|
||||
ifmgd->broken_ap = false;
|
||||
|
||||
|
||||
@@ -801,14 +801,14 @@ int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
if (!sdata->vif.bss_conf.ibss_joined)
|
||||
need_offchan = true;
|
||||
/* fall through */
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
/* fall through */
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif) &&
|
||||
!sdata->u.mesh.mesh_id_len)
|
||||
need_offchan = true;
|
||||
/* fall through */
|
||||
#endif
|
||||
/* fall through */
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
|
||||
+5
-12
@@ -1607,23 +1607,16 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||
|
||||
/*
|
||||
* Change STA power saving mode only at the end of a frame
|
||||
* exchange sequence.
|
||||
* exchange sequence, and only for a data or management
|
||||
* frame as specified in IEEE 802.11-2016 11.2.3.2
|
||||
*/
|
||||
if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) &&
|
||||
!ieee80211_has_morefrags(hdr->frame_control) &&
|
||||
!ieee80211_is_back_req(hdr->frame_control) &&
|
||||
(ieee80211_is_mgmt(hdr->frame_control) ||
|
||||
ieee80211_is_data(hdr->frame_control)) &&
|
||||
!(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&
|
||||
(rx->sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
|
||||
/*
|
||||
* PM bit is only checked in frames where it isn't reserved,
|
||||
* in AP mode it's reserved in non-bufferable management frames
|
||||
* (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field)
|
||||
* BAR frames should be ignored as specified in
|
||||
* IEEE 802.11-2012 10.2.1.2.
|
||||
*/
|
||||
(!ieee80211_is_mgmt(hdr->frame_control) ||
|
||||
ieee80211_is_bufferable_mmpdu(hdr->frame_control))) {
|
||||
rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
|
||||
if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
|
||||
if (!ieee80211_has_pm(hdr->frame_control))
|
||||
sta_ps_end(sta);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user