int
qemuDomainSyncRxFilter(virDomainObj *vm,
- virDomainNetDef *def)
+ virDomainNetDef *def,
+ virDomainAsyncJob asyncJob)
{
qemuDomainObjPrivate *priv = vm->privateData;
g_autoptr(virNetDevRxFilter) guestFilter = NULL;
g_autoptr(virNetDevRxFilter) hostFilter = NULL;
int rc;
- qemuDomainObjEnterMonitor(vm);
+ if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+ return -1;
+
rc = qemuMonitorQueryRxFilter(priv->mon, def->info.alias, &guestFilter);
qemuDomainObjExitMonitor(vm);
if (rc < 0)
if (virDomainNetGetActualType(def) == VIR_DOMAIN_NET_TYPE_DIRECT) {
if (virNetDevGetRxFilter(def->ifname, &hostFilter)) {
- VIR_WARN("Couldn't get current RX filter for device %s while responding to NIC_RX_FILTER_CHANGED",
+ VIR_WARN("Couldn't get current RX filter for device %s",
def->ifname);
return -1;
}
int
qemuDomainSyncRxFilter(virDomainObj *vm,
- virDomainNetDef *def);
+ virDomainNetDef *def,
+ virDomainAsyncJob asyncJob);
VIR_DEBUG("process NIC_RX_FILTER_CHANGED event for network "
"device %s in domain %s", def->info.alias, vm->def->name);
- if (qemuDomainSyncRxFilter(vm, def) < 0)
+ if (qemuDomainSyncRxFilter(vm, def, VIR_ASYNC_JOB_NONE) < 0)
goto endjob;
endjob:
}
+static int
+qemuProcessRefreshRxFilters(virDomainObj *vm,
+ virDomainAsyncJob asyncJob)
+{
+ size_t i;
+
+ for (i = 0; i < vm->def->nnets; i++) {
+ virDomainNetDef *def = vm->def->nets[i];
+
+ if (!virDomainNetGetActualTrustGuestRxFilters(def))
+ continue;
+
+ if (qemuDomainSyncRxFilter(vm, def, asyncJob) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
/**
* qemuProcessRefreshState:
* @driver: qemu driver data
if (qemuProcessRefreshDisks(vm, asyncJob) < 0)
return -1;
+ VIR_DEBUG("Updating rx-filter data");
+ if (qemuProcessRefreshRxFilters(vm, asyncJob) < 0)
+ return -1;
+
return 0;
}
if (qemuSecurityReserveLabel(driver->securityManager, obj->def, obj->pid) < 0)
goto error;
+ if (qemuProcessRefreshRxFilters(obj, VIR_ASYNC_JOB_NONE) < 0)
+ goto error;
+
qemuProcessNotifyNets(obj->def);
qemuProcessFiltersInstantiate(obj->def);