2 * wlantest control interface
3 * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
15 #include "utils/includes.h"
18 #include "utils/common.h"
19 #include "utils/eloop.h"
20 #include "common/ieee802_11_defs.h"
22 #include "wlantest_ctrl.h"
25 static u8 * attr_get(u8 *buf, size_t buflen, enum wlantest_ctrl_attr attr,
30 while (pos + 8 <= buf + buflen) {
31 enum wlantest_ctrl_attr a;
33 a = WPA_GET_BE32(pos);
35 alen = WPA_GET_BE32(pos);
37 if (pos + alen > buf + buflen) {
38 wpa_printf(MSG_DEBUG, "Invalid control message "
53 static u8 * attr_get_macaddr(u8 *buf, size_t buflen,
54 enum wlantest_ctrl_attr attr)
58 addr = attr_get(buf, buflen, attr, &addr_len);
59 if (addr && addr_len != ETH_ALEN)
65 static int attr_get_int(u8 *buf, size_t buflen, enum wlantest_ctrl_attr attr)
69 pos = attr_get(buf, buflen, attr, &len);
70 if (pos == NULL || len != 4)
72 return WPA_GET_BE32(pos);
76 static u8 * attr_add_be32(u8 *pos, u8 *end, enum wlantest_ctrl_attr attr,
79 if (pos == NULL || end - pos < 12)
81 WPA_PUT_BE32(pos, attr);
85 WPA_PUT_BE32(pos, val);
91 static void ctrl_disconnect(struct wlantest *wt, int sock)
94 wpa_printf(MSG_DEBUG, "Disconnect control interface connection %d",
96 for (i = 0; i < MAX_CTRL_CONNECTIONS; i++) {
97 if (wt->ctrl_socks[i] == sock) {
98 close(wt->ctrl_socks[i]);
99 eloop_unregister_read_sock(wt->ctrl_socks[i]);
100 wt->ctrl_socks[i] = -1;
107 static void ctrl_send(struct wlantest *wt, int sock, const u8 *buf,
110 if (send(sock, buf, len, 0) < 0) {
111 wpa_printf(MSG_INFO, "send(ctrl): %s", strerror(errno));
112 ctrl_disconnect(wt, sock);
117 static void ctrl_send_simple(struct wlantest *wt, int sock,
118 enum wlantest_ctrl_cmd cmd)
121 WPA_PUT_BE32(buf, cmd);
122 ctrl_send(wt, sock, buf, sizeof(buf));
126 static void ctrl_list_bss(struct wlantest *wt, int sock)
128 u8 buf[WLANTEST_CTRL_MAX_RESP_LEN], *pos, *len;
129 struct wlantest_bss *bss;
132 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
134 WPA_PUT_BE32(pos, WLANTEST_ATTR_BSSID);
136 len = pos; /* to be filled */
139 dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
140 if (pos + ETH_ALEN > buf + WLANTEST_CTRL_MAX_RESP_LEN)
142 os_memcpy(pos, bss->bssid, ETH_ALEN);
146 WPA_PUT_BE32(len, pos - len - 4);
147 ctrl_send(wt, sock, buf, pos - buf);
151 static void ctrl_list_sta(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
153 u8 buf[WLANTEST_CTRL_MAX_RESP_LEN], *pos, *len;
156 struct wlantest_bss *bss;
157 struct wlantest_sta *sta;
159 bssid = attr_get(cmd, clen, WLANTEST_ATTR_BSSID, &bssid_len);
160 if (bssid == NULL || bssid_len != ETH_ALEN) {
161 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
165 bss = bss_get(wt, bssid);
167 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
172 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
174 WPA_PUT_BE32(pos, WLANTEST_ATTR_STA_ADDR);
176 len = pos; /* to be filled */
179 dl_list_for_each(sta, &bss->sta, struct wlantest_sta, list) {
180 if (pos + ETH_ALEN > buf + WLANTEST_CTRL_MAX_RESP_LEN)
182 os_memcpy(pos, sta->addr, ETH_ALEN);
186 WPA_PUT_BE32(len, pos - len - 4);
187 ctrl_send(wt, sock, buf, pos - buf);
191 static void ctrl_flush(struct wlantest *wt, int sock)
193 wpa_printf(MSG_DEBUG, "Drop all collected BSS data");
195 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
199 static void ctrl_clear_sta_counters(struct wlantest *wt, int sock, u8 *cmd,
204 struct wlantest_bss *bss;
205 struct wlantest_sta *sta;
207 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSSID, &addr_len);
208 if (addr == NULL || addr_len != ETH_ALEN) {
209 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
213 bss = bss_get(wt, addr);
215 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
219 addr = attr_get(cmd, clen, WLANTEST_ATTR_STA_ADDR, &addr_len);
220 if (addr == NULL || addr_len != ETH_ALEN) {
221 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
225 sta = sta_get(bss, addr);
227 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
231 os_memset(sta->counters, 0, sizeof(sta->counters));
232 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
236 static void ctrl_clear_bss_counters(struct wlantest *wt, int sock, u8 *cmd,
241 struct wlantest_bss *bss;
243 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSSID, &addr_len);
244 if (addr == NULL || addr_len != ETH_ALEN) {
245 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
249 bss = bss_get(wt, addr);
251 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
255 os_memset(bss->counters, 0, sizeof(bss->counters));
256 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
260 static void ctrl_get_sta_counter(struct wlantest *wt, int sock, u8 *cmd,
265 struct wlantest_bss *bss;
266 struct wlantest_sta *sta;
268 u8 buf[4 + 12], *end, *pos;
270 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSSID, &addr_len);
271 if (addr == NULL || addr_len != ETH_ALEN) {
272 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
276 bss = bss_get(wt, addr);
278 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
282 addr = attr_get(cmd, clen, WLANTEST_ATTR_STA_ADDR, &addr_len);
283 if (addr == NULL || addr_len != ETH_ALEN) {
284 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
288 sta = sta_get(bss, addr);
290 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
294 addr = attr_get(cmd, clen, WLANTEST_ATTR_STA_COUNTER, &addr_len);
295 if (addr == NULL || addr_len != 4) {
296 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
299 counter = WPA_GET_BE32(addr);
300 if (counter >= NUM_WLANTEST_STA_COUNTER) {
301 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
306 end = buf + sizeof(buf);
307 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
309 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
310 sta->counters[counter]);
311 ctrl_send(wt, sock, buf, pos - buf);
315 static void ctrl_get_bss_counter(struct wlantest *wt, int sock, u8 *cmd,
320 struct wlantest_bss *bss;
322 u8 buf[4 + 12], *end, *pos;
324 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSSID, &addr_len);
325 if (addr == NULL || addr_len != ETH_ALEN) {
326 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
330 bss = bss_get(wt, addr);
332 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
336 addr = attr_get(cmd, clen, WLANTEST_ATTR_BSS_COUNTER, &addr_len);
337 if (addr == NULL || addr_len != 4) {
338 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
341 counter = WPA_GET_BE32(addr);
342 if (counter >= NUM_WLANTEST_BSS_COUNTER) {
343 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
348 end = buf + sizeof(buf);
349 WPA_PUT_BE32(pos, WLANTEST_CTRL_SUCCESS);
351 pos = attr_add_be32(pos, end, WLANTEST_ATTR_COUNTER,
352 bss->counters[counter]);
353 ctrl_send(wt, sock, buf, pos - buf);
357 static void build_mgmt_hdr(struct ieee80211_mgmt *mgmt,
358 struct wlantest_bss *bss, struct wlantest_sta *sta,
359 int sender_ap, int stype)
361 os_memset(mgmt, 0, 24);
362 mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, stype);
365 os_memcpy(mgmt->da, sta->addr, ETH_ALEN);
367 os_memset(mgmt->da, 0xff, ETH_ALEN);
368 os_memcpy(mgmt->sa, bss->bssid, ETH_ALEN);
370 os_memcpy(mgmt->da, bss->bssid, ETH_ALEN);
371 os_memcpy(mgmt->sa, sta->addr, ETH_ALEN);
373 os_memcpy(mgmt->bssid, bss->bssid, ETH_ALEN);
377 static int ctrl_inject_auth(struct wlantest *wt, struct wlantest_bss *bss,
378 struct wlantest_sta *sta, int sender_ap,
379 enum wlantest_inject_protection prot)
381 struct ieee80211_mgmt mgmt;
383 if (prot != WLANTEST_INJECT_NORMAL &&
384 prot != WLANTEST_INJECT_UNPROTECTED)
385 return -1; /* Authentication frame is never protected */
387 return -1; /* No broadcast Authentication frames */
390 wpa_printf(MSG_INFO, "INJECT: Auth " MACSTR " -> " MACSTR,
391 MAC2STR(bss->bssid), MAC2STR(sta->addr));
393 wpa_printf(MSG_INFO, "INJECT: Auth " MACSTR " -> " MACSTR,
394 MAC2STR(sta->addr), MAC2STR(bss->bssid));
395 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_AUTH);
397 mgmt.u.auth.auth_alg = host_to_le16(WLAN_AUTH_OPEN);
398 mgmt.u.auth.auth_transaction = host_to_le16(1);
399 mgmt.u.auth.status_code = host_to_le16(WLAN_STATUS_SUCCESS);
401 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 6,
402 WLANTEST_INJECT_UNPROTECTED);
406 static int ctrl_inject_assocreq(struct wlantest *wt, struct wlantest_bss *bss,
407 struct wlantest_sta *sta, int sender_ap,
408 enum wlantest_inject_protection prot)
411 struct ieee80211_mgmt *mgmt;
414 if (prot != WLANTEST_INJECT_NORMAL &&
415 prot != WLANTEST_INJECT_UNPROTECTED)
416 return -1; /* Association Request frame is never protected */
418 return -1; /* No broadcast Association Request frames */
420 return -1; /* No Association Request frame sent by AP */
421 if (sta->assocreq_ies == NULL) {
422 wpa_printf(MSG_INFO, "INJECT: No previous (Re)Association "
423 "Request available for " MACSTR,
428 wpa_printf(MSG_INFO, "INJECT: AssocReq " MACSTR " -> " MACSTR,
429 MAC2STR(sta->addr), MAC2STR(bss->bssid));
430 buf = os_malloc(sizeof(*mgmt) + sta->assocreq_ies_len);
433 mgmt = (struct ieee80211_mgmt *) buf;
435 build_mgmt_hdr(mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_ASSOC_REQ);
437 mgmt->u.assoc_req.capab_info = host_to_le16(sta->assocreq_capab_info);
438 mgmt->u.assoc_req.listen_interval =
439 host_to_le16(sta->assocreq_listen_int);
440 os_memcpy(mgmt->u.assoc_req.variable, sta->assocreq_ies,
441 sta->assocreq_ies_len);
443 ret = wlantest_inject(wt, bss, sta, buf,
444 24 + 4 + sta->assocreq_ies_len,
445 WLANTEST_INJECT_UNPROTECTED);
451 static int ctrl_inject_reassocreq(struct wlantest *wt,
452 struct wlantest_bss *bss,
453 struct wlantest_sta *sta, int sender_ap,
454 enum wlantest_inject_protection prot)
457 struct ieee80211_mgmt *mgmt;
460 if (prot != WLANTEST_INJECT_NORMAL &&
461 prot != WLANTEST_INJECT_UNPROTECTED)
462 return -1; /* Reassociation Request frame is never protected */
464 return -1; /* No broadcast Reassociation Request frames */
466 return -1; /* No Reassociation Request frame sent by AP */
467 if (sta->assocreq_ies == NULL) {
468 wpa_printf(MSG_INFO, "INJECT: No previous (Re)Association "
469 "Request available for " MACSTR,
474 wpa_printf(MSG_INFO, "INJECT: ReassocReq " MACSTR " -> " MACSTR,
475 MAC2STR(sta->addr), MAC2STR(bss->bssid));
476 buf = os_malloc(sizeof(*mgmt) + sta->assocreq_ies_len);
479 mgmt = (struct ieee80211_mgmt *) buf;
481 build_mgmt_hdr(mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_REASSOC_REQ);
483 mgmt->u.reassoc_req.capab_info =
484 host_to_le16(sta->assocreq_capab_info);
485 mgmt->u.reassoc_req.listen_interval =
486 host_to_le16(sta->assocreq_listen_int);
487 os_memcpy(mgmt->u.reassoc_req.current_ap, bss->bssid, ETH_ALEN);
488 os_memcpy(mgmt->u.reassoc_req.variable, sta->assocreq_ies,
489 sta->assocreq_ies_len);
491 ret = wlantest_inject(wt, bss, sta, buf,
492 24 + 10 + sta->assocreq_ies_len,
493 WLANTEST_INJECT_UNPROTECTED);
499 static int ctrl_inject_deauth(struct wlantest *wt, struct wlantest_bss *bss,
500 struct wlantest_sta *sta, int sender_ap,
501 enum wlantest_inject_protection prot)
503 struct ieee80211_mgmt mgmt;
507 wpa_printf(MSG_INFO, "INJECT: Deauth " MACSTR " -> "
509 MAC2STR(bss->bssid), MAC2STR(sta->addr));
511 wpa_printf(MSG_INFO, "INJECT: Deauth " MACSTR
512 " -> broadcast", MAC2STR(bss->bssid));
514 wpa_printf(MSG_INFO, "INJECT: Deauth " MACSTR " -> " MACSTR,
515 MAC2STR(sta->addr), MAC2STR(bss->bssid));
516 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_DEAUTH);
518 mgmt.u.deauth.reason_code = host_to_le16(WLAN_REASON_UNSPECIFIED);
520 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 2, prot);
524 static int ctrl_inject_disassoc(struct wlantest *wt, struct wlantest_bss *bss,
525 struct wlantest_sta *sta, int sender_ap,
526 enum wlantest_inject_protection prot)
528 struct ieee80211_mgmt mgmt;
532 wpa_printf(MSG_INFO, "INJECT: Disassoc " MACSTR " -> "
534 MAC2STR(bss->bssid), MAC2STR(sta->addr));
536 wpa_printf(MSG_INFO, "INJECT: Disassoc " MACSTR
537 " -> broadcast", MAC2STR(bss->bssid));
539 wpa_printf(MSG_INFO, "INJECT: Disassoc " MACSTR " -> " MACSTR,
540 MAC2STR(sta->addr), MAC2STR(bss->bssid));
541 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_DISASSOC);
543 mgmt.u.disassoc.reason_code = host_to_le16(WLAN_REASON_UNSPECIFIED);
545 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 2, prot);
549 static int ctrl_inject_saqueryreq(struct wlantest *wt,
550 struct wlantest_bss *bss,
551 struct wlantest_sta *sta, int sender_ap,
552 enum wlantest_inject_protection prot)
554 struct ieee80211_mgmt mgmt;
557 return -1; /* No broadcast SA Query frames */
560 wpa_printf(MSG_INFO, "INJECT: SA Query Request " MACSTR " -> "
561 MACSTR, MAC2STR(bss->bssid), MAC2STR(sta->addr));
563 wpa_printf(MSG_INFO, "INJECT: SA Query Request " MACSTR " -> "
564 MACSTR, MAC2STR(sta->addr), MAC2STR(bss->bssid));
565 build_mgmt_hdr(&mgmt, bss, sta, sender_ap, WLAN_FC_STYPE_ACTION);
567 mgmt.u.action.category = WLAN_ACTION_SA_QUERY;
568 mgmt.u.action.u.sa_query_req.action = WLAN_SA_QUERY_REQUEST;
569 mgmt.u.action.u.sa_query_req.trans_id[0] = 0x12;
570 mgmt.u.action.u.sa_query_req.trans_id[1] = 0x34;
571 os_memcpy(sender_ap ? sta->ap_sa_query_tr : sta->sta_sa_query_tr,
572 mgmt.u.action.u.sa_query_req.trans_id,
573 WLAN_SA_QUERY_TR_ID_LEN);
574 return wlantest_inject(wt, bss, sta, (u8 *) &mgmt, 24 + 4, prot);
578 static void ctrl_inject(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
580 u8 *bssid, *sta_addr;
581 struct wlantest_bss *bss;
582 struct wlantest_sta *sta;
583 int frame, sender_ap, prot;
586 bssid = attr_get_macaddr(cmd, clen, WLANTEST_ATTR_BSSID);
587 sta_addr = attr_get_macaddr(cmd, clen, WLANTEST_ATTR_STA_ADDR);
588 frame = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_FRAME);
589 sender_ap = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_SENDER_AP);
592 prot = attr_get_int(cmd, clen, WLANTEST_ATTR_INJECT_PROTECTION);
593 if (bssid == NULL || sta_addr == NULL || frame < 0 || prot < 0) {
594 wpa_printf(MSG_INFO, "Invalid inject command parameters");
595 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
599 bss = bss_get(wt, bssid);
601 wpa_printf(MSG_INFO, "BSS not found for inject command");
602 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
606 if (is_broadcast_ether_addr(sta_addr)) {
608 wpa_printf(MSG_INFO, "Invalid broadcast inject "
609 "command without sender_ap set");
610 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
614 sta = sta_get(bss, sta_addr);
616 wpa_printf(MSG_INFO, "Station not found for inject "
618 ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
624 case WLANTEST_FRAME_AUTH:
625 ret = ctrl_inject_auth(wt, bss, sta, sender_ap, prot);
627 case WLANTEST_FRAME_ASSOCREQ:
628 ret = ctrl_inject_assocreq(wt, bss, sta, sender_ap, prot);
630 case WLANTEST_FRAME_REASSOCREQ:
631 ret = ctrl_inject_reassocreq(wt, bss, sta, sender_ap, prot);
633 case WLANTEST_FRAME_DEAUTH:
634 ret = ctrl_inject_deauth(wt, bss, sta, sender_ap, prot);
636 case WLANTEST_FRAME_DISASSOC:
637 ret = ctrl_inject_disassoc(wt, bss, sta, sender_ap, prot);
639 case WLANTEST_FRAME_SAQUERYREQ:
640 ret = ctrl_inject_saqueryreq(wt, bss, sta, sender_ap, prot);
643 wpa_printf(MSG_INFO, "Unsupported inject command frame %d",
645 ctrl_send_simple(wt, sock, WLANTEST_CTRL_INVALID_CMD);
650 wpa_printf(MSG_INFO, "Failed to inject frame");
652 wpa_printf(MSG_INFO, "Frame injected successfully");
653 ctrl_send_simple(wt, sock, ret == 0 ? WLANTEST_CTRL_SUCCESS :
654 WLANTEST_CTRL_FAILURE);
658 static void ctrl_read(int sock, void *eloop_ctx, void *sock_ctx)
660 struct wlantest *wt = eloop_ctx;
661 u8 buf[WLANTEST_CTRL_MAX_CMD_LEN];
663 enum wlantest_ctrl_cmd cmd;
665 wpa_printf(MSG_EXCESSIVE, "New control interface message from %d",
667 len = recv(sock, buf, sizeof(buf), 0);
669 wpa_printf(MSG_INFO, "recv(ctrl): %s", strerror(errno));
670 ctrl_disconnect(wt, sock);
674 ctrl_disconnect(wt, sock);
679 wpa_printf(MSG_INFO, "Too short control interface command "
681 ctrl_disconnect(wt, sock);
684 cmd = WPA_GET_BE32(buf);
685 wpa_printf(MSG_EXCESSIVE, "Control interface command %d from %d",
689 case WLANTEST_CTRL_PING:
690 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
692 case WLANTEST_CTRL_TERMINATE:
693 ctrl_send_simple(wt, sock, WLANTEST_CTRL_SUCCESS);
696 case WLANTEST_CTRL_LIST_BSS:
697 ctrl_list_bss(wt, sock);
699 case WLANTEST_CTRL_LIST_STA:
700 ctrl_list_sta(wt, sock, buf + 4, len - 4);
702 case WLANTEST_CTRL_FLUSH:
703 ctrl_flush(wt, sock);
705 case WLANTEST_CTRL_CLEAR_STA_COUNTERS:
706 ctrl_clear_sta_counters(wt, sock, buf + 4, len - 4);
708 case WLANTEST_CTRL_CLEAR_BSS_COUNTERS:
709 ctrl_clear_bss_counters(wt, sock, buf + 4, len - 4);
711 case WLANTEST_CTRL_GET_STA_COUNTER:
712 ctrl_get_sta_counter(wt, sock, buf + 4, len - 4);
714 case WLANTEST_CTRL_GET_BSS_COUNTER:
715 ctrl_get_bss_counter(wt, sock, buf + 4, len - 4);
717 case WLANTEST_CTRL_INJECT:
718 ctrl_inject(wt, sock, buf + 4, len - 4);
721 ctrl_send_simple(wt, sock, WLANTEST_CTRL_UNKNOWN_CMD);
727 static void ctrl_connect(int sock, void *eloop_ctx, void *sock_ctx)
729 struct wlantest *wt = eloop_ctx;
732 conn = accept(sock, NULL, NULL);
734 wpa_printf(MSG_INFO, "accept(ctrl): %s", strerror(errno));
737 wpa_printf(MSG_MSGDUMP, "New control interface connection %d", conn);
739 for (i = 0; i < MAX_CTRL_CONNECTIONS; i++) {
740 if (wt->ctrl_socks[i] < 0)
744 if (i == MAX_CTRL_CONNECTIONS) {
745 wpa_printf(MSG_INFO, "No room for new control connection");
750 wt->ctrl_socks[i] = conn;
751 eloop_register_read_sock(conn, ctrl_read, wt, NULL);
755 int ctrl_init(struct wlantest *wt)
757 struct sockaddr_un addr;
759 wt->ctrl_sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
760 if (wt->ctrl_sock < 0) {
761 wpa_printf(MSG_ERROR, "socket: %s", strerror(errno));
765 os_memset(&addr, 0, sizeof(addr));
766 addr.sun_family = AF_UNIX;
767 os_strlcpy(addr.sun_path + 1, WLANTEST_SOCK_NAME,
768 sizeof(addr.sun_path) - 1);
769 if (bind(wt->ctrl_sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
770 wpa_printf(MSG_ERROR, "bind: %s", strerror(errno));
771 close(wt->ctrl_sock);
776 if (listen(wt->ctrl_sock, 5) < 0) {
777 wpa_printf(MSG_ERROR, "listen: %s", strerror(errno));
778 close(wt->ctrl_sock);
783 if (eloop_register_read_sock(wt->ctrl_sock, ctrl_connect, wt, NULL)) {
784 close(wt->ctrl_sock);
793 void ctrl_deinit(struct wlantest *wt)
797 if (wt->ctrl_sock < 0)
800 for (i = 0; i < MAX_CTRL_CONNECTIONS; i++) {
801 if (wt->ctrl_socks[i] >= 0) {
802 close(wt->ctrl_socks[i]);
803 eloop_unregister_read_sock(wt->ctrl_socks[i]);
804 wt->ctrl_socks[i] = -1;
808 eloop_unregister_read_sock(wt->ctrl_sock);
809 close(wt->ctrl_sock);