session_get_tcp_segment() and session_free_tcp_segment() support asynchronous calls
This commit is contained in:
@@ -210,8 +210,9 @@ struct tcp_segment *session_get_tcp_segment(struct session *sess)
|
||||
enum flow_direction dir = session_get_current_flow_direction(sess);
|
||||
struct tcp_half *half = &sess->tcp_halfs[dir];
|
||||
|
||||
if (half->in_order.data != NULL && half->in_order.len > 0)
|
||||
if (half->in_order.data != NULL && half->in_order.len > 0 && half->in_order_ref == 0)
|
||||
{
|
||||
half->in_order_ref++;
|
||||
return &half->in_order;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -305,6 +305,7 @@ static void tcp_update(struct session_manager *mgr, struct session *sess, enum f
|
||||
|
||||
half->in_order.data = tcp_layer->pld_ptr;
|
||||
half->in_order.len = len;
|
||||
half->in_order_ref = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -345,6 +346,7 @@ static void tcp_update(struct session_manager *mgr, struct session *sess, enum f
|
||||
|
||||
half->in_order.data = tcp_layer->pld_ptr;
|
||||
half->in_order.len = len;
|
||||
half->in_order_ref = 0;
|
||||
tcp_reassembly_inc_recv_next(half->assembler, len);
|
||||
}
|
||||
// retransmission
|
||||
|
||||
@@ -25,6 +25,7 @@ struct tcp_half
|
||||
{
|
||||
struct tcp_reassembly *assembler;
|
||||
struct tcp_segment in_order;
|
||||
uint32_t in_order_ref;
|
||||
|
||||
uint32_t seq;
|
||||
uint32_t ack;
|
||||
|
||||
Reference in New Issue
Block a user