@@ -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
127129static __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