mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Move virstat.c code to virnetdevtap.c
This is just a code move of virstat.c to virnetdevtap.c
This commit is contained in:
parent
9b6de7c506
commit
e0d893e86d
@ -242,7 +242,6 @@ src/util/virscsivhost.c
|
|||||||
src/util/virsecret.c
|
src/util/virsecret.c
|
||||||
src/util/virsexpr.c
|
src/util/virsexpr.c
|
||||||
src/util/virsocketaddr.c
|
src/util/virsocketaddr.c
|
||||||
src/util/virstats.c
|
|
||||||
src/util/virstorageencryption.c
|
src/util/virstorageencryption.c
|
||||||
src/util/virstoragefile.c
|
src/util/virstoragefile.c
|
||||||
src/util/virstring.c
|
src/util/virstring.c
|
||||||
|
@ -169,7 +169,6 @@ UTIL_SOURCES = \
|
|||||||
util/virsecret.c util/virsecret.h \
|
util/virsecret.c util/virsecret.h \
|
||||||
util/virsexpr.c util/virsexpr.h \
|
util/virsexpr.c util/virsexpr.h \
|
||||||
util/virsocketaddr.h util/virsocketaddr.c \
|
util/virsocketaddr.h util/virsocketaddr.c \
|
||||||
util/virstats.c util/virstats.h \
|
|
||||||
util/virstorageencryption.c util/virstorageencryption.h \
|
util/virstorageencryption.c util/virstorageencryption.h \
|
||||||
util/virstoragefile.c util/virstoragefile.h \
|
util/virstoragefile.c util/virstoragefile.h \
|
||||||
util/virstring.h util/virstring.c \
|
util/virstring.h util/virstring.c \
|
||||||
|
@ -2058,6 +2058,7 @@ virNetDevTapCreateInBridgePort;
|
|||||||
virNetDevTapDelete;
|
virNetDevTapDelete;
|
||||||
virNetDevTapGetName;
|
virNetDevTapGetName;
|
||||||
virNetDevTapGetRealDeviceName;
|
virNetDevTapGetRealDeviceName;
|
||||||
|
virNetDevTapInterfaceStats;
|
||||||
|
|
||||||
|
|
||||||
# util/virnetdevveth.h
|
# util/virnetdevveth.h
|
||||||
@ -2396,9 +2397,6 @@ virSocketAddrSetIPv6Addr;
|
|||||||
virSocketAddrSetIPv6AddrNetOrder;
|
virSocketAddrSetIPv6AddrNetOrder;
|
||||||
virSocketAddrSetPort;
|
virSocketAddrSetPort;
|
||||||
|
|
||||||
# util/virstats.h
|
|
||||||
virNetDevTapInterfaceStats;
|
|
||||||
|
|
||||||
# util/virstorageencryption.h
|
# util/virstorageencryption.h
|
||||||
virStorageEncryptionFormat;
|
virStorageEncryptionFormat;
|
||||||
virStorageEncryptionFree;
|
virStorageEncryptionFree;
|
||||||
|
@ -61,7 +61,7 @@
|
|||||||
#include "virhostdev.h"
|
#include "virhostdev.h"
|
||||||
#include "network/bridge_driver.h"
|
#include "network/bridge_driver.h"
|
||||||
#include "locking/domain_lock.h"
|
#include "locking/domain_lock.h"
|
||||||
#include "virstats.h"
|
#include "virnetdevtap.h"
|
||||||
#include "cpu/cpu.h"
|
#include "cpu/cpu.h"
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_LIBXL
|
#define VIR_FROM_THIS VIR_FROM_LIBXL
|
||||||
|
@ -61,7 +61,6 @@
|
|||||||
#include "virhostcpu.h"
|
#include "virhostcpu.h"
|
||||||
#include "virhostmem.h"
|
#include "virhostmem.h"
|
||||||
#include "viruuid.h"
|
#include "viruuid.h"
|
||||||
#include "virstats.h"
|
|
||||||
#include "virhook.h"
|
#include "virhook.h"
|
||||||
#include "virfile.h"
|
#include "virfile.h"
|
||||||
#include "virpidfile.h"
|
#include "virpidfile.h"
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
#include "vircommand.h"
|
#include "vircommand.h"
|
||||||
#include "viruri.h"
|
#include "viruri.h"
|
||||||
#include "virstats.h"
|
#include "virnetdevtap.h"
|
||||||
#include "virstring.h"
|
#include "virstring.h"
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_OPENVZ
|
#define VIR_FROM_THIS VIR_FROM_OPENVZ
|
||||||
|
@ -65,7 +65,7 @@
|
|||||||
#include "nodeinfo.h"
|
#include "nodeinfo.h"
|
||||||
#include "virhostcpu.h"
|
#include "virhostcpu.h"
|
||||||
#include "virhostmem.h"
|
#include "virhostmem.h"
|
||||||
#include "virstats.h"
|
#include "virnetdevtap.h"
|
||||||
#include "virnetdevopenvswitch.h"
|
#include "virnetdevopenvswitch.h"
|
||||||
#include "capabilities.h"
|
#include "capabilities.h"
|
||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
|
@ -48,7 +48,6 @@
|
|||||||
#include "nodeinfo.h"
|
#include "nodeinfo.h"
|
||||||
#include "virhostcpu.h"
|
#include "virhostcpu.h"
|
||||||
#include "virhostmem.h"
|
#include "virhostmem.h"
|
||||||
#include "virstats.h"
|
|
||||||
#include "capabilities.h"
|
#include "capabilities.h"
|
||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
#include "viruuid.h"
|
#include "viruuid.h"
|
||||||
|
@ -33,7 +33,13 @@
|
|||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
#include "virstring.h"
|
#include "virstring.h"
|
||||||
|
#include "datatypes.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <regex.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
@ -44,6 +50,9 @@
|
|||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
# include <net/if_tap.h>
|
# include <net/if_tap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAVE_GETIFADDRS) && defined(AF_LINK)
|
||||||
|
# include <ifaddrs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_NONE
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
||||||
|
|
||||||
@ -601,3 +610,137 @@ int virNetDevTapCreateInBridgePort(const char *brname,
|
|||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-------------------- interface stats --------------------*/
|
||||||
|
/* Just reads the named interface, so not Xen or QEMU-specific.
|
||||||
|
* NB. Caller must check that libvirt user is trying to query
|
||||||
|
* the interface of a domain they own. We do no such checking.
|
||||||
|
*/
|
||||||
|
#ifdef __linux__
|
||||||
|
int
|
||||||
|
virNetDevTapInterfaceStats(const char *ifname,
|
||||||
|
virDomainInterfaceStatsPtr stats)
|
||||||
|
{
|
||||||
|
int ifname_len;
|
||||||
|
FILE *fp;
|
||||||
|
char line[256], *colon;
|
||||||
|
|
||||||
|
fp = fopen("/proc/net/dev", "r");
|
||||||
|
if (!fp) {
|
||||||
|
virReportSystemError(errno, "%s",
|
||||||
|
_("Could not open /proc/net/dev"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ifname_len = strlen(ifname);
|
||||||
|
|
||||||
|
while (fgets(line, sizeof(line), fp)) {
|
||||||
|
long long dummy;
|
||||||
|
long long rx_bytes;
|
||||||
|
long long rx_packets;
|
||||||
|
long long rx_errs;
|
||||||
|
long long rx_drop;
|
||||||
|
long long tx_bytes;
|
||||||
|
long long tx_packets;
|
||||||
|
long long tx_errs;
|
||||||
|
long long tx_drop;
|
||||||
|
|
||||||
|
/* The line looks like:
|
||||||
|
* " eth0:..."
|
||||||
|
* Split it at the colon.
|
||||||
|
*/
|
||||||
|
colon = strchr(line, ':');
|
||||||
|
if (!colon) continue;
|
||||||
|
*colon = '\0';
|
||||||
|
if (colon-ifname_len >= line &&
|
||||||
|
STREQ(colon-ifname_len, ifname)) {
|
||||||
|
/* IMPORTANT NOTE!
|
||||||
|
* /proc/net/dev vif<domid>.nn sees the network from the point
|
||||||
|
* of view of dom0 / hypervisor. So bytes TRANSMITTED by dom0
|
||||||
|
* are bytes RECEIVED by the domain. That's why the TX/RX fields
|
||||||
|
* appear to be swapped here.
|
||||||
|
*/
|
||||||
|
if (sscanf(colon+1,
|
||||||
|
"%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld",
|
||||||
|
&tx_bytes, &tx_packets, &tx_errs, &tx_drop,
|
||||||
|
&dummy, &dummy, &dummy, &dummy,
|
||||||
|
&rx_bytes, &rx_packets, &rx_errs, &rx_drop,
|
||||||
|
&dummy, &dummy, &dummy, &dummy) != 16)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stats->rx_bytes = rx_bytes;
|
||||||
|
stats->rx_packets = rx_packets;
|
||||||
|
stats->rx_errs = rx_errs;
|
||||||
|
stats->rx_drop = rx_drop;
|
||||||
|
stats->tx_bytes = tx_bytes;
|
||||||
|
stats->tx_packets = tx_packets;
|
||||||
|
stats->tx_errs = tx_errs;
|
||||||
|
stats->tx_drop = tx_drop;
|
||||||
|
VIR_FORCE_FCLOSE(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VIR_FORCE_FCLOSE(fp);
|
||||||
|
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("/proc/net/dev: Interface not found"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#elif defined(HAVE_GETIFADDRS) && defined(AF_LINK)
|
||||||
|
int
|
||||||
|
virNetDevTapInterfaceStats(const char *ifname,
|
||||||
|
virDomainInterfaceStatsPtr stats)
|
||||||
|
{
|
||||||
|
struct ifaddrs *ifap, *ifa;
|
||||||
|
struct if_data *ifd;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (getifaddrs(&ifap) < 0) {
|
||||||
|
virReportSystemError(errno, "%s",
|
||||||
|
_("Could not get interface list"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||||
|
if (ifa->ifa_addr->sa_family != AF_LINK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (STREQ(ifa->ifa_name, ifname)) {
|
||||||
|
ifd = (struct if_data *)ifa->ifa_data;
|
||||||
|
stats->tx_bytes = ifd->ifi_ibytes;
|
||||||
|
stats->tx_packets = ifd->ifi_ipackets;
|
||||||
|
stats->tx_errs = ifd->ifi_ierrors;
|
||||||
|
stats->tx_drop = ifd->ifi_iqdrops;
|
||||||
|
stats->rx_bytes = ifd->ifi_obytes;
|
||||||
|
stats->rx_packets = ifd->ifi_opackets;
|
||||||
|
stats->rx_errs = ifd->ifi_oerrors;
|
||||||
|
# ifdef HAVE_STRUCT_IF_DATA_IFI_OQDROPS
|
||||||
|
stats->rx_drop = ifd->ifi_oqdrops;
|
||||||
|
# else
|
||||||
|
stats->rx_drop = 0;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Interface not found"));
|
||||||
|
|
||||||
|
freeifaddrs(ifap);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
int
|
||||||
|
virNetDevTapInterfaceStats(const char *ifname ATTRIBUTE_UNUSED,
|
||||||
|
virDomainInterfaceStatsPtr stats ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("interface stats not implemented on this platform"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __linux__ */
|
||||||
|
@ -75,5 +75,8 @@ int virNetDevTapCreateInBridgePort(const char *brname,
|
|||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
||||||
ATTRIBUTE_RETURN_CHECK;
|
ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
|
int virNetDevTapInterfaceStats(const char *ifname,
|
||||||
|
virDomainInterfaceStatsPtr stats)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
#endif /* __VIR_NETDEV_TAP_H__ */
|
#endif /* __VIR_NETDEV_TAP_H__ */
|
||||||
|
@ -1,178 +0,0 @@
|
|||||||
/*
|
|
||||||
* virstats.c: Block and network stats.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007-2010, 2014 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see
|
|
||||||
* <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Richard W.M. Jones <rjones@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <regex.h>
|
|
||||||
|
|
||||||
#if defined(HAVE_GETIFADDRS) && defined(AF_LINK)
|
|
||||||
# include <net/if.h>
|
|
||||||
# include <ifaddrs.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "virerror.h"
|
|
||||||
#include "datatypes.h"
|
|
||||||
#include "virstats.h"
|
|
||||||
#include "viralloc.h"
|
|
||||||
#include "virfile.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_STATS_LINUX
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------- interface stats --------------------*/
|
|
||||||
/* Just reads the named interface, so not Xen or QEMU-specific.
|
|
||||||
* NB. Caller must check that libvirt user is trying to query
|
|
||||||
* the interface of a domain they own. We do no such checking.
|
|
||||||
*/
|
|
||||||
#ifdef __linux__
|
|
||||||
int
|
|
||||||
virNetDevTapInterfaceStats(const char *ifname,
|
|
||||||
virDomainInterfaceStatsPtr stats)
|
|
||||||
{
|
|
||||||
int ifname_len;
|
|
||||||
FILE *fp;
|
|
||||||
char line[256], *colon;
|
|
||||||
|
|
||||||
fp = fopen("/proc/net/dev", "r");
|
|
||||||
if (!fp) {
|
|
||||||
virReportSystemError(errno, "%s",
|
|
||||||
_("Could not open /proc/net/dev"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifname_len = strlen(ifname);
|
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), fp)) {
|
|
||||||
long long dummy;
|
|
||||||
long long rx_bytes;
|
|
||||||
long long rx_packets;
|
|
||||||
long long rx_errs;
|
|
||||||
long long rx_drop;
|
|
||||||
long long tx_bytes;
|
|
||||||
long long tx_packets;
|
|
||||||
long long tx_errs;
|
|
||||||
long long tx_drop;
|
|
||||||
|
|
||||||
/* The line looks like:
|
|
||||||
* " eth0:..."
|
|
||||||
* Split it at the colon.
|
|
||||||
*/
|
|
||||||
colon = strchr(line, ':');
|
|
||||||
if (!colon) continue;
|
|
||||||
*colon = '\0';
|
|
||||||
if (colon - ifname_len >= line &&
|
|
||||||
STREQ(colon - ifname_len, ifname)) {
|
|
||||||
/* IMPORTANT NOTE!
|
|
||||||
* /proc/net/dev vif<domid>.nn sees the network from the point
|
|
||||||
* of view of dom0 / hypervisor. So bytes TRANSMITTED by dom0
|
|
||||||
* are bytes RECEIVED by the domain. That's why the TX/RX fields
|
|
||||||
* appear to be swapped here.
|
|
||||||
*/
|
|
||||||
if (sscanf(colon + 1,
|
|
||||||
"%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld",
|
|
||||||
&tx_bytes, &tx_packets, &tx_errs, &tx_drop,
|
|
||||||
&dummy, &dummy, &dummy, &dummy,
|
|
||||||
&rx_bytes, &rx_packets, &rx_errs, &rx_drop,
|
|
||||||
&dummy, &dummy, &dummy, &dummy) != 16)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
stats->rx_bytes = rx_bytes;
|
|
||||||
stats->rx_packets = rx_packets;
|
|
||||||
stats->rx_errs = rx_errs;
|
|
||||||
stats->rx_drop = rx_drop;
|
|
||||||
stats->tx_bytes = tx_bytes;
|
|
||||||
stats->tx_packets = tx_packets;
|
|
||||||
stats->tx_errs = tx_errs;
|
|
||||||
stats->tx_drop = tx_drop;
|
|
||||||
VIR_FORCE_FCLOSE(fp);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
VIR_FORCE_FCLOSE(fp);
|
|
||||||
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("/proc/net/dev: Interface not found"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#elif defined(HAVE_GETIFADDRS) && defined(AF_LINK)
|
|
||||||
int
|
|
||||||
virNetDevTapInterfaceStats(const char *ifname,
|
|
||||||
virDomainInterfaceStatsPtr stats)
|
|
||||||
{
|
|
||||||
struct ifaddrs *ifap, *ifa;
|
|
||||||
struct if_data *ifd;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
if (getifaddrs(&ifap) < 0) {
|
|
||||||
virReportSystemError(errno, "%s",
|
|
||||||
_("Could not get interface list"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
|
||||||
if (ifa->ifa_addr->sa_family != AF_LINK)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (STREQ(ifa->ifa_name, ifname)) {
|
|
||||||
ifd = (struct if_data *)ifa->ifa_data;
|
|
||||||
stats->tx_bytes = ifd->ifi_ibytes;
|
|
||||||
stats->tx_packets = ifd->ifi_ipackets;
|
|
||||||
stats->tx_errs = ifd->ifi_ierrors;
|
|
||||||
stats->tx_drop = ifd->ifi_iqdrops;
|
|
||||||
stats->rx_bytes = ifd->ifi_obytes;
|
|
||||||
stats->rx_packets = ifd->ifi_opackets;
|
|
||||||
stats->rx_errs = ifd->ifi_oerrors;
|
|
||||||
# ifdef HAVE_STRUCT_IF_DATA_IFI_OQDROPS
|
|
||||||
stats->rx_drop = ifd->ifi_oqdrops;
|
|
||||||
# else
|
|
||||||
stats->rx_drop = 0;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Interface not found"));
|
|
||||||
|
|
||||||
freeifaddrs(ifap);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int
|
|
||||||
virNetDevTapInterfaceStats(const char *ifname ATTRIBUTE_UNUSED,
|
|
||||||
virDomainInterfaceStatsPtr stats ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
|
||||||
_("interface stats not implemented on this platform"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __linux__ */
|
|
@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* virstats.h: Block and network stats.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library. If not, see
|
|
||||||
* <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Richard W.M. Jones <rjones@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __STATS_LINUX_H__
|
|
||||||
# define __STATS_LINUX_H__
|
|
||||||
|
|
||||||
# include "internal.h"
|
|
||||||
|
|
||||||
int virNetDevTapInterfaceStats(const char *ifname,
|
|
||||||
virDomainInterfaceStatsPtr stats)
|
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
|
||||||
|
|
||||||
#endif /* __STATS_LINUX_H__ */
|
|
@ -68,7 +68,7 @@
|
|||||||
#include "xen_driver.h"
|
#include "xen_driver.h"
|
||||||
#include "xen_hypervisor.h"
|
#include "xen_hypervisor.h"
|
||||||
#include "xs_internal.h"
|
#include "xs_internal.h"
|
||||||
#include "virstats.h"
|
#include "virnetdevtap.h"
|
||||||
#include "block_stats.h"
|
#include "block_stats.h"
|
||||||
#include "xend_internal.h"
|
#include "xend_internal.h"
|
||||||
#include "virbuffer.h"
|
#include "virbuffer.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user