1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * WPA Supplicant / Control interface (shared code for all backends) 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eloop.h" 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wpa.h" 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "config.h" 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eapol_supp/eapol_supp_sm.h" 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wpa_supplicant_i.h" 232c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#include "blacklist.h" 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "ctrl_iface.h" 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "l2_packet/l2_packet.h" 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "preauth.h" 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "pmksa_cache.h" 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wpa_ctrl.h" 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "eap_peer/eap.h" 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "ieee802_11_defs.h" 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wps_supplicant.h" 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "wps/wps.h" 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_global_iface_list(struct wpa_global *global, 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, int len); 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_global_iface_interfaces(struct wpa_global *global, 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, int len); 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s, 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd) 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *value; 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret = 0; 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt value = os_strchr(cmd, ' '); 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (value == NULL) 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *value++ = '\0'; 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE SET '%s'='%s'", cmd, value); 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcasecmp(cmd, "EAPOL::heldPeriod") == 0) { 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_configure(wpa_s->eapol, 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt atoi(value), -1, -1, -1); 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcasecmp(cmd, "EAPOL::authPeriod") == 0) { 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_configure(wpa_s->eapol, 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt -1, atoi(value), -1, -1); 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcasecmp(cmd, "EAPOL::startPeriod") == 0) { 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_configure(wpa_s->eapol, 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt -1, -1, atoi(value), -1); 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcasecmp(cmd, "EAPOL::maxStart") == 0) { 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_configure(wpa_s->eapol, 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt -1, -1, -1, atoi(value)); 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcasecmp(cmd, "dot11RSNAConfigPMKLifetime") == 0) { 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME, 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt atoi(value))) 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcasecmp(cmd, "dot11RSNAConfigPMKReauthThreshold") == 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 0) { 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD, 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt atoi(value))) 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcasecmp(cmd, "dot11RSNAConfigSATimeout") == 0) { 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT, atoi(value))) 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = -1; 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef IEEE8021X_EAPOL 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_preauth(struct wpa_supplicant *wpa_s, 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *addr) 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 bssid[ETH_ALEN]; 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid = wpa_s->current_ssid; 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hwaddr_aton(addr, bssid)) { 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE PREAUTH: invalid address " 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "'%s'", addr); 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE PREAUTH " MACSTR, MAC2STR(bssid)); 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt rsn_preauth_deinit(wpa_s->wpa); 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (rsn_preauth_init(wpa_s->wpa, bssid, ssid ? &ssid->eap : NULL)) 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_PEERKEY 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* MLME-STKSTART.request(peer) */ 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_stkstart( 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *addr) 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 peer[ETH_ALEN]; 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hwaddr_aton(addr, peer)) { 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE STKSTART: invalid " 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "address '%s'", peer); 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE STKSTART " MACSTR, 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MAC2STR(peer)); 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_sm_stkstart(wpa_s->wpa, peer); 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_PEERKEY */ 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_IEEE80211R 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_ft_ds( 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *addr) 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 target_ap[ETH_ALEN]; 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hwaddr_aton(addr, target_ap)) { 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE FT_DS: invalid " 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "address '%s'", target_ap); 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE FT_DS " MACSTR, MAC2STR(target_ap)); 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_ft_start_over_ds(wpa_s->wpa, target_ap); 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_IEEE80211R */ 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_WPS 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_wps_pbc(struct wpa_supplicant *wpa_s, 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd) 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 bssid[ETH_ALEN]; 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (cmd == NULL || os_strcmp(cmd, "any") == 0) 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpas_wps_start_pbc(wpa_s, NULL); 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hwaddr_aton(cmd, bssid)) { 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE WPS_PBC: invalid BSSID '%s'", 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt cmd); 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpas_wps_start_pbc(wpa_s, bssid); 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_wps_pin(struct wpa_supplicant *wpa_s, 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd, char *buf, 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t buflen) 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 bssid[ETH_ALEN], *_bssid = bssid; 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pin; 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pin = os_strchr(cmd, ' '); 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pin) 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pin++ = '\0'; 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(cmd, "any") == 0) 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _bssid = NULL; 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else if (hwaddr_aton(cmd, bssid)) { 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE WPS_PIN: invalid BSSID '%s'", 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt cmd); 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pin) { 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = wpas_wps_start_pin(wpa_s, _bssid, pin); 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0) 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(buf, buflen, "%s", pin); 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || (size_t) ret >= buflen) 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = wpas_wps_start_pin(wpa_s, _bssid, NULL); 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0) 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* Return the generated PIN */ 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(buf, buflen, "%08d", ret); 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || (size_t) ret >= buflen) 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_wps_reg(struct wpa_supplicant *wpa_s, 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd) 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 bssid[ETH_ALEN], *_bssid = bssid; 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pin; 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pin = os_strchr(cmd, ' '); 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pin == NULL) 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pin++ = '\0'; 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(cmd, "any") == 0) 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _bssid = NULL; 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else if (hwaddr_aton(cmd, bssid)) { 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE WPS_REG: invalid BSSID '%s'", 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt cmd); 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpas_wps_start_reg(wpa_s, _bssid, pin); 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_WPS */ 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_ctrl_rsp(struct wpa_supplicant *wpa_s, 232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *rsp) 233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef IEEE8021X_EAPOL 235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *id_pos; 236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct eap_peer_config *eap; 239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(rsp, '-'); 241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id_pos = pos; 245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, ':'); 246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(id_pos); 250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: field=%s id=%d", rsp, id); 251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: value", 252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (u8 *) pos, os_strlen(pos)); 253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find SSID id=%d " 257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "to update", id); 258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap = &ssid->eap; 261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(rsp, "IDENTITY") == 0) { 263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->identity); 264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->identity = (u8 *) os_strdup(pos); 265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->identity_len = os_strlen(pos); 266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_identity = 0; 267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) 268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(rsp, "PASSWORD") == 0) { 270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->password); 271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->password = (u8 *) os_strdup(pos); 272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->password_len = os_strlen(pos); 273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_password = 0; 274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) 275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(rsp, "NEW_PASSWORD") == 0) { 277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->new_password); 278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->new_password = (u8 *) os_strdup(pos); 279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->new_password_len = os_strlen(pos); 280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_new_password = 0; 281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) 282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(rsp, "PIN") == 0) { 284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->pin); 285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pin = os_strdup(pos); 286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_pin = 0; 287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) 288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(rsp, "OTP") == 0) { 290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->otp); 291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->otp = (u8 *) os_strdup(pos); 292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->otp_len = os_strlen(pos); 293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->pending_req_otp); 294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_otp = NULL; 295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_otp_len = 0; 296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(rsp, "PASSPHRASE") == 0) { 297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(eap->private_key_passwd); 298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->private_key_passwd = (u8 *) os_strdup(pos); 299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eap->pending_req_passphrase = 0; 300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) 301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", rsp); 304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* IEEE8021X_EAPOL */ 309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: 802.1X not included"); 310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s, 316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const char *params, 317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t buflen) 318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end, tmp[30]; 320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int res, verbose, ret; 321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt verbose = os_strcmp(params, "-VERBOSE") == 0; 323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + buflen; 325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->wpa_state >= WPA_ASSOCIATED) { 326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid = wpa_s->current_ssid; 327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "bssid=" MACSTR "\n", 328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MAC2STR(wpa_s->bssid)); 329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid) { 333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 *_ssid = ssid->ssid; 334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t ssid_len = ssid->ssid_len; 335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 ssid_buf[MAX_SSID_LEN]; 336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid_len == 0) { 337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int _res = wpa_drv_get_ssid(wpa_s, ssid_buf); 338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (_res < 0) 339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid_len = 0; 340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid_len = _res; 342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt _ssid = ssid_buf; 343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "ssid=%s\nid=%d\n", 345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_ssid_txt(_ssid, ssid_len), 346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->id); 347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid->id_str) { 352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, 353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id_str=%s\n", 354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->id_str); 355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += wpa_sm_get_status(wpa_s->wpa, pos, end - pos, verbose); 362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "wpa_state=%s\n", 364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_state_txt(wpa_s->wpa_state)); 365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->l2 && 370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt l2_packet_get_ip_addr(wpa_s->l2, tmp, sizeof(tmp)) >= 0) { 371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "ip_address=%s\n", tmp); 372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) || 378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = eapol_sm_get_status(wpa_s->eapol, pos, end - pos, 380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt verbose); 381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res >= 0) 382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += res; 383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = rsn_preauth_get_status(wpa_s->wpa, pos, end - pos, verbose); 386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res >= 0) 387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += res; 388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_bssid(struct wpa_supplicant *wpa_s, 394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd) 395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos; 397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 bssid[ETH_ALEN]; 400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id> <BSSID>" */ 402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(cmd, ' '); 403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: id=%d bssid='%s'", id, pos); 408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hwaddr_aton(pos, bssid)) { 409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG ,"CTRL_IFACE: invalid BSSID '%s'", pos); 410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find SSID id=%d " 416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "to update", id); 417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(ssid->bssid, bssid, ETH_ALEN); 421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->bssid_set = !is_zero_ether_addr(bssid); 422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 4262c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID 427eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_scan_interval( 428eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 429eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt{ 430eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt int scan_int = atoi(cmd); 431eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt if (scan_int < 0) 432eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt return -1; 433eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt wpa_s->scan_interval = scan_int; 434eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt return 0; 435eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt} 436eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt 437eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt 4382c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic int wpa_supplicant_ctrl_iface_blacklist( 4392c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd, char *buf, size_t buflen) 4402c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{ 4412c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt u8 bssid[ETH_ALEN]; 4422c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt struct wpa_blacklist *e; 4432c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt char *pos, *end; 4442c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt int ret; 4452c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4462c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt /* cmd: "BLACKLIST [<BSSID>]" */ 4472c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (*cmd == '\0') { 4482c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt pos = buf; 4492c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt end = buf + buflen; 4502c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4512c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt e = wpa_s->blacklist; 4522c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt while (e) { 4532c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = os_snprintf(pos, end-pos, MACSTR"\n", MAC2STR(e->bssid)); 4542c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (ret < 0 || ret >= end - pos) 4552c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return pos - buf; 4562c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt pos += ret; 4572c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt e = e->next; 4582c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 4592c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return pos - buf; 4602c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 4612c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4622c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ++cmd; 4632c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (os_strncmp(cmd, "clear", 5) == 0) { 4642c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_blacklist_clear(wpa_s); 4652c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt os_memcpy(buf, "OK\n", 3); 4662c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return 3; 4672c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 4682c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4692c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: BLACKLIST bssid='%s'", cmd); 4702c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (hwaddr_aton(cmd, bssid)) { 4712c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_printf(MSG_DEBUG ,"CTRL_IFACE: invalid BSSID '%s'", cmd); 4722c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 4732c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 4742c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4752c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt /* 4762c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt * Add the BSSID twice, so its count will be 2, causing it to be 4772c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt * skipped when processing scan results. 4782c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt */ 4792c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = wpa_blacklist_add(wpa_s, bssid); 4802c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (ret != 0) 4812c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 4822c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = wpa_blacklist_add(wpa_s, bssid); 4832c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (ret != 0) 4842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 4852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt os_memcpy(buf, "OK\n", 3); 4862c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return 3; 4872c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt} 4882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4902c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtextern int wpa_debug_level; 4912c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtextern int wpa_debug_timestamp; 4922c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic int wpa_supplicant_ctrl_iface_log_level( 4932c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd, char *buf, size_t buflen) 4942c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{ 4952c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt char *pos, *end, *stamp; 4962c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt int ret; 4972c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 4982c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (cmd == NULL) { 4992c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 5002c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5012c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5022c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt /* cmd: "LOG_LEVEL [<level>]" */ 5032c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (*cmd == '\0') { 5042c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt pos = buf; 5052c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt end = buf + buflen; 5062c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = os_snprintf(pos, end-pos, "Current level: %d\n" 5072c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt "{0-MSGDUMP, 1-DEBUG, 2-INFO, 3-WARNING, 4-ERROR}\n" 5082c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt "Timestamp: %d\n", wpa_debug_level, wpa_debug_timestamp); 5092c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (ret < 0 || ret >= end - pos) 5102c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = 0; 5112c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5122c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return ret; 5132c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5142c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5152c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt while (*cmd == ' ') { 5162c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt cmd++; 5172c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5182c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5192c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt stamp = os_strchr(cmd, ' '); 5202c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (stamp) { 5212c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt *stamp++ = '\0'; 5222c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt while (*stamp == ' ') { 5232c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt stamp++; 5242c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5252c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5262c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5272c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (cmd && os_strlen(cmd)) { 5282c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_debug_level = atoi(cmd); 5292c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5302c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5312c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (stamp && os_strlen(stamp)) { 5322c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_debug_timestamp = atoi(stamp); 5332c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 5342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 5352c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt os_memcpy(buf, "OK\n", 3); 5362c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return 3; 5372c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt} 5382c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif 539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_list_networks( 541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *buf, size_t buflen) 542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + buflen; 549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, 550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "network id / ssid / bssid / flags\n"); 551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 553526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 554526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 555526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_s->conf->ssid; 556526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (ssid) { 557526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%d\t%s", 558526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->id, 559526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 560526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 561526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 562526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 563526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid->bssid_set) { 564526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\t" MACSTR, 565526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MAC2STR(ssid->bssid)); 566526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 567526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\tany"); 568526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 569526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 570526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 571526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 572526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\t%s%s", 573526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid == wpa_s->current_ssid ? 574526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "[CURRENT]" : "", 575526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled ? "[DISABLED]" : ""); 576526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 577526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 578526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 579526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\n"); 580526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 581526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 582526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 583526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 584526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = ssid->next; 585526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 586526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 587526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 588526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 589526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 590526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 591526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char * wpa_supplicant_cipher_txt(char *pos, char *end, int cipher) 592526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 593526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int first = 1, ret; 594526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "-"); 595526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 596526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 597526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 598526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (cipher & WPA_CIPHER_NONE) { 599526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sNONE", first ? "" : "+"); 600526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 601526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 602526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 603526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 604526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 605526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (cipher & WPA_CIPHER_WEP40) { 606526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sWEP40", first ? "" : "+"); 607526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 608526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 609526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 610526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 611526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 612526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (cipher & WPA_CIPHER_WEP104) { 613526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sWEP104", 614526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : "+"); 615526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 616526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 617526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 618526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 619526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 620526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (cipher & WPA_CIPHER_TKIP) { 621526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sTKIP", first ? "" : "+"); 622526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 623526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 624526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 625526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 626526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 627526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (cipher & WPA_CIPHER_CCMP) { 628526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sCCMP", first ? "" : "+"); 629526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 630526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 631526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 632526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 633526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 634526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 635526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 636526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 637526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 638526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char * wpa_supplicant_ie_txt(char *pos, char *end, const char *proto, 639526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *ie, size_t ie_len) 640526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 641526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ie_data data; 642526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int first, ret; 643526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 644526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "[%s-", proto); 645526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 646526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 647526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 648526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 649526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_parse_wpa_ie(ie, ie_len, &data) < 0) { 650526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "?]"); 651526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 652526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 653526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 654526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 655526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 656526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 657526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 1; 658526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X) { 659526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sEAP", first ? "" : "+"); 660526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 661526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 662526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 663526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 664526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 665526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_PSK) { 666526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sPSK", first ? "" : "+"); 667526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 668526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 669526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 670526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 671526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 672526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_WPA_NONE) { 673526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sNone", first ? "" : "+"); 674526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 675526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 676526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 677526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 678526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 679526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_IEEE80211R 680526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_FT_IEEE8021X) { 681526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sFT/EAP", 682526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : "+"); 683526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 684526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 685526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 686526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 687526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 688526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_FT_PSK) { 689526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sFT/PSK", 690526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : "+"); 691526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 692526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 693526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 694526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 695526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 696526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_IEEE80211R */ 697526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_IEEE80211W 698526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_IEEE8021X_SHA256) { 699526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sEAP-SHA256", 700526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : "+"); 701526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 702526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 703526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 704526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 705526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 706526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.key_mgmt & WPA_KEY_MGMT_PSK_SHA256) { 707526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sPSK-SHA256", 708526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : "+"); 709526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 710526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 711526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 712526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 713526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 714526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_IEEE80211W */ 715526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 716526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_cipher_txt(pos, end, data.pairwise_cipher); 717526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 718526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (data.capabilities & WPA_CAPABILITY_PREAUTH) { 719526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "-preauth"); 720526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 721526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 722526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 723526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 724526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 725526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "]"); 726526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 727526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 728526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 729526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 730526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 731526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 732526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 733526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic char * wpa_supplicant_wps_ie_txt(char *pos, char *end, 734526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const struct wpa_scan_res *res) 735526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 736526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_WPS 737526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpabuf *wps_ie; 738526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 739526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const char *txt; 740526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 741526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wps_ie = wpa_scan_get_vendor_ie_multi(res, WPS_IE_VENDOR_TYPE); 742526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wps_ie == NULL) 743526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 744526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 745526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wps_is_selected_pbc_registrar(wps_ie)) 746526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt txt = "[WPS-PBC]"; 747526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else if (wps_is_selected_pin_registrar(wps_ie)) 748526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt txt = "[WPS-PIN]"; 749526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 750526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt txt = "[WPS]"; 751526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 752526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%s", txt); 753526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret >= 0 && ret < end - pos) 754526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 755526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpabuf_free(wps_ie); 756526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_WPS */ 757526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 758526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos; 759526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 760526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 761526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 762526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* Format one result on one text line into a buffer. */ 763526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_scan_result( 764526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const struct wpa_scan_res *res, char *buf, size_t buflen) 765526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 766526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 767526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 768526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *ie, *ie2; 769526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 770526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 771526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + buflen; 772526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 773526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, MACSTR "\t%d\t%d\t", 774526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MAC2STR(res->bssid), res->freq, res->level); 775526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 7762c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 777526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 778526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie = wpa_scan_get_vendor_ie(res, WPA_IE_VENDOR_TYPE); 779526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ie) 780526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_ie_txt(pos, end, "WPA", ie, 2 + ie[1]); 781526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie2 = wpa_scan_get_ie(res, WLAN_EID_RSN); 782526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ie2) 783526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_ie_txt(pos, end, "WPA2", ie2, 2 + ie2[1]); 784526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_wps_ie_txt(pos, end, res); 785526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!ie && !ie2 && res->caps & IEEE80211_CAP_PRIVACY) { 786526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "[WEP]"); 787526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 7882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 789526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 790526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 791526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res->caps & IEEE80211_CAP_IBSS) { 792526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "[IBSS]"); 793526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 7942c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 7952c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt pos += ret; 7962c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 7972c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt /* Just to make the fields line up nicely when printed */ 7982c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (!ie && !ie2) { 7992c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = os_snprintf(pos, end - pos, "\t"); 8002c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (ret < 0 || ret >= end - pos) 8012c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 802526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 803526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 804526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie = wpa_scan_get_ie(res, WLAN_EID_SSID); 805526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\t%s", 806526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie ? wpa_ssid_txt(ie + 2, ie[1]) : ""); 807526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 8082c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 809526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 810526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 811526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\n"); 812526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 8132c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 814526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 815526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 816526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 817526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 818526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 819526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 820526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_scan_results( 821526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *buf, size_t buflen) 822526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 823526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 824526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_scan_res *res; 825526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 826526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t i; 827526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 828526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->scan_res == NULL && 829526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_get_scan_results(wpa_s) < 0) 830526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 8312c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (wpa_s->scan_res == NULL) 8322c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return 0; 833526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 834526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 835526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + buflen; 836526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "bssid / frequency / signal level / " 837526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "flags / ssid\n"); 838526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 839526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 840526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 841526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 842526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < wpa_s->scan_res->num; i++) { 843526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = wpa_s->scan_res->res[i]; 844526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = wpa_supplicant_ctrl_iface_scan_result(res, pos, 845526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end - pos); 846526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 847526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 848526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 849526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 850526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 851526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 852526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 853526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 854526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 855526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_select_network( 856526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 857526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 858526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 859526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 860526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 861526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id>" or "any" */ 862526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(cmd, "any") == 0) { 863526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: SELECT_NETWORK any"); 864526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_s->conf->ssid; 865526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (ssid) { 866526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = 0; 867526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = ssid->next; 868526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 869526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 870526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 871526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 872526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 873526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 874526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 875526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: SELECT_NETWORK id=%d", id); 876526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 877526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 878526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 879526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network " 880526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id=%d", id); 881526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 882526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 883526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 884526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid != wpa_s->current_ssid && wpa_s->current_ssid) 885526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 886526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 887526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* Mark all other networks disabled and trigger reassociation */ 888526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_s->conf->ssid; 889526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (ssid) { 890526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = id != ssid->id; 891526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = ssid->next; 892526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 893526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 8942c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN; 895526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 896526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 897526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 898526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 899526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 900526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 901526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_enable_network( 902526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 903526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 904526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 905526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 906526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 907526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id>" or "all" */ 908526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(cmd, "all") == 0) { 909526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: ENABLE_NETWORK all"); 910526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_s->conf->ssid; 911526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (ssid) { 912526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid && ssid->disabled) 913526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 914526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = 0; 915526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = ssid->next; 916526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 917526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->reassociate) 9182c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID 9192c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 2, 0); 9202c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#else 921526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 9222c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif 923526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 924526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 925526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 926526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 927526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: ENABLE_NETWORK id=%d", id); 928526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 929526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 930526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 931526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network " 932526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id=%d", id); 933526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 934526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 935526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 936526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->current_ssid == NULL && ssid->disabled) { 937526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 938526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Try to reassociate since there is no current configuration 939526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * and a new network was made available. */ 940526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 9412c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID 9422c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 2, 0); 9432c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#else 944526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 9452c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif 946526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 947526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = 0; 948526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 949526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 950526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 951526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 952526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 953526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_disable_network( 954526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 955526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 956526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 957526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 958526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 959526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id>" or "all" */ 960526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(cmd, "all") == 0) { 961526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: DISABLE_NETWORK all"); 962526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_s->conf->ssid; 963526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (ssid) { 964526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = 1; 965526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = ssid->next; 966526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 967526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->current_ssid) 968526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_disassociate(wpa_s, 969526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 970526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 971526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 972526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 973526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 974526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: DISABLE_NETWORK id=%d", id); 975526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 976526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 977526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 978526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network " 979526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id=%d", id); 980526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 981526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 982526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 9832c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID 9842c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) { 9852c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not disable WPS network " 9862c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt "id=%d", id); 9872c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return -1; 9882c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 9892c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif 9902c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 991526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) 992526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 993526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = 1; 994526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 995526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 996526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 997526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 998526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 999526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_add_network( 1000526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *buf, size_t buflen) 1001526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1002526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 1003526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 1004526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1005526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: ADD_NETWORK"); 1006526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1007526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_add_network(wpa_s->conf); 1008526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) 1009526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1010526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid->disabled = 1; 1011526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_config_set_network_defaults(ssid); 1012526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1013526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(buf, buflen, "%d\n", ssid->id); 1014526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || (size_t) ret >= buflen) 1015526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1016526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 1017526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1018526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1019526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1020526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_remove_network( 1021526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 1022526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1023526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 1024526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 1025526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1026526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id>" or "all" */ 1027526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(cmd, "all") == 0) { 1028526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: REMOVE_NETWORK all"); 1029526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_s->conf->ssid; 1030526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (ssid) { 1031526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = ssid->id; 1032526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = ssid->next; 1033526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_config_remove_network(wpa_s->conf, id); 1034526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1035526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->current_ssid) { 1036526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 1037526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_disassociate(wpa_s, 1038526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WLAN_REASON_DEAUTH_LEAVING); 1039526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1040526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1041526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1042526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1043526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 1044526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: REMOVE_NETWORK id=%d", id); 1045526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1046526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 1047526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL || 1048526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_config_remove_network(wpa_s->conf, id) < 0) { 1049526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network " 1050526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id=%d", id); 1051526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1052526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1053526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1054526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == wpa_s->current_ssid) { 1055526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 1056526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Invalidate the EAP session cache if the current network is 1057526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * removed. 1058526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 1059526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 1060526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1061526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 1062526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1063526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1064526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1065526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1066526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1067526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1068526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_set_network( 1069526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 1070526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1071526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 1072526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 1073526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *name, *value; 1074526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1075526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id> <variable name> <value>" */ 1076526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt name = os_strchr(cmd, ' '); 1077526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (name == NULL) 1078526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1079526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *name++ = '\0'; 1080526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1081526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt value = os_strchr(name, ' '); 1082526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (value == NULL) 1083526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1084526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *value++ = '\0'; 1085526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1086526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 1087526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: SET_NETWORK id=%d name='%s'", 1088526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id, name); 1089526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: value", 1090526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (u8 *) value, os_strlen(value)); 1091526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1092526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 1093526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 1094526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network " 1095526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id=%d", id); 1096526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1097526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1098526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1099526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_config_set(ssid, name, value, 0) < 0) { 1100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Failed to set network " 1101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "variable '%s'", name); 1102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 11031c3d48cd07e83010f03914618335f097cd4c4532Dmitry Shmidt } else { 11041c3d48cd07e83010f03914618335f097cd4c4532Dmitry Shmidt if (os_strcmp(name, "priority") == 0) { 11051c3d48cd07e83010f03914618335f097cd4c4532Dmitry Shmidt wpa_config_update_prio_list(wpa_s->conf); 11061c3d48cd07e83010f03914618335f097cd4c4532Dmitry Shmidt } 1107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->current_ssid == ssid) { 1110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 1111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Invalidate the EAP session cache if anything in the current 1112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * configuration changes. 1113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 1114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_invalidate_cached_session(wpa_s->eapol); 1115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if ((os_strcmp(name, "psk") == 0 && 1118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt value[0] == '"' && ssid->ssid_len) || 1119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (os_strcmp(name, "ssid") == 0 && ssid->passphrase)) 1120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_config_update_psk(ssid); 1121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_get_network( 1127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd, char *buf, size_t buflen) 1128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int id; 1130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t res; 1131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_ssid *ssid; 1132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *name, *value; 1133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* cmd: "<network id> <variable name>" */ 1135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt name = os_strchr(cmd, ' '); 1136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (name == NULL || buflen == 0) 1137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *name++ = '\0'; 1139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id = atoi(cmd); 1141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: GET_NETWORK id=%d name='%s'", 1142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt id, name); 1143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ssid = wpa_config_get_network(wpa_s->conf, id); 1145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ssid == NULL) { 1146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network " 1147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "id=%d", id); 1148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt value = wpa_config_get_no_key(ssid, name); 1152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (value == NULL) { 1153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Failed to get network " 1154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "variable '%s'", name); 1155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = os_strlcpy(buf, value, buflen); 1159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res >= buflen) { 1160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(value); 1161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(value); 1165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return res; 1167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 1171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_save_config(struct wpa_supplicant *wpa_s) 1172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 1174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!wpa_s->conf->update_config) { 1176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: SAVE_CONFIG - Not allowed " 1177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "to update configuration (update_config=0)"); 1178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = wpa_config_write(wpa_s->confname, wpa_s->conf); 1182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret) { 1183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: SAVE_CONFIG - Failed to " 1184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "update configuration"); 1185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 1186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: SAVE_CONFIG - Configuration" 1187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt " updated"); 1188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ret; 1191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 1193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int ctrl_iface_get_capability_pairwise(int res, char *strict, 1196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_capa *capa, 1197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t buflen) 1198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret, first = 1; 1200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len; 1202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = pos + buflen; 1205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0) { 1207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (strict) 1208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = os_strlcpy(buf, "CCMP TKIP NONE", buflen); 1210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len >= buflen) 1211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return len; 1213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->enc & WPA_DRIVER_CAPA_ENC_CCMP) { 1216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sCCMP", first ? "" : " "); 1217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->enc & WPA_DRIVER_CAPA_ENC_TKIP) { 1224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sTKIP", first ? "" : " "); 1225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 1232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sNONE", first ? "" : " "); 1233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int ctrl_iface_get_capability_group(int res, char *strict, 1244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_capa *capa, 1245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t buflen) 1246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret, first = 1; 1248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len; 1250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = pos + buflen; 1253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0) { 1255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (strict) 1256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = os_strlcpy(buf, "CCMP TKIP WEP104 WEP40", buflen); 1258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len >= buflen) 1259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return len; 1261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->enc & WPA_DRIVER_CAPA_ENC_CCMP) { 1264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sCCMP", first ? "" : " "); 1265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->enc & WPA_DRIVER_CAPA_ENC_TKIP) { 1272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sTKIP", first ? "" : " "); 1273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->enc & WPA_DRIVER_CAPA_ENC_WEP104) { 1280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sWEP104", 1281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : " "); 1282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->enc & WPA_DRIVER_CAPA_ENC_WEP40) { 1289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sWEP40", first ? "" : " "); 1290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int ctrl_iface_get_capability_key_mgmt(int res, char *strict, 1301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_capa *capa, 1302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t buflen) 1303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 1305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len; 1307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = pos + buflen; 1310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0) { 1312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (strict) 1313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = os_strlcpy(buf, "WPA-PSK WPA-EAP IEEE8021X WPA-NONE " 1315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "NONE", buflen); 1316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len >= buflen) 1317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return len; 1319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "NONE IEEE8021X"); 1322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 1327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2)) { 1328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, " WPA-EAP"); 1329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 1335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 1336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, " WPA-PSK"); 1337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->key_mgmt & WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE) { 1343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, " WPA-NONE"); 1344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int ctrl_iface_get_capability_proto(int res, char *strict, 1354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_capa *capa, 1355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t buflen) 1356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret, first = 1; 1358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len; 1360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = pos + buflen; 1363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0) { 1365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (strict) 1366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = os_strlcpy(buf, "RSN WPA", buflen); 1368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len >= buflen) 1369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return len; 1371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 1374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK)) { 1375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sRSN", first ? "" : " "); 1376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->key_mgmt & (WPA_DRIVER_CAPA_KEY_MGMT_WPA | 1383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK)) { 1384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sWPA", first ? "" : " "); 1385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int ctrl_iface_get_capability_auth_alg(int res, char *strict, 1396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_capa *capa, 1397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t buflen) 1398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret, first = 1; 1400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len; 1402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = pos + buflen; 1405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0) { 1407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (strict) 1408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = os_strlcpy(buf, "OPEN SHARED LEAP", buflen); 1410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len >= buflen) 1411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return len; 1413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->auth & (WPA_DRIVER_AUTH_OPEN)) { 1416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sOPEN", first ? "" : " "); 1417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->auth & (WPA_DRIVER_AUTH_SHARED)) { 1424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sSHARED", 1425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first ? "" : " "); 1426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (capa->auth & (WPA_DRIVER_AUTH_LEAP)) { 1433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%sLEAP", first ? "" : " "); 1434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt first = 0; 1438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_get_capability( 1445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, const char *_field, char *buf, 1446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t buflen) 1447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_capa capa; 1449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int res; 1450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *strict; 1451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char field[30]; 1452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len; 1453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* Determine whether or not strict checking was requested */ 1455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len = os_strlcpy(field, _field, sizeof(field)); 1456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len >= sizeof(field)) 1457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt strict = os_strchr(field, ' '); 1459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (strict != NULL) { 1460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *strict++ = '\0'; 1461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(strict, "strict") != 0) 1462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: GET_CAPABILITY '%s' %s", 1466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt field, strict ? strict : ""); 1467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(field, "eap") == 0) { 1469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return eap_get_names(buf, buflen); 1470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = wpa_drv_get_capa(wpa_s, &capa); 1473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(field, "pairwise") == 0) 1475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ctrl_iface_get_capability_pairwise(res, strict, &capa, 1476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf, buflen); 1477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(field, "group") == 0) 1479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ctrl_iface_get_capability_group(res, strict, &capa, 1480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf, buflen); 1481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(field, "key_mgmt") == 0) 1483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ctrl_iface_get_capability_key_mgmt(res, strict, &capa, 1484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf, buflen); 1485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(field, "proto") == 0) 1487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ctrl_iface_get_capability_proto(res, strict, &capa, 1488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf, buflen); 1489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(field, "auth_alg") == 0) 1491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return ctrl_iface_get_capability_auth_alg(res, strict, &capa, 1492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt buf, buflen); 1493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown GET_CAPABILITY field '%s'", 1495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt field); 1496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_bss(struct wpa_supplicant *wpa_s, 1502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const char *cmd, char *buf, 1503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t buflen) 1504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 bssid[ETH_ALEN]; 1506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t i; 1507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_scan_results *results; 1508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_scan_res *bss; 1509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ret; 1510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *ie, *ie2; 1512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->scan_res == NULL && 1514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_get_scan_results(wpa_s) < 0) 1515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt results = wpa_s->scan_res; 1518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (results == NULL) 1519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (hwaddr_aton(cmd, bssid) == 0) { 1522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < results->num; i++) { 1523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_memcmp(bssid, results->res[i]->bssid, ETH_ALEN) 1524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt == 0) 1525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else 1528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt i = atoi(cmd); 1529526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1530526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (i >= results->num || results->res[i] == NULL) 1531526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; /* no match found */ 1532526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1533526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt bss = results->res[i]; 1534526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1535526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + buflen; 1536526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, 1537526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "bssid=" MACSTR "\n" 1538526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "freq=%d\n" 1539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "beacon_int=%d\n" 1540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "capabilities=0x%04x\n" 1541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "qual=%d\n" 1542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "noise=%d\n" 1543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "level=%d\n" 1544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "tsf=%016llu\n" 1545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ie=", 1546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt MAC2STR(bss->bssid), bss->freq, bss->beacon_int, 1547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt bss->caps, bss->qual, bss->noise, bss->level, 1548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (unsigned long long) bss->tsf); 1549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1553526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie = (const u8 *) (bss + 1); 1554526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < bss->ie_len; i++) { 1555526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "%02x", *ie++); 1556526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1557526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1558526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1559526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1560526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1561526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\n"); 1562526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1563526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1564526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1565526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1566526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "flags="); 1567526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1568526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1569526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1570526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1571526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie = wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE); 1572526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ie) 1573526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_ie_txt(pos, end, "WPA", ie, 2 + ie[1]); 1574526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie2 = wpa_scan_get_ie(bss, WLAN_EID_RSN); 1575526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ie2) 1576526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_ie_txt(pos, end, "WPA2", ie2, 2 + ie2[1]); 1577526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = wpa_supplicant_wps_ie_txt(pos, end, bss); 1578526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (!ie && !ie2 && bss->caps & IEEE80211_CAP_PRIVACY) { 1579526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "[WEP]"); 1580526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1581526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1582526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1583526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1584526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (bss->caps & IEEE80211_CAP_IBSS) { 1585526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "[IBSS]"); 1586526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1587526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1588526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1589526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1590526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1591526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "\n"); 1592526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1593526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1594526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1595526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1596526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie = wpa_scan_get_ie(bss, WLAN_EID_SSID); 1597526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ret = os_snprintf(pos, end - pos, "ssid=%s\n", 1598526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ie ? wpa_ssid_txt(ie + 2, ie[1]) : ""); 1599526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ret < 0 || ret >= end - pos) 1600526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1601526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += ret; 1602526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1603526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1604526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1605526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1606526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1607526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_ctrl_iface_ap_scan( 1608526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s, char *cmd) 1609526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1610526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ap_scan = atoi(cmd); 1611526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1612526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ap_scan < 0 || ap_scan > 2) 1613526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 16142d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt#ifdef ANDROID 16152d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt if ((ap_scan == 2) && (wpa_s->wpa_state != WPA_COMPLETED)) { 1616d82128d89c860044606cabe00169738f4bf0c800Dmitry Shmidt wpa_printf(MSG_DEBUG, "ap_scan = %d", wpa_s->conf->ap_scan); 16170a6f5272e1d76b70025f2343fd10b92ddbf4cec6Dmitry Shmidt return 0; 16182d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt } 1619d82128d89c860044606cabe00169738f4bf0c800Dmitry Shmidt wpa_printf(MSG_DEBUG, "ap_scan = %d", ap_scan); 16202d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt#endif 1621526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->conf->ap_scan = ap_scan; 1622526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 1623526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1624526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1625dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt#ifdef ANDROID 16262c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidtstatic int wpa_supplicant_driver_cmd(struct wpa_supplicant *wpa_s, 16272c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt char *cmd, char *buf, size_t buflen) 16282c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt{ 16292c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt int ret; 16302c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 16312c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = wpa_drv_driver_cmd(wpa_s, cmd, buf, buflen); 16322c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if( ret == 0 ) { 16332c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt ret = sprintf(buf, "%s\n", "OK"); 16342c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 16352c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt return( ret ); 16362c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt} 1637dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt#endif 16382c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt 1639526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtchar * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s, 1640526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t *resp_len) 1641526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1642526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *reply; 16432c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt const int reply_size = 4096; 1644526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int ctrl_rsp = 0; 1645526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int reply_len; 1646526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 16471a4b9ea4bf9fa4329c5fc5bea71b28087e47bb79Dmitry Shmidt wpa_printf(MSG_DEBUG, "CMD = %s", buf); 16481a4b9ea4bf9fa4329c5fc5bea71b28087e47bb79Dmitry Shmidt 1649526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strncmp(buf, WPA_CTRL_RSP, os_strlen(WPA_CTRL_RSP)) == 0 || 1650526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_strncmp(buf, "SET_NETWORK ", 12) == 0) { 1651526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_hexdump_ascii_key(MSG_DEBUG, "RX ctrl_iface", 1652526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (const u8 *) buf, os_strlen(buf)); 1653526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 16540a6f5272e1d76b70025f2343fd10b92ddbf4cec6Dmitry Shmidt if (os_strcmp(buf, "PING") != 0) { 16552c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "RX ctrl_iface", 1656526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (const u8 *) buf, os_strlen(buf)); 16570a6f5272e1d76b70025f2343fd10b92ddbf4cec6Dmitry Shmidt } 1658526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1659526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1660526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply = os_malloc(reply_size); 1661526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (reply == NULL) { 1662526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *resp_len = 1; 1663526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 1664526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1665526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1666526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "OK\n", 3); 1667526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 3; 1668526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1669526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(buf, "PING") == 0) { 1670526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "PONG\n", 5); 1671526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 5; 1672526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "MIB") == 0) { 1673526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_sm_get_mib(wpa_s->wpa, reply, reply_size); 1674526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (reply_len >= 0) { 1675526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int res; 1676526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = eapol_sm_get_mib(wpa_s->eapol, reply + reply_len, 1677526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_size - reply_len); 1678526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0) 1679526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1680526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 1681526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len += res; 1682526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1683526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "STATUS", 6) == 0) { 1684526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_status( 1685526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, buf + 6, reply, reply_size); 1686526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "PMKSA") == 0) { 1687526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = pmksa_cache_list(wpa_s->wpa, reply, reply_size); 1688526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "SET ", 4) == 0) { 1689526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_set(wpa_s, buf + 4)) 1690526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1691526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "LOGON") == 0) { 1692526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, FALSE); 1693526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "LOGOFF") == 0) { 1694526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_notify_logoff(wpa_s->eapol, TRUE); 1695526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "REASSOCIATE") == 0) { 1696526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->disconnected = 0; 1697526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 1698526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 1699526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "RECONNECT") == 0) { 1700526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s->disconnected) { 1701526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->disconnected = 0; 1702526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 1; 1703526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 1704526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1705526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef IEEE8021X_EAPOL 1706526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "PREAUTH ", 8) == 0) { 1707526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_preauth(wpa_s, buf + 8)) 1708526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1709526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 1710526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_PEERKEY 1711526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "STKSTART ", 9) == 0) { 1712526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_stkstart(wpa_s, buf + 9)) 1713526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1714526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_PEERKEY */ 1715526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_IEEE80211R 1716526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "FT_DS ", 6) == 0) { 1717526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_ft_ds(wpa_s, buf + 6)) 1718526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1719526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_IEEE80211R */ 1720526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_WPS 1721526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "WPS_PBC") == 0) { 1722526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_wps_pbc(wpa_s, NULL)) 1723526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1724526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "WPS_PBC ", 8) == 0) { 1725526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_wps_pbc(wpa_s, buf + 8)) 1726526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1727526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "WPS_PIN ", 8) == 0) { 1728526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_wps_pin(wpa_s, buf + 8, 1729526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply, 1730526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_size); 1731526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "WPS_REG ", 8) == 0) { 1732526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_wps_reg(wpa_s, buf + 8)) 1733526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1734526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_WPS */ 1735526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, WPA_CTRL_RSP, os_strlen(WPA_CTRL_RSP)) == 0) 1736526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 1737526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_ctrl_rsp( 1738526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, buf + os_strlen(WPA_CTRL_RSP))) 1739526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1740526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 1741526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt ctrl_rsp = 1; 1742526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "RECONFIGURE") == 0) { 1743526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_reload_configuration(wpa_s)) 1744526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1745526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "TERMINATE") == 0) { 1746526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_terminate(); 1747526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "BSSID ", 6) == 0) { 1748526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_bssid(wpa_s, buf + 6)) 1749526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 17502c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#ifdef ANDROID 1751eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt } else if (os_strncmp(buf, "SCAN_INTERVAL ", 14) == 0) { 1752eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_scan_interval( 1753eee21e1de8514a43f3e9089c136e7e27cc27a9fcDmitry Shmidt wpa_s, buf + 14); 17542c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } else if (os_strncmp(buf, "BLACKLIST", 9) == 0) { 17552c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_blacklist( 17562c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_s, buf + 9, reply, reply_size); 17572c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } else if (os_strncmp(buf, "LOG_LEVEL", 9) == 0) { 17582c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_log_level( 17592c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_s, buf + 9, reply, reply_size); 17602c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt#endif 1761526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "LIST_NETWORKS") == 0) { 1762526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_list_networks( 1763526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, reply, reply_size); 1764526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "DISCONNECT") == 0) { 1765526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->reassociate = 0; 1766526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->disconnected = 1; 1767526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 1768526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "SCAN") == 0) { 17692d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt#ifdef ANDROID 17702d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt if (!wpa_s->scanning && ((wpa_s->wpa_state <= WPA_SCANNING) || 17712d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt (wpa_s->wpa_state >= WPA_COMPLETED))) { 17722d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt#endif 17732c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_s->scan_req = 2; 17742c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_supplicant_req_scan(wpa_s, 0, 0); 17752d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt#ifdef ANDROID 17762d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt } else { 17772d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Ongoing Scan action..."); 17782d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt#endif 17792d41ad0543d71f2ff78e0dd31f3a82fceb94d1d8Dmitry Shmidt } 1780526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "SCAN_RESULTS") == 0) { 1781526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_scan_results( 1782526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, reply, reply_size); 1783526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "SELECT_NETWORK ", 15) == 0) { 1784526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_select_network(wpa_s, buf + 15)) 1785526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1786526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "ENABLE_NETWORK ", 15) == 0) { 1787526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_enable_network(wpa_s, buf + 15)) 1788526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1789526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "DISABLE_NETWORK ", 16) == 0) { 1790526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_disable_network(wpa_s, buf + 16)) 1791526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1792526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "ADD_NETWORK") == 0) { 1793526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_add_network( 1794526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, reply, reply_size); 1795526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "REMOVE_NETWORK ", 15) == 0) { 1796526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_remove_network(wpa_s, buf + 15)) 1797526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1798526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "SET_NETWORK ", 12) == 0) { 1799526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_set_network(wpa_s, buf + 12)) 1800526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1801526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "GET_NETWORK ", 12) == 0) { 1802526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_get_network( 1803526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, buf + 12, reply, reply_size); 1804526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 1805526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "SAVE_CONFIG") == 0) { 1806526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_save_config(wpa_s)) 1807526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1808526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 1809526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "GET_CAPABILITY ", 15) == 0) { 1810526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_get_capability( 1811526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, buf + 15, reply, reply_size); 1812526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "AP_SCAN ", 8) == 0) { 1813526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_ctrl_iface_ap_scan(wpa_s, buf + 8)) 1814526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 1815526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "INTERFACE_LIST") == 0) { 1816526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_global_iface_list( 1817526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->global, reply, reply_size); 1818526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "INTERFACES") == 0) { 1819526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_global_iface_interfaces( 1820526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s->global, reply, reply_size); 1821526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "BSS ", 4) == 0) { 1822526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_ctrl_iface_bss( 1823526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s, buf + 4, reply, reply_size); 1824dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt#ifdef ANDROID 18252c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } else if (os_strncmp(buf, "DRIVER ", 7) == 0) { 18262c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt reply_len = wpa_supplicant_driver_cmd(wpa_s, buf + 7, reply, reply_size); 1827dde787cc314cd04caa4ea5f031cc8a02495ca513Dmitry Shmidt#endif 1828526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 1829526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "UNKNOWN COMMAND\n", 16); 1830526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 16; 1831526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1832526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1833526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (reply_len < 0) { 1834526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "FAIL\n", 5); 1835526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 5; 1836526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1837526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1838526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (ctrl_rsp) 1839526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eapol_sm_notify_ctrl_response(wpa_s->eapol); 1840526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1841526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *resp_len = reply_len; 1842526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return reply; 1843526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1844526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1845526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1846526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_global_iface_add(struct wpa_global *global, 1847526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd) 1848526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1849526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_interface iface; 1850526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos; 1851526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1852526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt /* 1853526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB<driver_param> 1854526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * TAB<bridge_ifname> 1855526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 1856526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE GLOBAL INTERFACE_ADD '%s'", cmd); 1857526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1858526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memset(&iface, 0, sizeof(iface)); 1859526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1860526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt do { 1861526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.ifname = pos = cmd; 1862526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, '\t'); 1863526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos) 1864526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 1865526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (iface.ifname[0] == '\0') 1866526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1867526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 1868526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1869526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1870526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.confname = pos; 1871526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, '\t'); 1872526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos) 1873526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 1874526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (iface.confname[0] == '\0') 1875526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.confname = NULL; 1876526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 1877526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1878526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1879526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.driver = pos; 1880526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, '\t'); 1881526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos) 1882526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 1883526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (iface.driver[0] == '\0') 1884526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.driver = NULL; 1885526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 1886526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1887526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1888526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.ctrl_interface = pos; 1889526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, '\t'); 1890526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos) 1891526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 1892526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (iface.ctrl_interface[0] == '\0') 1893526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.ctrl_interface = NULL; 1894526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 1895526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1896526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1897526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.driver_param = pos; 1898526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, '\t'); 1899526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos) 1900526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 1901526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (iface.driver_param[0] == '\0') 1902526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.driver_param = NULL; 1903526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 1904526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1905526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1906526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.bridge_ifname = pos; 1907526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = os_strchr(pos, '\t'); 1908526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos) 1909526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos++ = '\0'; 1910526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (iface.bridge_ifname[0] == '\0') 1911526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface.bridge_ifname = NULL; 1912526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (pos == NULL) 1913526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1914526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } while (0); 1915526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1916526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_get_iface(global, iface.ifname)) 1917526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1918526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1919526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_supplicant_add_iface(global, &iface) ? 0 : -1; 1920526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1921526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1922526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1923526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_global_iface_remove(struct wpa_global *global, 1924526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *cmd) 1925526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1926526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s; 1927526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1928526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "CTRL_IFACE GLOBAL INTERFACE_REMOVE '%s'", cmd); 1929526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1930526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s = wpa_supplicant_get_iface(global, cmd); 1931526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_s == NULL) 1932526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 1933526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return wpa_supplicant_remove_iface(global, wpa_s); 1934526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1935526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1936526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1937526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic void wpa_free_iface_info(struct wpa_interface_info *iface) 1938526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1939526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_interface_info *prev; 1940526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1941526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (iface) { 1942526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt prev = iface; 1943526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface = iface->next; 1944526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1945526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(prev->ifname); 1946526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(prev->desc); 1947526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(prev); 1948526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1949526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1950526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1951526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1952526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_global_iface_list(struct wpa_global *global, 1953526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, int len) 1954526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1955526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int i, res; 1956526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_interface_info *iface = NULL, *last = NULL, *tmp; 1957526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1958526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1959526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; wpa_supplicant_drivers[i]; i++) { 1960526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_driver_ops *drv = wpa_supplicant_drivers[i]; 1961526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (drv->get_interfaces == NULL) 1962526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt continue; 1963526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt tmp = drv->get_interfaces(global->drv_priv); 1964526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (tmp == NULL) 1965526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt continue; 1966526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1967526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (last == NULL) 1968526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt iface = last = tmp; 1969526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt else 1970526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt last->next = tmp; 1971526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (last->next) 1972526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt last = last->next; 1973526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1974526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1975526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 1976526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + len; 1977526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (tmp = iface; tmp; tmp = tmp->next) { 1978526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = os_snprintf(pos, end - pos, "%s\t%s\t%s\n", 1979526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt tmp->drv_name, tmp->ifname, 1980526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt tmp->desc ? tmp->desc : ""); 1981526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0 || res >= end - pos) { 1982526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos = '\0'; 1983526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 1984526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1985526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += res; 1986526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 1987526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1988526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_free_iface_info(iface); 1989526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1990526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 1991526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 1992526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1993526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 1994526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int wpa_supplicant_global_iface_interfaces(struct wpa_global *global, 1995526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, int len) 1996526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 1997526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int res; 1998526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *pos, *end; 1999526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct wpa_supplicant *wpa_s; 2000526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2001526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s = global->ifaces; 2002526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos = buf; 2003526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt end = buf + len; 2004526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2005526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt while (wpa_s) { 2006526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt res = os_snprintf(pos, end - pos, "%s\n", wpa_s->ifname); 2007526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (res < 0 || res >= end - pos) { 2008526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *pos = '\0'; 2009526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt break; 2010526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 2011526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt pos += res; 2012526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_s = wpa_s->next; 2013526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 2014526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return pos - buf; 2015526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 2016526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2017526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2018526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtchar * wpa_supplicant_global_ctrl_iface_process(struct wpa_global *global, 2019526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *buf, size_t *resp_len) 2020526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 2021526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *reply; 20222c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt const int reply_size = 4096; 2023526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int reply_len; 2024526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 20252c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt if (os_strcmp(buf, "PING") != 0) { 20262c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "RX global ctrl_iface", 2027526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt (const u8 *) buf, os_strlen(buf)); 20282c23b7348ac966c08728d4908cf89d673d91bb76Dmitry Shmidt } 2029526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2030526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply = os_malloc(reply_size); 2031526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (reply == NULL) { 2032526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *resp_len = 1; 2033526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 2034526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 2035526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2036526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "OK\n", 3); 2037526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 3; 2038526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2039526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (os_strcmp(buf, "PING") == 0) { 2040526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "PONG\n", 5); 2041526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 5; 2042526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "INTERFACE_ADD ", 14) == 0) { 2043526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_global_iface_add(global, buf + 14)) 2044526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 2045526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strncmp(buf, "INTERFACE_REMOVE ", 17) == 0) { 2046526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (wpa_supplicant_global_iface_remove(global, buf + 17)) 2047526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = -1; 2048526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "INTERFACE_LIST") == 0) { 2049526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_global_iface_list( 2050526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt global, reply, reply_size); 2051526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "INTERFACES") == 0) { 2052526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = wpa_supplicant_global_iface_interfaces( 2053526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt global, reply, reply_size); 2054526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else if (os_strcmp(buf, "TERMINATE") == 0) { 2055526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_terminate(); 2056526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else { 2057526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "UNKNOWN COMMAND\n", 16); 2058526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 16; 2059526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 2060526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2061526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (reply_len < 0) { 2062526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_memcpy(reply, "FAIL\n", 5); 2063526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt reply_len = 5; 2064526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 2065526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 2066526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *resp_len = reply_len; 2067526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return reply; 2068526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 2069