session_get_tcp_segment() and session_free_tcp_segment() support asynchronous calls

This commit is contained in:
luwenpeng
2024-05-15 17:45:08 +08:00
parent 00df68695e
commit 44c2cf86e4
3 changed files with 6 additions and 2 deletions

View File

@@ -210,8 +210,9 @@ struct tcp_segment *session_get_tcp_segment(struct session *sess)
enum flow_direction dir = session_get_current_flow_direction(sess); enum flow_direction dir = session_get_current_flow_direction(sess);
struct tcp_half *half = &sess->tcp_halfs[dir]; 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; return &half->in_order;
} }
else else

View File

@@ -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.data = tcp_layer->pld_ptr;
half->in_order.len = len; half->in_order.len = len;
half->in_order_ref = 0;
} }
return; 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.data = tcp_layer->pld_ptr;
half->in_order.len = len; half->in_order.len = len;
half->in_order_ref = 0;
tcp_reassembly_inc_recv_next(half->assembler, len); tcp_reassembly_inc_recv_next(half->assembler, len);
} }
// retransmission // retransmission

View File

@@ -25,6 +25,7 @@ struct tcp_half
{ {
struct tcp_reassembly *assembler; struct tcp_reassembly *assembler;
struct tcp_segment in_order; struct tcp_segment in_order;
uint32_t in_order_ref;
uint32_t seq; uint32_t seq;
uint32_t ack; uint32_t ack;