Add state to the on_session_message parameter.
* When state is closed, it implies that packet is null and the session will be destroyed
This commit is contained in:
@@ -5,6 +5,9 @@
|
||||
void session_init(struct session *sess)
|
||||
{
|
||||
memset(sess, 0, sizeof(struct session));
|
||||
sess->empty_seg.data = NULL;
|
||||
sess->empty_seg.len = 0;
|
||||
sess->empty_seg.user_data = sess;
|
||||
}
|
||||
|
||||
void session_set_id(struct session *sess, uint64_t id)
|
||||
@@ -205,12 +208,12 @@ struct tcp_segment *session_get_tcp_segment(struct session *sess)
|
||||
enum flow_type type = session_get_flow_type(sess);
|
||||
struct tcp_half *half = &sess->tcp_halfs[type];
|
||||
|
||||
if (half->in_order.data != NULL && half->in_order.len > 0 && half->in_order_ref == 0)
|
||||
if (half->inorder_seg.data != NULL && half->inorder_seg.len > 0 && !half->inorder_seg_consumed)
|
||||
{
|
||||
sess->sess_mgr_stat->tcp_segs_consumed++;
|
||||
half->in_order_ref++;
|
||||
half->in_order.user_data = sess;
|
||||
return &half->in_order;
|
||||
half->inorder_seg_consumed = 1;
|
||||
half->inorder_seg.user_data = sess;
|
||||
return &half->inorder_seg;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -236,15 +239,23 @@ void session_free_tcp_segment(struct session *sess, struct tcp_segment *seg)
|
||||
return;
|
||||
}
|
||||
|
||||
// empty segment for end of session
|
||||
if (seg == &sess->empty_seg)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
enum flow_type type = session_get_flow_type(sess);
|
||||
struct tcp_half *half = &sess->tcp_halfs[type];
|
||||
|
||||
if (seg == &half->in_order)
|
||||
// in order segment
|
||||
if (seg == &half->inorder_seg)
|
||||
{
|
||||
half->in_order.data = NULL;
|
||||
half->in_order.len = 0;
|
||||
half->inorder_seg.data = NULL;
|
||||
half->inorder_seg.len = 0;
|
||||
return;
|
||||
}
|
||||
// tcp reassembly segment
|
||||
else
|
||||
{
|
||||
session_inc_stat(sess, type, STAT_TCP_SEGMENTS_RELEASED, 1);
|
||||
|
||||
Reference in New Issue
Block a user