FST: hostapd control interface
authorAnton Nayshtut <qca_antonn@qca.qualcomm.com>
Wed, 21 Jan 2015 13:30:48 +0000 (15:30 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 16 Jul 2015 15:26:15 +0000 (18:26 +0300)
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
hostapd/ctrl_iface.c
src/ap/ctrl_iface_ap.c

index aa4c912..d2055c3 100644 (file)
@@ -44,6 +44,7 @@
 #include "ap/beacon.h"
 #include "wps/wps_defs.h"
 #include "wps/wps.h"
+#include "fst/fst_ctrl_iface.h"
 #include "config_file.h"
 #include "ctrl_iface.h"
 
@@ -2515,6 +2516,55 @@ static void hostapd_ctrl_iface_flush(struct hapd_interfaces *interfaces)
 }
 
 
+#ifdef CONFIG_FST
+
+static int
+hostapd_global_ctrl_iface_fst_attach(struct hapd_interfaces *interfaces,
+                                    const char *cmd)
+{
+       char ifname[IFNAMSIZ + 1];
+       struct fst_iface_cfg cfg;
+       struct hostapd_data *hapd;
+       struct fst_wpa_obj iface_obj;
+
+       if (!fst_parse_attach_command(cmd, ifname, sizeof(ifname), &cfg)) {
+               hapd = hostapd_get_iface(interfaces, ifname);
+               if (hapd) {
+                       fst_hostapd_fill_iface_obj(hapd, &iface_obj);
+                       hapd->iface->fst = fst_attach(ifname, hapd->own_addr,
+                                                     &iface_obj, &cfg);
+                       if (hapd->iface->fst)
+                               return 0;
+               }
+       }
+
+       return EINVAL;
+}
+
+
+static int
+hostapd_global_ctrl_iface_fst_detach(struct hapd_interfaces *interfaces,
+                                    const char *cmd)
+{
+       char ifname[IFNAMSIZ + 1];
+       struct hostapd_data * hapd;
+
+       if (!fst_parse_detach_command(cmd, ifname, sizeof(ifname))) {
+               hapd = hostapd_get_iface(interfaces, ifname);
+               if (hapd) {
+                       if (!fst_iface_detach(ifname)) {
+                               hapd->iface->fst = NULL;
+                               return 0;
+                       }
+               }
+       }
+
+       return EINVAL;
+}
+
+#endif /* CONFIG_FST */
+
+
 static void hostapd_global_ctrl_iface_receive(int sock, void *eloop_ctx,
                                              void *sock_ctx)
 {
@@ -2578,6 +2628,20 @@ static void hostapd_global_ctrl_iface_receive(int sock, void *eloop_ctx,
                if (hapd_module_tests() < 0)
                        reply_len = -1;
 #endif /* CONFIG_MODULE_TESTS */
+#ifdef CONFIG_FST
+       } else if (os_strncmp(buf, "FST-ATTACH ", 11) == 0) {
+               if (!hostapd_global_ctrl_iface_fst_attach(interfaces, buf + 11))
+                       reply_len = os_snprintf(reply, reply_size, "OK\n");
+               else
+                       reply_len = -1;
+       } else if (os_strncmp(buf, "FST-DETACH ", 11) == 0) {
+               if (!hostapd_global_ctrl_iface_fst_detach(interfaces, buf + 11))
+                       reply_len = os_snprintf(reply, reply_size, "OK\n");
+               else
+                       reply_len = -1;
+       } else if (os_strncmp(buf, "FST-MANAGER ", 12) == 0) {
+               reply_len = fst_ctrl_iface_receive(buf + 12, reply, reply_size);
+#endif /* CONFIG_FST */
        } else {
                wpa_printf(MSG_DEBUG, "Unrecognized global ctrl_iface command "
                           "ignored");
index 60afcb0..c98978f 100644 (file)
@@ -12,6 +12,7 @@
 #include "common/ieee802_11_defs.h"
 #include "common/sae.h"
 #include "eapol_auth/eapol_auth_sm.h"
+#include "fst/fst_ctrl_iface.h"
 #include "hostapd.h"
 #include "ieee802_1x.h"
 #include "wpa_auth.h"
@@ -206,7 +207,10 @@ int hostapd_ctrl_iface_sta(struct hostapd_data *hapd, const char *txtaddr,
                return -1;
        }
 
-       return hostapd_ctrl_iface_sta_mib(hapd, sta, buf, buflen);
+       ret = hostapd_ctrl_iface_sta_mib(hapd, sta, buf, buflen);
+       ret += fst_ctrl_iface_mb_info(addr, buf + ret, buflen - ret);
+
+       return ret;
 }