diff mbox series

[net-next,v3,3/6] tcp: add dropreasons in tcp_rcv_state_process()

Message ID 20240212092827.75378-4-kerneljasonxing@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series introduce dropreasons in tcp receive path | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next, async
netdev/apply fail Patch does not apply to net-next

Commit Message

Jason Xing Feb. 12, 2024, 9:28 a.m. UTC
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>
---
 include/net/tcp.h    |  2 +-
 net/ipv4/tcp_input.c | 23 +++++++++++++++--------
 2 files changed, 16 insertions(+), 9 deletions(-)

Comments

Eric Dumazet Feb. 12, 2024, 3:32 p.m. UTC | #1
On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
>
> From: Jason Xing <kernelxing@tencent.com>


>                         if (!acceptable)
> -                               return 1;
> +                               /* This reason isn't clear. We can refine it in the future */
> +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;

tcp_conn_request() might return 0 when a syncookie has been generated.

Technically speaking, the incoming SYN was not dropped :)

I think you need to have a patch to change tcp_conn_request() and its
friends to return a 'refined' drop_reason
to avoid future questions / patches.
Jason Xing Feb. 12, 2024, 3:52 p.m. UTC | #2
Hello Eric,

On Mon, Feb 12, 2024 at 11:33 PM Eric Dumazet <edumazet@google.com> wrote:
>
> On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> >
> > From: Jason Xing <kernelxing@tencent.com>
>
>
> >                         if (!acceptable)
> > -                               return 1;
> > +                               /* This reason isn't clear. We can refine it in the future */
> > +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
>
> tcp_conn_request() might return 0 when a syncookie has been generated.
>
> Technically speaking, the incoming SYN was not dropped :)
>
> I think you need to have a patch to change tcp_conn_request() and its
> friends to return a 'refined' drop_reason
> to avoid future questions / patches.

Thanks for your advice.

Sure. That's on my to-do list since Kuniyuki pointed out[1] this
before. I will get it started as soon as the current two patchsets are
reviewed. For now, I think, what I wrote doesn't change the old
behaviour, right ?

[1]: https://lore.kernel.org/netdev/20240209091454.32323-1-kuniyu@amazon.com/

Thanks,
Jason
Eric Dumazet Feb. 12, 2024, 4:19 p.m. UTC | #3
On Mon, Feb 12, 2024 at 4:53 PM Jason Xing <kerneljasonxing@gmail.com> wrote:
>
> Hello Eric,
>
> On Mon, Feb 12, 2024 at 11:33 PM Eric Dumazet <edumazet@google.com> wrote:
> >
> > On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> > >
> > > From: Jason Xing <kernelxing@tencent.com>
> >
> >
> > >                         if (!acceptable)
> > > -                               return 1;
> > > +                               /* This reason isn't clear. We can refine it in the future */
> > > +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
> >
> > tcp_conn_request() might return 0 when a syncookie has been generated.
> >
> > Technically speaking, the incoming SYN was not dropped :)
> >
> > I think you need to have a patch to change tcp_conn_request() and its
> > friends to return a 'refined' drop_reason
> > to avoid future questions / patches.
>
> Thanks for your advice.
>
> Sure. That's on my to-do list since Kuniyuki pointed out[1] this
> before. I will get it started as soon as the current two patchsets are
> reviewed. For now, I think, what I wrote doesn't change the old
> behaviour, right ?
>

Lets not add a drop_reason that will soon be obsolete.
Jason Xing Feb. 12, 2024, 11:44 p.m. UTC | #4
On Tue, Feb 13, 2024 at 12:19 AM Eric Dumazet <edumazet@google.com> wrote:
>
> On Mon, Feb 12, 2024 at 4:53 PM Jason Xing <kerneljasonxing@gmail.com> wrote:
> >
> > Hello Eric,
> >
> > On Mon, Feb 12, 2024 at 11:33 PM Eric Dumazet <edumazet@google.com> wrote:
> > >
> > > On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> > > >
> > > > From: Jason Xing <kernelxing@tencent.com>
> > >
> > >
> > > >                         if (!acceptable)
> > > > -                               return 1;
> > > > +                               /* This reason isn't clear. We can refine it in the future */
> > > > +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
> > >
> > > tcp_conn_request() might return 0 when a syncookie has been generated.
> > >
> > > Technically speaking, the incoming SYN was not dropped :)
> > >
> > > I think you need to have a patch to change tcp_conn_request() and its
> > > friends to return a 'refined' drop_reason
> > > to avoid future questions / patches.
> >
> > Thanks for your advice.
> >
> > Sure. That's on my to-do list since Kuniyuki pointed out[1] this
> > before. I will get it started as soon as the current two patchsets are
> > reviewed. For now, I think, what I wrote doesn't change the old
> > behaviour, right ?
> >
>
> Lets not add a drop_reason that will soon be obsolete.

I will update it(add one or more patches) in the v4 patchset :)

Thanks,
Jason
Jason Xing Feb. 13, 2024, 1:48 a.m. UTC | #5
On Mon, Feb 12, 2024 at 11:33 PM Eric Dumazet <edumazet@google.com> wrote:
>
> On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> >
> > From: Jason Xing <kernelxing@tencent.com>
>
>
> >                         if (!acceptable)
> > -                               return 1;
> > +                               /* This reason isn't clear. We can refine it in the future */
> > +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
>
> tcp_conn_request() might return 0 when a syncookie has been generated.
>
> Technically speaking, the incoming SYN was not dropped :)

Hi Eric, Kuniyuki

Sorry, I should have checked tcp_conn_request() carefully last night.
Today, I checked tcp_conn_request() over and over again.

I didn't find there is any chance to return a negative/positive value,
only 0. It means @acceptable is always true and it should never return
TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
reset in this way.

For DCCP, there are chances to return -1 in dccp_v4_conn_request().
But I don't think we've already added drop reasons in DCCP before.

If I understand correctly, there is no need to do any refinement or
even introduce TCP_CONNREQNOTACCEPTABLE new dropreason about the
.conn_request() for TCP.

Should I add a NEW kfree_skb_reason() in tcp_conn_request() for those
labels, like drop_and_release, drop_and_free, drop, and not return a
drop reason to its caller tcp_rcv_state_process()?

Please correct me if I'm wrong...

Thanks,
Jason

>
> I think you need to have a patch to change tcp_conn_request() and its
> friends to return a 'refined' drop_reason
> to avoid future questions / patches.
Kuniyuki Iwashima Feb. 13, 2024, 4:06 a.m. UTC | #6
From: Jason Xing <kerneljasonxing@gmail.com>
Date: Tue, 13 Feb 2024 09:48:04 +0800
> On Mon, Feb 12, 2024 at 11:33 PM Eric Dumazet <edumazet@google.com> wrote:
> >
> > On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> > >
> > > From: Jason Xing <kernelxing@tencent.com>
> >
> >
> > >                         if (!acceptable)
> > > -                               return 1;
> > > +                               /* This reason isn't clear. We can refine it in the future */
> > > +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
> >
> > tcp_conn_request() might return 0 when a syncookie has been generated.
> >
> > Technically speaking, the incoming SYN was not dropped :)
> 
> Hi Eric, Kuniyuki
> 
> Sorry, I should have checked tcp_conn_request() carefully last night.
> Today, I checked tcp_conn_request() over and over again.
> 
> I didn't find there is any chance to return a negative/positive value,
> only 0. It means @acceptable is always true and it should never return
> TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
> reset in this way.

Ah right, I remember I digged the same thing before and even in the
initial commit, conn_request() always returned 0 and tcp_rcv_state_process()
tested it with if (retval < 0).

I think we can clean up the leftover with some comments above
->conn_request() definition so that we can convert it to void
when we deprecate DCCP in the near future.


> 
> For DCCP, there are chances to return -1 in dccp_v4_conn_request().
> But I don't think we've already added drop reasons in DCCP before.
> 
> If I understand correctly, there is no need to do any refinement or
> even introduce TCP_CONNREQNOTACCEPTABLE new dropreason about the
> .conn_request() for TCP.
> 
> Should I add a NEW kfree_skb_reason() in tcp_conn_request() for those
> labels, like drop_and_release, drop_and_free, drop, and not return a
> drop reason to its caller tcp_rcv_state_process()?

Most interested reasons will be covered by

  - reqsk q : net_info_ratelimited() in tcp_syn_flood_action() or
              net_dbg_ratelimited() in pr_drop_req() or
              __NET_INC_STATS(net, LINUX_MIB_LISTENDROPS) in tcp_listendrop()
  - accept q: NET_INC_STATS(net, LINUX_MIB_LISTENOVERFLOWS) or
              __NET_INC_STATS(net, LINUX_MIB_LISTENDROPS) in tcp_listendrop()

