82 lines
2.8 KiB
C
82 lines
2.8 KiB
C
#include "ac.h"
|
|
#include "capwap_dfa.h"
|
|
#include "capwap_array.h"
|
|
#include "ac_session.h"
|
|
|
|
/* */
|
|
int ac_dfa_state_reset(struct ac_session_t* session, struct capwap_packet* packet) {
|
|
int status = AC_DFA_ACCEPT_PACKET;
|
|
|
|
ASSERT(session != NULL);
|
|
|
|
if (packet) {
|
|
if (!capwap_compare_ip(&session->wtpctrladdress, &packet->remoteaddr)) {
|
|
struct capwap_build_packet* buildpacket;
|
|
|
|
/* Parsing packet */
|
|
buildpacket = capwap_rx_packet_create((void*)packet->header, packet->packetsize, packet->socket.isctrlsocket);
|
|
if (buildpacket) {
|
|
if (!capwap_build_packet_validate(buildpacket, NULL)) {
|
|
unsigned short binding;
|
|
|
|
/* */
|
|
binding = GET_WBID_HEADER(&buildpacket->header);
|
|
if ((binding == session->binding) && (ntohl(buildpacket->ctrlmsg.type) == CAPWAP_RESET_RESPONSE) && ((session->localseqnumber - 1) == buildpacket->ctrlmsg.seq)) {
|
|
struct capwap_element_reset_response resetresponse;
|
|
|
|
/* Valid packet, free request packet */
|
|
ac_free_reference_last_request(session);
|
|
|
|
/* Configuration status response info */
|
|
capwap_init_element_reset_response(&resetresponse, binding);
|
|
|
|
/* Parsing elements list */
|
|
if (capwap_parsing_element_reset_response(&resetresponse, buildpacket->elementslist->first)) {
|
|
ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE);
|
|
status = AC_DFA_NO_PACKET;
|
|
}
|
|
|
|
/* Free join response */
|
|
capwap_free_element_reset_response(&resetresponse, binding);
|
|
}
|
|
}
|
|
|
|
/* Free */
|
|
capwap_build_packet_free(buildpacket);
|
|
}
|
|
}
|
|
} else {
|
|
int i;
|
|
|
|
/* No Configuration status response received */
|
|
session->dfa.rfcRetransmitCount++;
|
|
if (session->dfa.rfcRetransmitCount >= session->dfa.rfcMaxRetransmit) {
|
|
/* Timeout join state */
|
|
ac_free_reference_last_request(session);
|
|
ac_dfa_change_state(session, CAPWAP_RESET_TO_DTLS_TEARDOWN_STATE);
|
|
status = AC_DFA_NO_PACKET;
|
|
} else {
|
|
/* Retransmit configuration request */
|
|
for (i = 0; i < session->requestfragmentpacket->count; i++) {
|
|
struct capwap_packet* txpacket = (struct capwap_packet*)capwap_array_get_item_pointer(session->requestfragmentpacket, i);
|
|
ASSERT(txpacket != NULL);
|
|
|
|
if (!capwap_crypt_sendto(&session->ctrldtls, session->ctrlsocket.socket[session->ctrlsocket.type], txpacket->header, txpacket->packetsize, &session->acctrladdress, &session->wtpctrladdress)) {
|
|
capwap_logging_debug("Warning: error to send configuration status request packet");
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Update timeout */
|
|
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_packet* packet) {
|
|
return ac_session_teardown_connection(session);
|
|
}
|