mac80211_hwsim: register netlink even with multi-channel
authorJohannes Berg <johannes.berg@intel.com>
Tue, 7 Jan 2014 22:28:08 +0000 (23:28 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 10 Jan 2014 19:12:58 +0000 (20:12 +0100)
Reject wmediumd registrations when any devices have multi-channel
capability, but register the generic netlink family unconditionally
to make it possible to add new commands that shouldn't depend on
the number of (default) channels.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/mac80211_hwsim.c

index 4ee88a9b095dc7ca77013bb1db48604fbcda8806..5bad3d4ccdbae66c64a46008df49bf7c90a938f0 100644 (file)
@@ -2243,6 +2243,22 @@ out:
 static int hwsim_register_received_nl(struct sk_buff *skb_2,
                                      struct genl_info *info)
 {
+       struct mac80211_hwsim_data *data;
+       int chans = 1;
+
+       spin_lock_bh(&hwsim_radio_lock);
+       list_for_each_entry(data, &hwsim_radios, list)
+               chans = max(chans, data->channels);
+       spin_unlock_bh(&hwsim_radio_lock);
+
+       /* In the future we should revise the userspace API and allow it
+        * to set a flag that it does support multi-channel, then we can
+        * let this pass conditionally on the flag.
+        * For current userspace, prohibit it since it won't work right.
+        */
+       if (chans > 1)
+               return -EOPNOTSUPP;
+
        if (wmediumd_portid)
                return -EBUSY;
 
@@ -2300,10 +2316,6 @@ static int hwsim_init_netlink(void)
 {
        int rc;
 
-       /* userspace test API hasn't been adjusted for multi-channel */
-       if (channels > 1)
-               return 0;
-
        printk(KERN_INFO "mac80211_hwsim: initializing netlink\n");
 
        rc = genl_register_family_with_ops(&hwsim_genl_family, hwsim_ops);
@@ -2323,10 +2335,6 @@ failure:
 
 static void hwsim_exit_netlink(void)
 {
-       /* userspace test API hasn't been adjusted for multi-channel */
-       if (channels > 1)
-               return;
-
        /* unregister the notifier */
        netlink_unregister_notifier(&hwsim_netlink_notifier);
        /* unregister the family */