WPS UFD: Build OOB functionality only if UFD is enabled
[wpasupplicant] / hostapd / ctrl_iface.c
index 7afd859..5d85558 100644 (file)
@@ -30,6 +30,7 @@
 #include "sta_info.h"
 #include "accounting.h"
 #include "wps_hostapd.h"
+#include "driver.h"
 
 
 struct wpa_ctrl_dst {
@@ -41,6 +42,10 @@ struct wpa_ctrl_dst {
 };
 
 
+static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
+                                   const char *buf, size_t len);
+
+
 static int hostapd_ctrl_iface_attach(struct hostapd_data *hapd,
                                     struct sockaddr_un *from,
                                     socklen_t fromlen)
@@ -247,6 +252,26 @@ static int hostapd_ctrl_iface_wps_pin(struct hostapd_data *hapd, char *txt)
        *pin++ = '\0';
        return hostapd_wps_add_pin(hapd, txt, pin);
 }
+
+
+#ifdef CONFIG_WPS_OOB
+static int hostapd_ctrl_iface_wps_oob(struct hostapd_data *hapd, char *txt)
+{
+       char *path, *method;
+
+       path = os_strchr(txt, ' ');
+       if (path == NULL)
+               return -1;
+       *path++ = '\0';
+
+       method = os_strchr(path, ' ');
+       if (method == NULL)
+               return -1;
+       *method++ = '\0';
+
+       return hostapd_wps_start_oob(hapd, txt, path, method);
+}
+#endif /* CONFIG_WPS_OOB */
 #endif /* CONFIG_WPS */
 
 
@@ -345,6 +370,11 @@ static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
        } else if (os_strcmp(buf, "WPS_PBC") == 0) {
                if (hostapd_wps_button_pushed(hapd))
                        reply_len = -1;
+#ifdef CONFIG_WPS_OOB
+       } else if (os_strncmp(buf, "WPS_OOB ", 8) == 0) {
+               if (hostapd_ctrl_iface_wps_oob(hapd, buf + 8))
+                       reply_len = -1;
+#endif /* CONFIG_WPS_OOB */
 #endif /* CONFIG_WPS */
        } else {
                os_memcpy(reply, "UNKNOWN COMMAND\n", 16);
@@ -381,6 +411,16 @@ static char * hostapd_ctrl_iface_path(struct hostapd_data *hapd)
 }
 
 
+static void hostapd_ctrl_iface_msg_cb(void *ctx, int level,
+                                     const char *txt, size_t len)
+{
+       struct hostapd_data *hapd = ctx;
+       if (hapd == NULL)
+               return;
+       hostapd_ctrl_iface_send(hapd, level, txt, len);
+}
+
+
 int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
 {
        struct sockaddr_un addr;
@@ -445,6 +485,7 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
        hapd->ctrl_sock = s;
        eloop_register_read_sock(s, hostapd_ctrl_iface_receive, hapd,
                                 NULL);
+       wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb);
 
        return 0;
 
@@ -494,8 +535,8 @@ void hostapd_ctrl_iface_deinit(struct hostapd_data *hapd)
 }
 
 
-void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
-                            char *buf, size_t len)
+static void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
+                                   const char *buf, size_t len)
 {
        struct wpa_ctrl_dst *dst, *next;
        struct msghdr msg;
@@ -510,7 +551,7 @@ void hostapd_ctrl_iface_send(struct hostapd_data *hapd, int level,
        os_snprintf(levelstr, sizeof(levelstr), "<%d>", level);
        io[0].iov_base = levelstr;
        io[0].iov_len = os_strlen(levelstr);
-       io[1].iov_base = buf;
+       io[1].iov_base = (char *) buf;
        io[1].iov_len = len;
        os_memset(&msg, 0, sizeof(msg));
        msg.msg_iov = io;