Cleaning AC DFA code

This commit is contained in:
vemax78 2013-11-05 17:54:29 +01:00
parent 4cbff2eead
commit 590b7539bf
10 changed files with 151 additions and 491 deletions

View File

@ -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_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket; struct capwap_packet_txmng* txmngpacket;
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); 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); ac_dfa_change_state(session, CAPWAP_DATA_CHECK_STATE);
capwap_set_timeout(session->dfa.rfcChangeStatePendingTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_set_timeout(session->dfa.rfcChangeStatePendingTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
} else { } else {
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} else { } else {
/* Configure timeout */ /* Configure timeout */
ac_dfa_change_state(session, CAPWAP_CONFIGURE_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
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);
} }

View File

@ -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_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket; struct capwap_packet_txmng* txmngpacket;
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); 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); ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_RUN_STATE);
capwap_set_timeout(session->dfa.rfcDataCheckTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_set_timeout(session->dfa.rfcDataCheckTimer, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
} else { } else {
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} else { } else {
/* Configure timeout */ /* Configure timeout */
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
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_list* txfragpacket;
struct capwap_header_data capwapheader; struct capwap_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket; struct capwap_packet_txmng* txmngpacket;
struct ac_soap_response* response; struct ac_soap_response* response;
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); 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); ac_dfa_change_state(session, CAPWAP_RUN_STATE);
capwap_set_timeout(AC_MAX_ECHO_INTERVAL, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_set_timeout(AC_MAX_ECHO_INTERVAL, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
} else { } else {
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} }
} }
} else { } else {
/* Configure timeout */ /* Configure timeout */
ac_dfa_change_state(session, CAPWAP_DATA_CHECK_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
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);
} }

View File

@ -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 ac_dtls_setup(struct ac_session_t* session) {
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); ASSERT(session != NULL);
ASSERT(packet == NULL);
/* Create DTLS session */ /* Create DTLS session */
if (!capwap_crypt_createsession(&session->ctrldtls, CAPWAP_DTLS_CONTROL_SESSION, &g_ac.dtlscontext, ac_bio_send, 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 */ return 0;
status = AC_DFA_NO_PACKET; }
} else {
if (capwap_crypt_open(&session->ctrldtls, &session->wtpctrladdress) == CAPWAP_HANDSHAKE_ERROR) { if (capwap_crypt_open(&session->ctrldtls, &session->wtpctrladdress) == CAPWAP_HANDSHAKE_ERROR) {
ac_dfa_change_state(session, CAPWAP_DTLS_SETUP_TO_IDLE_STATE); /* TODO */ return 0;
status = AC_DFA_NO_PACKET; }
} else {
/* Wait DTLS handshake complete */
ac_dfa_change_state(session, CAPWAP_DTLS_CONNECT_STATE); ac_dfa_change_state(session, CAPWAP_DTLS_CONNECT_STATE);
} capwap_set_timeout(session->dfa.rfcWaitDTLS, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
} return 1;
return status;
}
/* */
int ac_dfa_state_dtlsconnect(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
ASSERT(session != NULL);
ASSERT(packet == NULL);
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);
} }

View File

