datapath: Tolerate backporting of rtnl_link_stats64 (as in RHEL 6).
authorBen Pfaff <blp@nicira.com>
Fri, 4 Feb 2011 20:35:49 +0000 (12:35 -0800)
committerBen Pfaff <blp@nicira.com>
Fri, 4 Feb 2011 20:36:21 +0000 (12:36 -0800)
Red Hat Enterprise Linux 6 has a 2.6.32 kernel but it backports the
rtnl_link_stats64 structure that was introduced in 2.6.35, so we need to
check whether it was defined instead of just guessing based on the kernel
version number.

Build-tested only, on 2.6.32-71.14.1.el6 (RHEL 6),
linux-2.6.18-128.1.6.el5.xs5.5.0.496.101 (XenServer 5.5.0),
2.6.18-128.1.6.el5.xs5.5.0.505.1024xen (XenServer 5.5.0 update 1),
and upstream 2.6.18, 2.6.26, 2.6.29, 2.6.33, 2.6.34, 2.6.36, all for i386,
plus 2.6.36 for x86-64.

My machine's userspace headers have <linux/if_link.h> but not
rtnl_link_stats64.  Jesse Gross tested the case where <linux/if_link.h>
has rtnl_link_stats64, on Ubuntu 10.10.

Reported-by: Geoff White <gwhite@nicira.com>
Tested-by: Jesse Gross <jesse@nicira.com>
acinclude.m4
configure.ac
include/linux/if_link.h
m4/openvswitch.m4

index 0cd1427..fed950b 100644 (file)
@@ -204,6 +204,8 @@ AC_DEFUN([OVS_CHECK_LINUX26_COMPAT], [
   OVS_GREP_IFELSE([$KSRC26/include/net/netlink.h], [nla_get_be16])
   OVS_GREP_IFELSE([$KSRC26/include/net/netlink.h], [nla_find_nested])
 
+  OVS_GREP_IFELSE([$KSRC26/include/linux/if_link.h], [rtnl_link_stats64])
+
   OVS_CHECK_LOG2_H
 
   if cmp -s datapath/linux-2.6/kcompat.h.new \
index adeb956..28af2fe 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2008, 2009, 2010 Nicira Networks
+# Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -47,6 +47,7 @@ OVS_CHECK_NDEBUG
 OVS_CHECK_NETLINK
 OVS_CHECK_OPENSSL
 OVS_CHECK_LOGDIR
+OVS_CHECK_RTNL_LINK_STATS64
 OVS_CHECK_PYTHON
 OVS_CHECK_PYUIC4
 OVS_CHECK_OVSDBMONITOR
index 4afc22b..55d99e4 100644 (file)
@@ -3,6 +3,10 @@
 
 #include <linux/version.h>
 
+#ifdef HAVE_RTNL_LINK_STATS64
+#include_next <linux/if_link.h>
+#else  /* !HAVE_RTNL_LINK_STATS64 */
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
 #include_next <linux/if_link.h>
 #else
@@ -13,9 +17,8 @@
  * turn only really needs __u64.  */
 #include <linux/types.h>
 #include <linux/netlink.h>
-#endif
+#endif /* kernel < 2.6.19 */
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)
 /* The main device statistics structure */
 struct rtnl_link_stats64 {
        __u64   rx_packets;             /* total packets received       */
@@ -48,6 +51,6 @@ struct rtnl_link_stats64 {
        __u64   rx_compressed;
        __u64   tx_compressed;
 };
-#endif /* linux kernel < 2.6.35 */
+#endif /* !HAVE_RTNL_LINK_STATS64 */
 
 #endif
index 077c29b..e6d03a6 100644 (file)
@@ -1,6 +1,6 @@
 # -*- autoconf -*-
 
-# Copyright (c) 2008, 2009, 2010 Nicira Networks.
+# Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -46,6 +46,25 @@ AC_DEFUN([OVS_CHECK_NDEBUG],
      [ndebug=false])
    AM_CONDITIONAL([NDEBUG], [test x$ndebug = xtrue])])
 
+dnl Checks for struct rtnl_link_stats64.
+dnl
+dnl (OVS checks for this structure in both kernel and userspace headers.  This
+dnl is not redundant, because the kernel and userspace builds have completely
+dnl different include paths.  It is possible for the kernel to have this
+dnl structure but not userspace, and vice versa.)
+AC_DEFUN([OVS_CHECK_RTNL_LINK_STATS64],
+  [AC_REQUIRE([OVS_CHECK_NETLINK])
+   if test $HAVE_NETLINK = yes; then
+     AC_CHECK_MEMBER(
+       [struct rtnl_link_stats64.tx_packets],
+       [AC_DEFINE([HAVE_RTNL_LINK_STATS64], [1],
+                  [Define to 1 if <linux/if_link.h> defines
+                   struct rtnl_link_stats64.])],
+       [], [#include <sys/socket.h>     /* Provides sa_family_t. */
+#include <linux/if_link.h>
+])
+   fi])
+
 dnl Checks for Netlink support.
 AC_DEFUN([OVS_CHECK_NETLINK],
   [AC_CHECK_HEADER([linux/netlink.h],