diff --git a/src/eap-tls-common.c b/src/eap-tls-common.c index c861b008..bee77e31 100644 --- a/src/eap-tls-common.c +++ b/src/eap-tls-common.c @@ -94,6 +94,8 @@ struct eap_tls_state { struct l_tls *tunnel; + bool method_completed:1; + struct databuf *plain_buf; struct databuf *tx_pdu_buf; struct databuf *rx_pdu_buf; @@ -114,6 +116,7 @@ struct eap_tls_state { static void __eap_tls_common_state_reset(struct eap_tls_state *eap_tls) { eap_tls->version_negotiated = EAP_TLS_VERSION_NOT_NEGOTIATED; + eap_tls->method_completed = false; eap_tls->expecting_frag_ack = false; if (eap_tls->tunnel) { @@ -198,6 +201,13 @@ static void eap_tls_tunnel_ready(const char *peer_identity, void *user_data) static void eap_tls_tunnel_disconnected(enum l_tls_alert_desc reason, bool remote, void *user_data) { + struct eap_state *eap = user_data; + struct eap_tls_state *eap_tls = eap_get_data(eap); + + l_info("%s: Tunnel has disconnected with alert: %s", + eap_get_method_name(eap), l_tls_alert_to_str(reason)); + + eap_tls->method_completed = true; } static bool eap_tls_validate_version(struct eap_state *eap, @@ -481,6 +491,9 @@ void eap_tls_common_handle_request(struct eap_state *eap, struct eap_tls_state *eap_tls = eap_get_data(eap); uint8_t flags_version; + if (eap_tls->method_completed) + return; + if (len < 1) { l_error("%s: Request packet is too short.", eap_get_method_name(eap)); @@ -714,3 +727,10 @@ bool eap_tls_common_settings_load(struct eap_state *eap, return true; } + +void eap_tls_common_set_completed(struct eap_state *eap) +{ + struct eap_tls_state *eap_tls = eap_get_data(eap); + + eap_tls->method_completed = true; +} diff --git a/src/eap-tls-common.h b/src/eap-tls-common.h index eaf4f7b9..4c1f8100 100644 --- a/src/eap-tls-common.h +++ b/src/eap-tls-common.h @@ -51,6 +51,8 @@ struct eap_tls_variant_ops { void eap_tls_common_state_free(struct eap_state *eap); +void eap_tls_common_set_completed(struct eap_state *eap); + void eap_tls_common_handle_request(struct eap_state *eap, const uint8_t *pkt, size_t len);