session manager: support session timeouts & tcp dupkt filter & udp eviction filter
This commit is contained in:
@@ -3,10 +3,7 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
add_library(dupkt_filter dupkt_filter.cpp)
|
add_library(dupkt_filter dupkt_filter.cpp)
|
||||||
target_include_directories(dupkt_filter PUBLIC ${CMAKE_SOURCE_DIR}/src/dupkt_filter)
|
target_include_directories(dupkt_filter PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_include_directories(dupkt_filter PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
|
||||||
target_include_directories(dupkt_filter PUBLIC ${CMAKE_SOURCE_DIR}/src/timestamp)
|
|
||||||
target_include_directories(dupkt_filter PUBLIC ${CMAKE_SOURCE_DIR}/deps/dablooms)
|
|
||||||
target_link_libraries(dupkt_filter packet timestamp dablooms)
|
target_link_libraries(dupkt_filter packet timestamp dablooms)
|
||||||
|
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
@@ -3,10 +3,7 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
add_library(eviction_filter eviction_filter.cpp)
|
add_library(eviction_filter eviction_filter.cpp)
|
||||||
target_include_directories(eviction_filter PUBLIC ${CMAKE_SOURCE_DIR}/src/eviction_filter)
|
target_include_directories(eviction_filter PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_include_directories(eviction_filter PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
|
||||||
target_include_directories(eviction_filter PUBLIC ${CMAKE_SOURCE_DIR}/src/timestamp)
|
|
||||||
target_include_directories(eviction_filter PUBLIC ${CMAKE_SOURCE_DIR}/deps/dablooms)
|
|
||||||
target_link_libraries(eviction_filter packet timestamp dablooms)
|
target_link_libraries(eviction_filter packet timestamp dablooms)
|
||||||
|
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
@@ -3,8 +3,7 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
add_library(packet packet.cpp)
|
add_library(packet packet.cpp)
|
||||||
target_include_directories(packet PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
target_include_directories(packet PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_include_directories(packet PUBLIC ${CMAKE_SOURCE_DIR}/src/tuple)
|
|
||||||
target_include_directories(packet PUBLIC ${CMAKE_SOURCE_DIR}/deps/uthash)
|
target_include_directories(packet PUBLIC ${CMAKE_SOURCE_DIR}/deps/uthash)
|
||||||
target_link_libraries(packet tuple)
|
target_link_libraries(packet tuple)
|
||||||
|
|
||||||
|
|||||||
@@ -6,20 +6,16 @@ add_executable(gtest_packet gtest_packet.cpp)
|
|||||||
target_link_libraries(gtest_packet packet gtest)
|
target_link_libraries(gtest_packet packet gtest)
|
||||||
|
|
||||||
add_executable(gtest_udp_helpers gtest_udp_helpers.cpp)
|
add_executable(gtest_udp_helpers gtest_udp_helpers.cpp)
|
||||||
target_include_directories(gtest_udp_helpers PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
target_link_libraries(gtest_udp_helpers packet gtest)
|
||||||
target_link_libraries(gtest_udp_helpers gtest)
|
|
||||||
|
|
||||||
add_executable(gtest_tcp_helpers gtest_tcp_helpers.cpp)
|
add_executable(gtest_tcp_helpers gtest_tcp_helpers.cpp)
|
||||||
target_include_directories(gtest_tcp_helpers PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
target_link_libraries(gtest_tcp_helpers packet gtest)
|
||||||
target_link_libraries(gtest_tcp_helpers gtest)
|
|
||||||
|
|
||||||
add_executable(gtest_ipv4_helpers gtest_ipv4_helpers.cpp)
|
add_executable(gtest_ipv4_helpers gtest_ipv4_helpers.cpp)
|
||||||
target_include_directories(gtest_ipv4_helpers PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
target_link_libraries(gtest_ipv4_helpers packet gtest)
|
||||||
target_link_libraries(gtest_ipv4_helpers gtest)
|
|
||||||
|
|
||||||
add_executable(gtest_ipv6_helpers gtest_ipv6_helpers.cpp)
|
add_executable(gtest_ipv6_helpers gtest_ipv6_helpers.cpp)
|
||||||
target_include_directories(gtest_ipv6_helpers PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
target_link_libraries(gtest_ipv6_helpers packet gtest)
|
||||||
target_link_libraries(gtest_ipv6_helpers gtest)
|
|
||||||
|
|
||||||
add_executable(gtest_packet_helpers gtest_packet_helpers.cpp)
|
add_executable(gtest_packet_helpers gtest_packet_helpers.cpp)
|
||||||
target_link_libraries(gtest_packet_helpers packet gtest)
|
target_link_libraries(gtest_packet_helpers packet gtest)
|
||||||
|
|||||||
@@ -10,12 +10,7 @@ add_library(session_manager
|
|||||||
session_queue.cpp
|
session_queue.cpp
|
||||||
session_manager.cpp
|
session_manager.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/deps/uthash)
|
target_include_directories(session_manager PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/deps/timeout)
|
target_link_libraries(session_manager timeout dupkt_filter eviction_filter)
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/src/packet)
|
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/src/session)
|
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/src/timestamp)
|
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/src/tuple)
|
|
||||||
target_link_libraries(session_manager timeout timestamp tuple packet)
|
|
||||||
|
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
@@ -46,7 +46,7 @@ uint64_t session_get_id(const struct session *sess)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// session tuple6
|
// session tuple6
|
||||||
void session_set_tuple6(struct session *sess, struct tuple6 *tuple)
|
void session_set_tuple6(struct session *sess, const struct tuple6 *tuple)
|
||||||
{
|
{
|
||||||
memcpy(&sess->tuple, tuple, sizeof(struct tuple6));
|
memcpy(&sess->tuple, tuple, sizeof(struct tuple6));
|
||||||
}
|
}
|
||||||
@@ -88,6 +88,17 @@ enum session_type session_get_type(const struct session *sess)
|
|||||||
return sess->type;
|
return sess->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// session dup traffic flag
|
||||||
|
void session_set_dup_traffic_flag(struct session *sess, enum dup_traffic_flag flag)
|
||||||
|
{
|
||||||
|
sess->dup_flag = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum dup_traffic_flag session_get_dup_traffic_flag(const struct session *sess)
|
||||||
|
{
|
||||||
|
return sess->dup_flag;
|
||||||
|
}
|
||||||
|
|
||||||
// closing reasion
|
// closing reasion
|
||||||
void session_set_closing_reasion(struct session *sess, enum closing_reasion reasion)
|
void session_set_closing_reasion(struct session *sess, enum closing_reasion reasion)
|
||||||
{
|
{
|
||||||
@@ -349,14 +360,14 @@ static void tcp_ex_data_tostring(uint64_t ex_data, char *buffer, size_t buffer_l
|
|||||||
nused += snprintf(buffer + nused, buffer_len - nused, "TCP_SYNACK_RECVED ");
|
nused += snprintf(buffer + nused, buffer_len - nused, "TCP_SYNACK_RECVED ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ex_data & TCP_C2S_PAYLOAD_RECVED)
|
if (ex_data & TCP_C2S_DATA_RECVED)
|
||||||
{
|
{
|
||||||
nused += snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_PAYLOAD_RECVED ");
|
nused += snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_DATA_RECVED ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ex_data & TCP_S2C_PAYLOAD_RECVED)
|
if (ex_data & TCP_S2C_DATA_RECVED)
|
||||||
{
|
{
|
||||||
nused += snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_PAYLOAD_RECVED ");
|
nused += snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_DATA_RECVED ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ex_data & TCP_C2S_FIN_RECVED)
|
if (ex_data & TCP_C2S_FIN_RECVED)
|
||||||
@@ -404,17 +415,17 @@ const char *session_closing_reasion_tostring(enum closing_reasion reasion)
|
|||||||
switch (reasion)
|
switch (reasion)
|
||||||
{
|
{
|
||||||
case CLOSING_BY_TIMEOUT:
|
case CLOSING_BY_TIMEOUT:
|
||||||
return "CLOSING_BY_TIMEOUT";
|
return "closing_by_timeout";
|
||||||
case CLOSING_BY_EVICTED:
|
case CLOSING_BY_EVICTED:
|
||||||
return "CLOSING_BY_EVICTED";
|
return "closing_by_evicted";
|
||||||
case CLOSING_BY_CLIENT_FIN:
|
case CLOSING_BY_CLIENT_FIN:
|
||||||
return "CLOSING_BY_CLIENT_FIN";
|
return "closing_by_client_fin";
|
||||||
case CLOSING_BY_CLIENT_RST:
|
case CLOSING_BY_CLIENT_RST:
|
||||||
return "CLOSING_BY_CLIENT_RST";
|
return "closing_by_client_rst";
|
||||||
case CLOSING_BY_SERVER_FIN:
|
case CLOSING_BY_SERVER_FIN:
|
||||||
return "CLOSING_BY_SERVER_FIN";
|
return "closing_by_server_fin";
|
||||||
case CLOSING_BY_SERVER_RST:
|
case CLOSING_BY_SERVER_RST:
|
||||||
return "CLOSING_BY_SERVER_RST";
|
return "closing_by_server_rst";
|
||||||
default:
|
default:
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
@@ -424,8 +435,6 @@ const char *session_state_tostring(enum session_state state)
|
|||||||
{
|
{
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case SESSION_STATE_INIT:
|
|
||||||
return "init";
|
|
||||||
case SESSION_STATE_OPENING:
|
case SESSION_STATE_OPENING:
|
||||||
return "opening";
|
return "opening";
|
||||||
case SESSION_STATE_ACTIVE:
|
case SESSION_STATE_ACTIVE:
|
||||||
@@ -456,8 +465,6 @@ const char *session_dir_tostring(enum session_dir dir)
|
|||||||
{
|
{
|
||||||
switch (dir)
|
switch (dir)
|
||||||
{
|
{
|
||||||
case SESSION_DIR_NONE:
|
|
||||||
return "none";
|
|
||||||
case SESSION_DIR_C2S:
|
case SESSION_DIR_C2S:
|
||||||
return "c2s";
|
return "c2s";
|
||||||
case SESSION_DIR_S2C:
|
case SESSION_DIR_S2C:
|
||||||
|
|||||||
@@ -13,11 +13,10 @@ extern "C"
|
|||||||
|
|
||||||
enum session_state
|
enum session_state
|
||||||
{
|
{
|
||||||
SESSION_STATE_INIT = 0,
|
SESSION_STATE_OPENING = 0x1,
|
||||||
SESSION_STATE_OPENING,
|
SESSION_STATE_ACTIVE = 0x2,
|
||||||
SESSION_STATE_ACTIVE,
|
SESSION_STATE_CLOSING = 0x3,
|
||||||
SESSION_STATE_CLOSING,
|
SESSION_STATE_CLOSED = 0x4,
|
||||||
SESSION_STATE_CLOSED,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum session_type
|
enum session_type
|
||||||
@@ -28,19 +27,25 @@ enum session_type
|
|||||||
|
|
||||||
enum session_dir
|
enum session_dir
|
||||||
{
|
{
|
||||||
SESSION_DIR_NONE = 0,
|
SESSION_DIR_NONE = 0x0,
|
||||||
SESSION_DIR_C2S = 1,
|
SESSION_DIR_C2S = 0x1,
|
||||||
SESSION_DIR_S2C = 2,
|
SESSION_DIR_S2C = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum dup_traffic_flag
|
||||||
|
{
|
||||||
|
DUP_TRAFFIC_YES = 0x1,
|
||||||
|
DUP_TRAFFIC_NO = 0x2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum closing_reasion
|
enum closing_reasion
|
||||||
{
|
{
|
||||||
CLOSING_BY_TIMEOUT = 1,
|
CLOSING_BY_TIMEOUT = 0x1,
|
||||||
CLOSING_BY_EVICTED = 2,
|
CLOSING_BY_EVICTED = 0x2,
|
||||||
CLOSING_BY_CLIENT_FIN = 3,
|
CLOSING_BY_CLIENT_FIN = 0x3,
|
||||||
CLOSING_BY_CLIENT_RST = 4,
|
CLOSING_BY_CLIENT_RST = 0x4,
|
||||||
CLOSING_BY_SERVER_FIN = 5,
|
CLOSING_BY_SERVER_FIN = 0x5,
|
||||||
CLOSING_BY_SERVER_RST = 6,
|
CLOSING_BY_SERVER_RST = 0x6,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct session;
|
struct session;
|
||||||
@@ -56,7 +61,7 @@ void session_set_id(struct session *sess, uint64_t id);
|
|||||||
uint64_t session_get_id(const struct session *sess);
|
uint64_t session_get_id(const struct session *sess);
|
||||||
|
|
||||||
// session key
|
// session key
|
||||||
void session_set_tuple6(struct session *sess, struct tuple6 *tuple);
|
void session_set_tuple6(struct session *sess, const struct tuple6 *tuple);
|
||||||
const struct tuple6 *session_get0_tuple6(const struct session *sess);
|
const struct tuple6 *session_get0_tuple6(const struct session *sess);
|
||||||
void session_set_tuple6_dir(struct session *sess, enum session_dir dir);
|
void session_set_tuple6_dir(struct session *sess, enum session_dir dir);
|
||||||
enum session_dir session_get_tuple6_dir(const struct session *sess);
|
enum session_dir session_get_tuple6_dir(const struct session *sess);
|
||||||
@@ -69,6 +74,10 @@ enum session_state session_get_state(const struct session *sess);
|
|||||||
void session_set_type(struct session *sess, enum session_type type);
|
void session_set_type(struct session *sess, enum session_type type);
|
||||||
enum session_type session_get_type(const struct session *sess);
|
enum session_type session_get_type(const struct session *sess);
|
||||||
|
|
||||||
|
// session dup traffic flag
|
||||||
|
void session_set_dup_traffic_flag(struct session *sess, enum dup_traffic_flag flag);
|
||||||
|
enum dup_traffic_flag session_get_dup_traffic_flag(const struct session *sess);
|
||||||
|
|
||||||
// closing reasion
|
// closing reasion
|
||||||
void session_set_closing_reasion(struct session *sess, enum closing_reasion reasion);
|
void session_set_closing_reasion(struct session *sess, enum closing_reasion reasion);
|
||||||
enum closing_reasion session_get_closing_reasion(const struct session *sess);
|
enum closing_reasion session_get_closing_reasion(const struct session *sess);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,32 +8,65 @@ extern "C"
|
|||||||
|
|
||||||
#include "session.h"
|
#include "session.h"
|
||||||
|
|
||||||
// #define SESSION_LOG_ERROR(format, ...) void(0)
|
|
||||||
#ifndef SESSION_LOG_ERROR
|
#ifndef SESSION_LOG_ERROR
|
||||||
#define SESSION_LOG_ERROR(format, ...) \
|
#define SESSION_LOG_ERROR(format, ...) \
|
||||||
fprintf(stderr, "ERROR (session), " format "\n", ##__VA_ARGS__);
|
fprintf(stderr, "ERROR (session), " format "\n", ##__VA_ARGS__);
|
||||||
#endif
|
#endif
|
||||||
// #define SESSION_LOG_DEBUG(format, ...) void(0)
|
|
||||||
#ifndef SESSION_LOG_DEBUG
|
#ifndef SESSION_LOG_DEBUG
|
||||||
#define SESSION_LOG_DEBUG(format, ...) \
|
#define SESSION_LOG_DEBUG(format, ...) \
|
||||||
fprintf(stderr, "DEBUG (session), " format "\n", ##__VA_ARGS__);
|
fprintf(stderr, "DEBUG (session), " format "\n", ##__VA_ARGS__);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct session_manager_config
|
||||||
|
{
|
||||||
|
// max session number
|
||||||
|
uint64_t max_tcp_session_num;
|
||||||
|
uint64_t max_udp_session_num;
|
||||||
|
|
||||||
|
// 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_discard; // seconds, Range: 1-15,999,999
|
||||||
|
|
||||||
|
// UDP timeout
|
||||||
|
uint64_t udp_timeout_data; // seconds, Range: 1-15,999,999
|
||||||
|
|
||||||
|
// TCP duplicate packet filter
|
||||||
|
uint8_t tcp_dupkt_filter_enable;
|
||||||
|
uint64_t tcp_dupkt_filter_capacity;
|
||||||
|
uint64_t tcp_dupkt_filter_timeout; // seconds, Range: 1-60
|
||||||
|
double tcp_dupkt_filter_error_rate;
|
||||||
|
|
||||||
|
// UDP eviction filter
|
||||||
|
uint8_t udp_eviction_filter_enable;
|
||||||
|
uint64_t udp_eviction_filter_capacity;
|
||||||
|
uint64_t udp_eviction_filter_timeout; // seconds, Range: 1-60
|
||||||
|
double udp_eviction_filter_error_rate;
|
||||||
|
};
|
||||||
|
|
||||||
struct session_manager;
|
struct session_manager;
|
||||||
struct session_manager *session_manager_create(uint64_t max_session_num);
|
struct session_manager *session_manager_create(struct session_manager_config *config);
|
||||||
void session_manager_destroy(struct session_manager *mgr);
|
void session_manager_destroy(struct session_manager *mgr);
|
||||||
|
|
||||||
void session_manager_set_timeout_toclosing(struct session_manager *mgr, uint64_t timeout_ms);
|
// only use the packet six-tuple to find the session, not update it
|
||||||
void session_manager_set_timeout_toclosed(struct session_manager *mgr, uint64_t timeout_ms);
|
struct session *session_manager_lookup_sesssion(struct session_manager *mgr, const struct packet *pkt);
|
||||||
|
/*
|
||||||
struct session *session_manager_lookup(struct session_manager *mgr, const struct packet *pkt);
|
* Return NULL in the following cases:
|
||||||
// return null: invalid tuple6 or tcp first packet is not syn
|
* 1.not a TCP or UDP packet
|
||||||
struct session *session_manager_update(struct session_manager *mgr, const struct packet *pkt);
|
* 2.TCP packet miss session but no syn packet seen
|
||||||
struct session *session_manager_expire(struct session_manager *mgr);
|
* 3.TCP duplicate packet
|
||||||
struct session *session_manager_evicte(struct session_manager *mgr);
|
* 4.TCP discards packets
|
||||||
|
* 5.UDP evict packet
|
||||||
// for debug
|
* pakcet will not update the session and needs to be fast forwarded
|
||||||
uint64_t session_manager_get_sessions(struct session_manager *mgr, enum session_type type, enum session_state state);
|
*/
|
||||||
|
struct session *session_manager_update_session(struct session_manager *mgr, const struct packet *pkt);
|
||||||
|
struct session *session_manager_get_expired_session(struct session_manager *mgr);
|
||||||
|
struct session *session_manager_get_evicted_session(struct session_manager *mgr);
|
||||||
|
// return interval (seconds) to next required update, return 0 if no session
|
||||||
|
uint64_t session_manager_get_expire_interval(struct session_manager *mgr);
|
||||||
|
uint64_t session_manager_get_session_number(struct session_manager *mgr, enum session_type type, enum session_state state);
|
||||||
|
|
||||||
#ifdef __cpluscplus
|
#ifdef __cpluscplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ enum tcp_ex_data
|
|||||||
TCP_SYN_RECVED = 1 << 0,
|
TCP_SYN_RECVED = 1 << 0,
|
||||||
TCP_SYNACK_RECVED = 1 << 1,
|
TCP_SYNACK_RECVED = 1 << 1,
|
||||||
// ESTABLISHED
|
// ESTABLISHED
|
||||||
TCP_C2S_PAYLOAD_RECVED = 1 << 2,
|
TCP_C2S_DATA_RECVED = 1 << 2,
|
||||||
TCP_S2C_PAYLOAD_RECVED = 1 << 3,
|
TCP_S2C_DATA_RECVED = 1 << 3,
|
||||||
// FIN
|
// FIN
|
||||||
TCP_C2S_FIN_RECVED = 1 << 4,
|
TCP_C2S_FIN_RECVED = 1 << 4,
|
||||||
TCP_S2C_FIN_RECVED = 1 << 5,
|
TCP_S2C_FIN_RECVED = 1 << 5,
|
||||||
@@ -49,6 +49,9 @@ struct session
|
|||||||
// session type
|
// session type
|
||||||
enum session_type type;
|
enum session_type type;
|
||||||
|
|
||||||
|
// dup traffic flag
|
||||||
|
enum dup_traffic_flag dup_flag;
|
||||||
|
|
||||||
// closing reasion
|
// closing reasion
|
||||||
enum closing_reasion closing_reasion;
|
enum closing_reasion closing_reasion;
|
||||||
|
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ int session_table_add_session(struct session_table *table, const struct tuple6 *
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void session_table_delete_session(struct session_table *table, const struct tuple6 *tuple)
|
void session_table_del_session(struct session_table *table, const struct tuple6 *tuple)
|
||||||
{
|
{
|
||||||
if (table == NULL)
|
if (table == NULL)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ void session_table_set_freecb(struct session_table *table, session_free_cb free_
|
|||||||
// return 0: success
|
// return 0: success
|
||||||
// return -1: failed
|
// return -1: failed
|
||||||
int session_table_add_session(struct session_table *table, const struct tuple6 *tuple, struct session *sess);
|
int session_table_add_session(struct session_table *table, const struct tuple6 *tuple, struct session *sess);
|
||||||
void session_table_delete_session(struct session_table *table, const struct tuple6 *tuple);
|
void session_table_del_session(struct session_table *table, const struct tuple6 *tuple);
|
||||||
struct session *session_table_find_session(struct session_table *table, const struct tuple6 *tuple);
|
struct session *session_table_find_session(struct session_table *table, const struct tuple6 *tuple);
|
||||||
struct session *session_table_find_least_recently_unused_session(struct session_table *table);
|
struct session *session_table_find_least_recently_unused_session(struct session_table *table);
|
||||||
struct session *session_table_find_least_recently_used_session(struct session_table *table);
|
struct session *session_table_find_least_recently_used_session(struct session_table *table);
|
||||||
|
|||||||
@@ -67,3 +67,9 @@ struct session *session_timer_expire_session(struct session_timer *timer, uint64
|
|||||||
struct session *sess = (struct session *)timeout->callback.arg;
|
struct session *sess = (struct session *)timeout->callback.arg;
|
||||||
return sess;
|
return sess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// return interval to next required update, return 0 if no timer
|
||||||
|
uint64_t session_timer_next_expire_interval(struct session_timer *timer)
|
||||||
|
{
|
||||||
|
return timeouts_timeout(timer->timeouts);
|
||||||
|
}
|
||||||
@@ -18,6 +18,8 @@ void session_timer_del_session(struct session_timer *timer, struct session *sess
|
|||||||
* if return session, the session will be removed from timer.
|
* if return session, the session will be removed from timer.
|
||||||
*/
|
*/
|
||||||
struct session *session_timer_expire_session(struct session_timer *timer, uint64_t abs_current_ts);
|
struct session *session_timer_expire_session(struct session_timer *timer, uint64_t abs_current_ts);
|
||||||
|
// return interval to next required update, return 0 if no timer
|
||||||
|
uint64_t session_timer_next_expire_interval(struct session_timer *timer);
|
||||||
|
|
||||||
#ifdef __cpluscplus
|
#ifdef __cpluscplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -454,7 +454,7 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_C2S_PAYLOAD)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_C2S_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_C2S_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -582,7 +582,7 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_S2C_PAYLOAD)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_S2C_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_S2C_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -708,7 +708,7 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_C2S_PAYLOAD)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -835,7 +835,7 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_S2C_PAYLOAD)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYNACK_RECVED | TCP_S2C_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYNACK_RECVED | TCP_S2C_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1043,7 +1043,7 @@ TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_SYNACK_AND_ACK_AND_C2S_PAYLOA
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1346,7 +1346,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1384,7 +1384,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1422,7 +1422,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED | TCP_S2C_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1460,7 +1460,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED | TCP_S2C_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1498,7 +1498,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED | TCP_S2C_DATA_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1536,7 +1536,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED | TCP_C2S_FIN_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED | TCP_S2C_DATA_RECVED | TCP_C2S_FIN_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1574,7 +1574,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED | TCP_C2S_FIN_RECVED | TCP_S2C_FIN_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED | TCP_S2C_DATA_RECVED | TCP_C2S_FIN_RECVED | TCP_S2C_FIN_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
@@ -1612,7 +1612,7 @@ TEST(SESSION_MANAGER, TCP_FULL_STREAM)
|
|||||||
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
|
||||||
EXPECT_TRUE(session_get0_cur_pkt(sess) == NULL);
|
EXPECT_TRUE(session_get0_cur_pkt(sess) == NULL);
|
||||||
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_NONE);
|
EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_NONE);
|
||||||
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED | TCP_C2S_FIN_RECVED | TCP_S2C_FIN_RECVED));
|
EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_DATA_RECVED | TCP_S2C_DATA_RECVED | TCP_C2S_FIN_RECVED | TCP_S2C_FIN_RECVED));
|
||||||
|
|
||||||
// check session manager info
|
// check session manager info
|
||||||
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
EXPECT_TRUE(session_manager_get_sessions(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0);
|
||||||
|
|||||||
@@ -106,17 +106,17 @@ TEST(SESSION_TABLE, OP_SESSION)
|
|||||||
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_3) == sess3);
|
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_3) == sess3);
|
||||||
|
|
||||||
// Delete
|
// Delete
|
||||||
session_table_delete_session(sess_table, &tuple_1);
|
session_table_del_session(sess_table, &tuple_1);
|
||||||
EXPECT_TRUE(session_table_get_count(sess_table) == 2);
|
EXPECT_TRUE(session_table_get_count(sess_table) == 2);
|
||||||
EXPECT_TRUE(session_table_find_session(sess_table, &tuple_1) == NULL);
|
EXPECT_TRUE(session_table_find_session(sess_table, &tuple_1) == NULL);
|
||||||
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_1) == NULL);
|
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_1) == NULL);
|
||||||
|
|
||||||
session_table_delete_session(sess_table, &reversed_tuple_2);
|
session_table_del_session(sess_table, &reversed_tuple_2);
|
||||||
EXPECT_TRUE(session_table_get_count(sess_table) == 1);
|
EXPECT_TRUE(session_table_get_count(sess_table) == 1);
|
||||||
EXPECT_TRUE(session_table_find_session(sess_table, &tuple_2) == NULL);
|
EXPECT_TRUE(session_table_find_session(sess_table, &tuple_2) == NULL);
|
||||||
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_2) == NULL);
|
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_2) == NULL);
|
||||||
|
|
||||||
session_table_delete_session(sess_table, &tuple_3);
|
session_table_del_session(sess_table, &tuple_3);
|
||||||
EXPECT_TRUE(session_table_get_count(sess_table) == 0);
|
EXPECT_TRUE(session_table_get_count(sess_table) == 0);
|
||||||
EXPECT_TRUE(session_table_find_session(sess_table, &tuple_3) == NULL);
|
EXPECT_TRUE(session_table_find_session(sess_table, &tuple_3) == NULL);
|
||||||
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_3) == NULL);
|
EXPECT_TRUE(session_table_find_session(sess_table, &reversed_tuple_3) == NULL);
|
||||||
@@ -176,15 +176,15 @@ TEST(SESSION_TABLE, FIND_OLDEST_NEWEST)
|
|||||||
|
|
||||||
// Delete Session
|
// Delete Session
|
||||||
|
|
||||||
session_table_delete_session(sess_table, &tuple_1);
|
session_table_del_session(sess_table, &tuple_1);
|
||||||
EXPECT_TRUE(session_table_find_least_recently_unused_session(sess_table) == sess2);
|
EXPECT_TRUE(session_table_find_least_recently_unused_session(sess_table) == sess2);
|
||||||
EXPECT_TRUE(session_table_find_least_recently_used_session(sess_table) == sess3);
|
EXPECT_TRUE(session_table_find_least_recently_used_session(sess_table) == sess3);
|
||||||
|
|
||||||
session_table_delete_session(sess_table, &tuple_2);
|
session_table_del_session(sess_table, &tuple_2);
|
||||||
EXPECT_TRUE(session_table_find_least_recently_unused_session(sess_table) == sess3);
|
EXPECT_TRUE(session_table_find_least_recently_unused_session(sess_table) == sess3);
|
||||||
EXPECT_TRUE(session_table_find_least_recently_used_session(sess_table) == sess3);
|
EXPECT_TRUE(session_table_find_least_recently_used_session(sess_table) == sess3);
|
||||||
|
|
||||||
session_table_delete_session(sess_table, &tuple_3);
|
session_table_del_session(sess_table, &tuple_3);
|
||||||
EXPECT_TRUE(session_table_find_least_recently_unused_session(sess_table) == NULL);
|
EXPECT_TRUE(session_table_find_least_recently_unused_session(sess_table) == NULL);
|
||||||
EXPECT_TRUE(session_table_find_least_recently_used_session(sess_table) == NULL);
|
EXPECT_TRUE(session_table_find_least_recently_used_session(sess_table) == NULL);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
add_executable(stellar stellar.cpp)
|
add_executable(stellar stellar.cpp)
|
||||||
target_link_libraries(stellar session_manager)
|
target_link_libraries(stellar session_manager pthread)
|
||||||
target_link_libraries(stellar dupkt_filter)
|
|
||||||
target_link_libraries(stellar eviction_filter)
|
|
||||||
target_link_libraries(stellar pthread)
|
|
||||||
|
|
||||||
install(TARGETS stellar RUNTIME DESTINATION bin COMPONENT Program)
|
install(TARGETS stellar RUNTIME DESTINATION bin COMPONENT Program)
|
||||||
@@ -10,8 +10,6 @@
|
|||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "timestamp.h"
|
#include "timestamp.h"
|
||||||
#include "session_manager.h"
|
#include "session_manager.h"
|
||||||
#include "dupkt_filter.h"
|
|
||||||
#include "eviction_filter.h"
|
|
||||||
|
|
||||||
#ifndef STELLAR_LOG_ERROR
|
#ifndef STELLAR_LOG_ERROR
|
||||||
#define STELLAR_LOG_ERROR(format, ...) \
|
#define STELLAR_LOG_ERROR(format, ...) \
|
||||||
@@ -32,8 +30,6 @@ struct thread_ctx
|
|||||||
uint64_t need_exit;
|
uint64_t need_exit;
|
||||||
uint64_t is_runing;
|
uint64_t is_runing;
|
||||||
struct session_manager *sess_mgr;
|
struct session_manager *sess_mgr;
|
||||||
struct dupkt_filter *dupkt_filter;
|
|
||||||
struct eviction_filter *eviction_filter;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct stellar_ctx
|
struct stellar_ctx
|
||||||
@@ -41,48 +37,16 @@ struct stellar_ctx
|
|||||||
uint64_t need_exit;
|
uint64_t need_exit;
|
||||||
uint16_t max_worker_num;
|
uint16_t max_worker_num;
|
||||||
|
|
||||||
// session manager
|
struct session_manager_config sess_mgr_cfg;
|
||||||
uint64_t sess_mgr_max_session_num;
|
|
||||||
uint64_t sess_mgr_timeout_ms_toclsoing;
|
|
||||||
uint64_t sess_mgr_timeout_ms_toclosed;
|
|
||||||
|
|
||||||
// duplicated packet filter
|
|
||||||
uint8_t dupkt_filter_enable;
|
|
||||||
unsigned int dupkt_filter_capacity;
|
|
||||||
double dupkt_filter_error_rate;
|
|
||||||
int dupkt_filter_timeout_s;
|
|
||||||
|
|
||||||
// eviction filter
|
|
||||||
uint8_t eviction_filter_enable;
|
|
||||||
unsigned int eviction_filter_capacity;
|
|
||||||
double eviction_filter_error_rate;
|
|
||||||
int eviction_filter_timeout_s;
|
|
||||||
|
|
||||||
// thread
|
|
||||||
struct thread_ctx thread_ctx[128];
|
struct thread_ctx thread_ctx[128];
|
||||||
} g_stellar_ctx = {
|
} g_stellar_ctx = {
|
||||||
.need_exit = 0,
|
.need_exit = 0,
|
||||||
.max_worker_num = 1,
|
.max_worker_num = 1,
|
||||||
|
|
||||||
// session manager
|
// TODO session manager config
|
||||||
.sess_mgr_max_session_num = 1000000,
|
|
||||||
.sess_mgr_timeout_ms_toclsoing = 1000,
|
|
||||||
.sess_mgr_timeout_ms_toclosed = 10000,
|
|
||||||
|
|
||||||
// duplicated packet filter
|
|
||||||
.dupkt_filter_enable = 1,
|
|
||||||
.dupkt_filter_capacity = 1000000,
|
|
||||||
.dupkt_filter_error_rate = 0.0001,
|
|
||||||
.dupkt_filter_timeout_s = 10,
|
|
||||||
|
|
||||||
// eviction filter
|
|
||||||
.eviction_filter_enable = 1,
|
|
||||||
.eviction_filter_capacity = 1000000,
|
|
||||||
.eviction_filter_error_rate = 0.0001,
|
|
||||||
.eviction_filter_timeout_s = 10,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO
|
|
||||||
static int recv_packet(const char **data)
|
static int recv_packet(const char **data)
|
||||||
{
|
{
|
||||||
static unsigned char packet_data[] = {
|
static unsigned char packet_data[] = {
|
||||||
@@ -96,6 +60,10 @@ static int recv_packet(const char **data)
|
|||||||
return sizeof(packet_data);
|
return sizeof(packet_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void send_packet(const char *data, uint16_t len)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static void signal_handler(int signo)
|
static void signal_handler(int signo)
|
||||||
{
|
{
|
||||||
if (signo == SIGINT)
|
if (signo == SIGINT)
|
||||||
@@ -119,11 +87,6 @@ static void signal_handler(int signo)
|
|||||||
|
|
||||||
static void __session_dispatch(struct session *sess)
|
static void __session_dispatch(struct session *sess)
|
||||||
{
|
{
|
||||||
if (sess == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("=> session dispatch: %p\n", sess);
|
printf("=> session dispatch: %p\n", sess);
|
||||||
session_dump(sess);
|
session_dump(sess);
|
||||||
@@ -141,17 +104,9 @@ static void thread_ctx_init(struct stellar_ctx *ctx)
|
|||||||
thd_ctx->index = i;
|
thd_ctx->index = i;
|
||||||
thd_ctx->need_exit = 0;
|
thd_ctx->need_exit = 0;
|
||||||
thd_ctx->is_runing = 0;
|
thd_ctx->is_runing = 0;
|
||||||
// session manager
|
|
||||||
thd_ctx->sess_mgr = session_manager_create(ctx->sess_mgr_max_session_num);
|
thd_ctx->sess_mgr = session_manager_create(&ctx->sess_mgr_cfg);
|
||||||
assert(thd_ctx->sess_mgr != NULL);
|
assert(thd_ctx->sess_mgr != NULL);
|
||||||
session_manager_set_timeout_toclosing(thd_ctx->sess_mgr, ctx->sess_mgr_timeout_ms_toclsoing);
|
|
||||||
session_manager_set_timeout_toclosed(thd_ctx->sess_mgr, ctx->sess_mgr_timeout_ms_toclosed);
|
|
||||||
// duplicated packet filter
|
|
||||||
thd_ctx->dupkt_filter = dupkt_filter_create(ctx->dupkt_filter_enable, ctx->dupkt_filter_capacity, ctx->dupkt_filter_error_rate, ctx->dupkt_filter_timeout_s);
|
|
||||||
assert(thd_ctx->dupkt_filter != NULL);
|
|
||||||
// eviction filter
|
|
||||||
thd_ctx->eviction_filter = eviction_filter_create(ctx->eviction_filter_enable, ctx->eviction_filter_capacity, ctx->eviction_filter_error_rate, ctx->eviction_filter_timeout_s);
|
|
||||||
assert(thd_ctx->eviction_filter != NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +130,6 @@ static void *thread_cycle(void *arg)
|
|||||||
struct session *sess = NULL;
|
struct session *sess = NULL;
|
||||||
struct thread_ctx *thd_ctx = (struct thread_ctx *)arg;
|
struct thread_ctx *thd_ctx = (struct thread_ctx *)arg;
|
||||||
struct session_manager *sess_mgr = thd_ctx->sess_mgr;
|
struct session_manager *sess_mgr = thd_ctx->sess_mgr;
|
||||||
struct dupkt_filter *dupkt_filter = thd_ctx->dupkt_filter;
|
|
||||||
char thread_name[16];
|
char thread_name[16];
|
||||||
|
|
||||||
ATOMIC_SET(&thd_ctx->is_runing, 1);
|
ATOMIC_SET(&thd_ctx->is_runing, 1);
|
||||||
@@ -185,60 +139,38 @@ static void *thread_cycle(void *arg)
|
|||||||
|
|
||||||
while (ATOMIC_READ(&thd_ctx->need_exit) == 0)
|
while (ATOMIC_READ(&thd_ctx->need_exit) == 0)
|
||||||
{
|
{
|
||||||
// TODO recv packet
|
|
||||||
len = recv_packet(&data);
|
len = recv_packet(&data);
|
||||||
|
if (data == NULL)
|
||||||
|
{
|
||||||
|
goto poll_wait;
|
||||||
|
}
|
||||||
|
|
||||||
// parse packet
|
|
||||||
packet_parse(&pkt, data, len);
|
packet_parse(&pkt, data, len);
|
||||||
|
sess = session_manager_update_session(sess_mgr, &pkt);
|
||||||
// duplicated packet filter
|
|
||||||
if (dupkt_filter_lookup(dupkt_filter, &pkt) == 0)
|
|
||||||
{
|
|
||||||
STELLAR_LOG_DEBUG("duplicated packet, forward it");
|
|
||||||
goto fast_forward;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eviction filter
|
|
||||||
if (eviction_filter_lookup(thd_ctx->eviction_filter, &pkt) == 0)
|
|
||||||
{
|
|
||||||
STELLAR_LOG_DEBUG("eviction packet, forward it");
|
|
||||||
goto fast_forward;
|
|
||||||
}
|
|
||||||
|
|
||||||
// update session
|
|
||||||
sess = session_manager_update(sess_mgr, &pkt);
|
|
||||||
if (sess == NULL)
|
if (sess == NULL)
|
||||||
{
|
{
|
||||||
goto fast_forward;
|
goto fast_forward;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO session synchronization
|
|
||||||
|
|
||||||
__session_dispatch(sess);
|
__session_dispatch(sess);
|
||||||
dupkt_filter_add(dupkt_filter, &pkt);
|
|
||||||
|
sess = session_manager_get_evicted_session(sess_mgr);
|
||||||
|
if (sess)
|
||||||
|
{
|
||||||
|
__session_dispatch(sess);
|
||||||
|
}
|
||||||
|
|
||||||
fast_forward:
|
fast_forward:
|
||||||
// TODO send packet
|
send_packet(data, len);
|
||||||
|
|
||||||
// dispatch expire session
|
sess = session_manager_get_expired_session(sess_mgr);
|
||||||
sess = session_manager_expire(sess_mgr);
|
if (sess)
|
||||||
if (sess && session_get_type(sess) == SESSION_TYPE_UDP && session_get_state(sess) == SESSION_STATE_CLOSING)
|
|
||||||
{
|
{
|
||||||
const struct packet *sess_1st_pkt = session_get0_1st_pkt(sess);
|
__session_dispatch(sess);
|
||||||
eviction_filter_add(thd_ctx->eviction_filter, sess_1st_pkt);
|
|
||||||
}
|
}
|
||||||
__session_dispatch(sess);
|
continue;
|
||||||
|
|
||||||
sess = session_manager_evicte(sess_mgr);
|
poll_wait:
|
||||||
if (sess && session_get_type(sess) == SESSION_TYPE_UDP)
|
sleep(session_manager_get_expire_interval(sess_mgr));
|
||||||
{
|
|
||||||
const struct packet *sess_1st_pkt = session_get0_1st_pkt(sess);
|
|
||||||
eviction_filter_add(thd_ctx->eviction_filter, sess_1st_pkt);
|
|
||||||
}
|
|
||||||
__session_dispatch(sess);
|
|
||||||
|
|
||||||
// TODO get next timeout
|
|
||||||
sleep(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ATOMIC_SET(&thd_ctx->is_runing, 0);
|
ATOMIC_SET(&thd_ctx->is_runing, 0);
|
||||||
@@ -255,18 +187,14 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// TODO init plugin
|
// TODO init plugin
|
||||||
|
|
||||||
// register signal handler
|
|
||||||
signal(SIGINT, signal_handler);
|
signal(SIGINT, signal_handler);
|
||||||
signal(SIGQUIT, signal_handler);
|
signal(SIGQUIT, signal_handler);
|
||||||
signal(SIGTERM, signal_handler);
|
signal(SIGTERM, signal_handler);
|
||||||
|
|
||||||
// update timestamp
|
|
||||||
timestamp_update();
|
timestamp_update();
|
||||||
|
|
||||||
// init thread context
|
|
||||||
thread_ctx_init(&g_stellar_ctx);
|
thread_ctx_init(&g_stellar_ctx);
|
||||||
|
|
||||||
// create worker thread
|
|
||||||
for (uint16_t i = 0; i < g_stellar_ctx.max_worker_num; i++)
|
for (uint16_t i = 0; i < g_stellar_ctx.max_worker_num; i++)
|
||||||
{
|
{
|
||||||
struct thread_ctx *thd_ctx = &g_stellar_ctx.thread_ctx[i];
|
struct thread_ctx *thd_ctx = &g_stellar_ctx.thread_ctx[i];
|
||||||
@@ -277,14 +205,12 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// master thread update timestamp
|
|
||||||
while (!g_stellar_ctx.need_exit)
|
while (!g_stellar_ctx.need_exit)
|
||||||
{
|
{
|
||||||
timestamp_update();
|
timestamp_update();
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait worker thread exit
|
|
||||||
for (uint16_t i = 0; i < g_stellar_ctx.max_worker_num; i++)
|
for (uint16_t i = 0; i < g_stellar_ctx.max_worker_num; i++)
|
||||||
{
|
{
|
||||||
struct thread_ctx *thd_ctx = &g_stellar_ctx.thread_ctx[i];
|
struct thread_ctx *thd_ctx = &g_stellar_ctx.thread_ctx[i];
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
add_library(timestamp timestamp.cpp)
|
add_library(timestamp timestamp.cpp)
|
||||||
target_include_directories(timestamp PUBLIC ${CMAKE_SOURCE_DIR}/src/timestamp)
|
target_include_directories(timestamp PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_link_libraries(timestamp)
|
target_link_libraries(timestamp)
|
||||||
|
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
add_library(tuple tuple.cpp)
|
add_library(tuple tuple.cpp)
|
||||||
target_include_directories(tuple PUBLIC ${CMAKE_SOURCE_DIR}/src/tuple)
|
target_include_directories(tuple PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_include_directories(tuple PUBLIC ${CMAKE_SOURCE_DIR}/src/crc32)
|
target_include_directories(tuple PUBLIC ${CMAKE_SOURCE_DIR}/src/crc32)
|
||||||
target_link_libraries(tuple)
|
target_link_libraries(tuple)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user