wlan-ap-Telecominfraproject/feeds/qca/hostapd/patches/r11-hostapd-Add-support-to-indicate-presence-of-an-MLD-f.patch
John Crispin 008ca9618d
Some checks failed
Build OpenWrt/uCentral images / build (cig_wf186h) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf186w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf188n) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf189) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf196) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cybertan_eww631-a1) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cybertan_eww631-b1) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap101) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap102) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap104) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap105) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap111) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap112) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101-6e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101e-6e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_3) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xe) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xi) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xi_w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (indio_um-305ax) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sercomm_ap72tip) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630c-311g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630w-211g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630w-311g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (udaya_a6-id2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (udaya_a6-od2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr5018) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr6018) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr6018-v4) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_ax820) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_ax840) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap640) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap650) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap655) (push) Has been cancelled
Build OpenWrt/uCentral images / trigger-testing (push) Has been cancelled
Build OpenWrt/uCentral images / create-x64_vm-ami (push) Has been cancelled
ipq95xx: import ath12.4-cs kernel and drivers
Signed-off-by: John Crispin <john@phrozen.org>
2024-10-20 09:25:13 +02:00

246 lines
7.8 KiB
Diff
Executable File

From 19ef6da36d31b848cefb453e222b96916e01f240 Mon Sep 17 00:00:00 2001
From: Ramanathan Choodamani <quic_rchoodam@quicinc.com>
Date: Thu, 4 Jan 2024 21:18:34 -0800
Subject: [PATCH] hostapd: Add support to indicate presence of an MLD for
creating bonded netdev
Add support to notify the driver using vendor subcmd about the
presence of a multi link MLD for creating a bonded netdevice
before the first link is added.
The driver uses this information to differentiate between an SLD
and an MLD
Signed-off by: Balamurugan Mahalingam <quic_bmahalin@quicinc.com>
Signed-off-by: Ramanathan Choodamani <quic_rchoodam@quicinc.com>
---
hostapd/main.c | 3 +++
src/ap/ap_drv_ops.c | 10 ++++++++
src/ap/ap_drv_ops.h | 1 +
src/ap/drv_callbacks.c | 7 ++++++
src/ap/hostapd.c | 6 ++++-
src/ap/hostapd.h | 1 +
src/common/qca-vendor.h | 11 +++++++++
src/drivers/driver.h | 5 ++++
src/drivers/driver_nl80211.c | 45 ++++++++++++++++++++++++++++++++++++
9 files changed, 88 insertions(+), 1 deletion(-)
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -169,6 +169,7 @@ static int hostapd_driver_init(struct ho
u8 *b = conf->bssid;
struct wpa_driver_capa capa;
struct hostapd_data *h_hapd = NULL;
+ struct wpabuf *buf;
if (hapd->driver == NULL || hapd->driver->hapd_init == NULL) {
wpa_printf(MSG_ERROR, "No hostapd driver wrapper available");
@@ -342,6 +343,8 @@ setup_mld:
hapd->mld_link_id, MAC2STR(hapd->mld->mld_addr),
MAC2STR(hapd->own_addr));
+ if (hapd->mld && hapd->mld->is_ml_netdev)
+ hostapd_drv_mark_mlnetdev(hapd);
hostapd_drv_link_add(hapd, hapd->mld_link_id,
hapd->own_addr);
}
--- a/src/ap/ap_drv_ops.c
+++ b/src/ap/ap_drv_ops.c
@@ -24,6 +24,7 @@
#include "ap_drv_ops.h"
#ifdef CONFIG_IEEE80211BE
#include "scs.h"
+#include "common/qca-vendor.h"
#endif
u32 hostapd_sta_flags_to_drv(u32 flags)
@@ -421,6 +422,15 @@ int hostapd_set_scs_params(struct hostap
os_memcpy(scs_drv.peer_mac, scs_m->peer_mac, 6);
return hapd->driver->set_scs(hapd->drv_priv, &scs_drv);
}
+
+int hostapd_drv_mark_mlnetdev(struct hostapd_data *hapd)
+{
+ if (hapd->driver == NULL || hapd->driver->mark_mlnetdev == NULL)
+ return -1;
+ return hapd->driver->mark_mlnetdev(hapd->drv_priv,
+ OUI_QCA, QCA_NL80211_VENDOR_SUBCMD_SET_WIFI_CONFIGURATION, NULL,
+ 0, 0, NULL);
+}
#endif
int hostapd_sta_auth(struct hostapd_data *hapd, const u8 *addr,
--- a/src/ap/ap_drv_ops.h
+++ b/src/ap/ap_drv_ops.h
@@ -155,6 +155,7 @@ int hostapd_drv_set_secure_ranging_ctx(s
#ifdef CONFIG_IEEE80211BE
int hostapd_set_scs_params(struct hostapd_data *hapd, struct sta_info *sta,
struct hostapd_qos_mandatory_scs_param *scs_m, u8 req_type);
+int hostapd_drv_mark_mlnetdev(struct hostapd_data *hapd);
#endif
#include "drivers/driver.h"
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -2183,10 +2183,14 @@ static void hostapd_mld_if_disable(struc
static void hostapd_mld_if_enable(struct hostapd_data *hapd)
{
struct hostapd_data *first_link, *link_bss;
+ struct wpabuf *buf;
+ buf = wpabuf_alloc(1024);
first_link = hostapd_mld_is_first_bss(hapd) ? hapd :
hostapd_mld_get_first_bss(hapd);
+ if (hapd->mld && hapd->mld->is_ml_netdev)
+ hostapd_drv_mark_mlnetdev(hapd);
/* Links are removed at this stage. Re-add all links and enable them.
* But enable first link BSS first.
*/
@@ -2203,6 +2207,7 @@ static void hostapd_mld_if_enable(struct
for_each_partner_bss(link_bss, first_link) {
if (link_bss == first_link)
continue;
+ hostapd_drv_mark_mlnetdev(hapd);
if (hostapd_drv_link_add(link_bss, link_bss->mld_link_id,
link_bss->own_addr)) {
@@ -2213,6 +2218,8 @@ static void hostapd_mld_if_enable(struct
hostpad_if_enable(link_bss);
}
+
+ wpabuf_free(buf);
}
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -1396,6 +1396,7 @@ static int hostapd_setup_bss(struct host
u8 if_addr[ETH_ALEN];
int flush_old_stations = 1;
struct hostapd_data *h_hapd = NULL;
+ struct wpabuf *buf;
#ifdef CONFIG_IEEE80211BE
if (!hostapd_mld_is_first_bss(hapd))
@@ -1706,7 +1707,8 @@ setup_mld:
", own_addr=" MACSTR,
hapd->mld_link_id, MAC2STR(hapd->mld->mld_addr),
MAC2STR(hapd->own_addr));
-
+ if (hapd->mld && hapd->mld->is_ml_netdev)
+ hostapd_drv_mark_mlnetdev(hapd);
hostapd_drv_link_add(hapd, hapd->mld_link_id,
hapd->own_addr);
}
@@ -3060,6 +3062,8 @@ static void hostapd_bss_alloc_link_id(st
hapd->mld_link_id = hapd->mld->next_link_id++;
wpa_printf(MSG_DEBUG, "MLD: %s: Link ID %d assigned.",
hapd->mld->name, hapd->mld_link_id);
+ if (hapd->mld_link_id > 0)
+ hapd->mld->is_ml_netdev = true;
}
static void hostapd_bss_setup_multi_link(struct hostapd_data *hapd,
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -578,6 +578,7 @@ struct hostapd_mld {
* not be freed when it is 0.
*/
u8 refcount;
+ bool is_ml_netdev;
struct hostapd_data *fbss;
struct dl_list links; /* List HEAD of all affiliated links */
--- a/src/common/qca-vendor.h
+++ b/src/common/qca-vendor.h
@@ -1236,6 +1236,7 @@ enum qca_nl80211_vendor_subcmds {
QCA_NL80211_VENDOR_SUBCMD_LINK_RECONFIG = 230,
QCA_NL80211_VENDOR_SUBCMD_TDLS_DISC_RSP_EXT = 231,
/* 232 - reserved for QCA */
+ QCA_NL80211_VENDOR_SUBCMD_DS_ML_DEV = 238,
};
/* Compatibility defines for previously used subcmd names.
@@ -16007,5 +16008,4 @@ enum qca_wlan_vendor_attr_tdls_state {
QCA_WLAN_VENDOR_ATTR_TDLS_STATE_MAX =
QCA_WLAN_VENDOR_ATTR_TDLS_STATE_AFTER_LAST - 1,
};
-
#endif /* QCA_VENDOR_H */
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -5322,6 +5322,11 @@ struct wpa_driver_ops {
u8 *num_multi_hws);
#ifdef CONFIG_IEEE80211BE
int (*set_scs)(void *priv, struct scs_latency_params *scs_drv);
+
+ int (*mark_mlnetdev)(void *priv, unsigned int vendor_id,
+ unsigned int subcmd, const u8 *data, size_t data_len,
+ enum nested_attr nested_attr_flag,
+ struct wpabuf *buf);
#endif
};
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -11692,6 +11692,42 @@ static bool is_cmd_with_nested_attrs(uns
}
}
+static int nl80211_vendor_cmd_ds(void *priv, unsigned int vendor_id,
+ unsigned int subcmd, const u8 *data,
+ size_t data_len, enum nested_attr nested_attr,
+ struct wpabuf *buf)
+{
+ struct i802_bss *bss = priv;
+ struct wpa_driver_nl80211_data *drv = bss->drv;
+ struct nl_msg *msg;
+ struct nlattr *attr;
+ int ret;
+ struct wpabuf *replybuf;
+
+ wpa_printf(MSG_ERROR," vendor commands ds");
+ if (!(msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_VENDOR)) ||
+ nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, vendor_id) ||
+ nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, subcmd))
+ goto fail;
+
+ attr = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
+ nla_put_u8(msg, QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE, 1);
+ nla_nest_end(msg, attr);
+
+ replybuf = wpabuf_alloc(1024);
+ ret = send_and_recv_msgs(drv, msg, vendor_reply_handler, replybuf,
+ NULL, NULL);
+ if (ret)
+ wpa_printf(MSG_DEBUG, "nl80211: vendor command failed err=%d",
+ ret);
+ wpa_printf(MSG_ERROR," vendor commands ds sent successfully");
+ wpabuf_free(replybuf);
+ return ret;
+fail:
+ nlmsg_free(msg);
+ return -ENOBUFS;
+}
+
static int nl80211_vendor_cmd(void *priv, unsigned int vendor_id,
unsigned int subcmd, const u8 *data,
@@ -11700,6 +11736,7 @@ static int nl80211_vendor_cmd(void *priv
{
struct i802_bss *bss = priv;
struct wpa_driver_nl80211_data *drv = bss->drv;
+ char data1[2000];
struct nl_msg *msg;
int ret, nla_flag;
@@ -14488,6 +14525,7 @@ const struct wpa_driver_ops wpa_driver_n
.get_drv_shared_status = wpa_driver_get_shared_status,
.can_share_drv = wpa_driver_nl80211_can_share_drv,
.set_scs = nl80211_set_scs,
+ .mark_mlnetdev = nl80211_vendor_cmd_ds,
#endif /* CONFIG_IEEE80211BE */
.get_multi_hw_info = wpa_driver_get_multi_hw_info,
};