WPS: Track peer MAC address from the last operations
Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
ae23935e7d
commit
e96872a4f2
7 changed files with 54 additions and 31 deletions
|
@ -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];
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue