On Fri, Feb 04, 2011 at 11:47:55AM -0800, Jesse Gross wrote: > On Fri, Feb 4, 2011 at 9:45 AM, Ben Pfaff <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
