datapath: check for rx handler register
authorFlavio Leitner <fbl@redhat.com>
Sat, 29 Aug 2015 00:52:36 +0000 (21:52 -0300)
committerJesse Gross <jesse@nicira.com>
Mon, 31 Aug 2015 19:48:16 +0000 (12:48 -0700)
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 <fbl@redhat.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
acinclude.m4
datapath/linux/compat/dev-openvswitch.c
datapath/linux/compat/include/linux/netdevice.h
datapath/vport-netdev.c

index 73bbe8c..dbaee29 100644 (file)
@@ -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])])
 
index 256d581..38ec8fe 100644 (file)
@@ -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;
index 3deb93d..0fb2144 100644 (file)
@@ -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
index de85087..6c83737 100644 (file)
@@ -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