diff --git a/conf/stellar.toml b/conf/stellar.toml index 5cf9e2e..95956c1 100644 --- a/conf/stellar.toml +++ b/conf/stellar.toml @@ -52,4 +52,4 @@ evicted_session_filter_error_rate = 0.00001 # range: [0.0, 1.0] # TCP reassembly (Per direction) tcp_reassembly_enable = 1 tcp_reassembly_max_timeout = 10000 # range: [1, 60000] (ms) -tcp_reassembly_max_segments = 32 # 0: unlimited \ No newline at end of file +tcp_reassembly_max_segments = 32 # range: [2, 32] \ No newline at end of file diff --git a/src/session/session.h b/src/session/session.h index 953ed65..8d96d05 100644 --- a/src/session/session.h +++ b/src/session/session.h @@ -99,6 +99,7 @@ struct tcp_half // the TCP protocol control block struct tcp_pcb { + uint8_t tcp_reassembly_enable; struct tcp_half c2s; struct tcp_half s2c; }; diff --git a/src/session/session_manager.cpp b/src/session/session_manager.cpp index 82edb81..ee9bc4e 100644 --- a/src/session/session_manager.cpp +++ b/src/session/session_manager.cpp @@ -30,8 +30,7 @@ struct session_manager #define EVICTE_SESSION_BURST (RX_BURST_MAX) -// TODO -int check_options(const struct session_manager_options *opts) +static int check_options(const struct session_manager_options *opts) { 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) { - if (pcb) + if (pcb && pcb->tcp_reassembly_enable) { tcp_reassembly_free(pcb->c2s.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->s2c.assembler = tcp_reassembly_new(max_timeout, max_seg_num); + pcb->tcp_reassembly_enable = tcp_reassembly_enable; + 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) { 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->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) { 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) { half->nr_seg_received++; + uint32_t rcv_nxt = tcp_reassembly_get_recv_next(half->assembler); 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_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); session_pool_push(mgr->sess_pool, sess); diff --git a/src/session/session_manager.h b/src/session/session_manager.h index e480dca..533a781 100644 --- a/src/session/session_manager.h +++ b/src/session/session_manager.h @@ -46,7 +46,7 @@ struct session_manager_options double evicted_session_filter_error_rate; // range: [0.0, 1.0] // 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_segments; // range: [2, 32] };