FST: wpa_supplicant control interface

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Anton Nayshtut 2014-11-16 17:28:53 +02:00 committed by Jouni Malinen
parent 9fbfd1b0d4
commit 3794af2dc1
2 changed files with 72 additions and 0 deletions

View file

@ -279,6 +279,7 @@ extern "C" {
#define WPA_BSS_MASK_MESH_SCAN BIT(18) #define WPA_BSS_MASK_MESH_SCAN BIT(18)
#define WPA_BSS_MASK_SNR BIT(19) #define WPA_BSS_MASK_SNR BIT(19)
#define WPA_BSS_MASK_EST_THROUGHPUT BIT(20) #define WPA_BSS_MASK_EST_THROUGHPUT BIT(20)
#define WPA_BSS_MASK_FST BIT(21)
/* VENDOR_ELEM_* frame id values */ /* VENDOR_ELEM_* frame id values */

View file

@ -28,6 +28,7 @@
#include "rsn_supp/pmksa_cache.h" #include "rsn_supp/pmksa_cache.h"
#include "l2_packet/l2_packet.h" #include "l2_packet/l2_packet.h"
#include "wps/wps.h" #include "wps/wps.h"
#include "fst/fst_ctrl_iface.h"
#include "config.h" #include "config.h"
#include "wpa_supplicant_i.h" #include "wpa_supplicant_i.h"
#include "driver_i.h" #include "driver_i.h"
@ -4291,6 +4292,15 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
pos += ret; pos += ret;
} }
#ifdef CONFIG_FST
if (mask & WPA_BSS_MASK_FST) {
ret = fst_ctrl_iface_mb_info(bss->bssid, pos, end - pos);
if (ret < 0 || ret >= end - pos)
return 0;
pos += ret;
}
#endif /* CONFIG_FST */
if (mask & WPA_BSS_MASK_DELIM) { if (mask & WPA_BSS_MASK_DELIM) {
ret = os_snprintf(pos, end - pos, "====\n"); ret = os_snprintf(pos, end - pos, "====\n");
if (os_snprintf_error(end - pos, ret)) if (os_snprintf_error(end - pos, ret))
@ -9130,6 +9140,55 @@ static int wpas_global_ctrl_iface_status(struct wpa_global *global,
} }
#ifdef CONFIG_FST
static int wpas_global_ctrl_iface_fst_attach(struct wpa_global *global,
char *cmd, char *buf,
size_t reply_size)
{
char ifname[IFNAMSIZ + 1];
struct fst_iface_cfg cfg;
struct wpa_supplicant *wpa_s;
struct fst_wpa_obj iface_obj;
if (!fst_parse_attach_command(cmd, ifname, sizeof(ifname), &cfg)) {
wpa_s = wpa_supplicant_get_iface(global, ifname);
if (wpa_s) {
fst_wpa_supplicant_fill_iface_obj(wpa_s, &iface_obj);
wpa_s->fst = fst_attach(ifname, wpa_s->own_addr,
&iface_obj, &cfg);
if (wpa_s->fst)
return os_snprintf(buf, reply_size, "OK\n");
}
}
return -1;
}
static int wpas_global_ctrl_iface_fst_detach(struct wpa_global *global,
char *cmd, char *buf,
size_t reply_size)
{
char ifname[IFNAMSIZ + 1];
struct wpa_supplicant *wpa_s;
if (!fst_parse_detach_command(cmd, ifname, sizeof(ifname))) {
wpa_s = wpa_supplicant_get_iface(global, ifname);
if (wpa_s) {
if (!fst_iface_detach(ifname)) {
wpa_s->fst = NULL;
return os_snprintf(buf, reply_size, "OK\n");
}
}
}
return -1;
}
#endif /* CONFIG_FST */
char * wpa_supplicant_global_ctrl_iface_process(struct wpa_global *global, char * wpa_supplicant_global_ctrl_iface_process(struct wpa_global *global,
char *buf, size_t *resp_len) char *buf, size_t *resp_len)
{ {
@ -9181,6 +9240,18 @@ char * wpa_supplicant_global_ctrl_iface_process(struct wpa_global *global,
} else if (os_strcmp(buf, "INTERFACES") == 0) { } else if (os_strcmp(buf, "INTERFACES") == 0) {
reply_len = wpa_supplicant_global_iface_interfaces( reply_len = wpa_supplicant_global_iface_interfaces(
global, reply, reply_size); global, reply, reply_size);
#ifdef CONFIG_FST
} else if (os_strncmp(buf, "FST-ATTACH ", 11) == 0) {
reply_len = wpas_global_ctrl_iface_fst_attach(global, buf + 11,
reply,
reply_size);
} else if (os_strncmp(buf, "FST-DETACH ", 11) == 0) {
reply_len = wpas_global_ctrl_iface_fst_detach(global, buf + 11,
reply,
reply_size);
} else if (os_strncmp(buf, "FST-MANAGER ", 12) == 0) {
reply_len = fst_ctrl_iface_receive(buf + 12, reply, reply_size);
#endif /* CONFIG_FST */
} else if (os_strcmp(buf, "TERMINATE") == 0) { } else if (os_strcmp(buf, "TERMINATE") == 0) {
wpa_supplicant_terminate_proc(global); wpa_supplicant_terminate_proc(global);
} else if (os_strcmp(buf, "SUSPEND") == 0) { } else if (os_strcmp(buf, "SUSPEND") == 0) {