aboutsummaryrefslogtreecommitdiffstats
diff options
-rw-r--r--queue-5.15/revert-ipv6-save-dontfrag-in-cork.patch86
-rw-r--r--queue-5.15/series1
2 files changed, 87 insertions, 0 deletions
diff --git a/queue-5.15/revert-ipv6-save-dontfrag-in-cork.patch b/queue-5.15/revert-ipv6-save-dontfrag-in-cork.patch
new file mode 100644
index 0000000000..0b5f882f5f
--- /dev/null
+++ b/queue-5.15/revert-ipv6-save-dontfrag-in-cork.patch
@@ -0,0 +1,86 @@
+From bacs@librecast.net Wed Jul 2 16:21:40 2025
+From: Brett A C Sheffield <bacs@librecast.net>
+Date: Wed, 2 Jul 2025 13:38:50 +0200
+Subject: Revert "ipv6: save dontfrag in cork"
+To: gregkh@linuxfoundation.org
+Cc: regressions@lists.linux.dev, stable@vger.kernel.org, willemb@google.com, Brett A C Sheffield <bacs@librecast.net>
+Message-ID: <20250702113849.2401-2-bacs@librecast.net>
+
+
+From: Brett A C Sheffield (Librecast) <bacs@librecast.net>
+
+This reverts commit 2b572c40981138349c04b3f69220ac878a36c561 which is
+commit a18dfa9925b9ef6107ea3aa5814ca3c704d34a8a upstream.
+
+A regression was introduced when backporting this to the stable kernels
+without applying previous commits in this series.
+
+When sending IPv6 UDP packets larger than MTU, EMSGSIZE was returned
+instead of fragmenting the packets as expected.
+
+As there is no compelling reason for this commit to be present in the
+stable kernels it should be reverted.
+
+Signed-off-by: Brett A C Sheffield <bacs@librecast.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/linux/ipv6.h | 1 -
+ net/ipv6/ip6_output.c | 9 ++++-----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+--- a/include/linux/ipv6.h
++++ b/include/linux/ipv6.h
+@@ -195,7 +195,6 @@ struct inet6_cork {
+ struct ipv6_txoptions *opt;
+ u8 hop_limit;
+ u8 tclass;
+- u8 dontfrag:1;
+ };
+
+ /**
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -1428,7 +1428,6 @@ static int ip6_setup_cork(struct sock *s
+ cork->fl.u.ip6 = *fl6;
+ v6_cork->hop_limit = ipc6->hlimit;
+ v6_cork->tclass = ipc6->tclass;
+- v6_cork->dontfrag = ipc6->dontfrag;
+ if (rt->dst.flags & DST_XFRM_TUNNEL)
+ mtu = np->pmtudisc >= IPV6_PMTUDISC_PROBE ?
+ READ_ONCE(rt->dst.dev->mtu) : dst_mtu(&rt->dst);
+@@ -1463,7 +1462,7 @@ static int __ip6_append_data(struct sock
+ int getfrag(void *from, char *to, int offset,
+ int len, int odd, struct sk_buff *skb),
+ void *from, size_t length, int transhdrlen,
+- unsigned int flags)
++ unsigned int flags, struct ipcm6_cookie *ipc6)
+ {
+ struct sk_buff *skb, *skb_prev = NULL;
+ unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu;
+@@ -1520,7 +1519,7 @@ static int __ip6_append_data(struct sock
+ if (headersize + transhdrlen > mtu)
+ goto emsgsize;
+
+- if (cork->length + length > mtu - headersize && v6_cork->dontfrag &&
++ if (cork->length + length > mtu - headersize && ipc6->dontfrag &&
+ (sk->sk_protocol == IPPROTO_UDP ||
+ sk->sk_protocol == IPPROTO_RAW)) {
+ ipv6_local_rxpmtu(sk, fl6, mtu - headersize +
+@@ -1837,7 +1836,7 @@ int ip6_append_data(struct sock *sk,
+
+ return __ip6_append_data(sk, fl6, &sk->sk_write_queue, &inet->cork.base,
+ &np->cork, sk_page_frag(sk), getfrag,
+- from, length, transhdrlen, flags);
++ from, length, transhdrlen, flags, ipc6);
+ }
+ EXPORT_SYMBOL_GPL(ip6_append_data);
+
+@@ -2032,7 +2031,7 @@ struct sk_buff *ip6_make_skb(struct sock
+ err = __ip6_append_data(sk, fl6, &queue, &cork->base, &v6_cork,
+ &current->task_frag, getfrag, from,
+ length + exthdrlen, transhdrlen + exthdrlen,
+- flags);
++ flags, ipc6);
+ if (err) {
+ __ip6_flush_pending_frames(sk, &queue, cork, &v6_cork);
+ return ERR_PTR(err);
diff --git a/queue-5.15/series b/queue-5.15/series
index a6edf3754a..d769a474c9 100644
--- a/queue-5.15/series
+++ b/queue-5.15/series
@@ -91,3 +91,4 @@ pci-hv-do-not-set-pci_command_memory-to-reduce-vm-boot-time.patch
media-uvcvideo-rollback-non-processed-entities-on-error.patch
s390-entry-fix-last-breaking-event-handling-in-case-of-stack-corruption.patch
s390-add-std-gnu11-to-decompressor-and-purgatory-cflags.patch
+revert-ipv6-save-dontfrag-in-cork.patch