105 lines
3 KiB
Diff
105 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,
|