[ovs-dev] [PATCH] datapath: Tolerate backporting of rtnl_link_stats64 (as done on RHEL 6).

Ben Pfaff blp at nicira.com
Fri Feb 4 00:04:09 UTC 2011


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.  I didn't test with other userspace headers.

Reported-by: Geoff White <gwhite at nicira.com>
---
 acinclude.m4            |    2 ++
 configure.ac            |    3 ++-
 include/linux/if_link.h |    9 ++++++---
 m4/openvswitch.m4       |   20 +++++++++++++++++++-
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index 0cd1427..fed950b 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -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 \
diff --git a/configure.ac b/configure.ac
index adeb956..28af2fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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
diff --git a/include/linux/if_link.h b/include/linux/if_link.h
index 4afc22b..55d99e4 100644
--- a/include/linux/if_link.h
+++ b/include/linux/if_link.h
@@ -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
diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4
index 077c29b..b992888 100644
--- a/m4/openvswitch.m4
+++ b/m4/openvswitch.m4
@@ -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,24 @@ 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 <linux/if_link.h>
+])
+   fi])
+
 dnl Checks for Netlink support.
 AC_DEFUN([OVS_CHECK_NETLINK],
   [AC_CHECK_HEADER([linux/netlink.h],
-- 
1.7.1





More information about the dev mailing list