1 /*
2 * wlantest control interface
3 * Copyright (c) 2010-2015, Jouni Malinen <j@w1.fi>
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9 #include "utils/includes.h"
10 #include <sys/un.h>
11
12 #include "utils/common.h"
13 #include "utils/eloop.h"
14 #include "common/defs.h"
15 #include "common/version.h"
16 #include "common/ieee802_11_defs.h"
17 #include "wlantest.h"
18 #include "wlantest_ctrl.h"
19
20
attr_get(u8 * buf,size_t buflen,enum wlantest_ctrl_attr attr,size_t * len)21 static u8 * attr_get(u8 *buf, size_t buflen, enum wlantest_ctrl_attr attr,
22 size_t *len)
23 {
24 u8 *pos = buf;
25
26 while (pos + 8 <= buf + buflen) {
27 enum wlantest_ctrl_attr a;
28 size_t alen;
29 a = WPA_GET_BE32(pos);
30 pos += 4;
31 alen = WPA_GET_BE32(pos);
32 pos += 4;
33 if (pos + alen > buf + buflen) {
34 wpa_printf(MSG_DEBUG, "Invalid control message "
35 "attribute");
36 return NULL;
37 }
38 if (a == attr) {
39 *len = alen;
40 return pos;
41 }
42 pos += alen;
43 }
44
45 return NULL;
46 }
47
48
attr_get_macaddr(u8 * buf,size_t buflen,enum wlantest_ctrl_attr attr)49 static u8 * attr_get_macaddr(u8 *buf, size_t buflen,
50 enum wlantest_ctrl_attr attr)
51 {
52 u8 *addr;
53 size_t addr_len;
54 addr = attr_get(buf, buflen, attr, &addr_len);
55 if (addr && addr_len != ETH_ALEN)
56 addr = NULL;
57 return addr;
58 }
59
60
attr_get_int(u8 * buf,size_t buflen,enum wlantest_ctrl_attr attr)61 static int attr_get_int(u8 *buf, size_t buflen, enum wlantest_ctrl_attr attr)
62 {
63 u8 *pos;
64 size_t len;
65 pos = attr_get(buf, buflen, attr, &len);
66 if (pos == NULL || len != 4)
67 return -1;
68 return WPA_GET_BE32(pos);
69 }
70
71
attr_add_str(u8 * pos,u8 * end,enum wlantest_ctrl_attr attr,const char * str)72 static u8 * attr_add_str(u8 *pos, u8 *end, enum wlantest_ctrl_attr attr,
73 const char *str)
74 {
75 size_t len = os_strlen(str);
76
77 if (pos == NULL || end - pos < 8 + len)
78 return NULL;
79 WPA_PUT_BE32(pos, attr);
80 pos += 4;
81 WPA_PUT_BE32(pos, len);
82 pos += 4;
83 os_memcpy(pos, str, len);
84 pos += len;
85 return pos;
86 }
87
88
attr_add_be32(u8 * pos,u8 * end,enum wlantest_ctrl_attr attr,u32 val)89 static u8 * attr_add_be32(u8 *pos, u8 *end, enum wlantest_ctrl_attr attr,
90 u32 val)
91 {
92 if (pos == NULL || end - pos < 12)
93 return NULL;
94 WPA_PUT_BE32(pos, attr);
95 pos += 4;
96 WPA_PUT_BE32(pos, 4);
97 pos += 4;
98 WPA_PUT_BE32(pos, val);
99 pos += 4;
100 return pos;
101 }
102
103
ctrl_disconnect(struct wlantest * wt,int sock)104 static void ctrl_disconnect(struct wlantest *wt, int sock)
105 {
106 int i;
107 wpa_printf(MSG_DEBUG, "Disconnect control interface connection %d",
108 sock);
109 for (i = 0; i < MAX_CTRL_CONNECTIONS; i++) {
110 if (wt->ctrl_socks[i] == sock) {
111 close(wt->ctrl_socks[i]);
112 eloop_unregister_read_sock(wt->ctrl_socks[i]);
113 wt->ctrl_socks[i] = -1;
114 break;
115 }
116 }
117 }
118
119
ctrl_send(struct wlantest * wt,int sock,const u8 * buf,size_t len)120 static void ctrl_send(struct wlantest *wt, int sock, const u8 *buf,
121 size_t len)
122 {
123 if (send(sock, buf, len, 0) < 0) {
124 wpa_printf(MSG_INFO, "send(ctrl): %s", strerror(errno));
125 ctrl_disconnect(wt, sock);
126 }
127 }
128
129
ctrl_send_simple(struct wlantest * wt,int sock,enum wlantest_ctrl_cmd cmd)130 static void ctrl_send_simple(struct wlantest *wt, int sock,
131 enum wlantest_ctrl_cmd cmd)
132 {
133 u8 buf[4];
134 WPA_PUT_BE32(buf, cmd);
135 ctrl_send(wt, sock, buf, sizeof(buf));
136 }
137
138
ctrl_get_bss(struct wlantest * wt,int sock,u8 * cmd,size_t clen)139 static struct wlantest_bss * ctrl_get_bss(struct wlantest *wt, int sock,
140 u8 *cmd, size_t clen)
141 {
142 struct wlantest_bss *bss;
143 u8 *pos;
144 size_t len;
145
146 pos = attr_get(cmd, clen, WLANTEST_ATTR_BSSID, &len);
147 if (pos == NULL || len != ETH_ALEN) {
148 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
149 return NULL;
150 }
151
152 bss = bss_find(wt, pos);
153 if (bss == NULL) {
154 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
155 return NULL;
156 }
157
158 return bss;
159 }
160
161
ctrl_get_sta(struct wlantest * wt,int sock,u8 * cmd,size_t clen,struct wlantest_bss * bss)162 static struct wlantest_sta * ctrl_get_sta(struct wlantest *wt, int sock,
163 u8 *cmd, size_t clen,
164 struct wlantest_bss *bss)
165 {
166 struct wlantest_sta *sta;
167 u8 *pos;
168 size_t len;
169
170 if (bss == NULL)
171 return NULL;
172
173 pos = attr_get(cmd, clen, WLANTEST_ATTR_STA_ADDR, &len);
174 if (pos == NULL || len != ETH_ALEN) {
175 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
176 return NULL;
177 }
178
179 sta = sta_find(bss, pos);
180 if (sta == NULL) {
181 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
182 return NULL;
183 }
184
185 return sta;
186 }
187
188
ctrl_get_sta2(struct wlantest * wt,int sock,u8 * cmd,size_t clen,struct wlantest_bss * bss)189 static struct wlantest_sta * ctrl_get_sta2(struct wlantest *wt, int sock,
190 u8 *cmd, size_t clen,
191 struct wlantest_bss *bss)
192 {
193 struct wlantest_sta *sta;
194 u8 *pos;
195 size_t len;
196
197 if (bss == NULL)
198 return NULL;
199
200 pos = attr_get(cmd, clen, WLANTEST_ATTR_STA2_ADDR, &len);
201 if (pos == NULL || len != ETH_ALEN) {
202 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
203 return NULL;
204 }
205
206 sta = sta_find(bss, pos);
207 if (sta == NULL) {
208 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
209 return NULL;
210 }
211
212 return sta;
213 }
214
215
ctrl_list_bss(struct wlantest * wt,int sock)216 static void ctrl_list_bss(struct wlantest *wt, int sock)
217 {
218 u8 buf[WLANTEST_CTRL_MAX_RESP_LEN], *pos, *len;
219 struct wlantest_bss *bss;
220
221 pos = buf;
222 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
223 pos += 4;
224 WPA_PUT_BE32(pos, WLANTEST_ATTR_BSSID);
225 pos += 4;
226 len = pos; /* to be filled */
227 pos += 4;
228
229 dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
230 if (pos + ETH_ALEN > buf + WLANTEST_CTRL_MAX_RESP_LEN)
231 break;
232 os_memcpy(pos, bss->bssid, ETH_ALEN);
233 pos += ETH_ALEN;
234 }
235
236 WPA_PUT_BE32(len, pos - len - 4);
237 ctrl_send(wt, sock, buf, pos - buf);
238 }
239
240
ctrl_list_sta(struct wlantest * wt,int sock,u8 * cmd,size_t clen)241 static void ctrl_list_sta(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
242 {
243 u8 buf[WLANTEST_CTRL_MAX_RESP_LEN], *pos, *len;
244 struct wlantest_bss *bss;
245 struct wlantest_sta *sta;
246
247 bss = ctrl_get_bss(wt, sock, cmd, clen);
248 if (bss == NULL)
249 return;
250
251 pos = buf;
252 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
253 pos += 4;
254 WPA_PUT_BE32(pos, WLANTEST_ATTR_STA_ADDR);
255 pos += 4;
256 len = pos; /* to be filled */
257 pos += 4;
258
259 dl_list_for_each(sta, &bss->sta, struct wlantest_sta, list) {
260 if (pos + ETH_ALEN > buf + WLANTEST_CTRL_MAX_RESP_LEN)
261 break;
262 os_memcpy(pos, sta->addr, ETH_ALEN);
263 pos += ETH_ALEN;
264 }
265
266 WPA_PUT_BE32(len, pos - len - 4);
267 ctrl_send(wt, sock, buf, pos - buf);
268 }
269
270
ctrl_flush(struct wlantest * wt,int sock)271 static void ctrl_flush(struct wlantest *wt, int sock)
272 {
273 wpa_printf(MSG_DEBUG, "Drop all collected BSS data");
274 bss_flush(wt);
275 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
276 }
277
278
ctrl_clear_sta_counters(struct wlantest * wt,int sock,u8 * cmd,size_t clen)279 static void ctrl_clear_sta_counters(struct wlantest *wt, int sock, u8 *cmd,
280 size_t clen)
281 {
282 struct wlantest_bss *bss;
283 struct wlantest_sta *sta;
284
285 bss = ctrl_get_bss(wt, sock, cmd, clen);
286 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
287 if (sta == NULL) {
288 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
289 return;
290 }
291
292 os_memset(sta->counters, 0, sizeof(sta->counters));
293 os_memset(sta->tx_tid, 0, sizeof(sta->tx_tid));
294 os_memset(sta->rx_tid, 0, sizeof(sta->rx_tid));
295 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
296 }
297
298
ctrl_clear_bss_counters(struct wlantest * wt,int sock,u8 * cmd,size_t clen)299 static void ctrl_clear_bss_counters(struct wlantest *wt, int sock, u8 *cmd,
300 size_t clen)
301 {
302 struct wlantest_bss *bss;
303
304 bss = ctrl_get_bss(wt, sock, cmd, clen);
305 if (bss == NULL) {
306 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
307 return;
308 }
309
310 os_memset(bss->counters, 0, sizeof(bss->counters));
311 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
312 }
313
314
ctrl_clear_tdls_counters(struct wlantest * wt,int sock,u8 * cmd,size_t clen)315 static void ctrl_clear_tdls_counters(struct wlantest *wt, int sock, u8 *cmd,
316 size_t clen)
317 {
318 struct wlantest_bss *bss;
319 struct wlantest_sta *sta;
320 struct wlantest_sta *sta2;
321 struct wlantest_tdls *tdls;
322
323 bss = ctrl_get_bss(wt, sock, cmd, clen);
324 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
325 sta2 = ctrl_get_sta2(wt, sock, cmd, clen, bss);
326 if (sta == NULL || sta2 == NULL) {
327 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
328 return;
329 }
330
331 dl_list_for_each(tdls, &bss->tdls, struct wlantest_tdls, list) {
332 if ((tdls->init == sta && tdls->resp == sta2) ||
333 (tdls->init == sta2 && tdls->resp == sta))
334 os_memset(tdls->counters, 0, sizeof(tdls->counters));
335 }
336 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
337 }
338
339
ctrl_get_sta_counter(struct wlantest * wt,int sock,u8 * cmd,size_t clen)340 static void ctrl_get_sta_counter(struct wlantest *wt, int sock, u8 *cmd,
341 size_t clen)
342 {
343 u8 *addr;
344 size_t addr_len;
345 struct wlantest_bss *bss;
346 struct wlantest_sta *sta;
347 u32 counter;
348 u8 buf[4 + 12], *end, *pos;
349
350 bss = ctrl_get_bss(wt, sock, cmd, clen);
351 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
352 if (sta == NULL)
353 return;
354
355 addr = attr_get(cmd, clen, WLANTEST_ATTR_STA_COUNTER, &addr_len);
356 if (addr == NULL || addr_len != 4) {
357 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
358 return;
359 }
360 counter = WPA_GET_BE32(addr);
361 if (counter >= NUM_WLANTEST_STA_COUNTER) {
362 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
363 return;
364 }
365
366 pos = buf;
367 end = buf + sizeof(buf);
368 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
369 pos += 4;
370 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
371 sta->counters[counter]);
372 ctrl_send(wt, sock, buf, pos - buf);
373 }
374
375
ctrl_get_bss_counter(struct wlantest * wt,int sock,u8 * cmd,size_t clen)376 static void ctrl_get_bss_counter(struct wlantest *wt, int sock, u8 *cmd,
377 size_t clen)
378 {
379 u8 *addr;
380 size_t addr_len;
381 struct wlantest_bss *bss;
382 u32 counter;
383 u8 buf[4 + 12], *end, *pos;
384
385 bss = ctrl_get_bss(wt, sock, cmd, clen);
386 if (bss == NULL)
387 return;
388
389 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSS_COUNTER, &addr_len);
390 if (addr == NULL || addr_len != 4) {
391 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
392 return;
393 }
394 counter = WPA_GET_BE32(addr);
395 if (counter >= NUM_WLANTEST_BSS_COUNTER) {
396 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
397 return;
398 }
399
400 pos = buf;
401 end = buf + sizeof(buf);
402 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
403 pos += 4;
404 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
405 bss->counters[counter]);
406 ctrl_send(wt, sock, buf, pos - buf);
407 }
408
409
ctrl_get_tdls_counter(struct wlantest * wt,int sock,u8 * cmd,size_t clen)410 static void ctrl_get_tdls_counter(struct wlantest *wt, int sock, u8 *cmd,
411 size_t clen)
412 {
413 u8 *addr;
414 size_t addr_len;
415 struct wlantest_bss *bss;
416 struct wlantest_sta *sta;
417 struct wlantest_sta *sta2;
418 struct wlantest_tdls *tdls;
419 u32 counter;
420 u8 buf[4 + 12], *end, *pos;
421 int found = 0;
422
423 bss = ctrl_get_bss(wt, sock, cmd, clen);
424 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
425 sta2 = ctrl_get_sta2(wt, sock, cmd, clen, bss);
426 if (sta == NULL || sta2 == NULL) {
427 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
428 return;
429 }
430
431 addr = attr_get(cmd, clen, WLANTEST_ATTR_TDLS_COUNTER, &addr_len);
432 if (addr == NULL || addr_len != 4) {
433 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
434 return;
435 }
436 counter = WPA_GET_BE32(addr);
437 if (counter >= NUM_WLANTEST_TDLS_COUNTER) {
438 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
439 return;
440 }
441
442 dl_list_for_each(tdls, &bss->tdls, struct wlantest_tdls, list) {
443 if (tdls->init == sta && tdls->resp == sta2) {
444 found = 1;
445 break;
446 }
447 }
448
449 if (!found) {
450 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
451 return;
452 }
453
454 pos = buf;
455 end = buf + sizeof(buf);
456 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
457 pos += 4;
458 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
459 tdls->counters[counter]);
460 ctrl_send(wt, sock, buf, pos - buf);
461 }
462
463
build_mgmt_hdr(struct ieee80211_mgmt * mgmt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,int stype)464 static void build_mgmt_hdr(struct ieee80211_mgmt *mgmt,
465 struct wlantest_bss *bss, struct wlantest_sta *sta,
466 int sender_ap, int stype)
467 {
468 os_memset(mgmt, 0, 24);
469 mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, stype);
470 if (sender_ap) {
471 if (sta)
472 os_memcpy(mgmt->da, sta->addr, ETH_ALEN);
473 else
474 os_memset(mgmt->da, 0xff, ETH_ALEN);
475 os_memcpy(mgmt->sa, bss->bssid, ETH_ALEN);
476 } else {
477 os_memcpy(mgmt->da, bss->bssid, ETH_ALEN);
478 os_memcpy(mgmt->sa, sta->addr, ETH_ALEN);
479 }
480 os_memcpy(mgmt->bssid, bss->bssid, ETH_ALEN);
481 }
482
483
ctrl_inject_auth(struct wlantest * wt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,enum wlantest_inject_protection prot)484 static int ctrl_inject_auth(struct wlantest *wt, struct wlantest_bss *bss,
485 struct wlantest_sta *sta, int sender_ap,
486 enum wlantest_inject_protection prot)
487 {
488 struct ieee80211_mgmt mgmt;
489
490 if (prot != WLANTEST_INJECT_NORMAL &&
491 prot != WLANTEST_INJECT_UNPROTECTED)
492 return -1; /* Authentication frame is never protected */
493 if (sta == NULL)
494 return -1; /* No broadcast Authentication frames */
495
496 if (sender_ap)
497 wpa_printf(MSG_INFO, "INJECT: Auth " MACSTR " -> " MACSTR,
498 MAC2STR(bss->bssid), MAC2STR(sta->addr));
499 else
500 wpa_printf(MSG_INFO, "INJECT: Auth " MACSTR " -> " MACSTR,
501 MAC2STR(sta->addr), MAC2STR(bss->bssid));
502 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_AUTH);
503
504 mgmt.u.auth.auth_alg = host_to_le16(WLAN_AUTH_OPEN);
505 mgmt.u.auth.auth_transaction = host_to_le16(1);
506 mgmt.u.auth.status_code = host_to_le16(WLAN_STATUS_SUCCESS);
507
508 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 6,
509 WLANTEST_INJECT_UNPROTECTED);
510 }
511
512
ctrl_inject_assocreq(struct wlantest * wt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,enum wlantest_inject_protection prot)513 static int ctrl_inject_assocreq(struct wlantest *wt, struct wlantest_bss *bss,
514 struct wlantest_sta *sta, int sender_ap,
515 enum wlantest_inject_protection prot)
516 {
517 u8 *buf;
518 struct ieee80211_mgmt *mgmt;
519 int ret;
520
521 if (prot != WLANTEST_INJECT_NORMAL &&
522 prot != WLANTEST_INJECT_UNPROTECTED)
523 return -1; /* Association Request frame is never protected */
524 if (sta == NULL)
525 return -1; /* No broadcast Association Request frames */
526 if (sender_ap)
527 return -1; /* No Association Request frame sent by AP */
528 if (sta->assocreq_ies == NULL) {
529 wpa_printf(MSG_INFO, "INJECT: No previous (Re)Association "
530 "Request available for " MACSTR,
531 MAC2STR(sta->addr));
532 return -1;
533 }
534
535 wpa_printf(MSG_INFO, "INJECT: AssocReq " MACSTR " -> " MACSTR,
536 MAC2STR(sta->addr), MAC2STR(bss->bssid));
537 buf = os_malloc(sizeof(*mgmt) + sta->assocreq_ies_len);
538 if (buf == NULL)
539 return -1;
540 mgmt = (struct ieee80211_mgmt *) buf;
541
542 build_mgmt_hdr(mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_ASSOC_REQ);
543
544 mgmt->u.assoc_req.capab_info = host_to_le16(sta->assocreq_capab_info);
545 mgmt->u.assoc_req.listen_interval =
546 host_to_le16(sta->assocreq_listen_int);
547 os_memcpy(mgmt->u.assoc_req.variable, sta->assocreq_ies,
548 sta->assocreq_ies_len);
549
550 ret = wlantest_inject(wt, bss, sta, buf,
551 24 + 4 + sta->assocreq_ies_len,
552 WLANTEST_INJECT_UNPROTECTED);
553 os_free(buf);
554 return ret;
555 }
556
557
ctrl_inject_reassocreq(struct wlantest * wt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,enum wlantest_inject_protection prot)558 static int ctrl_inject_reassocreq(struct wlantest *wt,
559 struct wlantest_bss *bss,
560 struct wlantest_sta *sta, int sender_ap,
561 enum wlantest_inject_protection prot)
562 {
563 u8 *buf;
564 struct ieee80211_mgmt *mgmt;
565 int ret;
566
567 if (prot != WLANTEST_INJECT_NORMAL &&
568 prot != WLANTEST_INJECT_UNPROTECTED)
569 return -1; /* Reassociation Request frame is never protected */
570 if (sta == NULL)
571 return -1; /* No broadcast Reassociation Request frames */
572 if (sender_ap)
573 return -1; /* No Reassociation Request frame sent by AP */
574 if (sta->assocreq_ies == NULL) {
575 wpa_printf(MSG_INFO, "INJECT: No previous (Re)Association "
576 "Request available for " MACSTR,
577 MAC2STR(sta->addr));
578 return -1;
579 }
580
581 wpa_printf(MSG_INFO, "INJECT: ReassocReq " MACSTR " -> " MACSTR,
582 MAC2STR(sta->addr), MAC2STR(bss->bssid));
583 buf = os_malloc(sizeof(*mgmt) + sta->assocreq_ies_len);
584 if (buf == NULL)
585 return -1;
586 mgmt = (struct ieee80211_mgmt *) buf;
587
588 build_mgmt_hdr(mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_REASSOC_REQ);
589
590 mgmt->u.reassoc_req.capab_info =
591 host_to_le16(sta->assocreq_capab_info);
592 mgmt->u.reassoc_req.listen_interval =
593 host_to_le16(sta->assocreq_listen_int);
594 os_memcpy(mgmt->u.reassoc_req.current_ap, bss->bssid, ETH_ALEN);
595 os_memcpy(mgmt->u.reassoc_req.variable, sta->assocreq_ies,
596 sta->assocreq_ies_len);
597
598 ret = wlantest_inject(wt, bss, sta, buf,
599 24 + 10 + sta->assocreq_ies_len,
600 WLANTEST_INJECT_UNPROTECTED);
601 os_free(buf);
602 return ret;
603 }
604
605
ctrl_inject_deauth(struct wlantest * wt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,enum wlantest_inject_protection prot)606 static int ctrl_inject_deauth(struct wlantest *wt, struct wlantest_bss *bss,
607 struct wlantest_sta *sta, int sender_ap,
608 enum wlantest_inject_protection prot)
609 {
610 struct ieee80211_mgmt mgmt;
611
612 if (sender_ap) {
613 if (sta)
614 wpa_printf(MSG_INFO, "INJECT: Deauth " MACSTR " -> "
615 MACSTR,
616 MAC2STR(bss->bssid), MAC2STR(sta->addr));
617 else
618 wpa_printf(MSG_INFO, "INJECT: Deauth " MACSTR
619 " -> broadcast", MAC2STR(bss->bssid));
620 } else
621 wpa_printf(MSG_INFO, "INJECT: Deauth " MACSTR " -> " MACSTR,
622 MAC2STR(sta->addr), MAC2STR(bss->bssid));
623 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_DEAUTH);
624
625 mgmt.u.deauth.reason_code = host_to_le16(WLAN_REASON_UNSPECIFIED);
626
627 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 2, prot);
628 }
629
630
ctrl_inject_disassoc(struct wlantest * wt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,enum wlantest_inject_protection prot)631 static int ctrl_inject_disassoc(struct wlantest *wt, struct wlantest_bss *bss,
632 struct wlantest_sta *sta, int sender_ap,
633 enum wlantest_inject_protection prot)
634 {
635 struct ieee80211_mgmt mgmt;
636
637 if (sender_ap) {
638 if (sta)
639 wpa_printf(MSG_INFO, "INJECT: Disassoc " MACSTR " -> "
640 MACSTR,
641 MAC2STR(bss->bssid), MAC2STR(sta->addr));
642 else
643 wpa_printf(MSG_INFO, "INJECT: Disassoc " MACSTR
644 " -> broadcast", MAC2STR(bss->bssid));
645 } else
646 wpa_printf(MSG_INFO, "INJECT: Disassoc " MACSTR " -> " MACSTR,
647 MAC2STR(sta->addr), MAC2STR(bss->bssid));
648 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_DISASSOC);
649
650 mgmt.u.disassoc.reason_code = host_to_le16(WLAN_REASON_UNSPECIFIED);
651
652 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 2, prot);
653 }
654
655
ctrl_inject_saqueryreq(struct wlantest * wt,struct wlantest_bss * bss,struct wlantest_sta * sta,int sender_ap,enum wlantest_inject_protection prot)656 static int ctrl_inject_saqueryreq(struct wlantest *wt,
657 struct wlantest_bss *bss,
658 struct wlantest_sta *sta, int sender_ap,
659 enum wlantest_inject_protection prot)
660 {
661 struct ieee80211_mgmt mgmt;
662
663 if (sta == NULL)
664 return -1; /* No broadcast SA Query frames */
665
666 if (sender_ap)
667 wpa_printf(MSG_INFO, "INJECT: SA Query Request " MACSTR " -> "
668 MACSTR, MAC2STR(bss->bssid), MAC2STR(sta->addr));
669 else
670 wpa_printf(MSG_INFO, "INJECT: SA Query Request " MACSTR " -> "
671 MACSTR, MAC2STR(sta->addr), MAC2STR(bss->bssid));
672 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_ACTION);
673
674 mgmt.u.action.category = WLAN_ACTION_SA_QUERY;
675 mgmt.u.action.u.sa_query_req.action = WLAN_SA_QUERY_REQUEST;
676 mgmt.u.action.u.sa_query_req.trans_id[0] = 0x12;
677 mgmt.u.action.u.sa_query_req.trans_id[1] = 0x34;
678 os_memcpy(sender_ap ? sta->ap_sa_query_tr : sta->sta_sa_query_tr,
679 mgmt.u.action.u.sa_query_req.trans_id,
680 WLAN_SA_QUERY_TR_ID_LEN);
681 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 4, prot);
682 }
683
684
ctrl_inject(struct wlantest * wt,int sock,u8 * cmd,size_t clen)685 static void ctrl_inject(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
686 {
687 u8 *bssid, *sta_addr;
688 struct wlantest_bss *bss;
689 struct wlantest_sta *sta;
690 int frame, sender_ap, prot;
691 int ret = 0;
692
693 bssid = attr_get_macaddr(cmd, clen, WLANTEST_ATTR_BSSID);
694 sta_addr = attr_get_macaddr(cmd, clen, WLANTEST_ATTR_STA_ADDR);
695 frame = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_FRAME);
696 sender_ap = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_SENDER_AP);
697 if (sender_ap < 0)
698 sender_ap = 0;
699 prot = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_PROTECTION);
700 if (bssid == NULL || sta_addr == NULL || frame < 0 || prot < 0) {
701 wpa_printf(MSG_INFO, "Invalid inject command parameters");
702 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
703 return;
704 }
705
706 bss = bss_find(wt, bssid);
707 if (bss == NULL) {
708 wpa_printf(MSG_INFO, "BSS not found for inject command");
709 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
710 return;
711 }
712
713 if (is_broadcast_ether_addr(sta_addr)) {
714 if (!sender_ap) {
715 wpa_printf(MSG_INFO, "Invalid broadcast inject "
716 "command without sender_ap set");
717 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
718 return;
719 } sta = NULL;
720 } else {
721 sta = sta_find(bss, sta_addr);
722 if (sta == NULL) {
723 wpa_printf(MSG_INFO, "Station not found for inject "
724 "command");
725 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
726 return;
727 }
728 }
729
730 switch (frame) {
731 case WLANTEST_FRAME_AUTH:
732 ret = ctrl_inject_auth(wt, bss, sta, sender_ap, prot);
733 break;
734 case WLANTEST_FRAME_ASSOCREQ:
735 ret = ctrl_inject_assocreq(wt, bss, sta, sender_ap, prot);
736 break;
737 case WLANTEST_FRAME_REASSOCREQ:
738 ret = ctrl_inject_reassocreq(wt, bss, sta, sender_ap, prot);
739 break;
740 case WLANTEST_FRAME_DEAUTH:
741 ret = ctrl_inject_deauth(wt, bss, sta, sender_ap, prot);
742 break;
743 case WLANTEST_FRAME_DISASSOC:
744 ret = ctrl_inject_disassoc(wt, bss, sta, sender_ap, prot);
745 break;
746 case WLANTEST_FRAME_SAQUERYREQ:
747 ret = ctrl_inject_saqueryreq(wt, bss, sta, sender_ap, prot);
748 break;
749 default:
750 wpa_printf(MSG_INFO, "Unsupported inject command frame %d",
751 frame);
752 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
753 return;
754 }
755
756 if (ret)
757 wpa_printf(MSG_INFO, "Failed to inject frame");
758 else
759 wpa_printf(MSG_INFO, "Frame injected successfully");
760 ctrl_send_simple(wt, sock, ret == 0 ? WLANTEST_CTRL_SUCCESS :
761 WLANTEST_CTRL_FAILURE);
762 }
763
764
ctrl_version(struct wlantest * wt,int sock)765 static void ctrl_version(struct wlantest *wt, int sock)
766 {
767 u8 buf[WLANTEST_CTRL_MAX_RESP_LEN], *pos;
768
769 pos = buf;
770 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
771 pos += 4;
772 pos = attr_add_str(pos, buf + sizeof(buf), WLANTEST_ATTR_VERSION,
773 VERSION_STR);
774 ctrl_send(wt, sock, buf, pos - buf);
775 }
776
777
ctrl_add_passphrase(struct wlantest * wt,int sock,u8 * cmd,size_t clen)778 static void ctrl_add_passphrase(struct wlantest *wt, int sock, u8 *cmd,
779 size_t clen)
780 {
781 u8 *passphrase;
782 size_t len;
783 struct wlantest_passphrase *p, *pa;
784 u8 *bssid;
785
786 passphrase = attr_get(cmd, clen, WLANTEST_ATTR_PASSPHRASE, &len);
787 if (passphrase == NULL) {
788 u8 *wepkey;
789 char *key;
790 enum wlantest_ctrl_cmd res;
791
792 wepkey = attr_get(cmd, clen, WLANTEST_ATTR_WEPKEY, &len);
793 if (wepkey == NULL) {
794 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
795 return;
796 }
797 key = os_zalloc(len + 1);
798 if (key == NULL) {
799 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
800 return;
801 }
802 os_memcpy(key, wepkey, len);
803 if (add_wep(wt, key) < 0)
804 res = WLANTEST_CTRL_FAILURE;
805 else
806 res = WLANTEST_CTRL_SUCCESS;
807 os_free(key);
808 ctrl_send_simple(wt, sock, res);
809 return;
810 }
811
812 if (len < 8 || len > 63) {
813 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
814 return;
815 }
816
817 p = os_zalloc(sizeof(*p));
818 if (p == NULL) {
819 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
820 return;
821 }
822 os_memcpy(p->passphrase, passphrase, len);
823 wpa_printf(MSG_INFO, "Add passphrase '%s'", p->passphrase);
824
825 bssid = attr_get_macaddr(cmd, clen, WLANTEST_ATTR_BSSID);
826 if (bssid) {
827 os_memcpy(p->bssid, bssid, ETH_ALEN);
828 wpa_printf(MSG_INFO, "Limit passphrase for BSSID " MACSTR,
829 MAC2STR(p->bssid));
830 }
831
832 dl_list_for_each(pa, &wt->passphrase, struct wlantest_passphrase, list)
833 {
834 if (os_strcmp(p->passphrase, pa->passphrase) == 0 &&
835 ether_addr_equal(p->bssid, pa->bssid)) {
836 wpa_printf(MSG_INFO, "Passphrase was already known");
837 os_free(p);
838 p = NULL;
839 break;
840 }
841 }
842
843 if (p) {
844 struct wlantest_bss *bss;
845 dl_list_add(&wt->passphrase, &p->list);
846 dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
847 if (bssid &&
848 !ether_addr_equal(p->bssid, bss->bssid))
849 continue;
850 bss_add_pmk_from_passphrase(bss, p->passphrase);
851 }
852 }
853
854 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
855 }
856
857
info_print_proto(char * buf,size_t len,int proto)858 static void info_print_proto(char *buf, size_t len, int proto)
859 {
860 char *pos, *end;
861
862 if (proto == 0) {
863 os_snprintf(buf, len, "OPEN");
864 return;
865 }
866
867 pos = buf;
868 end = buf + len;
869
870 if (proto & WPA_PROTO_WPA)
871 pos += os_snprintf(pos, end - pos, "%sWPA",
872 pos == buf ? "" : " ");
873 if (proto & WPA_PROTO_RSN)
874 pos += os_snprintf(pos, end - pos, "%sWPA2",
875 pos == buf ? "" : " ");
876 }
877
878
info_print_cipher(char * buf,size_t len,int cipher)879 static void info_print_cipher(char *buf, size_t len, int cipher)
880 {
881 char *pos, *end;
882
883 if (cipher == 0) {
884 os_snprintf(buf, len, "N/A");
885 return;
886 }
887
888 pos = buf;
889 end = buf + len;
890
891 if (cipher & WPA_CIPHER_NONE)
892 pos += os_snprintf(pos, end - pos, "%sNONE",
893 pos == buf ? "" : " ");
894 if (cipher & WPA_CIPHER_WEP40)
895 pos += os_snprintf(pos, end - pos, "%sWEP40",
896 pos == buf ? "" : " ");
897 if (cipher & WPA_CIPHER_WEP104)
898 pos += os_snprintf(pos, end - pos, "%sWEP104",
899 pos == buf ? "" : " ");
900 if (cipher & WPA_CIPHER_TKIP)
901 pos += os_snprintf(pos, end - pos, "%sTKIP",
902 pos == buf ? "" : " ");
903 if (cipher & WPA_CIPHER_CCMP)
904 pos += os_snprintf(pos, end - pos, "%sCCMP",
905 pos == buf ? "" : " ");
906 if (cipher & WPA_CIPHER_AES_128_CMAC)
907 pos += os_snprintf(pos, end - pos, "%sBIP",
908 pos == buf ? "" : " ");
909 if (cipher & WPA_CIPHER_BIP_GMAC_128)
910 pos += os_snprintf(pos, end - pos, "%sBIP-GMAC-128",
911 pos == buf ? "" : " ");
912 if (cipher & WPA_CIPHER_BIP_GMAC_256)
913 pos += os_snprintf(pos, end - pos, "%sBIP-GMAC-256",
914 pos == buf ? "" : " ");
915 if (cipher & WPA_CIPHER_BIP_CMAC_256)
916 pos += os_snprintf(pos, end - pos, "%sBIP-CMAC-256",
917 pos == buf ? "" : " ");
918 }
919
920
info_print_key_mgmt(char * buf,size_t len,int key_mgmt)921 static void info_print_key_mgmt(char *buf, size_t len, int key_mgmt)
922 {
923 char *pos, *end;
924
925 if (key_mgmt == 0) {
926 os_snprintf(buf, len, "N/A");
927 return;
928 }
929
930 pos = buf;
931 end = buf + len;
932
933 if (key_mgmt & WPA_KEY_MGMT_IEEE8021X)
934 pos += os_snprintf(pos, end - pos, "%sEAP",
935 pos == buf ? "" : " ");
936 if (key_mgmt & WPA_KEY_MGMT_PSK)
937 pos += os_snprintf(pos, end - pos, "%sPSK",
938 pos == buf ? "" : " ");
939 if (key_mgmt & WPA_KEY_MGMT_WPA_NONE)
940 pos += os_snprintf(pos, end - pos, "%sWPA-NONE",
941 pos == buf ? "" : " ");
942 if (key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X)
943 pos += os_snprintf(pos, end - pos, "%sFT-EAP",
944 pos == buf ? "" : " ");
945 if (key_mgmt & WPA_KEY_MGMT_FT_PSK)
946 pos += os_snprintf(pos, end - pos, "%sFT-PSK",
947 pos == buf ? "" : " ");
948 if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256)
949 pos += os_snprintf(pos, end - pos, "%sEAP-SHA256",
950 pos == buf ? "" : " ");
951 if (key_mgmt & WPA_KEY_MGMT_PSK_SHA256)
952 pos += os_snprintf(pos, end - pos, "%sPSK-SHA256",
953 pos == buf ? "" : " ");
954 if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
955 pos += os_snprintf(pos, end - pos, "%sEAP-SUITE-B",
956 pos == buf ? "" : " ");
957 if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
958 pos += os_snprintf(pos, end - pos, "%sEAP-SUITE-B-192",
959 pos == buf ? "" : " ");
960 if (key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA384)
961 pos += os_snprintf(pos, end - pos, "%sEAP-SHA384",
962 pos == buf ? "" : " ");
963 }
964
965
info_print_rsn_capab(char * buf,size_t len,int capab)966 static void info_print_rsn_capab(char *buf, size_t len, int capab)
967 {
968 char *pos, *end;
969
970 pos = buf;
971 end = buf + len;
972
973 if (capab & WPA_CAPABILITY_PREAUTH)
974 pos += os_snprintf(pos, end - pos, "%sPREAUTH",
975 pos == buf ? "" : " ");
976 if (capab & WPA_CAPABILITY_NO_PAIRWISE)
977 pos += os_snprintf(pos, end - pos, "%sNO_PAIRWISE",
978 pos == buf ? "" : " ");
979 if (capab & WPA_CAPABILITY_MFPR)
980 pos += os_snprintf(pos, end - pos, "%sMFPR",
981 pos == buf ? "" : " ");
982 if (capab & WPA_CAPABILITY_MFPC)
983 pos += os_snprintf(pos, end - pos, "%sMFPC",
984 pos == buf ? "" : " ");
985 if (capab & WPA_CAPABILITY_PEERKEY_ENABLED)
986 pos += os_snprintf(pos, end - pos, "%sPEERKEY",
987 pos == buf ? "" : " ");
988 if (capab & WPA_CAPABILITY_OCVC)
989 pos += os_snprintf(pos, end - pos, "%sOCVC",
990 pos == buf ? "" : " ");
991 }
992
993
info_print_state(char * buf,size_t len,int state)994 static void info_print_state(char *buf, size_t len, int state)
995 {
996 switch (state) {
997 case STATE1:
998 os_strlcpy(buf, "NOT-AUTH", len);
999 break;
1000 case STATE2:
1001 os_strlcpy(buf, "AUTH", len);
1002 break;
1003 case STATE3:
1004 os_strlcpy(buf, "AUTH+ASSOC", len);
1005 break;
1006 }
1007 }
1008
1009
info_print_gtk(char * buf,size_t len,struct wlantest_sta * sta)1010 static void info_print_gtk(char *buf, size_t len, struct wlantest_sta *sta)
1011 {
1012 size_t pos;
1013
1014 pos = os_snprintf(buf, len, "IDX=%d,GTK=", sta->gtk_idx);
1015 wpa_snprintf_hex(buf + pos, len - pos, sta->gtk, sta->gtk_len);
1016 }
1017
1018
ctrl_info_sta(struct wlantest * wt,int sock,u8 * cmd,size_t clen)1019 static void ctrl_info_sta(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
1020 {
1021 u8 *addr;
1022 size_t addr_len;
1023 struct wlantest_bss *bss;
1024 struct wlantest_sta *sta;
1025 enum wlantest_sta_info info;
1026 u8 buf[4 + 108], *end, *pos;
1027 char resp[100];
1028
1029 bss = ctrl_get_bss(wt, sock, cmd, clen);
1030 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
1031 if (sta == NULL)
1032 return;
1033
1034 addr = attr_get(cmd, clen, WLANTEST_ATTR_STA_INFO, &addr_len);
1035 if (addr == NULL || addr_len != 4) {
1036 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1037 return;
1038 }
1039 info = WPA_GET_BE32(addr);
1040
1041 resp[0] = '\0';
1042 switch (info) {
1043 case WLANTEST_STA_INFO_PROTO:
1044 info_print_proto(resp, sizeof(resp), sta->proto);
1045 break;
1046 case WLANTEST_STA_INFO_PAIRWISE:
1047 info_print_cipher(resp, sizeof(resp), sta->pairwise_cipher);
1048 break;
1049 case WLANTEST_STA_INFO_KEY_MGMT:
1050 info_print_key_mgmt(resp, sizeof(resp), sta->key_mgmt);
1051 break;
1052 case WLANTEST_STA_INFO_RSN_CAPAB:
1053 info_print_rsn_capab(resp, sizeof(resp), sta->rsn_capab);
1054 break;
1055 case WLANTEST_STA_INFO_STATE:
1056 info_print_state(resp, sizeof(resp), sta->state);
1057 break;
1058 case WLANTEST_STA_INFO_GTK:
1059 info_print_gtk(resp, sizeof(resp), sta);
1060 break;
1061 default:
1062 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1063 return;
1064 }
1065
1066 pos = buf;
1067 end = buf + sizeof(buf);
1068 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
1069 pos += 4;
1070 pos = attr_add_str(pos, end, WLANTEST_ATTR_INFO, resp);
1071 ctrl_send(wt, sock, buf, pos - buf);
1072 }
1073
1074
ctrl_info_bss(struct wlantest * wt,int sock,u8 * cmd,size_t clen)1075 static void ctrl_info_bss(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
1076 {
1077 u8 *addr;
1078 size_t addr_len;
1079 struct wlantest_bss *bss;
1080 enum wlantest_bss_info info;
1081 u8 buf[4 + 108], *end, *pos;
1082 char resp[100];
1083
1084 bss = ctrl_get_bss(wt, sock, cmd, clen);
1085 if (bss == NULL)
1086 return;
1087
1088 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSS_INFO, &addr_len);
1089 if (addr == NULL || addr_len != 4) {
1090 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1091 return;
1092 }
1093 info = WPA_GET_BE32(addr);
1094
1095 resp[0] = '\0';
1096 switch (info) {
1097 case WLANTEST_BSS_INFO_PROTO:
1098 info_print_proto(resp, sizeof(resp), bss->proto);
1099 break;
1100 case WLANTEST_BSS_INFO_PAIRWISE:
1101 info_print_cipher(resp, sizeof(resp), bss->pairwise_cipher);
1102 break;
1103 case WLANTEST_BSS_INFO_GROUP:
1104 info_print_cipher(resp, sizeof(resp), bss->group_cipher);
1105 break;
1106 case WLANTEST_BSS_INFO_GROUP_MGMT:
1107 info_print_cipher(resp, sizeof(resp), bss->mgmt_group_cipher);
1108 break;
1109 case WLANTEST_BSS_INFO_KEY_MGMT:
1110 info_print_key_mgmt(resp, sizeof(resp), bss->key_mgmt);
1111 break;
1112 case WLANTEST_BSS_INFO_RSN_CAPAB:
1113 info_print_rsn_capab(resp, sizeof(resp), bss->rsn_capab);
1114 break;
1115 default:
1116 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1117 return;
1118 }
1119
1120 pos = buf;
1121 end = buf + sizeof(buf);
1122 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
1123 pos += 4;
1124 pos = attr_add_str(pos, end, WLANTEST_ATTR_INFO, resp);
1125 ctrl_send(wt, sock, buf, pos - buf);
1126 }
1127
1128
ctrl_send_(struct wlantest * wt,int sock,u8 * cmd,size_t clen)1129 static void ctrl_send_(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
1130 {
1131 struct wlantest_bss *bss;
1132 struct wlantest_sta *sta;
1133 u8 *bssid, *sta_addr;
1134 int prot;
1135 u8 *frame;
1136 size_t frame_len;
1137 int ret = 0;
1138 struct ieee80211_hdr *hdr;
1139 u16 fc;
1140
1141 frame = attr_get(cmd, clen, WLANTEST_ATTR_FRAME, &frame_len);
1142 prot = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_PROTECTION);
1143 if (frame == NULL || frame_len < 24 || prot < 0) {
1144 wpa_printf(MSG_INFO, "Invalid send command parameters");
1145 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1146 return;
1147 }
1148
1149 hdr = (struct ieee80211_hdr *) frame;
1150 fc = le_to_host16(hdr->frame_control);
1151 switch (WLAN_FC_GET_TYPE(fc)) {
1152 case WLAN_FC_TYPE_MGMT:
1153 bssid = hdr->addr3;
1154 if (ether_addr_equal(hdr->addr2, hdr->addr3))
1155 sta_addr = hdr->addr1;
1156 else
1157 sta_addr = hdr->addr2;
1158 break;
1159 case WLAN_FC_TYPE_DATA:
1160 switch (fc & (WLAN_FC_TODS | WLAN_FC_FROMDS)) {
1161 case 0:
1162 bssid = hdr->addr3;
1163 sta_addr = hdr->addr2;
1164 break;
1165 case WLAN_FC_TODS:
1166 bssid = hdr->addr1;
1167 sta_addr = hdr->addr2;
1168 break;
1169 case WLAN_FC_FROMDS:
1170 bssid = hdr->addr2;
1171 sta_addr = hdr->addr1;
1172 break;
1173 default:
1174 wpa_printf(MSG_INFO, "Unsupported inject frame");
1175 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
1176 return;
1177 }
1178 break;
1179 default:
1180 wpa_printf(MSG_INFO, "Unsupported inject frame");
1181 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
1182 return;
1183 }
1184
1185 bss = bss_find(wt, bssid);
1186 if (bss == NULL && prot != WLANTEST_INJECT_UNPROTECTED) {
1187 wpa_printf(MSG_INFO, "Unknown BSSID");
1188 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
1189 return;
1190 }
1191
1192 if (bss)
1193 sta = sta_find(bss, sta_addr);
1194 else
1195 sta = NULL;
1196 if (sta == NULL && prot != WLANTEST_INJECT_UNPROTECTED) {
1197 wpa_printf(MSG_INFO, "Unknown STA address");
1198 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
1199 return;
1200 }
1201
1202 ret = wlantest_inject(wt, bss, sta, frame, frame_len, prot);
1203
1204 if (ret)
1205 wpa_printf(MSG_INFO, "Failed to inject frame");
1206 else
1207 wpa_printf(MSG_INFO, "Frame injected successfully");
1208 ctrl_send_simple(wt, sock, ret == 0 ? WLANTEST_CTRL_SUCCESS :
1209 WLANTEST_CTRL_FAILURE);
1210 }
1211
1212
ctrl_relog(struct wlantest * wt,int sock)1213 static void ctrl_relog(struct wlantest *wt, int sock)
1214 {
1215 int res = wlantest_relog(wt);
1216 ctrl_send_simple(wt, sock, res ? WLANTEST_CTRL_FAILURE :
1217 WLANTEST_CTRL_SUCCESS);
1218 }
1219
1220
ctrl_get_tx_tid(struct wlantest * wt,int sock,u8 * cmd,size_t clen)1221 static void ctrl_get_tx_tid(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
1222 {
1223 u8 *addr;
1224 size_t addr_len;
1225 struct wlantest_bss *bss;
1226 struct wlantest_sta *sta;
1227 u32 counter;
1228 u8 buf[4 + 12], *end, *pos;
1229
1230 bss = ctrl_get_bss(wt, sock, cmd, clen);
1231 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
1232 if (sta == NULL)
1233 return;
1234
1235 addr = attr_get(cmd, clen, WLANTEST_ATTR_TID, &addr_len);
1236 if (addr == NULL || addr_len != 4) {
1237 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1238 return;
1239 }
1240 counter = WPA_GET_BE32(addr);
1241 if (counter >= 16 + 1) {
1242 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1243 return;
1244 }
1245
1246 pos = buf;
1247 end = buf + sizeof(buf);
1248 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
1249 pos += 4;
1250 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
1251 sta->tx_tid[counter]);
1252 ctrl_send(wt, sock, buf, pos - buf);
1253 }
1254
1255
ctrl_get_rx_tid(struct wlantest * wt,int sock,u8 * cmd,size_t clen)1256 static void ctrl_get_rx_tid(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
1257 {
1258 u8 *addr;
1259 size_t addr_len;
1260 struct wlantest_bss *bss;
1261 struct wlantest_sta *sta;
1262 u32 counter;
1263 u8 buf[4 + 12], *end, *pos;
1264
1265 bss = ctrl_get_bss(wt, sock, cmd, clen);
1266 sta = ctrl_get_sta(wt, sock, cmd, clen, bss);
1267 if (sta == NULL)
1268 return;
1269
1270 addr = attr_get(cmd, clen, WLANTEST_ATTR_TID, &addr_len);
1271 if (addr == NULL || addr_len != 4) {
1272 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1273 return;
1274 }
1275 counter = WPA_GET_BE32(addr);
1276 if (counter >= 16 + 1) {
1277 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
1278 return;
1279 }
1280
1281 pos = buf;
1282 end = buf + sizeof(buf);
1283 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
1284 pos += 4;
1285 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
1286 sta->rx_tid[counter]);
1287 ctrl_send(wt, sock, buf, pos - buf);
1288 }
1289
1290
ctrl_read(int sock,void * eloop_ctx,void * sock_ctx)1291 static void ctrl_read(int sock, void *eloop_ctx, void *sock_ctx)
1292 {
1293 struct wlantest *wt = eloop_ctx;
1294 u8 buf[WLANTEST_CTRL_MAX_CMD_LEN];
1295 int len;
1296 enum wlantest_ctrl_cmd cmd;
1297
1298 wpa_printf(MSG_EXCESSIVE, "New control interface message from %d",
1299 sock);
1300 len = recv(sock, buf, sizeof(buf), 0);
1301 if (len < 0) {
1302 wpa_printf(MSG_INFO, "recv(ctrl): %s", strerror(errno));
1303 ctrl_disconnect(wt, sock);
1304 return;
1305 }
1306 if (len == 0) {
1307 ctrl_disconnect(wt, sock);
1308 return;
1309 }
1310
1311 if (len < 4) {
1312 wpa_printf(MSG_INFO, "Too short control interface command "
1313 "from %d", sock);
1314 ctrl_disconnect(wt, sock);
1315 return;
1316 }
1317 cmd = WPA_GET_BE32(buf);
1318 wpa_printf(MSG_EXCESSIVE, "Control interface command %d from %d",
1319 cmd, sock);
1320
1321 switch (cmd) {
1322 case WLANTEST_CTRL_PING:
1323 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
1324 break;
1325 case WLANTEST_CTRL_TERMINATE:
1326 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
1327 eloop_terminate();
1328 break;
1329 case WLANTEST_CTRL_LIST_BSS:
1330 ctrl_list_bss(wt, sock);
1331 break;
1332 case WLANTEST_CTRL_LIST_STA:
1333 ctrl_list_sta(wt, sock, buf + 4, len - 4);
1334 break;
1335 case WLANTEST_CTRL_FLUSH:
1336 ctrl_flush(wt, sock);
1337 break;
1338 case WLANTEST_CTRL_CLEAR_STA_COUNTERS:
1339 ctrl_clear_sta_counters(wt, sock, buf + 4, len - 4);
1340 break;
1341 case WLANTEST_CTRL_CLEAR_BSS_COUNTERS:
1342 ctrl_clear_bss_counters(wt, sock, buf + 4, len - 4);
1343 break;
1344 case WLANTEST_CTRL_CLEAR_TDLS_COUNTERS:
1345 ctrl_clear_tdls_counters(wt, sock, buf + 4, len - 4);
1346 break;
1347 case WLANTEST_CTRL_GET_STA_COUNTER:
1348 ctrl_get_sta_counter(wt, sock, buf + 4, len - 4);
1349 break;
1350 case WLANTEST_CTRL_GET_BSS_COUNTER:
1351 ctrl_get_bss_counter(wt, sock, buf + 4, len - 4);
1352 break;
1353 case WLANTEST_CTRL_GET_TDLS_COUNTER:
1354 ctrl_get_tdls_counter(wt, sock, buf + 4, len - 4);
1355 break;
1356 case WLANTEST_CTRL_INJECT:
1357 ctrl_inject(wt, sock, buf + 4, len - 4);
1358 break;
1359 case WLANTEST_CTRL_VERSION:
1360 ctrl_version(wt, sock);
1361 break;
1362 case WLANTEST_CTRL_ADD_PASSPHRASE:
1363 ctrl_add_passphrase(wt, sock, buf + 4, len - 4);
1364 break;
1365 case WLANTEST_CTRL_INFO_STA:
1366 ctrl_info_sta(wt, sock, buf + 4, len - 4);
1367 break;
1368 case WLANTEST_CTRL_INFO_BSS:
1369 ctrl_info_bss(wt, sock, buf + 4, len - 4);
1370 break;
1371 case WLANTEST_CTRL_SEND:
1372 ctrl_send_(wt, sock, buf + 4, len - 4);
1373 break;
1374 case WLANTEST_CTRL_RELOG:
1375 ctrl_relog(wt, sock);
1376 break;
1377 case WLANTEST_CTRL_GET_TX_TID:
1378 ctrl_get_tx_tid(wt, sock, buf + 4, len - 4);
1379 break;
1380 case WLANTEST_CTRL_GET_RX_TID:
1381 ctrl_get_rx_tid(wt, sock, buf + 4, len - 4);
1382 break;
1383 default:
1384 ctrl_send_simple(wt, sock, WLANTEST_CTRL_UNKNOWN_CMD);
1385 break;
1386 }
1387 }
1388
1389
ctrl_connect(int sock,void * eloop_ctx,void * sock_ctx)1390 static void ctrl_connect(int sock, void *eloop_ctx, void *sock_ctx)
1391 {
1392 struct wlantest *wt = eloop_ctx;
1393 int conn, i;
1394
1395 conn = accept(sock, NULL, NULL);
1396 if (conn < 0) {
1397 wpa_printf(MSG_INFO, "accept(ctrl): %s", strerror(errno));
1398 return;
1399 }
1400 wpa_printf(MSG_MSGDUMP, "New control interface connection %d", conn);
1401
1402 for (i = 0; i < MAX_CTRL_CONNECTIONS; i++) {
1403 if (wt->ctrl_socks[i] < 0)
1404 break;
1405 }
1406
1407 if (i == MAX_CTRL_CONNECTIONS) {
1408 wpa_printf(MSG_INFO, "No room for new control connection");
1409 close(conn);
1410 return;
1411 }
1412
1413 wt->ctrl_socks[i] = conn;
1414 eloop_register_read_sock(conn, ctrl_read, wt, NULL);
1415 }
1416
1417
ctrl_init(struct wlantest * wt)1418 int ctrl_init(struct wlantest *wt)
1419 {
1420 struct sockaddr_un addr;
1421
1422 wt->ctrl_sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
1423 if (wt->ctrl_sock < 0) {
1424 wpa_printf(MSG_ERROR, "socket: %s", strerror(errno));
1425 return -1;
1426 }
1427
1428 os_memset(&addr, 0, sizeof(addr));
1429 addr.sun_family = AF_UNIX;
1430 os_strlcpy(addr.sun_path + 1, WLANTEST_SOCK_NAME,
1431 sizeof(addr.sun_path) - 1);
1432 if (bind(wt->ctrl_sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1433 wpa_printf(MSG_ERROR, "bind: %s", strerror(errno));
1434 close(wt->ctrl_sock);
1435 wt->ctrl_sock = -1;
1436 return -1;
1437 }
1438
1439 if (listen(wt->ctrl_sock, 5) < 0) {
1440 wpa_printf(MSG_ERROR, "listen: %s", strerror(errno));
1441 close(wt->ctrl_sock);
1442 wt->ctrl_sock = -1;
1443 return -1;
1444 }
1445
1446 if (eloop_register_read_sock(wt->ctrl_sock, ctrl_connect, wt, NULL)) {
1447 close(wt->ctrl_sock);
1448 wt->ctrl_sock = -1;
1449 return -1;
1450 }
1451
1452 return 0;
1453 }
1454
1455
ctrl_deinit(struct wlantest * wt)1456 void ctrl_deinit(struct wlantest *wt)
1457 {
1458 int i;
1459
1460 if (wt->ctrl_sock < 0)
1461 return;
1462
1463 for (i = 0; i < MAX_CTRL_CONNECTIONS; i++) {
1464 if (wt->ctrl_socks[i] >= 0) {
1465 close(wt->ctrl_socks[i]);
1466 eloop_unregister_read_sock(wt->ctrl_socks[i]);
1467 wt->ctrl_socks[i] = -1;
1468 }
1469 }
1470
1471 eloop_unregister_read_sock(wt->ctrl_sock);
1472 close(wt->ctrl_sock);
1473 wt->ctrl_sock = -1;
1474 }
1475