When tcp reassembly is turned off, all tcp segments are considered in order
This commit is contained in:
@@ -52,4 +52,4 @@ evicted_session_filter_error_rate = 0.00001 # range: [0.0, 1.0]
|
|||||||
# TCP reassembly (Per direction)
|
# TCP reassembly (Per direction)
|
||||||
tcp_reassembly_enable = 1
|
tcp_reassembly_enable = 1
|
||||||
tcp_reassembly_max_timeout = 10000 # range: [1, 60000] (ms)
|
tcp_reassembly_max_timeout = 10000 # range: [1, 60000] (ms)
|
||||||
tcp_reassembly_max_segments = 32 # 0: unlimited
|
tcp_reassembly_max_segments = 32 # range: [2, 32]
|
||||||
@@ -99,6 +99,7 @@ struct tcp_half
|
|||||||
// the TCP protocol control block
|
// the TCP protocol control block
|
||||||
struct tcp_pcb
|
struct tcp_pcb
|
||||||
{
|
{
|
||||||
|
uint8_t tcp_reassembly_enable;
|
||||||
struct tcp_half c2s;
|
struct tcp_half c2s;
|
||||||
struct tcp_half s2c;
|
struct tcp_half s2c;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -30,8 +30,7 @@ struct session_manager
|
|||||||
|
|
||||||
#define EVICTE_SESSION_BURST (RX_BURST_MAX)
|
#define EVICTE_SESSION_BURST (RX_BURST_MAX)
|
||||||
|
|
||||||
// TODO
|
static int check_options(const struct session_manager_options *opts)
|
||||||
int check_options(const struct session_manager_options *opts)
|
|
||||||
{
|
{
|
||||||
if (opts == NULL)
|
if (opts == NULL)
|
||||||
{
|
{
|
||||||
@@ -168,17 +167,23 @@ static inline bool before(uint32_t seq1, uint32_t seq2)
|
|||||||
|
|
||||||
static void tcp_pcb_clean(struct tcp_pcb *pcb)
|
static void tcp_pcb_clean(struct tcp_pcb *pcb)
|
||||||
{
|
{
|
||||||
if (pcb)
|
if (pcb && pcb->tcp_reassembly_enable)
|
||||||
{
|
{
|
||||||
tcp_reassembly_free(pcb->c2s.assembler);
|
tcp_reassembly_free(pcb->c2s.assembler);
|
||||||
tcp_reassembly_free(pcb->s2c.assembler);
|
tcp_reassembly_free(pcb->s2c.assembler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tcp_pcb_init(struct tcp_pcb *pcb, uint64_t max_timeout, uint64_t max_seg_num)
|
static int tcp_pcb_init(struct tcp_pcb *pcb, uint8_t tcp_reassembly_enable, uint64_t tcp_reassembly_max_timeout, uint64_t tcp_reassembly_max_segments)
|
||||||
{
|
{
|
||||||
pcb->c2s.assembler = tcp_reassembly_new(max_timeout, max_seg_num);
|
pcb->tcp_reassembly_enable = tcp_reassembly_enable;
|
||||||
pcb->s2c.assembler = tcp_reassembly_new(max_timeout, max_seg_num);
|
if (pcb->tcp_reassembly_enable == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcb->c2s.assembler = tcp_reassembly_new(tcp_reassembly_max_timeout, tcp_reassembly_max_segments);
|
||||||
|
pcb->s2c.assembler = tcp_reassembly_new(tcp_reassembly_max_timeout, tcp_reassembly_max_segments);
|
||||||
if (pcb->c2s.assembler == NULL || pcb->s2c.assembler == NULL)
|
if (pcb->c2s.assembler == NULL || pcb->s2c.assembler == NULL)
|
||||||
{
|
{
|
||||||
tcp_pcb_clean(pcb);
|
tcp_pcb_clean(pcb);
|
||||||
@@ -199,6 +204,18 @@ static void tcp_pcb_update(struct tcp_pcb *pcb, enum session_dir dir, const stru
|
|||||||
half->seq = tcp_hdr_get_seq(hdr);
|
half->seq = tcp_hdr_get_seq(hdr);
|
||||||
half->ack = tcp_hdr_get_ack(hdr);
|
half->ack = tcp_hdr_get_ack(hdr);
|
||||||
|
|
||||||
|
if (pcb->tcp_reassembly_enable == 0)
|
||||||
|
{
|
||||||
|
if (tcp_layer->pld_len)
|
||||||
|
{
|
||||||
|
half->nr_seg_received++;
|
||||||
|
half->nr_seg_inorder++;
|
||||||
|
half->order.data = tcp_layer->pld_ptr;
|
||||||
|
half->order.len = tcp_layer->pld_len;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & TH_SYN)
|
if (flags & TH_SYN)
|
||||||
{
|
{
|
||||||
tcp_reassembly_set_recv_next(half->assembler, half->seq + 1);
|
tcp_reassembly_set_recv_next(half->assembler, half->seq + 1);
|
||||||
@@ -215,6 +232,7 @@ static void tcp_pcb_update(struct tcp_pcb *pcb, enum session_dir dir, const stru
|
|||||||
if (tcp_layer->pld_len)
|
if (tcp_layer->pld_len)
|
||||||
{
|
{
|
||||||
half->nr_seg_received++;
|
half->nr_seg_received++;
|
||||||
|
|
||||||
uint32_t rcv_nxt = tcp_reassembly_get_recv_next(half->assembler);
|
uint32_t rcv_nxt = tcp_reassembly_get_recv_next(half->assembler);
|
||||||
if (half->seq == rcv_nxt)
|
if (half->seq == rcv_nxt)
|
||||||
{
|
{
|
||||||
@@ -607,7 +625,7 @@ static struct session *session_manager_new_tcp_session(struct session_manager *m
|
|||||||
session_init(sess);
|
session_init(sess);
|
||||||
session_set_id(sess, id_generator_alloc());
|
session_set_id(sess, id_generator_alloc());
|
||||||
|
|
||||||
if (tcp_pcb_init(&sess->tcp_pcb, mgr->opts.tcp_reassembly_max_timeout, mgr->opts.tcp_reassembly_max_segments) == -1)
|
if (tcp_pcb_init(&sess->tcp_pcb, mgr->opts.tcp_reassembly_enable, mgr->opts.tcp_reassembly_max_timeout, mgr->opts.tcp_reassembly_max_segments) == -1)
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
session_pool_push(mgr->sess_pool, sess);
|
session_pool_push(mgr->sess_pool, sess);
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ struct session_manager_options
|
|||||||
double evicted_session_filter_error_rate; // range: [0.0, 1.0]
|
double evicted_session_filter_error_rate; // range: [0.0, 1.0]
|
||||||
|
|
||||||
// TCP reassembly
|
// TCP reassembly
|
||||||
uint8_t tcp_reassembly_enable; // TODO not support
|
uint8_t tcp_reassembly_enable;
|
||||||
uint32_t tcp_reassembly_max_timeout; // range: [1, 60000] (ms)
|
uint32_t tcp_reassembly_max_timeout; // range: [1, 60000] (ms)
|
||||||
uint32_t tcp_reassembly_max_segments; // range: [2, 32]
|
uint32_t tcp_reassembly_max_segments; // range: [2, 32]
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user