This patch adds support to do necessary processing
for hardware assisted GENEVE tunnel GRO packets before
driver delivers them upto the stack.

Signed-off-by: Manish Chopra <manish.cho...@qlogic.com>
Signed-off-by: Yuval Mintz <yuval.mi...@qlogic.com>
---
 drivers/net/ethernet/qlogic/qede/qede_main.c | 30 ++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c 
b/drivers/net/ethernet/qlogic/qede/qede_main.c
index f94ea16..a4b445f 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -37,6 +37,7 @@
 #include <net/ip6_checksum.h>
 #include <linux/bitops.h>
 #include <net/vxlan.h>
+#include <net/geneve.h>
 
 #include "qede.h"
 
@@ -1205,6 +1206,32 @@ static void qede_handle_vxlan_tunnel_gro(struct sk_buff 
*skb)
        }
 }
 
+static inline struct genevehdr *
+qede_geneve_hdr(struct sk_buff *skb, int off) {
+       return (struct genevehdr *)(skb->data + off + sizeof(struct udphdr));
+}
+
+static void qede_handle_geneve_tunnel_gro(struct sk_buff *skb)
+{
+       struct genevehdr *gh;
+
+       switch (skb->protocol) {
+       case htons(ETH_P_IP):
+               gh = qede_geneve_hdr(skb, sizeof(struct iphdr));
+               qede_set_nh_th_offset(skb, VXLAN_HEADROOM + (gh->opt_len * 4));
+               udp4_gro_complete(skb, sizeof(struct iphdr));
+               break;
+       case htons(ETH_P_IPV6):
+               gh = qede_geneve_hdr(skb, sizeof(struct ipv6hdr));
+               qede_set_nh_th_offset(skb, VXLAN6_HEADROOM + (gh->opt_len * 4));
+               udp6_gro_complete(skb, sizeof(struct ipv6hdr));
+               break;
+       default:
+               WARN_ONCE(1, "Unsupported GENEVE tunnel GRO proto=0x%x\n",
+                         skb->protocol);
+       }
+}
+
 static void qede_handle_tunnel_gro(struct qede_dev *edev,
                                   struct sk_buff *skb, u8 tunnel_type)
 {
@@ -1212,6 +1239,9 @@ static void qede_handle_tunnel_gro(struct qede_dev *edev,
        case ETH_RX_TUNN_VXLAN:
                qede_handle_vxlan_tunnel_gro(skb);
                break;
+       case ETH_RX_TUNN_GENEVE:
+               qede_handle_geneve_tunnel_gro(skb);
+               break;
        default:
                WARN_ONCE(1, "Unsupported tunnel GRO, tunnel type=0x%x\n",
                          tunnel_type);
-- 
2.7.2

Reply via email to