From: Simon Wunderlich Date: Tue, 12 Nov 2013 17:31:58 +0000 (+0100) Subject: iw: add support for 5 and 10 MHz channels in IBSS mode X-Git-Tag: v3.13~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85da7703d0405419afb7a967beccc642b0e20565;p=thirdparty%2Fiw.git iw: add support for 5 and 10 MHz channels in IBSS mode 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 Signed-off-by: Mathias Kretschmer --- diff --git a/ibss.c b/ibss.c index 955446e..1bf1bab 100644 --- 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, - " [HT20|HT40+|HT40-|NOHT] [fixed-freq] [] [beacon-interval ]" + " [HT20|HT40+|HT40-|NOHT|5MHZ|10MHZ] [fixed-freq] [] [beacon-interval ]" " [basic-rates ] [mcast-rate ] " "[key d:0:abcde]", NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,