Add session_set_discard
This commit is contained in:
@@ -700,6 +700,7 @@ static struct session *session_manager_new_tcp_session(struct session_manager *m
|
||||
return NULL;
|
||||
}
|
||||
session_init(sess);
|
||||
sess->mgr = mgr;
|
||||
sess->mgr_stat = &mgr->stat;
|
||||
|
||||
enum session_state next_state = session_transition_run(SESSION_STATE_INIT, TCP_SYN);
|
||||
@@ -746,6 +747,7 @@ static struct session *session_manager_new_udp_session(struct session_manager *m
|
||||
return NULL;
|
||||
}
|
||||
session_init(sess);
|
||||
sess->mgr = mgr;
|
||||
sess->mgr_stat = &mgr->stat;
|
||||
|
||||
enum flow_direction dir = identify_direction_by_port(ntohs(key->src_port), ntohs(key->dst_port));
|
||||
@@ -1168,3 +1170,29 @@ struct session_manager_stat *session_manager_stat(struct session_manager *mgr)
|
||||
{
|
||||
return &mgr->stat;
|
||||
}
|
||||
|
||||
void session_set_discard(struct session *sess)
|
||||
{
|
||||
uint64_t now = stellar_get_monotonic_time_msec();
|
||||
struct session_manager *mgr = sess->mgr;
|
||||
enum session_type type = session_get_type(sess);
|
||||
enum session_state curr_state = session_get_current_state(sess);
|
||||
enum session_state next_state = session_transition_run(curr_state, USER_CLOSE);
|
||||
session_transition_log(sess, curr_state, next_state, USER_CLOSE);
|
||||
session_set_current_state(sess, next_state);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SESSION_TYPE_TCP:
|
||||
session_timer_update(mgr->sess_timer, sess, now + mgr->opts.tcp_discard_timeout);
|
||||
SESS_MGR_STAT_UPDATE(&mgr->stat, curr_state, next_state, tcp);
|
||||
break;
|
||||
case SESSION_TYPE_UDP:
|
||||
session_timer_update(mgr->sess_timer, sess, now + mgr->opts.udp_discard_timeout);
|
||||
SESS_MGR_STAT_UPDATE(&mgr->stat, curr_state, next_state, udp);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,6 +76,7 @@ struct session
|
||||
enum session_type type;
|
||||
enum session_state state;
|
||||
enum closing_reason reason;
|
||||
struct session_manager *mgr;
|
||||
struct session_manager_stat *mgr_stat;
|
||||
};
|
||||
|
||||
|
||||
@@ -178,6 +178,10 @@ static void *work_thread(void *arg)
|
||||
|
||||
fast_path:
|
||||
plugin_manager_on_session_egress(sess, pkt);
|
||||
if (sess && session_get_current_state(sess) == SESSION_STATE_DISCARD)
|
||||
{
|
||||
packet_set_action(pkt, PACKET_ACTION_DROP);
|
||||
}
|
||||
update_session_stat(sess, pkt);
|
||||
if (packet_get_action(pkt) == PACKET_ACTION_DROP)
|
||||
{
|
||||
@@ -218,11 +222,7 @@ static void *work_thread(void *arg)
|
||||
|
||||
merge_thread_stat(thread, now);
|
||||
ip_reassembly_expire(ip_reass, now);
|
||||
|
||||
// TODO
|
||||
plugin_manager_on_polling(runtime->plug_mgr);
|
||||
// session_manager_cron();
|
||||
// poll_non_packet_events();
|
||||
|
||||
if (nr_recv == 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user