From 4bb69d15477e0f2b00e166845341dc933de47c58 Mon Sep 17 00:00:00 2001 From: Antonio Quartulli Date: Sun, 3 Jun 2012 18:22:56 +0200 Subject: [PATCHv2 601/602] wpa_supplicant: add new config params to be used with the ibss join command Signed-hostap: Antonio Quartulli --- src/drivers/driver.h | 6 +++ wpa_supplicant/config.c | 96 +++++++++++++++++++++++++++++++++++++++ wpa_supplicant/config_ssid.h | 6 +++ wpa_supplicant/wpa_supplicant.c | 23 +++++++--- 4 files changed, 124 insertions(+), 7 deletions(-) --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -19,6 +19,7 @@ #define WPA_SUPPLICANT_DRIVER_VERSION 4 +#include "drivers/nl80211_copy.h" #include "common/defs.h" #include "common/ieee802_11_defs.h" #include "common/wpa_common.h" @@ -851,6 +852,9 @@ struct wpa_driver_associate_params { * responsible for selecting with which BSS to associate. */ const u8 *bssid; + unsigned char rates[NL80211_MAX_SUPP_RATES]; + int mcast_rate; + /** * bssid_hint - BSSID of a proposed AP * --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -17,6 +17,7 @@ #include "rsn_supp/wpa.h" #include "eap_peer/eap.h" #include "p2p/p2p.h" +#include "drivers/nl80211_copy.h" #include "fst/fst.h" #include "config.h" @@ -1909,7 +1910,6 @@ static int wpa_config_parse_wep_key1(con value, 1); } - static int wpa_config_parse_wep_key2(const struct parse_data *data, struct wpa_ssid *ssid, int line, const char *value) @@ -1970,6 +1970,98 @@ static char * wpa_config_write_wep_key3( #endif /* CONFIG_WEP */ +static int wpa_config_parse_mcast_rate(const struct parse_data *data, + struct wpa_ssid *ssid, int line, + const char *value) +{ + ssid->mcast_rate = (int)(strtod(value, NULL) * 10); + + return 0; +} + +#ifndef NO_CONFIG_WRITE +static char * wpa_config_write_mcast_rate(const struct parse_data *data, + struct wpa_ssid *ssid) +{ + char *value; + int res; + + if (!ssid->mcast_rate == 0) + return NULL; + + value = os_malloc(6); /* longest: 300.0 */ + if (value == NULL) + return NULL; + res = os_snprintf(value, 5, "%.1f", (double)ssid->mcast_rate / 10); + if (res < 0) { + os_free(value); + return NULL; + } + return value; +} +#endif /* NO_CONFIG_WRITE */ + +static int wpa_config_parse_rates(const struct parse_data *data, + struct wpa_ssid *ssid, int line, + const char *value) +{ + int i; + char *pos, *r, *sptr, *end; + double rate; + + pos = (char *)value; + r = strtok_r(pos, ",", &sptr); + i = 0; + while (pos && i < NL80211_MAX_SUPP_RATES) { + rate = 0.0; + if (r) + rate = strtod(r, &end); + ssid->rates[i] = rate * 2; + if (*end != '\0' || rate * 2 != ssid->rates[i]) + return 1; + + i++; + r = strtok_r(NULL, ",", &sptr); + } + + return 0; +} + +#ifndef NO_CONFIG_WRITE +static char * wpa_config_write_rates(const struct parse_data *data, + struct wpa_ssid *ssid) +{ + char *value, *pos; + int res, i; + + if (ssid->rates[0] <= 0) + return NULL; + + value = os_malloc(6 * NL80211_MAX_SUPP_RATES + 1); + if (value == NULL) + return NULL; + pos = value; + for (i = 0; i < NL80211_MAX_SUPP_RATES - 1; i++) { + res = os_snprintf(pos, 6, "%.1f,", (double)ssid->rates[i] / 2); + if (res < 0) { + os_free(value); + return NULL; + } + pos += res; + } + res = os_snprintf(pos, 6, "%.1f", + (double)ssid->rates[NL80211_MAX_SUPP_RATES - 1] / 2); + if (res < 0) { + os_free(value); + return NULL; + } + + value[6 * NL80211_MAX_SUPP_RATES] = '\0'; + return value; +} +#endif /* NO_CONFIG_WRITE */ + + #ifdef CONFIG_P2P @@ -2550,6 +2642,9 @@ static const struct parse_data ssid_fiel { INT(ap_max_inactivity) }, { INT(dtim_period) }, { INT(beacon_int) }, + { INT_RANGE(fixed_freq, 0, 1) }, + { FUNC(rates) }, + { FUNC(mcast_rate) }, #ifdef CONFIG_MACSEC { INT_RANGE(macsec_policy, 0, 1) }, { INT_RANGE(macsec_integ_only, 0, 1) }, --- a/wpa_supplicant/config_ssid.h +++ b/wpa_supplicant/config_ssid.h @@ -12,7 +12,7 @@ #include "common/defs.h" #include "utils/list.h" #include "eap_peer/eap_config.h" - +#include "drivers/nl80211_copy.h" #define DEFAULT_EAP_WORKAROUND ((unsigned int) -1) #define DEFAULT_EAPOL_FLAGS (EAPOL_FLAG_REQUIRE_KEY_UNICAST | \ @@ -838,6 +838,9 @@ struct wpa_ssid { */ void *parent_cred; + unsigned char rates[NL80211_MAX_SUPP_RATES]; + double mcast_rate; + #ifdef CONFIG_MACSEC /** * macsec_policy - Determines the policy for MACsec secure session --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -3450,7 +3450,7 @@ static void wpas_start_assoc_cb(struct w struct wpa_supplicant *wpa_s = work->wpa_s; u8 *wpa_ie; const u8 *edmg_ie_oper; - int use_crypt, ret, bssid_changed; + int use_crypt, ret, i, bssid_changed; unsigned int cipher_pairwise, cipher_group, cipher_group_mgmt; struct wpa_driver_associate_params params; #if defined(CONFIG_WEP) || defined(IEEE8021X_EAPOL) @@ -3638,6 +3638,13 @@ static void wpas_start_assoc_cb(struct w params.beacon_int = ssid->beacon_int; else params.beacon_int = wpa_s->conf->beacon_int; + params.fixed_freq = ssid->fixed_freq; + i = 0; + while (i < NL80211_MAX_SUPP_RATES) { + params.rates[i] = ssid->rates[i]; + i++; + } + params.mcast_rate = ssid->mcast_rate; } if (bss && ssid->enable_edmg)