You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.8 KiB
127 lines
3.8 KiB
From 563c6968f57f296bf0bfc06528ff603392090da2 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Toppins <jtoppins@redhat.com>
|
|
Date: Wed, 2 Oct 2019 18:23:00 -0400
|
|
Subject: [PATCH 45/96] [netdrv] bnxt_en: Refactor tunneled hardware GRO logic
|
|
|
|
Message-id: <7e0c61958705e069e76dbb6ad6987b3fa99093e6.1570027456.git.jtoppins@redhat.com>
|
|
Patchwork-id: 276461
|
|
O-Subject: [RHEL-8.2 PATCH 38/78] bnxt_en: Refactor tunneled hardware GRO logic.
|
|
Bugzilla: 1724766
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
The 2 GRO functions to set up the hardware GRO SKB fields for 2
|
|
different hardware chips have practically identical logic for
|
|
tunneled packets. Refactor the logic into a separate bnxt_gro_tunnel()
|
|
function that can be used by both functions.
|
|
|
|
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
(cherry picked from commit bee5a188b71657092dc9eb1a529b4e502fe51444)
|
|
Bugzilla: 1724766
|
|
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532
|
|
Tested: build, boot, basic ping
|
|
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
|
|
Signed-off-by: Bruno Meneguele <bmeneg@redhat.com>
|
|
---
|
|
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 69 +++++++++++++------------------
|
|
1 file changed, 28 insertions(+), 41 deletions(-)
|
|
|
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
===================================================================
|
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.250508195 +0100
|
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.376507039 +0100
|
|
@@ -1209,6 +1209,31 @@
|
|
bnxt_reuse_rx_agg_bufs(cpr, idx, 0, agg_bufs, true);
|
|
}
|
|
|
|
+#ifdef CONFIG_INET
|
|
+static void bnxt_gro_tunnel(struct sk_buff *skb, __be16 ip_proto)
|
|
+{
|
|
+ struct udphdr *uh = NULL;
|
|
+
|
|
+ if (ip_proto == htons(ETH_P_IP)) {
|
|
+ struct iphdr *iph = (struct iphdr *)skb->data;
|
|
+
|
|
+ if (iph->protocol == IPPROTO_UDP)
|
|
+ uh = (struct udphdr *)(iph + 1);
|
|
+ } else {
|
|
+ struct ipv6hdr *iph = (struct ipv6hdr *)skb->data;
|
|
+
|
|
+ if (iph->nexthdr == IPPROTO_UDP)
|
|
+ uh = (struct udphdr *)(iph + 1);
|
|
+ }
|
|
+ if (uh) {
|
|
+ if (uh->check)
|
|
+ skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL_CSUM;
|
|
+ else
|
|
+ skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
static struct sk_buff *bnxt_gro_func_5731x(struct bnxt_tpa_info *tpa_info,
|
|
int payload_off, int tcp_ts,
|
|
struct sk_buff *skb)
|
|
@@ -1266,28 +1291,10 @@
|
|
}
|
|
|
|
if (inner_mac_off) { /* tunnel */
|
|
- struct udphdr *uh = NULL;
|
|
__be16 proto = *((__be16 *)(skb->data + outer_ip_off -
|
|
ETH_HLEN - 2));
|
|
|
|
- if (proto == htons(ETH_P_IP)) {
|
|
- struct iphdr *iph = (struct iphdr *)skb->data;
|
|
-
|
|
- if (iph->protocol == IPPROTO_UDP)
|
|
- uh = (struct udphdr *)(iph + 1);
|
|
- } else {
|
|
- struct ipv6hdr *iph = (struct ipv6hdr *)skb->data;
|
|
-
|
|
- if (iph->nexthdr == IPPROTO_UDP)
|
|
- uh = (struct udphdr *)(iph + 1);
|
|
- }
|
|
- if (uh) {
|
|
- if (uh->check)
|
|
- skb_shinfo(skb)->gso_type |=
|
|
- SKB_GSO_UDP_TUNNEL_CSUM;
|
|
- else
|
|
- skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
|
|
- }
|
|
+ bnxt_gro_tunnel(skb, proto);
|
|
}
|
|
#endif
|
|
return skb;
|
|
@@ -1334,28 +1341,8 @@
|
|
return NULL;
|
|
}
|
|
|
|
- if (nw_off) { /* tunnel */
|
|
- struct udphdr *uh = NULL;
|
|
-
|
|
- if (skb->protocol == htons(ETH_P_IP)) {
|
|
- struct iphdr *iph = (struct iphdr *)skb->data;
|
|
-
|
|
- if (iph->protocol == IPPROTO_UDP)
|
|
- uh = (struct udphdr *)(iph + 1);
|
|
- } else {
|
|
- struct ipv6hdr *iph = (struct ipv6hdr *)skb->data;
|
|
-
|
|
- if (iph->nexthdr == IPPROTO_UDP)
|
|
- uh = (struct udphdr *)(iph + 1);
|
|
- }
|
|
- if (uh) {
|
|
- if (uh->check)
|
|
- skb_shinfo(skb)->gso_type |=
|
|
- SKB_GSO_UDP_TUNNEL_CSUM;
|
|
- else
|
|
- skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
|
|
- }
|
|
- }
|
|
+ if (nw_off) /* tunnel */
|
|
+ bnxt_gro_tunnel(skb, skb->protocol);
|
|
#endif
|
|
return skb;
|
|
}
|