static virHashIterator virNWFilterDomainFWUpdateCB;
+/**
+ * virNWFilterInstFiltersOnAllVMs:
+ * Apply all filters on all running VMs. Don't terminate in case of an
+ * error. This should be called upon reloading of the driver.
+ */
+int
+virNWFilterInstFiltersOnAllVMs(virConnectPtr conn)
+{
+ int i;
+ struct domUpdateCBStruct cb = {
+ .conn = conn,
+ .err = 0, /* ignored here */
+ .step = STEP_APPLY_CURRENT,
+ .skipInterfaces = NULL, /* not needed */
+ };
+
+ for (i = 0; i < nCallbackDriver; i++)
+ callbackDrvArray[i]->vmFilterRebuild(conn,
+ virNWFilterDomainFWUpdateCB,
+ &cb);
+
+ return 0;
+}
static int
virNWFilterTriggerVMFilterRebuild(virConnectPtr conn)
STEP_APPLY_NEW,
STEP_TEAR_NEW,
STEP_TEAR_OLD,
+ STEP_APPLY_CURRENT,
};
struct domUpdateCBStruct {
int virNWFilterConfLayerInit(virHashIterator domUpdateCB);
void virNWFilterConfLayerShutdown(void);
+int virNWFilterInstFiltersOnAllVMs(virConnectPtr conn);
+
# define virNWFilterReportError(code, fmt...) \
virReportErrorHelper(VIR_FROM_NWFILTER, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
virNWFilterDefFormat;
virNWFilterDefFree;
virNWFilterDefParseString;
+virNWFilterInstFiltersOnAllVMs;
virNWFilterJumpTargetTypeToString;
virNWFilterLoadAllConfigs;
virNWFilterLockFilterUpdates;
virNWFilterCallbackDriversUnlock();
nwfilterDriverUnlock(driverState);
+ virNWFilterInstFiltersOnAllVMs(conn);
+
virConnectClose(conn);
}
virDomainObjPtr obj = payload;
virDomainDefPtr vm = obj->def;
struct domUpdateCBStruct *cb = data;
- int i;
+ int i, err;
bool skipIface;
virDomainObjLock(obj);
cb->err = virNWFilterTearOldFilter(net);
}
break;
+
+ case STEP_APPLY_CURRENT:
+ err = virNWFilterInstantiateFilter(cb->conn,
+ vm->uuid,
+ net);
+ if (err)
+ virNWFilterReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failure while applying current filter on "
+ "VM %s"), vm->name);
+ break;
}
if (cb->err)
break;