mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-06-09 18:01:40 +00:00
netns_ifaddrs: handle IFLA_STATS{64} correctly
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
2a2d77c356
commit
da5efb6f76
@ -676,6 +676,9 @@ AC_CHECK_FUNCS([strlcat],
|
|||||||
AC_DEFINE(HAVE_STRLCAT,1,[Have strlcat]),
|
AC_DEFINE(HAVE_STRLCAT,1,[Have strlcat]),
|
||||||
AM_CONDITIONAL(HAVE_STRLCAT, false))
|
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
|
# Check for some libraries
|
||||||
AX_PTHREAD
|
AX_PTHREAD
|
||||||
AC_SEARCH_LIBS(clock_gettime, [rt])
|
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"
|
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||||
for (rta = __NLMSG_RTA(h, sizeof(*ifi)); __NLMSG_RTAOK(rta, h);
|
for (rta = __NLMSG_RTA(h, sizeof(*ifi)); __NLMSG_RTAOK(rta, h);
|
||||||
rta = __RTA_NEXT(rta)) {
|
rta = __RTA_NEXT(rta)) {
|
||||||
|
#if HAVE_STRUCT_RTNL_LINK_STATS64
|
||||||
|
if (rta->rta_type != IFLA_STATS64)
|
||||||
|
#else
|
||||||
if (rta->rta_type != IFLA_STATS)
|
if (rta->rta_type != IFLA_STATS)
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
stats_len = __RTA_DATALEN(rta);
|
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),
|
__RTA_DATA(rta), __RTA_DATALEN(rta),
|
||||||
ifi->ifi_index, ifi->ifi_type);
|
ifi->ifi_index, ifi->ifi_type);
|
||||||
break;
|
break;
|
||||||
case IFLA_STATS:
|
#if HAVE_STRUCT_RTNL_LINK_STATS64
|
||||||
ifs->ifa.ifa_data = (void *)(ifs + 1);
|
case IFLA_STATS64:
|
||||||
memcpy(ifs->ifa.ifa_data, __RTA_DATA(rta),
|
ifs->ifa.ifa_stats_type = IFLA_STATS64;
|
||||||
|
memcpy(&ifs->ifa.ifa_stats64, __RTA_DATA(rta),
|
||||||
__RTA_DATALEN(rta));
|
__RTA_DATALEN(rta));
|
||||||
break;
|
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:
|
case IFLA_MTU:
|
||||||
memcpy(&ifs->ifa.ifa_mtu, __RTA_DATA(rta),
|
memcpy(&ifs->ifa.ifa_mtu, __RTA_DATA(rta),
|
||||||
sizeof(int));
|
sizeof(int));
|
||||||
|
@ -6,6 +6,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <linux/if_link.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -37,8 +38,10 @@ struct netns_ifaddrs {
|
|||||||
struct sockaddr *ifu_dstaddr;
|
struct sockaddr *ifu_dstaddr;
|
||||||
} ifa_ifu;
|
} ifa_ifu;
|
||||||
|
|
||||||
/* If you don't know what this is for don't touch it. */
|
/* These fields are not present struct ifaddrs. */
|
||||||
void *ifa_data;
|
int ifa_stats_type;
|
||||||
|
struct rtnl_link_stats ifa_stats32;
|
||||||
|
struct rtnl_link_stats64 ifa_stats64;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define __ifa_broadaddr ifa_ifu.ifu_broadaddr
|
#define __ifa_broadaddr ifa_ifu.ifu_broadaddr
|
||||||
|
@ -283,6 +283,13 @@ extern int __build_bug_on_failed;
|
|||||||
#define IFA_TARGET_NETNSID 10
|
#define IFA_TARGET_NETNSID 10
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef IFLA_STATS
|
||||||
|
#define IFLA_STATS 7
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IFLA_STATS64
|
||||||
|
#define IFLA_STATS64 23
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef RTM_NEWNSID
|
#ifndef RTM_NEWNSID
|
||||||
#define RTM_NEWNSID 88
|
#define RTM_NEWNSID 88
|
||||||
|
Loading…
Reference in New Issue
Block a user