WPS: Track peer MAC address from the last operations

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jeffin Mammen 2013-08-23 16:01:55 +03:00 committed by Jouni Malinen
parent ae23935e7d
commit e96872a4f2
7 changed files with 54 additions and 31 deletions

View file

@ -83,6 +83,7 @@ struct wps_stat {
enum wps_status status; enum wps_status status;
enum wps_error_indication failure_reason; enum wps_error_indication failure_reason;
enum pbc_status pbc_status; enum pbc_status pbc_status;
u8 peer_addr[ETH_ALEN];
}; };

View file

@ -711,6 +711,7 @@ static void hostapd_pwd_auth_fail(struct hostapd_data *hapd,
wpa_printf(MSG_DEBUG, "WPS: Authentication failure update"); wpa_printf(MSG_DEBUG, "WPS: Authentication failure update");
hapd->wps_stats.status = WPS_STATUS_FAILURE; hapd->wps_stats.status = WPS_STATUS_FAILURE;
hapd->wps_stats.failure_reason = WPS_EI_AUTH_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); 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 */ /* Update WPS status - Success */
hapd->wps_stats.pbc_status = WPS_PBC_STATUS_DISABLE; hapd->wps_stats.pbc_status = WPS_PBC_STATUS_DISABLE;
hapd->wps_stats.status = WPS_STATUS_SUCCESS; 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 */ /* Update WPS status - Failure */
hapd->wps_stats.status = 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; hapd->wps_stats.failure_reason = fail->error_indication;
if (fail->error_indication > 0 && 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); hostapd_wps_event_fail(hapd, &data->fail);
break; break;
case WPS_EV_SUCCESS: 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); wpa_msg(hapd->msg_ctx, MSG_INFO, WPS_EVENT_SUCCESS);
break; break;
case WPS_EV_PWD_AUTH_FAIL: case WPS_EV_PWD_AUTH_FAIL:

View file

@ -497,11 +497,17 @@ union wps_event_data {
int msg; int msg;
u16 config_error; u16 config_error;
u16 error_indication; u16 error_indication;
u8 peer_macaddr[ETH_ALEN];
} fail; } fail;
struct wps_event_success {
u8 peer_macaddr[ETH_ALEN];
} success;
struct wps_event_pwd_auth_fail { struct wps_event_pwd_auth_fail {
int enrollee; int enrollee;
int part; int part;
u8 peer_macaddr[ETH_ALEN];
} pwd_auth_fail; } pwd_auth_fail;
struct wps_event_er_ap { struct wps_event_er_ap {

View 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, 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; 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.msg = msg;
data.fail.config_error = config_error; data.fail.config_error = config_error;
data.fail.error_indication = error_indication; 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); 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) if (wps->event_cb == NULL)
return; 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; 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)); os_memset(&data, 0, sizeof(data));
data.pwd_auth_fail.enrollee = enrollee; data.pwd_auth_fail.enrollee = enrollee;
data.pwd_auth_fail.part = part; 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); wps->event_cb(wps->cb_ctx, WPS_EV_PWD_AUTH_FAIL, &data);
} }

View file

