netns_ifaddrs: handle IFLA_STATS{64} correctly

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2018-09-30 12:25:27 +02:00
parent 2a2d77c356
commit da5efb6f76
No known key found for this signature in database
GPG Key ID: 8EB056D53EECB12D
4 changed files with 30 additions and 5 deletions

View File

@ -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 <linux/if_link.h>]])
# Check for some libraries
AX_PTHREAD
AC_SEARCH_LIBS(clock_gettime, [rt])

View File

@ -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));

View File

@ -6,6 +6,7 @@ extern "C" {
#endif
#include <features.h>
#include <linux/if_link.h>
#include <linux/types.h>
#include <netinet/in.h>
#include <stdbool.h>
@ -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

View File

@ -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