update session_manager_stat
This commit is contained in:
@@ -32,21 +32,7 @@ struct session_manager
|
||||
* session manager status
|
||||
***************************************************************/
|
||||
|
||||
// session number
|
||||
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;
|
||||
struct session_manager_stat stat;
|
||||
|
||||
// packet filter status
|
||||
uint64_t npkts_miss_l4_proto; // fast forward
|
||||
@@ -58,80 +44,108 @@ struct session_manager
|
||||
uint64_t npkts_hit_udp_evicted; // fast forward
|
||||
};
|
||||
|
||||
enum packet_flag
|
||||
enum trigger
|
||||
{
|
||||
NONE = 0,
|
||||
|
||||
// packet
|
||||
TCP_SYN = 1 << 0,
|
||||
TCP_SYN_ACK = 1 << 1,
|
||||
TCP_FIN = 1 << 2,
|
||||
TCP_FIN = 1 << 2, // only fist fin
|
||||
TCP_RST = 1 << 3,
|
||||
TCP_DATA = 1 << 4,
|
||||
UDP_DATA = 1 << 5,
|
||||
|
||||
// session timeout
|
||||
TIMEOUT = 1 << 6,
|
||||
|
||||
// session table full evict
|
||||
LRU_EVICT = 1 << 7,
|
||||
};
|
||||
|
||||
/*
|
||||
* session finite state machine
|
||||
*
|
||||
* SESSION_STATE_INIT -> SESSION_STATE_INIT ( NONE )
|
||||
* SESSION_STATE_INIT -> SESSION_STATE_OPENING ( TCP_SYN | TCP_SYN_ACK | UDP_DATA )
|
||||
*
|
||||
* SESSION_STATE_OPENING -> SESSION_STATE_OPENING ( NONE )
|
||||
* SESSION_STATE_OPENING -> SESSION_STATE_ACTIVE ( TCP_DATA | UDP_DATA )
|
||||
* SESSION_STATE_OPENING -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
|
||||
* SESSION_STATE_OPENING -> SESSION_STATE_CLOSED ( LRU_EVICT )
|
||||
*
|
||||
* SESSION_STATE_ACTIVE -> SESSION_STATE_ACTIVE ( NONE )
|
||||
* SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
|
||||
* SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSED ( LRU_EVICT )
|
||||
*
|
||||
* SESSION_STATE_CLOSING -> SESSION_STATE_CLOSING ( NONE )
|
||||
* SESSION_STATE_CLOSING -> SESSION_STATE_CLOSED ( TIMEOUT | LRU_EVICT )
|
||||
*/
|
||||
|
||||
struct session_finite_state_machine
|
||||
{
|
||||
int flag_mask;
|
||||
int next_state;
|
||||
int trigger_mask;
|
||||
enum session_state next_state;
|
||||
} sess_fsm[SESSION_STATE_MAX][8];
|
||||
|
||||
void session_finite_state_machine_init()
|
||||
{
|
||||
// SESSION_STATE_INIT -> SESSION_STATE_OPENING
|
||||
// SESSION_STATE_INIT -> SESSION_STATE_INIT
|
||||
// SESSION_STATE_INIT -> SESSION_STATE_OPENING ( TCP_SYN | TCP_SYN_ACK | UDP_DATA )
|
||||
// SESSION_STATE_INIT -> SESSION_STATE_INIT ( NONE )
|
||||
|
||||
sess_fsm[SESSION_STATE_INIT][0].flag_mask = TCP_SYN | TCP_SYN_ACK | UDP_DATA;
|
||||
sess_fsm[SESSION_STATE_INIT][0].trigger_mask = TCP_SYN | TCP_SYN_ACK | UDP_DATA;
|
||||
sess_fsm[SESSION_STATE_INIT][0].next_state = SESSION_STATE_OPENING;
|
||||
|
||||
sess_fsm[SESSION_STATE_INIT][1].flag_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_INIT][1].trigger_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_INIT][1].next_state = SESSION_STATE_INIT;
|
||||
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_ACTIVE
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_CLOSING
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_CLOSED
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_OPENING
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_ACTIVE ( TCP_DATA | UDP_DATA )
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_CLOSED ( LRU_EVICT )
|
||||
// SESSION_STATE_OPENING -> SESSION_STATE_OPENING ( NONE )
|
||||
|
||||
sess_fsm[SESSION_STATE_OPENING][0].flag_mask = TCP_DATA | UDP_DATA;
|
||||
sess_fsm[SESSION_STATE_OPENING][0].trigger_mask = TCP_DATA | UDP_DATA;
|
||||
sess_fsm[SESSION_STATE_OPENING][0].next_state = SESSION_STATE_ACTIVE;
|
||||
|
||||
sess_fsm[SESSION_STATE_OPENING][1].flag_mask = TCP_FIN | TCP_RST;
|
||||
sess_fsm[SESSION_STATE_OPENING][1].trigger_mask = TCP_FIN | TCP_RST | TIMEOUT;
|
||||
sess_fsm[SESSION_STATE_OPENING][1].next_state = SESSION_STATE_CLOSING;
|
||||
|
||||
sess_fsm[SESSION_STATE_OPENING][2].flag_mask = TIMEOUT;
|
||||
sess_fsm[SESSION_STATE_OPENING][2].trigger_mask = LRU_EVICT;
|
||||
sess_fsm[SESSION_STATE_OPENING][2].next_state = SESSION_STATE_CLOSED;
|
||||
|
||||
sess_fsm[SESSION_STATE_OPENING][3].flag_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_OPENING][3].trigger_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_OPENING][3].next_state = SESSION_STATE_OPENING;
|
||||
|
||||
// SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSING
|
||||
// SESSION_STATE_ACTIVE -> SESSION_STATE_ACTIVE
|
||||
// SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSING ( TCP_FIN | TCP_RST | TIMEOUT )
|
||||
// SESSION_STATE_ACTIVE -> SESSION_STATE_CLOSED ( LRU_EVICT )
|
||||
// SESSION_STATE_ACTIVE -> SESSION_STATE_ACTIVE ( NONE )
|
||||
|
||||
sess_fsm[SESSION_STATE_ACTIVE][0].flag_mask = TCP_FIN | TCP_RST | TIMEOUT;
|
||||
sess_fsm[SESSION_STATE_ACTIVE][0].trigger_mask = TCP_FIN | TCP_RST | TIMEOUT;
|
||||
sess_fsm[SESSION_STATE_ACTIVE][0].next_state = SESSION_STATE_CLOSING;
|
||||
|
||||
sess_fsm[SESSION_STATE_ACTIVE][1].flag_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_ACTIVE][1].next_state = SESSION_STATE_ACTIVE;
|
||||
sess_fsm[SESSION_STATE_ACTIVE][1].trigger_mask = LRU_EVICT;
|
||||
sess_fsm[SESSION_STATE_ACTIVE][1].next_state = SESSION_STATE_CLOSED;
|
||||
|
||||
// SESSION_STATE_CLOSING -> SESSION_STATE_CLOSED
|
||||
// SESSION_STATE_CLOSING -> SESSION_STATE_CLOSING
|
||||
sess_fsm[SESSION_STATE_ACTIVE][2].trigger_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_ACTIVE][2].next_state = SESSION_STATE_ACTIVE;
|
||||
|
||||
sess_fsm[SESSION_STATE_CLOSING][0].flag_mask = TIMEOUT;
|
||||
// SESSION_STATE_CLOSING -> SESSION_STATE_CLOSED ( TIMEOUT | LRU_EVICT )
|
||||
// SESSION_STATE_CLOSING -> SESSION_STATE_CLOSING ( NONE )
|
||||
|
||||
sess_fsm[SESSION_STATE_CLOSING][0].trigger_mask = TIMEOUT | LRU_EVICT;
|
||||
sess_fsm[SESSION_STATE_CLOSING][0].next_state = SESSION_STATE_CLOSED;
|
||||
|
||||
sess_fsm[SESSION_STATE_CLOSING][1].flag_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_CLOSING][1].trigger_mask = NONE;
|
||||
sess_fsm[SESSION_STATE_CLOSING][1].next_state = SESSION_STATE_CLOSING;
|
||||
|
||||
// SESSION_STATE_CLOSED -> SESSION_STATE_INIT
|
||||
}
|
||||
|
||||
int session_finite_state_machine_run(enum session_state curr_state, int input_pkt_flag)
|
||||
enum session_state session_finite_state_machine_run(enum session_state curr_state, enum trigger trigger)
|
||||
{
|
||||
struct session_finite_state_machine *list = sess_fsm[curr_state];
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int mask = list[i].flag_mask;
|
||||
if (mask & input_pkt_flag)
|
||||
int mask = list[i].trigger_mask;
|
||||
if (mask & trigger)
|
||||
{
|
||||
return list[i].next_state;
|
||||
}
|
||||
@@ -582,13 +596,13 @@ static inline void session_manager_update_session_state(struct session_manager *
|
||||
switch (session_get_state(sess))
|
||||
{
|
||||
case SESSION_STATE_OPENING:
|
||||
mgr->tcp_opening_sess_num--;
|
||||
mgr->stat.tcp_opening_sess_num--;
|
||||
break;
|
||||
case SESSION_STATE_ACTIVE:
|
||||
mgr->tcp_active_sess_num--;
|
||||
mgr->stat.tcp_active_sess_num--;
|
||||
break;
|
||||
case SESSION_STATE_CLOSING:
|
||||
mgr->tcp_closing_sess_num--;
|
||||
mgr->stat.tcp_closing_sess_num--;
|
||||
break;
|
||||
case SESSION_STATE_CLOSED:
|
||||
/* void */
|
||||
@@ -601,17 +615,17 @@ static inline void session_manager_update_session_state(struct session_manager *
|
||||
switch (state)
|
||||
{
|
||||
case SESSION_STATE_OPENING:
|
||||
mgr->tcp_opening_sess_num++;
|
||||
mgr->tcp_sess_num++;
|
||||
mgr->stat.tcp_opening_sess_num++;
|
||||
mgr->stat.tcp_sess_num++;
|
||||
break;
|
||||
case SESSION_STATE_ACTIVE:
|
||||
mgr->tcp_active_sess_num++;
|
||||
mgr->stat.tcp_active_sess_num++;
|
||||
break;
|
||||
case SESSION_STATE_CLOSING:
|
||||
mgr->tcp_closing_sess_num++;
|
||||
mgr->stat.tcp_closing_sess_num++;
|
||||
break;
|
||||
case SESSION_STATE_CLOSED:
|
||||
mgr->tcp_sess_num--;
|
||||
mgr->stat.tcp_sess_num--;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -623,13 +637,13 @@ static inline void session_manager_update_session_state(struct session_manager *
|
||||
switch (session_get_state(sess))
|
||||
{
|
||||
case SESSION_STATE_OPENING:
|
||||
mgr->udp_opening_sess_num--;
|
||||
mgr->stat.udp_opening_sess_num--;
|
||||
break;
|
||||
case SESSION_STATE_ACTIVE:
|
||||
mgr->udp_active_sess_num--;
|
||||
mgr->stat.udp_active_sess_num--;
|
||||
break;
|
||||
case SESSION_STATE_CLOSING:
|
||||
mgr->udp_closing_sess_num--;
|
||||
mgr->stat.udp_closing_sess_num--;
|
||||
break;
|
||||
case SESSION_STATE_CLOSED:
|
||||
/* void */
|
||||
@@ -642,17 +656,17 @@ static inline void session_manager_update_session_state(struct session_manager *
|
||||
switch (state)
|
||||
{
|
||||
case SESSION_STATE_OPENING:
|
||||
mgr->udp_opening_sess_num++;
|
||||
mgr->udp_sess_num++;
|
||||
mgr->stat.udp_opening_sess_num++;
|
||||
mgr->stat.udp_sess_num++;
|
||||
break;
|
||||
case SESSION_STATE_ACTIVE:
|
||||
mgr->udp_active_sess_num++;
|
||||
mgr->stat.udp_active_sess_num++;
|
||||
break;
|
||||
case SESSION_STATE_CLOSING:
|
||||
mgr->udp_closing_sess_num++;
|
||||
mgr->stat.udp_closing_sess_num++;
|
||||
break;
|
||||
case SESSION_STATE_CLOSED:
|
||||
mgr->udp_sess_num--;
|
||||
mgr->stat.udp_sess_num--;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -887,20 +901,20 @@ static inline struct session *session_manager_new_tcp_session(struct session_man
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (mgr->tcp_sess_num >= mgr->opts.max_tcp_session_num - RX_BURST_MAX - 1)
|
||||
if (mgr->stat.tcp_sess_num >= mgr->opts.max_tcp_session_num - RX_BURST_MAX - 1)
|
||||
{
|
||||
if (mgr->opts.tcp_overload_evict_old_sess)
|
||||
{
|
||||
struct session *evicted_sess = session_table_find_least_recently_unused_session(mgr->tcp_sess_table);
|
||||
assert(evicted_sess);
|
||||
session_manager_evicte_session(mgr, evicted_sess);
|
||||
mgr->tcp_overload_evict_old_sess_num++;
|
||||
mgr->stat.tcp_overload_evict_old_sess_num++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mgr->tcp_sess_num >= mgr->opts.max_tcp_session_num)
|
||||
if (mgr->stat.tcp_sess_num >= mgr->opts.max_tcp_session_num)
|
||||
{
|
||||
mgr->tcp_overload_evict_new_sess_num++;
|
||||
mgr->stat.tcp_overload_evict_new_sess_num++;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
@@ -938,20 +952,20 @@ static inline struct session *session_manager_new_udp_session(struct session_man
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (mgr->udp_sess_num >= mgr->opts.max_udp_session_num - RX_BURST_MAX - 1)
|
||||
if (mgr->stat.udp_sess_num >= mgr->opts.max_udp_session_num - RX_BURST_MAX - 1)
|
||||
{
|
||||
if (mgr->opts.udp_overload_evict_old_sess)
|
||||
{
|
||||
struct session *evicted_sess = session_table_find_least_recently_unused_session(mgr->udp_sess_table);
|
||||
assert(evicted_sess);
|
||||
session_manager_evicte_session(mgr, evicted_sess);
|
||||
mgr->udp_overload_evict_old_sess_num++;
|
||||
mgr->stat.udp_overload_evict_old_sess_num++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mgr->udp_sess_num >= mgr->opts.max_udp_session_num)
|
||||
if (mgr->stat.udp_sess_num >= mgr->opts.max_udp_session_num)
|
||||
{
|
||||
mgr->udp_overload_evict_new_sess_num++;
|
||||
mgr->stat.udp_overload_evict_new_sess_num++;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
@@ -1333,20 +1347,20 @@ void session_manager_print_stat(struct session_manager *mgr)
|
||||
{
|
||||
printf("session manager status:\n");
|
||||
|
||||
printf("tcp session number : %lu\n", mgr->tcp_sess_num);
|
||||
printf(" opening number : %lu\n", mgr->tcp_opening_sess_num);
|
||||
printf(" active number : %lu\n", mgr->tcp_active_sess_num);
|
||||
printf(" closing number : %lu\n", mgr->tcp_closing_sess_num);
|
||||
printf("udp session number : %lu\n", mgr->udp_sess_num);
|
||||
printf(" opening number : %lu\n", mgr->udp_opening_sess_num);
|
||||
printf(" active number : %lu\n", mgr->udp_active_sess_num);
|
||||
printf(" closing number : %lu\n", mgr->udp_closing_sess_num);
|
||||
printf("tcp session number : %lu\n", mgr->stat.tcp_sess_num);
|
||||
printf(" opening number : %lu\n", mgr->stat.tcp_opening_sess_num);
|
||||
printf(" active number : %lu\n", mgr->stat.tcp_active_sess_num);
|
||||
printf(" closing number : %lu\n", mgr->stat.tcp_closing_sess_num);
|
||||
printf("udp session number : %lu\n", mgr->stat.udp_sess_num);
|
||||
printf(" opening number : %lu\n", mgr->stat.udp_opening_sess_num);
|
||||
printf(" active number : %lu\n", mgr->stat.udp_active_sess_num);
|
||||
printf(" closing number : %lu\n", mgr->stat.udp_closing_sess_num);
|
||||
printf("tcp overload evict : \n");
|
||||
printf(" old session number: %lu\n", mgr->tcp_overload_evict_old_sess_num);
|
||||
printf(" new session number: %lu\n", mgr->tcp_overload_evict_new_sess_num);
|
||||
printf(" old session number: %lu\n", mgr->stat.tcp_overload_evict_old_sess_num);
|
||||
printf(" new session number: %lu\n", mgr->stat.tcp_overload_evict_new_sess_num);
|
||||
printf("udp overload evict : \n");
|
||||
printf(" old session number: %lu\n", mgr->udp_overload_evict_old_sess_num);
|
||||
printf(" new session number: %lu\n", mgr->udp_overload_evict_new_sess_num);
|
||||
printf(" old session number: %lu\n", mgr->stat.udp_overload_evict_old_sess_num);
|
||||
printf(" new session number: %lu\n", mgr->stat.udp_overload_evict_new_sess_num);
|
||||
|
||||
printf("packet status:\n");
|
||||
printf(" miss l4 proto : %lu (bypass)\n", mgr->npkts_miss_l4_proto);
|
||||
@@ -1358,20 +1372,7 @@ void session_manager_print_stat(struct session_manager *mgr)
|
||||
printf(" hit udp evicted : %lu (bypass)\n", mgr->npkts_hit_udp_evicted);
|
||||
}
|
||||
|
||||
void session_manager_get_stat(struct session_manager *mgr, struct session_manager_stat *out)
|
||||
struct session_manager_stat *session_manager_get_stat(struct session_manager *mgr)
|
||||
{
|
||||
out->tcp_sess_num = mgr->tcp_sess_num;
|
||||
out->tcp_opening_sess_num = mgr->tcp_opening_sess_num;
|
||||
out->tcp_active_sess_num = mgr->tcp_active_sess_num;
|
||||
out->tcp_closing_sess_num = mgr->tcp_closing_sess_num;
|
||||
|
||||
out->udp_sess_num = mgr->udp_sess_num;
|
||||
out->udp_opening_sess_num = mgr->udp_opening_sess_num;
|
||||
out->udp_active_sess_num = mgr->udp_active_sess_num;
|
||||
out->udp_closing_sess_num = mgr->udp_closing_sess_num;
|
||||
|
||||
out->tcp_overload_evict_old_sess_num = mgr->tcp_overload_evict_old_sess_num;
|
||||
out->tcp_overload_evict_new_sess_num = mgr->tcp_overload_evict_new_sess_num;
|
||||
out->udp_overload_evict_old_sess_num = mgr->udp_overload_evict_old_sess_num;
|
||||
out->udp_overload_evict_new_sess_num = mgr->udp_overload_evict_new_sess_num;
|
||||
return &mgr->stat;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user