Lines Matching full:iface

309 static int acs_request_scan(struct hostapd_iface *iface);
348 void acs_cleanup(struct hostapd_iface *iface)
352 for (i = 0; i < iface->num_hw_features; i++)
353 acs_cleanup_mode(&iface->hw_features[i]);
355 iface->chans_surveyed = 0;
356 iface->acs_num_completed_scans = 0;
357 iface->acs_num_retries = 0;
358 eloop_cancel_timeout(acs_scan_retry, iface, NULL);
362 static void acs_fail(struct hostapd_iface *iface)
365 acs_cleanup(iface);
366 hostapd_disable_iface(iface);
402 acs_survey_chan_interference_factor(struct hostapd_iface *iface,
427 iface->lowest_nf);
542 static int acs_surveys_are_sufficient(struct hostapd_iface *iface)
547 for (i = 0; i < iface->num_hw_features; i++) {
548 mode = &iface->hw_features[i];
549 if (!hostapd_hw_skip_mode(iface, mode) &&
566 static int is_in_chanlist(struct hostapd_iface *iface,
569 if (!iface->conf->acs_ch_list.num)
572 return freq_range_list_includes(&iface->conf->acs_ch_list, chan->chan);
576 static int is_in_freqlist(struct hostapd_iface *iface,
579 if (!iface->conf->acs_freq_list.num)
582 return freq_range_list_includes(&iface->conf->acs_freq_list,
588 struct hostapd_iface *iface, struct hostapd_hw_modes *mode)
600 iface->conf->acs_exclude_dfs)
603 if (!is_in_chanlist(iface, chan))
606 if (!is_in_freqlist(iface, chan))
609 if (chan->max_tx_power < iface->conf->min_tx_power)
613 iface->conf->country[2] == 0x4f)
619 acs_survey_chan_interference_factor(iface, chan);
628 struct hostapd_iface *iface)
633 for (i = 0; i < iface->num_hw_features; i++) {
634 mode = &iface->hw_features[i];
635 if (!hostapd_hw_skip_mode(iface, mode))
636 acs_survey_mode_interference_factor(iface, mode);
662 acs_find_mode(struct hostapd_iface *iface, int freq)
668 for (i = 0; i < iface->num_hw_features; i++) {
669 mode = &iface->hw_features[i];
670 if (!hostapd_hw_skip_mode(iface, mode)) {
682 acs_find_chan(struct hostapd_iface *iface, int freq)
688 for (i = 0; i < iface->num_hw_features; i++) {
689 mode = &iface->hw_features[i];
690 if (!hostapd_hw_skip_mode(iface, mode)) {
733 static void acs_update_puncturing_bitmap(struct hostapd_iface *iface,
740 struct hostapd_config *conf = iface->conf;
767 adj_chan = acs_find_chan(iface, adj_freq);
788 acs_usable_bw320_chan(struct hostapd_iface *iface,
792 int conf_bw320_offset = hostapd_get_bw320_offset(iface->conf);
824 acs_find_ideal_chan_mode(struct hostapd_iface *iface,
842 secondary_channel = iface->conf->secondary_channel;
864 iface->conf->acs_exclude_dfs)
867 if (!is_in_chanlist(iface, chan))
870 if (!is_in_freqlist(iface, chan))
873 if (chan->max_tx_power < iface->conf->min_tx_power)
877 iface->conf->country[2] == 0x4f)
890 ((iface->conf->ieee80211n &&
891 iface->conf->secondary_channel) ||
901 (iface->conf->ieee80211ac || iface->conf->ieee80211ax ||
902 iface->conf->ieee80211be)) {
903 if (hostapd_get_oper_chwidth(iface->conf) ==
912 if (hostapd_get_oper_chwidth(iface->conf) ==
923 iface->conf->ieee80211be) {
924 if (hostapd_get_oper_chwidth(iface->conf) ==
926 !acs_usable_bw320_chan(iface, chan, &bw320_offset))
939 adj_chan = acs_find_chan(iface, chan->freq +
971 if (iface->current_mode &&
972 iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
990 adj_chan = acs_find_chan(iface, chan->freq +
998 adj_chan = acs_find_chan(iface, chan->freq +
1006 adj_chan = acs_find_chan(iface, chan->freq +
1014 adj_chan = acs_find_chan(iface, chan->freq +
1030 if (iface->conf->acs_chan_bias) {
1031 for (k = 0; k < iface->conf->num_acs_chan_bias; k++) {
1032 bias = &iface->conf->acs_chan_bias[k];
1067 if (iface->conf->ieee80211be)
1068 acs_update_puncturing_bitmap(iface, mode, bw,
1082 hostapd_set_and_check_bw320_offset(iface->conf, ideal_bw320_offset);
1093 acs_find_ideal_chan(struct hostapd_iface *iface)
1103 if (is_6ghz_op_class(iface->conf->op_class)) {
1104 bw = op_class_to_bandwidth(iface->conf->op_class);
1109 if (iface->conf->ieee80211n &&
1110 iface->conf->secondary_channel)
1113 if (iface->conf->ieee80211ac || iface->conf->ieee80211ax ||
1114 iface->conf->ieee80211be) {
1115 switch (hostapd_get_oper_chwidth(iface->conf)) {
1138 for (i = 0; i < iface->num_hw_features; i++) {
1139 mode = &iface->hw_features[i];
1140 if (!hostapd_hw_skip_mode(iface, mode))
1141 acs_find_ideal_chan_mode(iface, mode, n_chans, bw,
1151 if (iface->conf->punct_acs_threshold)
1163 static void acs_adjust_secondary(struct hostapd_iface *iface)
1170 if (!iface->conf->secondary_channel ||
1171 acs_find_mode(iface, iface->freq) != HOSTAPD_MODE_IEEE80211A)
1178 if (iface->freq == bw_desc[ACS_BW40][i].first)
1179 iface->conf->secondary_channel = 1;
1180 else if (iface->freq == bw_desc[ACS_BW40][i].last)
1181 iface->conf->secondary_channel = -1;
1186 static void acs_adjust_center_freq(struct hostapd_iface *iface)
1192 switch (hostapd_get_oper_chwidth(iface->conf)) {
1194 if (iface->conf->secondary_channel &&
1195 iface->freq >= 2400 && iface->freq < 2500)
1196 center = iface->conf->channel +
1197 2 * iface->conf->secondary_channel;
1198 else if (iface->conf->secondary_channel)
1199 center = acs_get_bw_center_chan(iface->freq, ACS_BW40);
1201 center = iface->conf->channel;
1204 center = acs_get_bw_center_chan(iface->freq, ACS_BW80);
1207 center = acs_get_bw_center_chan(iface->freq, ACS_BW160);
1210 switch (hostapd_get_bw320_offset(iface->conf)) {
1212 center = acs_get_bw_center_chan(iface->freq,
1216 center = acs_get_bw_center_chan(iface->freq,
1234 hostapd_set_oper_centr_freq_seg0_idx(iface->conf, center);
1238 static int acs_study_survey_based(struct hostapd_iface *iface)
1242 if (!iface->chans_surveyed) {
1247 if (!acs_surveys_are_sufficient(iface)) {
1252 acs_survey_all_chans_interference_factor(iface);
1257 static int acs_study_options(struct hostapd_iface *iface)
1259 if (acs_study_survey_based(iface) == 0)
1269 static void acs_study(struct hostapd_iface *iface)
1274 err = acs_study_options(iface);
1280 ideal_chan = acs_find_ideal_chan(iface);
1287 iface->conf->channel = ideal_chan->chan;
1288 iface->freq = ideal_chan->freq;
1290 iface->conf->punct_bitmap = ideal_chan->punct_bitmap;
1293 if (iface->conf->ieee80211ac || iface->conf->ieee80211ax ||
1294 iface->conf->ieee80211be) {
1295 acs_adjust_secondary(iface);
1296 acs_adjust_center_freq(iface);
1299 err = hostapd_select_hw_mode(iface);
1303 err, iface->freq, iface->conf->channel);
1314 if (hostapd_acs_completed(iface, err) == HOSTAPD_CHAN_VALID) {
1315 acs_cleanup(iface);
1322 acs_fail(iface);
1326 static void acs_scan_complete(struct hostapd_iface *iface)
1330 iface->scan_cb = NULL;
1331 iface->acs_num_retries = 0;
1334 iface->conf->acs_num_scans);
1336 err = hostapd_drv_get_survey(iface->bss[0], 0);
1342 if (++iface->acs_num_completed_scans < iface->conf->acs_num_scans) {
1343 err = acs_request_scan(iface);
1352 acs_study(iface);
1355 hostapd_acs_completed(iface, 1);
1356 acs_fail(iface);
1360 static int * acs_request_scan_add_freqs(struct hostapd_iface *iface,
1371 iface->conf->acs_exclude_dfs))
1374 if (!is_in_chanlist(iface, chan))
1377 if (!is_in_freqlist(iface, chan))
1380 if (chan->max_tx_power < iface->conf->min_tx_power)
1384 iface->conf->country[2] == 0x4f)
1394 static int acs_request_scan(struct hostapd_iface *iface)
1404 for (i = 0; i < iface->num_hw_features; i++) {
1405 mode = &iface->hw_features[i];
1406 if (!hostapd_hw_skip_mode(iface, mode))
1416 for (i = 0; i < iface->num_hw_features; i++) {
1417 mode = &iface->hw_features[i];
1418 if (!hostapd_hw_skip_mode(iface, mode))
1419 freq = acs_request_scan_add_freqs(iface, mode, freq);
1430 if (!iface->acs_num_retries)
1432 iface->acs_num_completed_scans + 1,
1433 iface->conf->acs_num_scans);
1437 iface->acs_num_retries,
1438 iface->acs_num_completed_scans + 1,
1439 iface->conf->acs_num_scans);
1441 ret = hostapd_driver_scan(iface->bss[0], &params);
1445 iface->acs_num_retries++;
1446 if (iface->acs_num_retries >= ACS_SCAN_RETRY_MAX_COUNT) {
1449 acs_fail(iface);
1456 eloop_cancel_timeout(acs_scan_retry, iface, NULL);
1458 acs_scan_retry, iface, NULL);
1464 acs_cleanup(iface);
1468 iface->scan_cb = acs_scan_complete;
1476 struct hostapd_iface *iface = eloop_data;
1478 if (acs_request_scan(iface)) {
1481 acs_fail(iface);
1486 enum hostapd_chan_status acs_init(struct hostapd_iface *iface)
1492 if (iface->drv_flags & WPA_DRIVER_FLAGS_ACS_OFFLOAD) {
1495 err = hostapd_drv_do_acs(iface->bss[0]);
1505 if (!iface->current_mode &&
1506 iface->conf->hw_mode != HOSTAPD_MODE_IEEE80211ANY)
1509 acs_cleanup(iface);
1511 if (acs_request_scan(iface) < 0)
1514 hostapd_set_state(iface, HAPD_IFACE_ACS);
1515 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, ACS_EVENT_STARTED);