wpa_supplicant: Fix p2p_group_add when UDP-based ctrl_iface is used
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>
Tue, 8 Mar 2016 13:28:02 +0000 (14:28 +0100)
committerJouni Malinen <j@w1.fi>
Sun, 20 Mar 2016 19:41:40 +0000 (21:41 +0200)
While p2p_group_add ctrl_interface name could be derived from the main
interface (simple p2p_group_add command), we failed to bind the same UDP
port. Fix this problem and also update the correct ctrl_interface name
(port decrement).

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
wpa_supplicant/ctrl_iface_udp.c

index 503052a..fda8a0b 100644 (file)
@@ -378,6 +378,7 @@ struct ctrl_iface_priv *
 wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s)
 {
        struct ctrl_iface_priv *priv;
+       char port_str[40];
        int port = WPA_CTRL_IFACE_PORT;
        char *pos;
 #ifdef CONFIG_CTRL_IFACE_UDP_IPV6
@@ -439,13 +440,21 @@ try_again:
 #endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
        if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
                port--;
-               if ((WPA_CTRL_IFACE_PORT - port) < WPA_CTRL_IFACE_PORT_LIMIT &&
-                   !pos)
+               if ((WPA_CTRL_IFACE_PORT - port) < WPA_CTRL_IFACE_PORT_LIMIT)
                        goto try_again;
                wpa_printf(MSG_ERROR, "bind(AF_INET): %s", strerror(errno));
                goto fail;
        }
 
+       /* Update the ctrl_interface value to match the selected port */
+       os_snprintf(port_str, sizeof(port_str), "udp:%d", port);
+       os_free(wpa_s->conf->ctrl_interface);
+       wpa_s->conf->ctrl_interface = os_strdup(port_str);
+       if (!wpa_s->conf->ctrl_interface) {
+               wpa_msg(wpa_s, MSG_ERROR, "Failed to malloc ctrl_interface");
+               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 */