Lines Matching +full:ctrl +full:- +full:len
2 * WPA Supplicant / UNIX domain socket -based control interface
3 * Copyright (c) 2004-2020, Jouni Malinen <j@w1.fi>
32 /* Per-interface ctrl_iface */
59 size_t len;
67 size_t len,
77 size_t len)
84 if (len >= 5 && os_strncmp(buf, "PONG\n", 5) == 0)
90 sndbuf = -1;
93 outq = -1;
96 "CTRL-DEBUG: %s: sock=%d sndbuf=%d outq=%d send_len=%d",
97 title, sock, sndbuf, outq, (int) len);
125 return ctrl_iface_level(&priv->ctrl_dst, from, fromlen, level);
161 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from,
169 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from,
205 wpas_ctrl_sock_debug("ctrl_sock-sendto", sock, reply,
211 "ctrl_iface sendto failed: %d - %s",
228 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to send response to ATTACH - detaching");
231 &priv->ctrl_dst, &from, fromlen);
239 eapol_sm_notify_ctrl_attached(wpa_s->eapol);
246 size_t len;
250 if (wpa_s->conf->ctrl_interface == NULL)
253 pbuf = os_strdup(wpa_s->conf->ctrl_interface);
265 len = os_strlen(dir) + os_strlen(wpa_s->ifname) + 2;
266 buf = os_malloc(len);
272 res = os_snprintf(buf, len, "%s/%s", dir, wpa_s->ifname);
273 if (os_snprintf_error(len, res)) {
281 * as a file name - convert invalid chars to underscores */
319 gpriv = global->ctrl_iface;
320 while (gpriv && !dl_list_empty(&gpriv->msg_queue) &&
321 !wpas_ctrl_iface_throttle(gpriv->sock)) {
322 msg = dl_list_first(&gpriv->msg_queue, struct ctrl_iface_msg,
326 dl_list_del(&msg->list);
328 msg->wpa_s,
329 msg->type != WPA_MSG_PER_INTERFACE ?
330 NULL : msg->wpa_s->ifname,
331 gpriv->sock, &gpriv->ctrl_dst, msg->level,
332 msg->txt, msg->len, NULL, gpriv);
343 priv = wpa_s->ctrl_iface;
344 while (priv && !dl_list_empty(&priv->msg_queue) &&
345 !wpas_ctrl_iface_throttle(priv->sock)) {
346 msg = dl_list_first(&priv->msg_queue, struct ctrl_iface_msg,
350 dl_list_del(&msg->list);
351 wpa_supplicant_ctrl_iface_send(wpa_s, NULL, priv->sock,
352 &priv->ctrl_dst, msg->level,
353 msg->txt, msg->len, priv, NULL);
364 int sock = -1, gsock = -1;
366 wpas_ctrl_msg_send_pending_global(wpa_s->global);
369 priv = wpa_s->ctrl_iface;
370 if (priv && !dl_list_empty(&priv->msg_queue))
371 sock = priv->sock;
373 gpriv = wpa_s->global->ctrl_iface;
374 if (gpriv && !dl_list_empty(&gpriv->msg_queue))
375 gsock = gpriv->sock;
377 if (sock > -1 || gsock > -1) {
380 "CTRL: Had to throttle pending event message transmission for (sock %d gsock %d)",
391 const char *txt, size_t len)
395 msg = os_zalloc(sizeof(*msg) + len);
399 msg->wpa_s = wpa_s;
400 msg->level = level;
401 msg->type = type;
402 os_memcpy(msg + 1, txt, len);
403 msg->txt = (const char *) (msg + 1);
404 msg->len = len;
405 dl_list_add_tail(queue, &msg->list);
421 wpa_printf(MSG_DEBUG, "CTRL: Dropped oldest pending message");
422 dl_list_del(&msg->list);
430 const char *txt, size_t len)
439 gpriv = wpa_s->global->ctrl_iface;
442 !dl_list_empty(&gpriv->ctrl_dst)) {
443 if (!dl_list_empty(&gpriv->msg_queue) ||
444 wpas_ctrl_iface_throttle(gpriv->sock)) {
445 if (gpriv->throttle_count == 0) {
447 "CTRL: Had to throttle global event message for sock %d",
448 gpriv->sock);
450 gpriv->throttle_count++;
451 wpas_ctrl_msg_queue_limit(gpriv->throttle_count,
452 &gpriv->msg_queue);
453 wpas_ctrl_msg_queue(&gpriv->msg_queue, wpa_s, level,
454 type, txt, len);
456 if (gpriv->throttle_count) {
458 "CTRL: Had to throttle %u global event message(s) for sock %d",
459 gpriv->throttle_count, gpriv->sock);
461 gpriv->throttle_count = 0;
465 NULL : wpa_s->ifname,
466 gpriv->sock, &gpriv->ctrl_dst, level,
467 txt, len, NULL, gpriv);
471 priv = wpa_s->ctrl_iface;
474 if (!dl_list_empty(&priv->msg_queue) ||
475 wpas_ctrl_iface_throttle(priv->sock)) {
476 if (priv->throttle_count == 0) {
478 "CTRL: Had to throttle event message for sock %d",
479 priv->sock);
481 priv->throttle_count++;
482 wpas_ctrl_msg_queue_limit(priv->throttle_count,
483 &priv->msg_queue);
484 wpas_ctrl_msg_queue(&priv->msg_queue, wpa_s, level,
485 type, txt, len);
487 if (priv->throttle_count) {
489 "CTRL: Had to throttle %u event message(s) for sock %d",
490 priv->throttle_count, priv->sock);
492 priv->throttle_count = 0;
493 wpa_supplicant_ctrl_iface_send(wpa_s, NULL, priv->sock,
494 &priv->ctrl_dst, level,
495 txt, len, priv, NULL);
517 buf = os_strdup(wpa_s->conf->ctrl_interface);
522 wpa_s->conf->ctrl_interface);
523 priv->sock = android_get_control_socket(addr.sun_path);
524 if (priv->sock >= 0) {
525 priv->android_control_socket = 1;
538 gid_str = wpa_s->conf->ctrl_interface_group;
556 * directory without group access. This breaks things since Wi-Fi
562 wpa_printf(MSG_ERROR, "CTRL: Could not chmod directory: %s",
571 gid = grp->gr_gid;
577 /* Group name not found - try to parse this as gid */
580 wpa_printf(MSG_ERROR, "CTRL: Invalid group "
590 if (gid_set && lchown(dir, -1, gid) < 0) {
599 wpa_printf(MSG_ERROR, "CTRL: chmod[ctrl_interface]: %s",
604 if (os_strlen(dir) + 1 + os_strlen(wpa_s->ifname) >=
610 priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0);
611 if (priv->sock < 0) {
625 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
628 if (connect(priv->sock, (struct sockaddr *) &addr,
631 " allow connections - assuming it was left"
639 if (bind(priv->sock, (struct sockaddr *) &addr,
641 wpa_printf(MSG_ERROR, "supp-ctrl-iface-init: bind(PF_UNIX): %s",
649 "be in use - cannot override it");
658 if (gid_set && lchown(fname, -1, gid) < 0) {
676 * Make socket non-blocking so that we don't hang forever if
679 flags = fcntl(priv->sock, F_GETFL);
682 if (fcntl(priv->sock, F_SETFL, flags) < 0) {
683 wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s",
693 if (getsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &optval, &optlen) == -1) {
695 priv->sock, strerror(errno));
698 if (setsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &optval,
699 sizeof(optval)) == -1)
701 "sock=%d: %s", priv->sock, strerror(errno));
705 eloop_register_read_sock(priv->sock, wpa_supplicant_ctrl_iface_receive,
713 if (priv->sock >= 0) {
714 close(priv->sock);
715 priv->sock = -1;
722 return -1;
734 dl_list_init(&priv->ctrl_dst);
735 dl_list_init(&priv->msg_queue);
736 priv->wpa_s = wpa_s;
737 priv->sock = -1;
739 if (wpa_s->conf->ctrl_interface == NULL)
743 if (wpa_s->global->params.ctrl_interface) {
746 if (wpa_s->global->params.ctrl_interface[0] == '/') {
747 if (os_strcmp(wpa_s->global->params.ctrl_interface,
748 wpa_s->conf->ctrl_interface) == 0)
750 } else if (os_strncmp(wpa_s->global->params.ctrl_interface,
752 os_strncmp(wpa_s->global->params.ctrl_interface,
758 * convention for the global ctrl interface. This logic
762 pos = os_strchr(wpa_s->global->params.ctrl_interface,
766 wpa_s->conf->ctrl_interface) == 0)
775 * process, do not open the per-interface ctrl_iface
777 * was set from the command line since the Wi-Fi
781 "global ctrl interface %s matches ctrl interface %s - do not open per-interface ctrl interface",
782 wpa_s->global->params.ctrl_interface,
783 wpa_s->conf->ctrl_interface);
803 if (priv->sock <= 0)
804 return -1;
809 * service. Such a socket is maintained as a key-value pair in
813 if (priv->android_control_socket)
814 return priv->sock;
816 eloop_unregister_read_sock(priv->sock);
817 close(priv->sock);
818 priv->sock = -1;
821 return -1;
822 return priv->sock;
834 if (!global || !global->ctrl_iface)
837 gpriv = global->ctrl_iface;
838 dl_list_for_each_safe(msg, prev_msg, &gpriv->msg_queue,
840 if (msg->wpa_s == wpa_s) {
842 dl_list_del(&msg->list);
849 "CTRL: Dropped %u pending message(s) for interface that is being removed",
867 wpas_global_ctrl_iface_flush_queued_msg(wpa_s->global, wpa_s);
872 if (priv->sock > -1) {
875 eloop_unregister_read_sock(priv->sock);
876 if (!dl_list_empty(&priv->ctrl_dst)) {
886 close(priv->sock);
887 priv->sock = -1;
888 fname = wpa_supplicant_ctrl_iface_path(priv->wpa_s);
894 if (priv->wpa_s->conf->ctrl_interface == NULL)
896 buf = os_strdup(priv->wpa_s->conf->ctrl_interface);
911 "directory not empty - leaving it "
923 dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst,
925 dl_list_del(&dst->list);
928 dl_list_for_each_safe(msg, prev_msg, &priv->msg_queue,
930 dl_list_del(&msg->list);
933 gpriv = priv->wpa_s->global->ctrl_iface;
935 dl_list_for_each_safe(msg, prev_msg, &gpriv->msg_queue,
937 if (msg->wpa_s == priv->wpa_s) {
938 dl_list_del(&msg->list);
943 wpas_global_ctrl_iface_flush_queued_msg(wpa_s->global, wpa_s);
944 eloop_cancel_timeout(wpas_ctrl_msg_queue_timeout, priv->wpa_s, NULL);
950 * wpa_supplicant_ctrl_iface_send - Send a control interface packet to monitors
956 * @len: Message length
964 size_t len,
996 io[idx].iov_len = len;
1006 if (level < dst->debug_level)
1009 msg.msg_name = (void *) &dst->addr;
1010 msg.msg_namelen = dst->addrlen;
1011 wpas_ctrl_sock_debug("ctrl_sock-sendmsg", sock, buf, len);
1015 &dst->addr, dst->addrlen);
1016 dst->errors = 0;
1023 sockaddr_print(MSG_DEBUG, txt, &dst->addr, dst->addrlen);
1024 dst->errors++;
1026 if (dst->errors > 10 || _errno == ENOENT || _errno == EPERM) {
1028 &dst->addr, dst->addrlen);
1029 wpa_supplicant_ctrl_iface_detach(ctrl_dst, &dst->addr,
1030 dst->addrlen);
1045 wpa_s->global, gp);
1065 if (priv->sock == -1)
1069 wpa_printf(MSG_DEBUG, "CTRL_IFACE - %s - wait for monitor to "
1070 "attach", priv->wpa_s->ifname);
1071 eloop_wait_for_read_sock(priv->sock);
1073 res = recvfrom(priv->sock, buf, sizeof(buf) - 1, 0,
1084 if (!wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst,
1087 if (sendto(priv->sock, "OK\n", 3, 0,
1096 if (sendto(priv->sock, "FAIL\n", 5, 0,
1105 if (sendto(priv->sock, "FAIL\n", 5, 0,
1149 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from,
1155 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from,
1182 wpas_ctrl_sock_debug("global_ctrl_sock-sendto",
1199 const char *ctrl = global->params.ctrl_interface;
1202 wpa_printf(MSG_DEBUG, "Global control interface '%s'", ctrl);
1205 if (os_strncmp(ctrl, "@android:", 9) == 0) {
1206 priv->sock = android_get_control_socket(ctrl + 9);
1207 if (priv->sock < 0) {
1209 "socket '%s'", ctrl + 9);
1213 ctrl + 9);
1214 priv->android_control_socket = 1;
1218 if (os_strncmp(ctrl, "@abstract:", 10) != 0) {
1220 * Backwards compatibility - try to open an Android control
1224 priv->sock = android_get_control_socket(ctrl);
1225 if (priv->sock >= 0) {
1228 ctrl);
1229 priv->android_control_socket = 1;
1235 priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0);
1236 if (priv->sock < 0) {
1247 if (os_strncmp(ctrl, "@abstract:", 10) == 0) {
1249 os_strlcpy(addr.sun_path + 1, ctrl + 10,
1250 sizeof(addr.sun_path) - 1);
1251 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) <
1253 wpa_printf(MSG_ERROR, "supp-global-ctrl-iface-init: "
1255 ctrl, strerror(errno));
1259 ctrl + 10);
1263 os_strlcpy(addr.sun_path, ctrl, sizeof(addr.sun_path));
1264 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1265 wpa_printf(MSG_INFO, "supp-global-ctrl-iface-init(%s) (will try fixup): bind(PF_UNIX): %s",
1266 ctrl, strerror(errno));
1267 if (connect(priv->sock, (struct sockaddr *) &addr,
1270 " allow connections - assuming it was left"
1272 if (unlink(ctrl) < 0) {
1275 ctrl, strerror(errno));
1278 if (bind(priv->sock, (struct sockaddr *) &addr,
1280 wpa_printf(MSG_ERROR, "supp-glb-iface-init: bind(PF_UNIX;%s): %s",
1281 ctrl, strerror(errno));
1286 ctrl);
1289 "be in use - cannot override it");
1292 ctrl);
1297 wpa_printf(MSG_DEBUG, "Using UNIX control socket '%s'", ctrl);
1299 if (global->params.ctrl_interface_group) {
1300 char *gid_str = global->params.ctrl_interface_group;
1307 gid = grp->gr_gid;
1312 /* Group name not found - try to parse this as gid */
1315 wpa_printf(MSG_ERROR, "CTRL: Invalid group "
1322 if (lchown(ctrl, -1, gid) < 0) {
1325 ctrl, (int) gid, strerror(errno));
1329 if (chmod(ctrl, S_IRWXU | S_IRWXG) < 0) {
1332 ctrl, strerror(errno));
1336 if (chmod(ctrl, S_IRWXU) < 0) {
1339 ctrl, strerror(errno));
1348 * Make socket non-blocking so that we don't hang forever if
1351 flags = fcntl(priv->sock, F_GETFL);
1354 if (fcntl(priv->sock, F_SETFL, flags) < 0) {
1355 wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s",
1361 eloop_register_read_sock(priv->sock,
1368 if (priv->sock >= 0) {
1369 close(priv->sock);
1370 priv->sock = -1;
1372 return -1;
1384 dl_list_init(&priv->ctrl_dst);
1385 dl_list_init(&priv->msg_queue);
1386 priv->global = global;
1387 priv->sock = -1;
1389 if (global->params.ctrl_interface == NULL)
1408 if (priv->sock <= 0)
1409 return -1;
1414 * service. Such a socket is maintained as a key-value pair in
1418 if (priv->android_control_socket)
1419 return priv->sock;
1421 eloop_unregister_read_sock(priv->sock);
1422 close(priv->sock);
1423 priv->sock = -1;
1426 return -1;
1427 return priv->sock;
1437 if (priv->sock >= 0) {
1438 eloop_unregister_read_sock(priv->sock);
1439 close(priv->sock);
1441 if (priv->global->params.ctrl_interface)
1442 unlink(priv->global->params.ctrl_interface);
1443 dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst,
1445 dl_list_del(&dst->list);
1448 dl_list_for_each_safe(msg, prev_msg, &priv->msg_queue,
1450 dl_list_del(&msg->list);