static int hostapd_prepare_rates(struct hostapd_data *hapd, struct hostapd_hw_modes *mode) { int i, num_basic_rates = 0; int basic_rates_a[] = { 60, 120, 240, -1 }; int basic_rates_b[] = { 10, 20, -1 }; int basic_rates_g[] = { 10, 20, 55, 110, -1 }; int *basic_rates; if (hapd->iconf->basic_rates) basic_rates = hapd->iconf->basic_rates; else switch (mode->mode) { case HOSTAPD_MODE_IEEE80211A: basic_rates = basic_rates_a; break; case HOSTAPD_MODE_IEEE80211B: basic_rates = basic_rates_b; break; case HOSTAPD_MODE_IEEE80211G: basic_rates = basic_rates_g; break; default: return -1; } if (hostapd_set_rate_sets(hapd, hapd->iconf->supported_rates, basic_rates, mode->mode)) { printf("Failed to update rate sets in kernel module\n"); } VM_FREE(hapd->iface->current_rates); hapd->iface->num_rates = 0; hapd->iface->current_rates = VM_MALLOC(mode->num_rates * sizeof(struct hostapd_rate_data)); if (!hapd->iface->current_rates) { printf("Failed to allocate memory for rate table.\n"); return -1; } for (i = 0; i < mode->num_rates; i++) { struct hostapd_rate_data *rate; if (hapd->iconf->supported_rates && !hostapd_rate_found(hapd->iconf->supported_rates, mode->rates[i].rate)) continue; rate = &hapd->iface->current_rates[hapd->iface->num_rates]; memcpy(rate, &mode->rates[i], sizeof(struct hostapd_rate_data)); if (hostapd_rate_found(basic_rates, rate->rate)) { rate->flags |= HOSTAPD_RATE_BASIC; num_basic_rates++; } else rate->flags &= ~HOSTAPD_RATE_BASIC; HOSTAPD_DEBUG(HOSTAPD_DEBUG_MINIMAL, "RATE[%d] rate=%d flags=0x%x\n", hapd->iface->num_rates, rate->rate, rate->flags); hapd->iface->num_rates++; } if (hapd->iface->num_rates == 0 || num_basic_rates == 0) { printf("No rates remaining in supported/basic rate sets " "(%d,%d).\n", hapd->iface->num_rates, num_basic_rates); return -1; } return 0; }
int hostapd_prepare_rates(struct hostapd_iface *iface, struct hostapd_hw_modes *mode) { int i, num_basic_rates = 0; int basic_rates_a[] = { 60, 120, 240, -1 }; int basic_rates_b[] = { 10, 20, -1 }; int basic_rates_g[] = { 10, 20, 55, 110, -1 }; int *basic_rates; if (iface->conf->basic_rates) basic_rates = iface->conf->basic_rates; else switch (mode->mode) { case HOSTAPD_MODE_IEEE80211A: basic_rates = basic_rates_a; break; case HOSTAPD_MODE_IEEE80211B: basic_rates = basic_rates_b; break; case HOSTAPD_MODE_IEEE80211G: basic_rates = basic_rates_g; break; case HOSTAPD_MODE_IEEE80211AD: return 0; /* No basic rates for 11ad */ default: return -1; } i = 0; while (basic_rates[i] >= 0) i++; if (i) i++; /* -1 termination */ os_free(iface->basic_rates); iface->basic_rates = os_malloc(i * sizeof(int)); if (iface->basic_rates) os_memcpy(iface->basic_rates, basic_rates, i * sizeof(int)); os_free(iface->current_rates); iface->num_rates = 0; iface->current_rates = os_calloc(mode->num_rates, sizeof(struct hostapd_rate_data)); if (!iface->current_rates) { wpa_printf(MSG_ERROR, "Failed to allocate memory for rate " "table."); return -1; } for (i = 0; i < mode->num_rates; i++) { struct hostapd_rate_data *rate; if (iface->conf->supported_rates && !hostapd_rate_found(iface->conf->supported_rates, mode->rates[i])) continue; rate = &iface->current_rates[iface->num_rates]; rate->rate = mode->rates[i]; if (hostapd_rate_found(basic_rates, rate->rate)) { rate->flags |= HOSTAPD_RATE_BASIC; num_basic_rates++; } wpa_printf(MSG_DEBUG, "RATE[%d] rate=%d flags=0x%x", iface->num_rates, rate->rate, rate->flags); iface->num_rates++; } if ((iface->num_rates == 0 || num_basic_rates == 0) && (!iface->conf->ieee80211n || !iface->conf->require_ht)) { wpa_printf(MSG_ERROR, "No rates remaining in supported/basic " "rate sets (%d,%d).", iface->num_rates, num_basic_rates); return -1; } return 0; }
static int hostapd_prepare_rates(struct hostapd_data *hapd, struct hostapd_hw_modes *mode) { int i, num_basic_rates = 0; int basic_rates_a[] = { 60, 120, 240, -1 }; int basic_rates_b[] = { 10, 20, -1 }; int basic_rates_g[] = { 10, 20, 55, 110, -1 }; int *basic_rates; if (hapd->iconf->basic_rates) basic_rates = hapd->iconf->basic_rates; else switch (mode->mode) { case HOSTAPD_MODE_IEEE80211A: basic_rates = basic_rates_a; break; case HOSTAPD_MODE_IEEE80211B: basic_rates = basic_rates_b; break; case HOSTAPD_MODE_IEEE80211G: basic_rates = basic_rates_g; break; default: return -1; } if (hostapd_set_rate_sets(hapd, hapd->iconf->supported_rates, basic_rates, mode->mode)) { wpa_printf(MSG_ERROR, "Failed to update rate sets in kernel " "module"); } os_free(hapd->iface->current_rates); hapd->iface->num_rates = 0; hapd->iface->current_rates = os_zalloc(mode->num_rates * sizeof(struct hostapd_rate_data)); if (!hapd->iface->current_rates) { wpa_printf(MSG_ERROR, "Failed to allocate memory for rate " "table."); return -1; } for (i = 0; i < mode->num_rates; i++) { struct hostapd_rate_data *rate; if (hapd->iconf->supported_rates && !hostapd_rate_found(hapd->iconf->supported_rates, mode->rates[i])) continue; rate = &hapd->iface->current_rates[hapd->iface->num_rates]; rate->rate = mode->rates[i]; if (hostapd_rate_found(basic_rates, rate->rate)) { rate->flags |= HOSTAPD_RATE_BASIC; num_basic_rates++; } wpa_printf(MSG_DEBUG, "RATE[%d] rate=%d flags=0x%x", hapd->iface->num_rates, rate->rate, rate->flags); hapd->iface->num_rates++; } if (hapd->iface->num_rates == 0 || num_basic_rates == 0) { wpa_printf(MSG_ERROR, "No rates remaining in supported/basic " "rate sets (%d,%d).", hapd->iface->num_rates, num_basic_rates); return -1; } return 0; }