|
|
@@ -0,0 +1,169 @@
|
|
|
+From b9329c5dfeed7d5c55d2117d8dfe326fc40c8fb1 Mon Sep 17 00:00:00 2001
|
|
|
+From: Antonio Quartulli <[email protected]>
|
|
|
+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 <[email protected]>
|
|
|
+---
|
|
|
+ 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
|
|
|
+
|