P2P: Fix invitation to active group to use correct operating channel
[libeap.git] / wpa_supplicant / ctrl_iface.c
index 74daf96..e82d31d 100644 (file)
@@ -216,7 +216,8 @@ static int wpa_supplicant_ctrl_iface_wps_pin(struct wpa_supplicant *wpa_s,
 #endif /* CONFIG_AP */
 
        if (pin) {
-               ret = wpas_wps_start_pin(wpa_s, _bssid, pin, 0);
+               ret = wpas_wps_start_pin(wpa_s, _bssid, pin, 0,
+                                        DEV_PW_DEFAULT);
                if (ret < 0)
                        return -1;
                ret = os_snprintf(buf, buflen, "%s", pin);
@@ -225,7 +226,7 @@ static int wpa_supplicant_ctrl_iface_wps_pin(struct wpa_supplicant *wpa_s,
                return ret;
        }
 
-       ret = wpas_wps_start_pin(wpa_s, _bssid, NULL, 0);
+       ret = wpas_wps_start_pin(wpa_s, _bssid, NULL, 0, DEV_PW_DEFAULT);
        if (ret < 0)
                return -1;
 
@@ -605,6 +606,12 @@ static int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s,
                        return pos - buf;
                pos += ret;
        }
+
+       ret = os_snprintf(pos, end - pos, "address=" MACSTR "\n",
+                         MAC2STR(wpa_s->own_addr));
+       if (ret < 0 || ret >= end - pos)
+               return pos - buf;
+       pos += ret;
 #endif /* CONFIG_P2P */
 
        if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
@@ -1849,7 +1856,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
        int freq = 0;
 
        /* <addr> <"pbc" | "pin" | PIN> [label|display|keypad] [persistent]
-        * [join|auth] [go_intent=<0..15>] [freq=<in MHz>] */
+        * [join] [auth] [go_intent=<0..15>] [freq=<in MHz>] */
 
        if (hwaddr_aton(cmd, addr))
                return -1;
@@ -2434,6 +2441,15 @@ static int p2p_ctrl_set(struct wpa_supplicant *wpa_s, char *cmd)
                return wpa_drv_set_noa(wpa_s, count, start, duration);
        }
 
+       if (os_strcmp(cmd, "ps") == 0)
+               return wpa_drv_set_p2p_powersave(wpa_s, atoi(param), -1, -1);
+
+       if (os_strcmp(cmd, "oppps") == 0)
+               return wpa_drv_set_p2p_powersave(wpa_s, -1, atoi(param), -1);
+
+       if (os_strcmp(cmd, "ctwindow") == 0)
+               return wpa_drv_set_p2p_powersave(wpa_s, -1, -1, atoi(param));
+
        if (os_strcmp(cmd, "disabled") == 0) {
                wpa_s->global->p2p_disabled = atoi(param);
                wpa_printf(MSG_DEBUG, "P2P functionality %s",
@@ -2441,11 +2457,25 @@ static int p2p_ctrl_set(struct wpa_supplicant *wpa_s, char *cmd)
                           "disabled" : "enabled");
                if (wpa_s->global->p2p_disabled) {
                        wpas_p2p_stop_find(wpa_s);
+                       os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
                        p2p_flush(wpa_s->global->p2p);
                }
                return 0;
        }
 
+       if (os_strcmp(cmd, "force_long_sd") == 0) {
+               wpa_s->force_long_sd = atoi(param);
+               return 0;
+       }
+
+       if (os_strcmp(cmd, "peer_filter") == 0) {
+               u8 addr[ETH_ALEN];
+               if (hwaddr_aton(param, addr))
+                       return -1;
+               p2p_set_peer_filter(wpa_s->global->p2p, addr);
+               return 0;
+       }
+
        wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown P2P_SET field value '%s'",
                   cmd);
 
@@ -2706,6 +2736,8 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
                if (p2p_ctrl_set(wpa_s, buf + 8) < 0)
                        reply_len = -1;
        } else if (os_strcmp(buf, "P2P_FLUSH") == 0) {
+               os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
+               wpa_s->force_long_sd = 0;
                p2p_flush(wpa_s->global->p2p);
        } else if (os_strncmp(buf, "P2P_PRESENCE_REQ ", 17) == 0) {
                if (p2p_ctrl_presence_req(wpa_s, buf + 17) < 0)