@ -392,7 +392,7 @@ static struct wpabuf * wps_build_wsc_done(struct wps_data *wps)
if (wps->wps->ap) if (wps->wps->ap)
wps->state = RECV_ACK; wps->state = RECV_ACK;
else { else {
wps_success_event(wps->wps); wps_success_event(wps->wps, wps->peer_dev.mac_addr);
wps->state = WPS_FINISHED; wps->state = WPS_FINISHED;
} }
return msg; 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 " wpa_printf(MSG_DEBUG, "WPS: R-Hash1 derived from R-S1 does "
"not match with the pre-committed value"); "not match with the pre-committed value");
wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; 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; 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 " wpa_printf(MSG_DEBUG, "WPS: R-Hash2 derived from R-S2 does "
"not match with the pre-committed value"); "not match with the pre-committed value");
wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; 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; 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); ret = wps_process_m4(wps, msg, &attr);
if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
wps_fail_event(wps->wps, WPS_M4, wps->config_error, wps_fail_event(wps->wps, WPS_M4, wps->config_error,
wps->error_indication); wps->error_indication,
wps->peer_dev.mac_addr);
break; break;
case WPS_M6: case WPS_M6:
if (wps_validate_m6(msg) < 0) 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); ret = wps_process_m6(wps, msg, &attr);
if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
wps_fail_event(wps->wps, WPS_M6, wps->config_error, wps_fail_event(wps->wps, WPS_M6, wps->config_error,
wps->error_indication); wps->error_indication,
wps->peer_dev.mac_addr);
break; break;
case WPS_M8: case WPS_M8:
if (wps_validate_m8(msg) < 0) 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); ret = wps_process_m8(wps, msg, &attr);
if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
wps_fail_event(wps->wps, WPS_M8, wps->config_error, wps_fail_event(wps->wps, WPS_M8, wps->config_error,
wps->error_indication); wps->error_indication,
wps->peer_dev.mac_addr);
break; break;
default: default:
wpa_printf(MSG_DEBUG, "WPS: Unsupported Message Type %d", 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) { if (wps->state == RECV_ACK && wps->wps->ap) {
wpa_printf(MSG_DEBUG, "WPS: External Registrar registration " wpa_printf(MSG_DEBUG, "WPS: External Registrar registration "
"completed successfully"); "completed successfully");
wps_success_event(wps->wps); wps_success_event(wps->wps, wps->peer_dev.mac_addr);
wps->state = WPS_FINISHED; wps->state = WPS_FINISHED;
return WPS_DONE; return WPS_DONE;
} }
@ -1348,15 +1351,15 @@ static enum wps_process_res wps_process_wsc_nack(struct wps_data *wps,
switch (wps->state) { switch (wps->state) {
case RECV_M4: case RECV_M4:
wps_fail_event(wps->wps, WPS_M3, config_error, wps_fail_event(wps->wps, WPS_M3, config_error,
wps->error_indication); wps->error_indication, wps->peer_dev.mac_addr);
break; break;
case RECV_M6: case RECV_M6:
wps_fail_event(wps->wps, WPS_M5, config_error, wps_fail_event(wps->wps, WPS_M5, config_error,
wps->error_indication); wps->error_indication, wps->peer_dev.mac_addr);
break; break;
case RECV_M8: case RECV_M8:
wps_fail_event(wps->wps, WPS_M7, config_error, wps_fail_event(wps->wps, WPS_M7, config_error,
wps->error_indication); wps->error_indication, wps->peer_dev.mac_addr);
break; break;
default: default:
break; break;

View 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, struct wpabuf * wps_decrypt_encr_settings(struct wps_data *wps, const u8 *encr,
size_t encr_len); size_t encr_len);
void wps_fail_event(struct wps_context *wps, enum wps_msg_type msg, 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);
void wps_success_event(struct wps_context *wps); 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); 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_overlap_event(struct wps_context *wps);
void wps_pbc_timeout_event(struct wps_context *wps); void wps_pbc_timeout_event(struct wps_context *wps);
void wps_pbc_active_event(struct wps_context *wps); void wps_pbc_active_event(struct wps_context *wps);

View 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 " wpa_printf(MSG_DEBUG, "WPS: E-Hash1 derived from E-S1 does "
"not match with the pre-committed value"); "not match with the pre-committed value");
wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; 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; 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"); "not match with the pre-committed value");
wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e); wps_registrar_invalidate_pin(wps->wps->registrar, wps->uuid_e);
wps->config_error = WPS_CFG_DEV_PASSWORD_AUTH_FAILURE; 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; 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_pbc_overlap_event(wps->wps);
wps_fail_event(wps->wps, WPS_M1, wps_fail_event(wps->wps, WPS_M1,
WPS_CFG_MULTIPLE_PBC_DETECTED, WPS_CFG_MULTIPLE_PBC_DETECTED,
WPS_EI_NO_ERROR); WPS_EI_NO_ERROR, wps->mac_addr_e);
wps->wps->registrar->force_pbc_overlap = 1; wps->wps->registrar->force_pbc_overlap = 1;
return WPS_CONTINUE; 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); ret = wps_process_m3(wps, msg, &attr);
if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
wps_fail_event(wps->wps, WPS_M3, wps->config_error, wps_fail_event(wps->wps, WPS_M3, wps->config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
case WPS_M5: case WPS_M5:
if (wps_validate_m5(msg) < 0) 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); ret = wps_process_m5(wps, msg, &attr);
if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
wps_fail_event(wps->wps, WPS_M5, wps->config_error, wps_fail_event(wps->wps, WPS_M5, wps->config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
case WPS_M7: case WPS_M7:
if (wps_validate_m7(msg) < 0) 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); ret = wps_process_m7(wps, msg, &attr);
if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK) if (ret == WPS_FAILURE || wps->state == SEND_WSC_NACK)
wps_fail_event(wps->wps, WPS_M7, wps->config_error, wps_fail_event(wps->wps, WPS_M7, wps->config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
default: default:
wpa_printf(MSG_DEBUG, "WPS: Unsupported Message Type %d", 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) { switch (old_state) {
case RECV_M3: case RECV_M3:
wps_fail_event(wps->wps, WPS_M2, config_error, wps_fail_event(wps->wps, WPS_M2, config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
case RECV_M5: case RECV_M5:
wps_fail_event(wps->wps, WPS_M4, config_error, wps_fail_event(wps->wps, WPS_M4, config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
case RECV_M7: case RECV_M7:
wps_fail_event(wps->wps, WPS_M6, config_error, wps_fail_event(wps->wps, WPS_M6, config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
case RECV_DONE: case RECV_DONE:
wps_fail_event(wps->wps, WPS_M8, config_error, wps_fail_event(wps->wps, WPS_M8, config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
break; break;
default: default:
break; 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 /* TODO: maintain AuthorizedMACs somewhere separately for each ER and
* merge them into APs own list.. */ * merge them into APs own list.. */
wps_success_event(wps->wps); wps_success_event(wps->wps, wps->mac_addr_e);
return WPS_DONE; 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->state = SEND_WSC_NACK;
wps_fail_event(wps->wps, WPS_WSC_DONE, wps_fail_event(wps->wps, WPS_WSC_DONE,
wps->config_error, wps->config_error,
wps->error_indication); wps->error_indication, wps->mac_addr_e);
} }
return ret; return ret;
default: default: