Message ID | 20240223102851.83749-9-kerneljasonxing@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | introduce drop reasons for tcp receive path | expand |
From: Jason Xing <kerneljasonxing@gmail.com> Date: Fri, 23 Feb 2024 18:28:49 +0800 > From: Jason Xing <kernelxing@tencent.com> > > In this patch, I equipped this function with more dropreasons, but > it still doesn't work yet, which I will do later. > > Signed-off-by: Jason Xing <kernelxing@tencent.com> > Reviewed-by: Eric Dumazet <edumazet@google.com> > Reviewed-by: David Ahern <dsahern@kernel.org> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> > -- > v9 > Link: https://lore.kernel.org/netdev/CAL+tcoCbsbM=HyXRqs2+QVrY8FSKmqYC47m87Axiyk1wk4omwQ@mail.gmail.com/ > Link: https://lore.kernel.org/netdev/c5640fc4-16dc-4058-97c6-bd84bae4fda1@kernel.org/ > 1. nit: remove unnecessary else (David) > 2. add reviewed-by tag (David) > > v8 > Link: https://lore.kernel.org/netdev/CANn89iJJ9XTVeC=qbSNUnOhQMAsfBfouc9qUJY7MxgQtYGmB3Q@mail.gmail.com/ > 1. add reviewed-by tag (Eric) > > v5: > Link: https://lore.kernel.org/netdev/3a495358-4c47-4a9f-b116-5f9c8b44e5ab@kernel.org/ > 1. Use new name (TCP_ABORT_ON_DATA) for readability (David) > --- > include/net/tcp.h | 2 +- > net/ipv4/tcp_input.c | 19 ++++++++++++------- > 2 files changed, 13 insertions(+), 8 deletions(-) > > diff --git a/include/net/tcp.h b/include/net/tcp.h > index 58e65af74ad1..e5af9a5b411b 100644 > --- a/include/net/tcp.h > +++ b/include/net/tcp.h > @@ -348,7 +348,7 @@ void tcp_wfree(struct sk_buff *skb); > void tcp_write_timer_handler(struct sock *sk); > void tcp_delack_timer_handler(struct sock *sk); > int tcp_ioctl(struct sock *sk, int cmd, int *karg); > -int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb); > +enum skb_drop_reason tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb); > void tcp_rcv_established(struct sock *sk, struct sk_buff *skb); > void tcp_rcv_space_adjust(struct sock *sk); > int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp); > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c > index 83308cca1610..5d874817a78d 100644 > --- a/net/ipv4/tcp_input.c > +++ b/net/ipv4/tcp_input.c > @@ -6619,7 +6619,8 @@ static void tcp_rcv_synrecv_state_fastopen(struct sock *sk) > * address independent. > */ > > -int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > +enum skb_drop_reason > +tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > { > struct tcp_sock *tp = tcp_sk(sk); > struct inet_connection_sock *icsk = inet_csk(sk); > @@ -6635,7 +6636,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > > case TCP_LISTEN: > if (th->ack) > - return 1; > + return SKB_DROP_REASON_TCP_FLAGS; > > if (th->rst) { > SKB_DR_SET(reason, TCP_RESET); > @@ -6704,8 +6705,12 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > FLAG_NO_CHALLENGE_ACK); > > if ((int)reason <= 0) { > - if (sk->sk_state == TCP_SYN_RECV) > - return 1; /* send one RST */ > + if (sk->sk_state == TCP_SYN_RECV) { > + /* send one RST */ > + if (!reason) > + return SKB_DROP_REASON_TCP_OLD_ACK; > + return -reason; > + } > /* accept old ack during closing */ > if ((int)reason < 0) { > tcp_send_challenge_ack(sk); > @@ -6781,7 +6786,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > if (READ_ONCE(tp->linger2) < 0) { > tcp_done(sk); > NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); > - return 1; > + return SKB_DROP_REASON_TCP_ABORT_ON_DATA; > } > if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && > after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { > @@ -6790,7 +6795,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > tcp_fastopen_active_disable(sk); > tcp_done(sk); > NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); > - return 1; > + return SKB_DROP_REASON_TCP_ABORT_ON_DATA; > } > > tmo = tcp_fin_time(sk); > @@ -6855,7 +6860,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) > after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { > NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); > tcp_reset(sk, skb); > - return 1; > + return SKB_DROP_REASON_TCP_ABORT_ON_DATA; > } > } > fallthrough; > -- > 2.37.3
diff --git a/include/net/tcp.h b/include/net/tcp.h index 58e65af74ad1..e5af9a5b411b 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -348,7 +348,7 @@ void tcp_wfree(struct sk_buff *skb); void tcp_write_timer_handler(struct sock *sk); void tcp_delack_timer_handler(struct sock *sk); int tcp_ioctl(struct sock *sk, int cmd, int *karg); -int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb); +enum skb_drop_reason tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb); void tcp_rcv_established(struct sock *sk, struct sk_buff *skb); void tcp_rcv_space_adjust(struct sock *sk); int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp); diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 83308cca1610..5d874817a78d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -6619,7 +6619,8 @@ static void tcp_rcv_synrecv_state_fastopen(struct sock *sk) * address independent. */ -int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +enum skb_drop_reason +tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) { struct tcp_sock *tp = tcp_sk(sk); struct inet_connection_sock *icsk = inet_csk(sk); @@ -6635,7 +6636,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) case TCP_LISTEN: if (th->ack) - return 1; + return SKB_DROP_REASON_TCP_FLAGS; if (th->rst) { SKB_DR_SET(reason, TCP_RESET); @@ -6704,8 +6705,12 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) FLAG_NO_CHALLENGE_ACK); if ((int)reason <= 0) { - if (sk->sk_state == TCP_SYN_RECV) - return 1; /* send one RST */ + if (sk->sk_state == TCP_SYN_RECV) { + /* send one RST */ + if (!reason) + return SKB_DROP_REASON_TCP_OLD_ACK; + return -reason; + } /* accept old ack during closing */ if ((int)reason < 0) { tcp_send_challenge_ack(sk); @@ -6781,7 +6786,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) if (READ_ONCE(tp->linger2) < 0) { tcp_done(sk); NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); - return 1; + return SKB_DROP_REASON_TCP_ABORT_ON_DATA; } if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { @@ -6790,7 +6795,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) tcp_fastopen_active_disable(sk); tcp_done(sk); NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); - return 1; + return SKB_DROP_REASON_TCP_ABORT_ON_DATA; } tmo = tcp_fin_time(sk); @@ -6855,7 +6860,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) { NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); tcp_reset(sk, skb); - return 1; + return SKB_DROP_REASON_TCP_ABORT_ON_DATA; } } fallthrough;