Lines Matching refs:iface
64 static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd);
67 static int setup_interface2(struct hostapd_iface *iface);
78 int (*cb)(struct hostapd_iface *iface, in hostapd_for_each_interface() argument
85 if (!interfaces->iface[i]) in hostapd_for_each_interface()
87 ret = cb(interfaces->iface[i], ctx); in hostapd_for_each_interface()
99 return hapd->iface->bss[0]; in hostapd_mbssid_get_tx_bss()
110 for (i = 1; i < hapd->iface->num_bss; i++) in hostapd_mbssid_get_bss_index()
111 if (hapd->iface->bss[i] == hapd) in hostapd_mbssid_get_bss_index()
126 hostapd_setup_encryption(hapd->conf->iface, hapd); in hostapd_reconfig_encryption()
161 hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 1); in hostapd_reload_bss()
163 hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 0); in hostapd_reload_bss()
182 hostapd_setup_encryption(hapd->conf->iface, hapd); in hostapd_reload_bss()
198 wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface); in hostapd_reload_bss()
205 bss->conf->iface); in hostapd_clear_old_bss()
224 static void hostapd_clear_old(struct hostapd_iface *iface) in hostapd_clear_old() argument
228 for (j = 0; j < iface->num_bss; j++) in hostapd_clear_old()
229 hostapd_clear_old_bss(iface->bss[j]); in hostapd_clear_old()
242 if (os_strcmp(newconf->bss[i]->iface, in hostapd_iface_conf_changed()
243 oldconf->bss[i]->iface) != 0) in hostapd_iface_conf_changed()
251 int hostapd_reload_config(struct hostapd_iface *iface) in hostapd_reload_config() argument
253 struct hapd_interfaces *interfaces = iface->interfaces; in hostapd_reload_config()
254 struct hostapd_data *hapd = iface->bss[0]; in hostapd_reload_config()
258 if (iface->config_fname == NULL) { in hostapd_reload_config()
260 hostapd_clear_old(iface); in hostapd_reload_config()
261 for (j = 0; j < iface->num_bss; j++) in hostapd_reload_config()
262 hostapd_reload_bss(iface->bss[j]); in hostapd_reload_config()
266 if (iface->interfaces == NULL || in hostapd_reload_config()
267 iface->interfaces->config_read_cb == NULL) in hostapd_reload_config()
269 newconf = iface->interfaces->config_read_cb(iface->config_fname); in hostapd_reload_config()
278 hostapd_clear_old(iface); in hostapd_reload_config()
282 fname = os_strdup(iface->config_fname); in hostapd_reload_config()
287 hostapd_remove_iface(interfaces, hapd->conf->iface); in hostapd_reload_config()
288 iface = hostapd_init(interfaces, fname); in hostapd_reload_config()
291 if (!iface) { in hostapd_reload_config()
296 iface->interfaces = interfaces; in hostapd_reload_config()
297 interfaces->iface[interfaces->count] = iface; in hostapd_reload_config()
299 res = hostapd_enable_iface(iface); in hostapd_reload_config()
305 iface->conf = newconf; in hostapd_reload_config()
307 for (j = 0; j < iface->num_bss; j++) { in hostapd_reload_config()
308 hapd = iface->bss[j]; in hostapd_reload_config()
373 hostapd_broadcast_key_clear_iface(hapd, hapd->conf->iface); in hostapd_broadcast_wep_clear()
385 hostapd_drv_set_key(hapd->conf->iface, in hostapd_broadcast_wep_set()
422 hostapd_disable_iface(hapd->iface); in hostapd_link_remove_timeout_handler()
471 __func__, hapd->conf ? hapd->conf->iface : "N/A"); in hostapd_free_hapd_data()
477 wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); in hostapd_free_hapd_data()
485 struct hapd_interfaces *ifaces = hapd->iface->interfaces; in hostapd_free_hapd_data()
489 struct hostapd_iface *iface = ifaces->iface[i]; in hostapd_free_hapd_data() local
492 for (j = 0; iface && j < iface->num_bss; j++) { in hostapd_free_hapd_data()
493 struct hostapd_data *h = iface->bss[j]; in hostapd_free_hapd_data()
526 if (hostapd_if_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface)) { in hostapd_free_hapd_data()
529 hapd->conf->iface); in hostapd_free_hapd_data()
546 hapd->iface->bss[0] != hapd) in hostapd_free_hapd_data()
547 hostapd_if_link_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface, in hostapd_free_hapd_data()
633 if (!hapd->started && hapd->iface->bss[0] != hapd) in hostapd_bss_link_deinit()
640 if (hapd->iface->bss[0] == hapd && !hapd->drv_priv) in hostapd_bss_link_deinit()
659 hapd->conf ? hapd->conf->iface : "N/A"); in hostapd_cleanup()
660 if (hapd->iface->interfaces && in hostapd_cleanup()
661 hapd->iface->interfaces->ctrl_iface_deinit) { in hostapd_cleanup()
663 hapd->iface->interfaces->ctrl_iface_deinit(hapd); in hostapd_cleanup()
669 static void sta_track_deinit(struct hostapd_iface *iface) in sta_track_deinit() argument
673 if (!iface->num_sta_seen) in sta_track_deinit()
676 while ((info = dl_list_first(&iface->sta_seen, struct hostapd_sta_info, in sta_track_deinit()
679 iface->num_sta_seen--; in sta_track_deinit()
685 void hostapd_cleanup_iface_partial(struct hostapd_iface *iface) in hostapd_cleanup_iface_partial() argument
687 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); in hostapd_cleanup_iface_partial()
688 eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); in hostapd_cleanup_iface_partial()
690 hostapd_stop_setup_timers(iface); in hostapd_cleanup_iface_partial()
692 if (iface->current_mode) in hostapd_cleanup_iface_partial()
693 acs_cleanup(iface); in hostapd_cleanup_iface_partial()
694 hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); in hostapd_cleanup_iface_partial()
695 iface->hw_features = NULL; in hostapd_cleanup_iface_partial()
696 iface->current_mode = NULL; in hostapd_cleanup_iface_partial()
697 os_free(iface->current_rates); in hostapd_cleanup_iface_partial()
698 iface->current_rates = NULL; in hostapd_cleanup_iface_partial()
699 os_free(iface->basic_rates); in hostapd_cleanup_iface_partial()
700 iface->basic_rates = NULL; in hostapd_cleanup_iface_partial()
701 iface->cac_started = 0; in hostapd_cleanup_iface_partial()
702 ap_list_deinit(iface); in hostapd_cleanup_iface_partial()
703 sta_track_deinit(iface); in hostapd_cleanup_iface_partial()
704 airtime_policy_update_deinit(iface); in hostapd_cleanup_iface_partial()
715 static void hostapd_cleanup_iface(struct hostapd_iface *iface) in hostapd_cleanup_iface() argument
717 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); in hostapd_cleanup_iface()
718 eloop_cancel_timeout(hostapd_interface_setup_failure_handler, iface, in hostapd_cleanup_iface()
721 hostapd_cleanup_iface_partial(iface); in hostapd_cleanup_iface()
722 hostapd_config_free(iface->conf); in hostapd_cleanup_iface()
723 iface->conf = NULL; in hostapd_cleanup_iface()
725 os_free(iface->config_fname); in hostapd_cleanup_iface()
726 os_free(iface->bss); in hostapd_cleanup_iface()
727 wpa_printf(MSG_DEBUG, "%s: free iface=%p", __func__, iface); in hostapd_cleanup_iface()
728 os_free(iface); in hostapd_cleanup_iface()
736 if (hapd->drv_priv && !hapd->iface->driver_ap_teardown && hapd->conf) { in hostapd_clear_wep()
743 static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd) in hostapd_setup_encryption() argument
762 hostapd_drv_set_key(iface, hapd, WPA_ALG_WEP, NULL, i, 0, in hostapd_setup_encryption()
792 if (!hapd->iface->driver_ap_teardown) { in hostapd_flush_old_stations()
831 static int hostapd_validate_bssid_configuration(struct hostapd_iface *iface) in hostapd_validate_bssid_configuration() argument
834 struct hostapd_data *hapd = iface->bss[0]; in hostapd_validate_bssid_configuration()
835 unsigned int i = iface->conf->num_bss, bits = 0, j; in hostapd_validate_bssid_configuration()
841 if (iface->conf->use_driver_iface_addr) in hostapd_validate_bssid_configuration()
852 for (j = 0; j < iface->conf->num_bss; j++) { in hostapd_validate_bssid_configuration()
853 if (is_zero_ether_addr(iface->conf->bss[j]->bssid)) { in hostapd_validate_bssid_configuration()
861 iface->conf->bss[j]->bssid[i] ^ in hostapd_validate_bssid_configuration()
902 (unsigned long) iface->conf->num_bss, MAC2STR(mask), bits); in hostapd_validate_bssid_configuration()
1395 __func__, hapd, conf->iface, first); in hostapd_setup_bss()
1406 __func__, conf->iface); in hostapd_setup_bss()
1419 hapd->iface->bss[0]->own_addr) == in hostapd_setup_bss()
1423 "the radio", conf->iface); in hostapd_setup_bss()
1446 hapd->mld_link_id, hapd->conf->iface); in hostapd_setup_bss()
1453 if (hostapd_if_add(hapd->iface->bss[0], WPA_IF_AP_BSS, in hostapd_setup_bss()
1454 conf->iface, addr, hapd, in hostapd_setup_bss()
1471 hapd->mld_link_id, hapd->conf->iface); in hostapd_setup_bss()
1504 if ((hapd->conf->mesh & MESH_ENABLED) && hapd->iface->mconf == NULL) in hostapd_setup_bss()
1515 if (hostapd_setup_encryption(conf->iface, hapd)) in hostapd_setup_bss()
1557 conf->iface, MAC2STR(hapd->own_addr), in hostapd_setup_bss()
1728 static void hostapd_tx_queue_params(struct hostapd_iface *iface) in hostapd_tx_queue_params() argument
1730 struct hostapd_data *hapd = iface->bss[0]; in hostapd_tx_queue_params()
1735 if ((hapd->conf->mesh & MESH_ENABLED) && iface->mconf == NULL) in hostapd_tx_queue_params()
1740 p = &iface->conf->tx_queue[i]; in hostapd_tx_queue_params()
1785 if (hapd->iface->drv_max_acl_mac_addrs == 0) in hostapd_set_acl()
1813 if (!hapd->iface->interfaces || in start_ctrl_iface_bss()
1814 !hapd->iface->interfaces->ctrl_iface_init) in start_ctrl_iface_bss()
1817 if (hapd->iface->interfaces->ctrl_iface_init(hapd)) { in start_ctrl_iface_bss()
1820 hapd->conf->iface); in start_ctrl_iface_bss()
1828 static int start_ctrl_iface(struct hostapd_iface *iface) in start_ctrl_iface() argument
1832 if (!iface->interfaces || !iface->interfaces->ctrl_iface_init) in start_ctrl_iface()
1835 for (i = 0; i < iface->num_bss; i++) { in start_ctrl_iface()
1836 struct hostapd_data *hapd = iface->bss[i]; in start_ctrl_iface()
1837 if (iface->interfaces->ctrl_iface_init(hapd)) { in start_ctrl_iface()
1840 hapd->conf->iface); in start_ctrl_iface()
1858 hostapd_cleanup_iface_partial(bss->iface); in hostapd_no_ir_cleanup()
1862 static int hostapd_no_ir_channel_list_updated(struct hostapd_iface *iface, in hostapd_no_ir_channel_list_updated() argument
1869 if (hostapd_get_hw_features(iface)) in hostapd_no_ir_channel_list_updated()
1875 for (i = 0; i < iface->num_hw_features; i++) { in hostapd_no_ir_channel_list_updated()
1876 mode = &iface->hw_features[i]; in hostapd_no_ir_channel_list_updated()
1878 if (mode->mode == iface->conf->hw_mode) { in hostapd_no_ir_channel_list_updated()
1879 if (iface->freq > 0 && in hostapd_no_ir_channel_list_updated()
1880 !hw_mode_get_channel(mode, iface->freq, NULL)) { in hostapd_no_ir_channel_list_updated()
1899 iface->current_mode = mode; in hostapd_no_ir_channel_list_updated()
1901 if (iface->state == HAPD_IFACE_ENABLED) { in hostapd_no_ir_channel_list_updated()
1905 chan = hw_get_channel_freq(iface->current_mode->mode, in hostapd_no_ir_channel_list_updated()
1906 iface->freq, NULL, in hostapd_no_ir_channel_list_updated()
1907 iface->hw_features, in hostapd_no_ir_channel_list_updated()
1908 iface->num_hw_features); in hostapd_no_ir_channel_list_updated()
1925 hostapd_set_state(iface, HAPD_IFACE_NO_IR); in hostapd_no_ir_channel_list_updated()
1926 iface->is_no_ir = true; in hostapd_no_ir_channel_list_updated()
1927 hostapd_drv_stop_ap(iface->bss[0]); in hostapd_no_ir_channel_list_updated()
1928 hostapd_no_ir_cleanup(iface->bss[0]); in hostapd_no_ir_channel_list_updated()
1929 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_NO_IR); in hostapd_no_ir_channel_list_updated()
1930 } else if (iface->state == HAPD_IFACE_NO_IR) { in hostapd_no_ir_channel_list_updated()
1937 if (!iface->conf->acs) { in hostapd_no_ir_channel_list_updated()
1940 chan = hw_get_channel_freq(iface->current_mode->mode, in hostapd_no_ir_channel_list_updated()
1941 iface->freq, NULL, in hostapd_no_ir_channel_list_updated()
1942 iface->hw_features, in hostapd_no_ir_channel_list_updated()
1943 iface->num_hw_features); in hostapd_no_ir_channel_list_updated()
1953 iface->freq = 0; in hostapd_no_ir_channel_list_updated()
1954 iface->conf->channel = 0; in hostapd_no_ir_channel_list_updated()
1955 if (acs_init(iface) != HOSTAPD_CHAN_ACS) in hostapd_no_ir_channel_list_updated()
1962 setup_interface2(iface); in hostapd_no_ir_channel_list_updated()
1971 struct hostapd_iface *iface = eloop_ctx; in channel_list_update_timeout() local
1973 if (!iface->wait_channel_update) { in channel_list_update_timeout()
1983 setup_interface2(iface); in channel_list_update_timeout()
1987 void hostapd_channel_list_updated(struct hostapd_iface *iface, int initiator) in hostapd_channel_list_updated() argument
1990 hostapd_for_each_interface(iface->interfaces, in hostapd_channel_list_updated()
1996 if (!iface->wait_channel_update || initiator != REGDOM_SET_BY_USER) in hostapd_channel_list_updated()
2000 eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); in hostapd_channel_list_updated()
2001 setup_interface2(iface); in hostapd_channel_list_updated()
2005 static int setup_interface(struct hostapd_iface *iface) in setup_interface() argument
2007 struct hostapd_data *hapd = iface->bss[0]; in setup_interface()
2017 iface->driver_ap_teardown = 0; in setup_interface()
2019 if (!iface->phy[0]) { in setup_interface()
2023 os_strlcpy(iface->phy, phy, sizeof(iface->phy)); in setup_interface()
2031 for (i = 1; i < iface->num_bss; i++) { in setup_interface()
2032 iface->bss[i]->driver = hapd->driver; in setup_interface()
2033 iface->bss[i]->drv_priv = hapd->drv_priv; in setup_interface()
2036 if (hostapd_validate_bssid_configuration(iface)) in setup_interface()
2044 if (start_ctrl_iface(iface)) in setup_interface()
2050 hostapd_set_state(iface, HAPD_IFACE_COUNTRY_UPDATE); in setup_interface()
2066 iface->wait_channel_update = 1; in setup_interface()
2069 iface, NULL); in setup_interface()
2074 return setup_interface2(iface); in setup_interface()
2078 static int configured_fixed_chan_to_freq(struct hostapd_iface *iface) in configured_fixed_chan_to_freq() argument
2082 if (!iface->conf->channel) in configured_fixed_chan_to_freq()
2084 if (iface->conf->op_class) { in configured_fixed_chan_to_freq()
2085 freq = ieee80211_chan_to_freq(NULL, iface->conf->op_class, in configured_fixed_chan_to_freq()
2086 iface->conf->channel); in configured_fixed_chan_to_freq()
2090 iface->conf->op_class, iface->conf->channel); in configured_fixed_chan_to_freq()
2093 iface->freq = freq; in configured_fixed_chan_to_freq()
2101 for (j = 0; j < iface->num_hw_features; j++) { in configured_fixed_chan_to_freq()
2102 struct hostapd_hw_modes *mode = &iface->hw_features[j]; in configured_fixed_chan_to_freq()
2104 if (iface->conf->hw_mode != HOSTAPD_MODE_IEEE80211ANY && in configured_fixed_chan_to_freq()
2105 iface->conf->hw_mode != mode->mode) in configured_fixed_chan_to_freq()
2110 if (chan->chan == iface->conf->channel && in configured_fixed_chan_to_freq()
2112 iface->freq = chan->freq; in configured_fixed_chan_to_freq()
2123 static void hostapd_set_6ghz_sec_chan(struct hostapd_iface *iface) in hostapd_set_6ghz_sec_chan() argument
2127 if (!is_6ghz_op_class(iface->conf->op_class)) in hostapd_set_6ghz_sec_chan()
2130 bw = op_class_to_bandwidth(iface->conf->op_class); in hostapd_set_6ghz_sec_chan()
2133 if (bw >= 40 && !iface->conf->secondary_channel) { in hostapd_set_6ghz_sec_chan()
2134 if (((iface->conf->channel - 1) / 4) % 2) in hostapd_set_6ghz_sec_chan()
2135 iface->conf->secondary_channel = -1; in hostapd_set_6ghz_sec_chan()
2137 iface->conf->secondary_channel = 1; in hostapd_set_6ghz_sec_chan()
2142 static int setup_interface2(struct hostapd_iface *iface) in setup_interface2() argument
2144 iface->wait_channel_update = 0; in setup_interface2()
2145 iface->is_no_ir = false; in setup_interface2()
2159 iface->freq = iface->conf->channel; in setup_interface2()
2161 if (hostapd_get_hw_features(iface)) { in setup_interface2()
2167 if (iface->conf->acs && !iface->is_ch_switch_dfs) { in setup_interface2()
2168 iface->freq = 0; in setup_interface2()
2169 iface->conf->channel = 0; in setup_interface2()
2171 iface->is_ch_switch_dfs = false; in setup_interface2()
2173 ret = configured_fixed_chan_to_freq(iface); in setup_interface2()
2177 if (iface->conf->op_class) { in setup_interface2()
2180 ch_width = op_class_to_ch_width(iface->conf->op_class); in setup_interface2()
2181 hostapd_set_oper_chwidth(iface->conf, ch_width); in setup_interface2()
2182 hostapd_set_6ghz_sec_chan(iface); in setup_interface2()
2185 ret = hostapd_select_hw_mode(iface); in setup_interface2()
2195 ret = hostapd_check_edmg_capab(iface); in setup_interface2()
2198 ret = hostapd_check_he_6ghz_capab(iface); in setup_interface2()
2201 ret = hostapd_check_ht_capab(iface); in setup_interface2()
2210 if (iface->conf->ieee80211h) in setup_interface2()
2214 return hostapd_setup_interface_complete(iface, 0); in setup_interface2()
2217 if (iface->is_no_ir) { in setup_interface2()
2220 hostapd_set_state(iface, HAPD_IFACE_NO_IR); in setup_interface2()
2221 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_NO_IR); in setup_interface2()
2225 hostapd_set_state(iface, HAPD_IFACE_DISABLED); in setup_interface2()
2226 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_DISABLED); in setup_interface2()
2227 if (iface->interfaces && iface->interfaces->terminate_on_error) in setup_interface2()
2249 *hw_mode = ieee80211_freq_to_chan(hapd->iface->freq, channel); in fst_hostapd_get_channel_info_cb()
2258 *modes = hapd->iface->hw_features; in fst_hostapd_get_hw_modes_cb()
2259 return hapd->iface->num_hw_features; in fst_hostapd_get_hw_modes_cb()
2267 if (hapd->iface->fst_ies != fst_ies) { in fst_hostapd_set_ies_cb()
2268 hapd->iface->fst_ies = fst_ies; in fst_hostapd_set_ies_cb()
2280 return hostapd_drv_send_action(hapd, hapd->iface->freq, 0, da, in fst_hostapd_send_action_cb()
2372 static int hostapd_owe_iface_iter(struct hostapd_iface *iface, void *ctx) in hostapd_owe_iface_iter() argument
2377 for (i = 0; i < iface->num_bss; i++) { in hostapd_owe_iface_iter()
2378 struct hostapd_data *bss = iface->bss[i]; in hostapd_owe_iface_iter()
2381 bss->conf->iface) != 0) in hostapd_owe_iface_iter()
2387 hapd->conf->iface, bss->conf->iface, in hostapd_owe_iface_iter()
2417 if (!hapd->iface->interfaces || in hostapd_owe_trans_get_info()
2418 !hapd->iface->interfaces->for_each_interface) in hostapd_owe_trans_get_info()
2419 return hostapd_owe_iface_iter(hapd->iface, hapd); in hostapd_owe_trans_get_info()
2421 return hapd->iface->interfaces->for_each_interface( in hostapd_owe_trans_get_info()
2422 hapd->iface->interfaces, hostapd_owe_iface_iter, hapd); in hostapd_owe_trans_get_info()
2426 static int hostapd_owe_iface_iter2(struct hostapd_iface *iface, void *ctx) in hostapd_owe_iface_iter2() argument
2430 for (i = 0; i < iface->num_bss; i++) { in hostapd_owe_iface_iter2()
2431 struct hostapd_data *bss = iface->bss[i]; in hostapd_owe_iface_iter2()
2436 if (bss->iface->state != HAPD_IFACE_ENABLED) { in hostapd_owe_iface_iter2()
2439 bss->conf->iface, in hostapd_owe_iface_iter2()
2440 hostapd_state_text(bss->iface->state)); in hostapd_owe_iface_iter2()
2448 bss->conf->iface); in hostapd_owe_iface_iter2()
2458 static void hostapd_owe_update_trans(struct hostapd_iface *iface) in hostapd_owe_update_trans() argument
2463 if (!iface->interfaces || in hostapd_owe_update_trans()
2464 !iface->interfaces->for_each_interface) in hostapd_owe_update_trans()
2465 hostapd_owe_iface_iter2(iface, NULL); in hostapd_owe_update_trans()
2467 iface->interfaces->for_each_interface( in hostapd_owe_update_trans()
2468 iface->interfaces, hostapd_owe_iface_iter2, NULL); in hostapd_owe_update_trans()
2476 struct hostapd_iface *iface = eloop_ctx; in hostapd_interface_setup_failure_handler() local
2479 if (iface->num_bss < 1 || !iface->bss || !iface->bss[0]) in hostapd_interface_setup_failure_handler()
2481 hapd = iface->bss[0]; in hostapd_interface_setup_failure_handler()
2487 static int hostapd_setup_interface_complete_sync(struct hostapd_iface *iface, in hostapd_setup_interface_complete_sync() argument
2490 struct hostapd_data *hapd = iface->bss[0]; in hostapd_setup_interface_complete_sync()
2500 if (iface->freq) { in hostapd_setup_interface_complete_sync()
2507 hostapd_hw_mode_txt(iface->conf->hw_mode), in hostapd_setup_interface_complete_sync()
2508 iface->conf->channel, iface->freq); in hostapd_setup_interface_complete_sync()
2512 if (!(iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD)) { in hostapd_setup_interface_complete_sync()
2514 res = hostapd_handle_dfs(iface); in hostapd_setup_interface_complete_sync()
2522 res_dfs_offload = hostapd_handle_dfs_offload(iface); in hostapd_setup_interface_complete_sync()
2541 if (iface->mconf != NULL) { in hostapd_setup_interface_complete_sync()
2544 iface->bss[0]->conf->iface); in hostapd_setup_interface_complete_sync()
2550 hostapd_set_freq(hapd, hapd->iconf->hw_mode, iface->freq, in hostapd_setup_interface_complete_sync()
2570 if (iface->current_mode) { in hostapd_setup_interface_complete_sync()
2571 if (hostapd_prepare_rates(iface, iface->current_mode)) { in hostapd_setup_interface_complete_sync()
2599 for (j = 0; j < iface->num_bss; j++) { in hostapd_setup_interface_complete_sync()
2600 hapd = iface->bss[j]; in hostapd_setup_interface_complete_sync()
2603 if (hostapd_setup_bss(hapd, j == 0, !iface->conf->mbssid)) { in hostapd_setup_interface_complete_sync()
2605 hapd = iface->bss[j]; in hostapd_setup_interface_complete_sync()
2619 for (j = 0; hapd->iconf->mbssid && j < iface->num_bss; j++) { in hostapd_setup_interface_complete_sync()
2620 hapd = iface->bss[j]; in hostapd_setup_interface_complete_sync()
2623 hapd = iface->bss[j]; in hostapd_setup_interface_complete_sync()
2635 hapd = iface->bss[0]; in hostapd_setup_interface_complete_sync()
2637 hostapd_tx_queue_params(iface); in hostapd_setup_interface_complete_sync()
2639 ap_list_init(iface); in hostapd_setup_interface_complete_sync()
2655 for (j = 0; j < iface->num_bss; j++) { in hostapd_setup_interface_complete_sync()
2656 if (hostapd_init_wps_complete(iface->bss[j])) in hostapd_setup_interface_complete_sync()
2660 if ((iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && in hostapd_setup_interface_complete_sync()
2679 iface->fst = fst_attach(hapd->conf->iface, hapd->own_addr, in hostapd_setup_interface_complete_sync()
2681 if (!iface->fst) { in hostapd_setup_interface_complete_sync()
2689 hostapd_set_state(iface, HAPD_IFACE_ENABLED); in hostapd_setup_interface_complete_sync()
2690 hostapd_owe_update_trans(iface); in hostapd_setup_interface_complete_sync()
2691 airtime_policy_update_init(iface); in hostapd_setup_interface_complete_sync()
2692 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_ENABLED); in hostapd_setup_interface_complete_sync()
2697 if (delay_apply_cfg && !iface->mconf) { in hostapd_setup_interface_complete_sync()
2704 iface->bss[0]->conf->iface); in hostapd_setup_interface_complete_sync()
2705 if (iface->interfaces && iface->interfaces->terminate_on_error > 0) in hostapd_setup_interface_complete_sync()
2706 iface->interfaces->terminate_on_error--; in hostapd_setup_interface_complete_sync()
2708 for (j = 0; j < iface->num_bss; j++) in hostapd_setup_interface_complete_sync()
2709 hostapd_neighbor_set_own_report(iface->bss[j]); in hostapd_setup_interface_complete_sync()
2711 if (iface->interfaces && iface->interfaces->count > 1) in hostapd_setup_interface_complete_sync()
2712 ieee802_11_set_beacons(iface); in hostapd_setup_interface_complete_sync()
2719 if (iface->is_no_ir) { in hostapd_setup_interface_complete_sync()
2720 hostapd_set_state(iface, HAPD_IFACE_NO_IR); in hostapd_setup_interface_complete_sync()
2725 hostapd_set_state(iface, HAPD_IFACE_DISABLED); in hostapd_setup_interface_complete_sync()
2728 if (iface->fst) { in hostapd_setup_interface_complete_sync()
2729 fst_detach(iface->fst); in hostapd_setup_interface_complete_sync()
2730 iface->fst = NULL; in hostapd_setup_interface_complete_sync()
2734 if (iface->interfaces && iface->interfaces->terminate_on_error) { in hostapd_setup_interface_complete_sync()
2743 iface, NULL); in hostapd_setup_interface_complete_sync()
2758 int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err) in hostapd_setup_interface_complete() argument
2760 struct hapd_interfaces *interfaces = iface->interfaces; in hostapd_setup_interface_complete()
2761 struct hostapd_data *hapd = iface->bss[0]; in hostapd_setup_interface_complete()
2765 if (!iface->need_to_start_in_sync) in hostapd_setup_interface_complete()
2766 return hostapd_setup_interface_complete_sync(iface, err); in hostapd_setup_interface_complete()
2770 iface->need_to_start_in_sync = 0; in hostapd_setup_interface_complete()
2772 if (iface->is_no_ir) { in hostapd_setup_interface_complete()
2773 hostapd_set_state(iface, HAPD_IFACE_NO_IR); in hostapd_setup_interface_complete()
2778 hostapd_set_state(iface, HAPD_IFACE_DISABLED); in hostapd_setup_interface_complete()
2785 if (iface->ready_to_start_in_sync) { in hostapd_setup_interface_complete()
2791 if (interfaces->iface[i]->need_to_start_in_sync && in hostapd_setup_interface_complete()
2792 !interfaces->iface[i]->ready_to_start_in_sync) in hostapd_setup_interface_complete()
2800 if (not_ready_in_sync_ifaces > 1 && iface->state == HAPD_IFACE_DFS) { in hostapd_setup_interface_complete()
2805 iface->need_to_start_in_sync = 0; in hostapd_setup_interface_complete()
2808 iface->bss[0]->conf->iface); in hostapd_setup_interface_complete()
2809 return hostapd_setup_interface_complete_sync(iface, err); in hostapd_setup_interface_complete()
2814 iface->ready_to_start_in_sync = 1; in hostapd_setup_interface_complete()
2817 iface->bss[0]->conf->iface); in hostapd_setup_interface_complete()
2823 iface->bss[0]->conf->iface); in hostapd_setup_interface_complete()
2824 iface->need_to_start_in_sync = 0; in hostapd_setup_interface_complete()
2825 hostapd_setup_interface_complete_sync(iface, err); in hostapd_setup_interface_complete()
2827 if (interfaces->iface[i]->need_to_start_in_sync && in hostapd_setup_interface_complete()
2828 interfaces->iface[i]->ready_to_start_in_sync) { in hostapd_setup_interface_complete()
2830 interfaces->iface[i], 0); in hostapd_setup_interface_complete()
2832 interfaces->iface[i]->need_to_start_in_sync = 0; in hostapd_setup_interface_complete()
2856 int hostapd_setup_interface(struct hostapd_iface *iface) in hostapd_setup_interface() argument
2860 if (!iface->conf) in hostapd_setup_interface()
2862 ret = setup_interface(iface); in hostapd_setup_interface()
2865 iface->conf->bss[0]->iface); in hostapd_setup_interface()
2898 hapd->iface = hapd_iface; in hostapd_alloc_bss_data()
2922 hapd->conf ? hapd->conf->iface : "N/A"); in hostapd_bss_deinit()
2937 void hostapd_interface_deinit(struct hostapd_iface *iface) in hostapd_interface_deinit() argument
2941 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); in hostapd_interface_deinit()
2942 if (iface == NULL) in hostapd_interface_deinit()
2945 hostapd_set_state(iface, HAPD_IFACE_DISABLED); in hostapd_interface_deinit()
2947 eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); in hostapd_interface_deinit()
2948 iface->wait_channel_update = 0; in hostapd_interface_deinit()
2949 iface->is_no_ir = false; in hostapd_interface_deinit()
2952 if (iface->fst) { in hostapd_interface_deinit()
2953 fst_detach(iface->fst); in hostapd_interface_deinit()
2954 iface->fst = NULL; in hostapd_interface_deinit()
2958 for (j = (int) iface->num_bss - 1; j >= 0; j--) { in hostapd_interface_deinit()
2959 if (!iface->bss) in hostapd_interface_deinit()
2961 hostapd_bss_deinit(iface->bss[j]); in hostapd_interface_deinit()
2965 hostapd_stop_setup_timers(iface); in hostapd_interface_deinit()
2966 eloop_cancel_timeout(ap_ht2040_timeout, iface, NULL); in hostapd_interface_deinit()
3005 void hostapd_interface_free(struct hostapd_iface *iface) in hostapd_interface_free() argument
3008 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); in hostapd_interface_free()
3009 for (j = 0; j < iface->num_bss; j++) { in hostapd_interface_free()
3010 if (!iface->bss) in hostapd_interface_free()
3013 if (iface->bss[j]) in hostapd_interface_free()
3014 hostapd_mld_ref_dec(iface->bss[j]->mld); in hostapd_interface_free()
3017 __func__, iface->bss[j]); in hostapd_interface_free()
3018 os_free(iface->bss[j]); in hostapd_interface_free()
3020 hostapd_cleanup_iface(iface); in hostapd_interface_free()
3065 if (!mld || os_strcmp(conf->iface, mld->name) != 0) in hostapd_bss_setup_multi_link()
3081 os_strlcpy(mld->name, conf->iface, sizeof(conf->iface)); in hostapd_bss_setup_multi_link()
3259 struct hostapd_iface *iface = interfaces->iface[i]; in ifname_in_use() local
3260 for (j = 0; j < iface->num_bss; j++) { in ifname_in_use()
3261 struct hostapd_data *hapd = iface->bss[j]; in ifname_in_use()
3262 if (os_strcmp(ifname, hapd->conf->iface) == 0) in ifname_in_use()
3286 struct hostapd_iface *new_iface = NULL, *iface = NULL; in hostapd_interface_init_bss() local
3295 if (os_strcmp(interfaces->iface[i]->phy, phy) == 0) { in hostapd_interface_init_bss()
3296 iface = interfaces->iface[i]; in hostapd_interface_init_bss()
3302 config_fname, phy, iface ? "" : " --> new PHY"); in hostapd_interface_init_bss()
3303 if (iface) { in hostapd_interface_init_bss()
3320 ifname = conf->bss[0]->iface; in hostapd_interface_init_bss()
3329 iface->conf->bss, iface->conf->num_bss + 1, in hostapd_interface_init_bss()
3331 tmp_bss = os_realloc_array(iface->bss, iface->num_bss + 1, in hostapd_interface_init_bss()
3334 iface->bss = tmp_bss; in hostapd_interface_init_bss()
3336 iface->conf->bss = tmp_conf; in hostapd_interface_init_bss()
3337 iface->conf->last_bss = tmp_conf[0]; in hostapd_interface_init_bss()
3343 bss = iface->conf->bss[iface->conf->num_bss] = conf->bss[0]; in hostapd_interface_init_bss()
3344 iface->conf->num_bss++; in hostapd_interface_init_bss()
3346 hapd = hostapd_alloc_bss_data(iface, iface->conf, bss); in hostapd_interface_init_bss()
3348 iface->conf->num_bss--; in hostapd_interface_init_bss()
3352 iface->conf->last_bss = bss; in hostapd_interface_init_bss()
3353 iface->bss[iface->num_bss] = hapd; in hostapd_interface_init_bss()
3358 bss_idx = iface->num_bss++; in hostapd_interface_init_bss()
3364 new_iface = iface = hostapd_init(interfaces, config_fname); in hostapd_interface_init_bss()
3365 if (!iface) in hostapd_interface_init_bss()
3367 os_strlcpy(iface->phy, phy, sizeof(iface->phy)); in hostapd_interface_init_bss()
3368 iface->interfaces = interfaces; in hostapd_interface_init_bss()
3373 if (iface->bss[bss_idx]->conf->logger_stdout_level > 0) in hostapd_interface_init_bss()
3374 iface->bss[bss_idx]->conf->logger_stdout_level--; in hostapd_interface_init_bss()
3377 if (iface->conf->bss[bss_idx]->iface[0] == '\0' && in hostapd_interface_init_bss()
3378 !hostapd_drv_none(iface->bss[bss_idx])) { in hostapd_interface_init_bss()
3386 return iface; in hostapd_interface_init_bss()
3391 void *drv_priv, struct hostapd_iface *iface) in hostapd_cleanup_driver() argument
3401 if (!iface->bss[0]->conf->mld_ap) { in hostapd_cleanup_driver()
3403 } else if (hostapd_mld_is_first_bss(iface->bss[0]) && in hostapd_cleanup_driver()
3405 !driver->is_drv_shared(drv_priv, iface->bss[0])) { in hostapd_cleanup_driver()
3407 } else if (hostapd_if_link_remove(iface->bss[0], in hostapd_cleanup_driver()
3409 iface->bss[0]->conf->iface, in hostapd_cleanup_driver()
3410 iface->bss[0]->mld_link_id)) { in hostapd_cleanup_driver()
3412 iface->bss[0]->conf->iface); in hostapd_cleanup_driver()
3417 iface->bss[0]->drv_priv = NULL; in hostapd_cleanup_driver()
3421 void hostapd_interface_deinit_free(struct hostapd_iface *iface) in hostapd_interface_deinit_free() argument
3426 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); in hostapd_interface_deinit_free()
3427 if (iface == NULL) in hostapd_interface_deinit_free()
3430 __func__, (unsigned int) iface->num_bss, in hostapd_interface_deinit_free()
3431 (unsigned int) iface->conf->num_bss); in hostapd_interface_deinit_free()
3432 driver = iface->bss[0]->driver; in hostapd_interface_deinit_free()
3433 drv_priv = iface->bss[0]->drv_priv; in hostapd_interface_deinit_free()
3434 hostapd_interface_deinit(iface); in hostapd_interface_deinit_free()
3437 hostapd_cleanup_driver(driver, drv_priv, iface); in hostapd_interface_deinit_free()
3438 hostapd_interface_free(iface); in hostapd_interface_deinit_free()
3477 if (hapd_iface->interfaces->iface[j] == hapd_iface) in hostapd_refresh_all_iface_beacons()
3480 ieee802_11_update_beacons(hapd_iface->interfaces->iface[j]); in hostapd_refresh_all_iface_beacons()
3497 hapd_iface->conf->bss[0]->iface); in hostapd_enable_iface()
3502 hapd_iface->conf->bss[0]->iface); in hostapd_enable_iface()
3534 hapd_iface->conf->bss[0]->iface); in hostapd_reload_iface()
3552 wpa_printf(MSG_DEBUG, "Reload BSS %s", bss->conf->iface); in hostapd_reload_bss_only()
3578 hapd_iface->conf->bss[0]->iface); in hostapd_disable_iface()
3611 hapd_iface->bss[0]->conf->iface); in hostapd_disable_iface()
3621 struct hostapd_iface **iface, *hapd_iface; in hostapd_iface_alloc() local
3623 iface = os_realloc_array(interfaces->iface, interfaces->count + 1, in hostapd_iface_alloc()
3625 if (iface == NULL) in hostapd_iface_alloc()
3627 interfaces->iface = iface; in hostapd_iface_alloc()
3628 hapd_iface = interfaces->iface[interfaces->count] = in hostapd_iface_alloc()
3682 os_strlcpy(bss->iface, ifname, sizeof(bss->iface)); in hostapd_config_alloc()
3757 if (interfaces->iface[j] == hapd_iface) in hostapd_add_iface()
3762 tmp = os_realloc_array(interfaces->iface, in hostapd_add_iface()
3769 interfaces->iface = tmp; in hostapd_add_iface()
3770 interfaces->iface[interfaces->count++] = hapd_iface; in hostapd_add_iface()
3802 __func__, hapd, hapd->conf->iface); in hostapd_add_iface()
3828 mld_ap = interfaces->iface[i]->conf->bss[0]->mld_ap; in hostapd_add_iface()
3831 if (!os_strcmp(interfaces->iface[i]->conf->bss[0]->iface, in hostapd_add_iface()
3850 os_strlcpy(conf->bss[0]->iface, buf, in hostapd_add_iface()
3851 sizeof(conf->bss[0]->iface)); in hostapd_add_iface()
3877 hapd_iface->conf->bss[0]->iface); in hostapd_add_iface()
3896 hapd->conf->iface); in hostapd_add_iface()
3910 interfaces->iface[interfaces->count] = NULL; in hostapd_add_iface()
3919 static int hostapd_remove_bss(struct hostapd_iface *iface, unsigned int idx) in hostapd_remove_bss() argument
3923 wpa_printf(MSG_INFO, "Remove BSS '%s'", iface->conf->bss[idx]->iface); in hostapd_remove_bss()
3926 if (idx < iface->num_bss) { in hostapd_remove_bss()
3927 struct hostapd_data *hapd = iface->bss[idx]; in hostapd_remove_bss()
3931 __func__, hapd, hapd->conf->iface); in hostapd_remove_bss()
3939 iface->num_bss--; in hostapd_remove_bss()
3941 for (i = idx; i < iface->num_bss; i++) in hostapd_remove_bss()
3942 iface->bss[i] = iface->bss[i + 1]; in hostapd_remove_bss()
3944 hostapd_config_free_bss(iface->conf->bss[idx]); in hostapd_remove_bss()
3945 iface->conf->bss[idx] = NULL; in hostapd_remove_bss()
3948 iface->conf->num_bss--; in hostapd_remove_bss()
3949 for (i = idx; i < iface->conf->num_bss; i++) in hostapd_remove_bss()
3950 iface->conf->bss[i] = iface->conf->bss[i + 1]; in hostapd_remove_bss()
3962 hapd_iface = interfaces->iface[i]; in hostapd_remove_iface()
3965 if (!os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) { in hostapd_remove_iface()
3974 interfaces->iface[k] = in hostapd_remove_iface()
3975 interfaces->iface[k + 1]; in hostapd_remove_iface()
3985 if (!os_strcmp(hapd_iface->conf->bss[j]->iface, buf)) { in hostapd_remove_iface()
4055 } else if (!(hapd->iface->drv_flags2 & in hostapd_new_assoc_sta()
4062 if (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_WIRED) { in hostapd_new_assoc_sta()
4067 hapd->conf->iface, __func__, in hostapd_new_assoc_sta()
4070 } else if (!(hapd->iface->drv_flags & in hostapd_new_assoc_sta()
4075 hapd->conf->iface, __func__, MAC2STR(sta->addr), in hostapd_new_assoc_sta()
4117 void hostapd_set_state(struct hostapd_iface *iface, enum hostapd_iface_state s) in hostapd_set_state() argument
4120 iface->conf ? iface->conf->bss[0]->iface : "N/A", in hostapd_set_state()
4121 hostapd_state_text(iface->state), hostapd_state_text(s)); in hostapd_set_state()
4122 iface->state = s; in hostapd_set_state()
4126 int hostapd_csa_in_progress(struct hostapd_iface *iface) in hostapd_csa_in_progress() argument
4130 for (i = 0; i < iface->num_bss; i++) in hostapd_csa_in_progress()
4131 if (iface->bss[i]->csa_in_progress) in hostapd_csa_in_progress()
4262 hostapd_determine_mode(hapd->iface); in hostapd_change_config_freq()
4263 mode = hapd->iface->current_mode; in hostapd_change_config_freq()
4347 struct hostapd_iface *iface = hapd->iface; in hostapd_fill_csa_settings() local
4356 if (!iface || !iface->freq || hapd->csa_in_progress) in hostapd_fill_csa_settings()
4381 &hapd->iface->cs_oper_class, in hostapd_fill_csa_settings()
4395 ret = hostapd_change_config_freq(iface->bss[0], iface->conf, in hostapd_fill_csa_settings()
4402 old_punct_bitmap = iface->conf->punct_bitmap; in hostapd_fill_csa_settings()
4403 iface->conf->punct_bitmap = settings->punct_bitmap; in hostapd_fill_csa_settings()
4409 iface->conf->punct_bitmap = old_punct_bitmap; in hostapd_fill_csa_settings()
4411 hostapd_change_config_freq(iface->bss[0], iface->conf, in hostapd_fill_csa_settings()
4492 if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_AP_CSA)) { in hostapd_switch_channel()
4520 hostapd_switch_channel_fallback(struct hostapd_iface *iface, in hostapd_switch_channel_fallback() argument
4543 iface->conf->vht_capab |= in hostapd_switch_channel_fallback()
4551 iface->conf->vht_capab |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; in hostapd_switch_channel_fallback()
4562 iface->freq = freq_params->freq; in hostapd_switch_channel_fallback()
4563 iface->conf->channel = freq_params->channel; in hostapd_switch_channel_fallback()
4564 iface->conf->secondary_channel = freq_params->sec_channel_offset; in hostapd_switch_channel_fallback()
4573 iface->conf->op_class = op_class; in hostapd_switch_channel_fallback()
4574 hostapd_set_oper_centr_freq_seg0_idx(iface->conf, seg0_idx); in hostapd_switch_channel_fallback()
4575 hostapd_set_oper_centr_freq_seg1_idx(iface->conf, seg1_idx); in hostapd_switch_channel_fallback()
4576 hostapd_set_oper_chwidth(iface->conf, bw); in hostapd_switch_channel_fallback()
4577 iface->conf->ieee80211n = freq_params->ht_enabled; in hostapd_switch_channel_fallback()
4578 iface->conf->ieee80211ac = freq_params->vht_enabled; in hostapd_switch_channel_fallback()
4579 iface->conf->ieee80211ax = freq_params->he_enabled; in hostapd_switch_channel_fallback()
4580 iface->conf->ieee80211be = freq_params->eht_enabled; in hostapd_switch_channel_fallback()
4587 hostapd_disable_iface(iface); in hostapd_switch_channel_fallback()
4588 hostapd_enable_iface(iface); in hostapd_switch_channel_fallback()
4607 struct hostapd_iface *iface = hapd->iface; in hostapd_fill_cca_settings() local
4611 if (!iface || iface->conf->he_op.he_bss_color_disabled) in hostapd_fill_cca_settings()
4620 old_color = iface->conf->he_op.he_bss_color; in hostapd_fill_cca_settings()
4621 iface->conf->he_op.he_bss_color = hapd->cca_color; in hostapd_fill_cca_settings()
4626 iface->conf->he_op.he_bss_color = old_color; in hostapd_fill_cca_settings()
4676 hapd->iface->conf->he_op.he_bss_color_disabled = 1; in hostapd_switch_color_timeout_handler()
4677 hapd->iface->conf->he_op.he_bss_color = os_random() % 63 + 1; in hostapd_switch_color_timeout_handler()
4678 for (b = 0; b < hapd->iface->num_bss; b++) in hostapd_switch_color_timeout_handler()
4679 ieee802_11_set_beacon(hapd->iface->bss[b]); in hostapd_switch_color_timeout_handler()
4683 for (b = 0; b < hapd->iface->num_bss; b++) { in hostapd_switch_color_timeout_handler()
4684 struct hostapd_data *bss = hapd->iface->bss[b]; in hostapd_switch_color_timeout_handler()
4743 struct hostapd_iface *iface = interfaces->iface[i]; in hostapd_get_iface() local
4745 for (j = 0; j < iface->num_bss; j++) { in hostapd_get_iface()
4746 struct hostapd_data *hapd = iface->bss[j]; in hostapd_get_iface()
4748 if (os_strcmp(ifname, hapd->conf->iface) == 0) in hostapd_get_iface()
4757 void hostapd_periodic_iface(struct hostapd_iface *iface) in hostapd_periodic_iface() argument
4761 ap_list_timer(iface); in hostapd_periodic_iface()
4763 for (i = 0; i < iface->num_bss; i++) { in hostapd_periodic_iface()
4764 struct hostapd_data *hapd = iface->bss[i]; in hostapd_periodic_iface()
4803 struct hostapd_iface *iface; in hostapd_mld_get_link_bss() local
4807 for (i = 0; i < hapd->iface->interfaces->count; i++) { in hostapd_mld_get_link_bss()
4808 iface = hapd->iface->interfaces->iface[i]; in hostapd_mld_get_link_bss()
4809 if (!iface) in hostapd_mld_get_link_bss()
4812 for (j = 0; j < iface->num_bss; j++) { in hostapd_mld_get_link_bss()
4813 bss = iface->bss[j]; in hostapd_mld_get_link_bss()
4837 return !os_strcmp(hapd1->conf->iface, hapd2->conf->iface); in hostapd_is_ml_partner()