#ifndef _SESSION_MANAGER_H #define _SESSION_MANAGER_H #ifdef __cpluscplus extern "C" { #endif #include "session.h" #include "log.h" #define SESSION_LOG_ERROR(format, ...) LOG_ERROR("session", format, ##__VA_ARGS__) #define SESSION_LOG_DEBUG(format, ...) LOG_DEBUG("session", format, ##__VA_ARGS__) struct session_manager_options { // max session number uint64_t max_tcp_session_num; uint64_t max_udp_session_num; // session overload uint8_t tcp_overload_evict_old_sess; // 1: evict old session, 0: bypass new session uint8_t udp_overload_evict_old_sess; // 1: evict old session, 0: bypass new session // TCP timeout uint64_t tcp_timeout_init; // seconds, Range: 1-60 uint64_t tcp_timeout_handshake; // seconds, Range: 1-60 uint64_t tcp_timeout_data; // seconds, Range: 1-15,999,999 uint64_t tcp_timeout_half_closed; // seconds, Range: 1-604,800 uint64_t tcp_timeout_time_wait; // seconds, Range: 1-600 uint64_t tcp_timeout_discard; // seconds, Range: 1-15,999,999 // UDP timeout uint64_t udp_timeout_data; // seconds, Range: 1-15,999,999 // duplicate packet filter uint8_t duplicated_packet_filter_enable; uint32_t duplicated_packet_filter_capacity; uint32_t duplicated_packet_filter_timeout; // seconds, Range: 1-60 double duplicated_packet_filter_error_rate; // evicted session filter uint8_t evicted_session_filter_enable; uint32_t evicted_session_filter_capacity; uint32_t evicted_session_filter_timeout; // seconds, Range: 1-60 double evicted_session_filter_error_rate; }; struct session_manager; struct session_manager *session_manager_new(struct session_manager_options *opts); void session_manager_free(struct session_manager *mgr); struct session *session_manager_lookup_session(struct session_manager *mgr, const struct packet *pkt); /* * return NULL following case: * 1.Not TCP or UDP * 2.UDP eviction packet * 3.UDP overloading and config to bypass new session * 4.TCP no SYN flag * 5.UDP overloading and config to bypass new session */ struct session *session_manager_new_session(struct session_manager *mgr, const struct packet *pkt); void session_manager_free_session(struct session_manager *mgr, struct session *sess); /* * return NULL following case: * 1.Not TCP or UDP * 2.TCP duplicate packet */ int session_manager_update_session(struct session_manager *mgr, struct session *sess, const struct packet *pkt); // return session need free by session_manager_free_session() struct session *session_manager_get_expired_session(struct session_manager *mgr); // return session need free by session_manager_free_session() struct session *session_manager_get_evicted_session(struct session_manager *mgr); // return 0: have already timeout session // return >0: next expire interval uint64_t session_manager_get_expire_interval(struct session_manager *mgr); struct session_manager_stat { uint64_t tcp_sess_num; uint64_t tcp_opening_sess_num; uint64_t tcp_active_sess_num; uint64_t tcp_closing_sess_num; uint64_t udp_sess_num; uint64_t udp_opening_sess_num; uint64_t udp_active_sess_num; uint64_t udp_closing_sess_num; uint64_t tcp_overload_evict_old_sess_num; uint64_t tcp_overload_evict_new_sess_num; uint64_t udp_overload_evict_old_sess_num; uint64_t udp_overload_evict_new_sess_num; }; void session_manager_print_stat(struct session_manager *mgr); void session_manager_get_stat(struct session_manager *mgr, struct session_manager_stat *out); #ifdef __cpluscplus } #endif #endif