eapol: Remove user_data from __eapol_rx_packet args

Instead of passing the user_data parameter in every __eapol_rx_packet
call to be used by EAPOL in all tx_packet calls, add
eapol_sm_set_tx_user_data function that sets the value of user_data for
all subsequent tx_packet calls.  This way tx_packet can be called from
places that are not necessarily inside an __eapol_rx_packet call.
This commit is contained in:
Andrew Zaborowski 2015-10-30 11:12:19 +01:00 committed by Denis Kenzior
parent ef9b6f41ce
commit 2bccb7e7dc
4 changed files with 32 additions and 27 deletions

View File

@ -599,6 +599,7 @@ struct eapol_sm {
uint8_t anonce[32]; uint8_t anonce[32];
uint8_t ptk[64]; uint8_t ptk[64];
void *user_data; void *user_data;
void *tx_user_data;
struct l_timeout *timeout; struct l_timeout *timeout;
bool have_snonce:1; bool have_snonce:1;
bool have_replay:1; bool have_replay:1;
@ -725,6 +726,11 @@ void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data)
sm->user_data = user_data; sm->user_data = user_data;
} }
void eapol_sm_set_tx_user_data(struct eapol_sm *sm, void *user_data)
{
sm->tx_user_data = user_data;
}
static bool eapol_sm_ifindex_match(void *data, void *user_data) static bool eapol_sm_ifindex_match(void *data, void *user_data)
{ {
struct eapol_sm *sm = data; struct eapol_sm *sm = data;
@ -771,8 +777,7 @@ void eapol_start(uint32_t ifindex, struct eapol_sm *sm)
} }
static void eapol_handle_ptk_1_of_4(uint32_t ifindex, struct eapol_sm *sm, static void eapol_handle_ptk_1_of_4(uint32_t ifindex, struct eapol_sm *sm,
const struct eapol_key *ek, const struct eapol_key *ek)
void *user_data)
{ {
struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk; struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk;
struct eapol_key *step2; struct eapol_key *step2;
@ -815,7 +820,7 @@ static void eapol_handle_ptk_1_of_4(uint32_t ifindex, struct eapol_sm *sm,
memcpy(step2->key_mic_data, mic, sizeof(mic)); memcpy(step2->key_mic_data, mic, sizeof(mic));
tx_packet(ifindex, sm->aa, sm->spa, tx_packet(ifindex, sm->aa, sm->spa,
(struct eapol_frame *) step2, user_data); (struct eapol_frame *) step2, sm->tx_user_data);
l_free(step2); l_free(step2);
l_timeout_remove(sm->timeout); l_timeout_remove(sm->timeout);
@ -994,8 +999,7 @@ static void eapol_handle_ptk_3_of_4(uint32_t ifindex,
struct eapol_sm *sm, struct eapol_sm *sm,
const struct eapol_key *ek, const struct eapol_key *ek,
const uint8_t *decrypted_key_data, const uint8_t *decrypted_key_data,
size_t decrypted_key_data_size, size_t decrypted_key_data_size)
void *user_data)
{ {
struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk; struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk;
struct eapol_key *step4; struct eapol_key *step4;
@ -1142,7 +1146,7 @@ static void eapol_handle_ptk_3_of_4(uint32_t ifindex,
memcpy(step4->key_mic_data, mic, sizeof(mic)); memcpy(step4->key_mic_data, mic, sizeof(mic));
tx_packet(ifindex, sm->aa, sm->spa, tx_packet(ifindex, sm->aa, sm->spa,
(struct eapol_frame *) step4, user_data); (struct eapol_frame *) step4, sm->tx_user_data);
sm->ptk_complete = true; sm->ptk_complete = true;
@ -1168,8 +1172,7 @@ static void eapol_handle_gtk_1_of_2(uint32_t ifindex,
struct eapol_sm *sm, struct eapol_sm *sm,
const struct eapol_key *ek, const struct eapol_key *ek,
const uint8_t *decrypted_key_data, const uint8_t *decrypted_key_data,
size_t decrypted_key_data_size, size_t decrypted_key_data_size)
void *user_data)
{ {
struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk; struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk;
struct eapol_key *step2; struct eapol_key *step2;
@ -1222,7 +1225,7 @@ static void eapol_handle_gtk_1_of_2(uint32_t ifindex,
memcpy(step2->key_mic_data, mic, sizeof(mic)); memcpy(step2->key_mic_data, mic, sizeof(mic));
tx_packet(ifindex, sm->aa, sm->spa, tx_packet(ifindex, sm->aa, sm->spa,
(struct eapol_frame *) step2, user_data); (struct eapol_frame *) step2, sm->tx_user_data);
if (install_gtk) { if (install_gtk) {
uint32_t cipher = uint32_t cipher =
@ -1263,7 +1266,7 @@ static struct eapol_sm *eapol_find_sm(uint32_t ifindex,
} }
void __eapol_rx_packet(uint32_t ifindex, const uint8_t *spa, const uint8_t *aa, void __eapol_rx_packet(uint32_t ifindex, const uint8_t *spa, const uint8_t *aa,
const uint8_t *frame, size_t len, void *user_data) const uint8_t *frame, size_t len)
{ {
const struct eapol_key *ek; const struct eapol_key *ek;
struct eapol_sm *sm; struct eapol_sm *sm;
@ -1341,13 +1344,13 @@ void __eapol_rx_packet(uint32_t ifindex, const uint8_t *spa, const uint8_t *aa,
eapol_handle_gtk_1_of_2(ifindex, sm, ek, eapol_handle_gtk_1_of_2(ifindex, sm, ek,
decrypted_key_data, decrypted_key_data,
key_data_len, user_data); key_data_len);
goto done; goto done;
} }
/* If no MIC, then assume packet 1, otherwise packet 3 */ /* If no MIC, then assume packet 1, otherwise packet 3 */
if (!ek->key_mic) if (!ek->key_mic)
eapol_handle_ptk_1_of_4(ifindex, sm, ek, user_data); eapol_handle_ptk_1_of_4(ifindex, sm, ek);
else { else {
if (sm->ptk_complete) if (sm->ptk_complete)
goto done; goto done;
@ -1357,7 +1360,7 @@ void __eapol_rx_packet(uint32_t ifindex, const uint8_t *spa, const uint8_t *aa,
eapol_handle_ptk_3_of_4(ifindex, sm, ek, eapol_handle_ptk_3_of_4(ifindex, sm, ek,
decrypted_key_data ?: ek->key_data, decrypted_key_data ?: ek->key_data,
key_data_len, user_data); key_data_len);
} }
done: done:

View File

@ -160,8 +160,7 @@ struct eapol_key *eapol_create_gtk_2_of_2(
bool is_wpa, uint8_t wpa_key_id); bool is_wpa, uint8_t wpa_key_id);
void __eapol_rx_packet(uint32_t ifindex, const uint8_t *spa, const uint8_t *aa, void __eapol_rx_packet(uint32_t ifindex, const uint8_t *spa, const uint8_t *aa,
const uint8_t *frame, size_t len, const uint8_t *frame, size_t len);
void *user_data);
void __eapol_set_tx_packet_func(eapol_tx_packet_func_t func); void __eapol_set_tx_packet_func(eapol_tx_packet_func_t func);
void __eapol_set_get_nonce_func(eapol_get_nonce_func_t func); void __eapol_set_get_nonce_func(eapol_get_nonce_func_t func);
@ -185,6 +184,7 @@ void eapol_sm_set_ap_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie,
bool eapol_sm_set_own_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie, bool eapol_sm_set_own_wpa(struct eapol_sm *sm, const uint8_t *wpa_ie,
size_t len); size_t len);
void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data); void eapol_sm_set_user_data(struct eapol_sm *sm, void *user_data);
void eapol_sm_set_tx_user_data(struct eapol_sm *sm, void *user_data);
struct l_io *eapol_open_pae(uint32_t index); struct l_io *eapol_open_pae(uint32_t index);
void eapol_start(uint32_t ifindex, struct eapol_sm *sm); void eapol_start(uint32_t ifindex, struct eapol_sm *sm);

View File

@ -130,7 +130,7 @@ static bool eapol_read(struct l_io *io, void *user_data)
} }
__eapol_rx_packet(netdev->index, netdev->addr, sll.sll_addr, __eapol_rx_packet(netdev->index, netdev->addr, sll.sll_addr,
frame, bytes, L_INT_TO_PTR(fd)); frame, bytes);
return true; return true;
} }
@ -1461,6 +1461,8 @@ static void mlme_associate_cmd(struct netdev *netdev)
eapol_sm_set_authenticator_address(sm, bss->addr); eapol_sm_set_authenticator_address(sm, bss->addr);
eapol_sm_set_supplicant_address(sm, netdev->addr); eapol_sm_set_supplicant_address(sm, netdev->addr);
eapol_sm_set_user_data(sm, netdev); eapol_sm_set_user_data(sm, netdev);
eapol_sm_set_tx_user_data(sm,
L_INT_TO_PTR(l_io_get_fd(netdev->eapol_io)));
eapol_start(netdev->index, sm); eapol_start(netdev->index, sm);
msg_append_attr(msg, NL80211_ATTR_CIPHER_SUITES_PAIRWISE, msg_append_attr(msg, NL80211_ATTR_CIPHER_SUITES_PAIRWISE,

View File

@ -1750,12 +1750,12 @@ static void eapol_sm_test_ptk(const void *data)
__eapol_set_tx_packet_func(verify_step2); __eapol_set_tx_packet_func(verify_step2);
__eapol_rx_packet(1, spa, aa, eapol_key_data_3, __eapol_rx_packet(1, spa, aa, eapol_key_data_3,
sizeof(eapol_key_data_3), NULL); sizeof(eapol_key_data_3));
assert(verify_step2_called); assert(verify_step2_called);
__eapol_set_tx_packet_func(verify_step4); __eapol_set_tx_packet_func(verify_step4);
__eapol_rx_packet(1, spa, aa, eapol_key_data_5, __eapol_rx_packet(1, spa, aa, eapol_key_data_5,
sizeof(eapol_key_data_5), NULL); sizeof(eapol_key_data_5));
assert(verify_step4_called); assert(verify_step4_called);
eapol_exit(); eapol_exit();
@ -1810,17 +1810,17 @@ static void eapol_sm_test_wpa2_ptk_gtk(const void *data)
__eapol_set_tx_packet_func(verify_step2); __eapol_set_tx_packet_func(verify_step2);
__eapol_rx_packet(1, spa, aa, eapol_key_data_7, __eapol_rx_packet(1, spa, aa, eapol_key_data_7,
sizeof(eapol_key_data_7), NULL); sizeof(eapol_key_data_7));
assert(verify_step2_called); assert(verify_step2_called);
__eapol_set_tx_packet_func(verify_step4); __eapol_set_tx_packet_func(verify_step4);
__eapol_rx_packet(1, spa, aa, eapol_key_data_9, __eapol_rx_packet(1, spa, aa, eapol_key_data_9,
sizeof(eapol_key_data_9), NULL); sizeof(eapol_key_data_9));
assert(verify_step4_called); assert(verify_step4_called);
__eapol_set_tx_packet_func(verify_step2_gtk); __eapol_set_tx_packet_func(verify_step2_gtk);
__eapol_rx_packet(1, spa, aa, eapol_key_data_11, __eapol_rx_packet(1, spa, aa, eapol_key_data_11,
sizeof(eapol_key_data_11), NULL); sizeof(eapol_key_data_11));
assert(verify_gtk_step2_called); assert(verify_gtk_step2_called);
eapol_exit(); eapol_exit();
@ -1873,17 +1873,17 @@ static void eapol_sm_test_wpa_ptk_gtk(const void *data)
__eapol_set_tx_packet_func(verify_step2); __eapol_set_tx_packet_func(verify_step2);
__eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_13, __eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_13,
sizeof(eapol_key_data_13), NULL); sizeof(eapol_key_data_13));
assert(verify_step2_called); assert(verify_step2_called);
__eapol_set_tx_packet_func(verify_step4); __eapol_set_tx_packet_func(verify_step4);
__eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_15, __eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_15,
sizeof(eapol_key_data_15), NULL); sizeof(eapol_key_data_15));
assert(verify_step4_called); assert(verify_step4_called);
__eapol_set_tx_packet_func(verify_step2_gtk); __eapol_set_tx_packet_func(verify_step2_gtk);
__eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_17, __eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_17,
sizeof(eapol_key_data_17), NULL); sizeof(eapol_key_data_17));
assert(verify_gtk_step2_called); assert(verify_gtk_step2_called);
eapol_exit(); eapol_exit();
@ -1937,17 +1937,17 @@ static void eapol_sm_test_wpa_ptk_gtk_2(const void *data)
__eapol_set_tx_packet_func(verify_step2); __eapol_set_tx_packet_func(verify_step2);
__eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_19, __eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_19,
sizeof(eapol_key_data_19), NULL); sizeof(eapol_key_data_19));
assert(verify_step2_called); assert(verify_step2_called);
__eapol_set_tx_packet_func(verify_step4); __eapol_set_tx_packet_func(verify_step4);
__eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_21, __eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_21,
sizeof(eapol_key_data_21), NULL); sizeof(eapol_key_data_21));
assert(verify_step4_called); assert(verify_step4_called);
__eapol_set_tx_packet_func(verify_step2_gtk); __eapol_set_tx_packet_func(verify_step2_gtk);
__eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_23, __eapol_rx_packet(1, sta_address, ap_address, eapol_key_data_23,
sizeof(eapol_key_data_23), NULL); sizeof(eapol_key_data_23));
assert(verify_gtk_step2_called); assert(verify_gtk_step2_called);
eapol_exit(); eapol_exit();