#ifndef _SESSION_TABLE_H #define _SESSION_TABLE_H #ifdef __cpluscplus extern "C" { #endif #include #include #include "uthash.h" #include "tuple.h" // Note: session_addr must be initialized by memset(0) before use !!! typedef void fn_free_cb(void *args); struct session_node { uint64_t session_id; /* first key */ struct tuple4 session_addr; /* second key */ uint8_t is_session_id_only_key; void *val_data; fn_free_cb *val_freecb; UT_hash_handle hh1; /* handle for first hash table */ UT_hash_handle hh2; /* handle for second hash table */ }; struct session_table; struct session_table *session_table_create(); void session_table_destory(struct session_table *table); void session_table_reset(struct session_table *table); uint64_t session_table_count(struct session_table *table); // session_addr : deep copy // val_data : shallow copy (malloc by user, free by val_freecb) // return 0 : suceess // return -1 : key exists int session_table_insert(struct session_table *table, uint8_t is_session_id_only_key, uint64_t session_id, const struct tuple4 *session_addr, void *val_data, const fn_free_cb *val_freecb); // return 0 : success // return -1 : key not exists int session_table_delete_by_id(struct session_table *table, uint64_t session_id); int session_table_delete_by_addr(struct session_table *table, const struct tuple4 *session_addr); // return NULL : key not exists // return UnNULL : success struct session_node *session_table_search_by_id(struct session_table *table, uint64_t session_id); struct session_node *session_table_search_by_addr(struct session_table *table, const struct tuple4 *session_addr); void session_foreach(struct session_table *table, struct fieldstat_easy_intercept *metrics, int (*func)(struct fieldstat_easy_intercept *, void *, int), int thread_index); #ifdef __cpluscplus } #endif #endif