Add action message into dispatch session message

This commit is contained in:
vemax78 2013-07-07 15:36:53 +02:00
parent 2c3c552973
commit 94cf13649a
3 changed files with 79 additions and 14 deletions

View File

@ -10,7 +10,7 @@
static void ac_session_add_packet(struct ac_session_t* session, char* buffer, int size, int isctrlsocket, int plainbuffer) { static void ac_session_add_packet(struct ac_session_t* session, char* buffer, int size, int isctrlsocket, int plainbuffer) {
struct capwap_list_item* item; struct capwap_list_item* item;
struct ac_packet* packet; struct ac_packet* packet;
ASSERT(session != NULL); ASSERT(session != NULL);
ASSERT(buffer != NULL); ASSERT(buffer != NULL);
ASSERT(size > 0); ASSERT(size > 0);
@ -20,7 +20,7 @@ static void ac_session_add_packet(struct ac_session_t* session, char* buffer, in
packet = (struct ac_packet*)item->item; packet = (struct ac_packet*)item->item;
packet->plainbuffer = plainbuffer; packet->plainbuffer = plainbuffer;
memcpy(packet->buffer, buffer, size); memcpy(packet->buffer, buffer, size);
/* Append to packets list */ /* Append to packets list */
capwap_lock_enter(&session->packetslock); capwap_lock_enter(&session->packetslock);
capwap_itemlist_insert_after((isctrlsocket ? session->controlpackets : session->datapackets), NULL, item); capwap_itemlist_insert_after((isctrlsocket ? session->controlpackets : session->datapackets), NULL, item);
@ -28,6 +28,32 @@ static void ac_session_add_packet(struct ac_session_t* session, char* buffer, in
capwap_lock_exit(&session->packetslock); capwap_lock_exit(&session->packetslock);
} }
/* Add action to session */
void ac_session_send_action(struct ac_session_t* session, long action, long param, void* data, long length) {
struct capwap_list_item* item;
struct ac_session_action* actionsession;
ASSERT(session != NULL);
ASSERT(length >= 0);
/* */
item = capwap_itemlist_create(sizeof(struct ac_session_action) + length);
actionsession = (struct ac_session_action*)item->item;
actionsession->action = action;
actionsession->param = param;
actionsession->length = length;
if (length > 0) {
ASSERT(data != NULL);
memcpy(actionsession->data, data, length);
}
/* Append to actions list */
capwap_lock_enter(&session->packetslock);
capwap_itemlist_insert_after(session->actionsession, NULL, item);
capwap_event_signal(&session->waitpacket);
capwap_lock_exit(&session->packetslock);
}
/* Find AC sessions */ /* Find AC sessions */
static struct ac_session_t* ac_search_session_from_wtpaddress(struct sockaddr_storage* address, int isctrlsocket) { static struct ac_session_t* ac_search_session_from_wtpaddress(struct sockaddr_storage* address, int isctrlsocket) {
struct ac_session_t* result = NULL; struct ac_session_t* result = NULL;
@ -183,8 +209,7 @@ static struct ac_session_t* ac_get_session_from_keepalive(void* buffer, int buff
/* Close session */ /* Close session */
static void ac_close_session(struct ac_session_t* session) { static void ac_close_session(struct ac_session_t* session) {
session->closesession = 1; ac_session_send_action(session, AC_SESSION_ACTION_CLOSE, 0, NULL, 0);
capwap_event_signal(&session->waitpacket);
} }
/* Close sessions */ /* Close sessions */
@ -368,6 +393,7 @@ static struct ac_session_t* ac_create_session(struct sockaddr_storage* wtpaddres
capwap_event_init(&session->waitpacket); capwap_event_init(&session->waitpacket);
capwap_lock_init(&session->packetslock); capwap_lock_init(&session->packetslock);
session->actionsession = capwap_list_create();
session->controlpackets = capwap_list_create(); session->controlpackets = capwap_list_create();
session->datapackets = capwap_list_create(); session->datapackets = capwap_list_create();
session->requestfragmentpacket = capwap_list_create(); session->requestfragmentpacket = capwap_list_create();

View File

@ -4,8 +4,25 @@
#define PACKET_TIMEOUT -1 #define PACKET_TIMEOUT -1
#define DTLS_SHUTDOWN -2 #define DTLS_SHUTDOWN -2
#define ACTION_SESSION -3
/* */
static int ac_session_action_execute(struct ac_session_t* session, struct ac_session_action* action) {
int result = ACTION_SESSION;
switch (action->action) {
case AC_SESSION_ACTION_CLOSE: {
result = DTLS_SHUTDOWN;
break;
}
}
return result;
}
/* */
static int ac_network_read(struct ac_session_t* session, void* buffer, int length, int* isctrlpacket, struct timeout_control* timeout) { static int ac_network_read(struct ac_session_t* session, void* buffer, int length, int* isctrlpacket, struct timeout_control* timeout) {
int result = 0;
long indextimer; long indextimer;
long waittimeout; long waittimeout;
@ -15,15 +32,21 @@ static int ac_network_read(struct ac_session_t* session, void* buffer, int lengt
ASSERT(isctrlpacket != NULL); ASSERT(isctrlpacket != NULL);
for (;;) { for (;;) {
if (session->closesession) {
session->closesession = 0;
return DTLS_SHUTDOWN;
}
capwap_lock_enter(&session->packetslock); capwap_lock_enter(&session->packetslock);
if ((session->controlpackets->count > 0) || (session->datapackets->count > 0)) { if (session->actionsession->count > 0) {
int result = 0; struct capwap_list_item* itemaction;
itemaction = capwap_itemlist_remove_head(session->actionsession);
capwap_lock_exit(&session->packetslock);
/* */
result = ac_session_action_execute(session, (struct ac_session_action*)itemaction->item);
/* Free packet */
capwap_itemlist_free(itemaction);
return result;
} else if ((session->controlpackets->count > 0) || (session->datapackets->count > 0)) {
struct capwap_list_item* itempacket; struct capwap_list_item* itempacket;
*isctrlpacket = ((session->controlpackets->count > 0) ? 1 : 0); *isctrlpacket = ((session->controlpackets->count > 0) ? 1 : 0);
@ -435,6 +458,8 @@ static void ac_session_run(struct ac_session_t* session) {
action = ac_dfa_execute(session, NULL); /* Timeout */ action = ac_dfa_execute(session, NULL); /* Timeout */
} else if (length == DTLS_SHUTDOWN) { } else if (length == DTLS_SHUTDOWN) {
action = ac_session_teardown_connection(session); action = ac_session_teardown_connection(session);
} else if (length == ACTION_SESSION) {
/* Nothing */
} }
} else if (length > 0) { } else if (length > 0) {
/* Accept data packet only in running state */ /* Accept data packet only in running state */
@ -585,6 +610,7 @@ int ac_session_release_reference(struct ac_session_t* session) {
/* Free resource */ /* Free resource */
capwap_event_destroy(&session->waitpacket); capwap_event_destroy(&session->waitpacket);
capwap_lock_exit(&session->packetslock); capwap_lock_exit(&session->packetslock);
capwap_list_free(session->actionsession);
capwap_list_free(session->controlpackets); capwap_list_free(session->controlpackets);
capwap_list_free(session->datapackets); capwap_list_free(session->datapackets);

View File

@ -8,6 +8,9 @@
#define AC_DFA_DROP_PACKET 2 #define AC_DFA_DROP_PACKET 2
#define AC_DFA_DEAD 3 #define AC_DFA_DEAD 3
/* */
#define AC_SESSION_ACTION_CLOSE 0
/* AC packet */ /* AC packet */
struct ac_packet { struct ac_packet {
int plainbuffer; int plainbuffer;
@ -20,6 +23,14 @@ struct ac_session_control {
unsigned short count; unsigned short count;
}; };
/* */
struct ac_session_action {
long action;
long param;
long length;
char data[0];
};
/* AC sessions */ /* AC sessions */
struct ac_session_t { struct ac_session_t {
struct ac_state dfa; struct ac_state dfa;
@ -42,11 +53,11 @@ struct ac_session_t {
struct capwap_dtls ctrldtls; struct capwap_dtls ctrldtls;
struct capwap_dtls datadtls; struct capwap_dtls datadtls;
int closesession;
pthread_t threadid; pthread_t threadid;
capwap_event_t waitpacket; capwap_event_t waitpacket;
capwap_lock_t packetslock; capwap_lock_t packetslock;
struct capwap_list* actionsession;
struct capwap_list* controlpackets; struct capwap_list* controlpackets;
struct capwap_list* datapackets; struct capwap_list* datapackets;
@ -69,6 +80,8 @@ void* ac_session_thread(void* param);
int ac_session_teardown_connection(struct ac_session_t* session); int ac_session_teardown_connection(struct ac_session_t* session);
int ac_session_release_reference(struct ac_session_t* session); int ac_session_release_reference(struct ac_session_t* session);
void ac_session_send_action(struct ac_session_t* session, long action, long param, void* data, long length);
void ac_dfa_change_state(struct ac_session_t* session, int state); void ac_dfa_change_state(struct ac_session_t* session, int state);
void ac_get_control_information(struct capwap_list* controllist); void ac_get_control_information(struct capwap_list* controllist);