Drop packets if connection is teardown
This commit is contained in:
parent
38b8207f0b
commit
08a8af0a70
@ -48,6 +48,11 @@ static int ac_network_read(struct ac_session_t* session, void* buffer, int lengt
|
|||||||
/* Free packet */
|
/* Free packet */
|
||||||
capwap_itemlist_free(itemaction);
|
capwap_itemlist_free(itemaction);
|
||||||
return result;
|
return result;
|
||||||
|
} else if (session->teardown) {
|
||||||
|
/* Remove all pending packets, connection is teardown */
|
||||||
|
while ((session->controlpackets->count > 0) || (session->datapackets->count > 0)) {
|
||||||
|
capwap_itemlist_free(capwap_itemlist_remove_head(((session->controlpackets->count > 0) ? session->controlpackets : session->datapackets)));
|
||||||
|
}
|
||||||
} else if ((session->controlpackets->count > 0) || (session->datapackets->count > 0)) {
|
} else if ((session->controlpackets->count > 0) || (session->datapackets->count > 0)) {
|
||||||
struct capwap_list_item* itempacket;
|
struct capwap_list_item* itempacket;
|
||||||
|
|
||||||
@ -616,6 +621,9 @@ void ac_dfa_change_state(struct ac_session_t* session, int state) {
|
|||||||
int ac_session_teardown_connection(struct ac_session_t* session) {
|
int ac_session_teardown_connection(struct ac_session_t* session) {
|
||||||
ASSERT(session != NULL);
|
ASSERT(session != NULL);
|
||||||
|
|
||||||
|
/* */
|
||||||
|
session->teardown = 1;
|
||||||
|
|
||||||
/* Close DTSL Control */
|
/* Close DTSL Control */
|
||||||
if (session->ctrldtls.enable) {
|
if (session->ctrldtls.enable) {
|
||||||
capwap_crypt_close(&session->ctrldtls);
|
capwap_crypt_close(&session->ctrldtls);
|
||||||
@ -663,6 +671,10 @@ int ac_session_release_reference(struct ac_session_t* session) {
|
|||||||
capwap_crypt_freesession(&session->datadtls);
|
capwap_crypt_freesession(&session->datadtls);
|
||||||
|
|
||||||
/* Free resource */
|
/* Free resource */
|
||||||
|
while ((session->controlpackets->count > 0) || (session->datapackets->count > 0)) {
|
||||||
|
capwap_itemlist_free(capwap_itemlist_remove_head(((session->controlpackets->count > 0) ? session->controlpackets : session->datapackets)));
|
||||||
|
}
|
||||||
|
|
||||||
capwap_event_destroy(&session->waitpacket);
|
capwap_event_destroy(&session->waitpacket);
|
||||||
capwap_lock_exit(&session->sessionlock);
|
capwap_lock_exit(&session->sessionlock);
|
||||||
capwap_list_free(session->actionsession);
|
capwap_list_free(session->actionsession);
|
||||||
|
@ -54,6 +54,7 @@ struct ac_session_t {
|
|||||||
struct capwap_sessionid_element sessionid;
|
struct capwap_sessionid_element sessionid;
|
||||||
unsigned short binding;
|
unsigned short binding;
|
||||||
|
|
||||||
|
int teardown;
|
||||||
struct capwap_dtls ctrldtls;
|
struct capwap_dtls ctrldtls;
|
||||||
struct capwap_dtls datadtls;
|
struct capwap_dtls datadtls;
|
||||||
|
|
||||||
|
@ -132,6 +132,7 @@ struct wtp_t {
|
|||||||
struct capwap_dtls_context dtlscontext;
|
struct capwap_dtls_context dtlscontext;
|
||||||
struct capwap_dtls ctrldtls;
|
struct capwap_dtls ctrldtls;
|
||||||
struct capwap_dtls datadtls;
|
struct capwap_dtls datadtls;
|
||||||
|
int teardown;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WTP_RADIO_ENABLED 0
|
#define WTP_RADIO_ENABLED 0
|
||||||
|
@ -387,7 +387,7 @@ int wtp_dfa_running(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
if (action == WTP_DFA_DROP_PACKET) {
|
if ((action == WTP_DFA_DROP_PACKET) || g_wtp.teardown) {
|
||||||
/* Drop packet */
|
/* Drop packet */
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
@ -56,6 +56,8 @@ int wtp_dfa_state_dtlsconnect_to_dtlsteardown(struct capwap_parsed_packet* packe
|
|||||||
int wtp_teardown_connection(struct timeout_control* timeout) {
|
int wtp_teardown_connection(struct timeout_control* timeout) {
|
||||||
ASSERT(timeout != NULL);
|
ASSERT(timeout != NULL);
|
||||||
|
|
||||||
|
g_wtp.teardown = 1;
|
||||||
|
|
||||||
/* DTSL Control */
|
/* DTSL Control */
|
||||||
if (g_wtp.ctrldtls.enable) {
|
if (g_wtp.ctrldtls.enable) {
|
||||||
capwap_crypt_close(&g_wtp.ctrldtls);
|
capwap_crypt_close(&g_wtp.ctrldtls);
|
||||||
|
@ -7,6 +7,9 @@ int wtp_dfa_state_idle(struct capwap_parsed_packet* packet, struct timeout_contr
|
|||||||
ASSERT(timeout != NULL);
|
ASSERT(timeout != NULL);
|
||||||
ASSERT(packet == NULL);
|
ASSERT(packet == NULL);
|
||||||
|
|
||||||
|
/* Remove teardown flag */
|
||||||
|
g_wtp.teardown = 0;
|
||||||
|
|
||||||
if (!g_wtp.acdiscoveryrequest && (g_wtp.acpreferedarray->count > 0)) {
|
if (!g_wtp.acdiscoveryrequest && (g_wtp.acpreferedarray->count > 0)) {
|
||||||
/* Found in configuration file the AC address */
|
/* Found in configuration file the AC address */
|
||||||
memcpy(&g_wtp.acctrladdress, capwap_array_get_item_pointer(g_wtp.acpreferedarray, g_wtp.acpreferedselected), sizeof(struct sockaddr_storage));
|
memcpy(&g_wtp.acctrladdress, capwap_array_get_item_pointer(g_wtp.acpreferedarray, g_wtp.acpreferedselected), sizeof(struct sockaddr_storage));
|
||||||
|
Loading…
Reference in New Issue
Block a user