From b9329c5dfeed7d5c55d2117d8dfe326fc40c8fb1 Mon Sep 17 00:00:00 2001 From: Antonio Quartulli Date: Tue, 3 Jul 2012 00:36:24 +0200 Subject: [PATCH] wpa_s: support htmode param possible values are HT20, HT40-, HT40+ and NOHT Signed-off-by: Antonio Quartulli --- src/drivers/driver.h | 2 ++ src/drivers/driver_nl80211.c | 16 ++++++++++ wpa_supplicant/config.c | 66 +++++++++++++++++++++++++++++++++++++++ wpa_supplicant/config_ssid.h | 2 ++ wpa_supplicant/wpa_supplicant.c | 2 ++ 5 files changed, 88 insertions(+) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index dda2fbc..28bd181 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -337,6 +337,8 @@ struct wpa_driver_associate_params { int fixed_freq; unsigned char rates[NL80211_MAX_SUPP_RATES]; int mcast_rate; + int ht_set; + unsigned int htmode; /** * bg_scan_period - Background scan period in seconds, 0 to disable diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 9783c96..d1257a7 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -6493,6 +6493,22 @@ retry: NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate); } + if (params->ht_set) { + switch(params->htmode) { + case NL80211_CHAN_HT20: + wpa_printf(MSG_DEBUG, " * ht=HT20"); + break; + case NL80211_CHAN_HT40PLUS: + wpa_printf(MSG_DEBUG, " * ht=HT40+"); + break; + case NL80211_CHAN_HT40MINUS: + wpa_printf(MSG_DEBUG, " * ht=HT40-"); + break; + } + NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, + params->htmode); + } + ret = nl80211_set_conn_keys(params, msg); if (ret) goto nla_put_failure; diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 3d6c0e6..d96b2ea 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -1468,6 +1468,71 @@ static char * wpa_config_write_mcast_rate(const struct parse_data *data, } #endif /* NO_CONFIG_WRITE */ +static int wpa_config_parse_htmode(const struct parse_data *data, + struct wpa_ssid *ssid, int line, + const char *value) +{ + int i; + static const struct { + const char *name; + unsigned int val; + } htmap[] = { + { .name = "HT20", .val = NL80211_CHAN_HT20, }, + { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, }, + { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, }, + { .name = "NOHT", .val = NL80211_CHAN_NO_HT, }, + }; + ssid->ht_set = 0;; + for (i = 0; i < 4; i++) { + if (strcasecmp(htmap[i].name, value) == 0) { + ssid->htmode = htmap[i].val; + ssid->ht_set = 1; + break; + } + } + + return 0; +} + +#ifndef NO_CONFIG_WRITE +static char * wpa_config_write_htmode(const struct parse_data *data, + struct wpa_ssid *ssid) +{ + char *value; + int res; + + value = os_malloc(6); /* longest: HT40+ */ + if (value == NULL) + return NULL; + + switch(ssid->htmode) { + case NL80211_CHAN_HT20: + res = os_snprintf(value, 4, "HT20"); + break; + case NL80211_CHAN_HT40PLUS: + res = os_snprintf(value, 5, "HT40+"); + break; + case NL80211_CHAN_HT40MINUS: + res = os_snprintf(value, 5, "HT40-"); + break; + case NL80211_CHAN_NO_HT: + res = os_snprintf(value, 4, "NOHT"); + break; + default: + os_free(value); + return NULL; + } + + 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) @@ -1706,6 +1771,7 @@ static const struct parse_data ssid_fields[] = { { INT_RANGE(beacon_interval, 0, 1000) }, { FUNC(rates) }, { FUNC(mcast_rate) }, + { FUNC(htmode) }, }; #undef OFFSET diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h index 8d152a4..7143277 100644 --- a/wpa_supplicant/config_ssid.h +++ b/wpa_supplicant/config_ssid.h @@ -505,6 +505,8 @@ struct wpa_ssid { int beacon_interval; unsigned char rates[NL80211_MAX_SUPP_RATES]; double mcast_rate; + int ht_set; + unsigned int htmode; }; #endif /* CONFIG_SSID_H */ diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 59efa16..fc8762f 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -1379,6 +1379,8 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, i++; } params.mcast_rate = ssid->mcast_rate; + params.ht_set = ssid->ht_set; + params.htmode = ssid->htmode; } params.wpa_ie = wpa_ie; -- 1.7.9.4