and could be refined by drop reason, but I'm not sure if drop reason
is used under such a pressured situation.

Also, these failures are now treated with consume_skb().

Whichever is fine to me, no strong preference.


> 
> Please correct me if I'm wrong...
> 
> Thanks,
> Jason
> 
> >
> > I think you need to have a patch to change tcp_conn_request() and its
> > friends to return a 'refined' drop_reason
> > to avoid future questions / patches.
Jason Xing Feb. 13, 2024, 6:36 a.m. UTC | #7
On Tue, Feb 13, 2024 at 12:07 PM Kuniyuki Iwashima <kuniyu@amazon.com> wrote:
>
> From: Jason Xing <kerneljasonxing@gmail.com>
> Date: Tue, 13 Feb 2024 09:48:04 +0800
> > On Mon, Feb 12, 2024 at 11:33 PM Eric Dumazet <edumazet@google.com> wrote:
> > >
> > > On Mon, Feb 12, 2024 at 10:29 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> > > >
> > > > From: Jason Xing <kernelxing@tencent.com>
> > >
> > >
> > > >                         if (!acceptable)
> > > > -                               return 1;
> > > > +                               /* This reason isn't clear. We can refine it in the future */
> > > > +                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
> > >
> > > tcp_conn_request() might return 0 when a syncookie has been generated.
> > >
> > > Technically speaking, the incoming SYN was not dropped :)
> >
> > Hi Eric, Kuniyuki
> >
> > Sorry, I should have checked tcp_conn_request() carefully last night.
> > Today, I checked tcp_conn_request() over and over again.
> >
> > I didn't find there is any chance to return a negative/positive value,
> > only 0. It means @acceptable is always true and it should never return
> > TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
> > reset in this way.
>
> Ah right, I remember I digged the same thing before and even in the
> initial commit, conn_request() always returned 0 and tcp_rcv_state_process()
> tested it with if (retval < 0).

Good. Thanks for your double check :)

>
> I think we can clean up the leftover with some comments above
> ->conn_request() definition so that we can convert it to void
> when we deprecate DCCP in the near future.

In the next version, I will remove the new
SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE and the comment line which I
added and keep it as the old way, namely, returning 1.

>
>
> >
> > For DCCP, there are chances to return -1 in dccp_v4_conn_request().
> > But I don't think we've already added drop reasons in DCCP before.
> >
> > If I understand correctly, there is no need to do any refinement or
> > even introduce TCP_CONNREQNOTACCEPTABLE new dropreason about the
> > .conn_request() for TCP.
> >
> > Should I add a NEW kfree_skb_reason() in tcp_conn_request() for those
> > labels, like drop_and_release, drop_and_free, drop, and not return a
> > drop reason to its caller tcp_rcv_state_process()?
>
> Most interested reasons will be covered by
>
>   - reqsk q : net_info_ratelimited() in tcp_syn_flood_action() or
>               net_dbg_ratelimited() in pr_drop_req() or
>               __NET_INC_STATS(net, LINUX_MIB_LISTENDROPS) in tcp_listendrop()
>   - accept q: NET_INC_STATS(net, LINUX_MIB_LISTENOVERFLOWS) or
>               __NET_INC_STATS(net, LINUX_MIB_LISTENDROPS) in tcp_listendrop()
>
> and could be refined by drop reason, but I'm not sure if drop reason
> is used under such a pressured situation.

Interesting. Let us wait for Eric's response.

Thanks,
Jason

>
> Also, these failures are now treated with consume_skb().
>
> Whichever is fine to me, no strong preference.


>
>
> >
> > Please correct me if I'm wrong...
> >
> > Thanks,
> > Jason
> >
> > >
> > > I think you need to have a patch to change tcp_conn_request() and its
> > > friends to return a 'refined' drop_reason
> > > to avoid future questions / patches.
Eric Dumazet Feb. 13, 2024, 9:35 a.m. UTC | #8
>
> Hi Eric, Kuniyuki
>
> Sorry, I should have checked tcp_conn_request() carefully last night.
> Today, I checked tcp_conn_request() over and over again.
>
> I didn't find there is any chance to return a negative/positive value,
> only 0. It means @acceptable is always true and it should never return
> TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
> reset in this way.
>

Then send a cleanup, thanks.