@ -4,15 +4,6 @@
#include "ac_session.h" #include "ac_session.h"
/* */ /* */
int ac_dfa_state_imagedata(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) {
int status = AC_DFA_ACCEPT_PACKET;
/* TODO */ /* 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);
} }

View File

@ -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 ac_soap_response* response;
struct capwap_header_data capwapheader; struct capwap_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket; struct capwap_packet_txmng* txmngpacket;
struct capwap_sessionid_element* sessionid; struct capwap_sessionid_element* sessionid;
struct capwap_wtpboarddata_element* wtpboarddata; struct capwap_wtpboarddata_element* wtpboarddata;
int status = AC_DFA_ACCEPT_PACKET;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE }; struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE };
ASSERT(session != NULL); 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)) { if (CAPWAP_RESULTCODE_OK(resultcode.code)) {
ac_dfa_change_state(session, CAPWAP_POSTJOIN_STATE); ac_dfa_change_state(session, CAPWAP_POSTJOIN_STATE);
} else { } else {
ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} else { } else {
/* Error to send packets */ /* Error to send packets */
capwap_logging_debug("Warning: error to send join response packet"); capwap_logging_debug("Warning: error to send join response packet");
ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} else { } else {
/* Join timeout */ /* Join timeout */
ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
return status;
} }
/* */ /* */
int ac_dfa_state_postjoin(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) {
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); ASSERT(session != NULL);
if (packet) { if (packet) {
if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_CONFIGURATION_STATUS_REQUEST) { if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_CONFIGURATION_STATUS_REQUEST) {
ac_dfa_change_state(session, CAPWAP_CONFIGURE_STATE); 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) { } else if (packet->rxmngpacket->ctrlmsg.type == CAPWAP_IMAGE_DATA_REQUEST) {
ac_dfa_change_state(session, CAPWAP_IMAGE_DATA_STATE); ac_dfa_change_state(session, CAPWAP_IMAGE_DATA_STATE);
status = ac_dfa_state_imagedata(session, packet); ac_dfa_state_imagedata(session, packet);
} else { } else {
ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} else { } else {
/* Join timeout */ /* Join timeout */
ac_dfa_change_state(session, CAPWAP_JOIN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
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);
} }

View File

@ -4,9 +4,7 @@
#include "ac_session.h" #include "ac_session.h"
/* */ /* */
int ac_dfa_state_reset(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) {
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); ASSERT(session != NULL);
if (packet) { 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); capwap_logging_warning("Receive Reset Response with error: %d", (int)resultcode->code);
} }
ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} else { } else {
/* No Configuration status response received */ /* 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) { if (session->dfa.rfcRetransmitCount >= session->dfa.rfcMaxRetransmit) {
/* Timeout reset state */ /* Timeout reset state */
ac_free_reference_last_request(session); ac_free_reference_last_request(session);
ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} else { } else {
/* Retransmit configuration request */ /* Retransmit configuration request */
if (!capwap_crypt_sendto_fragmentpacket(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], session->requestfragmentpacket, &session->acctrladdress, &session->wtpctrladdress)) { 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); 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);
} }

View File

