WPS: Track peer MAC address from the last operations
authorJeffin Mammen <jmammen@qti.qualcomm.com>
Fri, 23 Aug 2013 13:01:55 +0000 (16:01 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 23 Aug 2013 14:48:59 +0000 (17:48 +0300)
Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

src/ap/hostapd.h
src/ap/wps_hostapd.c
src/wps/wps.h
src/wps/wps_common.c
src/wps/wps_enrollee.c
src/wps/wps_i.h
src/wps/wps_registrar.c

index 2502317..fb0cdde 100644 (file)
@@ -83,6 +83,7 @@ struct wps_stat {
        enum wps_status status;
        enum wps_error_indication failure_reason;
        enum pbc_status pbc_status;
+       u8 peer_addr[ETH_ALEN];
 };
 
 
index 2930b7d..a33168c 100644 (file)
@@ -711,6 +711,7 @@ static void hostapd_pwd_auth_fail(struct hostapd_data *hapd,
        wpa_printf(MSG_DEBUG, "WPS: Authentication failure update");
        hapd->wps_stats.status = WPS_STATUS_FAILURE;
        hapd->wps_stats.failure_reason = WPS_EI_AUTH_FAILURE;
+       os_memcpy(hapd->wps_stats.peer_addr, data->peer_macaddr, ETH_ALEN);
 
        hostapd_wps_for_each(hapd, wps_pwd_auth_fail, data);
 }
@@ -767,11 +768,13 @@ static void hostapd_wps_event_pbc_disable(struct hostapd_data *hapd)
 }
 
 
-static void hostapd_wps_event_success(struct hostapd_data *hapd)
+static void hostapd_wps_event_success(struct hostapd_data *hapd,
+                                     struct wps_event_success *success)
 {
        /* Update WPS status - Success */
        hapd->wps_stats.pbc_status = WPS_PBC_STATUS_DISABLE;
        hapd->wps_stats.status = WPS_STATUS_SUCCESS;
+       os_memcpy(hapd->wps_stats.peer_addr, success->peer_macaddr, ETH_ALEN);
 }
 
 
