P2P: Initial support for SD fragmentation (GAS Comeback Request/Response)
[libeap.git] / wpa_supplicant / p2p_supplicant.c
index 45121ce..b5a7ab8 100644 (file)
@@ -1166,7 +1166,7 @@ static void wpas_sd_req_bonjour(struct wpa_supplicant *wpa_s,
                           "available");
 
                /* Status Code */
-               wpabuf_put_u8(resp, P2P_SD_QUERY_DATA_NOT_AVAILABLE);
+               wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE);
                /* Response Data: empty */
                WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
                             2);
@@ -1296,7 +1296,7 @@ static void wpas_sd_req_upnp(struct wpa_supplicant *wpa_s,
                wpa_printf(MSG_DEBUG, "P2P: Requested UPnP service not "
                           "available");
                /* Status Code */
-               wpabuf_put_u8(resp, P2P_SD_QUERY_DATA_NOT_AVAILABLE);
+               wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE);
                /* Response Data: empty */
        }
 
@@ -1413,14 +1413,23 @@ void wpas_sd_response(void *ctx, const u8 *sa, u16 update_indic,
 
        wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Response TLVs",
                    tlvs, tlvs_len);
-       buf_len = 2 * tlvs_len + 1;
-       buf = os_malloc(buf_len);
-       if (buf) {
-               wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len);
-               wpa_msg_ctrl(wpa_s, MSG_INFO, P2P_EVENT_SERV_DISC_RESP MACSTR
-                            " %u %s",
-                            MAC2STR(sa), update_indic, buf);
-               os_free(buf);
+       if (tlvs_len > 1500) {
+               /* TODO: better way for handling this */
+               wpa_msg_ctrl(wpa_s, MSG_INFO,
+                            P2P_EVENT_SERV_DISC_RESP MACSTR
+                            " %u <long response: %u bytes>",
+                            MAC2STR(sa), update_indic,
+                            (unsigned int) tlvs_len);
+       } else {
+               buf_len = 2 * tlvs_len + 1;
+               buf = os_malloc(buf_len);
+               if (buf) {
+                       wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len);
+                       wpa_msg_ctrl(wpa_s, MSG_INFO,
+                                    P2P_EVENT_SERV_DISC_RESP MACSTR " %u %s",
+                                    MAC2STR(sa), update_indic, buf);
+                       os_free(buf);
+               }
        }
 
        while (pos < end) {
@@ -1830,6 +1839,9 @@ static void wpas_invitation_result(void *ctx, int status, const u8 *bssid)
                        "status=%d ", status);
        }
 
+       if (wpa_s->pending_invite_ssid_id == -1)
+               return; /* Invitation to active group */
+
        if (status != P2P_SC_SUCCESS) {
                wpas_p2p_remove_pending_group_interface(wpa_s);
                return;
@@ -2187,6 +2199,8 @@ void wpas_p2p_deinit_global(struct wpa_global *global)
 
        /* Remove remaining P2P group interfaces */
        wpa_s = global->ifaces;
+       if (wpa_s)
+               wpas_p2p_service_flush(wpa_s);
        while (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
                wpa_s = wpa_s->next;
        while (wpa_s) {