config->driver_param = os_strdup(driver_param);
config->gas_rand_addr_lifetime = DEFAULT_RAND_ADDR_LIFETIME;
+#ifdef CONFIG_TESTING_OPTIONS
+ config->mld_connect_band_pref = DEFAULT_MLD_CONNECT_BAND_PREF;
+#endif /* CONFIG_TESTING_OPTIONS */
+
return config;
}
#endif /* CONFIG_P2P */
+#ifdef CONFIG_TESTING_OPTIONS
+static int wpa_config_process_mld_connect_bssid_pref(
+ const struct global_parse_data *data,
+ struct wpa_config *config, int line, const char *pos)
+{
+ if (hwaddr_aton2(pos, config->mld_connect_bssid_pref) < 0) {
+ wpa_printf(MSG_ERROR,
+ "Line %d: Invalid mld_connect_bssid_pref '%s'",
+ line, pos);
+ return -1;
+ }
+
+ return 0;
+}
+#endif /* CONFIG_TESTING_OPTIONS */
+
+
#ifdef OFFSET
#undef OFFSET
#endif /* OFFSET */
{ INT_RANGE(pasn_corrupt_mic, 0, 1), 0 },
#endif /* CONFIG_TESTING_OPTIONS */
#endif /* CONFIG_PASN */
+#ifdef CONFIG_TESTING_OPTIONS
+ { INT_RANGE(mld_force_single_link, 0, 1), 0 },
+ { INT_RANGE(mld_connect_band_pref, 0, MLD_CONNECT_BAND_PREF_MAX), 0 },
+ { FUNC(mld_connect_bssid_pref), 0 },
+#endif /* CONFIG_TESTING_OPTIONS */
/* NOTE: When adding new parameters here, add_interface() in
* wpa_supplicant/dbus_new_introspect.c may need to be modified to
* increase the size of the iface->xml buffer. */
#define DEFAULT_OCE_SUPPORT OCE_STA
#define DEFAULT_EXTENDED_KEY_ID 0
#define DEFAULT_SCAN_RES_VALID_FOR_CONNECT 5
+#define DEFAULT_MLD_CONNECT_BAND_PREF MLD_CONNECT_BAND_PREF_AUTO
#include "config_ssid.h"
#include "wps/wps.h"
#endif /* CONFIG_TESTING_OPTIONS */
#endif /* CONFIG_PASN*/
+
+#ifdef CONFIG_TESTING_OPTIONS
+ enum {
+ MLD_CONNECT_BAND_PREF_AUTO = 0,
+ MLD_CONNECT_BAND_PREF_2GHZ = 1,
+ MLD_CONNECT_BAND_PREF_5GHZ = 2,
+ MLD_CONNECT_BAND_PREF_6GHZ = 3,
+ MLD_CONNECT_BAND_PREF_MAX = 4,
+ } mld_connect_band_pref;
+
+ u8 mld_connect_bssid_pref[ETH_ALEN];
+
+ int mld_force_single_link;
+#endif /* CONFIG_TESTING_OPTIONS */
};
if (config->wowlan_disconnect_on_deinit)
fprintf(f, "wowlan_disconnect_on_deinit=%d\n",
config->wowlan_disconnect_on_deinit);
+#ifdef CONFIG_TESTING_OPTIONS
+ if (config->mld_force_single_link)
+ fprintf(f, "mld_force_single_link=1\n");
+ if (config->mld_connect_band_pref != MLD_CONNECT_BAND_PREF_AUTO)
+ fprintf(f, "mld_connect_band_pref=%d\n",
+ config->mld_connect_band_pref);
+ if (!is_zero_ether_addr(config->mld_connect_bssid_pref))
+ fprintf(f, "mld_connect_bssid_pref=" MACSTR "\n",
+ MAC2STR(config->mld_connect_bssid_pref));
+#endif /* CONFIG_TESTING_OPTIONS */
}
#endif /* CONFIG_NO_CONFIG_WRITE */
}
+#ifdef CONFIG_TESTING_OPTIONS
+static struct wpa_bss * wpas_ml_connect_pref(struct wpa_supplicant *wpa_s,
+ struct wpa_bss *bss)
+{
+ unsigned int low, high, i;
+
+ wpa_printf(MSG_DEBUG,
+ "MLD: valid_links=%d, band_pref=%u, bssid_pref=" MACSTR,
+ wpa_s->valid_links,
+ wpa_s->conf->mld_connect_band_pref,
+ MAC2STR(wpa_s->conf->mld_connect_bssid_pref));
+
+ /* Check if there are more than one link */
+ if (!(wpa_s->valid_links & (wpa_s->valid_links - 1)))
+ return bss;
+
+ if (!is_zero_ether_addr(wpa_s->conf->mld_connect_bssid_pref)) {
+ for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
+ if (!(wpa_s->valid_links & BIT(i)))
+ continue;
+
+ if (wpa_s->mlo_assoc_link_id == i)
+ continue;
+
+ if (os_memcmp(wpa_s->links[i].bssid,
+ wpa_s->conf->mld_connect_bssid_pref,
+ ETH_ALEN) == 0)
+ goto found;
+ }
+ }
+
+ if (wpa_s->conf->mld_connect_band_pref == MLD_CONNECT_BAND_PREF_AUTO)
+ return bss;
+
+ switch (wpa_s->conf->mld_connect_band_pref) {
+ case MLD_CONNECT_BAND_PREF_2GHZ:
+ low = 2412;
+ high = 2472;
+ break;
+ case MLD_CONNECT_BAND_PREF_5GHZ:
+ low = 5180;
+ high = 5985;
+ break;
+ case MLD_CONNECT_BAND_PREF_6GHZ:
+ low = 5955;
+ high = 7125;
+ break;
+ default:
+ return bss;
+ }
+
+ for (i = 0; i < MAX_NUM_MLD_LINKS; i++) {
+ if (!(wpa_s->valid_links & BIT(i)))
+ continue;
+
+ if (wpa_s->mlo_assoc_link_id == i)
+ continue;
+
+ if (wpa_s->links[i].freq >= low && wpa_s->links[i].freq <= high)
+ goto found;
+ }
+
+found:
+ if (i == MAX_NUM_MLD_LINKS) {
+ wpa_printf(MSG_DEBUG, "MLD: No match for connect/band pref");
+ return bss;
+ }
+
+ wpa_printf(MSG_DEBUG,
+ "MLD: Change BSS for connect: " MACSTR " -> " MACSTR,
+ MAC2STR(wpa_s->links[wpa_s->mlo_assoc_link_id].bssid),
+ MAC2STR(wpa_s->links[i].bssid));
+
+ /* Get the BSS entry and do the switch */
+ bss = wpa_bss_get_bssid(wpa_s, wpa_s->links[i].bssid);
+ wpa_s->mlo_assoc_link_id = i;
+
+ return bss;
+}
+#endif /* CONFIG_TESTING_OPTIONS */
+
+
static void wpas_sme_ml_auth(struct wpa_supplicant *wpa_s,
union wpa_event_data *data,
int ie_offset)
return;
}
+ os_memset(¶ms, 0, sizeof(params));
+ if (wpas_ml_element(wpa_s, bss, ssid)) {
+ wpa_printf(MSG_DEBUG, "MLD: In authentication");
+#ifdef CONFIG_TESTING_OPTIONS
+ bss = wpas_ml_connect_pref(wpa_s, bss);
+
+ if (wpa_s->conf->mld_force_single_link) {
+ wpa_printf(MSG_DEBUG, "MLD: Force single link");
+ wpa_s->valid_links = BIT(wpa_s->mlo_assoc_link_id);
+ }
+#endif /* CONFIG_TESTING_OPTIONS */
+ params.mld = true;
+ params.mld_link_id = wpa_s->mlo_assoc_link_id;
+ params.ap_mld_addr = wpa_s->ap_mld_addr;
+ wpas_ml_handle_removed_links(wpa_s, bss);
+ }
+
skip_auth = wpa_s->conf->reassoc_same_bss_optim &&
wpa_s->reassoc_same_bss;
wpa_s->current_bss = bss;
- os_memset(¶ms, 0, sizeof(params));
wpa_s->reassociate = 0;
params.freq = bss->freq;
params.ssid_len = bss->ssid_len;
params.p2p = ssid->p2p_group;
- if (wpas_ml_element(wpa_s, bss, ssid)) {
- wpa_printf(MSG_DEBUG, "MLD: In authentication");
- params.mld = true;
- params.mld_link_id = wpa_s->mlo_assoc_link_id;
- params.ap_mld_addr = wpa_s->ap_mld_addr;
- wpas_ml_handle_removed_links(wpa_s, bss);
- }
-
if (wpa_s->sme.ssid_len != params.ssid_len ||
os_memcmp(wpa_s->sme.ssid, params.ssid, params.ssid_len) != 0)
wpa_s->sme.prev_bssid_set = 0;