wifi: nl80211: split helper function from nl80211_put_iface_combinations
authorFelix Fietkau <nbd@nbd.name>
Tue, 2 Jul 2024 11:35:56 +0000 (13:35 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 8 Jul 2024 15:27:04 +0000 (17:27 +0200)
Create a helper function that puts the data from struct
ieee80211_iface_combination to a nl80211 message.
This will be used for adding per-radio interface combination data.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Link: https://patch.msgid.link/22a0eee19dbcf98627239328bc66decd3395122c.1719919832.git-series.nbd@nbd.name
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/nl80211.c

index 674368d028f38c388e10f5b39471db9e8317c8d6..deacd5f3f256e17dcbf108875839e30d77e9cf64 100644 (file)
@@ -1631,71 +1631,78 @@ nla_put_failure:
        return -ENOBUFS;
 }
 
-static int nl80211_put_iface_combinations(struct wiphy *wiphy,
-                                         struct sk_buff *msg,
-                                         bool large)
+static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx,
+                                  const struct ieee80211_iface_combination *c)
 {
-       struct nlattr *nl_combis;
-       int i, j;
+       struct nlattr *nl_combi, *nl_limits;
+       int i;
 
-       nl_combis = nla_nest_start_noflag(msg,
-                                         NL80211_ATTR_INTERFACE_COMBINATIONS);
-       if (!nl_combis)
+       nl_combi = nla_nest_start_noflag(msg, idx);
+       if (!nl_combi)
                goto nla_put_failure;
 
-       for (i = 0; i < wiphy->n_iface_combinations; i++) {
-               const struct ieee80211_iface_combination *c;
-               struct nlattr *nl_combi, *nl_limits;
+       nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS);
+       if (!nl_limits)
+               goto nla_put_failure;
 
-               c = &wiphy->iface_combinations[i];
+       for (i = 0; i < c->n_limits; i++) {
+               struct nlattr *nl_limit;
 
-               nl_combi = nla_nest_start_noflag(msg, i + 1);
-               if (!nl_combi)
+               nl_limit = nla_nest_start_noflag(msg, i + 1);
+               if (!nl_limit)
                        goto nla_put_failure;
-
-               nl_limits = nla_nest_start_noflag(msg,
-                                                 NL80211_IFACE_COMB_LIMITS);
-               if (!nl_limits)
+               if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max))
                        goto nla_put_failure;
+               if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
+                                       c->limits[i].types))
+                       goto nla_put_failure;
+               nla_nest_end(msg, nl_limit);
+       }
 
-               for (j = 0; j < c->n_limits; j++) {
-                       struct nlattr *nl_limit;
+       nla_nest_end(msg, nl_limits);
 
-                       nl_limit = nla_nest_start_noflag(msg, j + 1);
-                       if (!nl_limit)
-                               goto nla_put_failure;
-                       if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
-                                       c->limits[j].max))
-                               goto nla_put_failure;
-                       if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
-                                               c->limits[j].types))
-                               goto nla_put_failure;
-                       nla_nest_end(msg, nl_limit);
-               }
+       if (c->beacon_int_infra_match &&
+           nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
+               goto nla_put_failure;
+       if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
+                       c->num_different_channels) ||
+           nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
+                       c->max_interfaces))
+               goto nla_put_failure;
+       if (large &&
+           (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
+                       c->radar_detect_widths) ||
+            nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
+                       c->radar_detect_regions)))
+               goto nla_put_failure;
+       if (c->beacon_int_min_gcd &&
+           nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
+                       c->beacon_int_min_gcd))
+               goto nla_put_failure;
 
-               nla_nest_end(msg, nl_limits);
+       nla_nest_end(msg, nl_combi);
 
-               if (c->beacon_int_infra_match &&
-                   nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
-                       goto nla_put_failure;
-               if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
-                               c->num_different_channels) ||
-                   nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
-                               c->max_interfaces))
-                       goto nla_put_failure;
-               if (large &&
-                   (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
-                               c->radar_detect_widths) ||
-                    nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
-                               c->radar_detect_regions)))
-                       goto nla_put_failure;
-               if (c->beacon_int_min_gcd &&
-                   nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
-                               c->beacon_int_min_gcd))
-                       goto nla_put_failure;
+       return 0;
+nla_put_failure:
+       return -ENOBUFS;
+}
 
-               nla_nest_end(msg, nl_combi);
-       }
+static int nl80211_put_iface_combinations(struct wiphy *wiphy,
+                                         struct sk_buff *msg,
+                                         bool large)
+{
+       struct nlattr *nl_combis;
+       int i;
+
+       nl_combis = nla_nest_start_noflag(msg,
+                                         NL80211_ATTR_INTERFACE_COMBINATIONS);
+       if (!nl_combis)
+               goto nla_put_failure;
+
+       for (i = 0; i < wiphy->n_iface_combinations; i++)
+               if (nl80211_put_ifcomb_data(msg, large, i + 1,
+                                           &wiphy->iface_combinations[i]))
+                       goto nla_put_failure;
 
        nla_nest_end(msg, nl_combis);