@@ -780,6 +783,8 @@ static void hostapd_wps_event_fail(struct hostapd_data *hapd,
 {
        /* Update WPS status - Failure */
        hapd->wps_stats.status = WPS_STATUS_FAILURE;
+       os_memcpy(hapd->wps_stats.peer_addr, fail->peer_macaddr, ETH_ALEN);
+
        hapd->wps_stats.failure_reason = fail->error_indication;
 
        if (fail->error_indication > 0 &&
@@ -809,7 +814,7 @@ static void hostapd_wps_event_cb(void *ctx, enum wps_event event,
                hostapd_wps_event_fail(hapd, &data->fail);
                break;
        case WPS_EV_SUCCESS:
-               hostapd_wps_event_success(hapd);
+               hostapd_wps_event_success(hapd, &data->success);
                wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_SUCCESS);
                break;
        case WPS_EV_PWD_AUTH_FAIL:
index 8d9535b..57d7ca0 100644 (file)
@@ -497,11 +497,17 @@ union wps_event_data {
                int msg;
                u16 config_error;
                u16 error_indication;
+               u8 peer_macaddr[ETH_ALEN];
        } fail;
 
+       struct wps_event_success {
+               u8 peer_macaddr[ETH_ALEN];
+       } success;
+
        struct wps_event_pwd_auth_fail {
                int enrollee;
                int part;
+               u8 peer_macaddr[ETH_ALEN];
        } pwd_auth_fail;
 
        struct wps_event_er_ap {
index 8c54a15..4b431ad 100644 (file)
@@ -266,7 +266,7 @@ int wps_pin_str_valid(const char *pin)
 
 
 void wps_fail_event(struct wps_context *wps, enum wps_msg_type msg,
-                   u16 config_error, u16 error_indication)
+                   u16 config_error, u16 error_indication, const u8 *mac_addr)
 {
        union wps_event_data data;
 
@@ -277,20 +277,26 @@ void wps_fail_event(struct wps_context *wps, enum wps_msg_type msg,
        data.fail.msg = msg;
        data.fail.config_error = config_error;
        data.fail.error_indication = error_indication;
+       os_memcpy(data.fail.peer_macaddr, mac_addr, ETH_ALEN);
        wps->event_cb(wps->cb_ctx, WPS_EV_FAIL, &data);
 }
 
 
-void wps_success_event(struct wps_context *wps)
+void wps_success_event(struct wps_context *wps, const u8 *mac_addr)
 {
+       union wps_event_data data;
+
        if (wps->event_cb == NULL)
                return;
 
-       wps->event_cb(wps->cb_ctx, WPS_EV_SUCCESS, NULL);
+       os_memset(&data, 0, sizeof(data));
+       os_memcpy(data.success.peer_macaddr, mac_addr, ETH_ALEN);
+       wps->event_cb(wps->cb_ctx, WPS_EV_SUCCESS, &data);
 }
 
 
-void wps_pwd_auth_fail_event(struct wps_context *wps, int enrollee, int part)
+void wps_pwd_auth_fail_event(struct wps_context *wps, int enrollee, int part,
+                            const u8 *mac_addr)
 {
        union wps_event_data data;
 
@@ -300,6 +306,7 @@ void wps_pwd_auth_fail_event(struct wps_context *wps, int enrollee, int part)
        os_memset(&data, 0, sizeof(data));
        data.pwd_auth_fail.enrollee = enrollee;
        data.pwd_auth_fail.part = part;
+       os_memcpy(data.pwd_auth_fail.peer_macaddr, mac_addr, ETH_ALEN);
        wps->event_cb(wps->cb_ctx, WPS_EV_PWD_AUTH_FAIL, &data);
 }
 
index 27c554f..67ef01e 100644 (file)
@@ -392,7 +392,7 @@ static struct wpabuf * wps_build_wsc_done(struct wps_data *wps)
        if (wps->wps->ap)
                wps->state = RECV_ACK;
        else {
-               wps_success_event(wps->wps);
+               wps_success_event(wps->wps, wps->peer_dev.mac_addr);
                wps->state = WPS_FINISHED;
        }
        return msg;
@@ -582,7 +582,7 @@ static int wps_process_r_snonce1(struct wps_data *wps, const u8 *r_snonce1)
                wpa_printf(MSG_DEBUG, "WPS: R-Hash1 derived from R-S1 does "
                           "not match with the pre-committed value");
                wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE;
-               wps_pwd_auth_fail_event(wps->wps, 1, 1);
+               wps_pwd_auth_fail_event(wps->wps, 1, 1, wps->peer_dev.mac_addr);
                return -1;
        }
 
@@ -622,7 +622,7 @@ static int wps_process_r_snonce2(struct wps_data *wps, const u8 *r_snonce2)
                wpa_printf(MSG_DEBUG, "WPS: R-Hash2 derived from R-S2 does "
                           "not match with the pre-committed value");
                wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE;
-               wps_pwd_auth_fail_event(wps->wps, 1, 2);
+               wps_pwd_auth_fail_event(wps->wps, 1, 2, wps->peer_dev.mac_addr);
                return -1;
        }
 
@@ -1204,7 +1204,8 @@ static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
                ret = wps_process_m4(wps, msg, &attr);
                if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
                        wps_fail_event(wps->wps, WPS_M4, wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication,
+                                      wps->peer_dev.mac_addr);
                break;
        case WPS_M6:
                if (wps_validate_m6(msg) < 0)
@@ -1212,7 +1213,8 @@ static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
                ret = wps_process_m6(wps, msg, &attr);
                if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
                        wps_fail_event(wps->wps, WPS_M6, wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication,
+                                      wps->peer_dev.mac_addr);
                break;
        case WPS_M8:
                if (wps_validate_m8(msg) < 0)
@@ -1220,7 +1222,8 @@ static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
                ret = wps_process_m8(wps, msg, &attr);
                if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
                        wps_fail_event(wps->wps, WPS_M8, wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication,
+                                      wps->peer_dev.mac_addr);
                break;
        default:
                wpa_printf(MSG_DEBUG, "WPS: Unsupported Message Type %d",
@@ -1283,7 +1286,7 @@ static enum wps_process_res wps_process_wsc_ack(struct wps_data *wps,
        if (wps->state == RECV_ACK && wps->wps->ap) {
                wpa_printf(MSG_DEBUG, "WPS: External Registrar registration "
                           "completed successfully");
-               wps_success_event(wps->wps);
+               wps_success_event(wps->wps, wps->peer_dev.mac_addr);
                wps->state = WPS_FINISHED;
                return WPS_DONE;
        }
@@ -1348,15 +1351,15 @@ static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps,
        switch (wps->state) {
        case RECV_M4:
                wps_fail_event(wps->wps, WPS_M3, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->peer_dev.mac_addr);
                break;
        case RECV_M6:
                wps_fail_event(wps->wps, WPS_M5, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->peer_dev.mac_addr);
                break;
        case RECV_M8:
                wps_fail_event(wps->wps, WPS_M7, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->peer_dev.mac_addr);
                break;
        default:
                break;
index 17cf396..dac1250 100644 (file)
@@ -134,9 +134,10 @@ void wps_derive_psk(struct wps_data *wps, const u8 *dev_passwd,
 struct wpabuf * wps_decrypt_encr_settings(struct wps_data *wps, const u8 *encr,
                                          size_t encr_len);
 void wps_fail_event(struct wps_context *wps, enum wps_msg_type msg,
-                   u16 config_error, u16 error_indication);
-void wps_success_event(struct wps_context *wps);
-void wps_pwd_auth_fail_event(struct wps_context *wps, int enrollee, int part);
+                   u16 config_error, u16 error_indication, const u8 *mac_addr);
+void wps_success_event(struct wps_context *wps, const u8 *mac_addr);
+void wps_pwd_auth_fail_event(struct wps_context *wps, int enrollee, int part,
+                            const u8 *mac_addr);
 void wps_pbc_overlap_event(struct wps_context *wps);
 void wps_pbc_timeout_event(struct wps_context *wps);
 void wps_pbc_active_event(struct wps_context *wps);
index c37051c..b3a8c0a 100644 (file)
@@ -2169,7 +2169,7 @@ static int wps_process_e_snonce1(struct wps_data *wps, const u8 *e_snonce1)
                wpa_printf(MSG_DEBUG, "WPS: E-Hash1 derived from E-S1 does "
                           "not match with the pre-committed value");
                wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE;
-               wps_pwd_auth_fail_event(wps->wps, 0, 1);
+               wps_pwd_auth_fail_event(wps->wps, 0, 1, wps->mac_addr_e);
                return -1;
        }
 
@@ -2210,7 +2210,7 @@ static int wps_process_e_snonce2(struct wps_data *wps, const u8 *e_snonce2)
                           "not match with the pre-committed value");
                wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e);
                wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE;
-               wps_pwd_auth_fail_event(wps->wps, 0, 2);
+               wps_pwd_auth_fail_event(wps->wps, 0, 2, wps->mac_addr_e);
                return -1;
        }
 
@@ -2562,7 +2562,7 @@ static enum wps_process_res wps_process_m1(struct wps_data *wps,
                        wps_pbc_overlap_event(wps->wps);
                        wps_fail_event(wps->wps, WPS_M1,
                                       WPS_CFG_MULTIPLE_PBC_DETECTED,
-                                      WPS_EI_NO_ERROR);
+                                      WPS_EI_NO_ERROR, wps->mac_addr_e);
                        wps->wps->registrar->force_pbc_overlap = 1;
                        return WPS_CONTINUE;
                }
