openwrtv3/package/hostapd/patches/604-wpa_s-support-htmode-param.patch
John Crispin 7639c9b580 mac80211/hostapd: add support for HT capa in case of IBSS/RSN
Signed-off-by: Antonio Quartulli <ordex@autistici.org>

SVN-Revision: 32830
2012-07-24 23:07:25 +00:00

169 lines
4.5 KiB
Diff

From b9329c5dfeed7d5c55d2117d8dfe326fc40c8fb1 Mon Sep 17 00:00:00 2001
From: Antonio Quartulli <ordex@autistici.org>
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 <ordex@autistici.org>
---
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