Skip to content

Commit c8b02cb

Browse files
committed
Keep initial SYN direction in TCP flow state
1 parent 43763b7 commit c8b02cb

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

include/dp_flow.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ struct flow_value {
114114
} incoming_flow_offloaded_flag;
115115
struct dp_ref ref_count;
116116
union {
117-
enum dp_flow_tcp_state tcp_state;
117+
struct {
118+
enum dp_flow_tcp_state state;
119+
enum dp_flow_dir first_syn_flow_dir;
120+
} tcp;
118121
} l4_state;
119122
bool aged;
120123
};

src/dp_cntrack.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,31 @@ static __rte_always_inline void dp_cntrack_tcp_state(struct flow_value *flow_val
4646
uint8_t tcp_flags = tcp_hdr->tcp_flags;
4747

4848
if (DP_TCP_PKT_FLAG_RST(tcp_flags)) {
49-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_RST_FIN;
49+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_RST_FIN;
5050
} else if (DP_TCP_PKT_FLAG_FIN(tcp_flags)) {
5151
// this is not entirely 1:1 mapping to fin sequence,
5252
// but sufficient to determine if a tcp connection is almost successfuly closed
5353
// (last ack is still pending)
54-
if (flow_val->l4_state.tcp_state == DP_FLOW_TCP_STATE_ESTABLISHED)
55-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_FINWAIT;
54+
if (flow_val->l4_state.tcp.state == DP_FLOW_TCP_STATE_ESTABLISHED)
55+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_FINWAIT;
5656
else
57-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_RST_FIN;
57+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_RST_FIN;
5858
} else {
59-
switch (flow_val->l4_state.tcp_state) {
59+
switch (flow_val->l4_state.tcp.state) {
6060
case DP_FLOW_TCP_STATE_NONE:
6161
case DP_FLOW_TCP_STATE_RST_FIN:
62-
if (DP_TCP_PKT_FLAG_ONLY_SYN(tcp_flags) && df->flow_dir == DP_FLOW_DIR_ORG)
63-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_NEW_SYN;
62+
if (DP_TCP_PKT_FLAG_ONLY_SYN(tcp_flags)) {
63+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_NEW_SYN;
64+
flow_val->l4_state.tcp.first_syn_flow_dir = df->flow_dir;
65+
}
6466
break;
6567
case DP_FLOW_TCP_STATE_NEW_SYN:
66-
if (DP_TCP_PKT_FLAG_ONLY_SYNACK(tcp_flags) && df->flow_dir == DP_FLOW_DIR_REPLY)
67-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_NEW_SYNACK;
68+
if (DP_TCP_PKT_FLAG_ONLY_SYNACK(tcp_flags) && df->flow_dir != flow_val->l4_state.tcp.first_syn_flow_dir)
69+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_NEW_SYNACK;
6870
break;
6971
case DP_FLOW_TCP_STATE_NEW_SYNACK:
70-
if (DP_TCP_PKT_FLAG_ONLY_ACK(tcp_flags) && df->flow_dir == DP_FLOW_DIR_ORG)
71-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_ESTABLISHED;
72+
if (DP_TCP_PKT_FLAG_ONLY_ACK(tcp_flags) && df->flow_dir == flow_val->l4_state.tcp.first_syn_flow_dir)
73+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_ESTABLISHED;
7274
break;
7375
default:
7476
// FIN-states already handled above
@@ -126,13 +128,13 @@ static __rte_always_inline void dp_cntrack_change_flow_offload_flags(struct rte_
126128

127129
static __rte_always_inline void dp_cntrack_set_timeout_tcp_flow(struct rte_mbuf *m, struct flow_value *flow_val, struct dp_flow *df)
128130
{
129-
if (flow_val->l4_state.tcp_state == DP_FLOW_TCP_STATE_ESTABLISHED) {
131+
if (flow_val->l4_state.tcp.state == DP_FLOW_TCP_STATE_ESTABLISHED) {
130132
flow_val->timeout_value = DP_FLOW_TCP_EXTENDED_TIMEOUT;
131133
dp_cntrack_change_flow_offload_flags(m, flow_val, df);
132134
} else {
133135
flow_val->timeout_value = flow_timeout;
134-
if (flow_val->l4_state.tcp_state == DP_FLOW_TCP_STATE_FINWAIT
135-
|| flow_val->l4_state.tcp_state == DP_FLOW_TCP_STATE_RST_FIN)
136+
if (flow_val->l4_state.tcp.state == DP_FLOW_TCP_STATE_FINWAIT
137+
|| flow_val->l4_state.tcp.state == DP_FLOW_TCP_STATE_RST_FIN)
136138
dp_cntrack_change_flow_offload_flags(m, flow_val, df);
137139
}
138140
}
@@ -178,7 +180,7 @@ static __rte_always_inline struct flow_value *flow_table_insert_entry(struct flo
178180
dp_cntrack_init_flow_offload_flags(flow_val, df);
179181

180182
if (df->l4_type == IPPROTO_TCP)
181-
flow_val->l4_state.tcp_state = DP_FLOW_TCP_STATE_NONE;
183+
flow_val->l4_state.tcp.state = DP_FLOW_TCP_STATE_NONE;
182184

183185
dp_ref_init(&flow_val->ref_count, dp_free_flow);
184186
if (DP_FAILED(dp_add_flow(key, flow_val)))

0 commit comments

Comments
 (0)