@ -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) { void ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
int status = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); ASSERT(session != NULL);
if (packet) { 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)) { if (!receive_echo_request(session, packet)) {
capwap_set_timeout(AC_MAX_ECHO_INTERVAL, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_set_timeout(AC_MAX_ECHO_INTERVAL, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
} else { } else {
ac_dfa_change_state(session, CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
break; 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 (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 (!memcmp(capwap_get_message_element_data(packet, CAPWAP_ELEMENT_SESSIONID), &session->sessionid, sizeof(struct capwap_sessionid_element))) {
if (ac_send_data_keepalive(session, packet)) { if (ac_send_data_keepalive(session, packet)) {
ac_dfa_change_state(session, CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
} }
} else { } else {
@ -179,21 +175,16 @@ int ac_dfa_state_run(struct ac_session_t* session, struct capwap_parsed_packet*
} }
} }
} else { } else {
ac_dfa_change_state(session, CAPWAP_RUN_TO_DTLS_TEARDOWN_STATE); ac_session_teardown(session);
status = AC_DFA_NO_PACKET;
} }
return status;
} }
/* */ /* */
int ac_dfa_state_run_to_reset(struct ac_session_t* session, struct capwap_parsed_packet* packet) { void ac_session_reset(struct ac_session_t* session) {
int status = AC_DFA_NO_PACKET;
struct capwap_header_data capwapheader; struct capwap_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket; struct capwap_packet_txmng* txmngpacket;
ASSERT(session != NULL); ASSERT(session != NULL);
ASSERT(packet == NULL);
/* Build packet */ /* Build packet */
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, session->binding); 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_killall_timeout(&session->timeout);
capwap_set_timeout(session->dfa.rfcRetransmitInterval, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_set_timeout(session->dfa.rfcRetransmitInterval, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
ac_dfa_change_state(session, CAPWAP_RESET_STATE); ac_dfa_change_state(session, CAPWAP_RESET_STATE);
status = AC_DFA_ACCEPT_PACKET;
} else { } else {
capwap_logging_debug("Warning: error to send reset request packet"); capwap_logging_debug("Warning: error to send reset request packet");
ac_free_reference_last_request(session); 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);
} }

View File

@ -4,9 +4,8 @@
#include "ac_session.h" #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(session != NULL);
ASSERT(packet == NULL);
// Notify teardown session // Notify teardown session
if (session->wtpid) { if (session->wtpid) {
@ -18,5 +17,4 @@ int ac_dfa_state_teardown(struct ac_session_t* session, struct capwap_parsed_pac
/* Defered free resource */ /* Defered free resource */
ac_dfa_change_state(session, CAPWAP_DEAD_STATE); ac_dfa_change_state(session, CAPWAP_DEAD_STATE);
return AC_DFA_DROP_PACKET;
} }

View File

@ -14,6 +14,7 @@ static int ac_session_action_execute(struct ac_session_t* session, struct ac_ses
switch (action->action) { switch (action->action) {
case AC_SESSION_ACTION_RESET_WTP: { case AC_SESSION_ACTION_RESET_WTP: {
ac_session_reset(session);
break; break;
} }
} }
@ -119,262 +120,53 @@ 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) { static void ac_dfa_execute(struct ac_session_t* session, struct capwap_parsed_packet* packet) {
int action = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); ASSERT(session != NULL);
/* Execute state */ /* Execute state */
switch (session->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: { case CAPWAP_DTLS_CONNECT_STATE: {
action = ac_dfa_state_dtlsconnect(session, packet); ac_session_teardown(session);
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);
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; break;
} }
case CAPWAP_JOIN_STATE: { case CAPWAP_JOIN_STATE: {
action = ac_dfa_state_join(session, packet); ac_dfa_state_join(session, packet);
break; break;
} }
case CAPWAP_POSTJOIN_STATE: { 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; break;
} }
case CAPWAP_IMAGE_DATA_STATE: { 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; break;
} }
case CAPWAP_CONFIGURE_STATE: { 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; break;
} }
case CAPWAP_RESET_STATE: { 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; break;
} }
case CAPWAP_DATA_CHECK_STATE: { 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; break;
} }
case CAPWAP_DATA_CHECK_TO_RUN_STATE: { 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; break;
} }
case CAPWAP_RUN_STATE: { case CAPWAP_RUN_STATE: {
action = ac_dfa_state_run(session, packet); 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);
break; break;
} }
@ -383,8 +175,6 @@ static int ac_dfa_execute(struct ac_session_t* session, struct capwap_parsed_pac
break; break;
} }
} }
return action;
} }
/* */ /* */
@ -541,15 +331,14 @@ static void ac_session_run(struct ac_session_t* session) {
int isctrlsocket; int isctrlsocket;
struct capwap_connection connection; struct capwap_connection connection;
char buffer[CAPWAP_MAX_PACKET_SIZE]; char buffer[CAPWAP_MAX_PACKET_SIZE];
int action = AC_DFA_ACCEPT_PACKET;
ASSERT(session != NULL); ASSERT(session != NULL);
/* Configure DFA */ /* Configure DFA */
if (g_ac.enabledtls) { if (g_ac.enabledtls) {
action = AC_DFA_NO_PACKET; if (!ac_dtls_setup(session)) {
ac_dfa_change_state(session, CAPWAP_DTLS_SETUP_STATE); ac_session_teardown(session); /* Teardown connection */
capwap_set_timeout(session->dfa.rfcWaitDTLS, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); }
} else { } else {
/* Wait Join request */ /* Wait Join request */
ac_dfa_change_state(session, CAPWAP_JOIN_STATE); ac_dfa_change_state(session, CAPWAP_JOIN_STATE);
@ -558,13 +347,12 @@ static void ac_session_run(struct ac_session_t* session) {
while (session->state != CAPWAP_DTLS_TEARDOWN_STATE) { while (session->state != CAPWAP_DTLS_TEARDOWN_STATE) {
/* Get packet */ /* Get packet */
if ((action == AC_DFA_ACCEPT_PACKET) || (action == AC_DFA_DROP_PACKET)) {
length = ac_network_read(session, buffer, sizeof(buffer), &isctrlsocket, &session->timeout); length = ac_network_read(session, buffer, sizeof(buffer), &isctrlsocket, &session->timeout);
if (length < 0) { if (length < 0) {
if (length == PACKET_TIMEOUT) { if (length == PACKET_TIMEOUT) {
action = ac_dfa_execute(session, NULL); /* Timeout */ ac_dfa_execute(session, NULL);
} else if (length == DTLS_SHUTDOWN) { } else if (length == DTLS_SHUTDOWN) {
ac_session_teardown_connection(session); ac_session_teardown(session);
} else if (length == ACTION_SESSION) { } else if (length == ACTION_SESSION) {
/* Nothing */ /* Nothing */
} }
@ -636,8 +424,8 @@ static void ac_session_run(struct ac_session_t* session) {
} }
/* */ /* */
if (!ignorepacket && (action == AC_DFA_ACCEPT_PACKET)) { if (!ignorepacket) {
action = ac_dfa_execute(session, &packet); ac_dfa_execute(session, &packet);
} }
/* Free memory */ /* Free memory */
@ -650,14 +438,11 @@ static void ac_session_run(struct ac_session_t* session) {
} }
} }
} }
} else {
action = ac_dfa_execute(session, NULL);
}
} }
/* Wait teardown timeout before kill session */ /* Wait teardown timeout before kill session */
capwap_wait_timeout(&session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_wait_timeout(&session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
ac_dfa_state_teardown(session, NULL); ac_dfa_state_teardown(session);
/* Release reference session */ /* Release reference session */
ac_session_destroy(session); ac_session_destroy(session);
@ -679,7 +464,7 @@ void ac_dfa_change_state(struct ac_session_t* session, int state) {
} }
/* Teardown connection */ /* Teardown connection */
int ac_session_teardown_connection(struct ac_session_t* session) { void ac_session_teardown(struct ac_session_t* session) {
ASSERT(session != NULL); ASSERT(session != NULL);
/* Remove session from list */ /* Remove session from list */
@ -706,7 +491,6 @@ int ac_session_teardown_connection(struct ac_session_t* session) {
capwap_killall_timeout(&session->timeout); capwap_killall_timeout(&session->timeout);
capwap_set_timeout(session->dfa.rfcDTLSSessionDelete, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION); capwap_set_timeout(session->dfa.rfcDTLSSessionDelete, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
ac_dfa_change_state(session, CAPWAP_DTLS_TEARDOWN_STATE); ac_dfa_change_state(session, CAPWAP_DTLS_TEARDOWN_STATE);
return AC_DFA_DROP_PACKET;
} }
/* */ /* */

View File

@ -6,11 +6,6 @@
#include "capwap_lock.h" #include "capwap_lock.h"
#include "ac_soap.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 */ /* AC packet */
struct ac_packet { struct ac_packet {
int plainbuffer; 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); 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_close(struct ac_session_t* session);
void ac_session_release_reference(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_free(void);
void ac_session_msgqueue_notify_closethread(pthread_t threadid); 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_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_dtls_setup(struct ac_session_t* session);
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_dfa_state_configure(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);
int ac_dfa_state_configure_to_dtlsteardown(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);
int 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);
int 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);
int ac_dfa_state_datacheck_to_dtlsteardown(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);
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);
/* Soap function */ /* Soap function */
struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* session, char* method, int numparam, ...); struct ac_soap_response* ac_session_send_soap_request(struct ac_session_t* session, char* method, int numparam, ...);