summaryrefslogtreecommitdiff
path: root/src/protocol_decoder/http/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocol_decoder/http/session.c')
-rw-r--r--src/protocol_decoder/http/session.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/protocol_decoder/http/session.c b/src/protocol_decoder/http/session.c
new file mode 100644
index 0000000..5b581b7
--- /dev/null
+++ b/src/protocol_decoder/http/session.c
@@ -0,0 +1,185 @@
+#include <assert.h>
+#include <string.h>
+
+#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);
+} \ No newline at end of file