diff --git a/configure.ac b/configure.ac index ac15c1fef..cbd6dbb7b 100644 --- a/configure.ac +++ b/configure.ac @@ -676,6 +676,9 @@ AC_CHECK_FUNCS([strlcat], AC_DEFINE(HAVE_STRLCAT,1,[Have strlcat]), AM_CONDITIONAL(HAVE_STRLCAT, false)) +# HAVE_STRUCT_RTNL_LINK_STATS64={0,1} +AC_CHECK_TYPES([struct rtnl_link_stats64], [], [], [[#include ]]) + # Check for some libraries AX_PTHREAD AC_SEARCH_LIBS(clock_gettime, [rt]) diff --git a/src/include/netns_ifaddrs.c b/src/include/netns_ifaddrs.c index f108ea8c0..855d71607 100644 --- a/src/include/netns_ifaddrs.c +++ b/src/include/netns_ifaddrs.c @@ -177,7 +177,11 @@ static int nl_msg_to_ifaddr(void *pctx, bool *netnsid_aware, struct nlmsghdr *h) #pragma GCC diagnostic ignored "-Wcast-align" for (rta = __NLMSG_RTA(h, sizeof(*ifi)); __NLMSG_RTAOK(rta, h); rta = __RTA_NEXT(rta)) { +#if HAVE_STRUCT_RTNL_LINK_STATS64 + if (rta->rta_type != IFLA_STATS64) +#else if (rta->rta_type != IFLA_STATS) +#endif continue; stats_len = __RTA_DATALEN(rta); @@ -226,11 +230,19 @@ static int nl_msg_to_ifaddr(void *pctx, bool *netnsid_aware, struct nlmsghdr *h) __RTA_DATA(rta), __RTA_DATALEN(rta), ifi->ifi_index, ifi->ifi_type); break; - case IFLA_STATS: - ifs->ifa.ifa_data = (void *)(ifs + 1); - memcpy(ifs->ifa.ifa_data, __RTA_DATA(rta), +#if HAVE_STRUCT_RTNL_LINK_STATS64 + case IFLA_STATS64: + ifs->ifa.ifa_stats_type = IFLA_STATS64; + memcpy(&ifs->ifa.ifa_stats64, __RTA_DATA(rta), __RTA_DATALEN(rta)); break; +#else + case IFLA_STATS: + ifs->ifa.ifa_stats_type = IFLA_STATS; + memcpy(&ifs->ifa.ifa_stats32, __RTA_DATA(rta), + __RTA_DATALEN(rta)); + break; +#endif case IFLA_MTU: memcpy(&ifs->ifa.ifa_mtu, __RTA_DATA(rta), sizeof(int)); diff --git a/src/include/netns_ifaddrs.h b/src/include/netns_ifaddrs.h index bfecbc099..4ab7f46c7 100644 --- a/src/include/netns_ifaddrs.h +++ b/src/include/netns_ifaddrs.h @@ -6,6 +6,7 @@ extern "C" { #endif #include +#include #include #include #include @@ -37,8 +38,10 @@ struct netns_ifaddrs { struct sockaddr *ifu_dstaddr; } ifa_ifu; - /* If you don't know what this is for don't touch it. */ - void *ifa_data; + /* These fields are not present struct ifaddrs. */ + int ifa_stats_type; + struct rtnl_link_stats ifa_stats32; + struct rtnl_link_stats64 ifa_stats64; }; #define __ifa_broadaddr ifa_ifu.ifu_broadaddr diff --git a/src/lxc/macro.h b/src/lxc/macro.h index 471e34f4e..baee5ae8a 100644 --- a/src/lxc/macro.h +++ b/src/lxc/macro.h @@ -283,6 +283,13 @@ extern int __build_bug_on_failed; #define IFA_TARGET_NETNSID 10 #endif +#ifndef IFLA_STATS +#define IFLA_STATS 7 +#endif + +#ifndef IFLA_STATS64 +#define IFLA_STATS64 23 +#endif #ifndef RTM_NEWNSID #define RTM_NEWNSID 88