123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 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(-)
- --- 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_stat
- 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_stat
- .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_stat
- 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,
|