| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015 |
- From: Felix Fietkau <[email protected]>
- Date: Fri, 26 May 2023 10:23:59 +0200
- Subject: [PATCH] Add ucode support, use ucode for the main ubus object
- This implements vastly improved dynamic configuration reload support.
- It can handle configuration changes on individual wifi interfaces, as well
- as adding/removing interfaces.
- --- a/wpa_supplicant/wpa_supplicant.c
- +++ b/wpa_supplicant/wpa_supplicant.c
- @@ -1278,6 +1278,7 @@ void wpa_supplicant_set_state(struct wpa
- sme_sched_obss_scan(wpa_s, 0);
- }
- wpa_s->wpa_state = state;
- + wpas_ucode_update_state(wpa_s);
-
- #ifndef CONFIG_NO_ROBUST_AV
- if (state == WPA_COMPLETED && dl_list_len(&wpa_s->active_scs_ids) &&
- @@ -8289,6 +8290,8 @@ struct wpa_supplicant * wpa_supplicant_a
- }
- #endif /* CONFIG_P2P */
-
- + wpas_ucode_add_bss(wpa_s);
- +
- return wpa_s;
- }
-
- @@ -8315,6 +8318,8 @@ int wpa_supplicant_remove_iface(struct w
- struct wpa_supplicant *parent = wpa_s->parent;
- #endif /* CONFIG_MESH */
-
- + wpas_ucode_free_bss(wpa_s);
- +
- /* Remove interface from the global list of interfaces */
- prev = global->ifaces;
- if (prev == wpa_s) {
- @@ -8623,6 +8628,7 @@ struct wpa_global * wpa_supplicant_init(
-
- eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
- wpas_periodic, global, NULL);
- + wpas_ucode_init(global);
-
- return global;
- }
- @@ -8695,6 +8701,8 @@ void wpa_supplicant_deinit(struct wpa_gl
-
- wpas_notify_supplicant_deinitialized(global);
-
- + wpas_ucode_free();
- +
- eap_peer_unregister_methods();
- #ifdef CONFIG_AP
- eap_server_unregister_methods();
- --- a/wpa_supplicant/wpa_supplicant_i.h
- +++ b/wpa_supplicant/wpa_supplicant_i.h
- @@ -15,12 +15,14 @@
- #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"
- #include "config_ssid.h"
- #include "wmm_ac.h"
- #include "pasn/pasn_common.h"
- +#include "ucode.h"
-
- extern const char *const wpa_supplicant_version;
- extern const char *const wpa_supplicant_license;
- @@ -697,6 +699,7 @@ struct wpa_supplicant {
- unsigned char own_addr[ETH_ALEN];
- unsigned char perm_addr[ETH_ALEN];
- char ifname[100];
- + struct wpas_ucode_bss ucode;
- #ifdef CONFIG_MATCH_IFACE
- int matched;
- #endif /* CONFIG_MATCH_IFACE */
- @@ -1564,6 +1567,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/wpa_supplicant/wps_supplicant.c
- +++ b/wpa_supplicant/wps_supplicant.c
- @@ -33,6 +33,7 @@
- #include "p2p/p2p.h"
- #include "p2p_supplicant.h"
- #include "wps_supplicant.h"
- +#include "ucode.h"
-
-
- #ifndef WPS_PIN_SCAN_IGNORE_SEL_REG
- @@ -401,6 +402,8 @@ static int wpa_supplicant_wps_cred(void
- wpa_hexdump_key(MSG_DEBUG, "WPS: Received Credential attribute",
- cred->cred_attr, cred->cred_attr_len);
-
- + wpas_ucode_wps_complete(wpa_s, cred);
- +
- if (wpa_s->conf->wps_cred_processing == 1)
- return 0;
-
- --- a/hostapd/Makefile
- +++ b/hostapd/Makefile
- @@ -169,9 +169,21 @@ OBJS += ../src/eapol_auth/eapol_auth_sm.
-
- ifdef CONFIG_UBUS
- CFLAGS += -DUBUS_SUPPORT
- -OBJS += ../src/utils/uloop.o
- OBJS += ../src/ap/ubus.o
- -LIBS += -lubox -lubus
- +LIBS += -lubus
- +NEED_ULOOP:=y
- +endif
- +
- +ifdef CONFIG_UCODE
- +CFLAGS += -DUCODE_SUPPORT
- +OBJS += ../src/utils/ucode.o
- +OBJS += ../src/ap/ucode.o
- +NEED_ULOOP:=y
- +endif
- +
- +ifdef NEED_ULOOP
- +OBJS += ../src/utils/uloop.o
- +LIBS += -lubox
- endif
-
- ifdef CONFIG_CODE_COVERAGE
- --- a/hostapd/ctrl_iface.c
- +++ b/hostapd/ctrl_iface.c
- @@ -6061,6 +6061,7 @@ try_again:
- return -1;
- }
-
- + interface->ctrl_iface_recv = hostapd_ctrl_iface_receive_process;
- wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb);
-
- return 0;
- @@ -6162,6 +6163,7 @@ fail:
- os_free(fname);
-
- interface->global_ctrl_sock = s;
- + interface->ctrl_iface_recv = hostapd_ctrl_iface_receive_process;
- eloop_register_read_sock(s, hostapd_global_ctrl_iface_receive,
- interface, NULL);
-
- --- a/hostapd/main.c
- +++ b/hostapd/main.c
- @@ -1074,6 +1074,7 @@ int main(int argc, char *argv[])
- }
-
- hostapd_global_ctrl_iface_init(&interfaces);
- + hostapd_ucode_init(&interfaces);
-
- if (hostapd_global_run(&interfaces, daemonize, pid_file)) {
- wpa_printf(MSG_ERROR, "Failed to start eloop");
- @@ -1083,6 +1084,7 @@ int main(int argc, char *argv[])
- ret = 0;
-
- out:
- + hostapd_ucode_free();
- hostapd_global_ctrl_iface_deinit(&interfaces);
- /* Deinitialize all interfaces */
- for (i = 0; i < interfaces.count; i++) {
- --- a/src/ap/ap_drv_ops.h
- +++ b/src/ap/ap_drv_ops.h
- @@ -410,6 +410,23 @@ static inline int hostapd_drv_stop_ap(st
- return hapd->driver->stop_ap(hapd->drv_priv, link_id);
- }
-
- +static inline int hostapd_drv_if_rename(struct hostapd_data *hapd,
- + enum wpa_driver_if_type type,
- + const char *ifname,
- + const char *new_name)
- +{
- + if (!hapd->driver || !hapd->driver->if_rename || !hapd->drv_priv)
- + return -1;
- + return hapd->driver->if_rename(hapd->drv_priv, type, ifname, new_name);
- +}
- +
- +static inline int hostapd_drv_set_first_bss(struct hostapd_data *hapd)
- +{
- + if (!hapd->driver || !hapd->driver->set_first_bss || !hapd->drv_priv)
- + return 0;
- + return hapd->driver->set_first_bss(hapd->drv_priv);
- +}
- +
- static inline int hostapd_drv_channel_info(struct hostapd_data *hapd,
- struct wpa_channel_info *ci)
- {
- --- a/src/ap/hostapd.c
- +++ b/src/ap/hostapd.c
- @@ -259,6 +259,8 @@ int hostapd_reload_config(struct hostapd
- struct hostapd_config *newconf, *oldconf;
- size_t j;
-
- + hostapd_ucode_reload_bss(hapd);
- +
- if (iface->config_fname == NULL) {
- /* Only in-memory config in use - assume it has been updated */
- hostapd_clear_old(iface);
- @@ -479,6 +481,7 @@ void hostapd_free_hapd_data(struct hosta
- hapd->beacon_set_done = 0;
-
- wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface);
- + hostapd_ucode_free_bss(hapd);
- hostapd_ubus_free_bss(hapd);
- accounting_deinit(hapd);
- hostapd_deinit_wpa(hapd);
- @@ -625,7 +628,7 @@ void hostapd_free_hapd_data(struct hosta
- * If the BSS being removed is the first link, the next link becomes the first
- * link.
- */
- -static void hostapd_bss_link_deinit(struct hostapd_data *hapd)
- +void hostapd_bss_link_deinit(struct hostapd_data *hapd)
- {
- #ifdef CONFIG_IEEE80211BE
- int i;
- @@ -737,6 +740,7 @@ void hostapd_cleanup_iface_partial(struc
- static void hostapd_cleanup_iface(struct hostapd_iface *iface)
- {
- wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface);
- + hostapd_ucode_free_iface(iface);
- eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface,
- NULL);
-
- @@ -1326,6 +1330,7 @@ static int hostapd_start_beacon(struct h
- hapd->driver->set_operstate(hapd->drv_priv, 1);
-
- hostapd_ubus_add_bss(hapd);
- + hostapd_ucode_add_bss(hapd);
-
- return 0;
- }
- @@ -1401,8 +1406,7 @@ static int hostapd_bss_radius_init(struc
- * initialized. Most of the modules that are initialized here will be
- * deinitialized in hostapd_cleanup().
- */
- -static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
- - bool start_beacon)
- +int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon)
- {
- struct hostapd_bss_config *conf = hapd->conf;
- u8 ssid[SSID_MAX_LEN + 1];
- @@ -1434,12 +1438,17 @@ static int hostapd_setup_bss(struct host
-
- if (!first || first == -1) {
- u8 *addr = hapd->own_addr;
- + bool use_existing = first == -1;
-
- +#ifdef CONFIG_IEEE80211BE
- + if (hapd->conf->mld_ap)
- + addr = NULL;
- +#endif /* CONFIG_IEEE80211BE */
- if (!is_zero_ether_addr(conf->bssid)) {
- /* Allocate the configured BSSID. */
- os_memcpy(hapd->own_addr, conf->bssid, ETH_ALEN);
-
- - if (hostapd_mac_comp(hapd->own_addr,
- + if (0 && hostapd_mac_comp(hapd->own_addr,
- hapd->iface->bss[0]->own_addr) ==
- 0) {
- wpa_printf(MSG_ERROR, "BSS '%s' may not have "
- @@ -1469,6 +1478,7 @@ static int hostapd_setup_bss(struct host
- hapd->mld_link_id, hapd->conf->iface);
- goto setup_mld;
- }
- + use_existing = true;
- }
- #endif /* CONFIG_IEEE80211BE */
-
- @@ -1477,7 +1487,7 @@ static int hostapd_setup_bss(struct host
- conf->iface, addr, hapd,
- &hapd->drv_priv, force_ifname, if_addr,
- conf->bridge[0] ? conf->bridge : NULL,
- - first == -1)) {
- + use_existing)) {
- wpa_printf(MSG_ERROR, "Failed to add BSS (BSSID="
- MACSTR ")", MAC2STR(hapd->own_addr));
- hapd->interface_added = 0;
- @@ -1500,7 +1510,7 @@ static int hostapd_setup_bss(struct host
-
- #ifdef CONFIG_IEEE80211BE
- setup_mld:
- - if (hapd->conf->mld_ap && !first) {
- + if (hapd->conf->mld_ap && first != 1) {
- wpa_printf(MSG_DEBUG,
- "MLD: Set link_id=%u, mld_addr=" MACSTR
- ", own_addr=" MACSTR,
- @@ -1518,6 +1528,8 @@ setup_mld:
- }
- #endif /* CONFIG_IEEE80211BE */
-
- + hostapd_ucode_create_bss(hapd);
- +
- if (conf->wmm_enabled < 0)
- conf->wmm_enabled = hapd->iconf->ieee80211n |
- hapd->iconf->ieee80211ax;
- @@ -1843,7 +1855,7 @@ int hostapd_set_acl(struct hostapd_data
- }
-
-
- -static int hostapd_set_ctrl_sock_iface(struct hostapd_data *hapd)
- +int hostapd_set_ctrl_sock_iface(struct hostapd_data *hapd)
- {
- #ifdef CONFIG_IEEE80211BE
- int ret;
- @@ -2516,7 +2528,7 @@ static int hostapd_owe_iface_iter2(struc
- #endif /* CONFIG_OWE */
-
-
- -static void hostapd_owe_update_trans(struct hostapd_iface *iface)
- +void hostapd_owe_update_trans(struct hostapd_iface *iface)
- {
- #ifdef CONFIG_OWE
- /* Check whether the enabled BSS can complete OWE transition mode
- @@ -2986,7 +2998,7 @@ hostapd_alloc_bss_data(struct hostapd_if
- }
-
-
- -static void hostapd_bss_deinit(struct hostapd_data *hapd)
- +void hostapd_bss_deinit(struct hostapd_data *hapd)
- {
- if (!hapd)
- return;
- @@ -3194,7 +3206,7 @@ fail:
- }
-
-
- -static void hostapd_cleanup_unused_mlds(struct hapd_interfaces *interfaces)
- +void hostapd_cleanup_unused_mlds(struct hapd_interfaces *interfaces)
- {
- #ifdef CONFIG_IEEE80211BE
- struct hostapd_mld *mld, **all_mld;
- @@ -4074,7 +4086,8 @@ int hostapd_remove_iface(struct hapd_int
- hapd_iface = interfaces->iface[i];
- if (hapd_iface == NULL)
- return -1;
- - if (!os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) {
- + if (!os_strcmp(hapd_iface->phy, buf) ||
- + !os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) {
- wpa_printf(MSG_INFO, "Remove interface '%s'", buf);
- hapd_iface->driver_ap_teardown =
- !!(hapd_iface->drv_flags &
- --- a/src/ap/hostapd.h
- +++ b/src/ap/hostapd.h
- @@ -19,6 +19,7 @@
- #include "ap_config.h"
- #include "drivers/driver.h"
- #include "ubus.h"
- +#include "ucode.h"
-
- #define OCE_STA_CFON_ENABLED(hapd) \
- ((hapd->conf->oce & OCE_STA_CFON) && \
- @@ -52,6 +53,10 @@ struct hapd_interfaces {
- struct hostapd_config * (*config_read_cb)(const char *config_fname);
- int (*ctrl_iface_init)(struct hostapd_data *hapd);
- void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
- + int (*ctrl_iface_recv)(struct hostapd_data *hapd,
- + char *buf, char *reply, int reply_size,
- + struct sockaddr_storage *from,
- + socklen_t fromlen);
- int (*for_each_interface)(struct hapd_interfaces *interfaces,
- int (*cb)(struct hostapd_iface *iface,
- void *ctx), void *ctx);
- @@ -208,6 +213,7 @@ struct hostapd_data {
- struct hostapd_config *iconf;
- struct hostapd_bss_config *conf;
- struct hostapd_ubus_bss ubus;
- + struct hostapd_ucode_bss ucode;
- int interface_added; /* virtual interface added for this BSS */
- unsigned int started:1;
- unsigned int disabled:1;
- @@ -577,6 +583,7 @@ struct hostapd_mld {
- */
- struct hostapd_iface {
- struct hapd_interfaces *interfaces;
- + struct hostapd_ucode_iface ucode;
- void *owner;
- char *config_fname;
- struct hostapd_config *conf;
- @@ -787,11 +794,16 @@ struct hostapd_iface * hostapd_init(stru
- struct hostapd_iface *
- hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy,
- const char *config_fname, int debug);
- +int hostapd_set_ctrl_sock_iface(struct hostapd_data *hapd);
- +int hostapd_setup_bss(struct hostapd_data *hapd, int first, bool start_beacon);
- +void hostapd_bss_link_deinit(struct hostapd_data *hapd);
- +void hostapd_bss_deinit(struct hostapd_data *hapd);
- void hostapd_bss_setup_multi_link(struct hostapd_data *hapd,
- struct hapd_interfaces *interfaces);
- void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
- int reassoc);
- void hostapd_interface_deinit_free(struct hostapd_iface *iface);
- +void hostapd_cleanup_unused_mlds(struct hapd_interfaces *interfaces);
- int hostapd_enable_iface(struct hostapd_iface *hapd_iface);
- int hostapd_reload_iface(struct hostapd_iface *hapd_iface);
- int hostapd_reload_bss_only(struct hostapd_data *bss);
- @@ -817,6 +829,7 @@ hostapd_switch_channel_fallback(struct h
- void hostapd_cleanup_cs_params(struct hostapd_data *hapd);
- void hostapd_periodic_iface(struct hostapd_iface *iface);
- int hostapd_owe_trans_get_info(struct hostapd_data *hapd);
- +void hostapd_owe_update_trans(struct hostapd_iface *iface);;
- void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx);
-
- void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap);
- --- a/src/ap/ieee802_11.c
- +++ b/src/ap/ieee802_11.c
- @@ -659,12 +659,17 @@ const char * sae_get_password(struct hos
- struct sae_pt **s_pt,
- const struct sae_pk **s_pk)
- {
- + struct hostapd_bss_config *conf = hapd->conf;
- + struct hostapd_ssid *ssid = &conf->ssid;
- const char *password = NULL;
- - struct sae_password_entry *pw;
- + struct sae_password_entry *pw = NULL;
- struct sae_pt *pt = NULL;
- const struct sae_pk *pk = NULL;
- struct hostapd_sta_wpa_psk_short *psk = NULL;
-
- + if (sta && sta->use_sta_psk)
- + goto use_sta_psk;
- +
- /* With sae_track_password functionality enabled, try to first find the
- * next viable wildcard-address password if a password identifier was
- * not used. Select an wildcard-addr entry if the STA is known to have
- @@ -725,12 +730,30 @@ const char * sae_get_password(struct hos
- pt = hapd->conf->ssid.pt;
- }
-
- +use_sta_psk:
- if (!password && sta && !rx_id) {
- for (psk = sta->psk; psk; psk = psk->next) {
- - if (psk->is_passphrase) {
- - password = psk->passphrase;
- + if (!psk->is_passphrase)
- + continue;
- +
- + password = psk->passphrase;
- + if (!sta->use_sta_psk)
- + break;
- +
- +#ifdef CONFIG_SAE
- + if (sta->sae_pt) {
- + pt = sta->sae_pt;
- break;
- }
- +
- + pt = sae_derive_pt(conf->sae_groups, ssid->ssid,
- + ssid->ssid_len,
- + (const u8 *) password,
- + os_strlen(password),
- + NULL);
- + sta->sae_pt = pt;
- + break;
- +#endif
- }
- }
-
- @@ -3489,6 +3512,12 @@ static void handle_auth(struct hostapd_d
- goto fail;
- }
-
- + res = hostapd_ucode_sta_auth(hapd, sta);
- + if (res) {
- + resp = res;
- + goto fail;
- + }
- +
- sta->flags &= ~WLAN_STA_PREAUTH;
- ieee802_1x_notify_pre_auth(sta->eapol_sm, 0);
-
- --- a/src/ap/sta_info.c
- +++ b/src/ap/sta_info.c
- @@ -477,6 +477,11 @@ void ap_free_sta(struct hostapd_data *ha
- forced_memzero(sta->last_tk, WPA_TK_MAX_LEN);
- #endif /* CONFIG_TESTING_OPTIONS */
-
- +#ifdef CONFIG_SAE
- + if (sta->sae_pt)
- + sae_deinit_pt(sta->sae_pt);
- +#endif
- +
- os_free(sta);
- }
-
- @@ -1576,6 +1581,8 @@ void ap_sta_set_authorized_event(struct
- #endif /* CONFIG_P2P */
- const u8 *ip_ptr = NULL;
-
- + if (authorized)
- + hostapd_ucode_sta_connected(hapd, sta);
- #ifdef CONFIG_P2P
- if (hapd->p2p_group == NULL) {
- if (sta->p2p_ie != NULL &&
- --- a/src/ap/sta_info.h
- +++ b/src/ap/sta_info.h
- @@ -180,6 +180,9 @@ struct sta_info {
- int vlan_id_bound; /* updated by ap_sta_bind_vlan() */
- /* PSKs from RADIUS authentication server */
- struct hostapd_sta_wpa_psk_short *psk;
- + struct sae_pt *sae_pt;
- + int use_sta_psk;
- + int psk_idx;
-
- char *identity; /* User-Name from RADIUS */
- char *radius_cui; /* Chargeable-User-Identity from RADIUS */
- --- a/src/ap/wpa_auth_glue.c
- +++ b/src/ap/wpa_auth_glue.c
- @@ -392,6 +392,7 @@ static const u8 * hostapd_wpa_auth_get_p
- struct sta_info *sta = ap_get_sta(hapd, addr);
- const u8 *psk;
-
- + sta->psk_idx = 0;
- if (vlan_id)
- *vlan_id = 0;
- if (psk_len)
- @@ -442,13 +443,18 @@ static const u8 * hostapd_wpa_auth_get_p
- * returned psk which should not be returned again.
- * logic list (all hostapd_get_psk; all sta->psk)
- */
- + if (sta && sta->use_sta_psk)
- + psk = NULL;
- if (sta && sta->psk && !psk) {
- struct hostapd_sta_wpa_psk_short *pos;
- + int psk_idx = 1;
-
- if (vlan_id)
- *vlan_id = 0;
- psk = sta->psk->psk;
- - for (pos = sta->psk; pos; pos = pos->next) {
- + if (vlan_id)
- + sta->psk_idx = psk_idx;
- + for (pos = sta->psk; pos; pos = pos->next, psk_idx++) {
- if (pos->is_passphrase) {
- if (pbkdf2_sha1(pos->passphrase,
- hapd->conf->ssid.ssid,
- @@ -462,9 +468,13 @@ static const u8 * hostapd_wpa_auth_get_p
- }
- if (pos->psk == prev_psk) {
- psk = pos->next ? pos->next->psk : NULL;
- + if (vlan_id)
- + sta->psk_idx = psk_idx + 1;
- break;
- }
- }
- + if (vlan_id && !psk)
- + sta->psk_idx = 0;
- }
- return psk;
- }
- --- a/src/drivers/driver.h
- +++ b/src/drivers/driver.h
- @@ -4072,6 +4072,25 @@ struct wpa_driver_ops {
- const char *ifname);
-
- /**
- + * if_rename - Rename a virtual interface
- + * @priv: Private driver interface data
- + * @type: Interface type
- + * @ifname: Interface name of the virtual interface to be renamed
- + * (NULL when renaming the AP BSS interface)
- + * @new_name: New interface name of the virtual interface
- + * Returns: 0 on success, -1 on failure
- + */
- + int (*if_rename)(void *priv, enum wpa_driver_if_type type,
- + const char *ifname, const char *new_name);
- +
- + /**
- + * set_first_bss - Make a virtual interface the first (primary) bss
- + * @priv: Private driver interface data
- + * Returns: 0 on success, -1 on failure
- + */
- + int (*set_first_bss)(void *priv);
- +
- + /**
- * set_sta_vlan - Bind a station into a specific interface (AP only)
- * @priv: Private driver interface data
- * @ifname: Interface (main or virtual BSS or VLAN)
- @@ -6901,6 +6920,7 @@ union wpa_event_data {
-
- /**
- * struct ch_switch
- + * @count: Count until channel switch activates
- * @freq: Frequency of new channel in MHz
- * @ht_enabled: Whether this is an HT channel
- * @ch_offset: Secondary channel offset
- @@ -6911,6 +6931,7 @@ union wpa_event_data {
- * @punct_bitmap: Puncturing bitmap
- */
- struct ch_switch {
- + int count;
- int freq;
- int ht_enabled;
- int ch_offset;
- --- a/src/drivers/driver_nl80211.c
- +++ b/src/drivers/driver_nl80211.c
- @@ -77,6 +77,16 @@ enum nlmsgerr_attrs {
-
- #endif /* ANDROID */
-
- +static void handle_nl_debug_hook(struct nl_msg *msg, int tx)
- +{
- + const struct nlmsghdr *nlh;
- +
- + if (!wpa_netlink_hook)
- + return;
- +
- + nlh = nlmsg_hdr(msg);
- + wpa_netlink_hook(tx, nlh, nlh->nlmsg_len);
- +}
-
- static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
- {
- @@ -437,6 +447,11 @@ static int no_seq_check(struct nl_msg *m
- return NL_OK;
- }
-
- +static int debug_handler(struct nl_msg *msg, void *arg)
- +{
- + handle_nl_debug_hook(msg, 0);
- + return NL_OK;
- +}
-
- static void nl80211_nlmsg_clear(struct nl_msg *msg)
- {
- @@ -511,6 +526,8 @@ int send_and_recv_glb(struct nl80211_glo
- if (!msg)
- return -ENOMEM;
-
- + handle_nl_debug_hook(msg, 1);
- +
- err.err = -ENOMEM;
-
- s_nl_cb = nl_socket_get_cb(nl_handle);
- @@ -552,6 +569,7 @@ int send_and_recv_glb(struct nl80211_glo
- err.err_info = err_info;
- err.drv = drv;
-
- + nl_cb_set(cb, NL_CB_MSG_IN, NL_CB_CUSTOM, debug_handler, NULL);
- nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
- nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err.err);
- if (ack_handler_custom) {
- @@ -973,6 +991,7 @@ nl80211_get_wiphy_data_ap(struct i802_bs
- os_free(w);
- return NULL;
- }
- + nl_cb_set(w->nl_cb, NL_CB_MSG_IN, NL_CB_CUSTOM, debug_handler, NULL);
- nl_cb_set(w->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
- no_seq_check, NULL);
- nl_cb_set(w->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
- @@ -1401,7 +1420,7 @@ static void wpa_driver_nl80211_event_rtm
- }
- wpa_printf(MSG_DEBUG, "nl80211: Interface down (%s/%s)",
- namebuf, ifname);
- - if (os_strcmp(drv->first_bss->ifname, ifname) != 0) {
- + if (drv->first_bss->ifindex != ifi->ifi_index) {
- wpa_printf(MSG_DEBUG,
- "nl80211: Not the main interface (%s) - do not indicate interface down",
- drv->first_bss->ifname);
- @@ -1437,7 +1456,7 @@ static void wpa_driver_nl80211_event_rtm
- }
- wpa_printf(MSG_DEBUG, "nl80211: Interface up (%s/%s)",
- namebuf, ifname);
- - if (os_strcmp(drv->first_bss->ifname, ifname) != 0) {
- + if (drv->first_bss->ifindex != ifi->ifi_index) {
- wpa_printf(MSG_DEBUG,
- "nl80211: Not the main interface (%s) - do not indicate interface up",
- drv->first_bss->ifname);
- @@ -2130,6 +2149,7 @@ static int wpa_driver_nl80211_init_nl_gl
- genl_family_put(family);
- nl_cache_free(cache);
-
- + nl_cb_set(global->nl_cb, NL_CB_MSG_IN, NL_CB_CUSTOM, debug_handler, NULL);
- nl_cb_set(global->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
- no_seq_check, NULL);
- nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
- @@ -2300,6 +2320,7 @@ static int nl80211_init_bss(struct i802_
- if (!bss->nl_cb)
- return -1;
-
- + nl_cb_set(bss->nl_cb, NL_CB_MSG_IN, NL_CB_CUSTOM, debug_handler, NULL);
- nl_cb_set(bss->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
- no_seq_check, NULL);
- nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
- @@ -8854,6 +8875,7 @@ static void *i802_init(struct hostapd_da
- char master_ifname[IFNAMSIZ];
- int ifindex, br_ifindex = 0;
- int br_added = 0;
- + int err;
-
- bss = wpa_driver_nl80211_drv_init(hapd, params->ifname,
- params->global_priv, 1,
- @@ -8914,21 +8936,17 @@ static void *i802_init(struct hostapd_da
- (params->num_bridge == 0 || !params->bridge[0]))
- add_ifidx(drv, br_ifindex, drv->ifindex);
-
- - if (bss->added_if_into_bridge || bss->already_in_bridge) {
- - int err;
- -
- - drv->rtnl_sk = nl_socket_alloc();
- - if (drv->rtnl_sk == NULL) {
- - wpa_printf(MSG_ERROR, "nl80211: Failed to allocate nl_sock");
- - goto failed;
- - }
- + drv->rtnl_sk = nl_socket_alloc();
- + if (drv->rtnl_sk == NULL) {
- + wpa_printf(MSG_ERROR, "nl80211: Failed to allocate nl_sock");
- + goto failed;
- + }
-
- - err = nl_connect(drv->rtnl_sk, NETLINK_ROUTE);
- - if (err) {
- - wpa_printf(MSG_ERROR, "nl80211: Failed to connect nl_sock to NETLINK_ROUTE: %s",
- - nl_geterror(err));
- - goto failed;
- - }
- + err = nl_connect(drv->rtnl_sk, NETLINK_ROUTE);
- + if (err) {
- + wpa_printf(MSG_ERROR, "nl80211: Failed to connect nl_sock to NETLINK_ROUTE: %s",
- + nl_geterror(err));
- + goto failed;
- }
-
- if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) {
- @@ -9310,6 +9328,50 @@ static int wpa_driver_nl80211_if_remove(
- return 0;
- }
-
- +static int wpa_driver_nl80211_if_rename(struct i802_bss *bss,
- + enum wpa_driver_if_type type,
- + const char *ifname, const char *new_name)
- +{
- + struct wpa_driver_nl80211_data *drv = bss->drv;
- + struct ifinfomsg ifi = {
- + .ifi_family = AF_UNSPEC,
- + .ifi_index = bss->ifindex,
- + };
- + struct nl_msg *msg;
- + int res = -ENOMEM;
- +
- + if (ifname)
- + ifi.ifi_index = if_nametoindex(ifname);
- +
- + msg = nlmsg_alloc_simple(RTM_SETLINK, 0);
- + if (!msg)
- + return res;
- +
- + if (nlmsg_append(msg, &ifi, sizeof(ifi), NLMSG_ALIGNTO) < 0)
- + goto out;
- +
- + if (nla_put_string(msg, IFLA_IFNAME, new_name))
- + goto out;
- +
- + res = nl_send_auto_complete(drv->rtnl_sk, msg);
- + if (res < 0)
- + goto out;
- +
- + res = nl_wait_for_ack(drv->rtnl_sk);
- + if (res) {
- + wpa_printf(MSG_INFO,
- + "nl80211: Renaming device %s to %s failed: %s",
- + ifname ? ifname : bss->ifname, new_name, nl_geterror(res));
- + goto out;
- + }
- +
- + if (type == WPA_IF_AP_BSS && !ifname)
- + os_strlcpy(bss->ifname, new_name, sizeof(bss->ifname));
- +
- +out:
- + nlmsg_free(msg);
- + return res;
- +}
-
- static int cookie_handler(struct nl_msg *msg, void *arg)
- {
- @@ -11195,6 +11257,37 @@ static bool nl80211_is_drv_shared(void *
- #endif /* CONFIG_IEEE80211BE */
-
-
- +static int driver_nl80211_if_rename(void *priv, enum wpa_driver_if_type type,
- + const char *ifname, const char *new_name)
- +{
- + struct i802_bss *bss = priv;
- + return wpa_driver_nl80211_if_rename(bss, type, ifname, new_name);
- +}
- +
- +
- +static int driver_nl80211_set_first_bss(void *priv)
- +{
- + struct i802_bss *bss = priv, *tbss;
- + struct wpa_driver_nl80211_data *drv = bss->drv;
- +
- + if (drv->first_bss == bss)
- + return 0;
- +
- + for (tbss = drv->first_bss; tbss; tbss = tbss->next) {
- + if (tbss->next != bss)
- + continue;
- +
- + tbss->next = bss->next;
- + bss->next = drv->first_bss;
- + drv->first_bss = bss;
- + drv->ctx = bss->ctx;
- + return 0;
- + }
- +
- + return -1;
- +}
- +
- +
- static int driver_nl80211_send_mlme(void *priv, const u8 *data,
- size_t data_len, int noack,
- unsigned int freq,
- @@ -15014,6 +15107,8 @@ const struct wpa_driver_ops wpa_driver_n
- .set_acl = wpa_driver_nl80211_set_acl,
- .if_add = wpa_driver_nl80211_if_add,
- .if_remove = driver_nl80211_if_remove,
- + .if_rename = driver_nl80211_if_rename,
- + .set_first_bss = driver_nl80211_set_first_bss,
- .send_mlme = driver_nl80211_send_mlme,
- .get_hw_feature_data = nl80211_get_hw_feature_data,
- .sta_add = wpa_driver_nl80211_sta_add,
- --- a/src/drivers/driver_nl80211_event.c
- +++ b/src/drivers/driver_nl80211_event.c
- @@ -1254,6 +1254,7 @@ static void mlme_event_ch_switch(struct
- struct nlattr *bw, struct nlattr *cf1,
- struct nlattr *cf2,
- struct nlattr *punct_bitmap,
- + struct nlattr *count,
- int finished)
- {
- struct i802_bss *bss;
- @@ -1319,6 +1320,8 @@ static void mlme_event_ch_switch(struct
- data.ch_switch.cf1 = nla_get_u32(cf1);
- if (cf2)
- data.ch_switch.cf2 = nla_get_u32(cf2);
- + if (count)
- + data.ch_switch.count = nla_get_u32(count);
-
- if (link) {
- data.ch_switch.link_id = nla_get_u8(link);
- @@ -4279,6 +4282,7 @@ static void do_process_drv_event(struct
- tb[NL80211_ATTR_CENTER_FREQ1],
- tb[NL80211_ATTR_CENTER_FREQ2],
- tb[NL80211_ATTR_PUNCT_BITMAP],
- + tb[NL80211_ATTR_CH_SWITCH_COUNT],
- 0);
- break;
- case NL80211_CMD_CH_SWITCH_NOTIFY:
- @@ -4291,6 +4295,7 @@ static void do_process_drv_event(struct
- tb[NL80211_ATTR_CENTER_FREQ1],
- tb[NL80211_ATTR_CENTER_FREQ2],
- tb[NL80211_ATTR_PUNCT_BITMAP],
- + NULL,
- 1);
- break;
- case NL80211_CMD_DISCONNECT:
- --- a/src/utils/wpa_debug.c
- +++ b/src/utils/wpa_debug.c
- @@ -26,6 +26,10 @@ static FILE *wpa_debug_tracing_file = NU
- #define WPAS_TRACE_PFX "wpas <%d>: "
- #endif /* CONFIG_DEBUG_LINUX_TRACING */
-
- +void (*wpa_printf_hook)(int level, const char *fmt, va_list ap);
- +void (*wpa_hexdump_hook)(int level, const char *title, const void *buf,
- + size_t len);
- +void (*wpa_netlink_hook)(int tx, const void *data, size_t len);
-
- int wpa_debug_level = MSG_INFO;
- int wpa_debug_show_keys = 0;
- @@ -210,6 +214,12 @@ void _wpa_printf(int level, const char *
- {
- va_list ap;
-
- + if (wpa_printf_hook) {
- + va_start(ap, fmt);
- + wpa_printf_hook(level, fmt, ap);
- + va_end(ap);
- + }
- +
- if (level >= wpa_debug_level) {
- #ifdef CONFIG_ANDROID_LOG
- va_start(ap, fmt);
- @@ -260,6 +270,9 @@ void _wpa_hexdump(int level, const char
- {
- size_t i;
-
- + if (wpa_hexdump_hook)
- + wpa_hexdump_hook(level, title, buf, len);
- +
- #ifdef CONFIG_DEBUG_LINUX_TRACING
- if (wpa_debug_tracing_file != NULL) {
- fprintf(wpa_debug_tracing_file,
- --- a/src/utils/wpa_debug.h
- +++ b/src/utils/wpa_debug.h
- @@ -11,6 +11,10 @@
-
- #include "wpabuf.h"
-
- +extern void (*wpa_printf_hook)(int level, const char *fmt, va_list ap);
- +extern void (*wpa_hexdump_hook)(int level, const char *title,
- + const void *buf, size_t len);
- +extern void (*wpa_netlink_hook)(int tx, const void *data, size_t len);
- extern int wpa_debug_level;
- extern int wpa_debug_show_keys;
- extern int wpa_debug_timestamp;
- --- a/wpa_supplicant/Makefile
- +++ b/wpa_supplicant/Makefile
- @@ -191,6 +191,14 @@ ifdef CONFIG_EAPOL_TEST
- CFLAGS += -Werror -DEAPOL_TEST
- endif
-
- +ifdef CONFIG_UCODE
- +CFLAGS += -DUCODE_SUPPORT
- +OBJS += ../src/utils/ucode.o
- +OBJS += ../src/utils/uloop.o
- +OBJS += ucode.o
- +LIBS += -lubox
- +endif
- +
- ifdef CONFIG_CODE_COVERAGE
- CFLAGS += -O0 -fprofile-arcs -ftest-coverage -U_FORTIFY_SOURCE
- LIBS += -lgcov
- @@ -1046,6 +1054,9 @@ ifdef CONFIG_CTRL_IFACE_MIB
- CFLAGS += -DCONFIG_CTRL_IFACE_MIB
- endif
- OBJS += ../src/ap/ctrl_iface_ap.o
- +ifdef CONFIG_UCODE
- +OBJS += ../src/ap/ucode.o
- +endif
- endif
-
- CFLAGS += -DEAP_SERVER -DEAP_SERVER_IDENTITY
- --- a/wpa_supplicant/events.c
- +++ b/wpa_supplicant/events.c
- @@ -53,6 +53,7 @@
- #include "wmm_ac.h"
- #include "nan_usd.h"
- #include "dpp_supplicant.h"
- +#include "ucode.h"
-
-
- #define MAX_OWE_TRANSITION_BSS_SELECT_COUNT 5
- @@ -1706,6 +1707,12 @@ struct wpa_ssid * wpa_scan_res_match(str
- return NULL;
- }
-
- + if (!wpas_ucode_bss_allowed(wpa_s, bss)) {
- + if (debug_print)
- + wpa_dbg(wpa_s, MSG_DEBUG, " skip - denied by ucode handler");
- + return NULL;
- + }
- +
- 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 */
-
- + wpas_ucode_event(wpa_s, event, data);
- switch (event) {
- case EVENT_AUTH:
- #ifdef CONFIG_FST
- --- a/wpa_supplicant/ctrl_iface_unix.c
- +++ b/wpa_supplicant/ctrl_iface_unix.c
- @@ -28,6 +28,7 @@
- #include "config.h"
- #include "wpa_supplicant_i.h"
- #include "ctrl_iface.h"
- +#include "ucode.h"
-
- /* Per-interface ctrl_iface */
-
- @@ -436,6 +437,7 @@ static void wpa_supplicant_ctrl_iface_ms
- if (wpa_s == NULL)
- return;
-
- + wpas_ucode_ctrl_event(wpa_s, txt, len);
- gpriv = wpa_s->global->ctrl_iface;
-
- if (type != WPA_MSG_NO_GLOBAL && gpriv &&
|