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>
89 lines
2.6 KiB
Diff
89 lines
2.6 KiB
Diff
From 80e85fbdf19ecc4dfa31ecf639adb55555db02fe Mon Sep 17 00:00:00 2001
|
|
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 2 May 2024 10:44:45 +0200
|
|
Subject: [PATCH 4/6] net: create tcp_gro_lookup helper function
|
|
|
|
This pulls the flow port matching out of tcp_gro_receive, so that it can be
|
|
reused for the next change, which adds the TCP fraglist GRO heuristic.
|
|
|
|
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 | 1 +
|
|
net/ipv4/tcp_offload.c | 41 +++++++++++++++++++++++++----------------
|
|
2 files changed, 26 insertions(+), 16 deletions(-)
|
|
|
|
--- a/include/net/tcp.h
|
|
+++ b/include/net/tcp.h
|
|
@@ -2101,6 +2101,7 @@ void tcp_v4_destroy_sock(struct sock *sk
|
|
|
|
struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
|
netdev_features_t features);
|
|
+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);
|
|
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));
|
|
--- a/net/ipv4/tcp_offload.c
|
|
+++ b/net/ipv4/tcp_offload.c
|
|
@@ -251,6 +251,27 @@ out:
|
|
return segs;
|
|
}
|
|
|
|
+struct sk_buff *tcp_gro_lookup(struct list_head *head, struct tcphdr *th)
|
|
+{
|
|
+ struct tcphdr *th2;
|
|
+ struct sk_buff *p;
|
|
+
|
|
+ list_for_each_entry(p, head, list) {
|
|
+ if (!NAPI_GRO_CB(p)->same_flow)
|
|
+ continue;
|
|
+
|
|
+ th2 = tcp_hdr(p);
|
|
+ if (*(u32 *)&th->source ^ *(u32 *)&th2->source) {
|
|
+ NAPI_GRO_CB(p)->same_flow = 0;
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ return p;
|
|
+ }
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
struct sk_buff *tcp_gro_receive(struct list_head *head, struct sk_buff *skb)
|
|
{
|
|
struct sk_buff *pp = NULL;
|
|
@@ -288,24 +309,12 @@ struct sk_buff *tcp_gro_receive(struct l
|
|
len = skb_gro_len(skb);
|
|
flags = tcp_flag_word(th);
|
|
|
|
- list_for_each_entry(p, head, list) {
|
|
- if (!NAPI_GRO_CB(p)->same_flow)
|
|
- continue;
|
|
-
|
|
- th2 = tcp_hdr(p);
|
|
-
|
|
- if (*(u32 *)&th->source ^ *(u32 *)&th2->source) {
|
|
- NAPI_GRO_CB(p)->same_flow = 0;
|
|
- continue;
|
|
- }
|
|
-
|
|
- goto found;
|
|
- }
|
|
- p = NULL;
|
|
- goto out_check_final;
|
|
+ p = tcp_gro_lookup(head, th);
|
|
+ if (!p)
|
|
+ goto out_check_final;
|
|
|
|
-found:
|
|
/* Include the IP ID check below from the inner most IP hdr */
|
|
+ th2 = tcp_hdr(p);
|
|
flush = NAPI_GRO_CB(p)->flush;
|
|
flush |= (__force int)(flags & TCP_FLAG_CWR);
|
|
flush |= (__force int)((flags ^ tcp_flag_word(th2)) &
|