A standalone patch is going to be simpler than reviewing a whole series.
Jason Xing Feb. 13, 2024, 10:29 a.m. UTC | #9
On Tue, Feb 13, 2024 at 5:35 PM Eric Dumazet <edumazet@google.com> wrote:
>
> >
> > Hi Eric, Kuniyuki
> >
> > Sorry, I should have checked tcp_conn_request() carefully last night.
> > Today, I checked tcp_conn_request() over and over again.
> >
> > I didn't find there is any chance to return a negative/positive value,
> > only 0. It means @acceptable is always true and it should never return
> > TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
> > reset in this way.
> >
>
> Then send a cleanup, thanks.
>
> A standalone patch is going to be simpler than reviewing a whole series.

I fear that I could misunderstand what you mean. I'm not that familiar
with how it works. Please enlighten me, thanks.

Are you saying I don't need to send a new version of the current patch
series, only send a patch after this series is applied?

A standalone patch goes like this based on this patch series:
diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
index 92513acca431..c059f7fc79f9 100644
--- a/include/net/dropreason-core.h
+++ b/include/net/dropreason-core.h
@@ -31,7 +31,6 @@
        FN(TCP_AOFAILURE)               \
        FN(SOCKET_BACKLOG)              \
        FN(TCP_FLAGS)                   \
-       FN(TCP_CONNREQNOTACCEPTABLE)                    \
        FN(TCP_ABORTONDATA)                     \
        FN(TCP_ZEROWINDOW)              \
        FN(TCP_OLD_DATA)                \
@@ -210,12 +209,6 @@ enum skb_drop_reason {
        SKB_DROP_REASON_SOCKET_BACKLOG,
        /** @SKB_DROP_REASON_TCP_FLAGS: TCP flags invalid */
        SKB_DROP_REASON_TCP_FLAGS,
-       /**
-        * @SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE: connection request is not
-        * acceptable. This reason currently is a little bit obscure. It could
-        * be split into more specific reasons in the future.
-        */
-       SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE,
        /**
         * @SKB_DROP_REASON_TCP_ABORTONDATA: abort on data, corresponding to
         * LINUX_MIB_TCPABORTONDATA
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index d95f59f62742..023db3438b78 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -6658,8 +6658,7 @@ tcp_rcv_state_process(struct sock *sk, struct
sk_buff *skb)
                        rcu_read_unlock();

                        if (!acceptable)
-                               /* This reason isn't clear. We can
refine it in the future */
-                               return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
+                               return 1;
                        consume_skb(skb);
                        return 0;
                }

If that is so, what is the status of the current patch?

Thanks,
Jason
Eric Dumazet Feb. 13, 2024, 12:03 p.m. UTC | #10
On Tue, Feb 13, 2024 at 11:30 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
>
> On Tue, Feb 13, 2024 at 5:35 PM Eric Dumazet <edumazet@google.com> wrote:
> >
> > >
> > > Hi Eric, Kuniyuki
> > >
> > > Sorry, I should have checked tcp_conn_request() carefully last night.
> > > Today, I checked tcp_conn_request() over and over again.
> > >
> > > I didn't find there is any chance to return a negative/positive value,
> > > only 0. It means @acceptable is always true and it should never return
> > > TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
> > > reset in this way.
> > >
> >
> > Then send a cleanup, thanks.
> >
> > A standalone patch is going to be simpler than reviewing a whole series.
>
> I fear that I could misunderstand what you mean. I'm not that familiar
> with how it works. Please enlighten me, thanks.
>
> Are you saying I don't need to send a new version of the current patch
> series, only send a patch after this series is applied?
>

No. I suggested the clean up being sent before the series.

If acceptable is always true in TCP, why keep dead code ?

This would avoid many questions.

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 2d20edf652e6cb5eb56bda0107c99bed0b0a335f..b1c4462a0798c45e9b10d62715bc88fa35349078
100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -6623,7 +6623,6 @@ int tcp_rcv_state_process(struct sock *sk,
struct sk_buff *skb)
        const struct tcphdr *th = tcp_hdr(skb);
        struct request_sock *req;
        int queued = 0;
-       bool acceptable;
        SKB_DR(reason);

        switch (sk->sk_state) {
@@ -6649,12 +6648,10 @@ int tcp_rcv_state_process(struct sock *sk,
struct sk_buff *skb)
                         */
                        rcu_read_lock();
                        local_bh_disable();
-                       acceptable =
icsk->icsk_af_ops->conn_request(sk, skb) >= 0;
+                       icsk->icsk_af_ops->conn_request(sk, skb);
                        local_bh_enable();
                        rcu_read_unlock();

-                       if (!acceptable)
-                               return 1;
                        consume_skb(skb);
                        return 0;
                }
