]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Skip WPS PBC overlap detection if P2P address is the same
authorVitaly Wool <vitalywool@gmail.com>
Sun, 11 Dec 2011 10:03:18 +0000 (12:03 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 11 Dec 2011 10:03:18 +0000 (12:03 +0200)
WPS overlap detection can detect false overlap if a P2P peer
changes UUID while authentication is ongoing. Changing UUID
is of course wrong but this is what some popular devices do
so we need to work around it in order to keep compatibility
with these devices. There already is a mechanism in WPS
registrar to skip overlap detection if P2P addresses of two
sessions match but it wasn't really triggered because the
address wasn't filled in in the caller function.

Let's fill in this address and also clean up WPS PBC sessions
on WSC process completion if UUID was changed.

Signed-hostap: Vitaly Wool<vitalywool@gmail.com>

src/wps/wps_registrar.c
wpa_supplicant/p2p_supplicant.c

index e59edb87aa9da32503d4959b39f32509e499c385..eda1c70768f4337c2a933f293d6bf21a9511595c 100644 (file)
@@ -310,13 +310,17 @@ static void wps_registrar_add_pbc_session(struct wps_registrar *reg,
 
 
 static void wps_registrar_remove_pbc_session(struct wps_registrar *reg,
-                                            const u8 *uuid_e)
+                                            const u8 *uuid_e,
+                                            const u8 *p2p_dev_addr)
 {
        struct wps_pbc_session *pbc, *prev = NULL, *tmp;
 
        pbc = reg->pbc_sessions;
        while (pbc) {
-               if (os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0) {
+               if (os_memcmp(pbc->uuid_e, uuid_e, WPS_UUID_LEN) == 0 ||
+                   (p2p_dev_addr && !is_zero_ether_addr(reg->p2p_dev_addr) &&
+                    os_memcmp(reg->p2p_dev_addr, p2p_dev_addr, ETH_ALEN) ==
+                    0)) {
                        if (prev)
                                prev->next = pbc->next;
                        else
@@ -945,7 +949,7 @@ void wps_registrar_complete(struct wps_registrar *registrar, const u8 *uuid_e)
 {
        if (registrar->pbc) {
                wps_registrar_remove_pbc_session(registrar,
-                                                uuid_e);
+                                                uuid_e, NULL);
                wps_registrar_pbc_completed(registrar);
        } else {
                wps_registrar_pin_completed(registrar);
@@ -3047,7 +3051,8 @@ static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,
 
        if (wps->pbc) {
                wps_registrar_remove_pbc_session(wps->wps->registrar,
-                                                wps->uuid_e);
+                                                wps->uuid_e,
+                                                wps->p2p_dev_addr);
                wps_registrar_pbc_completed(wps->wps->registrar);
        } else {
                wps_registrar_pin_completed(wps->wps->registrar);
index c2095ea6a47fec184c2ff6073c4f417a914c209e..a1c87916748f30f5fc98cbfae25ecca17e9381fb 100644 (file)
@@ -689,7 +689,7 @@ static void p2p_go_configured(void *ctx, void *data)
        }
        if (params->wps_method == WPS_PBC)
                wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr,
-                                         NULL);
+                                         params->peer_device_addr);
        else if (wpa_s->p2p_pin[0])
                wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr,
                                          wpa_s->p2p_pin, NULL, 0);