<div><div>Hi,</div><div><br></div><div>I've been struggling to get my prototype P2P device to work with Samsung Galaxy SII. The connection establishment kept failing with WPS_FAILURE and it turned out to be due to overlap detected:</div>
<div><br></div><div><div>01-03 01:27:26.140 E/wpa_supplicant( 2455): WPS: Requested UUID - hexdump(len=16): 22 21 02 03 04 05 06 07 08 09 1a 1b 1c 1d 1e 1f</div><div>01-03 01:27:26.140 D/wpa_supplicant( 2455): WPS: Consider PBC session with 06:46:65:d3:4a:54</div>
<div>01-03 01:27:26.140 E/wpa_supplicant( 2455): WPS: UUID-E - hexdump(len=16): 22 21 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f</div><div>01-03 01:27:26.140 D/wpa_supplicant( 2455): WPS: New Enrollee</div><div>01-03 01:27:26.140 D/wpa_supplicant( 2455): WPS: 2 active PBC session(s) found</div>
<div>01-03 01:27:26.140 D/wpa_supplicant( 2455): WPS: PBC overlap - deny PBC negotiation</div></div><div><br></div><div>So Galaxy changes UUID for PBC negotiation but the thing is, it could have been considered to be the same session because the MAC address is the same.</div>
<div>There is a mechanism to do so for P2P connections in wpa_supplicant but it doesn't work because P2P MAC address is not passed over to wps_registrar_skip_overlap(). This patch adds that and also fixes the PBC session removal after the negotiation (the current version leaves the session in the list if it doesn't match UUID, I suggest that we remove all sessions for the given MAC).</div>
<div><br></div><div>diff --git a/src/wps/wps_registrar.c b/src/wps/wps_registrar.c</div><div>index 4a49197..eed29e2 100644</div><div>--- a/src/wps/wps_registrar.c</div><div>+++ b/src/wps/wps_registrar.c</div><div>@@ -310,13 +310,16 @@ static void wps_registrar_add_pbc_session(struct wps_registrar *reg,</div>
<div> </div><div> </div><div> static void wps_registrar_remove_pbc_session(struct wps_registrar *reg,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                                        </span> const u8 *uuid_e)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span> const u8 *uuid_e,</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span> const u8 *p2p_dev_addr)</div><div> {</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>struct wps_pbc_session *pbc, *prev = NULL, *tmp;</div>
<div> </div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>pbc = reg->pbc_sessions;</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>while (pbc) {</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>if (os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>if (os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0 ||</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span> (!is_zero_ether_addr(reg->p2p_dev_addr) &&</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span> !os_memcmp(reg->p2p_dev_addr, p2p_dev_addr, ETH_ALEN))) {</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span>if (prev)</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                                </span>prev->next = pbc->next;</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span>else</div><div>@@ -3035,7 +3038,8 @@ static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,</div>
<div> </div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>if (wps->pbc) {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>wps_registrar_remove_pbc_session(wps->wps->registrar,</div>
<div>-<span class="Apple-tab-span" style="white-space:pre">                                                </span> wps->uuid_e);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                                </span> wps->uuid_e,</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                                </span> wps->p2p_dev_addr);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>wps_registrar_pbc_completed(wps->wps->registrar);</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>} else {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>wps_registrar_pin_completed(wps->wps->registrar);</div>
<div>diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c</div><div>index c6484af..1700ace 100644</div><div>--- a/wpa_supplicant/p2p_supplicant.c</div><div>+++ b/wpa_supplicant/p2p_supplicant.c</div>
<div>@@ -689,7 +689,7 @@ static void p2p_go_configured(void *ctx, void *data)</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>if (params->wps_method == WPS_PBC)</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                                        </span> NULL);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span> params->peer_device_addr);</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>else if (wpa_s->p2p_pin[0])</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr,</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                                        </span> wpa_s->p2p_pin, NULL, 0);</div></div>