blob: dc19553e26ea87f71ebc0ea4a401133808eec630 [file] [log] [blame]
developer29c4d2d2022-12-26 19:41:22 +08001From 4bb69d15477e0f2b00e166845341dc933de47c58 Mon Sep 17 00:00:00 2001
2From: Antonio Quartulli <ordex@autistici.org>
3Date: Sun, 3 Jun 2012 18:22:56 +0200
4Subject: [PATCHv2 601/602] wpa_supplicant: add new config params to be used
5 with the ibss join command
6
7Signed-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 "ap/sta_info.h"
22 #include "common/defs.h"
23 #include "common/ieee802_11_defs.h"
24 #include "common/wpa_common.h"
developer8bff6472023-07-17 11:11:44 +080025@@ -953,6 +954,9 @@ struct wpa_driver_associate_params {
developer29c4d2d2022-12-26 19:41:22 +080026 * responsible for selecting with which BSS to associate. */
27 const u8 *bssid;
28
29+ unsigned char rates[WLAN_SUPP_RATES_MAX];
30+ int mcast_rate;
31+
32 /**
33 * bssid_hint - BSSID of a proposed AP
34 *
35--- a/wpa_supplicant/config.c
36+++ b/wpa_supplicant/config.c
37@@ -18,6 +18,7 @@
38 #include "eap_peer/eap.h"
39 #include "p2p/p2p.h"
40 #include "fst/fst.h"
41+#include "ap/sta_info.h"
42 #include "config.h"
43
44
developer505c9432023-05-12 18:58:17 +080045@@ -2389,6 +2390,97 @@ static char * wpa_config_write_mac_value
developer29c4d2d2022-12-26 19:41:22 +080046 #endif /* NO_CONFIG_WRITE */
47
48
49+static int wpa_config_parse_mcast_rate(const struct parse_data *data,
50+ struct wpa_ssid *ssid, int line,
51+ const char *value)
52+{
53+ ssid->mcast_rate = (int)(strtod(value, NULL) * 10);
54+
55+ return 0;
56+}
57+
58+#ifndef NO_CONFIG_WRITE
59+static char * wpa_config_write_mcast_rate(const struct parse_data *data,
60+ struct wpa_ssid *ssid)
61+{
62+ char *value;
63+ int res;
64+
65+ if (!ssid->mcast_rate == 0)
66+ return NULL;
67+
68+ value = os_malloc(6); /* longest: 300.0 */
69+ if (value == NULL)
70+ return NULL;
71+ res = os_snprintf(value, 5, "%.1f", (double)ssid->mcast_rate / 10);
72+ if (res < 0) {
73+ os_free(value);
74+ return NULL;
75+ }
76+ return value;
77+}
78+#endif /* NO_CONFIG_WRITE */
79+
80+static int wpa_config_parse_rates(const struct parse_data *data,
81+ struct wpa_ssid *ssid, int line,
82+ const char *value)
83+{
84+ int i;
85+ char *pos, *r, *sptr, *end;
86+ double rate;
87+
88+ pos = (char *)value;
89+ r = strtok_r(pos, ",", &sptr);
90+ i = 0;
91+ while (pos && i < WLAN_SUPP_RATES_MAX) {
92+ rate = 0.0;
93+ if (r)
94+ rate = strtod(r, &end);
95+ ssid->rates[i] = rate * 2;
96+ if (*end != '\0' || rate * 2 != ssid->rates[i])
97+ return 1;
98+
99+ i++;
100+ r = strtok_r(NULL, ",", &sptr);
101+ }
102+
103+ return 0;
104+}
105+
106+#ifndef NO_CONFIG_WRITE
107+static char * wpa_config_write_rates(const struct parse_data *data,
108+ struct wpa_ssid *ssid)
109+{
110+ char *value, *pos;
111+ int res, i;
112+
113+ if (ssid->rates[0] <= 0)
114+ return NULL;
115+
116+ value = os_malloc(6 * WLAN_SUPP_RATES_MAX + 1);
117+ if (value == NULL)
118+ return NULL;
119+ pos = value;
120+ for (i = 0; i < WLAN_SUPP_RATES_MAX - 1; i++) {
121+ res = os_snprintf(pos, 6, "%.1f,", (double)ssid->rates[i] / 2);
122+ if (res < 0) {
123+ os_free(value);
124+ return NULL;
125+ }
126+ pos += res;
127+ }
128+ res = os_snprintf(pos, 6, "%.1f",
129+ (double)ssid->rates[WLAN_SUPP_RATES_MAX - 1] / 2);
130+ if (res < 0) {
131+ os_free(value);
132+ return NULL;
133+ }
134+
135+ value[6 * WLAN_SUPP_RATES_MAX] = '\0';
136+ return value;
137+}
138+#endif /* NO_CONFIG_WRITE */
139+
140 /* Helper macros for network block parser */
141
142 #ifdef OFFSET
developer8bff6472023-07-17 11:11:44 +0800143@@ -2674,6 +2766,8 @@ static const struct parse_data ssid_fiel
developer29c4d2d2022-12-26 19:41:22 +0800144 { INT(ap_max_inactivity) },
145 { INT(dtim_period) },
146 { INT(beacon_int) },
147+ { FUNC(rates) },
148+ { FUNC(mcast_rate) },
149 #ifdef CONFIG_MACSEC
150 { INT_RANGE(macsec_policy, 0, 1) },
151 { INT_RANGE(macsec_integ_only, 0, 1) },
152--- a/wpa_supplicant/config_ssid.h
153+++ b/wpa_supplicant/config_ssid.h
154@@ -10,8 +10,10 @@
155 #define CONFIG_SSID_H
156
157 #include "common/defs.h"
158+#include "ap/sta_info.h"
159 #include "utils/list.h"
160 #include "eap_peer/eap_config.h"
161+#include "drivers/nl80211_copy.h"
162
163
164 #define DEFAULT_EAP_WORKAROUND ((unsigned int) -1)
developer505c9432023-05-12 18:58:17 +0800165@@ -879,6 +881,9 @@ struct wpa_ssid {
developer29c4d2d2022-12-26 19:41:22 +0800166 */
167 void *parent_cred;
168
169+ unsigned char rates[WLAN_SUPP_RATES_MAX];
170+ double mcast_rate;
171+
172 #ifdef CONFIG_MACSEC
173 /**
174 * macsec_policy - Determines the policy for MACsec secure session
175--- a/wpa_supplicant/wpa_supplicant.c
176+++ b/wpa_supplicant/wpa_supplicant.c
developerbf0f2d62023-11-14 17:01:47 +0800177@@ -4177,6 +4177,12 @@ static void wpas_start_assoc_cb(struct w
developer29c4d2d2022-12-26 19:41:22 +0800178 params.beacon_int = ssid->beacon_int;
179 else
180 params.beacon_int = wpa_s->conf->beacon_int;
181+ int i = 0;
182+ while (i < WLAN_SUPP_RATES_MAX) {
183+ params.rates[i] = ssid->rates[i];
184+ i++;
185+ }
186+ params.mcast_rate = ssid->mcast_rate;
187 }
188
189 if (bss && ssid->enable_edmg)