Thread (41 messages) flat view 41 messages, 4 authors, 2025-09-18

Re: [PATCH net-next v13 07/19] net: tcp: allow tcp_timewait_sock to validate skbs before handing to device

From: Eric Dumazet <edumazet@google.com>
Date: 2025-09-18 03:58:14

On Tue, Sep 16, 2025 at 5:10 PM Daniel Zahka [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Provide a callback to validate skb's originating from tcp timewait
socks before passing to the device layer. Full socks have a
sk_validate_xmit_skb member for checking that a device is capable of
performing offloads required for transmitting an skb. With psp, tcp
timewait socks will inherit the crypto state from their corresponding
full socks. Any ACKs or RSTs that originate from a tcp timewait sock
carrying psp state should be psp encapsulated.

Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Daniel Zahka <daniel.zahka@gmail.com>
---

Notes:
    v3:
    - check for sk_is_inet() before casting to inet_twsk()
    v2:
    - patch introduced in v2

 include/net/inet_timewait_sock.h |  5 +++++
 net/core/dev.c                   | 14 ++++++++++++--
 net/ipv4/inet_timewait_sock.c    |  3 +++
 3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h
index c1295246216c..3a31c74c9e15 100644
--- a/include/net/inet_timewait_sock.h
+++ b/include/net/inet_timewait_sock.h
@@ -84,6 +84,11 @@ struct inet_timewait_sock {
 #if IS_ENABLED(CONFIG_INET_PSP)
        struct psp_assoc __rcu    *psp_assoc;
 #endif
+#ifdef CONFIG_SOCK_VALIDATE_XMIT
+       struct sk_buff*         (*tw_validate_xmit_skb)(struct sock *sk,
+                                                       struct net_device *dev,
+                                                       struct sk_buff *skb);
I guess we could use a single bit instead of a full pointer, as long
as the only user for this method is psp_validate_xmit()

This can be done later, incrementally.

quoted hunk ↗ jump to hunk
+#endif
 };
 #define tw_tclass tw_tos
diff --git a/net/core/dev.c b/net/core/dev.c
index 384e59d7e715..5e22d062bac5 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3915,10 +3915,20 @@ static struct sk_buff *sk_validate_xmit_skb(struct sk_buff *skb,
                                            struct net_device *dev)
 {
 #ifdef CONFIG_SOCK_VALIDATE_XMIT
+       struct sk_buff *(*sk_validate)(struct sock *sk, struct net_device *dev,
+                                      struct sk_buff *skb);
        struct sock *sk = skb->sk;

-       if (sk && sk_fullsock(sk) && sk->sk_validate_xmit_skb) {
-               skb = sk->sk_validate_xmit_skb(sk, dev, skb);
+       sk_validate = NULL;
+       if (sk) {
+               if (sk_fullsock(sk))
+                       sk_validate = sk->sk_validate_xmit_skb;
+               else if (sk_is_inet(sk) && sk->sk_state == TCP_TIME_WAIT)
Interestingly, note that we check  TCP_TIME_WAIT in places where we do
not test sk_is_inet(),
like in sk_to_full_sk(). Time for an audit I guess.

Reviewed-by: Eric Dumazet <edumazet@google.com>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help