Commit 44fa698c authored by Avraham Stern's avatar Avraham Stern Committed by Johannes Berg
Browse files

wifi: iwlwifi: mvm: FTM initiator MLO support



When checking if the initiator is associated to the responder,
iterate over all active links.

Signed-off-by: default avatarAvraham Stern <avraham.stern@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230612184434.1737f26e9cf7.I8f140ca55094da1d73c387fc036394fb2c148c85@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 8d507812
Loading
Loading
Loading
Loading
+31 −17
Original line number Diff line number Diff line
@@ -72,15 +72,24 @@ int iwl_mvm_ftm_add_pasn_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
	 * the TK is already configured for this station, so it
	 * shouldn't be set again here.
	 */
	if (vif->cfg.assoc &&
	    !memcmp(addr, vif->bss_conf.bssid, ETH_ALEN)) {
	if (vif->cfg.assoc) {
		struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
		struct ieee80211_bss_conf *link_conf;
		unsigned int link_id;
		struct ieee80211_sta *sta;
		u8 sta_id;

		rcu_read_lock();
		sta = rcu_dereference(mvm->fw_id_to_mac_id[mvmvif->deflink.ap_sta_id]);
		for_each_vif_active_link(vif, link_conf, link_id) {
			if (memcmp(addr, link_conf->bssid, ETH_ALEN))
				continue;

			sta_id = mvmvif->link[link_id]->ap_sta_id;
			sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
			if (!IS_ERR_OR_NULL(sta) && sta->mfp)
				expected_tk_len = 0;
			break;
		}
		rcu_read_unlock();
	}

@@ -518,25 +527,30 @@ iwl_mvm_ftm_put_target(struct iwl_mvm *mvm, struct ieee80211_vif *vif,

	iwl_mvm_ftm_put_target_common(mvm, peer, target);

	if (vif->cfg.assoc &&
	    !memcmp(peer->addr, vif->bss_conf.bssid, ETH_ALEN)) {
	if (vif->cfg.assoc) {
		struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
		struct ieee80211_sta *sta;
		struct ieee80211_bss_conf *link_conf;
		unsigned int link_id;

		rcu_read_lock();
		for_each_vif_active_link(vif, link_conf, link_id) {
			if (memcmp(peer->addr, link_conf->bssid, ETH_ALEN))
				continue;

		sta = rcu_dereference(mvm->fw_id_to_mac_id[mvmvif->deflink.ap_sta_id]);
			target->sta_id = mvmvif->link[link_id]->ap_sta_id;
			sta = rcu_dereference(mvm->fw_id_to_mac_id[target->sta_id]);
			if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) {
				rcu_read_unlock();
				return PTR_ERR_OR_ZERO(sta);
			}

		if (sta->mfp && (peer->ftm.trigger_based || peer->ftm.non_trigger_based))
			if (sta->mfp && (peer->ftm.trigger_based ||
					 peer->ftm.non_trigger_based))
				FTM_PUT_FLAG(PMF);

			break;
		}
		rcu_read_unlock();

		target->sta_id = mvmvif->deflink.ap_sta_id;
	} else {
		target->sta_id = IWL_MVM_INVALID_STA;
	}