Jason Xing Feb. 13, 2024, 12:38 p.m. UTC | #11
On Tue, Feb 13, 2024 at 8:04 PM Eric Dumazet <edumazet@google.com> wrote:
>
> On Tue, Feb 13, 2024 at 11:30 AM Jason Xing <kerneljasonxing@gmail.com> wrote:
> >
> > On Tue, Feb 13, 2024 at 5:35 PM Eric Dumazet <edumazet@google.com> wrote:
> > >
> > > >
> > > > Hi Eric, Kuniyuki
> > > >
> > > > Sorry, I should have checked tcp_conn_request() carefully last night.
> > > > Today, I checked tcp_conn_request() over and over again.
> > > >
> > > > I didn't find there is any chance to return a negative/positive value,
> > > > only 0. It means @acceptable is always true and it should never return
> > > > TCP_CONNREQNOTACCEPTABLE for TCP ipv4/6 protocol and never trigger a
> > > > reset in this way.
> > > >
> > >
> > > Then send a cleanup, thanks.
> > >
> > > A standalone patch is going to be simpler than reviewing a whole series.
> >
> > I fear that I could misunderstand what you mean. I'm not that familiar
> > with how it works. Please enlighten me, thanks.
> >
> > Are you saying I don't need to send a new version of the current patch
> > series, only send a patch after this series is applied?
> >
>
> No. I suggested the clean up being sent before the series.
>
> If acceptable is always true in TCP, why keep dead code ?
>
> This would avoid many questions.
>
> diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
> index 2d20edf652e6cb5eb56bda0107c99bed0b0a335f..b1c4462a0798c45e9b10d62715bc88fa35349078
> 100644
> --- a/net/ipv4/tcp_input.c
> +++ b/net/ipv4/tcp_input.c
> @@ -6623,7 +6623,6 @@ int tcp_rcv_state_process(struct sock *sk,
> struct sk_buff *skb)
>         const struct tcphdr *th = tcp_hdr(skb);
>         struct request_sock *req;
>         int queued = 0;
> -       bool acceptable;
>         SKB_DR(reason);
>
>         switch (sk->sk_state) {
> @@ -6649,12 +6648,10 @@ int tcp_rcv_state_process(struct sock *sk,
> struct sk_buff *skb)
>                          */
>                         rcu_read_lock();
>                         local_bh_disable();
> -                       acceptable =
> icsk->icsk_af_ops->conn_request(sk, skb) >= 0;
> +                       icsk->icsk_af_ops->conn_request(sk, skb);
>                         local_bh_enable();
>                         rcu_read_unlock();
>
> -                       if (!acceptable)
> -                               return 1;
>                         consume_skb(skb);
>                         return 0;
>                 }

Thanks for your explanation. Since the DCCP seems dead, there is no
need to keep it for TCP as you said. I will send this patch first,
then two updated patch series following.

Thanks,
Jason
Jason Xing Feb. 13, 2024, 12:58 p.m. UTC | #12
> Thanks for your explanation. Since the DCCP seems dead, there is no

Oops, I have to correct myself: it has nothing to do with DCCP because
the caller of tcp_rcv_state_process() only exists in the TCP path.

> need to keep it for TCP as you said. I will send this patch first,
> then two updated patch series following.
>
> Thanks,
> Jason
diff mbox series

Patch

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 bfaf98c1f0ea..d95f59f62742 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);
@@ -6636,7 +6637,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);
@@ -6657,7 +6658,8 @@  int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
 			rcu_read_unlock();
 
 			if (!acceptable)
-				return 1;
+				/* This reason isn't clear. We can refine it in the future */
+				return SKB_DROP_REASON_TCP_CONNREQNOTACCEPTABLE;
 			consume_skb(skb);
 			return 0;
 		}
@@ -6707,8 +6709,13 @@  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;
+			else
+				return -reason;
+		}
 		/* accept old ack during closing */
 		if ((int)reason < 0) {
 			tcp_send_challenge_ack(sk);
@@ -6784,7 +6791,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_ABORTONDATA;
 		}
 		if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq &&
 		    after(TCP_SKB_CB(skb)->end_seq - th->fin, tp->rcv_nxt)) {
@@ -6793,7 +6800,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_ABORTONDATA;
 		}
 
 		tmo = tcp_fin_time(sk);
@@ -6858,7 +6865,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_ABORTONDATA;
 			}
 		}
 		fallthrough;