Lines Matching refs:iface

317 static int acs_request_scan(struct hostapd_iface *iface);
356 void acs_cleanup(struct hostapd_iface *iface) in acs_cleanup() argument
360 for (i = 0; i < iface->num_hw_features; i++) in acs_cleanup()
361 acs_cleanup_mode(&iface->hw_features[i]); in acs_cleanup()
363 iface->chans_surveyed = 0; in acs_cleanup()
364 iface->acs_num_completed_scans = 0; in acs_cleanup()
365 iface->acs_num_retries = 0; in acs_cleanup()
366 eloop_cancel_timeout(acs_scan_retry, iface, NULL); in acs_cleanup()
370 static void acs_fail(struct hostapd_iface *iface) in acs_fail() argument
373 acs_cleanup(iface); in acs_fail()
374 hostapd_disable_iface(iface); in acs_fail()
410 acs_survey_chan_interference_factor(struct hostapd_iface *iface, in acs_survey_chan_interference_factor() argument
435 iface->lowest_nf); in acs_survey_chan_interference_factor()
550 static int acs_surveys_are_sufficient(struct hostapd_iface *iface) in acs_surveys_are_sufficient() argument
555 for (i = 0; i < iface->num_hw_features; i++) { in acs_surveys_are_sufficient()
556 mode = &iface->hw_features[i]; in acs_surveys_are_sufficient()
557 if (!hostapd_hw_skip_mode(iface, mode) && in acs_surveys_are_sufficient()
574 static int is_in_chanlist(struct hostapd_iface *iface, in is_in_chanlist() argument
577 if (!iface->conf->acs_ch_list.num) in is_in_chanlist()
580 return freq_range_list_includes(&iface->conf->acs_ch_list, chan->chan); in is_in_chanlist()
584 static int is_in_freqlist(struct hostapd_iface *iface, in is_in_freqlist() argument
587 if (!iface->conf->acs_freq_list.num) in is_in_freqlist()
590 return freq_range_list_includes(&iface->conf->acs_freq_list, in is_in_freqlist()
596 struct hostapd_iface *iface, struct hostapd_hw_modes *mode) in acs_survey_mode_interference_factor() argument
608 iface->conf->acs_exclude_dfs) in acs_survey_mode_interference_factor()
611 if (!is_in_chanlist(iface, chan)) in acs_survey_mode_interference_factor()
614 if (!is_in_freqlist(iface, chan)) in acs_survey_mode_interference_factor()
617 if (chan->max_tx_power < iface->conf->min_tx_power) in acs_survey_mode_interference_factor()
621 iface->conf->country[2] == 0x4f) in acs_survey_mode_interference_factor()
627 acs_survey_chan_interference_factor(iface, chan); in acs_survey_mode_interference_factor()
636 struct hostapd_iface *iface) in acs_survey_all_chans_interference_factor() argument
641 for (i = 0; i < iface->num_hw_features; i++) { in acs_survey_all_chans_interference_factor()
642 mode = &iface->hw_features[i]; in acs_survey_all_chans_interference_factor()
643 if (!hostapd_hw_skip_mode(iface, mode)) in acs_survey_all_chans_interference_factor()
644 acs_survey_mode_interference_factor(iface, mode); in acs_survey_all_chans_interference_factor()
670 acs_find_mode(struct hostapd_iface *iface, int freq) in acs_find_mode() argument
676 for (i = 0; i < iface->num_hw_features; i++) { in acs_find_mode()
677 mode = &iface->hw_features[i]; in acs_find_mode()
678 if (!hostapd_hw_skip_mode(iface, mode)) { in acs_find_mode()
690 acs_find_chan(struct hostapd_iface *iface, int freq) in acs_find_chan() argument
696 for (i = 0; i < iface->num_hw_features; i++) { in acs_find_chan()
697 mode = &iface->hw_features[i]; in acs_find_chan()
698 if (!hostapd_hw_skip_mode(iface, mode)) { in acs_find_chan()
741 static void acs_update_puncturing_bitmap(struct hostapd_iface *iface, in acs_update_puncturing_bitmap() argument
748 struct hostapd_config *conf = iface->conf; in acs_update_puncturing_bitmap()
775 adj_chan = acs_find_chan(iface, adj_freq); in acs_update_puncturing_bitmap()
796 acs_usable_bw320_chan(struct hostapd_iface *iface, in acs_usable_bw320_chan() argument
800 int conf_bw320_offset = hostapd_get_bw320_offset(iface->conf); in acs_usable_bw320_chan()
832 acs_find_ideal_chan_mode(struct hostapd_iface *iface, in acs_find_ideal_chan_mode() argument
850 secondary_channel = iface->conf->secondary_channel; in acs_find_ideal_chan_mode()
872 iface->conf->acs_exclude_dfs) in acs_find_ideal_chan_mode()
875 if (!is_in_chanlist(iface, chan)) in acs_find_ideal_chan_mode()
878 if (!is_in_freqlist(iface, chan)) in acs_find_ideal_chan_mode()
881 if (chan->max_tx_power < iface->conf->min_tx_power) in acs_find_ideal_chan_mode()
885 iface->conf->country[2] == 0x4f) in acs_find_ideal_chan_mode()
898 ((iface->conf->ieee80211n && in acs_find_ideal_chan_mode()
899 iface->conf->secondary_channel) || in acs_find_ideal_chan_mode()
909 (iface->conf->ieee80211ac || iface->conf->ieee80211ax || in acs_find_ideal_chan_mode()
910 iface->conf->ieee80211be)) { in acs_find_ideal_chan_mode()
911 if (hostapd_get_oper_chwidth(iface->conf) == in acs_find_ideal_chan_mode()
920 if (hostapd_get_oper_chwidth(iface->conf) == in acs_find_ideal_chan_mode()
931 iface->conf->ieee80211be) { in acs_find_ideal_chan_mode()
932 if (hostapd_get_oper_chwidth(iface->conf) == in acs_find_ideal_chan_mode()
934 !acs_usable_bw320_chan(iface, chan, &bw320_offset)) in acs_find_ideal_chan_mode()
947 adj_chan = acs_find_chan(iface, chan->freq + in acs_find_ideal_chan_mode()
979 if (iface->current_mode && in acs_find_ideal_chan_mode()
980 iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A && in acs_find_ideal_chan_mode()
998 adj_chan = acs_find_chan(iface, chan->freq + in acs_find_ideal_chan_mode()
1006 adj_chan = acs_find_chan(iface, chan->freq + in acs_find_ideal_chan_mode()
1014 adj_chan = acs_find_chan(iface, chan->freq + in acs_find_ideal_chan_mode()
1022 adj_chan = acs_find_chan(iface, chan->freq + in acs_find_ideal_chan_mode()
1038 if (iface->conf->acs_chan_bias) { in acs_find_ideal_chan_mode()
1039 for (k = 0; k < iface->conf->num_acs_chan_bias; k++) { in acs_find_ideal_chan_mode()
1040 bias = &iface->conf->acs_chan_bias[k]; in acs_find_ideal_chan_mode()
1075 if (iface->conf->ieee80211be) in acs_find_ideal_chan_mode()
1076 acs_update_puncturing_bitmap(iface, mode, bw, in acs_find_ideal_chan_mode()
1090 hostapd_set_and_check_bw320_offset(iface->conf, ideal_bw320_offset); in acs_find_ideal_chan_mode()
1101 acs_find_ideal_chan(struct hostapd_iface *iface) in acs_find_ideal_chan() argument
1111 if (is_6ghz_op_class(iface->conf->op_class)) { in acs_find_ideal_chan()
1112 bw = op_class_to_bandwidth(iface->conf->op_class); in acs_find_ideal_chan()
1117 if (iface->conf->ieee80211n && in acs_find_ideal_chan()
1118 iface->conf->secondary_channel) in acs_find_ideal_chan()
1121 if (iface->conf->ieee80211ac || iface->conf->ieee80211ax || in acs_find_ideal_chan()
1122 iface->conf->ieee80211be) { in acs_find_ideal_chan()
1123 switch (hostapd_get_oper_chwidth(iface->conf)) { in acs_find_ideal_chan()
1146 for (i = 0; i < iface->num_hw_features; i++) { in acs_find_ideal_chan()
1147 mode = &iface->hw_features[i]; in acs_find_ideal_chan()
1148 if (!hostapd_hw_skip_mode(iface, mode)) in acs_find_ideal_chan()
1149 acs_find_ideal_chan_mode(iface, mode, n_chans, bw, in acs_find_ideal_chan()
1159 if (iface->conf->punct_acs_threshold) in acs_find_ideal_chan()
1171 static void acs_adjust_secondary(struct hostapd_iface *iface) in acs_adjust_secondary() argument
1178 if (!iface->conf->secondary_channel || in acs_adjust_secondary()
1179 acs_find_mode(iface, iface->freq) != HOSTAPD_MODE_IEEE80211A) in acs_adjust_secondary()
1186 if (iface->freq == bw_desc[ACS_BW40][i].first) in acs_adjust_secondary()
1187 iface->conf->secondary_channel = 1; in acs_adjust_secondary()
1188 else if (iface->freq == bw_desc[ACS_BW40][i].last) in acs_adjust_secondary()
1189 iface->conf->secondary_channel = -1; in acs_adjust_secondary()
1194 static void acs_adjust_center_freq(struct hostapd_iface *iface) in acs_adjust_center_freq() argument
1200 switch (hostapd_get_oper_chwidth(iface->conf)) { in acs_adjust_center_freq()
1202 if (iface->conf->secondary_channel && in acs_adjust_center_freq()
1203 iface->freq >= 2400 && iface->freq < 2500) in acs_adjust_center_freq()
1204 center = iface->conf->channel + in acs_adjust_center_freq()
1205 2 * iface->conf->secondary_channel; in acs_adjust_center_freq()
1206 else if (iface->conf->secondary_channel) in acs_adjust_center_freq()
1207 center = acs_get_bw_center_chan(iface->freq, ACS_BW40); in acs_adjust_center_freq()
1209 center = iface->conf->channel; in acs_adjust_center_freq()
1212 center = acs_get_bw_center_chan(iface->freq, ACS_BW80); in acs_adjust_center_freq()
1215 center = acs_get_bw_center_chan(iface->freq, ACS_BW160); in acs_adjust_center_freq()
1218 switch (hostapd_get_bw320_offset(iface->conf)) { in acs_adjust_center_freq()
1220 center = acs_get_bw_center_chan(iface->freq, in acs_adjust_center_freq()
1224 center = acs_get_bw_center_chan(iface->freq, in acs_adjust_center_freq()
1242 hostapd_set_oper_centr_freq_seg0_idx(iface->conf, center); in acs_adjust_center_freq()
1246 static int acs_study_survey_based(struct hostapd_iface *iface) in acs_study_survey_based() argument
1250 if (!iface->chans_surveyed) { in acs_study_survey_based()
1255 if (!acs_surveys_are_sufficient(iface)) { in acs_study_survey_based()
1260 acs_survey_all_chans_interference_factor(iface); in acs_study_survey_based()
1265 static int acs_study_options(struct hostapd_iface *iface) in acs_study_options() argument
1267 if (acs_study_survey_based(iface) == 0) in acs_study_options()
1277 static void acs_study(struct hostapd_iface *iface) in acs_study() argument
1282 err = acs_study_options(iface); in acs_study()
1288 ideal_chan = acs_find_ideal_chan(iface); in acs_study()
1295 iface->conf->channel = ideal_chan->chan; in acs_study()
1296 iface->freq = ideal_chan->freq; in acs_study()
1298 iface->conf->punct_bitmap = ideal_chan->punct_bitmap; in acs_study()
1301 if (iface->conf->ieee80211ac || iface->conf->ieee80211ax || in acs_study()
1302 iface->conf->ieee80211be) { in acs_study()
1303 acs_adjust_secondary(iface); in acs_study()
1304 acs_adjust_center_freq(iface); in acs_study()
1307 err = hostapd_select_hw_mode(iface); in acs_study()
1311 err, iface->freq, iface->conf->channel); in acs_study()
1322 if (hostapd_acs_completed(iface, err) == HOSTAPD_CHAN_VALID) { in acs_study()
1323 acs_cleanup(iface); in acs_study()
1330 acs_fail(iface); in acs_study()
1334 static void acs_scan_complete(struct hostapd_iface *iface) in acs_scan_complete() argument
1338 iface->scan_cb = NULL; in acs_scan_complete()
1339 iface->acs_num_retries = 0; in acs_scan_complete()
1342 iface->conf->acs_num_scans); in acs_scan_complete()
1344 err = hostapd_drv_get_survey(iface->bss[0], 0); in acs_scan_complete()
1350 if (++iface->acs_num_completed_scans < iface->conf->acs_num_scans) { in acs_scan_complete()
1351 err = acs_request_scan(iface); in acs_scan_complete()
1360 acs_study(iface); in acs_scan_complete()
1363 hostapd_acs_completed(iface, 1); in acs_scan_complete()
1364 acs_fail(iface); in acs_scan_complete()
1368 static int * acs_request_scan_add_freqs(struct hostapd_iface *iface, in acs_request_scan_add_freqs() argument
1379 iface->conf->acs_exclude_dfs)) in acs_request_scan_add_freqs()
1382 if (!is_in_chanlist(iface, chan)) in acs_request_scan_add_freqs()
1385 if (!is_in_freqlist(iface, chan)) in acs_request_scan_add_freqs()
1388 if (chan->max_tx_power < iface->conf->min_tx_power) in acs_request_scan_add_freqs()
1392 iface->conf->country[2] == 0x4f) in acs_request_scan_add_freqs()
1402 static int acs_request_scan(struct hostapd_iface *iface) in acs_request_scan() argument
1412 for (i = 0; i < iface->num_hw_features; i++) { in acs_request_scan()
1413 mode = &iface->hw_features[i]; in acs_request_scan()
1414 if (!hostapd_hw_skip_mode(iface, mode)) in acs_request_scan()
1424 for (i = 0; i < iface->num_hw_features; i++) { in acs_request_scan()
1425 mode = &iface->hw_features[i]; in acs_request_scan()
1426 if (!hostapd_hw_skip_mode(iface, mode)) in acs_request_scan()
1427 freq = acs_request_scan_add_freqs(iface, mode, freq); in acs_request_scan()
1438 if (!iface->acs_num_retries) in acs_request_scan()
1440 iface->acs_num_completed_scans + 1, in acs_request_scan()
1441 iface->conf->acs_num_scans); in acs_request_scan()
1445 iface->acs_num_retries, in acs_request_scan()
1446 iface->acs_num_completed_scans + 1, in acs_request_scan()
1447 iface->conf->acs_num_scans); in acs_request_scan()
1449 ret = hostapd_driver_scan(iface->bss[0], &params); in acs_request_scan()
1453 iface->acs_num_retries++; in acs_request_scan()
1454 if (iface->acs_num_retries >= ACS_SCAN_RETRY_MAX_COUNT) { in acs_request_scan()
1457 acs_fail(iface); in acs_request_scan()
1464 eloop_cancel_timeout(acs_scan_retry, iface, NULL); in acs_request_scan()
1466 acs_scan_retry, iface, NULL); in acs_request_scan()
1472 acs_cleanup(iface); in acs_request_scan()
1476 iface->scan_cb = acs_scan_complete; in acs_request_scan()
1484 struct hostapd_iface *iface = eloop_data; in acs_scan_retry() local
1486 if (acs_request_scan(iface)) { in acs_scan_retry()
1489 acs_fail(iface); in acs_scan_retry()
1494 enum hostapd_chan_status acs_init(struct hostapd_iface *iface) in acs_init() argument
1500 if (iface->drv_flags & WPA_DRIVER_FLAGS_ACS_OFFLOAD) { in acs_init()
1503 err = hostapd_drv_do_acs(iface->bss[0]); in acs_init()
1513 if (!iface->current_mode && in acs_init()
1514 iface->conf->hw_mode != HOSTAPD_MODE_IEEE80211ANY) in acs_init()
1517 acs_cleanup(iface); in acs_init()
1519 if (acs_request_scan(iface) < 0) in acs_init()
1522 hostapd_set_state(iface, HAPD_IFACE_ACS); in acs_init()
1523 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, ACS_EVENT_STARTED); in acs_init()