From 0d3d020ba6c4f4f84cc20821dbd8b542ac994d37 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 13 Oct 2017 13:25:42 -0700 Subject: [PATCH] virDomainInterfaceStats: Accept MAC address too https://bugzilla.redhat.com/show_bug.cgi?id=1497396 The other APIs accept both, ifname and MAC address. There's no reason virDomainInterfaceStats can't do the same. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- include/libvirt/libvirt-domain.h | 2 +- src/driver-hypervisor.h | 2 +- src/libvirt-domain.c | 15 ++++++++------- src/libxl/libxl_driver.c | 6 +++--- src/lxc/lxc_driver.c | 6 +++--- src/openvz/openvz_driver.c | 6 +++--- src/qemu/qemu_driver.c | 8 ++++---- src/remote/remote_protocol.x | 2 +- src/remote_protocol-structs | 2 +- src/test/test_driver.c | 9 +++++---- src/vz/vz_driver.c | 4 ++-- src/vz/vz_sdk.c | 9 +++++++-- src/xen/xen_driver.c | 4 ++-- tools/virsh.pod | 3 ++- 14 files changed, 43 insertions(+), 35 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index b181c0be4d..9fb94a9837 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1571,7 +1571,7 @@ int virDomainBlockStatsFlags (virDomainPtr dom, int *nparams, unsigned int flags); int virDomainInterfaceStats (virDomainPtr dom, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats, size_t size); diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 6c3f7d7957..4de0581c3f 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -486,7 +486,7 @@ typedef int typedef int (*virDrvDomainInterfaceStats)(virDomainPtr domain, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats); typedef int diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index d2d022a664..fc2e4ce381 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -5507,14 +5507,15 @@ virDomainBlockStatsFlags(virDomainPtr dom, /** * virDomainInterfaceStats: * @dom: pointer to the domain object - * @path: path to the interface + * @device: the interface name or MAC address * @stats: network interface stats (returned) * @size: size of stats structure * * This function returns network interface stats for interfaces * attached to the domain. * - * The path parameter is the name of the network interface. + * The @device parameter is the network interface either by name or MAC + * address. * * Domains may have more than one network interface. To get stats for * each you should make multiple calls to this function. @@ -5528,20 +5529,20 @@ virDomainBlockStatsFlags(virDomainPtr dom, * Returns: 0 in case of success or -1 in case of failure. */ int -virDomainInterfaceStats(virDomainPtr dom, const char *path, +virDomainInterfaceStats(virDomainPtr dom, const char *device, virDomainInterfaceStatsPtr stats, size_t size) { virConnectPtr conn; virDomainInterfaceStatsStruct stats2 = { -1, -1, -1, -1, -1, -1, -1, -1 }; - VIR_DOMAIN_DEBUG(dom, "path=%s, stats=%p, size=%zi", - path, stats, size); + VIR_DOMAIN_DEBUG(dom, "device=%s, stats=%p, size=%zi", + device, stats, size); virResetLastError(); virCheckDomainReturn(dom, -1); - virCheckNonNullArgGoto(path, error); + virCheckNonNullArgGoto(device, error); virCheckNonNullArgGoto(stats, error); if (size > sizeof(stats2)) { virReportInvalidArg(size, @@ -5553,7 +5554,7 @@ virDomainInterfaceStats(virDomainPtr dom, const char *path, conn = dom->conn; if (conn->driver->domainInterfaceStats) { - if (conn->driver->domainInterfaceStats(dom, path, &stats2) == -1) + if (conn->driver->domainInterfaceStats(dom, device, &stats2) == -1) goto error; memcpy(stats, &stats2, size); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 1c4abb6d36..08b0f03177 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4956,7 +4956,7 @@ libxlDomainIsUpdated(virDomainPtr dom) static int libxlDomainInterfaceStats(virDomainPtr dom, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -4979,10 +4979,10 @@ libxlDomainInterfaceStats(virDomainPtr dom, goto endjob; } - if (!(net = virDomainNetFindByName(vm->def, path))) + if (!(net = virDomainNetFind(vm->def, device))) goto endjob; - if (virNetDevTapInterfaceStats(path, stats, + if (virNetDevTapInterfaceStats(device, stats, !virDomainNetTypeSharesHostView(net)) < 0) goto endjob; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 95a2d8a78a..6cf4993679 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2849,7 +2849,7 @@ lxcDomainGetBlkioParameters(virDomainPtr dom, static int lxcDomainInterfaceStats(virDomainPtr dom, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats) { virDomainObjPtr vm; @@ -2872,10 +2872,10 @@ lxcDomainInterfaceStats(virDomainPtr dom, goto endjob; } - if (!(net = virDomainNetFindByName(vm->def, path))) + if (!(net = virDomainNetFind(vm->def, device))) goto endjob; - if (virNetDevTapInterfaceStats(path, stats, + if (virNetDevTapInterfaceStats(device, stats, !virDomainNetTypeSharesHostView(net)) < 0) goto endjob; diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 8d1af7d7c7..ffd64da04b 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1980,7 +1980,7 @@ openvzGetVEStatus(virDomainObjPtr vm, int *status, int *reason) static int openvzDomainInterfaceStats(virDomainPtr dom, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats) { struct openvz_driver *driver = dom->conn->privateData; @@ -2006,10 +2006,10 @@ openvzDomainInterfaceStats(virDomainPtr dom, goto cleanup; } - if (!(net = virDomainNetFindByName(vm->def, path))) + if (!(net = virDomainNetFind(vm->def, device))) goto cleanup; - if (virNetDevTapInterfaceStats(path, stats, + if (virNetDevTapInterfaceStats(device, stats, !virDomainNetTypeSharesHostView(net)) < 0) goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 00de5150c8..7b79c09505 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11021,7 +11021,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom, static int qemuDomainInterfaceStats(virDomainPtr dom, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats) { virDomainObjPtr vm; @@ -11040,14 +11040,14 @@ qemuDomainInterfaceStats(virDomainPtr dom, goto cleanup; } - if (!(net = virDomainNetFindByName(vm->def, path))) + if (!(net = virDomainNetFind(vm->def, device))) goto cleanup; if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_VHOSTUSER) { - if (virNetDevOpenvswitchInterfaceStats(path, stats) < 0) + if (virNetDevOpenvswitchInterfaceStats(device, stats) < 0) goto cleanup; } else { - if (virNetDevTapInterfaceStats(path, stats, + if (virNetDevTapInterfaceStats(device, stats, !virDomainNetTypeSharesHostView(net)) < 0) goto cleanup; } diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 07463b7819..e3014f66bc 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -682,7 +682,7 @@ struct remote_domain_block_stats_flags_ret { struct remote_domain_interface_stats_args { remote_nonnull_domain dom; - remote_nonnull_string path; + remote_nonnull_string device; }; struct remote_domain_interface_stats_ret { /* insert@2 */ diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 6038bf1380..dc78d51c4a 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -348,7 +348,7 @@ struct remote_domain_block_stats_flags_ret { }; struct remote_domain_interface_stats_args { remote_nonnull_domain dom; - remote_nonnull_string path; + remote_nonnull_string device; }; struct remote_domain_interface_stats_ret { int64_t rx_bytes; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d572edf21b..6253b84950 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3160,9 +3160,10 @@ static int testDomainBlockStats(virDomainPtr domain, return ret; } -static int testDomainInterfaceStats(virDomainPtr domain, - const char *path, - virDomainInterfaceStatsPtr stats) +static int +testDomainInterfaceStats(virDomainPtr domain, + const char *device, + virDomainInterfaceStatsPtr stats) { virDomainObjPtr privdom; struct timeval tv; @@ -3180,7 +3181,7 @@ static int testDomainInterfaceStats(virDomainPtr domain, goto error; } - if (!(net = virDomainNetFindByName(privdom->def, path))) + if (!(net = virDomainNetFind(privdom->def, device))) goto error; if (gettimeofday(&tv, NULL) < 0) { diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 9ebb51d60a..c339622298 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1873,7 +1873,7 @@ vzDomainBlockStatsFlags(virDomainPtr domain, static int vzDomainInterfaceStats(virDomainPtr domain, - const char *path, + const char *device, virDomainInterfaceStatsPtr stats) { virDomainObjPtr dom = NULL; @@ -1888,7 +1888,7 @@ vzDomainInterfaceStats(virDomainPtr domain, privdom = dom->privateData; - ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, path, stats); + ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, device, stats); cleanup: virDomainObjEndAPI(&dom); diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 6ead47a0f5..5f377147c6 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -4484,7 +4484,7 @@ prlsdkFindNetByPath(PRL_HANDLE sdkdom, const char *path) } int -prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path, +prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *device, virDomainInterfaceStatsPtr stats) { int ret = -1; @@ -4492,8 +4492,13 @@ prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path, char *name = NULL; PRL_RESULT pret; PRL_HANDLE net = PRL_INVALID_HANDLE; + virMacAddr mac; + + if (virMacAddrParse(device, &mac) == 0) + net = prlsdkFindNetByMAC(sdkdom, device); + else + net = prlsdkFindNetByPath(sdkdom, device); - net = prlsdkFindNetByPath(sdkdom, path); if (net == PRL_INVALID_HANDLE) goto cleanup; diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 8a62481868..901b6ba4b0 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -2109,7 +2109,7 @@ xenUnifiedDomainBlockStats(virDomainPtr dom, const char *path, } static int -xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path, +xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *device, virDomainInterfaceStatsPtr stats) { virDomainDefPtr def = NULL; @@ -2122,7 +2122,7 @@ xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path, if (virDomainInterfaceStatsEnsureACL(dom->conn, def) < 0) goto cleanup; - if (!(net = virDomainNetFind(def, path))) + if (!(net = virDomainNetFind(def, device))) goto cleanup; ret = xenHypervisorDomainInterfaceStats(def, net->ifname, stats); diff --git a/tools/virsh.pod b/tools/virsh.pod index 279bbe7dec..9304ca5250 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -779,7 +779,8 @@ Get network interface stats for a running domain. The network interface stats are only available for interfaces that have a physical source interface. This does not include, for example, a 'user' interface type since it is a virtual LAN with NAT to the -outside world. +outside world. I can be the interface target by +name or MAC address. =item B I I I [I<--config>]