int hostapd_get_hw_features(struct hostapd_iface *iface) { struct hostapd_data *hapd = iface->bss[0]; int ret = 0, i, j; u16 num_modes, flags; struct hostapd_hw_modes *modes; if (hostapd_drv_none(hapd)) return -1; modes = hostapd_get_hw_feature_data(hapd, &num_modes, &flags); if (modes == NULL) { hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "Fetching hardware channel/rate support not " "supported."); return -1; } iface->hw_flags = flags; hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); iface->hw_features = modes; iface->num_hw_features = num_modes; for (i = 0; i < num_modes; i++) { struct hostapd_hw_modes *feature = &modes[i]; /* set flag for channels we can use in current regulatory * domain */ for (j = 0; j < feature->num_channels; j++) { /* * Disable all channels that are marked not to allow * IBSS operation or active scanning. In addition, * disable all channels that require radar detection, * since that (in addition to full DFS) is not yet * supported. */ if (feature->channels[j].flag & (HOSTAPD_CHAN_NO_IBSS | HOSTAPD_CHAN_PASSIVE_SCAN | HOSTAPD_CHAN_RADAR)) feature->channels[j].flag |= HOSTAPD_CHAN_DISABLED; if (feature->channels[j].flag & HOSTAPD_CHAN_DISABLED) continue; wpa_printf(MSG_MSGDUMP, "Allowed channel: mode=%d " "chan=%d freq=%d MHz max_tx_power=%d dBm", feature->mode, feature->channels[j].chan, feature->channels[j].freq, feature->channels[j].max_tx_power); } } return ret; }
int hostapd_get_hw_features(struct hostapd_iface *iface) { struct hostapd_data *hapd = iface->bss[0]; int ret = 0, i, j; u16 num_modes, flags; struct hostapd_hw_modes *modes; if(! hapd) return -1 ; modes = hostapd_get_hw_feature_data(hapd, &num_modes, &flags); if (modes == NULL) { hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "Fetching hardware channel/rate support not " "supported."); return -1; } iface->hw_flags = flags; hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); iface->hw_features = modes; iface->num_hw_features = num_modes; for (i = 0; i < num_modes; i++) { struct hostapd_hw_modes *feature = &modes[i]; /* set flag for channels we can use in current regulatory * domain */ for (j = 0; j < feature->num_channels; j++) { /* TODO: add regulatory domain lookup */ unsigned char power_level = 0; unsigned char antenna_max = 0; if ((feature->mode == HOSTAPD_MODE_IEEE80211G || feature->mode == HOSTAPD_MODE_IEEE80211B) && feature->channels[j].chan >= 1 && feature->channels[j].chan <= 11) { power_level = 20; feature->channels[j].flag |= HOSTAPD_CHAN_W_SCAN; } else feature->channels[j].flag &= ~HOSTAPD_CHAN_W_SCAN; hostapd_set_channel_flag(hapd, feature->mode, feature->channels[j].chan, feature->channels[j].flag, power_level, antenna_max); } } return ret; }
int hostapd_get_hw_features(struct hostapd_iface *iface) { struct hostapd_data *hapd = iface->bss[0]; int i, j; u16 num_modes, flags; struct hostapd_hw_modes *modes; if (hostapd_drv_none(hapd)) { return -1; } modes = hostapd_get_hw_feature_data(hapd, &num_modes, &flags); if (modes == NULL) { hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "Fetching hardware channel/rate support not " "supported."); return -1; } iface->hw_flags = flags; hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); iface->hw_features = modes; iface->num_hw_features = num_modes; for (i = 0; i < num_modes; i++) { struct hostapd_hw_modes *feature = &modes[i]; int dfs_enabled = hapd->iconf->ieee80211h && (iface->drv_flags & WPA_DRIVER_FLAGS_RADAR); /* set flag for channels we can use in current regulatory * domain */ for (j = 0; j < feature->num_channels; j++) { int dfs = 0; /* * Disable all channels that are marked not to allow * to initiate radiation (a.k.a. passive scan and no * IBSS). * Use radar channels only if the driver supports DFS. */ if ((feature->channels[j].flag & HOSTAPD_CHAN_RADAR) && dfs_enabled) { dfs = 1; } else if (((feature->channels[j].flag & HOSTAPD_CHAN_RADAR) && !(iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD)) || (feature->channels[j].flag & HOSTAPD_CHAN_NO_IR)) { feature->channels[j].flag |= HOSTAPD_CHAN_DISABLED; } if (feature->channels[j].flag & HOSTAPD_CHAN_DISABLED) { continue; } wpa_printf(MSG_MSGDUMP, "Allowed channel: mode=%d " "chan=%d freq=%d MHz max_tx_power=%d dBm%s", feature->mode, feature->channels[j].chan, feature->channels[j].freq, feature->channels[j].max_tx_power, dfs ? dfs_info(&feature->channels[j]) : ""); } } return 0; }