From fb7842aa5131c9a0b5e044432c4030e71e04918b Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Wed, 9 Dec 2009 21:57:50 +0200 Subject: [PATCH] Remove struct hostapd_rate_data from driver API In addition to the bitrate, the only other variable in this structure is used internally in hostapd. Move this structure into hostapd.h and make the driver API use simpler data structure (array of bitrates). --- hostapd/hostapd.h | 8 ++++++++ hostapd/hw_features.c | 10 ++++------ src/drivers/driver.h | 9 +-------- src/drivers/driver_hostap.c | 10 +++++----- src/drivers/driver_nl80211.c | 14 ++++++-------- src/drivers/driver_test.c | 12 ++++++------ wpa_supplicant/mlme.c | 19 +++++++------------ wpa_supplicant/wpa_supplicant_i.h | 2 +- 8 files changed, 38 insertions(+), 46 deletions(-) diff --git a/hostapd/hostapd.h b/hostapd/hostapd.h index 3c378b7f0..7200c2595 100644 --- a/hostapd/hostapd.h +++ b/hostapd/hostapd.h @@ -31,6 +31,14 @@ struct hostapd_probereq_cb { void *ctx; }; +#define HOSTAPD_RATE_BASIC 0x00000001 + +struct hostapd_rate_data { + int rate; /* rate in 100 kbps */ + int flags; /* HOSTAPD_RATE_ flags */ +}; + + /** * struct hostapd_data - hostapd per-BSS data structure */ diff --git a/hostapd/hw_features.c b/hostapd/hw_features.c index fd1514e1d..ef1e174c8 100644 --- a/hostapd/hw_features.c +++ b/hostapd/hw_features.c @@ -135,7 +135,7 @@ static int hostapd_prepare_rates(struct hostapd_data *hapd, hapd->iface->num_rates = 0; hapd->iface->current_rates = - os_malloc(mode->num_rates * sizeof(struct hostapd_rate_data)); + 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."); @@ -147,17 +147,15 @@ static int hostapd_prepare_rates(struct hostapd_data *hapd, if (hapd->iconf->supported_rates && !hostapd_rate_found(hapd->iconf->supported_rates, - mode->rates[i].rate)) + mode->rates[i])) continue; rate = &hapd->iface->current_rates[hapd->iface->num_rates]; - os_memcpy(rate, &mode->rates[i], - sizeof(struct hostapd_rate_data)); + rate->rate = mode->rates[i]; if (hostapd_rate_found(basic_rates, rate->rate)) { rate->flags |= HOSTAPD_RATE_BASIC; num_basic_rates++; - } else - rate->flags &= ~HOSTAPD_RATE_BASIC; + } wpa_printf(MSG_DEBUG, "RATE[%d] rate=%d flags=0x%x", hapd->iface->num_rates, rate->rate, rate->flags); hapd->iface->num_rates++; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 36a521c85..8678750a9 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -31,19 +31,12 @@ struct hostapd_channel_data { u8 max_tx_power; /* maximum transmit power in dBm */ }; -#define HOSTAPD_RATE_BASIC 0x00000002 - -struct hostapd_rate_data { - int rate; /* rate in 100 kbps */ - int flags; /* HOSTAPD_RATE_ flags for internal use */ -}; - struct hostapd_hw_modes { hostapd_hw_mode mode; int num_channels; struct hostapd_channel_data *channels; int num_rates; - struct hostapd_rate_data *rates; + int *rates; /* array of rates in 100 kbps units */ u16 ht_capab; u8 mcs_set[16]; u8 a_mpdu_params; diff --git a/src/drivers/driver_hostap.c b/src/drivers/driver_hostap.c index f91b5cd1b..f470568c3 100644 --- a/src/drivers/driver_hostap.c +++ b/src/drivers/driver_hostap.c @@ -1193,7 +1193,7 @@ static struct hostapd_hw_modes * hostap_get_hw_feature_data(void *priv, mode->num_rates = 4; clen = mode->num_channels * sizeof(struct hostapd_channel_data); - rlen = mode->num_rates * sizeof(struct hostapd_rate_data); + rlen = mode->num_rates * sizeof(int); mode->channels = os_zalloc(clen); mode->rates = os_zalloc(rlen); @@ -1212,10 +1212,10 @@ static struct hostapd_hw_modes * hostap_get_hw_feature_data(void *priv, mode->channels[i].flag = HOSTAPD_CHAN_DISABLED; } - mode->rates[0].rate = 10; - mode->rates[1].rate = 20; - mode->rates[2].rate = 55; - mode->rates[3].rate = 110; + mode->rates[0] = 10; + mode->rates[1] = 20; + mode->rates[2] = 55; + mode->rates[3] = 110; return mode; } diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 26e4758f5..91757b120 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -2376,7 +2376,7 @@ static int phy_info_handler(struct nl_msg *msg, void *arg) mode->num_rates++; } - mode->rates = calloc(mode->num_rates, sizeof(struct hostapd_rate_data)); + mode->rates = calloc(mode->num_rates, sizeof(int)); if (!mode->rates) return NL_SKIP; @@ -2387,11 +2387,11 @@ static int phy_info_handler(struct nl_msg *msg, void *arg) nla_len(nl_rate), rate_policy); if (!tb_rate[NL80211_BITRATE_ATTR_RATE]) continue; - mode->rates[idx].rate = nla_get_u32(tb_rate[NL80211_BITRATE_ATTR_RATE]); + mode->rates[idx] = nla_get_u32(tb_rate[NL80211_BITRATE_ATTR_RATE]); /* crude heuristic */ if (mode->mode == HOSTAPD_MODE_IEEE80211B && - mode->rates[idx].rate > 200) + mode->rates[idx] > 200) mode->mode = HOSTAPD_MODE_IEEE80211G; idx++; @@ -2444,7 +2444,7 @@ wpa_driver_nl80211_add_11b(struct hostapd_hw_modes *modes, u16 *num_modes) mode11g->num_channels * sizeof(struct hostapd_channel_data)); mode->num_rates = 0; - mode->rates = os_malloc(4 * sizeof(struct hostapd_rate_data)); + mode->rates = os_malloc(4 * sizeof(int)); if (mode->rates == NULL) { os_free(mode->channels); (*num_modes)--; @@ -2452,10 +2452,8 @@ wpa_driver_nl80211_add_11b(struct hostapd_hw_modes *modes, u16 *num_modes) } for (i = 0; i < mode11g->num_rates; i++) { - if (mode11g->rates[i].rate != 10 && - mode11g->rates[i].rate != 20 && - mode11g->rates[i].rate != 55 && - mode11g->rates[i].rate != 110) + if (mode11g->rates[i] != 10 && mode11g->rates[i] != 20 && + mode11g->rates[i] != 55 && mode11g->rates[i] != 110) continue; mode->rates[mode->num_rates] = mode11g->rates[i]; mode->num_rates++; diff --git a/src/drivers/driver_test.c b/src/drivers/driver_test.c index bcfa2c4b6..c6147a650 100644 --- a/src/drivers/driver_test.c +++ b/src/drivers/driver_test.c @@ -2413,37 +2413,37 @@ wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags) modes[0].num_channels = 1; modes[0].num_rates = 1; modes[0].channels = os_zalloc(sizeof(struct hostapd_channel_data)); - modes[0].rates = os_zalloc(sizeof(struct hostapd_rate_data)); + modes[0].rates = os_zalloc(sizeof(int)); if (modes[0].channels == NULL || modes[0].rates == NULL) goto fail; modes[0].channels[0].chan = 1; modes[0].channels[0].freq = 2412; modes[0].channels[0].flag = 0; - modes[0].rates[0].rate = 10; + modes[0].rates[0] = 10; modes[1].mode = HOSTAPD_MODE_IEEE80211B; modes[1].num_channels = 1; modes[1].num_rates = 1; modes[1].channels = os_zalloc(sizeof(struct hostapd_channel_data)); - modes[1].rates = os_zalloc(sizeof(struct hostapd_rate_data)); + modes[1].rates = os_zalloc(sizeof(int)); if (modes[1].channels == NULL || modes[1].rates == NULL) goto fail; modes[1].channels[0].chan = 1; modes[1].channels[0].freq = 2412; modes[1].channels[0].flag = 0; - modes[1].rates[0].rate = 10; + modes[1].rates[0] = 10; modes[2].mode = HOSTAPD_MODE_IEEE80211A; modes[2].num_channels = 1; modes[2].num_rates = 1; modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data)); - modes[2].rates = os_zalloc(sizeof(struct hostapd_rate_data)); + modes[2].rates = os_zalloc(sizeof(int)); if (modes[2].channels == NULL || modes[2].rates == NULL) goto fail; modes[2].channels[0].chan = 60; modes[2].channels[0].freq = 5300; modes[2].channels[0].flag = 0; - modes[2].rates[0].rate = 60; + modes[2].rates[0] = 60; return modes; diff --git a/wpa_supplicant/mlme.c b/wpa_supplicant/mlme.c index 898a707a8..c71cdd317 100644 --- a/wpa_supplicant/mlme.c +++ b/wpa_supplicant/mlme.c @@ -391,20 +391,16 @@ static void ieee80211_send_assoc(struct wpa_supplicant *wpa_s) blen += len + 2; *pos++ = WLAN_EID_SUPP_RATES; *pos++ = len; - for (i = 0; i < len; i++) { - int rate = wpa_s->mlme.curr_rates[i].rate; - *pos++ = (u8) (rate / 5); - } + for (i = 0; i < len; i++) + *pos++ = (u8) (wpa_s->mlme.curr_rates[i] / 5); if (wpa_s->mlme.num_curr_rates > len) { pos = buf + blen; blen += wpa_s->mlme.num_curr_rates - len + 2; *pos++ = WLAN_EID_EXT_SUPP_RATES; *pos++ = wpa_s->mlme.num_curr_rates - len; - for (i = len; i < wpa_s->mlme.num_curr_rates; i++) { - int rate = wpa_s->mlme.curr_rates[i].rate; - *pos++ = (u8) (rate / 5); - } + for (i = len; i < wpa_s->mlme.num_curr_rates; i++) + *pos++ = (u8) (wpa_s->mlme.curr_rates[i] / 5); } if (wpa_s->mlme.extra_ie && wpa_s->mlme.auth_alg != WLAN_AUTH_FT) { @@ -671,7 +667,6 @@ static void ieee80211_send_probe_req(struct wpa_supplicant *wpa_s, supp_rates[0] = WLAN_EID_SUPP_RATES; supp_rates[1] = 0; for (i = 0; i < wpa_s->mlme.num_curr_rates; i++) { - struct hostapd_rate_data *rate = &wpa_s->mlme.curr_rates[i]; if (esupp_rates) { pos = buf + len; len++; @@ -687,7 +682,7 @@ static void ieee80211_send_probe_req(struct wpa_supplicant *wpa_s, len++; supp_rates[1]++; } - *pos++ = rate->rate / 5; + *pos++ = wpa_s->mlme.curr_rates[i] / 5; } if (wpa_s->mlme.extra_probe_ie) { @@ -2399,7 +2394,7 @@ static int ieee80211_sta_join_ibss(struct wpa_supplicant *wpa_s, if (local->conf.phymode == MODE_ATHEROS_TURBO) rate *= 2; for (j = 0; j < local->num_curr_rates; j++) - if (local->curr_rates[j].rate == rate) + if (local->curr_rates[j] == rate) rates |= BIT(j); } wpa_s->mlme.supp_rates_bits = rates; @@ -2468,7 +2463,7 @@ static int ieee80211_sta_create_ibss(struct wpa_supplicant *wpa_s) pos = bss->supp_rates; #if 0 /* FIX */ for (i = 0; i < local->num_curr_rates; i++) { - int rate = local->curr_rates[i].rate; + int rate = local->curr_rates[i]; if (local->conf.phymode == MODE_ATHEROS_TURBO) rate /= 2; *pos++ = (u8) (rate / 5); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 177380e13..377f4c82b 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -275,7 +275,7 @@ struct wpa_client_mlme { unsigned int hw_modes; /* bitfield of allowed hardware modes; * (1 << HOSTAPD_MODE_*) */ int num_curr_rates; - struct hostapd_rate_data *curr_rates; + int *curr_rates; int freq; /* The current frequency in MHz */ int channel; /* The current IEEE 802.11 channel number */