Browse Source

Merge set_rate_sets() driver_ops into set_ap()

Signed-hostap: Jouni Malinen <j@w1.fi>
Jouni Malinen 13 years ago
parent
commit
e5693c4775
8 changed files with 36 additions and 52 deletions
  1. 0 8
      src/ap/ap_drv_ops.c
  2. 0 1
      src/ap/ap_drv_ops.h
  3. 1 0
      src/ap/beacon.c
  4. 2 0
      src/ap/hostapd.c
  5. 1 0
      src/ap/hostapd.h
  6. 8 4
      src/ap/hw_features.c
  7. 8 8
      src/drivers/driver.h
  8. 16 31
      src/drivers/driver_nl80211.c

+ 0 - 8
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 ||

+ 0 - 1
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);

+ 1 - 0
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 ?

+ 2 - 0
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;

+ 1 - 0
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;

+ 8 - 4
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;

+ 8 - 8
src/drivers/driver.h

@@ -555,6 +555,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
 	 */
@@ -1684,14 +1692,6 @@ struct wpa_driver_ops {
 	int (*sta_set_flags)(void *priv, const u8 *addr,
 			     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

+ 16 - 31
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 */