void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level, char *buf, size_t len) { struct wpa_ctrl_dst *dst, *next; struct msghdr msg; int idx; struct iovec io[2]; char levelstr[10]; dst = hapd->ctrl_dst; if (hapd->ctrl_sock < 0 || dst == NULL) return; snprintf(levelstr, sizeof(levelstr), "<%d>", level); io[0].iov_base = levelstr; io[0].iov_len = strlen(levelstr); io[1].iov_base = buf; io[1].iov_len = len; memset(&msg, 0, sizeof(msg)); msg.msg_iov = io; msg.msg_iovlen = 2; idx = 0; while (dst) { next = dst->next; if (level >= dst->debug_level) { wpa_hexdump(MSG_DEBUG, "CTRL_IFACE monitor send", (u8 *) dst->addr.sun_path, dst->addrlen); msg.msg_name = &dst->addr; msg.msg_namelen = dst->addrlen; if (sendmsg(hapd->ctrl_sock, &msg, 0) < 0) { fprintf(stderr, "CTRL_IFACE monitor[%d]: ", idx); perror("sendmsg"); dst->errors++; if (dst->errors > 10) { hostapd_ctrl_iface_detach( hapd, &dst->addr, dst->addrlen); } } else dst->errors = 0; } idx++; dst = next; } }
static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx, void *sock_ctx) { struct hostapd_data *hapd = eloop_ctx; char buf[256]; int res; struct sockaddr_un from; socklen_t fromlen = sizeof(from); char *reply; const int reply_size = 4096; int reply_len; res = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &from, &fromlen); if (res < 0) { perror("recvfrom(ctrl_iface)"); return; } buf[res] = '\0'; #ifdef MODIFIED_BY_SONY if ((0 == strncmp(buf, "PING", 4)) || (0 == strncmp(buf, "STATUS", 6))) wpa_hexdump_ascii(MSG_MSGDUMP, "RX ctrl_iface", (u8 *) buf, res); else #endif /* MODIFIED_BY_SONY */ wpa_hexdump_ascii(MSG_DEBUG, "RX ctrl_iface", (u8 *) buf, res); reply = malloc(reply_size); if (reply == NULL) { sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from, fromlen); return; } memcpy(reply, "OK\n", 3); reply_len = 3; if (strcmp(buf, "PING") == 0) { memcpy(reply, "PONG\n", 5); reply_len = 5; } else if (strcmp(buf, "MIB") == 0) { reply_len = ieee802_11_get_mib(hapd, reply, reply_size); if (reply_len >= 0) { res = wpa_get_mib(hapd->wpa_auth, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } if (reply_len >= 0) { res = ieee802_1x_get_mib(hapd, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } if (reply_len >= 0) { res = radius_client_get_mib(hapd->radius, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } } else if (strcmp(buf, "STA-FIRST") == 0) { reply_len = hostapd_ctrl_iface_sta_first(hapd, reply, reply_size); } else if (strncmp(buf, "STA ", 4) == 0) { reply_len = hostapd_ctrl_iface_sta(hapd, buf + 4, reply, reply_size); } else if (strncmp(buf, "STA-NEXT ", 9) == 0) { reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply, reply_size); } else if (strcmp(buf, "ATTACH") == 0) { if (hostapd_ctrl_iface_attach(hapd, &from, fromlen)) reply_len = -1; } else if (strcmp(buf, "DETACH") == 0) { if (hostapd_ctrl_iface_detach(hapd, &from, fromlen)) reply_len = -1; } else if (strncmp(buf, "LEVEL ", 6) == 0) { if (hostapd_ctrl_iface_level(hapd, &from, fromlen, buf + 6)) reply_len = -1; } else if (strncmp(buf, "NEW_STA ", 8) == 0) { if (hostapd_ctrl_iface_new_sta(hapd, buf + 8)) reply_len = -1; #ifdef MODIFIED_BY_SONY } else if (os_strncmp(buf, "STATUS", 6) == 0) { reply_len = hostapd_ctrl_iface_status(hapd, reply, reply_size); #endif /* MODIFIED_BY_SONY */ } else if (os_strncmp(buf, "SETBSS ", 7) == 0) { if (hostapd_config_bss_set(hapd->conf, buf+7, 0/*not internal*/)) reply_len = -1; } else if (os_strncmp(buf, "SETRADIO ", 9) == 0) { if (hostapd_config_radio_set(hapd->iconf, buf+9)) reply_len = -1; } else if (os_strncmp(buf, "RECONFIGURE", 11) == 0) { if (hostapd_ctrl_iface_reconfigure(hapd)) reply_len = -1; } else if (os_strncmp(buf, "QUIT", 4) == 0) { if (hostapd_ctrl_iface_quit(hapd)) reply_len = -1; #ifdef EAP_WPS #ifdef WPS_OPT_TINYUPNP } else if (os_strncmp(buf, "READVERTISE", 11) == 0) { if (hostapd_ctrl_iface_readvertise(hapd)) reply_len = -1; #endif // WPS_OPT_TINYUPNP } else if (os_strncmp(buf, "CONFIGME", 8) == 0) { if (hostap_ctrl_iface_configme(hapd, buf + 8)) reply_len = -1; } else if (os_strncmp(buf, "CONFIGTHEM", 10) == 0) { if (hostap_ctrl_iface_configthem(hapd, buf + 10)) reply_len = -1; } else if (os_strncmp(buf, "CONFIGSTOP", 10) == 0) { if (hostap_ctrl_iface_configstop(hapd)) reply_len = -1; } else if (os_strncmp(buf, "CONFIGIE", 8) == 0) { if (hostapd_ctrl_iface_configie(hapd, buf+8)) reply_len = -1; #if 0 /* WAS from Sony */ } else if (os_strncmp(buf, "SET_WPS_STATE ", 14) == 0) { if (hostapd_ctrl_iface_set_wps_state(hapd, buf + 14)) reply_len = -1; } else if (os_strncmp(buf, "WPS_SET_PASSWORD ", 17) == 0) { if (hostapd_ctrl_iface_wps_set_password(hapd, buf + 17)) reply_len = -1; } else if (os_strncmp(buf, "WPS_CLEAR_PASSWORD ", 18) == 0) { if (hostapd_ctrl_iface_wps_clear_password(hapd)) reply_len = -1; } else if (os_strncmp(buf, "WPS_SET_REGMODE ", 16) == 0) { if (hostapd_ctrl_iface_wps_set_regmode(hapd, buf + 16)) reply_len = -1; #endif /* WAS from Sony */ #ifdef WPS_OPT_NFC } else if (os_strncmp(buf, "CANCEL_NFC_COMMAND", 18) == 0) { if (hostapd_ctrl_iface_cancel_nfc_command(hapd)) reply_len = -1; } else if (os_strncmp(buf, "READ_PASSWORD_TOKEN", 19) == 0) { if (hostapd_ctrl_iface_read_password_token(hapd)) reply_len = -1; } else if (os_strncmp(buf, "WRITE_PASSWORD_TOKEN", 20) == 0) { if (hostapd_ctrl_iface_write_password_token(hapd)) reply_len = -1; } else if (os_strncmp(buf, "READ_CONFIG_TOKEN", 17) == 0) { if (hostapd_ctrl_iface_read_config_token(hapd)) reply_len = -1; } else if (os_strncmp(buf, "WRITE_CONFIG_TOKEN", 18) == 0) { if (hostapd_ctrl_iface_write_config_token(hapd)) reply_len = -1; #endif /* WPS_OPT_NFC */ #endif /* EAP_WPS */ } else { memcpy(reply, "UNKNOWN COMMAND\n", 16); reply_len = 16; } if (reply_len < 0) { memcpy(reply, "FAIL\n", 5); reply_len = 5; } sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, fromlen); free(reply); }
static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx, void *sock_ctx) { struct hostapd_data *hapd = eloop_ctx; char buf[256]; int res; struct sockaddr_un from; socklen_t fromlen = sizeof(from); char *reply; const int reply_size = 4096; int reply_len; res = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &from, &fromlen); if (res < 0) { perror("recvfrom(ctrl_iface)"); return; } buf[res] = '\0'; wpa_hexdump_ascii(MSG_DEBUG, "RX ctrl_iface", (u8 *) buf, res); reply = malloc(reply_size); if (reply == NULL) { sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from, fromlen); return; } memcpy(reply, "OK\n", 3); reply_len = 3; if (strcmp(buf, "PING") == 0) { memcpy(reply, "PONG\n", 5); reply_len = 5; } else if (strcmp(buf, "MIB") == 0) { reply_len = ieee802_11_get_mib(hapd, reply, reply_size); if (reply_len >= 0) { res = wpa_get_mib(hapd, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } if (reply_len >= 0) { res = ieee802_1x_get_mib(hapd, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } if (reply_len >= 0) { res = radius_client_get_mib(hapd->radius, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } } else if (strcmp(buf, "STA-FIRST") == 0) { reply_len = hostapd_ctrl_iface_sta_first(hapd, reply, reply_size); } else if (strncmp(buf, "STA ", 4) == 0) { reply_len = hostapd_ctrl_iface_sta(hapd, buf + 4, reply, reply_size); } else if (strncmp(buf, "STA-NEXT ", 9) == 0) { reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply, reply_size); } else if (strcmp(buf, "ATTACH") == 0) { if (hostapd_ctrl_iface_attach(hapd, &from, fromlen)) reply_len = -1; } else if (strcmp(buf, "DETACH") == 0) { if (hostapd_ctrl_iface_detach(hapd, &from, fromlen)) reply_len = -1; } else if (strncmp(buf, "LEVEL ", 6) == 0) { if (hostapd_ctrl_iface_level(hapd, &from, fromlen, buf + 6)) reply_len = -1; } else { memcpy(reply, "UNKNOWN COMMAND\n", 16); reply_len = 16; } if (reply_len < 0) { memcpy(reply, "FAIL\n", 5); reply_len = 5; } sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, fromlen); free(reply); }
static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx, void *sock_ctx) { struct hostapd_data *hapd = eloop_ctx; char buf[256]; int res; struct sockaddr_un from; socklen_t fromlen = sizeof(from); char *reply; const int reply_size = 4096; int reply_len; res = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &from, &fromlen); if (res < 0) { perror("recvfrom(ctrl_iface)"); return; } buf[res] = '\0'; wpa_hexdump_ascii(MSG_DEBUG, "RX ctrl_iface", (u8 *) buf, res); reply = os_malloc(reply_size); if (reply == NULL) { sendto(sock, "FAIL\n", 5, 0, (struct sockaddr *) &from, fromlen); return; } os_memcpy(reply, "OK\n", 3); reply_len = 3; if (os_strcmp(buf, "PING") == 0) { os_memcpy(reply, "PONG\n", 5); reply_len = 5; } else if (os_strcmp(buf, "MIB") == 0) { reply_len = ieee802_11_get_mib(hapd, reply, reply_size); if (reply_len >= 0) { res = wpa_get_mib(hapd->wpa_auth, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } if (reply_len >= 0) { res = ieee802_1x_get_mib(hapd, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } if (reply_len >= 0) { res = radius_client_get_mib(hapd->radius, reply + reply_len, reply_size - reply_len); if (res < 0) reply_len = -1; else reply_len += res; } } else if (os_strcmp(buf, "STA-FIRST") == 0) { reply_len = hostapd_ctrl_iface_sta_first(hapd, reply, reply_size); } else if (os_strncmp(buf, "STA ", 4) == 0) { reply_len = hostapd_ctrl_iface_sta(hapd, buf + 4, reply, reply_size); } else if (os_strncmp(buf, "STA-NEXT ", 9) == 0) { reply_len = hostapd_ctrl_iface_sta_next(hapd, buf + 9, reply, reply_size); } else if (os_strcmp(buf, "ATTACH") == 0) { if (hostapd_ctrl_iface_attach(hapd, &from, fromlen)) reply_len = -1; } else if (os_strcmp(buf, "DETACH") == 0) { if (hostapd_ctrl_iface_detach(hapd, &from, fromlen)) reply_len = -1; } else if (os_strncmp(buf, "LEVEL ", 6) == 0) { if (hostapd_ctrl_iface_level(hapd, &from, fromlen, buf + 6)) reply_len = -1; } else if (os_strncmp(buf, "NEW_STA ", 8) == 0) { if (hostapd_ctrl_iface_new_sta(hapd, buf + 8)) reply_len = -1; #ifdef CONFIG_IEEE80211W } else if (os_strncmp(buf, "SA_QUERY ", 9) == 0) { if (hostapd_ctrl_iface_sa_query(hapd, buf + 9)) reply_len = -1; #endif /* CONFIG_IEEE80211W */ #ifdef CONFIG_WPS } else if (os_strncmp(buf, "WPS_PIN ", 8) == 0) { if (hostapd_ctrl_iface_wps_pin(hapd, buf + 8)) reply_len = -1; } else if (os_strcmp(buf, "WPS_PBC") == 0) { if (hostapd_wps_button_pushed(hapd)) reply_len = -1; #endif /* CONFIG_WPS */ } else if (os_strcmp(buf, "RELOAD") == 0) { if (hostapd_reload_config(hapd->iface)) reply_len = -1; } else { os_memcpy(reply, "UNKNOWN COMMAND\n", 16); reply_len = 16; } if (reply_len < 0) { os_memcpy(reply, "FAIL\n", 5); reply_len = 5; } sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, fromlen); os_free(reply); }