From 1269f7ae5f4bf23205de2cd45220b2382af78393 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 4 Feb 2011 12:35:49 -0800 Subject: [PATCH] datapath: Tolerate backporting of rtnl_link_stats64 (as in 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 but not rtnl_link_stats64. Jesse Gross tested the case where has rtnl_link_stats64, on Ubuntu 10.10. Reported-by: Geoff White Tested-by: Jesse Gross --- 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 0cd14272d..fed950bd4 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 adeb956ce..28af2fec0 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 4afc22b66..55d99e46e 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h @@ -3,6 +3,10 @@ #include +#ifdef HAVE_RTNL_LINK_STATS64 +#include_next +#else /* !HAVE_RTNL_LINK_STATS64 */ + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19) #include_next #else @@ -13,9 +17,8 @@ * turn only really needs __u64. */ #include #include -#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 077c29b97..e6d03a6bf 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 defines + struct rtnl_link_stats64.])], + [], [#include /* Provides sa_family_t. */ +#include +]) + fi]) + dnl Checks for Netlink support. AC_DEFUN([OVS_CHECK_NETLINK], [AC_CHECK_HEADER([linux/netlink.h], -- 2.43.0