mac80211: handle HW ROC expired properly
authorIlan Peer <ilan.peer@intel.com>
Sun, 6 Dec 2015 19:19:15 +0000 (21:19 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 7 Dec 2015 10:06:37 +0000 (11:06 +0100)
In case of HW ROC, when the driver reports that the ROC expired,
it is not sufficient to purge the ROCs based on the remaining
time, as it possible that the device finished the ROC session
before the actual requested duration.

To handle such cases, in case of ROC expired notification from
the driver, complete all the ROCs which are marked with hw_begun,
regardless of the remaining duration.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/offchannel.c

index 6719b27aad6651947955f6797d16795e88fe5e8b..8b2f4eaac2ba65f8e25ae47dc316bf288ef8e0e9 100644 (file)
@@ -224,7 +224,11 @@ static unsigned long ieee80211_end_finished_rocs(struct ieee80211_local *local,
                            msecs_to_jiffies(roc->duration) -
                            now;
 
-               if (roc->abort || remaining <= 0)
+               /* In case of HW ROC, it is possible that the HW finished the
+                * ROC session before the actual requested time. In such a case
+                * end the ROC session (disregarding the remaining time).
+                */
+               if (roc->abort || roc->hw_begun || remaining <= 0)
                        ieee80211_roc_notify_destroy(roc);
                else
                        remaining_dur_min = min(remaining_dur_min, remaining);