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 branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Conflicts: drivers/net/wireless/iwlwifi/mvm/mac80211.c
This commit is contained in:
@@ -127,12 +127,11 @@
|
||||
!Finclude/net/cfg80211.h cfg80211_ibss_params
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_params
|
||||
!Finclude/net/cfg80211.h cfg80211_pmksa
|
||||
!Finclude/net/cfg80211.h cfg80211_send_rx_auth
|
||||
!Finclude/net/cfg80211.h cfg80211_send_auth_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_send_rx_assoc
|
||||
!Finclude/net/cfg80211.h cfg80211_send_assoc_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_send_deauth
|
||||
!Finclude/net/cfg80211.h cfg80211_send_disassoc
|
||||
!Finclude/net/cfg80211.h cfg80211_rx_mlme_mgmt
|
||||
!Finclude/net/cfg80211.h cfg80211_auth_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_rx_assoc_resp
|
||||
!Finclude/net/cfg80211.h cfg80211_assoc_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_tx_mlme_mgmt
|
||||
!Finclude/net/cfg80211.h cfg80211_ibss_joined
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_result
|
||||
!Finclude/net/cfg80211.h cfg80211_roamed
|
||||
|
||||
@@ -3175,10 +3175,21 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
{
|
||||
struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
|
||||
struct ath6kl *ar = ath6kl_priv(vif->ndev);
|
||||
u32 id;
|
||||
u32 id, freq;
|
||||
const struct ieee80211_mgmt *mgmt;
|
||||
bool more_data, queued;
|
||||
|
||||
/* default to the current channel, but use the one specified as argument
|
||||
* if any
|
||||
*/
|
||||
freq = vif->ch_hint;
|
||||
if (chan)
|
||||
freq = chan->center_freq;
|
||||
|
||||
/* never send freq zero to the firmware */
|
||||
if (WARN_ON(freq == 0))
|
||||
return -EINVAL;
|
||||
|
||||
mgmt = (const struct ieee80211_mgmt *) buf;
|
||||
if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) &&
|
||||
ieee80211_is_probe_resp(mgmt->frame_control) &&
|
||||
@@ -3188,8 +3199,7 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
* command to allow the target to fill in the generic IEs.
|
||||
*/
|
||||
*cookie = 0; /* TX status not supported */
|
||||
return ath6kl_send_go_probe_resp(vif, buf, len,
|
||||
chan->center_freq);
|
||||
return ath6kl_send_go_probe_resp(vif, buf, len, freq);
|
||||
}
|
||||
|
||||
id = vif->send_action_id++;
|
||||
@@ -3205,17 +3215,14 @@ static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
|
||||
/* AP mode Power saving processing */
|
||||
if (vif->nw_type == AP_NETWORK) {
|
||||
queued = ath6kl_mgmt_powersave_ap(vif,
|
||||
id, chan->center_freq,
|
||||
wait, buf,
|
||||
len, &more_data, no_cck);
|
||||
queued = ath6kl_mgmt_powersave_ap(vif, id, freq, wait, buf, len,
|
||||
&more_data, no_cck);
|
||||
if (queued)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id,
|
||||
chan->center_freq, wait,
|
||||
buf, len, no_cck);
|
||||
return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id, freq,
|
||||
wait, buf, len, no_cck);
|
||||
}
|
||||
|
||||
static void ath6kl_mgmt_frame_register(struct wiphy *wiphy,
|
||||
@@ -3679,6 +3686,20 @@ err:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support ath6kl_wowlan_support = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_GTK_REKEY_FAILURE |
|
||||
WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
|
||||
WIPHY_WOWLAN_EAP_IDENTITY_REQ |
|
||||
WIPHY_WOWLAN_4WAY_HANDSHAKE,
|
||||
.n_patterns = WOW_MAX_FILTERS_PER_LIST,
|
||||
.pattern_min_len = 1,
|
||||
.pattern_max_len = WOW_PATTERN_SIZE,
|
||||
};
|
||||
#endif
|
||||
|
||||
int ath6kl_cfg80211_init(struct ath6kl *ar)
|
||||
{
|
||||
struct wiphy *wiphy = ar->wiphy;
|
||||
@@ -3772,15 +3793,7 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
|
||||
wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_GTK_REKEY_FAILURE |
|
||||
WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
|
||||
WIPHY_WOWLAN_EAP_IDENTITY_REQ |
|
||||
WIPHY_WOWLAN_4WAY_HANDSHAKE;
|
||||
wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;
|
||||
wiphy->wowlan.pattern_min_len = 1;
|
||||
wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
|
||||
wiphy->wowlan = &ath6kl_wowlan_support;
|
||||
#endif
|
||||
|
||||
wiphy->max_sched_scan_ssids = MAX_PROBED_SSIDS;
|
||||
|
||||
@@ -755,6 +755,15 @@ static const struct ieee80211_iface_combination if_comb[] = {
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support ath9k_wowlan_support = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
|
||||
.n_patterns = MAX_NUM_USER_PATTERN,
|
||||
.pattern_min_len = 1,
|
||||
.pattern_max_len = MAX_PATTERN_SIZE,
|
||||
};
|
||||
#endif
|
||||
|
||||
void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
@@ -802,13 +811,8 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
if ((ah->caps.hw_caps & ATH9K_HW_WOW_DEVICE_CAPABLE) &&
|
||||
device_can_wakeup(sc->dev)) {
|
||||
hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT;
|
||||
hw->wiphy->wowlan.n_patterns = MAX_NUM_USER_PATTERN;
|
||||
hw->wiphy->wowlan.pattern_min_len = 1;
|
||||
hw->wiphy->wowlan.pattern_max_len = MAX_PATTERN_SIZE;
|
||||
}
|
||||
device_can_wakeup(sc->dev))
|
||||
hw->wiphy->wowlan = &ath9k_wowlan_support;
|
||||
|
||||
atomic_set(&sc->wow_sleep_proc_intr, -1);
|
||||
atomic_set(&sc->wow_got_bmiss_intr, -1);
|
||||
|
||||
@@ -3982,6 +3982,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct brcmf_fil_af_params_le *af_params;
|
||||
bool ack;
|
||||
s32 chan_nr;
|
||||
u32 freq;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
@@ -3994,6 +3995,8 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
|
||||
|
||||
if (ieee80211_is_probe_resp(mgmt->frame_control)) {
|
||||
/* Right now the only reason to get a probe response */
|
||||
/* is for p2p listen response or for p2p GO from */
|
||||
@@ -4009,7 +4012,6 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
ie_offset = DOT11_MGMT_HDR_LEN +
|
||||
DOT11_BCN_PRB_FIXED_LEN;
|
||||
ie_len = len - ie_offset;
|
||||
vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
|
||||
if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif)
|
||||
vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
|
||||
err = brcmf_vif_set_mgmt_ie(vif,
|
||||
@@ -4033,8 +4035,15 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
|
||||
/* Add the length exepted for 802.11 header */
|
||||
action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN);
|
||||
/* Add the channel */
|
||||
chan_nr = ieee80211_frequency_to_channel(chan->center_freq);
|
||||
/* Add the channel. Use the one specified as parameter if any or
|
||||
* the current one (got from the firmware) otherwise
|
||||
*/
|
||||
if (chan)
|
||||
freq = chan->center_freq;
|
||||
else
|
||||
brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL,
|
||||
&freq);
|
||||
chan_nr = ieee80211_frequency_to_channel(freq);
|
||||
af_params->channel = cpu_to_le32(chan_nr);
|
||||
|
||||
memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
|
||||
|
||||
@@ -245,6 +245,14 @@ module_param(cw1200_ba_tx_tids, int, 0644);
|
||||
MODULE_PARM_DESC(cw1200_ba_rx_tids, "Block ACK RX TIDs");
|
||||
MODULE_PARM_DESC(cw1200_ba_tx_tids, "Block ACK TX TIDs");
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support cw1200_wowlan_support = {
|
||||
/* Support only for limited wowlan functionalities */
|
||||
.flags = WIPHY_WOWLAN_ANY | WIPHY_WOWLAN_DISCONNECT,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,
|
||||
const bool have_5ghz)
|
||||
{
|
||||
@@ -289,10 +297,7 @@ static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/* Support only for limited wowlan functionalities */
|
||||
hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY |
|
||||
WIPHY_WOWLAN_DISCONNECT;
|
||||
hw->wiphy->wowlan.n_patterns = 0;
|
||||
hw->wiphy->wowlan = &cw1200_wowlan_support;
|
||||
#endif
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
|
||||
|
||||
@@ -915,6 +915,9 @@ struct iwl_priv {
|
||||
__le64 replay_ctr;
|
||||
__le16 last_seq_ctl;
|
||||
bool have_rekey_data;
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
struct wiphy_wowlan_support wowlan_support;
|
||||
#endif
|
||||
|
||||
/* device_pointers: pointers to ucode event tables */
|
||||
struct {
|
||||
|
||||
@@ -208,20 +208,21 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
|
||||
priv->trans->ops->d3_suspend &&
|
||||
priv->trans->ops->d3_resume &&
|
||||
device_can_wakeup(priv->trans->dev)) {
|
||||
hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_EAP_IDENTITY_REQ |
|
||||
WIPHY_WOWLAN_RFKILL_RELEASE;
|
||||
priv->wowlan_support.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_EAP_IDENTITY_REQ |
|
||||
WIPHY_WOWLAN_RFKILL_RELEASE;
|
||||
if (!iwlwifi_mod_params.sw_crypto)
|
||||
hw->wiphy->wowlan.flags |=
|
||||
priv->wowlan_support.flags |=
|
||||
WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
|
||||
WIPHY_WOWLAN_GTK_REKEY_FAILURE;
|
||||
|
||||
hw->wiphy->wowlan.n_patterns = IWLAGN_WOWLAN_MAX_PATTERNS;
|
||||
hw->wiphy->wowlan.pattern_min_len =
|
||||
priv->wowlan_support.n_patterns = IWLAGN_WOWLAN_MAX_PATTERNS;
|
||||
priv->wowlan_support.pattern_min_len =
|
||||
IWLAGN_WOWLAN_MIN_PATTERN_LEN;
|
||||
hw->wiphy->wowlan.pattern_max_len =
|
||||
priv->wowlan_support.pattern_max_len =
|
||||
IWLAGN_WOWLAN_MAX_PATTERN_LEN;
|
||||
hw->wiphy->wowlan = &priv->wowlan_support;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -236,20 +236,20 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
mvm->trans->ops->d3_suspend &&
|
||||
mvm->trans->ops->d3_resume &&
|
||||
device_can_wakeup(mvm->trans->dev)) {
|
||||
hw->wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_EAP_IDENTITY_REQ |
|
||||
WIPHY_WOWLAN_RFKILL_RELEASE;
|
||||
mvm->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
|
||||
WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_EAP_IDENTITY_REQ |
|
||||
WIPHY_WOWLAN_RFKILL_RELEASE;
|
||||
if (!iwlwifi_mod_params.sw_crypto)
|
||||
hw->wiphy->wowlan.flags |=
|
||||
WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
|
||||
WIPHY_WOWLAN_GTK_REKEY_FAILURE |
|
||||
WIPHY_WOWLAN_4WAY_HANDSHAKE;
|
||||
mvm->wowlan.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
|
||||
WIPHY_WOWLAN_GTK_REKEY_FAILURE |
|
||||
WIPHY_WOWLAN_4WAY_HANDSHAKE;
|
||||
|
||||
hw->wiphy->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS;
|
||||
hw->wiphy->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
|
||||
hw->wiphy->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
|
||||
hw->wiphy->wowlan.tcp = &iwl_mvm_wowlan_tcp_support;
|
||||
mvm->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS;
|
||||
mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
|
||||
mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
|
||||
mvm->wowlan.tcp = &iwl_mvm_wowlan_tcp_support;
|
||||
hw->wiphy->wowlan = &mvm->wowlan;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -777,7 +777,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
||||
ret = iwl_mvm_power_update_mode(mvm, vif);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "failed to update power mode\n");
|
||||
} else if (changes & BSS_CHANGED_DTIM_PERIOD) {
|
||||
} else if (changes & BSS_CHANGED_BEACON_INFO) {
|
||||
/*
|
||||
* We received a beacon _after_ association so
|
||||
* remove the session protection.
|
||||
|
||||
@@ -458,6 +458,7 @@ struct iwl_mvm {
|
||||
struct ieee80211_vif *p2p_device_vif;
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
struct wiphy_wowlan_support wowlan;
|
||||
int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen;
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
bool d3_test_active;
|
||||
|
||||
@@ -2475,6 +2475,16 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support mwifiex_wowlan_support = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT,
|
||||
.n_patterns = MWIFIEX_MAX_FILTERS,
|
||||
.pattern_min_len = 1,
|
||||
.pattern_max_len = MWIFIEX_MAX_PATTERN_LEN,
|
||||
.max_pkt_offset = MWIFIEX_MAX_OFFSET_LEN,
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This function registers the device with CFG802.11 subsystem.
|
||||
*
|
||||
@@ -2532,11 +2542,7 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
|
||||
wiphy_apply_custom_regulatory(wiphy, &mwifiex_world_regdom_custom);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT;
|
||||
wiphy->wowlan.n_patterns = MWIFIEX_MAX_FILTERS;
|
||||
wiphy->wowlan.pattern_min_len = 1;
|
||||
wiphy->wowlan.pattern_max_len = MWIFIEX_MAX_PATTERN_LEN;
|
||||
wiphy->wowlan.max_pkt_offset = MWIFIEX_MAX_OFFSET_LEN;
|
||||
wiphy->wowlan = &mwifiex_wowlan_support;
|
||||
#endif
|
||||
|
||||
wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
|
||||
|
||||
@@ -6018,6 +6018,15 @@ int wlcore_free_hw(struct wl1271 *wl)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wlcore_free_hw);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support wlcore_wowlan_support = {
|
||||
.flags = WIPHY_WOWLAN_ANY,
|
||||
.n_patterns = WL1271_MAX_RX_FILTERS,
|
||||
.pattern_min_len = 1,
|
||||
.pattern_max_len = WL1271_RX_FILTER_MAX_PATTERN_SIZE,
|
||||
};
|
||||
#endif
|
||||
|
||||
static void wlcore_nvs_cb(const struct firmware *fw, void *context)
|
||||
{
|
||||
struct wl1271 *wl = context;
|
||||
@@ -6071,14 +6080,8 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
|
||||
if (!ret) {
|
||||
wl->irq_wake_enabled = true;
|
||||
device_init_wakeup(wl->dev, 1);
|
||||
if (pdata->pwr_in_suspend) {
|
||||
wl->hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY;
|
||||
wl->hw->wiphy->wowlan.n_patterns =
|
||||
WL1271_MAX_RX_FILTERS;
|
||||
wl->hw->wiphy->wowlan.pattern_min_len = 1;
|
||||
wl->hw->wiphy->wowlan.pattern_max_len =
|
||||
WL1271_RX_FILTER_MAX_PATTERN_SIZE;
|
||||
}
|
||||
if (pdata->pwr_in_suspend)
|
||||
wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
|
||||
}
|
||||
#endif
|
||||
disable_irq(wl->irq);
|
||||
|
||||
@@ -146,6 +146,7 @@ static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
|
||||
#define IEEE80211_MAX_RTS_THRESHOLD 2353
|
||||
#define IEEE80211_MAX_AID 2007
|
||||
#define IEEE80211_MAX_TIM_LEN 251
|
||||
#define IEEE80211_MAX_MESH_PEERINGS 63
|
||||
/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
|
||||
6.2.1.1.2.
|
||||
|
||||
|
||||
+53
-62
@@ -1124,6 +1124,9 @@ struct bss_parameters {
|
||||
* setting for new peer links.
|
||||
* @dot11MeshAwakeWindowDuration: The duration in TUs the STA will remain awake
|
||||
* after transmitting its beacon.
|
||||
* @plink_timeout: If no tx activity is seen from a STA we've established
|
||||
* peering with for longer than this time (in seconds), then remove it
|
||||
* from the STA's list of peers. Default is 30 minutes.
|
||||
*/
|
||||
struct mesh_config {
|
||||
u16 dot11MeshRetryTimeout;
|
||||
@@ -1153,6 +1156,7 @@ struct mesh_config {
|
||||
u16 dot11MeshHWMPconfirmationInterval;
|
||||
enum nl80211_mesh_power_mode power_mode;
|
||||
u16 dot11MeshAwakeWindowDuration;
|
||||
u32 plink_timeout;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1172,6 +1176,7 @@ struct mesh_config {
|
||||
* @dtim_period: DTIM period to use
|
||||
* @beacon_interval: beacon interval to use
|
||||
* @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]
|
||||
* @basic_rates: basic rates to use when creating the mesh
|
||||
*
|
||||
* These parameters are fixed when the mesh is created.
|
||||
*/
|
||||
@@ -1191,6 +1196,7 @@ struct mesh_setup {
|
||||
u8 dtim_period;
|
||||
u16 beacon_interval;
|
||||
int mcast_rate[IEEE80211_NUM_BANDS];
|
||||
u32 basic_rates;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -2654,7 +2660,7 @@ struct wiphy {
|
||||
u32 hw_version;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
struct wiphy_wowlan_support wowlan;
|
||||
const struct wiphy_wowlan_support *wowlan;
|
||||
struct cfg80211_wowlan *wowlan_config;
|
||||
#endif
|
||||
|
||||
@@ -2853,7 +2859,7 @@ struct cfg80211_cached_keys;
|
||||
* @current_bss: (private) Used by the internal configuration code
|
||||
* @channel: (private) Used by the internal configuration code to track
|
||||
* the user-set AP, monitor and WDS channel
|
||||
* @preset_chan: (private) Used by the internal configuration code to
|
||||
* @preset_chandef: (private) Used by the internal configuration code to
|
||||
* track the channel to be used for AP later
|
||||
* @bssid: (private) Used by the internal configuration code
|
||||
* @ssid: (private) Used by the internal configuration code
|
||||
@@ -2875,6 +2881,15 @@ struct cfg80211_cached_keys;
|
||||
* @p2p_started: true if this is a P2P Device that has been started
|
||||
* @cac_started: true if DFS channel availability check has been started
|
||||
* @cac_start_time: timestamp (jiffies) when the dfs state was entered.
|
||||
* @ps: powersave mode is enabled
|
||||
* @ps_timeout: dynamic powersave timeout
|
||||
* @ap_unexpected_nlportid: (private) netlink port ID of application
|
||||
* registered for unexpected class 3 frames (AP mode)
|
||||
* @conn: (private) cfg80211 software SME connection state machine data
|
||||
* @connect_keys: (private) keys to set after connection is established
|
||||
* @ibss_fixed: (private) IBSS is using fixed BSSID
|
||||
* @event_list: (private) list for internal event processing
|
||||
* @event_lock: (private) lock for event list
|
||||
*/
|
||||
struct wireless_dev {
|
||||
struct wiphy *wiphy;
|
||||
@@ -2898,11 +2913,6 @@ struct wireless_dev {
|
||||
/* currently used for IBSS and SME - might be rearranged later */
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
u8 ssid_len, mesh_id_len, mesh_id_up_len;
|
||||
enum {
|
||||
CFG80211_SME_IDLE,
|
||||
CFG80211_SME_CONNECTING,
|
||||
CFG80211_SME_CONNECTED,
|
||||
} sme_state;
|
||||
struct cfg80211_conn *conn;
|
||||
struct cfg80211_cached_keys *connect_keys;
|
||||
|
||||
@@ -3432,59 +3442,66 @@ void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
|
||||
void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
|
||||
|
||||
/**
|
||||
* cfg80211_send_rx_auth - notification of processed authentication
|
||||
* cfg80211_rx_mlme_mgmt - notification of processed MLME management frame
|
||||
* @dev: network device
|
||||
* @buf: authentication frame (header + body)
|
||||
* @len: length of the frame data
|
||||
*
|
||||
* This function is called whenever an authentication has been processed in
|
||||
* station mode. The driver is required to call either this function or
|
||||
* cfg80211_send_auth_timeout() to indicate the result of cfg80211_ops::auth()
|
||||
* call. This function may sleep. The caller must hold the corresponding wdev's
|
||||
* mutex.
|
||||
* This function is called whenever an authentication, disassociation or
|
||||
* deauthentication frame has been received and processed in station mode.
|
||||
* After being asked to authenticate via cfg80211_ops::auth() the driver must
|
||||
* call either this function or cfg80211_auth_timeout().
|
||||
* After being asked to associate via cfg80211_ops::assoc() the driver must
|
||||
* call either this function or cfg80211_auth_timeout().
|
||||
* While connected, the driver must calls this for received and processed
|
||||
* disassociation and deauthentication frames. If the frame couldn't be used
|
||||
* because it was unprotected, the driver must call the function
|
||||
* cfg80211_rx_unprot_mlme_mgmt() instead.
|
||||
*
|
||||
* This function may sleep. The caller must hold the corresponding wdev's mutex.
|
||||
*/
|
||||
void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len);
|
||||
void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
|
||||
|
||||
/**
|
||||
* cfg80211_send_auth_timeout - notification of timed out authentication
|
||||
* cfg80211_auth_timeout - notification of timed out authentication
|
||||
* @dev: network device
|
||||
* @addr: The MAC address of the device with which the authentication timed out
|
||||
*
|
||||
* This function may sleep. The caller must hold the corresponding wdev's
|
||||
* mutex.
|
||||
*/
|
||||
void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr);
|
||||
void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr);
|
||||
|
||||
/**
|
||||
* cfg80211_send_rx_assoc - notification of processed association
|
||||
* cfg80211_rx_assoc_resp - notification of processed association response
|
||||
* @dev: network device
|
||||
* @bss: the BSS struct association was requested for, the struct reference
|
||||
* is owned by cfg80211 after this call
|
||||
* @buf: (re)association response frame (header + body)
|
||||
* @bss: the BSS that association was requested with, ownership of the pointer
|
||||
* moves to cfg80211 in this call
|
||||
* @buf: authentication frame (header + body)
|
||||
* @len: length of the frame data
|
||||
*
|
||||
* This function is called whenever a (re)association response has been
|
||||
* processed in station mode. The driver is required to call either this
|
||||
* function or cfg80211_send_assoc_timeout() to indicate the result of
|
||||
* cfg80211_ops::assoc() call. This function may sleep. The caller must hold
|
||||
* the corresponding wdev's mutex.
|
||||
* After being asked to associate via cfg80211_ops::assoc() the driver must
|
||||
* call either this function or cfg80211_auth_timeout().
|
||||
*
|
||||
* This function may sleep. The caller must hold the corresponding wdev's mutex.
|
||||
*/
|
||||
void cfg80211_send_rx_assoc(struct net_device *dev, struct cfg80211_bss *bss,
|
||||
void cfg80211_rx_assoc_resp(struct net_device *dev,
|
||||
struct cfg80211_bss *bss,
|
||||
const u8 *buf, size_t len);
|
||||
|
||||
/**
|
||||
* cfg80211_send_assoc_timeout - notification of timed out association
|
||||
* cfg80211_assoc_timeout - notification of timed out association
|
||||
* @dev: network device
|
||||
* @addr: The MAC address of the device with which the association timed out
|
||||
*
|
||||
* This function may sleep. The caller must hold the corresponding wdev's mutex.
|
||||
*/
|
||||
void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr);
|
||||
void cfg80211_assoc_timeout(struct net_device *dev, const u8 *addr);
|
||||
|
||||
/**
|
||||
* cfg80211_send_deauth - notification of processed deauthentication
|
||||
* cfg80211_tx_mlme_mgmt - notification of transmitted deauth/disassoc frame
|
||||
* @dev: network device
|
||||
* @buf: deauthentication frame (header + body)
|
||||
* @buf: 802.11 frame (header + body)
|
||||
* @len: length of the frame data
|
||||
*
|
||||
* This function is called whenever deauthentication has been processed in
|
||||
@@ -3492,46 +3509,20 @@ void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr);
|
||||
* locally generated ones. This function may sleep. The caller must hold the
|
||||
* corresponding wdev's mutex.
|
||||
*/
|
||||
void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len);
|
||||
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
|
||||
|
||||
/**
|
||||
* cfg80211_send_disassoc - notification of processed disassociation
|
||||
* @dev: network device
|
||||
* @buf: disassociation response frame (header + body)
|
||||
* @len: length of the frame data
|
||||
*
|
||||
* This function is called whenever disassociation has been processed in
|
||||
* station mode. This includes both received disassociation frames and locally
|
||||
* generated ones. This function may sleep. The caller must hold the
|
||||
* corresponding wdev's mutex.
|
||||
*/
|
||||
void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len);
|
||||
|
||||
/**
|
||||
* cfg80211_send_unprot_deauth - notification of unprotected deauthentication
|
||||
* cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame
|
||||
* @dev: network device
|
||||
* @buf: deauthentication frame (header + body)
|
||||
* @len: length of the frame data
|
||||
*
|
||||
* This function is called whenever a received Deauthentication frame has been
|
||||
* dropped in station mode because of MFP being used but the Deauthentication
|
||||
* This function is called whenever a received deauthentication or dissassoc
|
||||
* frame has been dropped in station mode because of MFP being used but the
|
||||
* frame was not protected. This function may sleep.
|
||||
*/
|
||||
void cfg80211_send_unprot_deauth(struct net_device *dev, const u8 *buf,
|
||||
size_t len);
|
||||
|
||||
/**
|
||||
* cfg80211_send_unprot_disassoc - notification of unprotected disassociation
|
||||
* @dev: network device
|
||||
* @buf: disassociation frame (header + body)
|
||||
* @len: length of the frame data
|
||||
*
|
||||
* This function is called whenever a received Disassociation frame has been
|
||||
* dropped in station mode because of MFP being used but the Disassociation
|
||||
* frame was not protected. This function may sleep.
|
||||
*/
|
||||
void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
|
||||
size_t len);
|
||||
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev,
|
||||
const u8 *buf, size_t len);
|
||||
|
||||
/**
|
||||
* cfg80211_michael_mic_failure - notification of Michael MIC failure (TKIP)
|
||||
|
||||
@@ -217,8 +217,8 @@ struct ieee80211_chanctx_conf {
|
||||
* @BSS_CHANGED_TXPOWER: TX power setting changed for this interface
|
||||
* @BSS_CHANGED_P2P_PS: P2P powersave settings (CTWindow, opportunistic PS)
|
||||
* changed (currently only in P2P client mode, GO mode will be later)
|
||||
* @BSS_CHANGED_DTIM_PERIOD: the DTIM period value was changed (set when
|
||||
* it becomes valid, managed mode only)
|
||||
* @BSS_CHANGED_BEACON_INFO: Data from the AP's beacon became available:
|
||||
* currently dtim_period only is under consideration.
|
||||
* @BSS_CHANGED_BANDWIDTH: The bandwidth used by this interface changed,
|
||||
* note that this is only called when it changes after the channel
|
||||
* context had been assigned.
|
||||
@@ -244,7 +244,7 @@ enum ieee80211_bss_change {
|
||||
BSS_CHANGED_PS = 1<<17,
|
||||
BSS_CHANGED_TXPOWER = 1<<18,
|
||||
BSS_CHANGED_P2P_PS = 1<<19,
|
||||
BSS_CHANGED_DTIM_PERIOD = 1<<20,
|
||||
BSS_CHANGED_BEACON_INFO = 1<<20,
|
||||
BSS_CHANGED_BANDWIDTH = 1<<21,
|
||||
|
||||
/* when adding here, make sure to change ieee80211_reconfig */
|
||||
@@ -288,7 +288,7 @@ enum ieee80211_rssi_event {
|
||||
* IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE hardware flag
|
||||
* @dtim_period: num of beacons before the next DTIM, for beaconing,
|
||||
* valid in station mode only if after the driver was notified
|
||||
* with the %BSS_CHANGED_DTIM_PERIOD flag, will be non-zero then.
|
||||
* with the %BSS_CHANGED_BEACON_INFO flag, will be non-zero then.
|
||||
* @sync_tsf: last beacon's/probe response's TSF timestamp (could be old
|
||||
* as it may have been received during scanning long ago). If the
|
||||
* HW flag %IEEE80211_HW_TIMING_BEACON_ONLY is set, then this can
|
||||
@@ -460,6 +460,8 @@ struct ieee80211_bss_conf {
|
||||
* @IEEE80211_TX_CTL_DONTFRAG: Don't fragment this packet even if it
|
||||
* would be fragmented by size (this is optional, only used for
|
||||
* monitor injection).
|
||||
* @IEEE80211_TX_CTL_PS_RESPONSE: This frame is a response to a poll
|
||||
* frame (PS-Poll or uAPSD).
|
||||
*
|
||||
* Note: If you have to add new flags to the enumeration, then don't
|
||||
* forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
|
||||
@@ -495,6 +497,7 @@ enum mac80211_tx_control_flags {
|
||||
IEEE80211_TX_STATUS_EOSP = BIT(28),
|
||||
IEEE80211_TX_CTL_USE_MINRATE = BIT(29),
|
||||
IEEE80211_TX_CTL_DONTFRAG = BIT(30),
|
||||
IEEE80211_TX_CTL_PS_RESPONSE = BIT(31),
|
||||
};
|
||||
|
||||
#define IEEE80211_TX_CTL_STBC_SHIFT 23
|
||||
|
||||
@@ -2577,6 +2577,10 @@ enum nl80211_mesh_power_mode {
|
||||
*
|
||||
* @NL80211_MESHCONF_AWAKE_WINDOW: awake window duration (in TUs)
|
||||
*
|
||||
* @NL80211_MESHCONF_PLINK_TIMEOUT: If no tx activity is seen from a STA we've
|
||||
* established peering with for longer than this time (in seconds), then
|
||||
* remove it from the STA's list of peers. Default is 30 minutes.
|
||||
*
|
||||
* @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
|
||||
*/
|
||||
enum nl80211_meshconf_params {
|
||||
@@ -2608,6 +2612,7 @@ enum nl80211_meshconf_params {
|
||||
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
|
||||
NL80211_MESHCONF_POWER_MODE,
|
||||
NL80211_MESHCONF_AWAKE_WINDOW,
|
||||
NL80211_MESHCONF_PLINK_TIMEOUT,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_MESHCONF_ATTR_AFTER_LAST,
|
||||
@@ -3579,6 +3584,10 @@ enum nl80211_ap_sme_features {
|
||||
* Peering Management entity which may be implemented by registering for
|
||||
* beacons or NL80211_CMD_NEW_PEER_CANDIDATE events. The mesh beacon is
|
||||
* still generated by the driver.
|
||||
* @NL80211_FEATURE_ACTIVE_MONITOR: This driver supports an active monitor
|
||||
* interface. An active monitor interface behaves like a normal monitor
|
||||
* interface, but gets added to the driver. It ensures that incoming
|
||||
* unicast packets directed at the configured interface address get ACKed.
|
||||
*/
|
||||
enum nl80211_feature_flags {
|
||||
NL80211_FEATURE_SK_TX_STATUS = 1 << 0,
|
||||
|
||||
+17
-3
@@ -1759,6 +1759,7 @@ static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
|
||||
/* mcast rate setting in Mesh Node */
|
||||
memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
|
||||
sizeof(setup->mcast_rate));
|
||||
sdata->vif.bss_conf.basic_rates = setup->basic_rates;
|
||||
|
||||
sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
|
||||
sdata->vif.bss_conf.dtim_period = setup->dtim_period;
|
||||
@@ -1871,6 +1872,8 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
|
||||
if (_chg_mesh_attr(NL80211_MESHCONF_AWAKE_WINDOW, mask))
|
||||
conf->dot11MeshAwakeWindowDuration =
|
||||
nconf->dot11MeshAwakeWindowDuration;
|
||||
if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
|
||||
conf->plink_timeout = nconf->plink_timeout;
|
||||
ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
return 0;
|
||||
}
|
||||
@@ -2838,6 +2841,12 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* configurations requiring offchan cannot work if no channel has been
|
||||
* specified
|
||||
*/
|
||||
if (need_offchan && !chan)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
|
||||
/* Check if the operating channel is the requested channel */
|
||||
@@ -2847,10 +2856,15 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
rcu_read_lock();
|
||||
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||
|
||||
if (chanctx_conf)
|
||||
need_offchan = chan != chanctx_conf->def.chan;
|
||||
else
|
||||
if (chanctx_conf) {
|
||||
need_offchan = chan && (chan != chanctx_conf->def.chan);
|
||||
} else if (!chan) {
|
||||
ret = -EINVAL;
|
||||
rcu_read_unlock();
|
||||
goto out_unlock;
|
||||
} else {
|
||||
need_offchan = true;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -366,7 +366,7 @@ struct ieee80211_mgd_assoc_data {
|
||||
u8 ssid_len;
|
||||
u8 supp_rates_len;
|
||||
bool wmm, uapsd;
|
||||
bool have_beacon, need_beacon;
|
||||
bool need_beacon;
|
||||
bool synced;
|
||||
bool timeout_started;
|
||||
|
||||
@@ -404,6 +404,7 @@ struct ieee80211_if_managed {
|
||||
|
||||
bool powersave; /* powersave requested for this iface */
|
||||
bool broken_ap; /* AP is broken -- turn off powersave */
|
||||
bool have_beacon;
|
||||
u8 dtim_period;
|
||||
enum ieee80211_smps_mode req_smps, /* requested smps mode */
|
||||
driver_smps_mode; /* smps mode request */
|
||||
|
||||
+1
-2
@@ -686,8 +686,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
return -EINVAL;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
if ((hw->wiphy->wowlan.flags || hw->wiphy->wowlan.n_patterns) &&
|
||||
(!local->ops->suspend || !local->ops->resume))
|
||||
if (hw->wiphy->wowlan && (!local->ops->suspend || !local->ops->resume))
|
||||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
|
||||
+19
-19
@@ -274,8 +274,7 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
|
||||
*pos++ = ifmsh->mesh_auth_id;
|
||||
/* Mesh Formation Info - number of neighbors */
|
||||
neighbors = atomic_read(&ifmsh->estab_plinks);
|
||||
/* Number of neighbor mesh STAs or 15 whichever is smaller */
|
||||
neighbors = (neighbors > 15) ? 15 : neighbors;
|
||||
neighbors = min_t(int, neighbors, IEEE80211_MAX_MESH_PEERINGS);
|
||||
*pos++ = neighbors << 1;
|
||||
/* Mesh capability */
|
||||
*pos = IEEE80211_MESHCONF_CAPAB_FORWARDING;
|
||||
@@ -576,13 +575,11 @@ static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata)
|
||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||
u32 changed;
|
||||
|
||||
ieee80211_sta_expire(sdata, IEEE80211_MESH_PEER_INACTIVITY_LIMIT);
|
||||
ieee80211_sta_expire(sdata, ifmsh->mshcfg.plink_timeout * HZ);
|
||||
mesh_path_expire(sdata);
|
||||
|
||||
changed = mesh_accept_plinks_update(sdata);
|
||||
sdata_lock(sdata);
|
||||
ieee80211_mbss_info_change_notify(sdata, changed);
|
||||
sdata_unlock(sdata);
|
||||
|
||||
mod_timer(&ifmsh->housekeeping_timer,
|
||||
round_jiffies(jiffies +
|
||||
@@ -741,9 +738,6 @@ int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
|
||||
BSS_CHANGED_HT |
|
||||
BSS_CHANGED_BASIC_RATES |
|
||||
BSS_CHANGED_BEACON_INT;
|
||||
enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
|
||||
struct ieee80211_supported_band *sband =
|
||||
sdata->local->hw.wiphy->bands[band];
|
||||
|
||||
local->fif_other_bss++;
|
||||
/* mesh ifaces must set allmulti to forward mcast traffic */
|
||||
@@ -761,7 +755,6 @@ int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
|
||||
sdata->vif.bss_conf.ht_operation_mode =
|
||||
ifmsh->mshcfg.ht_opmode;
|
||||
sdata->vif.bss_conf.enable_beacon = true;
|
||||
sdata->vif.bss_conf.basic_rates = ieee80211_mandatory_rates(sband);
|
||||
|
||||
changed |= ieee80211_mps_local_status_update(sdata);
|
||||
|
||||
@@ -789,12 +782,10 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
|
||||
sdata->vif.bss_conf.enable_beacon = false;
|
||||
clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
|
||||
sdata_lock(sdata);
|
||||
bcn = rcu_dereference_protected(ifmsh->beacon,
|
||||
lockdep_is_held(&sdata->wdev.mtx));
|
||||
rcu_assign_pointer(ifmsh->beacon, NULL);
|
||||
kfree_rcu(bcn, rcu_head);
|
||||
sdata_unlock(sdata);
|
||||
|
||||
/* flush STAs and mpaths on this iface */
|
||||
sta_info_flush(sdata);
|
||||
@@ -807,14 +798,6 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
|
||||
del_timer_sync(&sdata->u.mesh.housekeeping_timer);
|
||||
del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);
|
||||
del_timer_sync(&sdata->u.mesh.mesh_path_timer);
|
||||
/*
|
||||
* If the timer fired while we waited for it, it will have
|
||||
* requeued the work. Now the work will be running again
|
||||
* but will not rearm the timer again because it checks
|
||||
* whether the interface is running, which, at this point,
|
||||
* it no longer is.
|
||||
*/
|
||||
cancel_work_sync(&sdata->work);
|
||||
|
||||
local->fif_other_bss--;
|
||||
atomic_dec(&local->iff_allmultis);
|
||||
@@ -955,6 +938,12 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
u16 stype;
|
||||
|
||||
sdata_lock(sdata);
|
||||
|
||||
/* mesh already went down */
|
||||
if (!sdata->wdev.mesh_id_len)
|
||||
goto out;
|
||||
|
||||
rx_status = IEEE80211_SKB_RXCB(skb);
|
||||
mgmt = (struct ieee80211_mgmt *) skb->data;
|
||||
stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
|
||||
@@ -972,12 +961,20 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status);
|
||||
break;
|
||||
}
|
||||
out:
|
||||
sdata_unlock(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||
|
||||
sdata_lock(sdata);
|
||||
|
||||
/* mesh already went down */
|
||||
if (!sdata->wdev.mesh_id_len)
|
||||
goto out;
|
||||
|
||||
if (ifmsh->preq_queue_len &&
|
||||
time_after(jiffies,
|
||||
ifmsh->last_preq + msecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPpreqMinInterval)))
|
||||
@@ -997,6 +994,9 @@ void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
if (test_and_clear_bit(MESH_WORK_DRIFT_ADJUST, &ifmsh->wrkq_flags))
|
||||
mesh_sync_adjust_tbtt(sdata);
|
||||
|
||||
out:
|
||||
sdata_unlock(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local)
|
||||
|
||||
+2
-3
@@ -188,7 +188,6 @@ struct mesh_rmc {
|
||||
u32 idx_mask;
|
||||
};
|
||||
|
||||
#define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ)
|
||||
#define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ)
|
||||
|
||||
#define MESH_PATH_EXPIRE (600 * HZ)
|
||||
@@ -324,14 +323,14 @@ static inline
|
||||
u32 mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
atomic_inc(&sdata->u.mesh.estab_plinks);
|
||||
return mesh_accept_plinks_update(sdata);
|
||||
return mesh_accept_plinks_update(sdata) | BSS_CHANGED_BEACON;
|
||||
}
|
||||
|
||||
static inline
|
||||
u32 mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
atomic_dec(&sdata->u.mesh.estab_plinks);
|
||||
return mesh_accept_plinks_update(sdata);
|
||||
return mesh_accept_plinks_update(sdata) | BSS_CHANGED_BEACON;
|
||||
}
|
||||
|
||||
static inline int mesh_plink_free_count(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user