diff options
author | Felix Fietkau <nbd@nbd.name> | 2024-05-02 11:44:42 +0300 |
---|---|---|
committer | Paolo Abeni <pabeni@redhat.com> | 2024-05-06 12:54:03 +0300 |
commit | 8928756d53d5b99dcd18073dc7738b8ebdbe7d96 (patch) | |
tree | 187ab5374db7308f7f1bc0db91091377c5f1c9f1 /net/core/gro.c | |
parent | b1de3c0df7abc41dc41862c0b08386411f2799d7 (diff) | |
download | linux-8928756d53d5b99dcd18073dc7738b8ebdbe7d96.tar.xz |
net: move skb_gro_receive_list from udp to core
This helper function will be used for TCP fraglist GRO support
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>
Diffstat (limited to 'net/core/gro.c')
-rw-r--r-- | net/core/gro.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/net/core/gro.c b/net/core/gro.c index 99a45a5211c9..e2f84947fb74 100644 --- a/net/core/gro.c +++ b/net/core/gro.c @@ -231,6 +231,33 @@ done: return 0; } +int skb_gro_receive_list(struct sk_buff *p, struct sk_buff *skb) +{ + if (unlikely(p->len + skb->len >= 65536)) + return -E2BIG; + + if (NAPI_GRO_CB(p)->last == p) + skb_shinfo(p)->frag_list = skb; + else + NAPI_GRO_CB(p)->last->next = skb; + + skb_pull(skb, skb_gro_offset(skb)); + + NAPI_GRO_CB(p)->last = skb; + NAPI_GRO_CB(p)->count++; + p->data_len += skb->len; + + /* sk ownership - if any - completely transferred to the aggregated packet */ + skb->destructor = NULL; + skb->sk = NULL; + p->truesize += skb->truesize; + p->len += skb->len; + + NAPI_GRO_CB(skb)->same_flow = 1; + + return 0; +} + static void napi_gro_complete(struct napi_struct *napi, struct sk_buff *skb) { |