Lines Matching refs:iface
245 static int acs_request_scan(struct hostapd_iface *iface);
264 void acs_cleanup(struct hostapd_iface *iface)
269 for (i = 0; i < iface->current_mode->num_channels; i++) {
270 chan = &iface->current_mode->channels[i];
280 iface->chans_surveyed = 0;
281 iface->acs_num_completed_scans = 0;
285 static void acs_fail(struct hostapd_iface *iface)
288 acs_cleanup(iface);
289 hostapd_disable_iface(iface);
327 acs_survey_chan_interference_factor(struct hostapd_iface *iface,
352 iface->lowest_nf);
456 static int acs_surveys_are_sufficient(struct hostapd_iface *iface)
462 for (i = 0; i < iface->current_mode->num_channels; i++) {
463 chan = &iface->current_mode->channels[i];
482 static int is_in_chanlist(struct hostapd_iface *iface,
485 if (!iface->conf->acs_ch_list.num)
488 return freq_range_list_includes(&iface->conf->acs_ch_list, chan->chan);
493 struct hostapd_iface *iface)
498 for (i = 0; i < iface->current_mode->num_channels; i++) {
499 chan = &iface->current_mode->channels[i];
504 if (!is_in_chanlist(iface, chan))
510 acs_survey_chan_interference_factor(iface, chan);
518 static struct hostapd_channel_data *acs_find_chan(struct hostapd_iface *iface,
524 for (i = 0; i < iface->current_mode->num_channels; i++) {
525 chan = &iface->current_mode->channels[i];
575 acs_find_ideal_chan(struct hostapd_iface *iface)
587 if (iface->conf->ieee80211n &&
588 iface->conf->secondary_channel == -1) {
593 if (iface->conf->ieee80211n &&
594 iface->conf->secondary_channel)
597 if (iface->conf->ieee80211ac || iface->conf->ieee80211ax) {
598 switch (hostapd_get_oper_chwidth(iface->conf)) {
615 for (i = 0; i < iface->current_mode->num_channels; i++) {
619 chan = &iface->current_mode->channels[i];
628 if (!is_in_chanlist(iface, chan))
640 if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
641 iface->conf->ieee80211n &&
642 iface->conf->secondary_channel &&
649 if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
650 (iface->conf->ieee80211ac || iface->conf->ieee80211ax)) {
651 if (hostapd_get_oper_chwidth(iface->conf) ==
660 if (hostapd_get_oper_chwidth(iface->conf) ==
676 adj_chan = acs_find_chan(iface, chan->freq + (j * 20));
701 if (is_24ghz_mode(iface->current_mode->mode)) {
703 adj_chan = acs_find_chan(iface, chan->freq +
711 adj_chan = acs_find_chan(iface, chan->freq +
719 adj_chan = acs_find_chan(iface, chan->freq +
727 adj_chan = acs_find_chan(iface, chan->freq +
740 if (iface->conf->acs_chan_bias) {
741 for (k = 0; k < iface->conf->num_acs_chan_bias; k++) {
742 bias = &iface->conf->acs_chan_bias[k];
747 } else if (is_24ghz_mode(iface->current_mode->mode) &&
786 static void acs_adjust_center_freq(struct hostapd_iface *iface)
792 switch (hostapd_get_oper_chwidth(iface->conf)) {
794 offset = 2 * iface->conf->secondary_channel;
810 hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
811 iface->conf->channel + offset);
815 static int acs_study_survey_based(struct hostapd_iface *iface)
819 if (!iface->chans_surveyed) {
824 if (!acs_surveys_are_sufficient(iface)) {
829 acs_survey_all_chans_intereference_factor(iface);
834 static int acs_study_options(struct hostapd_iface *iface)
836 if (acs_study_survey_based(iface) == 0)
846 static void acs_study(struct hostapd_iface *iface)
851 err = acs_study_options(iface);
857 ideal_chan = acs_find_ideal_chan(iface);
864 iface->conf->channel = ideal_chan->chan;
866 if (iface->conf->ieee80211ac || iface->conf->ieee80211ax)
867 acs_adjust_center_freq(iface);
875 if (hostapd_acs_completed(iface, err) == HOSTAPD_CHAN_VALID) {
876 acs_cleanup(iface);
883 acs_fail(iface);
887 static void acs_scan_complete(struct hostapd_iface *iface)
891 iface->scan_cb = NULL;
894 iface->conf->acs_num_scans);
896 err = hostapd_drv_get_survey(iface->bss[0], 0);
902 if (++iface->acs_num_completed_scans < iface->conf->acs_num_scans) {
903 err = acs_request_scan(iface);
912 acs_study(iface);
915 hostapd_acs_completed(iface, 1);
916 acs_fail(iface);
920 static int acs_request_scan(struct hostapd_iface *iface)
927 params.freqs = os_calloc(iface->current_mode->num_channels + 1,
933 for (i = 0; i < iface->current_mode->num_channels; i++) {
934 chan = &iface->current_mode->channels[i];
938 if (!is_in_chanlist(iface, chan))
945 iface->scan_cb = acs_scan_complete;
948 iface->acs_num_completed_scans + 1,
949 iface->conf->acs_num_scans);
951 if (hostapd_driver_scan(iface->bss[0], ¶ms) < 0) {
953 acs_cleanup(iface);
963 enum hostapd_chan_status acs_init(struct hostapd_iface *iface)
967 if (iface->drv_flags & WPA_DRIVER_FLAGS_ACS_OFFLOAD) {
969 if (hostapd_drv_do_acs(iface->bss[0]))
974 if (!iface->current_mode)
977 acs_cleanup(iface);
979 if (acs_request_scan(iface) < 0)
982 hostapd_set_state(iface, HAPD_IFACE_ACS);
983 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, ACS_EVENT_STARTED);