cfg80211: allow leaving MU-MIMO monitor configuration unchanged
authorJohannes Berg <johannes.berg@intel.com>
Wed, 12 Apr 2017 08:43:49 +0000 (10:43 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 13 Apr 2017 11:41:37 +0000 (13:41 +0200)
When changing monitor parameters, not setting the MU-MIMO attributes
should mean that they're not changed - it's documented that to turn
the feature off it's necessary to set all-zero group membership and
an invalid follow-address. This isn't implemented.

Fix this by making the parameters pointers, stop reusing the macaddr
struct member, and documenting that NULL pointers mean unchanged.

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

index 273b1dc..ba9348e 100644 (file)
@@ -370,13 +370,16 @@ static inline void wiphy_read_of_freq_limits(struct wiphy *wiphy)
  *     This feature is only fully supported by drivers that enable the
  *     %NL80211_FEATURE_MAC_ON_CREATE flag.  Others may support creating
  **    only p2p devices with specified MAC.
- * @vht_mumimo_groups: MU-MIMO groupID. used for monitoring only
- *      packets belonging to that MU-MIMO groupID.
+ * @vht_mumimo_groups: MU-MIMO groupID, used for monitoring MU-MIMO packets
+ *     belonging to that MU-MIMO groupID; %NULL if not changed
+ * @vht_mumimo_follow_addr: MU-MIMO follow address, used for monitoring
+ *     MU-MIMO packets going to the specified station; %NULL if not changed
  */
 struct vif_params {
        int use_4addr;
        u8 macaddr[ETH_ALEN];
-       u8 vht_mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN];
+       const u8 *vht_mumimo_groups;
+       const u8 *vht_mumimo_follow_addr;
 };
 
 /**
index 8bc3d36..ef7de9e 100644 (file)
@@ -80,8 +80,7 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
                u32 mu_mntr_cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
 
                monitor_sdata = rtnl_dereference(local->monitor_sdata);
-               if (monitor_sdata &&
-                   wiphy_ext_feature_isset(wiphy, mu_mntr_cap_flag)) {
+               if (monitor_sdata && params->vht_mumimo_groups) {
                        memcpy(monitor_sdata->vif.bss_conf.mu_group.membership,
                               params->vht_mumimo_groups, WLAN_MEMBERSHIP_LEN);
                        memcpy(monitor_sdata->vif.bss_conf.mu_group.position,
@@ -90,10 +89,11 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
                        monitor_sdata->vif.mu_mimo_owner = true;
                        ieee80211_bss_info_change_notify(monitor_sdata,
                                                         BSS_CHANGED_MU_GROUPS);
+               }
 
+               if (monitor_sdata && params->vht_mumimo_follow_addr)
                        ether_addr_copy(monitor_sdata->u.mntr.mu_follow_addr,
-                                       params->macaddr);
-               }
+                                       params->vht_mumimo_follow_addr);
 
                if (!flags)
                        return 0;
index 9910aae..5cdb0f9 100644 (file)
@@ -2832,8 +2832,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
                    (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(0)))
                        return -EINVAL;
 
-               memcpy(params.vht_mumimo_groups, mumimo_groups,
-                      VHT_MUMIMO_GROUPS_DATA_LEN);
+               params.vht_mumimo_groups = mumimo_groups;
                change = true;
        }
 
@@ -2843,9 +2842,8 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
                if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag))
                        return -EOPNOTSUPP;
 
-               nla_memcpy(params.macaddr,
-                          info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR],
-                          ETH_ALEN);
+               params.vht_mumimo_follow_addr =
+                       nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
                change = true;
        }