]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: psp: update the TCP MSS to reflect PSP packet overhead
authorJakub Kicinski <kuba@kernel.org>
Wed, 17 Sep 2025 00:09:36 +0000 (17:09 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 18 Sep 2025 10:32:06 +0000 (12:32 +0200)
PSP eats 40B of header space. Adjust MSS appropriately.

We can either modify tcp_mtu_to_mss() / tcp_mss_to_mtu()
or reuse icsk_ext_hdr_len. The former option is more TCP
specific and has runtime overhead. The latter is a bit
of a hack as PSP is not an ext_hdr. If one squints hard
enough, UDP encap is just a more practical version of
IPv6 exthdr, so go with the latter. Happy to change.

Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Daniel Zahka <daniel.zahka@gmail.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250917000954.859376-10-daniel.zahka@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/psp/functions.h
include/net/psp/types.h
net/ipv4/tcp_ipv4.c
net/ipv6/ipv6_sockglue.c
net/ipv6/tcp_ipv6.c
net/psp/psp_sock.c

index 0d7141230f476f5194662767646d90b0c6c68911..183a3c9216b7e72ef45289dea934cd0172cd691a 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <linux/skbuff.h>
 #include <linux/rcupdate.h>
+#include <linux/udp.h>
 #include <net/sock.h>
 #include <net/tcp.h>
 #include <net/psp/types.h>
@@ -143,6 +144,14 @@ static inline struct psp_assoc *psp_skb_get_assoc_rcu(struct sk_buff *skb)
 
        return psp_sk_get_assoc_rcu(skb->sk);
 }
+
+static inline unsigned int psp_sk_overhead(const struct sock *sk)
+{
+       int psp_encap = sizeof(struct udphdr) + PSP_HDR_SIZE + PSP_TRL_SIZE;
+       bool has_psp = rcu_access_pointer(sk->psp_assoc);
+
+       return has_psp ? psp_encap : 0;
+}
 #else
 static inline void psp_sk_assoc_free(struct sock *sk) { }
 static inline void
@@ -182,6 +191,11 @@ static inline struct psp_assoc *psp_skb_get_assoc_rcu(struct sk_buff *skb)
 {
        return NULL;
 }
+
+static inline unsigned int psp_sk_overhead(const struct sock *sk)
+{
+       return 0;
+}
 #endif
 
 static inline unsigned long
index b0e32e7165a3a6abeb14b02616097a75c749d5e3..f93ad0e6c04f8674a5d39ebd87a87fdd7f76ab8c 100644 (file)
@@ -93,6 +93,9 @@ struct psp_dev_caps {
 
 #define PSP_MAX_KEY    32
 
+#define PSP_HDR_SIZE   16      /* We don't support optional fields, yet */
+#define PSP_TRL_SIZE   16      /* AES-GCM/GMAC trailer size */
+
 struct psp_skb_ext {
        __be32 spi;
        u16 dev_id;
index f27f6f865a48642c72ed1a6d4c5d28120ee44667..b1fcf3e4e1ce001f34907ce183390a7bae9fe48a 100644 (file)
@@ -294,9 +294,9 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        inet->inet_dport = usin->sin_port;
        sk_daddr_set(sk, daddr);
 
-       inet_csk(sk)->icsk_ext_hdr_len = 0;
+       inet_csk(sk)->icsk_ext_hdr_len = psp_sk_overhead(sk);
        if (inet_opt)
-               inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen;
+               inet_csk(sk)->icsk_ext_hdr_len += inet_opt->opt.optlen;
 
        tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT;
 
index e66ec623972e08486861b12c99e665d25fda3787..a61e742794f9e67ff3743ddc31341d8647d5bcdc 100644 (file)
@@ -49,6 +49,7 @@
 #include <net/xfrm.h>
 #include <net/compat.h>
 #include <net/seg6.h>
+#include <net/psp.h>
 
 #include <linux/uaccess.h>
 
@@ -107,7 +108,10 @@ struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
                    !((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) &&
                    inet_sk(sk)->inet_daddr != LOOPBACK4_IPV6) {
                        struct inet_connection_sock *icsk = inet_csk(sk);
-                       icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen;
+
+                       icsk->icsk_ext_hdr_len =
+                               psp_sk_overhead(sk) +
+                               opt->opt_flen + opt->opt_nflen;
                        icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
                }
        }
index 4da8eb9183d79e63a7acc261fd0e2e8cfdd6c528..43d1109e2180c1d55c1b987cbce6a3886faca0e2 100644 (file)
@@ -302,10 +302,10 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        sk->sk_gso_type = SKB_GSO_TCPV6;
        ip6_dst_store(sk, dst, NULL, NULL);
 
-       icsk->icsk_ext_hdr_len = 0;
+       icsk->icsk_ext_hdr_len = psp_sk_overhead(sk);
        if (opt)
-               icsk->icsk_ext_hdr_len = opt->opt_flen +
-                                        opt->opt_nflen;
+               icsk->icsk_ext_hdr_len += opt->opt_flen +
+                                         opt->opt_nflen;
 
        tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
 
index 8ebccee94593d5192add23c8a0f0bdd17c793e64..10e1fda30aa0a35a72f411456fe73e68aad8b625 100644 (file)
@@ -180,6 +180,7 @@ int psp_sock_assoc_set_tx(struct sock *sk, struct psp_dev *psd,
                          u32 version, struct psp_key_parsed *key,
                          struct netlink_ext_ack *extack)
 {
+       struct inet_connection_sock *icsk;
        struct psp_assoc *pas, *dummy;
        int err;
 
@@ -236,6 +237,10 @@ int psp_sock_assoc_set_tx(struct sock *sk, struct psp_dev *psd,
        tcp_write_collapse_fence(sk);
        pas->upgrade_seq = tcp_sk(sk)->rcv_nxt;
 
+       icsk = inet_csk(sk);
+       icsk->icsk_ext_hdr_len += psp_sk_overhead(sk);
+       icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
+
 exit_free_dummy:
        kfree(dummy);
 exit_unlock: