From: Flavio Leitner Date: Sat, 29 Aug 2015 00:52:36 +0000 (-0300) Subject: datapath: check for rx handler register X-Git-Tag: v2.5.0~658 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=572e54faff70760f4bfe4a7cffc9553e6743199e datapath: check for rx handler register Red Hat Enterprise Linux 6 has backported the netdev RX handler facility so use the netdev_rx_handler_register as an indicator. The handler prototype changed between 2.6.36 and 2.6.39 since there could be backports in any stage, don't look at the kernel version, but at the prototype. Signed-off-by: Flavio Leitner Signed-off-by: Jesse Gross --- diff --git a/acinclude.m4 b/acinclude.m4 index 73bbe8c4f..dbaee29c0 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -338,6 +338,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [can_checksum_protocol]) OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netdev_features_t]) OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [pcpu_sw_netstats]) + OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netdev_rx_handler_register]) + OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [net_device_extended]) + OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [rx_handler_func_t.*pskb], + [OVS_DEFINE([HAVE_RX_HANDLER_PSKB])]) OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn.*nf_hook_ops], [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_OPS])]) diff --git a/datapath/linux/compat/dev-openvswitch.c b/datapath/linux/compat/dev-openvswitch.c index 256d58175..38ec8fe9e 100644 --- a/datapath/linux/compat/dev-openvswitch.c +++ b/datapath/linux/compat/dev-openvswitch.c @@ -33,7 +33,7 @@ void dev_disable_lro(struct net_device *dev) { } #endif /* HAVE_DEV_DISABLE_LRO */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) || \ +#if !defined HAVE_NETDEV_RX_HANDLER_REGISTER || \ defined HAVE_RHEL_OVS_HOOK static int nr_bridges; diff --git a/datapath/linux/compat/include/linux/netdevice.h b/datapath/linux/compat/include/linux/netdevice.h index 3deb93dbb..0fb2144c6 100644 --- a/datapath/linux/compat/include/linux/netdevice.h +++ b/datapath/linux/compat/include/linux/netdevice.h @@ -43,7 +43,7 @@ extern void unregister_netdevice_many(struct list_head *head); extern void dev_disable_lro(struct net_device *dev); #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) || \ +#if !defined HAVE_NETDEV_RX_HANDLER_REGISTER || \ defined HAVE_RHEL_OVS_HOOK #ifdef HAVE_RHEL_OVS_HOOK diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c index de8508756..6c8373740 100644 --- a/datapath/vport-netdev.c +++ b/datapath/vport-netdev.c @@ -38,7 +38,7 @@ static struct vport_ops ovs_netdev_vport_ops; static void netdev_port_receive(struct vport *vport, struct sk_buff *skb); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39) +#if defined HAVE_RX_HANDLER_PSKB /* 2.6.39 and above or backports */ /* Called with rcu_read_lock and bottom-halves disabled. */ static rx_handler_result_t netdev_frame_hook(struct sk_buff **pskb) { @@ -257,7 +257,7 @@ drop: /* Returns null if this device is not attached to a datapath. */ struct vport *ovs_netdev_get_vport(struct net_device *dev) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) || \ +#if defined HAVE_NETDEV_RX_HANDLER_REGISTER || \ defined HAVE_RHEL_OVS_HOOK #ifdef HAVE_OVS_DATAPATH if (likely(dev->priv_flags & IFF_OVS_DATAPATH)) @@ -266,8 +266,13 @@ struct vport *ovs_netdev_get_vport(struct net_device *dev) #endif #ifdef HAVE_RHEL_OVS_HOOK return (struct vport *)rcu_dereference_rtnl(dev->ax25_ptr); +#else +#ifdef HAVE_NET_DEVICE_EXTENDED + return (struct vport *) + rcu_dereference_rtnl(netdev_extended(dev)->rx_handler_data); #else return (struct vport *)rcu_dereference_rtnl(dev->rx_handler_data); +#endif #endif else return NULL; @@ -294,7 +299,7 @@ void ovs_netdev_exit(void) ovs_vport_ops_unregister(&ovs_netdev_vport_ops); } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36) && \ +#if !defined HAVE_NETDEV_RX_HANDLER_REGISTER && \ !defined HAVE_RHEL_OVS_HOOK /* * Enforces, mutual exclusion with the Linux bridge module, by declaring and