aboutsummaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@nicira.com>2014-07-03 11:38:29 -0700
committerPravin B Shelar <pshelar@nicira.com>2014-07-11 09:52:50 -0700
commitc7d084d6a5dd09b125ae1794a44e7c59db1762f5 (patch)
tree6ad47a2a72dc1fd91bf6bf389e27e67262d4ae15 /datapath
parentff8eeabd0dfa967c161c1591daea826f0da23da6 (diff)
datapath: Enable tunnel GSO features.
Following patch enables all available tunnel GSO features for OVS bridge device so that ovs can use hardware offloads available to underling device. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Andy Zhou <azhou@nicira.com>
Diffstat (limited to 'datapath')
-rw-r--r--datapath/linux/compat/include/linux/netdev_features.h42
-rw-r--r--datapath/linux/compat/include/net/gre.h11
-rw-r--r--datapath/linux/compat/include/net/vxlan.h16
-rw-r--r--datapath/vport-geneve.c5
-rw-r--r--datapath/vport-internal_dev.c8
-rw-r--r--datapath/vport-lisp.c5
6 files changed, 86 insertions, 1 deletions
diff --git a/datapath/linux/compat/include/linux/netdev_features.h b/datapath/linux/compat/include/linux/netdev_features.h
index 0259413d9..9f6331d1c 100644
--- a/datapath/linux/compat/include/linux/netdev_features.h
+++ b/datapath/linux/compat/include/linux/netdev_features.h
@@ -9,4 +9,46 @@
#define NETIF_F_HW_VLAN_CTAG_TX NETIF_F_HW_VLAN_TX
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
+#define NETIF_F_GSO_ENCAP_ALL 0
+
+#else
+
+#ifndef NETIF_F_GSO_GRE
+#define NETIF_F_GSO_GRE 0
+#endif
+
+#ifndef NETIF_F_GSO_GRE_CSUM
+#define NETIF_F_GSO_GRE_CSUM 0
+#endif
+
+#ifndef NETIF_F_GSO_IPIP
+#define NETIF_F_GSO_IPIP 0
+#endif
+
+#ifndef NETIF_F_GSO_SIT
+#define NETIF_F_GSO_SIT 0
+#endif
+
+#ifndef NETIF_F_GSO_UDP_TUNNEL
+#define NETIF_F_GSO_UDP_TUNNEL 0
+#endif
+
+#ifndef NETIF_F_GSO_UDP_TUNNEL_CSUM
+#define NETIF_F_GSO_UDP_TUNNEL_CSUM 0
+#endif
+
+#ifndef NETIF_F_GSO_MPLS
+#define NETIF_F_GSO_MPLS 0
+#endif
+
+#define NETIF_F_GSO_ENCAP_ALL (NETIF_F_GSO_GRE | \
+ NETIF_F_GSO_GRE_CSUM | \
+ NETIF_F_GSO_IPIP | \
+ NETIF_F_GSO_SIT | \
+ NETIF_F_GSO_UDP_TUNNEL | \
+ NETIF_F_GSO_UDP_TUNNEL_CSUM | \
+ NETIF_F_GSO_MPLS)
+#endif
+
#endif
diff --git a/datapath/linux/compat/include/net/gre.h b/datapath/linux/compat/include/net/gre.h
index dc035353d..3c69e38e8 100644
--- a/datapath/linux/compat/include/net/gre.h
+++ b/datapath/linux/compat/include/net/gre.h
@@ -103,6 +103,17 @@ static inline int ip_gre_calc_hlen(__be16 o_flags)
addend += 4;
return addend;
}
+#else
+static inline struct sk_buff *rpl_gre_handle_offloads(struct sk_buff *skb,
+ bool gre_csum)
+{
+ if (skb->encapsulation && skb_is_gso(skb)) {
+ kfree_skb(skb);
+ return ERR_PTR(-ENOSYS);
+ }
+ return gre_handle_offloads(skb, gre_csum);
+}
+#define gre_handle_offloads rpl_gre_handle_offloads
#endif
#endif
diff --git a/datapath/linux/compat/include/net/vxlan.h b/datapath/linux/compat/include/net/vxlan.h
index 414a49703..d64630b45 100644
--- a/datapath/linux/compat/include/net/vxlan.h
+++ b/datapath/linux/compat/include/net/vxlan.h
@@ -8,6 +8,22 @@
#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)
#include_next <net/vxlan.h>
+
+static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
+ struct rtable *rt, struct sk_buff *skb,
+ __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
+ __be16 src_port, __be16 dst_port, __be32 vni)
+{
+ if (skb->encapsulation && skb_is_gso(skb)) {
+ kfree_skb(skb);
+ return -ENOSYS;
+ }
+
+ return vxlan_xmit_skb(vs, rt, skb, src, dst, tos, ttl, df,
+ src_port, dst_port, vni);
+}
+
+#define vxlan_xmit_skb rpl_vxlan_xmit_skb
#else
struct vxlan_sock;
diff --git a/datapath/vport-geneve.c b/datapath/vport-geneve.c
index 33047f240..99841d4de 100644
--- a/datapath/vport-geneve.c
+++ b/datapath/vport-geneve.c
@@ -333,6 +333,11 @@ static int handle_offloads(struct sk_buff *skb)
#else
static int handle_offloads(struct sk_buff *skb)
{
+ if (skb->encapsulation && skb_is_gso(skb)) {
+ kfree_skb(skb);
+ return -ENOSYS;
+ }
+
if (skb_is_gso(skb)) {
int err = skb_unclone(skb, GFP_ATOMIC);
if (unlikely(err))
diff --git a/datapath/vport-internal_dev.c b/datapath/vport-internal_dev.c
index 637d712d8..3b0f9a7a4 100644
--- a/datapath/vport-internal_dev.c
+++ b/datapath/vport-internal_dev.c
@@ -155,7 +155,8 @@ static void do_setup(struct net_device *netdev)
netdev->tx_queue_len = 0;
netdev->features = NETIF_F_LLTX | NETIF_F_SG | NETIF_F_FRAGLIST |
- NETIF_F_HIGHDMA | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
+ NETIF_F_HIGHDMA | NETIF_F_HW_CSUM |
+ NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL;
netdev->vlan_features = netdev->features;
netdev->features |= NETIF_F_HW_VLAN_CTAG_TX;
@@ -163,6 +164,11 @@ static void do_setup(struct net_device *netdev)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
netdev->hw_features = netdev->features & ~NETIF_F_LLTX;
#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
+ netdev->hw_enc_features = netdev->features;
+#endif
+
eth_hw_addr_random(netdev);
}
diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c
index c41e09e9d..81ecf923a 100644
--- a/datapath/vport-lisp.c
+++ b/datapath/vport-lisp.c
@@ -409,6 +409,11 @@ static int handle_offloads(struct sk_buff *skb)
#else
static int handle_offloads(struct sk_buff *skb)
{
+ if (skb->encapsulation && skb_is_gso(skb)) {
+ kfree_skb(skb);
+ return -ENOSYS;
+ }
+
if (skb_is_gso(skb)) {
int err = skb_unclone(skb, GFP_ATOMIC);
if (unlikely(err))