mac80211: validate new interface's beacon intervals
authorJohannes Berg <johannes.berg@intel.com>
Fri, 21 Oct 2016 12:25:14 +0000 (14:25 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 27 Oct 2016 07:18:07 +0000 (09:18 +0200)
As part of interface combination checking, verify any new
interface's beacon intervals. In fact, just always add the
beacon interval since that's harmless.

With this patch, mac80211 is prepared for drivers that set
the min_beacon_int_gcd parameter in interface combinations.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c
net/mac80211/util.c

index eb68add4393c20aea21d44b13ded6ac4c13ab75b..e91e503bf99257d7e8f3945c1500eebaa91f5e81 100644 (file)
@@ -864,6 +864,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
        }
        sdata->needed_rx_chains = sdata->local->rx_chains;
 
+       sdata->vif.bss_conf.beacon_int = params->beacon_interval;
+
        mutex_lock(&local->mtx);
        err = ieee80211_vif_use_channel(sdata, &params->chandef,
                                        IEEE80211_CHANCTX_SHARED);
@@ -894,7 +896,6 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
                                              vlan->vif.type);
        }
 
-       sdata->vif.bss_conf.beacon_int = params->beacon_interval;
        sdata->vif.bss_conf.dtim_period = params->dtim_period;
        sdata->vif.bss_conf.enable_beacon = true;
        sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
index 7f24bdc68f71b38bd9224981a2c506acda811efe..ac59fbd280dff8f712fb9dbc841147e4642ec607 100644 (file)
@@ -3326,6 +3326,16 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
        if (WARN_ON(iftype >= NUM_NL80211_IFTYPES))
                return -EINVAL;
 
+       if (sdata->vif.type == NL80211_IFTYPE_AP ||
+           sdata->vif.type == NL80211_IFTYPE_MESH_POINT) {
+               /*
+                * always passing this is harmless, since it'll be the
+                * same value that cfg80211 finds if it finds the same
+                * interface ... and that's always allowed
+                */
+               params.new_beacon_int = sdata->vif.bss_conf.beacon_int;
+       }
+
        /* Always allow software iftypes */
        if (local->hw.wiphy->software_iftypes & BIT(iftype)) {
                if (radar_detect)