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. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAlpOQXUACgkQB8qZga/f l8Qpuw/+OclRyelfxh1v1xwFYDUAJZZmU9wr/Yx/ezZ8NoebA5bfJSXV/s+Tgw5E oORx7LUkbxwreQtoEHtc9/IE7SCfXrB8kWoy5A/Q094SDglWOiQbRuYQ0gn4pMkV zukm4O3+cHHGj1slnSOzQWNeF/5mbNwEMo5Id5ZnSjMfoPl+CWH8qvfu4oRFhmiG tZ0gIGARX9FL3v+RyqEhugTxfCzAYRTinGQhG4r6LlkgCqTnza7VhG+3N+fPMkjS 4Rs9ucnMnunrbd9lbbpTb+vWAJ+McJfVw/Gtmjp/W8vyxZFEr0EHiY31btmMAhTO ibZVZYCslL3WM2vIxxy0nGR6O28eCRzU4ETSOrInv4ZooplvmFHVnjms1hqiSaZO 4qy8Yb8cPrIPTcI3OYWvicBAAcHLqlEw8GC4rltf2bw6a0FdJ3igitFy9MPFhxBW OZ0YS+exHAb9lBbk49qOM0Bqu7ug5MUTygX9RGTeWB0sRDmc5OQVsAqvfaapGts9 u+huQzO2Y1b8IDVAL/tTOoDz6A1Qc/S2BFDNilFKVeGOhB35jFA3BN4vJzmpp9Oy cz8150ls6BbfHjrFiuHlQWwaoG6GTebSln9XnEqNXfh5GFj1H/FYTQOv4rIaIjrY wdirSv6UopaRjnBSb062glmb9ZFHQEKBWDvRC7jTRaXMRTBQ2zo= =M0gz -----END PGP SIGNATURE----- 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:
Коммит
72deacce01
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -47,6 +47,8 @@ static void ieee80211_tdls_add_ext_capab(struct ieee80211_sub_if_data *sdata,
|
|||
NL80211_FEATURE_TDLS_CHANNEL_SWITCH;
|
||||
bool wider_band = ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) &&
|
||||
!ifmgd->tdls_wider_bw_prohibited;
|
||||
bool buffer_sta = ieee80211_hw_check(&local->hw,
|
||||
SUPPORTS_TDLS_BUFFER_STA);
|
||||
struct ieee80211_supported_band *sband = ieee80211_get_sband(sdata);
|
||||
bool vht = sband && sband->vht_cap.vht_supported;
|
||||
u8 *pos = skb_put(skb, 10);
|
||||
|
@ -56,7 +58,8 @@ static void ieee80211_tdls_add_ext_capab(struct ieee80211_sub_if_data *sdata,
|
|||
*pos++ = 0x0;
|
||||
*pos++ = 0x0;
|
||||
*pos++ = 0x0;
|
||||
*pos++ = chan_switch ? WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH : 0;
|
||||
*pos++ = (chan_switch ? WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH : 0) |
|
||||
(buffer_sta ? WLAN_EXT_CAPA4_TDLS_BUFFER_STA : 0);
|
||||
*pos++ = WLAN_EXT_CAPA5_TDLS_ENABLED;
|
||||
*pos++ = 0;
|
||||
*pos++ = 0;
|
||||
|
@ -236,6 +239,7 @@ static enum ieee80211_ac_numbers ieee80211_ac_from_wmm(int ac)
|
|||
switch (ac) {
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
/* fall through */
|
||||
case 0:
|
||||
return IEEE80211_AC_BE;
|
||||
case 1:
|
||||
|
|
|
@ -2922,7 +2922,9 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
|||
|
||||
gen_iv = build.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
iv_spc = build.key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE;
|
||||
mmic = build.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC;
|
||||
mmic = build.key->conf.flags &
|
||||
(IEEE80211_KEY_FLAG_GENERATE_MMIC |
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE);
|
||||
|
||||
/* don't handle software crypto */
|
||||
if (!(build.key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
||||
|
|
|
@ -2110,15 +2110,6 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy, 0);
|
||||
|
||||
wake_up:
|
||||
if (local->in_reconfig) {
|
||||
local->in_reconfig = false;
|
||||
barrier();
|
||||
|
||||
/* Restart deferred ROCs */
|
||||
mutex_lock(&local->mtx);
|
||||
ieee80211_start_next_roc(local);
|
||||
mutex_unlock(&local->mtx);
|
||||
}
|
||||
|
||||
if (local->monitors == local->open_count && local->monitors > 0)
|
||||
ieee80211_add_virtual_monitor(local);
|
||||
|
@ -2146,6 +2137,16 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
mutex_unlock(&local->sta_mtx);
|
||||
}
|
||||
|
||||
if (local->in_reconfig) {
|
||||
local->in_reconfig = false;
|
||||
barrier();
|
||||
|
||||
/* Restart deferred ROCs */
|
||||
mutex_lock(&local->mtx);
|
||||
ieee80211_start_next_roc(local);
|
||||
mutex_unlock(&local->mtx);
|
||||
}
|
||||
|
||||
ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
|
||||
IEEE80211_QUEUE_STOP_REASON_SUSPEND,
|
||||
false);
|
||||
|
|
|
@ -165,6 +165,7 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
|||
qos = sta->sta.wme;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case NL80211_IFTYPE_AP:
|
||||
ra = skb->data;
|
||||
break;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright 2002-2004, Instant802 Networks, Inc.
|
||||
* Copyright 2008, Jouni Malinen <j@w1.fi>
|
||||
* Copyright (C) 2016 Intel Deutschland GmbH
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
|
@ -59,8 +59,9 @@ ieee80211_tx_h_michael_mic_add(struct ieee80211_tx_data *tx)
|
|||
if (info->control.hw_key &&
|
||||
(info->flags & IEEE80211_TX_CTL_DONTFRAG ||
|
||||
ieee80211_hw_check(&tx->local->hw, SUPPORTS_TX_FRAG)) &&
|
||||
!(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {
|
||||
/* hwaccel - with no need for SW-generated MMIC */
|
||||
!(tx->key->conf.flags & (IEEE80211_KEY_FLAG_GENERATE_MMIC |
|
||||
IEEE80211_KEY_FLAG_PUT_MIC_SPACE))) {
|
||||
/* hwaccel - with no need for SW-generated MMIC or MIC space */
|
||||
return TX_CONTINUE;
|
||||
}
|
||||
|
||||
|
@ -75,8 +76,15 @@ ieee80211_tx_h_michael_mic_add(struct ieee80211_tx_data *tx)
|
|||
skb_tailroom(skb), tail))
|
||||
return TX_DROP;
|
||||
|
||||
key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY];
|
||||
mic = skb_put(skb, MICHAEL_MIC_LEN);
|
||||
|
||||
if (tx->key->conf.flags & IEEE80211_KEY_FLAG_PUT_MIC_SPACE) {
|
||||
/* Zeroed MIC can help with debug */
|
||||
memset(mic, 0, MICHAEL_MIC_LEN);
|
||||
return TX_CONTINUE;
|
||||
}
|
||||
|
||||
key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY];
|
||||
michael_mic(key, hdr, data, data_len, mic);
|
||||
if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE))
|
||||
mic[0]++;
|
||||
|
|
|
@ -126,6 +126,11 @@ static int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
|
|||
wdev->ibss_fixed = params->channel_fixed;
|
||||
wdev->ibss_dfs_possible = params->userspace_handles_dfs;
|
||||
wdev->chandef = params->chandef;
|
||||
if (connkeys) {
|
||||
params->wep_keys = connkeys->params;
|
||||
params->wep_tx_key = connkeys->def;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
wdev->wext.ibss.chandef = params->chandef;
|
||||
#endif
|
||||
|
|
|
@ -692,7 +692,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
|
|||
return rdev_mgmt_tx(rdev, wdev, params, cookie);
|
||||
}
|
||||
|
||||
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
|
||||
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
|
||||
const u8 *buf, size_t len, u32 flags)
|
||||
{
|
||||
struct wiphy *wiphy = wdev->wiphy;
|
||||
|
@ -708,7 +708,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
|
|||
cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
|
||||
u16 stype;
|
||||
|
||||
trace_cfg80211_rx_mgmt(wdev, freq, sig_mbm);
|
||||
trace_cfg80211_rx_mgmt(wdev, freq, sig_dbm);
|
||||
stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
|
||||
|
||||
if (!(stypes->rx & BIT(stype))) {
|
||||
|
@ -735,7 +735,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
|
|||
|
||||
/* Indicate the received Action frame to user space */
|
||||
if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
|
||||
freq, sig_mbm,
|
||||
freq, sig_dbm,
|
||||
buf, len, flags, GFP_ATOMIC))
|
||||
continue;
|
||||
|
||||
|
|
|
@ -734,11 +734,12 @@ struct key_parse {
|
|||
bool def_uni, def_multi;
|
||||
};
|
||||
|
||||
static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
|
||||
static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
|
||||
struct key_parse *k)
|
||||
{
|
||||
struct nlattr *tb[NL80211_KEY_MAX + 1];
|
||||
int err = nla_parse_nested(tb, NL80211_KEY_MAX, key,
|
||||
nl80211_key_policy, NULL);
|
||||
nl80211_key_policy, info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -771,7 +772,8 @@ static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
|
|||
if (tb[NL80211_KEY_TYPE]) {
|
||||
k->type = nla_get_u32(tb[NL80211_KEY_TYPE]);
|
||||
if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
|
||||
return -EINVAL;
|
||||
return genl_err_attr(info, -EINVAL,
|
||||
tb[NL80211_KEY_TYPE]);
|
||||
}
|
||||
|
||||
if (tb[NL80211_KEY_DEFAULT_TYPES]) {
|
||||
|
@ -779,7 +781,8 @@ static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k)
|
|||
|
||||
err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1,
|
||||
tb[NL80211_KEY_DEFAULT_TYPES],
|
||||
nl80211_key_default_policy, NULL);
|
||||
nl80211_key_default_policy,
|
||||
info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -820,8 +823,10 @@ static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
|
|||
|
||||
if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
|
||||
k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
|
||||
if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES)
|
||||
if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES) {
|
||||
GENL_SET_ERR_MSG(info, "key type out of range");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
|
||||
|
@ -850,31 +855,42 @@ static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
|
|||
k->type = -1;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_KEY])
|
||||
err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k);
|
||||
err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
|
||||
else
|
||||
err = nl80211_parse_key_old(info, k);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (k->def && k->defmgmt)
|
||||
if (k->def && k->defmgmt) {
|
||||
GENL_SET_ERR_MSG(info, "key with def && defmgmt is invalid");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (k->defmgmt) {
|
||||
if (k->def_uni || !k->def_multi)
|
||||
if (k->def_uni || !k->def_multi) {
|
||||
GENL_SET_ERR_MSG(info, "defmgmt key must be mcast");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (k->idx != -1) {
|
||||
if (k->defmgmt) {
|
||||
if (k->idx < 4 || k->idx > 5)
|
||||
if (k->idx < 4 || k->idx > 5) {
|
||||
GENL_SET_ERR_MSG(info,
|
||||
"defmgmt key idx not 4 or 5");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (k->def) {
|
||||
if (k->idx < 0 || k->idx > 3)
|
||||
if (k->idx < 0 || k->idx > 3) {
|
||||
GENL_SET_ERR_MSG(info, "def key idx not 0-3");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (k->idx < 0 || k->idx > 5)
|
||||
if (k->idx < 0 || k->idx > 5) {
|
||||
GENL_SET_ERR_MSG(info, "key idx not 0-5");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -883,8 +899,9 @@ static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
|
|||
|
||||
static struct cfg80211_cached_keys *
|
||||
nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
|
||||
struct nlattr *keys, bool *no_ht)
|
||||
struct genl_info *info, bool *no_ht)
|
||||
{
|
||||
struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
|
||||
struct key_parse parse;
|
||||
struct nlattr *key;
|
||||
struct cfg80211_cached_keys *result;
|
||||
|
@ -909,17 +926,22 @@ nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
|
|||
memset(&parse, 0, sizeof(parse));
|
||||
parse.idx = -1;
|
||||
|
||||
err = nl80211_parse_key_new(key, &parse);
|
||||
err = nl80211_parse_key_new(info, key, &parse);
|
||||
if (err)
|
||||
goto error;
|
||||
err = -EINVAL;
|
||||
if (!parse.p.key)
|
||||
goto error;
|
||||
if (parse.idx < 0 || parse.idx > 3)
|
||||
if (parse.idx < 0 || parse.idx > 3) {
|
||||
GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
|
||||
goto error;
|
||||
}
|
||||
if (parse.def) {
|
||||
if (def)
|
||||
if (def) {
|
||||
GENL_SET_ERR_MSG(info,
|
||||
"only one key can be default");
|
||||
goto error;
|
||||
}
|
||||
def = 1;
|
||||
result->def = parse.idx;
|
||||
if (!parse.def_uni || !parse.def_multi)
|
||||
|
@ -932,6 +954,7 @@ nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
|
|||
goto error;
|
||||
if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 &&
|
||||
parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) {
|
||||
GENL_SET_ERR_MSG(info, "connect key must be WEP");
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
@ -947,6 +970,7 @@ nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
|
|||
|
||||
if (result->def < 0) {
|
||||
err = -EINVAL;
|
||||
GENL_SET_ERR_MSG(info, "need a default/TX key");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -7817,6 +7841,11 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
|
|||
intbss->ts_boottime, NL80211_BSS_PAD))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (!nl80211_put_signal(msg, intbss->pub.chains,
|
||||
intbss->pub.chain_signal,
|
||||
NL80211_BSS_CHAIN_SIGNAL))
|
||||
goto nla_put_failure;
|
||||
|
||||
switch (rdev->wiphy.signal_type) {
|
||||
case CFG80211_SIGNAL_TYPE_MBM:
|
||||
if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal))
|
||||
|
@ -8613,9 +8642,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
|||
if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
|
||||
bool no_ht = false;
|
||||
|
||||
connkeys = nl80211_parse_connkeys(rdev,
|
||||
info->attrs[NL80211_ATTR_KEYS],
|
||||
&no_ht);
|
||||
connkeys = nl80211_parse_connkeys(rdev, info, &no_ht);
|
||||
if (IS_ERR(connkeys))
|
||||
return PTR_ERR(connkeys);
|
||||
|
||||
|
@ -9019,8 +9046,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
|||
}
|
||||
|
||||
if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
|
||||
connkeys = nl80211_parse_connkeys(rdev,
|
||||
info->attrs[NL80211_ATTR_KEYS], NULL);
|
||||
connkeys = nl80211_parse_connkeys(rdev, info, NULL);
|
||||
if (IS_ERR(connkeys))
|
||||
return PTR_ERR(connkeys);
|
||||
}
|
||||
|
@ -13944,7 +13970,7 @@ void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
|
|||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
||||
nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) ||
|
||||
(from_ap && reason &&
|
||||
(reason &&
|
||||
nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) ||
|
||||
(from_ap &&
|
||||
nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) ||
|
||||
|
|
|
@ -981,6 +981,9 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
|
|||
found->ts = tmp->ts;
|
||||
found->ts_boottime = tmp->ts_boottime;
|
||||
found->parent_tsf = tmp->parent_tsf;
|
||||
found->pub.chains = tmp->pub.chains;
|
||||
memcpy(found->pub.chain_signal, tmp->pub.chain_signal,
|
||||
IEEE80211_MAX_CHAINS);
|
||||
ether_addr_copy(found->parent_bssid, tmp->parent_bssid);
|
||||
} else {
|
||||
struct cfg80211_internal_bss *new;
|
||||
|
@ -1233,6 +1236,8 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
|
|||
tmp.pub.capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
|
||||
tmp.ts_boottime = data->boottime_ns;
|
||||
tmp.parent_tsf = data->parent_tsf;
|
||||
tmp.pub.chains = data->chains;
|
||||
memcpy(tmp.pub.chain_signal, data->chain_signal, IEEE80211_MAX_CHAINS);
|
||||
ether_addr_copy(tmp.parent_bssid, data->parent_bssid);
|
||||
|
||||
signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
|
||||
|
|
|
@ -2544,20 +2544,20 @@ DEFINE_EVENT(cfg80211_netdev_mac_evt, cfg80211_del_sta,
|
|||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_rx_mgmt,
|
||||
TP_PROTO(struct wireless_dev *wdev, int freq, int sig_mbm),
|
||||
TP_ARGS(wdev, freq, sig_mbm),
|
||||
TP_PROTO(struct wireless_dev *wdev, int freq, int sig_dbm),
|
||||
TP_ARGS(wdev, freq, sig_dbm),
|
||||
TP_STRUCT__entry(
|
||||
WDEV_ENTRY
|
||||
__field(int, freq)
|
||||
__field(int, sig_mbm)
|
||||
__field(int, sig_dbm)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WDEV_ASSIGN;
|
||||
__entry->freq = freq;
|
||||
__entry->sig_mbm = sig_mbm;
|
||||
__entry->sig_dbm = sig_dbm;
|
||||
),
|
||||
TP_printk(WDEV_PR_FMT ", freq: %d, sig mbm: %d",
|
||||
WDEV_PR_ARG, __entry->freq, __entry->sig_mbm)
|
||||
TP_printk(WDEV_PR_FMT ", freq: %d, sig dbm: %d",
|
||||
WDEV_PR_ARG, __entry->freq, __entry->sig_dbm)
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_mgmt_tx_status,
|
||||
|
|
Загрузка…
Ссылка в новой задаче