diff options
author | Jouni Malinen <j@w1.fi> | 2011-12-03 12:16:03 +0200 |
---|---|---|
committer | Jouni Malinen <j@w1.fi> | 2011-12-03 12:16:03 +0200 |
commit | e5693c4775bae65faa960f80889f98b0a6cb2e1c (patch) | |
tree | dbefe1462df4e816a6c99eb1e442a03c65f53618 /src | |
parent | 5f17b3ee9fdeb50827d48110deb45030f5caab45 (diff) | |
download | external_wpa_supplicant_8_ti-e5693c4775bae65faa960f80889f98b0a6cb2e1c.zip external_wpa_supplicant_8_ti-e5693c4775bae65faa960f80889f98b0a6cb2e1c.tar.gz external_wpa_supplicant_8_ti-e5693c4775bae65faa960f80889f98b0a6cb2e1c.tar.bz2 |
Merge set_rate_sets() driver_ops into set_ap()
Signed-hostap: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'src')
-rw-r--r-- | src/ap/ap_drv_ops.c | 8 | ||||
-rw-r--r-- | src/ap/ap_drv_ops.h | 1 | ||||
-rw-r--r-- | src/ap/beacon.c | 1 | ||||
-rw-r--r-- | src/ap/hostapd.c | 2 | ||||
-rw-r--r-- | src/ap/hostapd.h | 1 | ||||
-rw-r--r-- | src/ap/hw_features.c | 12 | ||||
-rw-r--r-- | src/drivers/driver.h | 16 | ||||
-rw-r--r-- | src/drivers/driver_nl80211.c | 47 |
8 files changed, 36 insertions, 52 deletions
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 484db59..9419440 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -475,14 +475,6 @@ int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr, } -int hostapd_set_rate_sets(struct hostapd_data *hapd, int *basic_rates) -{ - if (hapd->driver == NULL || hapd->driver->set_rate_sets == NULL) - return 0; - return hapd->driver->set_rate_sets(hapd->drv_priv, basic_rates); -} - - int hostapd_set_country(struct hostapd_data *hapd, const char *country) { if (hapd->driver == NULL || diff --git a/src/ap/ap_drv_ops.h b/src/ap/ap_drv_ops.h index 7f8e83a..477a1b7 100644 --- a/src/ap/ap_drv_ops.h +++ b/src/ap/ap_drv_ops.h @@ -66,7 +66,6 @@ int hostapd_set_rts(struct hostapd_data *hapd, int rts); int hostapd_set_frag(struct hostapd_data *hapd, int frag); int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr, int total_flags, int flags_or, int flags_and); -int hostapd_set_rate_sets(struct hostapd_data *hapd, int *basic_rates); int hostapd_set_country(struct hostapd_data *hapd, const char *country); int hostapd_set_tx_queue_params(struct hostapd_data *hapd, int queue, int aifs, int cw_min, int cw_max, int burst_time); diff --git a/src/ap/beacon.c b/src/ap/beacon.c index c9bbfa9..710436f 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -567,6 +567,7 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd) params.tail_len = tail_len; params.dtim_period = hapd->conf->dtim_period; params.beacon_int = hapd->iconf->beacon_int; + params.basic_rates = hapd->iconf->basic_rates; params.ssid = (u8 *) hapd->conf->ssid.ssid; params.ssid_len = hapd->conf->ssid.ssid_len; params.pairwise_ciphers = hapd->conf->rsn_pairwise ? diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index e180a08..8f3be0e 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -291,6 +291,8 @@ static void hostapd_cleanup_iface(struct hostapd_iface *iface) iface->hw_features = NULL; os_free(iface->current_rates); iface->current_rates = NULL; + os_free(iface->basic_rates); + iface->basic_rates = NULL; ap_list_deinit(iface); hostapd_config_free(iface->conf); iface->conf = NULL; diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index c9bec4f..b717b45 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -199,6 +199,7 @@ struct hostapd_iface { * current_mode->channels */ int num_rates; struct hostapd_rate_data *current_rates; + int *basic_rates; int freq; u16 hw_flags; diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index d46e74e..36b7f75 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -126,10 +126,14 @@ int hostapd_prepare_rates(struct hostapd_data *hapd, return -1; } - if (hostapd_set_rate_sets(hapd, basic_rates)) { - wpa_printf(MSG_ERROR, "Failed to update rate sets in kernel " - "module"); - } + i = 0; + while (basic_rates[i] >= 0) + i++; + os_free(hapd->iface->basic_rates); + hapd->iface->basic_rates = os_malloc(i * sizeof(int *)); + if (hapd->iface->basic_rates) + os_memcpy(hapd->iface->basic_rates, basic_rates, + i * sizeof(int *)); os_free(hapd->iface->current_rates); hapd->iface->num_rates = 0; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 816377b..388b405 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -556,6 +556,14 @@ struct wpa_driver_ap_params { int beacon_int; /** + * basic_rates: -1 terminated array of basic rates in 100 kbps + * + * This parameter can be used to set a specific basic rate set for the + * BSS. If %NULL, default basic rate set is used. + */ + int *basic_rates; + + /** * ssid - The SSID to use in Beacon/Probe Response frames */ const u8 *ssid; @@ -1685,14 +1693,6 @@ struct wpa_driver_ops { int total_flags, int flags_or, int flags_and); /** - * set_rate_sets - Set basic rate set (AP only) - * @priv: Private driver interface data - * @basic_rates: -1 terminated array of basic rates in 100 kbps - * Returns: 0 on success, -1 on failure - */ - int (*set_rate_sets)(void *priv, int *basic_rates); - - /** * set_tx_queue_params - Set TX queue parameters * @priv: Private driver interface data * @queue: Queue number (0 = VO, 1 = VI, 2 = BE, 3 = BK) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index d5be4b8..e385e13 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -4285,7 +4285,8 @@ static int wpa_driver_nl80211_send_mlme(void *priv, const u8 *data, static int nl80211_set_bss(struct i802_bss *bss, int cts, int preamble, - int slot, int ht_opmode, int ap_isolate) + int slot, int ht_opmode, int ap_isolate, + int *basic_rates) { struct wpa_driver_nl80211_data *drv = bss->drv; struct nl_msg *msg; @@ -4306,6 +4307,19 @@ static int nl80211_set_bss(struct i802_bss *bss, int cts, int preamble, NLA_PUT_U16(msg, NL80211_ATTR_BSS_HT_OPMODE, ht_opmode); if (ap_isolate >= 0) NLA_PUT_U8(msg, NL80211_ATTR_AP_ISOLATE, ap_isolate); + + if (basic_rates) { + u8 rates[NL80211_MAX_SUPP_RATES]; + u8 rates_len = 0; + int i; + + for (i = 0; i < NL80211_MAX_SUPP_RATES && basic_rates[i] >= 0; + i++) + rates[rates_len++] = basic_rates[i] / 5; + + NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, rates_len, rates); + } + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname)); return send_and_recv_msgs(drv, msg, NULL, NULL); @@ -4447,7 +4461,7 @@ static int wpa_driver_nl80211_set_ap(void *priv, bss->beacon_set = 1; nl80211_set_bss(bss, params->cts_protect, params->preamble, params->short_slot_time, params->ht_opmode, - params->isolate); + params->isolate, params->basic_rates); } return ret; nla_put_failure: @@ -6017,34 +6031,6 @@ static int i802_get_seqnum(const char *iface, void *priv, const u8 *addr, } -static int i802_set_rate_sets(void *priv, int *basic_rates) -{ - struct i802_bss *bss = priv; - struct wpa_driver_nl80211_data *drv = bss->drv; - struct nl_msg *msg; - u8 rates[NL80211_MAX_SUPP_RATES]; - u8 rates_len = 0; - int i; - - msg = nlmsg_alloc(); - if (!msg) - return -ENOMEM; - - nl80211_cmd(drv, msg, 0, NL80211_CMD_SET_BSS); - - for (i = 0; i < NL80211_MAX_SUPP_RATES && basic_rates[i] >= 0; i++) - rates[rates_len++] = basic_rates[i] / 5; - - NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, rates_len, rates); - - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname)); - - return send_and_recv_msgs(drv, msg, NULL, NULL); - nla_put_failure: - return -ENOBUFS; -} - - static int i802_set_rts(void *priv, int rts) { struct i802_bss *bss = priv; @@ -7864,7 +7850,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = { .set_frag = i802_set_frag, .set_tx_queue_params = i802_set_tx_queue_params, .set_sta_vlan = i802_set_sta_vlan, - .set_rate_sets = i802_set_rate_sets, .sta_deauth = i802_sta_deauth, .sta_disassoc = i802_sta_disassoc, #endif /* HOSTAPD || CONFIG_AP */ |