diff mbox series

[v3,11/11] mbssid: add nl80211 support

Message ID 20220511211521.2054-12-quic_alokad@quicinc.com
State Deferred
Headers show
Series hostapd: MBSSID and EMA support | expand

Commit Message

Aloka Dixit May 11, 2022, 9:15 p.m. UTC
From: John Crispin <john@phrozen.org>

Send MBSSID and EMA configuration parameters to kernel.

Signed-off-by: John Crispin <john@phrozen.org>
Co-developed-by: Aloka Dixit <quic_alokad@quicinc.com>
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
---
 src/drivers/driver_nl80211.c | 52 ++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
diff mbox series

Patch

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 0127a6be28ed..d092f26fe713 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -4535,6 +4535,55 @@  static int nl80211_unsol_bcast_probe_resp(struct i802_bss *bss,
 #endif /* CONFIG_IEEE80211AX */
 
 
+static int nl80211_mbssid(struct nl_msg *msg,
+			 struct wpa_driver_ap_params *params)
+{
+	struct nlattr *config, *elems;
+	int ifidx;
+
+	if (!params->mbssid_tx_iface)
+		return 0;
+
+	config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG);
+	if (!config)
+		return -1;
+
+	nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_INDEX, params->mbssid_index);
+	if (params->mbssid_tx_iface) {
+		ifidx = if_nametoindex(params->mbssid_tx_iface);
+		if (ifidx <= 0)
+			return -1;
+		nla_put_u32(msg,
+			    NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX,
+			    ifidx);
+	}
+
+	if (params->ema)
+		nla_put_flag(msg, NL80211_MBSSID_CONFIG_ATTR_EMA);
+
+	nla_nest_end(msg, config);
+
+	if (params->mbssid_elem_count && params->mbssid_elem_len &&
+	    params->mbssid_elem_offset && *params->mbssid_elem_offset) {
+		u8 i, **offs = params->mbssid_elem_offset;
+
+		elems = nla_nest_start(msg, NL80211_ATTR_MBSSID_ELEMS);
+		if (!elems)
+			return -1;
+
+		for (i = 0; i < params->mbssid_elem_count - 1; i++)
+			nla_put(msg, i + 1, offs[i + 1] - offs[i], offs[i]);
+
+		nla_put(msg, i + 1,
+			*offs + params->mbssid_elem_len - offs[i],
+			offs[i]);
+
+		nla_nest_end(msg, elems);
+	}
+	return 0;
+}
+
+
 static int wpa_driver_nl80211_set_ap(void *priv,
 				     struct wpa_driver_ap_params *params)
 {
@@ -4829,6 +4878,9 @@  static int wpa_driver_nl80211_set_ap(void *priv,
 	if (params->unsol_bcast_probe_resp_interval &&
 	    nl80211_unsol_bcast_probe_resp(bss, msg, params) < 0)
 		goto fail;
+
+	if (nl80211_mbssid(msg, params) < 0)
+		goto fail;
 #endif /* CONFIG_IEEE80211AX */
 
 #ifdef CONFIG_SAE