mac80211: refactor freeing the next_beacon
authorJohannes Berg <johannes.berg@intel.com>
Mon, 16 May 2022 10:57:32 +0000 (12:57 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 17 May 2022 11:03:34 +0000 (13:03 +0200)
We have this code seven times, refactor it into a
separate function.

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

index bbec7d7..f7896f2 100644 (file)
@@ -1348,6 +1348,16 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
        return 0;
 }
 
+static void ieee80211_free_next_beacon(struct ieee80211_sub_if_data *sdata)
+{
+       if (!sdata->u.ap.next_beacon)
+               return;
+
+       kfree(sdata->u.ap.next_beacon->mbssid_ies);
+       kfree(sdata->u.ap.next_beacon);
+       sdata->u.ap.next_beacon = NULL;
+}
+
 static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
 {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
@@ -1382,11 +1392,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
 
        mutex_unlock(&local->mtx);
 
-       if (sdata->u.ap.next_beacon) {
-               kfree(sdata->u.ap.next_beacon->mbssid_ies);
-               kfree(sdata->u.ap.next_beacon);
-               sdata->u.ap.next_beacon = NULL;
-       }
+       ieee80211_free_next_beacon(sdata);
 
        /* turn off carrier for this interface and dependent VLANs */
        list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
@@ -3321,9 +3327,7 @@ static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
 
                err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
                                              NULL, NULL);
-               kfree(sdata->u.ap.next_beacon->mbssid_ies);
-               kfree(sdata->u.ap.next_beacon);
-               sdata->u.ap.next_beacon = NULL;
+               ieee80211_free_next_beacon(sdata);
 
                if (err < 0)
                        return err;
@@ -3479,9 +3483,7 @@ static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
                     IEEE80211_MAX_CNTDWN_COUNTERS_NUM) ||
                    (params->n_counter_offsets_presp >
                     IEEE80211_MAX_CNTDWN_COUNTERS_NUM)) {
-                       kfree(sdata->u.ap.next_beacon->mbssid_ies);
-                       kfree(sdata->u.ap.next_beacon);
-                       sdata->u.ap.next_beacon = NULL;
+                       ieee80211_free_next_beacon(sdata);
                        return -EINVAL;
                }
 
@@ -3493,9 +3495,7 @@ static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
 
                err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa, NULL);
                if (err < 0) {
-                       kfree(sdata->u.ap.next_beacon->mbssid_ies);
-                       kfree(sdata->u.ap.next_beacon);
-                       sdata->u.ap.next_beacon = NULL;
+                       ieee80211_free_next_beacon(sdata);
                        return err;
                }
                *changed |= err;
@@ -3585,11 +3585,8 @@ static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
 static void ieee80211_color_change_abort(struct ieee80211_sub_if_data  *sdata)
 {
        sdata->vif.color_change_active = false;
-       if (sdata->u.ap.next_beacon) {
-               kfree(sdata->u.ap.next_beacon->mbssid_ies);
-               kfree(sdata->u.ap.next_beacon);
-               sdata->u.ap.next_beacon = NULL;
-       }
+
+       ieee80211_free_next_beacon(sdata);
 
        cfg80211_color_change_aborted_notify(sdata->dev);
 }
@@ -4330,9 +4327,7 @@ ieee80211_set_after_color_change_beacon(struct ieee80211_sub_if_data *sdata,
 
                ret = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
                                              NULL, NULL);
-               kfree(sdata->u.ap.next_beacon->mbssid_ies);
-               kfree(sdata->u.ap.next_beacon);
-               sdata->u.ap.next_beacon = NULL;
+               ieee80211_free_next_beacon(sdata);
 
                if (ret < 0)
                        return ret;
@@ -4375,11 +4370,7 @@ ieee80211_set_color_change_beacon(struct ieee80211_sub_if_data *sdata,
                err = ieee80211_assign_beacon(sdata, &params->beacon_color_change,
                                              NULL, &color_change);
                if (err < 0) {
-                       if (sdata->u.ap.next_beacon) {
-                               kfree(sdata->u.ap.next_beacon->mbssid_ies);
-                               kfree(sdata->u.ap.next_beacon);
-                               sdata->u.ap.next_beacon = NULL;
-                       }
+                       ieee80211_free_next_beacon(sdata);
                        return err;
                }
                *changed |= err;