[PATCH v2 27/44] AP: Provide the link ID for an MLD setting when setting VLAN
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Mon May 22 12:33:55 PDT 2023
From: Ilan Peer <ilan.peer at intel.com>
This required modification to the driver interface and driver nl80211.
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
src/ap/ap_drv_ops.h | 5 +++--
src/ap/sta_info.c | 9 ++++++++-
src/drivers/driver.h | 3 ++-
src/drivers/driver_nl80211.c | 13 ++++++++-----
4 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h
index a2c67e0446..04f0dfa031 100644
--- a/src/ap/ap_drv_ops.h
+++ b/src/ap/ap_drv_ops.h
@@ -174,12 +174,13 @@ static inline int hostapd_drv_set_countermeasures(struct hostapd_data *hapd,
static inline int hostapd_drv_set_sta_vlan(const char *ifname,
struct hostapd_data *hapd,
- const u8 *addr, int vlan_id)
+ const u8 *addr, int vlan_id,
+ s8 link_id)
{
if (hapd->driver == NULL || hapd->driver->set_sta_vlan == NULL)
return 0;
return hapd->driver->set_sta_vlan(hapd->drv_priv, addr, ifname,
- vlan_id);
+ vlan_id, link_id);
}
static inline int hostapd_drv_get_inact_sec(struct hostapd_data *hapd,
diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index 61116cff96..5a9033fa9c 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -1083,6 +1083,12 @@ int ap_sta_bind_vlan(struct hostapd_data *hapd, struct sta_info *sta)
struct hostapd_vlan *vlan = NULL;
int ret;
int old_vlanid = sta->vlan_id_bound;
+ s8 mld_link_id = -1;
+
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap)
+ mld_link_id = hapd->mld_link_id;
+#endif /* CONFIG_IEEE80211BE */
if ((sta->flags & WLAN_STA_WDS) && sta->vlan_id == 0) {
wpa_printf(MSG_DEBUG,
@@ -1140,7 +1146,8 @@ skip_counting:
if (wpa_auth_sta_set_vlan(sta->wpa_sm, sta->vlan_id) < 0)
wpa_printf(MSG_INFO, "Failed to update VLAN-ID for WPA");
- ret = hostapd_drv_set_sta_vlan(iface, hapd, sta->addr, sta->vlan_id);
+ ret = hostapd_drv_set_sta_vlan(iface, hapd, sta->addr, sta->vlan_id,
+ mld_link_id);
if (ret < 0) {
hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
HOSTAPD_LEVEL_DEBUG, "could not bind the STA "
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 785ffd8e80..41b39e7fc8 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -3772,6 +3772,7 @@ struct wpa_driver_ops {
* @ifname: Interface (main or virtual BSS or VLAN)
* @addr: MAC address of the associated station
* @vlan_id: VLAN ID
+ * @link_id: The link ID or -1 for non-MLO
* Returns: 0 on success, -1 on failure
*
* This function is used to bind a station to a specific virtual
@@ -3781,7 +3782,7 @@ struct wpa_driver_ops {
* domains to be used with a single BSS.
*/
int (*set_sta_vlan)(void *priv, const u8 *addr, const char *ifname,
- int vlan_id);
+ int vlan_id, s8 link_id);
/**
* commit - Optional commit changes handler (AP only)
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index b6b57de00f..1b4abe6158 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -8018,7 +8018,7 @@ fail:
static int i802_set_sta_vlan(struct i802_bss *bss, const u8 *addr,
- const char *ifname, int vlan_id)
+ const char *ifname, int vlan_id, s8 link_id)
{
struct wpa_driver_nl80211_data *drv = bss->drv;
struct nl_msg *msg;
@@ -8032,6 +8032,8 @@ static int i802_set_sta_vlan(struct i802_bss *bss, const u8 *addr,
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
(vlan_id && (drv->capa.flags & WPA_DRIVER_FLAGS_VLAN_OFFLOAD) &&
nla_put_u16(msg, NL80211_ATTR_VLAN_ID, vlan_id)) ||
+ (link_id >= 0 && nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID,
+ link_id)) ||
nla_put_u32(msg, NL80211_ATTR_STA_VLAN, if_nametoindex(ifname))) {
nlmsg_free(msg);
return -ENOBUFS;
@@ -8290,7 +8292,7 @@ static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
wpa_printf(MSG_ERROR, "nl80211: Failed to set WDS STA "
"interface %s up", name);
}
- return i802_set_sta_vlan(priv, addr, name, 0);
+ return i802_set_sta_vlan(priv, addr, name, 0, -1);
} else {
if (bridge_ifname &&
linux_br_del_if(drv->global->ioctl_sock, bridge_ifname,
@@ -8299,7 +8301,7 @@ static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
"nl80211: Failed to remove interface %s from bridge %s: %s",
name, bridge_ifname, strerror(errno));
- i802_set_sta_vlan(priv, addr, bss->ifname, 0);
+ i802_set_sta_vlan(priv, addr, bss->ifname, 0, -1);
nl80211_remove_iface(drv, if_nametoindex(name));
os_memset(&event, 0, sizeof(event));
event.wds_sta_interface.sta_addr = addr;
@@ -10470,10 +10472,11 @@ static int driver_nl80211_sta_remove(void *priv, const u8 *addr)
static int driver_nl80211_set_sta_vlan(void *priv, const u8 *addr,
- const char *ifname, int vlan_id)
+ const char *ifname, int vlan_id,
+ s8 link_id)
{
struct i802_bss *bss = priv;
- return i802_set_sta_vlan(bss, addr, ifname, vlan_id);
+ return i802_set_sta_vlan(bss, addr, ifname, vlan_id, link_id);
}
--
2.38.1
More information about the Hostap
mailing list