mirror of
https://github.com/immortalwrt/immortalwrt.git
synced 2025-08-11 06:11:53 +08:00

This is an automatically generated commit which aids following Kernel patch history, as git will see the move and copy as a rename thus defeating the purpose. For the original discussion see: https://lists.openwrt.org/pipermail/openwrt-devel/2023-October/041673.html Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com> Link: https://github.com/openwrt/openwrt/pull/16547 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
167 lines
4.6 KiB
Diff
167 lines
4.6 KiB
Diff
From 7516b27c555c1711ec17a5d891befb6986e573a3 Mon Sep 17 00:00:00 2001
|
|
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 2 May 2024 10:44:46 +0200
|
|
Subject: [PATCH 5/6] net: create tcp_gro_header_pull helper function
|
|
|
|
Pull the code out of tcp_gro_receive in order to access the tcp header
|
|
from tcp4/6_gro_receive.
|
|
|
|
Acked-by: Paolo Abeni <pabeni@redhat.com>
|
|
Reviewed-by: Eric Dumazet <edumazet@google.com>
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
Reviewed-by: David Ahern <dsahern@kernel.org>
|
|
Reviewed-by: Willem de Bruijn <willemb@google.com>
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
---
|
|
include/net/tcp.h | 4 ++-
|
|
net/ipv4/tcp_offload.c | 55 +++++++++++++++++++++++++---------------
|
|
net/ipv6/tcpv6_offload.c | 18 +++++++++----
|
|
3 files changed, 50 insertions(+), 27 deletions(-)
|
|
|
|
--- a/include/net/tcp.h
|
|
+++ b/include/net/tcp.h
|
|
@@ -2101,8 +2101,10 @@ void tcp_v4_destroy_sock(struct sock *sk
|
|
|
|
struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
|
netdev_features_t features);
|
|
+struct tcphdr *tcp_gro_pull_header(struct sk_buff *skb);
|
|
struct sk_buff *tcp_gro_lookup(struct list_head *head, struct tcphdr *th);
|
|
-struct sk_buff *tcp_gro_receive(struct list_head *head, struct sk_buff *skb);
|
|
+struct sk_buff *tcp_gro_receive(struct list_head *head, struct sk_buff *skb,
|
|
+ struct tcphdr *th);
|
|
INDIRECT_CALLABLE_DECLARE(int tcp4_gro_complete(struct sk_buff *skb, int thoff));
|
|
INDIRECT_CALLABLE_DECLARE(struct sk_buff *tcp4_gro_receive(struct list_head *head, struct sk_buff *skb));
|
|
INDIRECT_CALLABLE_DECLARE(int tcp6_gro_complete(struct sk_buff *skb, int thoff));
|
|
--- a/net/ipv4/tcp_offload.c
|
|
+++ b/net/ipv4/tcp_offload.c
|
|
@@ -272,40 +272,46 @@ struct sk_buff *tcp_gro_lookup(struct li
|
|
return NULL;
|
|
}
|
|
|
|
-struct sk_buff *tcp_gro_receive(struct list_head *head, struct sk_buff *skb)
|
|
+struct tcphdr *tcp_gro_pull_header(struct sk_buff *skb)
|
|
{
|
|
- struct sk_buff *pp = NULL;
|
|
- struct sk_buff *p;
|
|
+ unsigned int thlen, hlen, off;
|
|
struct tcphdr *th;
|
|
- struct tcphdr *th2;
|
|
- unsigned int len;
|
|
- unsigned int thlen;
|
|
- __be32 flags;
|
|
- unsigned int mss = 1;
|
|
- unsigned int hlen;
|
|
- unsigned int off;
|
|
- int flush = 1;
|
|
- int i;
|
|
|
|
off = skb_gro_offset(skb);
|
|
hlen = off + sizeof(*th);
|
|
th = skb_gro_header(skb, hlen, off);
|
|
if (unlikely(!th))
|
|
- goto out;
|
|
+ return NULL;
|
|
|
|
thlen = th->doff * 4;
|
|
if (thlen < sizeof(*th))
|
|
- goto out;
|
|
+ return NULL;
|
|
|
|
hlen = off + thlen;
|
|
if (skb_gro_header_hard(skb, hlen)) {
|
|
th = skb_gro_header_slow(skb, hlen, off);
|
|
if (unlikely(!th))
|
|
- goto out;
|
|
+ return NULL;
|
|
}
|
|
|
|
skb_gro_pull(skb, thlen);
|
|
|
|
+ return th;
|
|
+}
|
|
+
|
|
+struct sk_buff *tcp_gro_receive(struct list_head *head, struct sk_buff *skb,
|
|
+ struct tcphdr *th)
|
|
+{
|
|
+ unsigned int thlen = th->doff * 4;
|
|
+ struct sk_buff *pp = NULL;
|
|
+ struct sk_buff *p;
|
|
+ struct tcphdr *th2;
|
|
+ unsigned int len;
|
|
+ __be32 flags;
|
|
+ unsigned int mss = 1;
|
|
+ int flush = 1;
|
|
+ int i;
|
|
+
|
|
len = skb_gro_len(skb);
|
|
flags = tcp_flag_word(th);
|
|
|
|
@@ -384,7 +390,6 @@ out_check_final:
|
|
if (p && (!NAPI_GRO_CB(skb)->same_flow || flush))
|
|
pp = p;
|
|
|
|
-out:
|
|
NAPI_GRO_CB(skb)->flush |= (flush != 0);
|
|
|
|
return pp;
|
|
@@ -411,15 +416,23 @@ EXPORT_SYMBOL(tcp_gro_complete);
|
|
INDIRECT_CALLABLE_SCOPE
|
|
struct sk_buff *tcp4_gro_receive(struct list_head *head, struct sk_buff *skb)
|
|
{
|
|
+ struct tcphdr *th;
|
|
+
|
|
/* Don't bother verifying checksum if we're going to flush anyway. */
|
|
if (!NAPI_GRO_CB(skb)->flush &&
|
|
skb_gro_checksum_validate(skb, IPPROTO_TCP,
|
|
- inet_gro_compute_pseudo)) {
|
|
- NAPI_GRO_CB(skb)->flush = 1;
|
|
- return NULL;
|
|
- }
|
|
+ inet_gro_compute_pseudo))
|
|
+ goto flush;
|
|
|
|
- return tcp_gro_receive(head, skb);
|
|
+ th = tcp_gro_pull_header(skb);
|
|
+ if (!th)
|
|
+ goto flush;
|
|
+
|
|
+ return tcp_gro_receive(head, skb, th);
|
|
+
|
|
+flush:
|
|
+ NAPI_GRO_CB(skb)->flush = 1;
|
|
+ return NULL;
|
|
}
|
|
|
|
INDIRECT_CALLABLE_SCOPE int tcp4_gro_complete(struct sk_buff *skb, int thoff)
|
|
--- a/net/ipv6/tcpv6_offload.c
|
|
+++ b/net/ipv6/tcpv6_offload.c
|
|
@@ -16,15 +16,23 @@
|
|
INDIRECT_CALLABLE_SCOPE
|
|
struct sk_buff *tcp6_gro_receive(struct list_head *head, struct sk_buff *skb)
|
|
{
|
|
+ struct tcphdr *th;
|
|
+
|
|
/* Don't bother verifying checksum if we're going to flush anyway. */
|
|
if (!NAPI_GRO_CB(skb)->flush &&
|
|
skb_gro_checksum_validate(skb, IPPROTO_TCP,
|
|
- ip6_gro_compute_pseudo)) {
|
|
- NAPI_GRO_CB(skb)->flush = 1;
|
|
- return NULL;
|
|
- }
|
|
+ ip6_gro_compute_pseudo))
|
|
+ goto flush;
|
|
+
|
|
+ th = tcp_gro_pull_header(skb);
|
|
+ if (!th)
|
|
+ goto flush;
|
|
+
|
|
+ return tcp_gro_receive(head, skb, th);
|
|
|
|
- return tcp_gro_receive(head, skb);
|
|
+flush:
|
|
+ NAPI_GRO_CB(skb)->flush = 1;
|
|
+ return NULL;
|
|
}
|
|
|
|
INDIRECT_CALLABLE_SCOPE int tcp6_gro_complete(struct sk_buff *skb, int thoff)
|