openwrtv3/package/network/utils/iw/patches/301-ibss_add_VHT80.patch
Felix Fietkau 5425d27339 iw: add VHT80 support for IBSS
Signed-off-by: Sven Eckelmann <sven@open-mesh.com>

SVN-Revision: 47780
2015-12-05 09:52:02 +00:00

104 lines
3 KiB
Diff

From: "Janusz.Dziedzic@tieto.com" <Janusz.Dziedzic@tieto.com>
Date: Thu, 10 Sep 2015 12:04:13 +0200
Subject: ibss: add VHT80 support for IBSS
Add VHT80 support for IBSS.
eg. iw wlan0 ibss join 5180 80MHZ
iw wlan0 ibbs join 5220 80MHZ
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
[fix formatting]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
ibss.c | 49 +++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 41 insertions(+), 8 deletions(-)
diff --git a/ibss.c b/ibss.c
index 7a0b707..a99a262 100644
--- a/ibss.c
+++ b/ibss.c
@@ -16,6 +16,39 @@
SECTION(ibss);
+struct chanmode {
+ const char *name;
+ unsigned int width;
+ int freq1_diff;
+ int chantype; /* for older kernel */
+};
+
+static int get_cf1(const struct chanmode *chanmode, unsigned long freq)
+{
+ int cf1 = freq, j;
+ int vht80[] = { 5180, 5260, 5500, 5580, 5660, 5745 };
+
+ switch (chanmode->width) {
+ case NL80211_CHAN_WIDTH_80:
+ /* setup center_freq1 */
+ for (j = 0; j < ARRAY_SIZE(vht80); j++) {
+ if (freq >= vht80[j] && freq < vht80[j] + 80)
+ break;
+ }
+
+ if (j == ARRAY_SIZE(vht80))
+ break;
+
+ cf1 = vht80[j] + 30;
+ break;
+ default:
+ cf1 = freq + chanmode->freq1_diff;
+ break;
+ }
+
+ return cf1;
+}
+
static int join_ibss(struct nl80211_state *state,
struct nl_msg *msg,
int argc, char **argv,
@@ -30,12 +63,8 @@ static int join_ibss(struct nl80211_state *state,
int bintval;
int i;
unsigned long freq;
- static const struct {
- const char *name;
- unsigned int width;
- int freq1_diff;
- int chantype; /* for older kernel */
- } *chanmode_selected = NULL, chanmode[] = {
+ const struct chanmode *chanmode_selected = NULL;
+ static const struct chanmode chanmode[] = {
{ .name = "HT20",
.width = NL80211_CHAN_WIDTH_20,
.freq1_diff = 0,
@@ -60,6 +89,10 @@ static int join_ibss(struct nl80211_state *state,
.width = NL80211_CHAN_WIDTH_10,
.freq1_diff = 0,
.chantype = -1 },
+ { .name = "80MHZ",
+ .width = NL80211_CHAN_WIDTH_80,
+ .freq1_diff = 0,
+ .chantype = -1 },
};
if (argc < 2)
@@ -90,7 +123,7 @@ static int join_ibss(struct nl80211_state *state,
NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH,
chanmode_selected->width);
NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1,
- freq + chanmode_selected->freq1_diff);
+ get_cf1(chanmode_selected, freq));
if (chanmode_selected->chantype != -1)
NLA_PUT_U32(msg,
NL80211_ATTR_WIPHY_CHANNEL_TYPE,
@@ -192,7 +225,7 @@ COMMAND(ibss, leave, NULL,
NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
"Leave the current IBSS cell.");
COMMAND(ibss, join,
- "<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
+ "<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ|80MHZ] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
" [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
"[key d:0:abcde]",
NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,