The MPLS portions of this were inadvertently broken in v2.4 due to 433637881ca5 ("datapath: define compat __skb_gso_segment()") which inverts the supports_mpls_gso() logic, then when rpl_dev_queue_xmit() backport dropped its VLAN portion in v2.6, the whole function became a no-op - since b63bf2488209 ("datapath: remove VLAN compat code from GSO").
Apparently the MPLS side of this code never worked in a released version of OVS and no-one noticed, so remove it. Signed-off-by: Joe Stringer <j...@ovn.org> --- CC: Simon Horman <ho...@verge.net.au> Simon, I'm not sure what the repercussions are of this but by my reading of the code the extra skb_gso_segment compat code here is never invoked anyway so I figure we can just drop it. Looks like it might've been fine when originally submitted, but by the time v2.4 came out it was already nerfed >.< That said, if we just need to fix the version check to get it working again then that's an option. Also, I see that the upstream commit 48d2ab609b6b ("net: mpls: Fixups for GSO") will further change the way that OVS deals with MPLS GSO, so perhaps we'll actually need to bring back a backport for handling those cases, when that patch is backported to the OVS tree. --- datapath/linux/compat/gso.c | 91 ------------------------- datapath/linux/compat/include/linux/netdevice.h | 5 -- 2 files changed, 96 deletions(-) diff --git a/datapath/linux/compat/gso.c b/datapath/linux/compat/gso.c index 48a56b9f5d5f..2638f1114ede 100644 --- a/datapath/linux/compat/gso.c +++ b/datapath/linux/compat/gso.c @@ -41,97 +41,6 @@ #include "gso.h" -#ifdef OVS_USE_COMPAT_GSO_SEGMENTATION -/* Strictly this is not needed and will be optimised out - * as this code is guarded by if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0). - * It is here to make things explicit should the compatibility - * code be extended in some way prior extending its life-span - * beyond v3.19. - */ -static bool supports_mpls_gso(void) -{ -/* MPLS GSO was introduced in v3.11, however it was not correctly - * activated using mpls_features until v3.19. */ -#ifdef OVS_USE_COMPAT_GSO_SEGMENTATION - return true; -#else - return false; -#endif -} - -int rpl_dev_queue_xmit(struct sk_buff *skb) -{ -#undef dev_queue_xmit - int err = -ENOMEM; - bool mpls; - - mpls = false; - - /* Avoid traversing any VLAN tags that are present to determine if - * the ethtype is MPLS. Instead compare the mac_len (end of L2) and - * skb_network_offset() (beginning of L3) whose inequality will - * indicate the presence of an MPLS label stack. */ - if (skb->mac_len != skb_network_offset(skb) && !supports_mpls_gso()) - mpls = true; - - if (mpls) { - int features; - - features = netif_skb_features(skb); - - /* As of v3.11 the kernel provides an mpls_features field in - * struct net_device which allows devices to advertise which - * features its supports for MPLS. This value defaults to - * NETIF_F_SG and as of v3.19. - * - * This compatibility code is intended for kernels older - * than v3.19 that do not support MPLS GSO and do not - * use mpls_features. Thus this code uses NETIF_F_SG - * directly in place of mpls_features. - */ - if (mpls) - features &= NETIF_F_SG; - - if (netif_needs_gso(skb, features)) { - struct sk_buff *nskb; - - nskb = skb_gso_segment(skb, features); - if (!nskb) { - if (unlikely(skb_cloned(skb) && - pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) - goto drop; - - skb_shinfo(skb)->gso_type &= ~SKB_GSO_DODGY; - goto xmit; - } - - if (IS_ERR(nskb)) { - err = PTR_ERR(nskb); - goto drop; - } - consume_skb(skb); - skb = nskb; - - do { - nskb = skb->next; - skb->next = NULL; - err = dev_queue_xmit(skb); - skb = nskb; - } while (skb); - - return err; - } - } -xmit: - return dev_queue_xmit(skb); - -drop: - kfree_skb(skb); - return err; -} -EXPORT_SYMBOL_GPL(rpl_dev_queue_xmit); -#endif /* OVS_USE_COMPAT_GSO_SEGMENTATION */ - #ifndef USE_UPSTREAM_TUNNEL_GSO static __be16 __skb_network_protocol(struct sk_buff *skb) { diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h index 75315dc16e02..dc05ee9a9ca7 100644 --- a/datapath/linux/compat/include/linux/netdevice.h +++ b/datapath/linux/compat/include/linux/netdevice.h @@ -111,11 +111,6 @@ static inline int rpl_netdev_master_upper_dev_link(struct net_device *dev, #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0) -#define dev_queue_xmit rpl_dev_queue_xmit -int rpl_dev_queue_xmit(struct sk_buff *skb); -#endif - #if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0) static inline struct net_device *rpl_netdev_notifier_info_to_dev(void *info) { -- 2.11.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev