Browse Source

FST: hostapd control interface

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Anton Nayshtut 10 years ago
parent
commit
8e9a8b0f8c
2 changed files with 69 additions and 1 deletions
  1. 64 0
      hostapd/ctrl_iface.c
  2. 5 1
      src/ap/ctrl_iface_ap.c

+ 64 - 0
hostapd/ctrl_iface.c

@@ -44,6 +44,7 @@
 #include "ap/beacon.h"
 #include "ap/beacon.h"
 #include "wps/wps_defs.h"
 #include "wps/wps_defs.h"
 #include "wps/wps.h"
 #include "wps/wps.h"
+#include "fst/fst_ctrl_iface.h"
 #include "config_file.h"
 #include "config_file.h"
 #include "ctrl_iface.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,
 static void hostapd_global_ctrl_iface_receive(int sock, void *eloop_ctx,
 					      void *sock_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)
 		if (hapd_module_tests() < 0)
 			reply_len = -1;
 			reply_len = -1;
 #endif /* CONFIG_MODULE_TESTS */
 #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 {
 	} else {
 		wpa_printf(MSG_DEBUG, "Unrecognized global ctrl_iface command "
 		wpa_printf(MSG_DEBUG, "Unrecognized global ctrl_iface command "
 			   "ignored");
 			   "ignored");

+ 5 - 1
src/ap/ctrl_iface_ap.c

@@ -12,6 +12,7 @@
 #include "common/ieee802_11_defs.h"
 #include "common/ieee802_11_defs.h"
 #include "common/sae.h"
 #include "common/sae.h"
 #include "eapol_auth/eapol_auth_sm.h"
 #include "eapol_auth/eapol_auth_sm.h"
+#include "fst/fst_ctrl_iface.h"
 #include "hostapd.h"
 #include "hostapd.h"
 #include "ieee802_1x.h"
 #include "ieee802_1x.h"
 #include "wpa_auth.h"
 #include "wpa_auth.h"
@@ -206,7 +207,10 @@ int hostapd_ctrl_iface_sta(struct hostapd_data *hapd, const char *txtaddr,
 		return -1;
 		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;
 }
 }