summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2024-04-08 12:10:25 +0800
committerluwenpeng <[email protected]>2024-04-08 12:10:25 +0800
commitdaff1ecbc734dd6c0f68af86be00059faea164a2 (patch)
tree09832ac3cd2033103603ab19b061bc3c8d05a14d
parentc8beafe0819d8fbacdbb51f33ff1155246a9646a (diff)
When tcp reassembly is turned off, all tcp segments are considered in order
-rw-r--r--conf/stellar.toml2
-rw-r--r--src/session/session.h1
-rw-r--r--src/session/session_manager.cpp32
-rw-r--r--src/session/session_manager.h2
4 files changed, 28 insertions, 9 deletions
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]
};