56569702a974245bd0f1a821757cabb6809fd5cf
[librecmc/librecmc.git] /
1 From 4bb69d15477e0f2b00e166845341dc933de47c58 Mon Sep 17 00:00:00 2001
2 From: Antonio Quartulli <ordex@autistici.org>
3 Date: Sun, 3 Jun 2012 18:22:56 +0200
4 Subject: [PATCHv2 601/602] wpa_supplicant: add new config params to be used
5  with the ibss join command
6
7 Signed-hostap: Antonio Quartulli <ordex@autistici.org>
8 ---
9  src/drivers/driver.h            |    6 +++
10  wpa_supplicant/config.c         |   96 +++++++++++++++++++++++++++++++++++++++
11  wpa_supplicant/config_ssid.h    |    6 +++
12  wpa_supplicant/wpa_supplicant.c |   23 +++++++---
13  4 files changed, 124 insertions(+), 7 deletions(-)
14
15 --- a/src/drivers/driver.h
16 +++ b/src/drivers/driver.h
17 @@ -19,6 +19,7 @@
18  
19  #define WPA_SUPPLICANT_DRIVER_VERSION 4
20  
21 +#include "drivers/nl80211_copy.h"
22  #include "common/defs.h"
23  #include "utils/list.h"
24  
25 @@ -414,6 +415,11 @@ struct wpa_driver_associate_params {
26          * responsible for selecting with which BSS to associate. */
27         const u8 *bssid;
28  
29 +       int beacon_interval;
30 +       int fixed_freq;
31 +       unsigned char rates[NL80211_MAX_SUPP_RATES];
32 +       int mcast_rate;
33 +
34         /**
35          * bssid_hint - BSSID of a proposed AP
36          *
37 --- a/wpa_supplicant/config.c
38 +++ b/wpa_supplicant/config.c
39 @@ -15,6 +15,7 @@
40  #include "rsn_supp/wpa.h"
41  #include "eap_peer/eap.h"
42  #include "p2p/p2p.h"
43 +#include "drivers/nl80211_copy.h"
44  #include "config.h"
45  
46  
47 @@ -1527,6 +1528,97 @@ static char * wpa_config_write_psk_list(
48  
49  #endif /* CONFIG_P2P */
50  
51 +static int wpa_config_parse_mcast_rate(const struct parse_data *data,
52 +                                      struct wpa_ssid *ssid, int line,
53 +                                      const char *value)
54 +{
55 +       ssid->mcast_rate = (int)(strtod(value, NULL) * 10);
56 +
57 +       return 0;
58 +}
59 +
60 +#ifndef NO_CONFIG_WRITE
61 +static char * wpa_config_write_mcast_rate(const struct parse_data *data,
62 +                                         struct wpa_ssid *ssid)
63 +{
64 +       char *value;
65 +       int res;
66 +
67 +       if (!ssid->mcast_rate == 0)
68 +               return NULL;
69 +
70 +       value = os_malloc(6); /* longest: 300.0 */
71 +       if (value == NULL)
72 +               return NULL;
73 +       res = os_snprintf(value, 5, "%.1f", (double)ssid->mcast_rate / 10);
74 +       if (res < 0) {
75 +               os_free(value);
76 +               return NULL;
77 +       }
78 +       return value;
79 +}
80 +#endif /* NO_CONFIG_WRITE */
81 +
82 +static int wpa_config_parse_rates(const struct parse_data *data,
83 +                                 struct wpa_ssid *ssid, int line,
84 +                                 const char *value)
85 +{
86 +       int i;
87 +       char *pos, *r, *sptr, *end;
88 +       double rate;
89 +
90 +       pos = (char *)value;
91 +       r = strtok_r(pos, ",", &sptr);
92 +       i = 0;
93 +       while (pos && i < NL80211_MAX_SUPP_RATES) {
94 +               rate = 0.0;
95 +               if (r)
96 +                       rate = strtod(r, &end);
97 +               ssid->rates[i] = rate * 2;
98 +               if (*end != '\0' || rate * 2 != ssid->rates[i])
99 +                       return 1;
100 +
101 +               i++;
102 +               r = strtok_r(NULL, ",", &sptr);
103 +       }
104 +
105 +       return 0;
106 +}
107 +
108 +#ifndef NO_CONFIG_WRITE
109 +static char * wpa_config_write_rates(const struct parse_data *data,
110 +                                    struct wpa_ssid *ssid)
111 +{
112 +       char *value, *pos;
113 +       int res, i;
114 +
115 +       if (ssid->rates[0] <= 0)
116 +               return NULL;
117 +
118 +       value = os_malloc(6 * NL80211_MAX_SUPP_RATES + 1);
119 +       if (value == NULL)
120 +               return NULL;
121 +       pos = value;
122 +       for (i = 0; i < NL80211_MAX_SUPP_RATES - 1; i++) {
123 +               res = os_snprintf(pos, 6, "%.1f,", (double)ssid->rates[i] / 2);
124 +               if (res < 0) {
125 +                       os_free(value);
126 +                       return NULL;
127 +               }
128 +               pos += res;
129 +       }
130 +       res = os_snprintf(pos, 6, "%.1f",
131 +                         (double)ssid->rates[NL80211_MAX_SUPP_RATES - 1] / 2);
132 +       if (res < 0) {
133 +               os_free(value);
134 +               return NULL;
135 +       }
136 +
137 +       value[6 * NL80211_MAX_SUPP_RATES] = '\0';
138 +       return value;
139 +}
140 +#endif /* NO_CONFIG_WRITE */
141 +
142  /* Helper macros for network block parser */
143  
144  #ifdef OFFSET
145 @@ -1733,6 +1825,9 @@ static const struct parse_data ssid_fiel
146         { INT(ap_max_inactivity) },
147         { INT(dtim_period) },
148         { INT(beacon_int) },
149 +       { INT_RANGE(fixed_freq, 0, 1) },
150 +       { FUNC(rates) },
151 +       { FUNC(mcast_rate) },
152  };
153  
154  #undef OFFSET
155 --- a/wpa_supplicant/config_ssid.h
156 +++ b/wpa_supplicant/config_ssid.h
157 @@ -12,6 +12,7 @@
158  #include "common/defs.h"
159  #include "utils/list.h"
160  #include "eap_peer/eap_config.h"
161 +#include "drivers/nl80211_copy.h"
162  
163  #define MAX_SSID_LEN 32
164  
165 @@ -636,6 +637,10 @@ struct wpa_ssid {
166          * dereferences since it may not be updated in all cases.
167          */
168         void *parent_cred;
169 +
170 +       int fixed_freq;
171 +       unsigned char rates[NL80211_MAX_SUPP_RATES];
172 +       double mcast_rate;
173  };
174  
175  #endif /* CONFIG_SSID_H */
176 --- a/wpa_supplicant/wpa_supplicant.c
177 +++ b/wpa_supplicant/wpa_supplicant.c
178 @@ -1791,6 +1791,13 @@ static void wpas_start_assoc_cb(struct w
179                         params.beacon_int = ssid->beacon_int;
180                 else
181                         params.beacon_int = wpa_s->conf->beacon_int;
182 +               params.fixed_freq = ssid->fixed_freq;
183 +               i = 0;
184 +               while (i < NL80211_MAX_SUPP_RATES) {
185 +                       params.rates[i] = ssid->rates[i];
186 +                       i++;
187 +               }
188 +               params.mcast_rate = ssid->mcast_rate;
189         }
190  
191         params.wpa_ie = wpa_ie;