ath10k: clean up sta auth/assoc code
The code can be symmetrical so make it so. This makes it easier to understand and work with. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
b1ecde36ad
commit
077efc8c42
@ -1492,6 +1492,9 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
|
||||
arvif->vdev_id, arvif->bssid, arvif->aid);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
|
||||
@ -1534,6 +1537,8 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
|
||||
"mac vdev %d up (associated) bssid %pM aid %d\n",
|
||||
arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
|
||||
|
||||
WARN_ON(arvif->is_up);
|
||||
|
||||
arvif->aid = bss_conf->aid;
|
||||
ether_addr_copy(arvif->bssid, bss_conf->bssid);
|
||||
|
||||
@ -1547,9 +1552,6 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
|
||||
arvif->is_up = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: flush TIDs
|
||||
*/
|
||||
static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
@ -1559,33 +1561,15 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
/*
|
||||
* For some reason, calling VDEV-DOWN before VDEV-STOP
|
||||
* makes the FW to send frames via HTT after disassociation.
|
||||
* No idea why this happens, even though VDEV-DOWN is supposed
|
||||
* to be analogous to link down, so just stop the VDEV.
|
||||
*/
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d stop (disassociated\n",
|
||||
arvif->vdev_id);
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
|
||||
arvif->vdev_id, arvif->bssid);
|
||||
|
||||
/* FIXME: check return value */
|
||||
ret = ath10k_vdev_stop(arvif);
|
||||
|
||||
/*
|
||||
* If we don't call VDEV-DOWN after VDEV-STOP FW will remain active and
|
||||
* report beacons from previously associated network through HTT.
|
||||
* This in turn would spam mac80211 WARN_ON if we bring down all
|
||||
* interfaces as it expects there is no rx when no interface is
|
||||
* running.
|
||||
*/
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d down\n", arvif->vdev_id);
|
||||
|
||||
/* FIXME: why don't we print error if wmi call fails? */
|
||||
ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "faield to down vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
|
||||
arvif->def_wep_key_idx = 0;
|
||||
|
||||
arvif->is_started = false;
|
||||
arvif->is_up = false;
|
||||
}
|
||||
|
||||
@ -3116,54 +3100,8 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
|
||||
arvif->u.ap.hidden_ssid = info->hidden_ssid;
|
||||
}
|
||||
|
||||
/*
|
||||
* Firmware manages AP self-peer internally so make sure to not create
|
||||
* it in driver. Otherwise AP self-peer deletion may timeout later.
|
||||
*/
|
||||
if (changed & BSS_CHANGED_BSSID &&
|
||||
vif->type != NL80211_IFTYPE_AP) {
|
||||
if (!is_zero_ether_addr(info->bssid)) {
|
||||
if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC,
|
||||
"mac vdev %d create peer %pM\n",
|
||||
arvif->vdev_id, info->bssid);
|
||||
|
||||
ret = ath10k_peer_create(ar, arvif->vdev_id,
|
||||
info->bssid);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to add peer %pM for vdev %d when changing bssid: %i\n",
|
||||
info->bssid, arvif->vdev_id,
|
||||
ret);
|
||||
/*
|
||||
* this is never erased as we it for crypto key
|
||||
* clearing; this is FW requirement
|
||||
*/
|
||||
ether_addr_copy(arvif->bssid, info->bssid);
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC,
|
||||
"mac vdev %d start %pM\n",
|
||||
arvif->vdev_id, info->bssid);
|
||||
|
||||
ret = ath10k_vdev_start(arvif);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to start vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
arvif->is_started = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Mac80211 does not keep IBSS bssid when leaving IBSS,
|
||||
* so driver need to store it. It is needed when leaving
|
||||
* IBSS in order to remove BSSID peer.
|
||||
*/
|
||||
if (vif->type == NL80211_IFTYPE_ADHOC)
|
||||
memcpy(arvif->bssid, info->bssid,
|
||||
ETH_ALEN);
|
||||
}
|
||||
}
|
||||
if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
|
||||
ether_addr_copy(arvif->bssid, info->bssid);
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_ENABLED)
|
||||
ath10k_control_beaconing(arvif, info);
|
||||
@ -3225,10 +3163,11 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
|
||||
ath10k_monitor_stop(ar);
|
||||
ath10k_bss_assoc(hw, vif, info);
|
||||
ath10k_monitor_recalc(ar);
|
||||
} else {
|
||||
ath10k_bss_disassoc(hw, vif);
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
}
|
||||
|
||||
@ -3537,8 +3476,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
if (old_state == IEEE80211_STA_NOTEXIST &&
|
||||
new_state == IEEE80211_STA_NONE &&
|
||||
vif->type != NL80211_IFTYPE_STATION) {
|
||||
new_state == IEEE80211_STA_NONE) {
|
||||
/*
|
||||
* New station addition.
|
||||
*/
|
||||
@ -3562,6 +3500,21 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
|
||||
sta->addr, arvif->vdev_id, ret);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
WARN_ON(arvif->is_started);
|
||||
|
||||
ret = ath10k_vdev_start(arvif);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to start vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
WARN_ON(ath10k_peer_delete(ar, arvif->vdev_id,
|
||||
sta->addr));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
arvif->is_started = true;
|
||||
}
|
||||
} else if ((old_state == IEEE80211_STA_NONE &&
|
||||
new_state == IEEE80211_STA_NOTEXIST)) {
|
||||
/*
|
||||
@ -3570,13 +3523,23 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC,
|
||||
"mac vdev %d peer delete %pM (sta gone)\n",
|
||||
arvif->vdev_id, sta->addr);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
WARN_ON(!arvif->is_started);
|
||||
|
||||
ret = ath10k_vdev_stop(arvif);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to stop vdev %i: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
|
||||
arvif->is_started = false;
|
||||
}
|
||||
|
||||
ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
|
||||
sta->addr, arvif->vdev_id, ret);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
ath10k_bss_disassoc(hw, vif);
|
||||
} else if (old_state == IEEE80211_STA_AUTH &&
|
||||
new_state == IEEE80211_STA_ASSOC &&
|
||||
(vif->type == NL80211_IFTYPE_AP ||
|
||||
|
Loading…
Reference in New Issue
Block a user