OSDN Git Service

am 0cc49e8d: Add BOARD_WLAN_DEVICE=mrvl check for ANDROID_P2P support
[android-x86/external-wpa_supplicant_8.git] / wpa_supplicant / ctrl_iface_udp.c
index 110ca4f..994f9b1 100644 (file)
@@ -2,14 +2,8 @@
  * WPA Supplicant / UDP socket -based control interface
  * Copyright (c) 2004-2005, Jouni Malinen <j@w1.fi>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
  */
 
 #include "includes.h"
@@ -169,6 +163,8 @@ static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,
                perror("recvfrom(ctrl_iface)");
                return;
        }
+
+#ifndef CONFIG_CTRL_IFACE_UDP_REMOTE
        if (from.sin_addr.s_addr != htonl((127 << 24) | 1)) {
                /*
                 * The OS networking stack is expected to drop this kind of
@@ -180,6 +176,8 @@ static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,
                           "source %s", inet_ntoa(from.sin_addr));
                return;
        }
+#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+
        buf[res] = '\0';
 
        if (os_strcmp(buf, "GET_COOKIE") == 0) {
@@ -272,6 +270,7 @@ wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s)
 {
        struct ctrl_iface_priv *priv;
        struct sockaddr_in addr;
+       int port = WPA_CTRL_IFACE_PORT;
 
        priv = os_zalloc(sizeof(*priv));
        if (priv == NULL)
@@ -291,13 +290,25 @@ wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s)
 
        os_memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
+#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
+       addr.sin_addr.s_addr = INADDR_ANY;
+#else /* CONFIG_CTRL_IFACE_UDP_REMOTE */
        addr.sin_addr.s_addr = htonl((127 << 24) | 1);
-       addr.sin_port = htons(WPA_CTRL_IFACE_PORT);
+#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+try_again:
+       addr.sin_port = htons(port);
        if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               port--;
+               if ((WPA_CTRL_IFACE_PORT - port) < WPA_CTRL_IFACE_PORT_LIMIT)
+                       goto try_again;
                perror("bind(AF_INET)");
                goto fail;
        }
 
+#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
+       wpa_msg(wpa_s, MSG_DEBUG, "ctrl_iface_init UDP port: %d", port);
+#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+
        eloop_register_read_sock(priv->sock, wpa_supplicant_ctrl_iface_receive,
                                 wpa_s, priv);
        wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);
@@ -448,6 +459,8 @@ static void wpa_supplicant_global_ctrl_iface_receive(int sock, void *eloop_ctx,
                perror("recvfrom(ctrl_iface)");
                return;
        }
+
+#ifndef CONFIG_CTRL_IFACE_UDP_REMOTE
        if (from.sin_addr.s_addr != htonl((127 << 24) | 1)) {
                /*
                 * The OS networking stack is expected to drop this kind of
@@ -459,6 +472,8 @@ static void wpa_supplicant_global_ctrl_iface_receive(int sock, void *eloop_ctx,
                           "source %s", inet_ntoa(from.sin_addr));
                return;
        }
+#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+
        buf[res] = '\0';
 
        if (os_strcmp(buf, "GET_COOKIE") == 0) {
@@ -508,6 +523,7 @@ wpa_supplicant_global_ctrl_iface_init(struct wpa_global *global)
 {
        struct ctrl_iface_global_priv *priv;
        struct sockaddr_in addr;
+       int port = WPA_GLOBAL_CTRL_IFACE_PORT;
 
        priv = os_zalloc(sizeof(*priv));
        if (priv == NULL)
@@ -529,13 +545,26 @@ wpa_supplicant_global_ctrl_iface_init(struct wpa_global *global)
 
        os_memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
+#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
+       addr.sin_addr.s_addr = INADDR_ANY;
+#else /* CONFIG_CTRL_IFACE_UDP_REMOTE */
        addr.sin_addr.s_addr = htonl((127 << 24) | 1);
-       addr.sin_port = htons(WPA_GLOBAL_CTRL_IFACE_PORT);
+#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+try_again:
+       addr.sin_port = htons(port);
        if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               port++;
+               if ((port - WPA_GLOBAL_CTRL_IFACE_PORT) <
+                   WPA_GLOBAL_CTRL_IFACE_PORT_LIMIT)
+                       goto try_again;
                perror("bind(AF_INET)");
                goto fail;
        }
 
+#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
+       wpa_printf(MSG_DEBUG, "global_ctrl_iface_init UDP port: %d", port);
+#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
+
        eloop_register_read_sock(priv->sock,
                                 wpa_supplicant_global_ctrl_iface_receive,
                                 global, priv);