From 590b7539bfc507b40201b2c15e82f6b553df72fd Mon Sep 17 00:00:00 2001 From: vemax78 Date: Tue, 5 Nov 2013 17:54:29 +0100 Subject: [PATCH] Cleaning AC DFA code --- src/ac/ac_dfa_configure.c | 16 +- src/ac/ac_dfa_datacheck.c | 27 +-- src/ac/ac_dfa_dtls.c | 36 +--- src/ac/ac_dfa_imagedata.c | 11 +- src/ac/ac_dfa_join.c | 35 +--- src/ac/ac_dfa_reset.c | 17 +- src/ac/ac_dfa_run.c | 29 +-- src/ac/ac_dfa_teardown.c | 4 +- src/ac/ac_session.c | 418 +++++++++----------------------------- src/ac/ac_session.h | 49 ++--- 10 files changed, 151 insertions(+), 491 deletions(-) diff --git a/src/ac/ac_dfa_configure.c b/src/ac/ac_dfa_configure.c index 5afb091..52484cd 100644 --- a/src/ac/ac_dfa_configure.c +++ b/src/ac/ac_dfa_configure.c @@ -707,10 +707,9 @@ static uint32_t ac_dfa_state_configure_create_response(struct ac_session_t* sess } /* */ -int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_packet* packet) { +void ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_packet* packet) { struct capwap_header_data capwapheader; struct capwap_packet_txmng* txmngpacket; - int status = AC_DFA_ACCEPT_PACKET; ASSERT(session != NULL); @@ -765,19 +764,10 @@ int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_pa ac_dfa_change_state(session, CAPWAP_DATA_CHECK_STATE); capwap_set_timeout(session->dfa.rfcChangeStatePendingTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); } else { - ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } else { /* Configure timeout */ - ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } - - return status; -} - -/* */ -int ac_dfa_state_configure_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); } diff --git a/src/ac/ac_dfa_datacheck.c b/src/ac/ac_dfa_datacheck.c index ea34d10..31369e3 100644 --- a/src/ac/ac_dfa_datacheck.c +++ b/src/ac/ac_dfa_datacheck.c @@ -173,10 +173,9 @@ static uint32_t ac_dfa_state_datacheck_create_response(struct ac_session_t* sess } /* */ -int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_packet* packet) { +void ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_packet* packet) { struct capwap_header_data capwapheader; struct capwap_packet_txmng* txmngpacket; - int status = AC_DFA_ACCEPT_PACKET; ASSERT(session != NULL); @@ -231,25 +230,20 @@ int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_pa ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_RUN_STATE); capwap_set_timeout(session->dfa.rfcDataCheckTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); } else { - ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } else { /* Configure timeout */ - ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } - - return status; } /* */ -int ac_dfa_state_datacheck_to_run(struct ac_session_t* session, struct capwap_parsed_packet* packet) { +void ac_dfa_state_datacheck_to_run(struct ac_session_t* session, struct capwap_parsed_packet* packet) { struct capwap_list* txfragpacket; struct capwap_header_data capwapheader; struct capwap_packet_txmng* txmngpacket; struct ac_soap_response* response; - int status = AC_DFA_ACCEPT_PACKET; ASSERT(session != NULL); @@ -303,21 +297,12 @@ int ac_dfa_state_datacheck_to_run(struct ac_session_t* session, struct capwap_pa ac_dfa_change_state(session, CAPWAP_RUN_STATE); capwap_set_timeout(AC_MAX_ECHO_INTERVAL, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); } else { - ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } } } else { /* Configure timeout */ - ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } - - return status; -} - -/* */ -int ac_dfa_state_datacheck_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); } diff --git a/src/ac/ac_dfa_dtls.c b/src/ac/ac_dfa_dtls.c index 78e7e30..d1b9823 100644 --- a/src/ac/ac_dfa_dtls.c +++ b/src/ac/ac_dfa_dtls.c @@ -14,38 +14,20 @@ int ac_bio_send(struct capwap_dtls* dtls, char* buffer, int length, void* param) } /* */ -int ac_dfa_state_dtlssetup(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int status = AC_DFA_ACCEPT_PACKET; - +int ac_dtls_setup(struct ac_session_t* session) { ASSERT(session != NULL); - ASSERT(packet == NULL); /* Create DTLS session */ if (!capwap_crypt_createsession(&session->ctrldtls, CAPWAP_DTLS_CONTROL_SESSION, &g_ac.dtlscontext, ac_bio_send, session)) { - ac_dfa_change_state(session, CAPWAP_DTLS_SETUP_TO_IDLE_STATE); /* TODO */ - status = AC_DFA_NO_PACKET; - } else { - if (capwap_crypt_open(&session->ctrldtls, &session->wtpctrladdress) == CAPWAP_HANDSHAKE_ERROR) { - ac_dfa_change_state(session, CAPWAP_DTLS_SETUP_TO_IDLE_STATE); /* TODO */ - status = AC_DFA_NO_PACKET; - } else { - ac_dfa_change_state(session, CAPWAP_DTLS_CONNECT_STATE); - } + return 0; } - - return status; -} -/* */ -int ac_dfa_state_dtlsconnect(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - ASSERT(session != NULL); - ASSERT(packet == NULL); + if (capwap_crypt_open(&session->ctrldtls, &session->wtpctrladdress) == CAPWAP_HANDSHAKE_ERROR) { + return 0; + } - ac_dfa_change_state(session, CAPWAP_DTLS_CONNECT_TO_DTLS_TEARDOWN_STATE); /* TODO */ - return AC_DFA_NO_PACKET; -} - -/* */ -int ac_dfa_state_dtlsconnect_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); + /* Wait DTLS handshake complete */ + ac_dfa_change_state(session, CAPWAP_DTLS_CONNECT_STATE); + capwap_set_timeout(session->dfa.rfcWaitDTLS, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); + return 1; } diff --git a/src/ac/ac_dfa_imagedata.c b/src/ac/ac_dfa_imagedata.c index d76ccb9..15d9bc6 100644 --- a/src/ac/ac_dfa_imagedata.c +++ b/src/ac/ac_dfa_imagedata.c @@ -4,15 +4,6 @@ #include "ac_session.h" /* */ -int ac_dfa_state_imagedata(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int status = AC_DFA_ACCEPT_PACKET; - +void ac_dfa_state_imagedata(struct ac_session_t* session, struct capwap_parsed_packet* packet) { /* TODO */ - - return status; -} - -/* */ -int ac_dfa_state_imagedata_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); } diff --git a/src/ac/ac_dfa_join.c b/src/ac/ac_dfa_join.c index 756551c..c4087d0 100644 --- a/src/ac/ac_dfa_join.c +++ b/src/ac/ac_dfa_join.c @@ -579,13 +579,12 @@ static uint32_t ac_dfa_state_join_create_response(struct ac_session_t* session, } /* */ -int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* packet) { +void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* packet) { struct ac_soap_response* response; struct capwap_header_data capwapheader; struct capwap_packet_txmng* txmngpacket; struct capwap_sessionid_element* sessionid; struct capwap_wtpboarddata_element* wtpboarddata; - int status = AC_DFA_ACCEPT_PACKET; struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE }; ASSERT(session != NULL); @@ -673,51 +672,35 @@ int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* if (CAPWAP_RESULTCODE_OK(resultcode.code)) { ac_dfa_change_state(session, CAPWAP_POSTJOIN_STATE); } else { - ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } else { /* Error to send packets */ capwap_logging_debug("Warning: error to send join response packet"); - ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } else { /* Join timeout */ - ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } - - return status; } /* */ -int ac_dfa_state_postjoin(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int status = AC_DFA_ACCEPT_PACKET; - +void ac_dfa_state_postjoin(struct ac_session_t* session, struct capwap_parsed_packet* packet) { ASSERT(session != NULL); if (packet) { if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_CONFIGURATION_STATUS_REQUEST) { ac_dfa_change_state(session, CAPWAP_CONFIGURE_STATE); - status = ac_dfa_state_configure(session, packet); + ac_dfa_state_configure(session, packet); } else if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_IMAGE_DATA_REQUEST) { ac_dfa_change_state(session, CAPWAP_IMAGE_DATA_STATE); - status = ac_dfa_state_imagedata(session, packet); + ac_dfa_state_imagedata(session, packet); } else { - ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } else { /* Join timeout */ - ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } - - return status; -} - -/* */ -int ac_dfa_state_join_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); } diff --git a/src/ac/ac_dfa_reset.c b/src/ac/ac_dfa_reset.c index 3040548..36ce8f1 100644 --- a/src/ac/ac_dfa_reset.c +++ b/src/ac/ac_dfa_reset.c @@ -4,9 +4,7 @@ #include "ac_session.h" /* */ -int ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int status = AC_DFA_ACCEPT_PACKET; - +void ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet) { ASSERT(session != NULL); if (packet) { @@ -23,8 +21,7 @@ int ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet capwap_logging_warning("Receive Reset Response with error: %d", (int)resultcode->code); } - ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } else { /* No Configuration status response received */ @@ -32,8 +29,7 @@ int ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet if (session->dfa.rfcRetransmitCount >= session->dfa.rfcMaxRetransmit) { /* Timeout reset state */ ac_free_reference_last_request(session); - ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } else { /* Retransmit configuration request */ if (!capwap_crypt_sendto_fragmentpacket(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], session->requestfragmentpacket, &session->acctrladdress, &session->wtpctrladdress)) { @@ -44,11 +40,4 @@ int ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet capwap_set_timeout(session->dfa.rfcRetransmitInterval, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); } } - - return status; -} - -/* */ -int ac_dfa_state_reset_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); } diff --git a/src/ac/ac_dfa_run.c b/src/ac/ac_dfa_run.c index 480ab06..920df64 100644 --- a/src/ac/ac_dfa_run.c +++ b/src/ac/ac_dfa_run.c @@ -97,9 +97,7 @@ static int ac_send_data_keepalive(struct ac_session_t* session, struct capwap_pa } /* */ -int ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int status = AC_DFA_ACCEPT_PACKET; - +void ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* packet) { ASSERT(session != NULL); if (packet) { @@ -122,8 +120,7 @@ int ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* if (!receive_echo_request(session, packet)) { capwap_set_timeout(AC_MAX_ECHO_INTERVAL, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); } else { - ac_dfa_change_state(session, CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } break; @@ -170,8 +167,7 @@ int ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* if (IS_FLAG_K_HEADER(packet->rxmngpacket->header)) { if (!memcmp(capwap_get_message_element_data(packet, CAPWAP_ELEMENT_SESSIONID), &session->sessionid, sizeof(struct capwap_sessionid_element))) { if (ac_send_data_keepalive(session, packet)) { - ac_dfa_change_state(session, CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } } } else { @@ -179,21 +175,16 @@ int ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* } } } else { - ac_dfa_change_state(session, CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE); - status = AC_DFA_NO_PACKET; + ac_session_teardown(session); } - - return status; } /* */ -int ac_dfa_state_run_to_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int status = AC_DFA_NO_PACKET; +void ac_session_reset(struct ac_session_t* session) { struct capwap_header_data capwapheader; struct capwap_packet_txmng* txmngpacket; ASSERT(session != NULL); - ASSERT(packet == NULL); /* Build packet */ capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, session->binding); @@ -219,17 +210,9 @@ int ac_dfa_state_run_to_reset(struct ac_session_t* session, struct capwap_parsed capwap_killall_timeout(&session->timeout); capwap_set_timeout(session->dfa.rfcRetransmitInterval, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); ac_dfa_change_state(session, CAPWAP_RESET_STATE); - status = AC_DFA_ACCEPT_PACKET; } else { capwap_logging_debug("Warning: error to send reset request packet"); ac_free_reference_last_request(session); - ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE); + ac_session_teardown(session); } - - return status; -} - -/* */ -int ac_dfa_state_run_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - return ac_session_teardown_connection(session); } diff --git a/src/ac/ac_dfa_teardown.c b/src/ac/ac_dfa_teardown.c index f8a3182..5e5e2dc 100644 --- a/src/ac/ac_dfa_teardown.c +++ b/src/ac/ac_dfa_teardown.c @@ -4,9 +4,8 @@ #include "ac_session.h" /* */ -int ac_dfa_state_teardown(struct ac_session_t* session, struct capwap_parsed_packet* packet) { +void ac_dfa_state_teardown(struct ac_session_t* session) { ASSERT(session != NULL); - ASSERT(packet == NULL); // Notify teardown session if (session->wtpid) { @@ -18,5 +17,4 @@ int ac_dfa_state_teardown(struct ac_session_t* session, struct capwap_parsed_pac /* Defered free resource */ ac_dfa_change_state(session, CAPWAP_DEAD_STATE); - return AC_DFA_DROP_PACKET; } diff --git a/src/ac/ac_session.c b/src/ac/ac_session.c index e139672..ba21ad7 100644 --- a/src/ac/ac_session.c +++ b/src/ac/ac_session.c @@ -14,6 +14,7 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses switch (action->action) { case AC_SESSION_ACTION_RESET_WTP: { + ac_session_reset(session); break; } } @@ -119,272 +120,61 @@ static int ac_network_read(struct ac_session_t* session, void* buffer, int lengt } /* */ -static int ac_dfa_execute(struct ac_session_t* session, struct capwap_parsed_packet* packet) { - int action = AC_DFA_ACCEPT_PACKET; - +static void ac_dfa_execute(struct ac_session_t* session, struct capwap_parsed_packet* packet) { ASSERT(session != NULL); /* Execute state */ switch (session->state) { - case CAPWAP_START_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_START_TO_IDLE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_IDLE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_IDLE_TO_DISCOVERY_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_IDLE_TO_DTLS_SETUP_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DISCOVERY_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DISCOVERY_TO_IDLE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DISCOVERY_TO_SULKING_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DISCOVERY_TO_DTLS_SETUP_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_SULKING_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_SULKING_TO_IDLE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DTLS_SETUP_STATE: { - action = ac_dfa_state_dtlssetup(session, packet); - break; - } - - case CAPWAP_DTLS_SETUP_TO_IDLE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DTLS_SETUP_TO_SULKING_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DTLS_SETUP_TO_AUTHORIZE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_AUTHORIZE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_AUTHORIZE_TO_DTLS_SETUP_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_AUTHORIZE_TO_DTLS_CONNECT_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_AUTHORIZE_TO_DTLS_TEARDOWN_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - case CAPWAP_DTLS_CONNECT_STATE: { - action = ac_dfa_state_dtlsconnect(session, packet); - break; - } - - case CAPWAP_DTLS_CONNECT_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_dtlsconnect_to_dtlsteardown(session, packet); - break; - } - - case CAPWAP_DTLS_CONNECT_TO_JOIN_STATE: { - /* Never called with this state */ - ASSERT(0); + ac_session_teardown(session); break; } - case CAPWAP_DTLS_TEARDOWN_TO_IDLE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DTLS_TEARDOWN_TO_SULKING_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_DTLS_TEARDOWN_TO_DEAD_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - case CAPWAP_JOIN_STATE: { - action = ac_dfa_state_join(session, packet); + ac_dfa_state_join(session, packet); break; } case CAPWAP_POSTJOIN_STATE: { - action = ac_dfa_state_postjoin(session, packet); + ac_dfa_state_postjoin(session, packet); break; } - - case CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_join_to_dtlsteardown(session, packet); - break; - } - - case CAPWAP_JOIN_TO_IMAGE_DATA_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_JOIN_TO_CONFIGURE_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - + case CAPWAP_IMAGE_DATA_STATE: { - action = ac_dfa_state_imagedata(session, packet); + ac_dfa_state_imagedata(session, packet); break; } - - case CAPWAP_IMAGE_DATA_TO_RESET_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_IMAGE_DATA_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_imagedata_to_dtlsteardown(session, packet); - break; - } - + case CAPWAP_CONFIGURE_STATE: { - action = ac_dfa_state_configure(session, packet); + ac_dfa_state_configure(session, packet); break; } - - case CAPWAP_CONFIGURE_TO_RESET_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - - case CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_configure_to_dtlsteardown(session, packet); - break; - } - - case CAPWAP_CONFIGURE_TO_DATA_CHECK_STATE: { - /* Never called with this state */ - ASSERT(0); - break; - } - + case CAPWAP_RESET_STATE: { - action = ac_dfa_state_reset(session, packet); + ac_dfa_state_reset(session, packet); break; } - - case CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_reset_to_dtlsteardown(session, packet); - break; - } - + case CAPWAP_DATA_CHECK_STATE: { - action = ac_dfa_state_datacheck(session, packet); + ac_dfa_state_datacheck(session, packet); break; } - - case CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_datacheck_to_dtlsteardown(session, packet); - break; - } - + case CAPWAP_DATA_CHECK_TO_RUN_STATE: { - action = ac_dfa_state_datacheck_to_run(session, packet); + ac_dfa_state_datacheck_to_run(session, packet); break; } - + case CAPWAP_RUN_STATE: { - action = ac_dfa_state_run(session, packet); - break; - } - - case CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE: { - action = ac_dfa_state_run_to_dtlsteardown(session, packet); - break; - } - - case CAPWAP_RUN_TO_RESET_STATE: { - action = ac_dfa_state_run_to_reset(session, packet); + ac_dfa_state_run(session, packet); break; } default: { capwap_logging_debug("Unknown action event: %lu", session->state); break; - } + } } - - return action; } /* */ @@ -541,15 +331,14 @@ static void ac_session_run(struct ac_session_t* session) { int isctrlsocket; struct capwap_connection connection; char buffer[CAPWAP_MAX_PACKET_SIZE]; - int action = AC_DFA_ACCEPT_PACKET; ASSERT(session != NULL); /* Configure DFA */ if (g_ac.enabledtls) { - action = AC_DFA_NO_PACKET; - ac_dfa_change_state(session, CAPWAP_DTLS_SETUP_STATE); - capwap_set_timeout(session->dfa.rfcWaitDTLS, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); + if (!ac_dtls_setup(session)) { + ac_session_teardown(session); /* Teardown connection */ + } } else { /* Wait Join request */ ac_dfa_change_state(session, CAPWAP_JOIN_STATE); @@ -558,106 +347,102 @@ static void ac_session_run(struct ac_session_t* session) { while (session->state != CAPWAP_DTLS_TEARDOWN_STATE) { /* Get packet */ - if ((action == AC_DFA_ACCEPT_PACKET) || (action == AC_DFA_DROP_PACKET)) { - length = ac_network_read(session, buffer, sizeof(buffer), &isctrlsocket, &session->timeout); - if (length < 0) { - if (length == PACKET_TIMEOUT) { - action = ac_dfa_execute(session, NULL); /* Timeout */ - } else if (length == DTLS_SHUTDOWN) { - ac_session_teardown_connection(session); - } else if (length == ACTION_SESSION) { - /* Nothing */ - } - } else if (length > 0) { - /* Accept data packet only in running state */ - if (isctrlsocket || (session->state == CAPWAP_DATA_CHECK_TO_RUN_STATE) || (session->state == CAPWAP_RUN_STATE)) { - /* Check generic capwap packet */ - check = capwap_sanity_check(isctrlsocket, CAPWAP_UNDEF_STATE, buffer, length, 0, 0); - if (check == CAPWAP_PLAIN_PACKET) { - struct capwap_parsed_packet packet; - struct capwap_packet_rxmng* rxmngpacket; + length = ac_network_read(session, buffer, sizeof(buffer), &isctrlsocket, &session->timeout); + if (length < 0) { + if (length == PACKET_TIMEOUT) { + ac_dfa_execute(session, NULL); + } else if (length == DTLS_SHUTDOWN) { + ac_session_teardown(session); + } else if (length == ACTION_SESSION) { + /* Nothing */ + } + } else if (length > 0) { + /* Accept data packet only in running state */ + if (isctrlsocket || (session->state == CAPWAP_DATA_CHECK_TO_RUN_STATE) || (session->state == CAPWAP_RUN_STATE)) { + /* Check generic capwap packet */ + check = capwap_sanity_check(isctrlsocket, CAPWAP_UNDEF_STATE, buffer, length, 0, 0); + if (check == CAPWAP_PLAIN_PACKET) { + struct capwap_parsed_packet packet; + struct capwap_packet_rxmng* rxmngpacket; - /* Defragment management */ - rxmngpacket = ac_get_packet_rxmng(session, isctrlsocket); + /* Defragment management */ + rxmngpacket = ac_get_packet_rxmng(session, isctrlsocket); - /* If request, defragmentation packet */ - check = capwap_packet_rxmng_add_recv_packet(rxmngpacket, buffer, length); - if (check == CAPWAP_RECEIVE_COMPLETE_PACKET) { - int ignorepacket = 0; + /* If request, defragmentation packet */ + check = capwap_packet_rxmng_add_recv_packet(rxmngpacket, buffer, length); + if (check == CAPWAP_RECEIVE_COMPLETE_PACKET) { + int ignorepacket = 0; - /* Receive all fragment */ - memcpy(&connection.socket, (isctrlsocket ? &session->ctrlsocket : &session->datasocket), sizeof(struct capwap_socket)); - memcpy(&connection.localaddr, (isctrlsocket ? &session->acctrladdress : &session->acdataaddress), sizeof(struct sockaddr_storage)); - memcpy(&connection.remoteaddr, (isctrlsocket ? &session->wtpctrladdress : &session->wtpdataaddress), sizeof(struct sockaddr_storage)); + /* Receive all fragment */ + memcpy(&connection.socket, (isctrlsocket ? &session->ctrlsocket : &session->datasocket), sizeof(struct capwap_socket)); + memcpy(&connection.localaddr, (isctrlsocket ? &session->acctrladdress : &session->acdataaddress), sizeof(struct sockaddr_storage)); + memcpy(&connection.remoteaddr, (isctrlsocket ? &session->wtpctrladdress : &session->wtpdataaddress), sizeof(struct sockaddr_storage)); - if (isctrlsocket) { - if (!capwap_recv_retrasmitted_request(&session->ctrldtls, rxmngpacket, &connection, session->lastrecvpackethash, session->responsefragmentpacket)) { - /* Check message type */ - res = capwap_check_message_type(rxmngpacket); - if (res != VALID_MESSAGE_TYPE) { - if (res == INVALID_REQUEST_MESSAGE_TYPE) { - capwap_logging_warning("Unexpected Unrecognized Request, send Response Packet with error"); - ac_send_invalid_request(session, rxmngpacket, &connection, CAPWAP_RESULTCODE_MSG_UNEXPECTED_UNRECOGNIZED_REQUEST); - } - - ignorepacket = 1; - capwap_logging_debug("Invalid message type"); + if (isctrlsocket) { + if (!capwap_recv_retrasmitted_request(&session->ctrldtls, rxmngpacket, &connection, session->lastrecvpackethash, session->responsefragmentpacket)) { + /* Check message type */ + res = capwap_check_message_type(rxmngpacket); + if (res != VALID_MESSAGE_TYPE) { + if (res == INVALID_REQUEST_MESSAGE_TYPE) { + capwap_logging_warning("Unexpected Unrecognized Request, send Response Packet with error"); + ac_send_invalid_request(session, rxmngpacket, &connection, CAPWAP_RESULTCODE_MSG_UNEXPECTED_UNRECOGNIZED_REQUEST); } - } else { + ignorepacket = 1; - capwap_logging_debug("Retrasmitted packet"); + capwap_logging_debug("Invalid message type"); } + } else { + ignorepacket = 1; + capwap_logging_debug("Retrasmitted packet"); } - - /* Parsing packet */ - if (!ignorepacket) { - res = capwap_parsing_packet(rxmngpacket, &connection, &packet); - if (res == PARSING_COMPLETE) { - /* Validate packet */ - if (capwap_validate_parsed_packet(&packet, NULL)) { - if (isctrlsocket && capwap_is_request_type(rxmngpacket->ctrlmsg.type)) { - capwap_logging_warning("Missing Mandatory Message Element, send Response Packet with error"); - ac_send_invalid_request(session, rxmngpacket, &connection, CAPWAP_RESULTCODE_FAILURE_MISSING_MANDATORY_MSG_ELEMENT); - } - - ignorepacket = 1; - capwap_logging_debug("Failed validation parsed packet"); - } - } else { - if (isctrlsocket && (res == UNRECOGNIZED_MESSAGE_ELEMENT) && capwap_is_request_type(rxmngpacket->ctrlmsg.type)) { - capwap_logging_warning("Unrecognized Message Element, send Response Packet with error"); - ac_send_invalid_request(session, rxmngpacket, &connection, CAPWAP_RESULTCODE_FAILURE_UNRECOGNIZED_MESSAGE_ELEMENT); - /* TODO: add the unrecognized message element */ - } - - ignorepacket = 1; - capwap_logging_debug("Failed parsing packet"); - } - } - - /* */ - if (!ignorepacket && (action == AC_DFA_ACCEPT_PACKET)) { - action = ac_dfa_execute(session, &packet); - } - - /* Free memory */ - capwap_free_parsed_packet(&packet); - ac_free_packet_rxmng(session, isctrlsocket); - } else if (check != CAPWAP_REQUEST_MORE_FRAGMENT) { - /* Discard fragments */ - ac_free_packet_rxmng(session, isctrlsocket); } + + /* Parsing packet */ + if (!ignorepacket) { + res = capwap_parsing_packet(rxmngpacket, &connection, &packet); + if (res == PARSING_COMPLETE) { + /* Validate packet */ + if (capwap_validate_parsed_packet(&packet, NULL)) { + if (isctrlsocket && capwap_is_request_type(rxmngpacket->ctrlmsg.type)) { + capwap_logging_warning("Missing Mandatory Message Element, send Response Packet with error"); + ac_send_invalid_request(session, rxmngpacket, &connection, CAPWAP_RESULTCODE_FAILURE_MISSING_MANDATORY_MSG_ELEMENT); + } + + ignorepacket = 1; + capwap_logging_debug("Failed validation parsed packet"); + } + } else { + if (isctrlsocket && (res == UNRECOGNIZED_MESSAGE_ELEMENT) && capwap_is_request_type(rxmngpacket->ctrlmsg.type)) { + capwap_logging_warning("Unrecognized Message Element, send Response Packet with error"); + ac_send_invalid_request(session, rxmngpacket, &connection, CAPWAP_RESULTCODE_FAILURE_UNRECOGNIZED_MESSAGE_ELEMENT); + /* TODO: add the unrecognized message element */ + } + + ignorepacket = 1; + capwap_logging_debug("Failed parsing packet"); + } + } + + /* */ + if (!ignorepacket) { + ac_dfa_execute(session, &packet); + } + + /* Free memory */ + capwap_free_parsed_packet(&packet); + ac_free_packet_rxmng(session, isctrlsocket); + } else if (check != CAPWAP_REQUEST_MORE_FRAGMENT) { + /* Discard fragments */ + ac_free_packet_rxmng(session, isctrlsocket); } } } - } else { - action = ac_dfa_execute(session, NULL); } } /* Wait teardown timeout before kill session */ capwap_wait_timeout(&session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); - ac_dfa_state_teardown(session, NULL); + ac_dfa_state_teardown(session); /* Release reference session */ ac_session_destroy(session); @@ -679,7 +464,7 @@ void ac_dfa_change_state(struct ac_session_t* session, int state) { } /* Teardown connection */ -int ac_session_teardown_connection(struct ac_session_t* session) { +void ac_session_teardown(struct ac_session_t* session) { ASSERT(session != NULL); /* Remove session from list */ @@ -706,7 +491,6 @@ int ac_session_teardown_connection(struct ac_session_t* session) { capwap_killall_timeout(&session->timeout); capwap_set_timeout(session->dfa.rfcDTLSSessionDelete, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); ac_dfa_change_state(session, CAPWAP_DTLS_TEARDOWN_STATE); - return AC_DFA_DROP_PACKET; } /* */ diff --git a/src/ac/ac_session.h b/src/ac/ac_session.h index 610ac7e..2c83a7a 100644 --- a/src/ac/ac_session.h +++ b/src/ac/ac_session.h @@ -6,11 +6,6 @@ #include "capwap_lock.h" #include "ac_soap.h" -#define AC_DFA_NO_PACKET 0 -#define AC_DFA_ACCEPT_PACKET 1 -#define AC_DFA_DROP_PACKET 2 -#define AC_DFA_DEAD 3 - /* AC packet */ struct ac_packet { int plainbuffer; @@ -100,7 +95,8 @@ struct ac_session_t* ac_search_session_from_wtpid(const char* wtpid); char* ac_get_printable_wtpid(struct capwap_wtpboarddata_element* wtpboarddata); /* */ -int ac_session_teardown_connection(struct ac_session_t* session); +void ac_session_reset(struct ac_session_t* session); +void ac_session_teardown(struct ac_session_t* session); void ac_session_close(struct ac_session_t* session); void ac_session_release_reference(struct ac_session_t* session); @@ -119,41 +115,20 @@ int ac_session_msgqueue_init(void); void ac_session_msgqueue_free(void); void ac_session_msgqueue_notify_closethread(pthread_t threadid); -/* */ -int ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_postjoin(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_join_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); - /* */ int ac_bio_send(struct capwap_dtls* dtls, char* buffer, int length, void* param); -int ac_dfa_state_dtlssetup(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_dtlsconnect(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_dtlsconnect_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); +int ac_dtls_setup(struct ac_session_t* session); /* */ -int ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_configure_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); - -/* */ -int ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_datacheck_to_run(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_datacheck_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); - -/* */ -int ac_dfa_state_imagedata(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_imagedata_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); - -/* */ -int ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_run_to_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_run_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); - -/* */ -int ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet); -int ac_dfa_state_reset_to_dtlsteardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); - -/* */ -int ac_dfa_state_teardown(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_join(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_postjoin(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_configure(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_datacheck(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_datacheck_to_run(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_imagedata(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet); +void ac_dfa_state_teardown(struct ac_session_t* session); /* Soap function */ struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* session, char* method, int numparam, ...);