wifi: iwlwifi: cancel session protection only if there is one
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Mon, 5 Feb 2024 19:21:08 +0000 (21:21 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 15 Feb 2024 09:58:36 +0000 (10:58 +0100)
mac80211 might (due to an unavoidable race) cancel a ROC that has already
expired. In that case the driver should not send the session protection
cmd to cancel the ROC.
When session protection is supported, the te_data::id field is reused
to save the configuration id. Check it before sending the cmd.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240205211151.30176bf869d9.Id811c20d3746b870cbe0c946bbfe1c0ab0a290cb@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/time-event.c

index a03eceec70e95c68c461175964632a2a71fa4628..89b1c7a876608affbd76800623a257a381b304d6 100644 (file)
@@ -1224,13 +1224,21 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
        if (fw_has_capa(&mvm->fw->ucode_capa,
                        IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) {
                mvmvif = iwl_mvm_vif_from_mac80211(vif);
+               te_data = &mvmvif->time_event_data;
+
+               if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
+                       if (te_data->id >= SESSION_PROTECT_CONF_MAX_ID) {
+                               IWL_DEBUG_TE(mvm,
+                                            "No remain on channel event\n");
+                               return;
+                       }
 
-               if (vif->type == NL80211_IFTYPE_P2P_DEVICE)
                        iwl_mvm_cancel_session_protection(mvm, vif,
-                                                         mvmvif->time_event_data.id,
-                                                         mvmvif->time_event_data.link_id);
-               else
+                                                         te_data->id,
+                                                         te_data->link_id);
+               } else {
                        iwl_mvm_roc_station_remove(mvm, mvmvif);
+               }
                goto cleanup_roc;
        }