On 04/19/2012 06:32 PM, Guido Günther wrote: > This will only work for veth devices since venet devices don't have > a target element. Well, there is precedent for having stats work on some types of interfaces and not on others - type='user' interfaces in qemu also don't get stats (as the gnome-boxes guys found out, much to their disappointment). (Anyway, my point is that this shouldn't stop us from enabling stats for those interfaces we *can* support :-) > --- > src/openvz/openvz_driver.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c > index 7ec327d..e8b6915 100644 > --- a/src/openvz/openvz_driver.c > +++ b/src/openvz/openvz_driver.c > @@ -57,6 +57,7 @@ > #include "logging.h" > #include "command.h" > #include "viruri.h" > +#include "stats_linux.h" > > #define VIR_FROM_THIS VIR_FROM_OPENVZ > > @@ -1672,6 +1673,56 @@ cleanup: > return ret; > } > > +static int > +openvzDomainInterfaceStats (virDomainPtr dom, > + const char *path, > + struct _virDomainInterfaceStats *stats) > +{ > + struct openvz_driver *driver = dom->conn->privateData; > + virDomainObjPtr vm; > + int i; > + int ret = -1; > + > + openvzDriverLock(driver); > + vm = virDomainFindByUUID(&driver->domains, dom->uuid); > + openvzDriverUnlock(driver); > + > + if (!vm) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(dom->uuid, uuidstr); > + openvzError(VIR_ERR_NO_DOMAIN, > + _("no domain with matching uuid '%s'"), uuidstr); > + goto cleanup; > + } > + > + if (!virDomainObjIsActive(vm)) { > + openvzError(VIR_ERR_OPERATION_INVALID, > + "%s", _("domain is not running")); > + goto cleanup; > + } > + > + /* Check the path is one of the domain's network interfaces. */ > + for (i = 0 ; i < vm->def->nnets ; i++) { > + if (vm->def->nets[i]->ifname && > + STREQ (vm->def->nets[i]->ifname, path)) { > + ret = 0; > + break; > + } > + } > + > + if (ret == 0) > + ret = linuxDomainInterfaceStats(path, stats); > + else > + openvzError(VIR_ERR_INVALID_ARG, > + _("invalid path, '%s' is not a known interface"), path); > + > +cleanup: > + if (vm) > + virDomainObjUnlock(vm); > + return ret; > +} > + > + > static virDriver openvzDriver = { > .no = VIR_DRV_OPENVZ, > .name = "OPENVZ", > @@ -1717,6 +1768,7 @@ static virDriver openvzDriver = { > .domainUndefineFlags = openvzDomainUndefineFlags, /* 0.9.4 */ > .domainGetAutostart = openvzDomainGetAutostart, /* 0.4.6 */ > .domainSetAutostart = openvzDomainSetAutostart, /* 0.4.6 */ > + .domainInterfaceStats = openvzDomainInterfaceStats, /* 0.9.12 */ > .isEncrypted = openvzIsEncrypted, /* 0.7.3 */ > .isSecure = openvzIsSecure, /* 0.7.3 */ > .domainIsActive = openvzDomainIsActive, /* 0.7.3 */ ACK. This is pretty much verbatim what is in qemuDomainInterfaceStats, and they're both operating on a host-side veth/tap. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list