diff options
-rw-r--r-- | queue-6.6/revert-ipv6-save-dontfrag-in-cork.patch | 86 | ||||
-rw-r--r-- | queue-6.6/series | 1 |
2 files changed, 87 insertions, 0 deletions
diff --git a/queue-6.6/revert-ipv6-save-dontfrag-in-cork.patch b/queue-6.6/revert-ipv6-save-dontfrag-in-cork.patch new file mode 100644 index 0000000000..9d19bdc55d --- /dev/null +++ b/queue-6.6/revert-ipv6-save-dontfrag-in-cork.patch @@ -0,0 +1,86 @@ +From bacs@librecast.net Wed Jul 2 16:20:41 2025 +From: Brett A C Sheffield <bacs@librecast.net> +Date: Wed, 2 Jul 2025 13:37:32 +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: <20250702113731.2322-2-bacs@librecast.net> + + +From: Brett A C Sheffield (Librecast) <bacs@librecast.net> + +This reverts commit 8ebf2709fe4dcd0a1b7b95bf61e529ddcd3cdf51 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 +@@ -199,7 +199,6 @@ struct inet6_cork { + struct ipv6_txoptions *opt; + u8 hop_limit; + u8 tclass; +- u8 dontfrag:1; + }; + + /* struct ipv6_pinfo - ipv6 private area */ +--- a/net/ipv6/ip6_output.c ++++ b/net/ipv6/ip6_output.c +@@ -1452,7 +1452,6 @@ static int ip6_setup_cork(struct sock *s + } + 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); +@@ -1486,7 +1485,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; + struct inet_cork *cork = &cork_full->base; +@@ -1542,7 +1541,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_ICMPV6 || + sk->sk_protocol == IPPROTO_RAW)) { +@@ -1914,7 +1913,7 @@ int ip6_append_data(struct sock *sk, + + return __ip6_append_data(sk, &sk->sk_write_queue, &inet->cork, + &np->cork, sk_page_frag(sk), getfrag, +- from, length, transhdrlen, flags); ++ from, length, transhdrlen, flags, ipc6); + } + EXPORT_SYMBOL_GPL(ip6_append_data); + +@@ -2119,7 +2118,7 @@ struct sk_buff *ip6_make_skb(struct sock + err = __ip6_append_data(sk, &queue, cork, &v6_cork, + ¤t->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-6.6/series b/queue-6.6/series index b2e1ce417d..84ca2dc1b0 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -142,3 +142,4 @@ media-uvcvideo-rollback-non-processed-entities-on-error.patch s390-entry-fix-last-breaking-event-handling-in-case-of-stack-corruption.patch kunit-to-check-the-longest-symbol-length.patch x86-tools-drop-duplicate-unlikely-definition-in-insn_decoder_test.c.patch +revert-ipv6-save-dontfrag-in-cork.patch |