#include #include #include "hash.h" #include "session.h" #include "http_decoder_util.h" struct event_queue { struct session_event *head; // del from head struct session_event *tail; // add to tail }; struct event_queue g_event_queue = {.head = NULL, .tail = NULL}; /****************************************************************************** * session event ******************************************************************************/ void session_event_push(struct session_event *event) { printf("EVENT PUSH: %s\n", event->event_name); event->next = NULL; // none node if (g_event_queue.head == NULL && g_event_queue.tail == NULL) { g_event_queue.head = event; g_event_queue.tail = event; } // only one node else if (g_event_queue.head == g_event_queue.tail) { g_event_queue.tail->next = event; g_event_queue.tail = event; } else // mutil node { g_event_queue.tail->next = event; g_event_queue.tail = event; } } struct session_event *session_event_pop() { struct session_event *temp = g_event_queue.head; // none node if (g_event_queue.head == NULL && g_event_queue.tail == NULL) { return NULL; } // only one node else if (g_event_queue.head == g_event_queue.tail) { g_event_queue.head = NULL; g_event_queue.tail = NULL; temp->next = NULL; printf("EVENT POP : %s\n", temp->event_name); return temp; } else // mutil node { g_event_queue.head = temp->next; temp->next = NULL; printf("EVENT POP : %s\n", temp->event_name); return temp; } } /****************************************************************************** * session derive/trigger ******************************************************************************/ struct stellar_session *session_derive(struct stellar_session *session, const char *session_name) { struct stellar_session *new_session = safe_alloc(struct stellar_session, 1); assert(new_session); new_session->father = session; new_session->session_name = session_name; printf("SESSION DERIVER: %s\n", session_name); return new_session; } void session_trigger(struct stellar_session *session, const char *event_name) { struct session_event *event = safe_alloc(struct session_event, 1); assert(event); event->session = session; event->event_name = event_name; session_event_push(event); } /****************************************************************************** * session ex data ******************************************************************************/ size_t session_register_ex_data_index(const char *key) { size_t hash_value = 0; size_t hash_index = 0; HASH_JEN(key, strlen(key), hash_value); hash_index = hash_value % EX_DATA_MAX_NUM; return hash_index; } void session_set_ex_data(struct stellar_session *session, int idx, void *ex_data, free_callback *free_cb, void *cb_arg) { assert(idx >= 0 && idx < EX_DATA_MAX_NUM); assert(session->ex_data[idx].ex_data == NULL); assert(session->ex_data[idx].free_cb == NULL); assert(session->ex_data[idx].cb_arg == NULL); session->ex_data[idx].ex_data = ex_data; session->ex_data[idx].free_cb = free_cb; session->ex_data[idx].cb_arg = cb_arg; } void *session_get_ex_data(struct stellar_session *session, int idx) { assert(idx >= 0 && idx < EX_DATA_MAX_NUM); return session->ex_data[idx].ex_data; } void session_del_ex_data(struct stellar_session *session, int idx) { assert(idx >= 0 && idx < EX_DATA_MAX_NUM); assert(session->ex_data[idx].ex_data); session->ex_data[idx].ex_data = NULL; session->ex_data[idx].free_cb = NULL; session->ex_data[idx].cb_arg = NULL; } void session_free_ex_data(struct stellar_session *session) { assert(session); for (size_t i = 0; i < EX_DATA_MAX_NUM; i++) { struct session_ex_data *exdata = &session->ex_data[i]; if (exdata->free_cb) { exdata->free_cb(exdata->ex_data, exdata->cb_arg); } exdata->free_cb = NULL; exdata->cb_arg = NULL; exdata->ex_data = NULL; } } /****************************************************************************** * session get data ******************************************************************************/ const char *session_get_l4_payload(struct stellar_session *session) { return session->l7_payload; } size_t session_get_l4_payload_length(struct stellar_session *session) { return session->l7_payload_length; } uint8_t session_get_l4_dir(struct stellar_session *session) { return session->current_packet_dir; } void pm_session_dettach_me(struct stellar_session *session) { printf("pm_session_dettach_me: %s\n", session->session_name); }