Skip to content

Commit

Permalink
iw: add support for 5 and 10 MHz channels in IBSS mode
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Mathias Kretschmer <[email protected]>
  • Loading branch information
simonwunderlich authored and jmberg-intel committed Nov 13, 2013
1 parent b0dc675 commit 85da770
Showing 1 changed file with 46 additions and 16 deletions.
62 changes: 46 additions & 16 deletions ibss.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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--;
}
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 85da770

Please sign in to comment.