From 49bf2dc5c94ac5e8f8bc8258ce41372114de7cbd Mon Sep 17 00:00:00 2001 From: vemax78 Date: Wed, 5 Jun 2013 19:39:03 +0200 Subject: [PATCH] Improved the WTP application to exit --- src/common/capwap.c | 11 +++++++++++ src/common/capwap.h | 1 + src/wtp/wtp_dfa.c | 27 ++++++++++----------------- src/wtp/wtp_dfa.h | 2 ++ src/wtp/wtp_dfa_dtls.c | 8 ++++++-- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/common/capwap.c b/src/common/capwap.c index 53dd90b..c5b20c7 100644 --- a/src/common/capwap.c +++ b/src/common/capwap.c @@ -59,6 +59,17 @@ long capwap_get_timeout(struct timeout_control* timeout, long* index) { return delta; } +void capwap_wait_timeout(struct timeout_control* timeout, unsigned long index) { + ASSERT(timeout != NULL); + ASSERT(index < CAPWAP_MAX_TIMER); + + if (timeout->items[index].enable) { + for (capwap_update_timeout(timeout); timeout->items[index].delta > 0; capwap_update_timeout(timeout)) { + usleep((useconds_t)timeout->items[index].delta * 1000); + } + } +} + int capwap_is_enable_timeout(struct timeout_control* timeout, unsigned long index) { ASSERT(timeout != NULL); ASSERT(index < CAPWAP_MAX_TIMER); diff --git a/src/common/capwap.h b/src/common/capwap.h index 6b9f1e7..ede3185 100644 --- a/src/common/capwap.h +++ b/src/common/capwap.h @@ -87,6 +87,7 @@ long capwap_get_timeout(struct timeout_control* timeout, long* index); void capwap_update_timeout(struct timeout_control* timeout); void capwap_set_timeout(unsigned long value, struct timeout_control* timeout, unsigned long index); void capwap_kill_timeout(struct timeout_control* timeout, unsigned long index); +void capwap_wait_timeout(struct timeout_control* timeout, unsigned long index); void capwap_killall_timeout(struct timeout_control* timeout); int capwap_is_enable_timeout(struct timeout_control* timeout, unsigned long index); int capwap_is_timeout(struct timeout_control* timeout, unsigned long index); diff --git a/src/wtp/wtp_dfa.c b/src/wtp/wtp_dfa.c index e217b38..1c2cadd 100644 --- a/src/wtp/wtp_dfa.c +++ b/src/wtp/wtp_dfa.c @@ -35,7 +35,7 @@ static struct capwap_packet_rxmng* wtp_get_packet_rxmng(int isctrlmsg) { } /* */ -static void wtp_free_packet_rxmng(int isctrlmsg) { +void wtp_free_packet_rxmng(int isctrlmsg) { if (isctrlmsg && g_wtp.rxmngctrlpacket) { capwap_packet_rxmng_free(g_wtp.rxmngctrlpacket); g_wtp.rxmngctrlpacket = NULL; @@ -370,7 +370,7 @@ int wtp_dfa_running(void) { signal(SIGINT, wtp_signal_handler); signal(SIGTERM, wtp_signal_handler); - for (;;) { + while (action != WTP_DFA_EXIT) { /* If request wait packet from AC */ isrecvpacket = 0; if ((action == WTP_DFA_ACCEPT_PACKET) || (action == WTP_DFA_DROP_PACKET)) { @@ -378,7 +378,14 @@ int wtp_dfa_running(void) { buffersize = CAPWAP_MAX_PACKET_SIZE; index = capwap_recvfrom(fds, fdscount, buffer, &buffersize, &recvfromaddr, &recvtoaddr, &timeout); if (!g_wtp.running) { - break; + capwap_logging_debug("Closing WTP, Teardown connection"); + + /* Manual teardown */ + index = CAPWAP_RECV_ERROR_TIMEOUT; + wtp_teardown_connection(&timeout); + + /* Wait RFC teardown timeout */ + capwap_wait_timeout(&timeout, CAPWAP_TIMER_CONTROL_CONNECTION); } if (index >= 0) { @@ -547,21 +554,7 @@ int wtp_dfa_running(void) { } } - /* Free DTSL Control */ - if (g_wtp.ctrldtls.enable) { - capwap_crypt_close(&g_wtp.ctrldtls); - capwap_crypt_freesession(&g_wtp.ctrldtls); - } - - /* Free DTLS Data */ - if (g_wtp.datadtls.enable) { - capwap_crypt_close(&g_wtp.datadtls); - capwap_crypt_freesession(&g_wtp.datadtls); - } - /* Free memory */ - wtp_free_packet_rxmng(0); - wtp_free_packet_rxmng(1); capwap_free(fds); return result; diff --git a/src/wtp/wtp_dfa.h b/src/wtp/wtp_dfa.h index 201e78d..6094f64 100644 --- a/src/wtp/wtp_dfa.h +++ b/src/wtp/wtp_dfa.h @@ -10,6 +10,7 @@ #define WTP_DFA_NO_PACKET 1 #define WTP_DFA_ACCEPT_PACKET 2 #define WTP_DFA_DROP_PACKET 3 +#define WTP_DFA_EXIT 4 /* */ /* TODO da rifare */ struct wtp_discovery_response { @@ -26,6 +27,7 @@ int wtp_bio_send(struct capwap_dtls* dtls, char* buffer, int length, void* param int wtp_teardown_connection(struct timeout_control* timeout); /* */ +void wtp_free_packet_rxmng(int isctrlmsg); void wtp_free_reference_last_request(void); void wtp_free_reference_last_response(void); diff --git a/src/wtp/wtp_dfa_dtls.c b/src/wtp/wtp_dfa_dtls.c index 408f97d..9070fde 100644 --- a/src/wtp/wtp_dfa_dtls.c +++ b/src/wtp/wtp_dfa_dtls.c @@ -90,9 +90,13 @@ int wtp_dfa_state_dtlsteardown(struct capwap_parsed_packet* packet, struct timeo /* */ wtp_free_reference_last_request(); wtp_free_reference_last_response(); + wtp_free_packet_rxmng(0); + wtp_free_packet_rxmng(1); - /* */ - if ((g_wtp.dfa.rfcFailedDTLSSessionCount >= g_wtp.dfa.rfcMaxFailedDTLSSessionRetry) || (g_wtp.dfa.rfcFailedDTLSAuthFailCount >= g_wtp.dfa.rfcMaxFailedDTLSSessionRetry)) { + /* */ + if (!g_wtp.running) { + return WTP_DFA_EXIT; + } else if ((g_wtp.dfa.rfcFailedDTLSSessionCount >= g_wtp.dfa.rfcMaxFailedDTLSSessionRetry) || (g_wtp.dfa.rfcFailedDTLSAuthFailCount >= g_wtp.dfa.rfcMaxFailedDTLSSessionRetry)) { wtp_dfa_change_state(CAPWAP_DTLS_TEARDOWN_TO_SULKING_STATE); } else { wtp_dfa_change_state(CAPWAP_DTLS_TEARDOWN_TO_IDLE_STATE);