[Intel-wired-lan] [net-next PATCH] ixgbe/ixgbevf: Enables TSO for MPLS encapsulated packets

Peterson, Scott D scott.d.peterson at intel.com
Tue Nov 15 19:03:59 UTC 2016


This patch advertises TSO & GSO features in netdev->mpls_features. 
In ixgbe(vf)_tso() where we set up segmentation offload, the IP 
header will be the inner network header when eth_p_mpls() indicates
the Ethernet protocol is MPLS (UC or MC).

We're submitting this upstream first, because it depends on related
upstream changes not yet present in the OOT drivers.

Suggested-by: Alexander Duyck <alexander.h.duyck at intel.com>
Signed-off-by: Scott Peterson <scott.d.peterson at intel.com>
---

 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c     | 12 ++++++++++--
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 12 ++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 2436984..04b2ceb 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -55,6 +55,7 @@
 #include <net/tc_act/tc_gact.h>
 #include <net/tc_act/tc_mirred.h>
 #include <net/vxlan.h>
+#include <net/mpls.h>
 
 #include "ixgbe.h"
 #include "ixgbe_common.h"
@@ -7279,7 +7280,10 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
        if (err < 0)
                return err;
 
-       ip.hdr = skb_network_header(skb);
+       if (eth_p_mpls(first->protocol))
+               ip.hdr = skb_inner_network_header(skb);
+       else
+               ip.hdr = skb_network_header(skb);
        l4.hdr = skb_checksum_start(skb);
 
        /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
@@ -9653,7 +9657,11 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        netdev->vlan_features |= netdev->features | NETIF_F_TSO_MANGLEID;
        netdev->hw_enc_features |= netdev->vlan_features;
-       netdev->mpls_features |= NETIF_F_HW_CSUM;
+       netdev->mpls_features |= NETIF_F_SG |
+                                NETIF_F_TSO |
+                                NETIF_F_TSO6 |
+                                NETIF_F_HW_CSUM;
+       netdev->mpls_features |= IXGBE_GSO_PARTIAL_FEATURES;
 
        /* set this bit last since it cannot be part of vlan_features */
        netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index d316f50..8498eed 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -49,6 +49,7 @@
 #include <linux/if.h>
 #include <linux/if_vlan.h>
 #include <linux/prefetch.h>
+#include <net/mpls.h>
 
 #include "ixgbevf.h"
 
@@ -3327,7 +3328,10 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
        if (err < 0)
                return err;
 
-       ip.hdr = skb_network_header(skb);
+       if (eth_p_mpls(first->protocol))
+               ip.hdr = skb_inner_network_header(skb);
+       else
+               ip.hdr = skb_network_header(skb);
        l4.hdr = skb_checksum_start(skb);
 
        /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
@@ -4083,7 +4087,11 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                netdev->features |= NETIF_F_HIGHDMA;
 
        netdev->vlan_features |= netdev->features | NETIF_F_TSO_MANGLEID;
-       netdev->mpls_features |= NETIF_F_HW_CSUM;
+       netdev->mpls_features |= NETIF_F_SG |
+                                NETIF_F_TSO |
+                                NETIF_F_TSO6 |
+                                NETIF_F_HW_CSUM;
+       netdev->mpls_features |= IXGBEVF_GSO_PARTIAL_FEATURES;
        netdev->hw_enc_features |= netdev->vlan_features;
 
        /* set this bit last since it cannot be part of vlan_features */


More information about the Intel-wired-lan mailing list