]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qede: Disable tunnel offloads for non offloaded UDP ports
authorChopra, Manish <Manish.Chopra@cavium.com>
Mon, 24 Apr 2017 17:00:46 +0000 (10:00 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Tue, 19 Sep 2017 05:31:55 +0000 (22:31 -0700)
Orabug: 26783820

This patch disables tunnel offloads via ndo_features_check()
if given UDP port is not offloaded to hardware. This in turn
allows to run multiple tunnel interfaces using different UDP ports.

Signed-off-by: Manish Chopra <manish.chopra@cavium.com>
Signed-off-by: Yuval Mintz <yuval.mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[ Upstream commit 369bfd4ec77f1668e48d395e95849d29fccaa4c3 ]
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
drivers/net/ethernet/qlogic/qede/qede.h
drivers/net/ethernet/qlogic/qede/qede_main.c

index 273336e0165b16e7f9aa45d30bfae20d69197622..48812d8f83a47d18500d3b941541d77203be3ad1 100644 (file)
@@ -233,6 +233,7 @@ struct qede_dev {
        struct delayed_work             sp_task;
        unsigned long                   sp_flags;
        u16                             vxlan_dst_port;
+       u16                             geneve_dst_port;
 
 #ifdef CONFIG_RFS_ACCEL
        struct qede_arfs                *arfs;
index 9a0e11bf553b5c29b4bfe442599bbc3dc471fd85..1ed2b7cf44664a5a72e1c86e5f39c87b30b8c967 100644 (file)
@@ -101,6 +101,9 @@ static const struct qed_eth_ops *qed_ops;
 
 #endif
 
+#define NETIF_F_CSUM_MASK       (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
+                                 NETIF_F_HW_CSUM)
+
 enum qede_pci_private {
        QEDE_PRIVATE_PF,
        QEDE_PRIVATE_VF
@@ -552,15 +555,25 @@ static void qede_del_vxlan_port(struct net_device *dev,
                default:
                        return features;
                }
-
                /* Disable offloads for geneve tunnels, as HW can't parse
-                * the geneve header which has option length greater than 32B.
+                * the geneve header which has option length greater than 32b
+                * and disable offloads for the ports which are not offloaded.
                 */
-               if ((l4_proto == IPPROTO_UDP) &&
-                   ((skb_inner_mac_header(skb) -
-                     skb_transport_header(skb)) > QEDE_MAX_TUN_HDR_LEN))
-                       return features & ~((NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
-                                NETIF_F_HW_CSUM) | NETIF_F_GSO_MASK);
+               if (l4_proto == IPPROTO_UDP) {
+                       struct qede_dev *edev = netdev_priv(dev);
+                       u16 hdrlen, vxln_port, gnv_port;
+
+                       hdrlen = QEDE_MAX_TUN_HDR_LEN;
+                       vxln_port = edev->vxlan_dst_port;
+                       gnv_port = edev->geneve_dst_port;
+
+                       if ((skb_inner_mac_header(skb) -
+                            skb_transport_header(skb)) > hdrlen ||
+                            (ntohs(udp_hdr(skb)->dest) != vxln_port &&
+                             ntohs(udp_hdr(skb)->dest) != gnv_port))
+                               return features & ~(NETIF_F_CSUM_MASK |
+                                                   NETIF_F_GSO_MASK);
+               }
        }
 
        return features;