mirror of
https://github.com/openwrt/openwrt.git
synced 2025-02-16 07:30:31 +00:00
146 lines
4.3 KiB
Diff
146 lines
4.3 KiB
Diff
|
From: Felix Fietkau <nbd@nbd.name>
|
||
|
Date: Tue, 4 Jun 2024 14:31:09 +0200
|
||
|
Subject: [PATCH] wifi: nl80211: split helper function from
|
||
|
nl80211_put_iface_combinations
|
||
|
|
||
|
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>
|
||
|
---
|
||
|
|
||
|
--- a/net/wireless/nl80211.c
|
||
|
+++ b/net/wireless/nl80211.c
|
||
|
@@ -1620,71 +1620,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);
|
||
|
|