@@ -2892,7 +2892,7 @@ static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
                ret = wps_process_m3(wps, msg, &attr);
                if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
                        wps_fail_event(wps->wps, WPS_M3, wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication, wps->mac_addr_e);
                break;
        case WPS_M5:
                if (wps_validate_m5(msg) < 0)
@@ -2900,7 +2900,7 @@ static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
                ret = wps_process_m5(wps, msg, &attr);
                if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
                        wps_fail_event(wps->wps, WPS_M5, wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication, wps->mac_addr_e);
                break;
        case WPS_M7:
                if (wps_validate_m7(msg) < 0)
@@ -2908,7 +2908,7 @@ static enum wps_process_res wps_process_wsc_msg(struct wps_data *wps,
                ret = wps_process_m7(wps, msg, &attr);
                if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
                        wps_fail_event(wps->wps, WPS_M7, wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication, wps->mac_addr_e);
                break;
        default:
                wpa_printf(MSG_DEBUG, "WPS: Unsupported Message Type %d",
@@ -3054,19 +3054,19 @@ static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps,
        switch (old_state) {
        case RECV_M3:
                wps_fail_event(wps->wps, WPS_M2, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->mac_addr_e);
                break;
        case RECV_M5:
                wps_fail_event(wps->wps, WPS_M4, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->mac_addr_e);
                break;
        case RECV_M7:
                wps_fail_event(wps->wps, WPS_M6, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->mac_addr_e);
                break;
        case RECV_DONE:
                wps_fail_event(wps->wps, WPS_M8, config_error,
-                              wps->error_indication);
+                              wps->error_indication, wps->mac_addr_e);
                break;
        default:
                break;
@@ -3187,7 +3187,7 @@ static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,
        /* TODO: maintain AuthorizedMACs somewhere separately for each ER and
         * merge them into APs own list.. */
 
-       wps_success_event(wps->wps);
+       wps_success_event(wps->wps, wps->mac_addr_e);
 
        return WPS_DONE;
 }
@@ -3256,7 +3256,7 @@ enum wps_process_res wps_registrar_process_msg(struct wps_data *wps,
                        wps->state = SEND_WSC_NACK;
                        wps_fail_event(wps->wps, WPS_WSC_DONE,
                                       wps->config_error,
-                                      wps->error_indication);
+                                      wps->error_indication, wps->mac_addr_e);
                }
                return ret;
        default: