]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
iw: add support for 5 and 10 MHz channels in IBSS mode
authorSimon Wunderlich <sw@simonwunderlich.de>
Tue, 12 Nov 2013 17:31:58 +0000 (18:31 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 13 Nov 2013 18:23:48 +0000 (19:23 +0100)
5/10 MHz requires to send the frequency information as chandef instead
of the the old channel type, therfore send the chandef next the channel
type (the latter is still used for old kernels).

Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
ibss.c

diff --git a/ibss.c b/ibss.c
index 955446e445dddf1563cdeb9e901ac98edde905f6..1bf1bab5f5b5fb29d0a67ef8f7900d783476421e 100644 (file)
--- a/ibss.c
+++ b/ibss.c
@@ -30,16 +30,38 @@ static int join_ibss(struct nl80211_state *state,
        float rate;
        int bintval;
        int i;
+       unsigned long freq;
        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, },
+               unsigned int width;
+               int freq1_diff;
+               int chantype; /* for older kernel */
+       } *chanmode_selected = NULL, chanmode[] = {
+               { .name = "HT20",
+                 .width = NL80211_CHAN_WIDTH_20,
+                 .freq1_diff = 0,
+                 .chantype = NL80211_CHAN_HT20 },
+               { .name = "HT40+",
+                 .width = NL80211_CHAN_WIDTH_40,
+                 .freq1_diff = 10,
+                 .chantype = NL80211_CHAN_HT40PLUS },
+               { .name = "HT40-",
+                 .width = NL80211_CHAN_WIDTH_40,
+                 .freq1_diff = -10,
+                 .chantype = NL80211_CHAN_HT40MINUS },
+               { .name = "NOHT",
+                 .width = NL80211_CHAN_WIDTH_20_NOHT,
+                 .freq1_diff = 0,
+                 .chantype = NL80211_CHAN_NO_HT },
+               { .name = "5MHZ",
+                 .width = NL80211_CHAN_WIDTH_5,
+                 .freq1_diff = 0,
+                 .chantype = -1 },
+               { .name = "10MHZ",
+                 .width = NL80211_CHAN_WIDTH_10,
+                 .freq1_diff = 0,
+                 .chantype = -1 },
        };
-       unsigned int htval;
 
        if (argc < 2)
                return 1;
@@ -50,23 +72,31 @@ static int join_ibss(struct nl80211_state *state,
        argc--;
 
        /* freq */
-       NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ,
-                   strtoul(argv[0], &end, 10));
+       freq = strtoul(argv[0], &end, 10);
        if (*end != '\0')
                return 1;
+
+       NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
        argv++;
        argc--;
 
        if (argc) {
-               for (i = 0; i < ARRAY_SIZE(htmap); i++) {
-                       if (strcasecmp(htmap[i].name, argv[0]) == 0) {
-                               htval = htmap[i].val;
+               for (i = 0; i < ARRAY_SIZE(chanmode); i++) {
+                       if (strcasecmp(chanmode[i].name, argv[0]) == 0) {
+                               chanmode_selected = &chanmode[i];
                                break;
                        }
                }
-               if (i != ARRAY_SIZE(htmap)) {
-                       NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
-                                   htval);
+               if (chanmode_selected) {
+                       NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH,
+                                   chanmode_selected->width);
+                       NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1,
+                                   freq + chanmode_selected->freq1_diff);
+                       if (chanmode_selected->chantype != -1)
+                               NLA_PUT_U32(msg,
+                                           NL80211_ATTR_WIPHY_CHANNEL_TYPE,
+                                           chanmode_selected->chantype);
+
                        argv++;
                        argc--;
                }
@@ -164,7 +194,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] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
+       "<SSID> <freq in MHz> [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ] [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,