netns_ifaddrs: handle IFLA_STATS{64} correctly

parent 76f21f71
......@@ -668,6 +668,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])
......
......@@ -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;
#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_data = (void *)(ifs + 1);
memcpy(ifs->ifa.ifa_data, __RTA_DATA(rta),
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));
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment