diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2014-07-03 11:38:29 -0700 |
---|---|---|
committer | Pravin B Shelar <pshelar@nicira.com> | 2014-07-11 09:52:50 -0700 |
commit | c7d084d6a5dd09b125ae1794a44e7c59db1762f5 (patch) | |
tree | 6ad47a2a72dc1fd91bf6bf389e27e67262d4ae15 /datapath | |
parent | ff8eeabd0dfa967c161c1591daea826f0da23da6 (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.h | 42 | ||||
-rw-r--r-- | datapath/linux/compat/include/net/gre.h | 11 | ||||
-rw-r--r-- | datapath/linux/compat/include/net/vxlan.h | 16 | ||||
-rw-r--r-- | datapath/vport-geneve.c | 5 | ||||
-rw-r--r-- | datapath/vport-internal_dev.c | 8 | ||||
-rw-r--r-- | datapath/vport-lisp.c | 5 |
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)) |