iw: backport the ibss ht patch
[openwrt-10.03/.git] / package / iw / patches / 120-ibss_ht.patch
1 --- a/ibss.c
2 +++ b/ibss.c
3 @@ -27,6 +27,7 @@ static int join_ibss(struct nl80211_stat
4         char *value = NULL, *sptr = NULL;
5         float rate;
6         int bintval;
7 +       unsigned int htval;
8  
9         if (argc < 2)
10                 return 1;
11 @@ -44,6 +45,12 @@ static int join_ibss(struct nl80211_stat
12         argv++;
13         argc--;
14  
15 +       if (argc && parse_channel_type(argv[0], &htval)) {
16 +               NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, htval);
17 +               argv++;
18 +               argc--;
19 +       }
20 +
21         if (argc && strcmp(argv[0], "fixed-freq") == 0) {
22                 NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
23                 argv++;
24 @@ -134,7 +141,7 @@ COMMAND(ibss, leave, NULL,
25         NL80211_CMD_LEAVE_IBSS, 0, CIB_NETDEV, leave_ibss,
26         "Leave the current IBSS cell.");
27  COMMAND(ibss, join,
28 -       "<SSID> <freq in MHz> [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
29 +       "<SSID> <freq in MHz> [HT20|HT40+|HT40-] [fixed-freq] [<fixed bssid>] [beacon-interval <TU>]"
30         " [basic-rates <rate in Mbps,rate2,...>] [mcast-rate <rate in Mbps>] "
31         "[key d:0:abcde]",
32         NL80211_CMD_JOIN_IBSS, 0, CIB_NETDEV, join_ibss,
33 --- a/iw.h
34 +++ b/iw.h
35 @@ -130,6 +130,7 @@ void mac_addr_n2a(char *mac_addr, unsign
36  unsigned char *parse_hex(char *hex, size_t *outlen);
37  
38  int parse_keys(struct nl_msg *msg, char **argv, int argc);
39 +int parse_channel_type(const char *str, unsigned int *htval);
40  
41  void print_ht_mcs(const __u8 *mcs);
42  void print_ampdu_length(__u8 exponent);
43 --- a/phy.c
44 +++ b/phy.c
45 @@ -33,30 +33,14 @@ static int handle_freqchan(struct nl_msg
46                            int argc, char **argv)
47  {
48         char *end;
49 -       static const struct {
50 -               const char *name;
51 -               unsigned int val;
52 -       } htmap[] = {
53 -               { .name = "HT20", .val = NL80211_CHAN_HT20, },
54 -               { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
55 -               { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
56 -       };
57         unsigned int htval = NL80211_CHAN_NO_HT;
58         unsigned int freq;
59 -       int i;
60  
61         if (!argc || argc > 2)
62                 return 1;
63  
64 -       if (argc == 2) {
65 -               for (i = 0; i < ARRAY_SIZE(htmap); i++) {
66 -                       if (strcasecmp(htmap[i].name, argv[1]) == 0) {
67 -                               htval = htmap[i].val;
68 -                               break;
69 -                       }
70 -               }
71 -               if (htval == NL80211_CHAN_NO_HT)
72 -                       return 1;
73 +       if (argc == 2 && !parse_channel_type(argv[1], &htval)) {
74 +               return 1;
75         }
76  
77         if (!*argv[0])
78 --- a/util.c
79 +++ b/util.c
80 @@ -345,6 +345,33 @@ int parse_keys(struct nl_msg *msg, char 
81         return 2;
82  }
83  
84 +/*
85 + * Convert a string "HT20", "HT40+" or "HT40-" into nl80211
86 + * value. Conversion is case insensitive. Returns 1 on success, 0 on error.
87 + */
88 +
89 +int parse_channel_type(const char *str, unsigned int *htval)
90 +{
91 +       static const struct {
92 +               const char *name;
93 +               unsigned int val;
94 +       } htmap[] = {
95 +               { .name = "HT20", .val = NL80211_CHAN_HT20, },
96 +               { .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
97 +               { .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
98 +       };
99 +       int i;
100 +
101 +       for (i = 0; i < ARRAY_SIZE(htmap); i++) {
102 +               if (strcasecmp(htmap[i].name, str) == 0) {
103 +                       *htval = htmap[i].val;
104 +                       return 1;
105 +               }
106 +       }
107 +
108 +       return 0;
109 +}
110 +
111  static void print_mcs_index(const __u8 *mcs)
112  {
113         unsigned int mcs_bit, prev_bit = -2, prev_cont = 0;