cfg80211: move cookie_counter out of wiphy
authorJohannes Berg <johannes.berg@intel.com>
Mon, 1 Oct 2018 09:52:07 +0000 (11:52 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 2 Oct 2018 07:58:36 +0000 (09:58 +0200)
There's no reason for drivers to be able to access the
cfg80211 internal cookie counter; move it out of the
wiphy into the rdev structure.

While at it, also make it never assign 0 as a cookie
(we consider that invalid in some places), and warn if
we manage to do that for some reason (wrapping is not
likely to happen with a u64.)

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/core.h
net/wireless/nl80211.c

index deb313105014bf6230cc42da41e45d6d6c4c859e..8f5ee2c2da0457e55abdebe005ac48633660f9df 100644 (file)
@@ -4012,7 +4012,6 @@ struct wiphy_iftype_ext_capab {
  *     by the driver in the .connect() callback. The bit position maps to the
  *     attribute indices defined in &enum nl80211_bss_select_attr.
  *
- * @cookie_counter: unique generic cookie counter, used to identify objects.
  * @nan_supported_bands: bands supported by the device in NAN mode, a
  *     bitmap of &enum nl80211_band values.  For instance, for
  *     NL80211_BAND_2GHZ, bit 0 would be set
@@ -4151,8 +4150,6 @@ struct wiphy {
 
        u32 bss_select_support;
 
-       u64 cookie_counter;
-
        u8 nan_supported_bands;
 
        u32 txq_limit;
index 45fd4e21dbda8687e1914107679c0d7496662741..c61dbba8bf479e5f0b411cda0a07611d93ae5458 100644 (file)
@@ -66,6 +66,7 @@ struct cfg80211_registered_device {
        /* protected by RTNL only */
        int num_running_ifaces;
        int num_running_monitor_ifaces;
+       u64 cookie_counter;
 
        /* BSSes/scanning */
        spinlock_t bss_lock;
@@ -133,6 +134,16 @@ cfg80211_rdev_free_wowlan(struct cfg80211_registered_device *rdev)
 #endif
 }
 
+static inline u64 cfg80211_assign_cookie(struct cfg80211_registered_device *rdev)
+{
+       u64 r = ++rdev->cookie_counter;
+
+       if (WARN_ON(r == 0))
+               r = ++rdev->cookie_counter;
+
+       return r;
+}
+
 extern struct workqueue_struct *cfg80211_wq;
 extern struct list_head cfg80211_rdev_list;
 extern int cfg80211_rdev_list_generation;
index 8f962c79987ae8956ee3cd9868b19ceb90334833..60ce2eb57fbb53e2017daf0f9a93a00e97e85449 100644 (file)
@@ -7803,7 +7803,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
         */
        if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
                while (!sched_scan_req->reqid)
-                       sched_scan_req->reqid = rdev->wiphy.cookie_counter++;
+                       sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
        }
 
        err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
@@ -11798,7 +11798,7 @@ static int nl80211_nan_add_func(struct sk_buff *skb,
        if (!func)
                return -ENOMEM;
 
-       func->cookie = wdev->wiphy->cookie_counter++;
+       func->cookie = cfg80211_assign_cookie(rdev);
 
        if (!tb[NL80211_NAN_FUNC_TYPE] ||
            nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) {