int ap_ctrl_iface_sta_next(struct wpa_supplicant *wpa_s, const char *txtaddr, char *buf, size_t buflen) { if (wpa_s->ap_iface == NULL) return -1; return hostapd_ctrl_iface_sta_next(wpa_s->ap_iface->bss[0], txtaddr, buf, buflen); }
int ap_ctrl_iface_sta_next(struct wpa_supplicant *wpa_s, const char *txtaddr, char *buf, size_t buflen) { struct hostapd_data *hapd; if (wpa_s->ap_iface) hapd = wpa_s->ap_iface->bss[0]; else if (wpa_s->ifmsh) hapd = wpa_s->ifmsh->bss[0]; else return -1; return hostapd_ctrl_iface_sta_next(hapd, txtaddr, buf, buflen); }
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'; #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 = 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); }