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

Ben Pfaff blp at nicira.com
Fri Feb 4 20:19:13 UTC 2011


On Fri, Feb 04, 2011 at 11:47:55AM -0800, Jesse Gross wrote:
> On Fri, Feb 4, 2011 at 9:45 AM, Ben Pfaff <blp at nicira.com> wrote:
> > On Thu, Feb 03, 2011 at 05:42:59PM -0800, Jesse Gross wrote:
> >> On Thu, Feb 3, 2011 at 4:04 PM, Ben Pfaff <blp at nicira.com> wrote:
> >> > 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.
> >>
> >> The problem that I ran into (and with this as well) is that the
> >> userspace header check never finds rtnl_link_stats64 even if it
> >> exists. ?So on my machine, which has 2.6.35 userspace and kernel, I
> >> get:
> >
> > When I edited my /usr/include/linux/if_link.h by hand to include
> > rtnl_link_stats64, everything built fine. ?So something else must be in
> > play here. ?What's in config.log regarding rtnl_link_stats64?
> >
> > What distro is on your machine?
> 
> It's Ubuntu 10.10 but I found the problem:  if_link.h includes
> netlink.h which uses sa_family_t which is defined in linux/socket.h
> but only in the kernel.  If I add sys/socket.h to the include list in
> the macro everything works fine.

OK, here's the patch again with (just) that change.

--8<--------------------------cut here-------------------------->8--

From: Ben Pfaff <blp at nicira.com>
Date: Fri, 4 Feb 2011 12:18:31 -0800
Subject: [PATCH] datapath: Tolerate backporting of rtnl_link_stats64 (as done on RHEL 6).

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       |   21 ++++++++++++++++++++-
 4 files changed, 30 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..e6d03a6 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,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],
-- 
1.7.1





More information about the dev mailing list