/** * reload_hw_mode_done - Callback for after the HW mode is setup * @hapd_iface: Pointer to interface data. * @status: Status of the HW mode setup. */ static void reload_hw_mode_done(struct hostapd_iface *hapd_iface, int status) { struct hostapd_data *hapd = hapd_iface->bss[0]; struct hostapd_config_change *change = hapd_iface->change; struct hostapd_config *newconf = change->newconf; hostapd_iface_cb cb; int freq; if (status) { printf("Failed to select hw_mode.\n"); cb = hapd_iface->reload_iface_cb; hapd_iface->reload_iface_cb = NULL; cb(hapd_iface, -1); return; } freq = hostapd_hw_get_freq(hapd, newconf->channel); HOSTAPD_DEBUG(HOSTAPD_DEBUG_MINIMAL, "Mode: %s Channel: %d Frequency: %d MHz\n", hostapd_hw_mode_txt(newconf->hw_mode), newconf->channel, freq); if (hostapd_set_freq(hapd, newconf->hw_mode, freq)) { printf("Could not set channel %d (%d MHz) for kernel " "driver\n", newconf->channel, freq); } change->beacon_changed++; reload_iface2(hapd_iface); }
/** * select_hw_mode1 - Select the hardware mode (part 1) * @iface: Pointer to interface data. * Returns: 0 on success; -1 on failure. * * Setup the hardware mode and channel based on the configuration. * Schedules select_hw_mode2() to be called immediately or after automatic * channel selection takes place. */ static int select_hw_mode1(struct hostapd_iface *iface) { int i, j, ok; if (iface->num_hw_features < 1) return -1; iface->current_mode = NULL; for (i = 0; i < iface->num_hw_features; i++) { struct hostapd_hw_modes *mode = &iface->hw_features[i]; if (mode->mode == (int) iface->conf->hw_mode) { iface->current_mode = mode; break; } } if (iface->current_mode == NULL) { printf("Hardware does not support configured mode\n"); #if 0 hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured mode " "(%d)", (int) iface->conf->hw_mode); #endif return -1; } ok = 0; for (j = 0; j < iface->current_mode->num_channels; j++) { struct hostapd_channel_data *chan = &iface->current_mode->channels[j]; if ((chan->flag & HOSTAPD_CHAN_W_SCAN) && (chan->chan == iface->conf->channel)) { ok = 1; break; } } if (ok == 0 && iface->conf->channel != 0) { #if 0 hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Configured channel (%d) not found from the " "channel list of current mode (%d) %s", iface->conf->channel, iface->current_mode->mode, hostapd_hw_mode_txt(iface->current_mode->mode)); #endif iface->current_mode = NULL; } /* * Calls select_hw_mode2() via a handler, so that the function is * always executed from eloop. */ eloop_register_timeout(0, 0, select_hw_mode2_handler, iface, NULL); return 0; }
static void hostapd_notify_bad_chans(struct hostapd_iface *iface) { iface->current_mode = NULL; hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Configured channel (%d) not found from the " "channel list of current mode (%d) %s", iface->conf->channel, iface->current_mode->mode, hostapd_hw_mode_txt(iface->current_mode->mode)); hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured channel"); }
/** * hostapd_select_hw_mode - Select the hardware mode * @iface: Pointer to interface data. * Returns: 0 on success, < 0 on failure * * Sets up the hardware mode, channel, rates, and passive scanning * based on the configuration. */ int hostapd_select_hw_mode(struct hostapd_iface *iface) { int i, j, ok; if (iface->num_hw_features < 1) return -1; iface->current_mode = NULL; for (i = 0; i < iface->num_hw_features; i++) { struct hostapd_hw_modes *mode = &iface->hw_features[i]; if (mode->mode == iface->conf->hw_mode) { iface->current_mode = mode; break; } } if (iface->current_mode == NULL) { wpa_printf(MSG_ERROR, "Hardware does not support configured " "mode"); hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured mode " "(%d) (hw_mode in hostapd.conf)", (int) iface->conf->hw_mode); return -2; } ok = 0; for (j = 0; j < iface->current_mode->num_channels; j++) { struct hostapd_channel_data *chan = &iface->current_mode->channels[j]; if (chan->chan == iface->conf->channel) { if (chan->flag & HOSTAPD_CHAN_DISABLED) { wpa_printf(MSG_ERROR, "channel [%i] (%i) is disabled for " "use in AP mode, flags: 0x%x%s%s%s", j, chan->chan, chan->flag, chan->flag & HOSTAPD_CHAN_NO_IBSS ? " NO-IBSS" : "", chan->flag & HOSTAPD_CHAN_PASSIVE_SCAN ? " PASSIVE-SCAN" : "", chan->flag & HOSTAPD_CHAN_RADAR ? " RADAR" : ""); } else { ok = 1; break; } } } if (ok && iface->conf->secondary_channel) { int sec_ok = 0; int sec_chan = iface->conf->channel + iface->conf->secondary_channel * 4; for (j = 0; j < iface->current_mode->num_channels; j++) { struct hostapd_channel_data *chan = &iface->current_mode->channels[j]; if (!(chan->flag & HOSTAPD_CHAN_DISABLED) && (chan->chan == sec_chan)) { sec_ok = 1; break; } } if (!sec_ok) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Configured HT40 secondary channel " "(%d) not found from the channel list " "of current mode (%d) %s", sec_chan, iface->current_mode->mode, hostapd_hw_mode_txt( iface->current_mode->mode)); ok = 0; } } if (iface->conf->channel == 0) { /* TODO: could request a scan of neighboring BSSes and select * the channel automatically */ wpa_printf(MSG_ERROR, "Channel not configured " "(hw_mode/channel in hostapd.conf)"); return -3; } if (ok == 0 && iface->conf->channel != 0) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Configured channel (%d) not found from the " "channel list of current mode (%d) %s", iface->conf->channel, iface->current_mode->mode, hostapd_hw_mode_txt(iface->current_mode->mode)); iface->current_mode = NULL; } if (iface->current_mode == NULL) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured channel"); return -4; } return 0; }
/** * hostapd_select_hw_mode - Select the hardware mode * @iface: Pointer to interface data. * Returns: 0 on success, -1 on failure * * Sets up the hardware mode, channel, rates, and passive scanning * based on the configuration. */ int hostapd_select_hw_mode(struct hostapd_iface *iface) { int i, j, ok, ret; if (iface->num_hw_features < 1) return -1; iface->current_mode = NULL; for (i = 0; i < iface->num_hw_features; i++) { struct hostapd_hw_modes *mode = &iface->hw_features[i]; if (mode->mode == (int) iface->conf->hw_mode) { iface->current_mode = mode; break; } } if (iface->current_mode == NULL) { wpa_printf(MSG_ERROR, "Hardware does not support configured " "mode"); hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured mode " "(%d)", (int) iface->conf->hw_mode); return -1; } ok = 0; for (j = 0; j < iface->current_mode->num_channels; j++) { struct hostapd_channel_data *chan = &iface->current_mode->channels[j]; if (!(chan->flag & HOSTAPD_CHAN_DISABLED) && (chan->chan == iface->conf->channel)) { ok = 1; break; } } if (ok == 0 && iface->conf->channel != 0) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Configured channel (%d) not found from the " "channel list of current mode (%d) %s", iface->conf->channel, iface->current_mode->mode, hostapd_hw_mode_txt(iface->current_mode->mode)); iface->current_mode = NULL; } if (iface->current_mode == NULL) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured channel"); return -1; } if (hostapd_prepare_rates(iface->bss[0], iface->current_mode)) { wpa_printf(MSG_ERROR, "Failed to prepare rates table."); hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Failed to prepare rates table."); return -1; } ret = hostapd_passive_scan(iface->bss[0], 0, iface->conf->passive_scan_mode, iface->conf->passive_scan_interval, iface->conf->passive_scan_listen, NULL, NULL); if (ret) { if (ret == -1) { wpa_printf(MSG_DEBUG, "Passive scanning not " "supported"); } else { wpa_printf(MSG_ERROR, "Could not set passive " "scanning: %s", strerror(ret)); } ret = 0; } return ret; }
/** * hostapd_select_hw_mode - Select the hardware mode * @iface: Pointer to interface data. * Returns: 0 on success, -1 on failure * * Sets up the hardware mode, channel, rates, and passive scanning * based on the configuration. */ int hostapd_select_hw_mode(struct hostapd_iface *iface) { int i, j, ok; if (iface->num_hw_features < 1) return -1; iface->current_mode = NULL; for (i = 0; i < iface->num_hw_features; i++) { struct hostapd_hw_modes *mode = &iface->hw_features[i]; if (mode->mode == iface->conf->hw_mode) { iface->current_mode = mode; break; } } if (iface->current_mode == NULL) { wpa_printf(MSG_ERROR, "Hardware does not support configured " "mode"); hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured mode " "(%d)", (int) iface->conf->hw_mode); return -1; } ok = 0; for (j = 0; j < iface->current_mode->num_channels; j++) { struct hostapd_channel_data *chan = &iface->current_mode->channels[j]; if (!(chan->flag & HOSTAPD_CHAN_DISABLED) && (chan->chan == iface->conf->channel)) { ok = 1; break; } } if (iface->conf->channel == 0) { /* TODO: could request a scan of neighboring BSSes and select * the channel automatically */ wpa_printf(MSG_ERROR, "Channel not configured " "(hw_mode/channel in hostapd.conf)"); return -1; } if (ok == 0 && iface->conf->channel != 0) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Configured channel (%d) not found from the " "channel list of current mode (%d) %s", iface->conf->channel, iface->current_mode->mode, hostapd_hw_mode_txt(iface->current_mode->mode)); iface->current_mode = NULL; } if (iface->current_mode == NULL) { hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Hardware does not support configured channel"); return -1; } if (hostapd_prepare_rates(iface->bss[0], iface->current_mode)) { wpa_printf(MSG_ERROR, "Failed to prepare rates table."); hostapd_logger(iface->bss[0], NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_WARNING, "Failed to prepare rates table."); return -1; } return 0; }