From: Felix Fietkau Date: Wed, 1 Oct 2025 04:06:15 +0000 (+0200) Subject: wpa_supplicant: include multi-ap status in interface state X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f6fd18eb60447c163083eea89842b05f50877083;p=thirdparty%2Fopenwrt.git wpa_supplicant: include multi-ap status in interface state This can be used to read the Multi-AP profile and default VLAN ID Signed-off-by: Felix Fietkau --- diff --git a/package/network/services/hostapd/patches/601-ucode_support.patch b/package/network/services/hostapd/patches/601-ucode_support.patch index 436acf92208..dedea272a94 100644 --- a/package/network/services/hostapd/patches/601-ucode_support.patch +++ b/package/network/services/hostapd/patches/601-ucode_support.patch @@ -723,6 +723,33 @@ as adding/removing interfaces. for (ssid = group; ssid; ssid = only_first_ssid ? NULL : ssid->pnext) { if (wpa_scan_res_ok(wpa_s, ssid, match_ssid, match_ssid_len, bss, bssid_ignore_count, debug_print, link)) +@@ -3117,8 +3124,8 @@ fail: + static void multi_ap_process_assoc_resp(struct wpa_supplicant *wpa_s, + const u8 *ies, size_t ies_len) + { ++ struct multi_ap_params *multi_ap = &wpa_s->multi_ap; + struct ieee802_11_elems elems; +- struct multi_ap_params multi_ap; + u16 status; + + wpa_s->multi_ap_ie = 0; +@@ -3129,13 +3136,13 @@ static void multi_ap_process_assoc_resp( + return; + + status = check_multi_ap_ie(elems.multi_ap + 4, elems.multi_ap_len - 4, +- &multi_ap); ++ multi_ap); + if (status != WLAN_STATUS_SUCCESS) + return; + +- wpa_s->multi_ap_backhaul = !!(multi_ap.capability & ++ wpa_s->multi_ap_backhaul = !!(multi_ap->capability & + MULTI_AP_BACKHAUL_BSS); +- wpa_s->multi_ap_fronthaul = !!(multi_ap.capability & ++ wpa_s->multi_ap_fronthaul = !!(multi_ap->capability & + MULTI_AP_FRONTHAUL_BSS); + wpa_s->multi_ap_ie = 1; + } @@ -6293,6 +6300,7 @@ void supplicant_event(void *ctx, enum wp event_to_string(event), event); #endif /* CONFIG_NO_STDOUT_DEBUG */ @@ -789,7 +816,15 @@ as adding/removing interfaces. eap_server_unregister_methods(); --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h -@@ -22,6 +22,7 @@ +@@ -15,6 +15,7 @@ + #include "common/sae.h" + #include "common/wpa_ctrl.h" + #include "common/dpp.h" ++#include "common/ieee802_11_common.h" + #include "crypto/sha384.h" + #include "eapol_supp/eapol_supp_sm.h" + #include "wps/wps_defs.h" +@@ -22,6 +23,7 @@ #include "wmm_ac.h" #include "pasn/pasn_common.h" #include "ubus.h" @@ -797,7 +832,7 @@ as adding/removing interfaces. extern const char *const wpa_supplicant_version; extern const char *const wpa_supplicant_license; -@@ -701,6 +702,7 @@ struct wpa_supplicant { +@@ -701,6 +703,7 @@ struct wpa_supplicant { unsigned char perm_addr[ETH_ALEN]; char ifname[100]; struct wpas_ubus_bss ubus; @@ -805,6 +840,15 @@ as adding/removing interfaces. #ifdef CONFIG_MATCH_IFACE int matched; #endif /* CONFIG_MATCH_IFACE */ +@@ -1568,6 +1571,8 @@ struct wpa_supplicant { + unsigned int enabled_4addr_mode:1; + unsigned int multi_bss_support:1; + unsigned int drv_authorized_port:1; ++ ++ struct multi_ap_params multi_ap; + unsigned int multi_ap_ie:1; + unsigned int multi_ap_backhaul:1; + unsigned int multi_ap_fronthaul:1; --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -659,12 +659,17 @@ const char * sae_get_password(struct hos diff --git a/package/network/services/hostapd/src/wpa_supplicant/ucode.c b/package/network/services/hostapd/src/wpa_supplicant/ucode.c index 7f0249a423b..761649498ca 100644 --- a/package/network/services/hostapd/src/wpa_supplicant/ucode.c +++ b/package/network/services/hostapd/src/wpa_supplicant/ucode.c @@ -261,6 +261,23 @@ uc_wpas_iface_status_bss(uc_value_t *ret, struct wpa_bss *bss) ucv_object_add(ret, "frequency", ucv_int64_new(bss->freq)); } +static void +uc_wpas_iface_status_multi_ap(uc_vm_t *vm, uc_value_t *ret, struct wpa_supplicant *wpa_s) +{ + struct multi_ap_params *multi_ap = &wpa_s->multi_ap; + uc_value_t *obj; + + if (!wpa_s->multi_ap_ie) + return; + + obj = ucv_object_new(vm); + ucv_object_add(ret, "multi_ap", obj); + + ucv_object_add(obj, "profile", ucv_int64_new(multi_ap->profile)); + ucv_object_add(obj, "capability", ucv_int64_new(multi_ap->capability)); + ucv_object_add(obj, "vlanid", ucv_int64_new(multi_ap->vlanid)); +} + static uc_value_t * uc_wpas_iface_status(uc_vm_t *vm, size_t nargs) { @@ -301,6 +318,9 @@ uc_wpas_iface_status(uc_vm_t *vm, size_t nargs) ucv_object_add(ret, "links", links); } + if (wpa_s->wpa_state == WPA_COMPLETED) + uc_wpas_iface_status_multi_ap(vm, ret, wpa_s); + #ifdef CONFIG_MESH if (wpa_s->ifmsh) { struct hostapd_iface *ifmsh = wpa_s->ifmsh;