virNWFilterHashTablePtr vars,
int *nEntries,
virNWFilterRuleInstPtr **insts,
- enum instCase useNewFilter, int *foundNewFilter,
+ enum instCase useNewFilter, bool *foundNewFilter,
virNWFilterDriverStatePtr driver)
{
virNWFilterPoolObjPtr obj;
case INSTANTIATE_FOLLOW_NEWFILTER:
if (obj->newDef) {
next_filter = obj->newDef;
- *foundNewFilter = 1;
+ *foundNewFilter = true;
}
break;
case INSTANTIATE_ALWAYS:
int ifindex,
const char *linkdev,
virNWFilterHashTablePtr vars,
- enum instCase useNewFilter, int *foundNewFilter,
+ enum instCase useNewFilter, bool *foundNewFilter,
bool teardownOld,
const unsigned char *macaddr,
virNWFilterDriverStatePtr driver,
virNWFilterHashTablePtr filterparams,
enum instCase useNewFilter,
virNWFilterDriverStatePtr driver,
- bool forceWithPendingReq)
+ bool forceWithPendingReq,
+ bool *foundNewFilter)
{
int rc;
const char *drvname = EBIPTABLES_DRIVER_ID;
virNWFilterHashTablePtr vars, vars1;
virNWFilterDefPtr filter;
char vmmacaddr[VIR_MAC_STRING_BUFLEN] = {0};
- int foundNewFilter = 0;
char *str_macaddr = NULL;
const char *ipaddr;
char *str_ipaddr = NULL;
case INSTANTIATE_FOLLOW_NEWFILTER:
if (obj->newDef) {
filter = obj->newDef;
- foundNewFilter = 1;
+ *foundNewFilter = true;
}
break;
ifindex,
linkdev,
vars,
- useNewFilter, &foundNewFilter,
+ useNewFilter, foundNewFilter,
teardownOld,
macaddr,
driver,
_virNWFilterInstantiateFilter(virConnectPtr conn,
const virDomainNetDefPtr net,
bool teardownOld,
- enum instCase useNewFilter)
+ enum instCase useNewFilter,
+ bool *foundNewFilter)
{
const char *linkdev = (net->type == VIR_DOMAIN_NET_TYPE_DIRECT)
? net->data.direct.linkdev
net->filterparams,
useNewFilter,
conn->nwfilterPrivateData,
- false);
+ false,
+ foundNewFilter);
}
virNWFilterDriverStatePtr driver)
{
int rc;
+ bool foundNewFilter = false;
+
rc = __virNWFilterInstantiateFilter(conn,
1,
ifname,
filterparams,
INSTANTIATE_ALWAYS,
driver,
- true);
+ true,
+ &foundNewFilter);
if (rc) {
//something went wrong... 'DOWN' the interface
if (ifaceCheck(false, ifname, NULL, ifindex) != 0 ||
virNWFilterInstantiateFilter(virConnectPtr conn,
const virDomainNetDefPtr net)
{
+ bool foundNewFilter = false;
+
return _virNWFilterInstantiateFilter(conn, net,
1,
- INSTANTIATE_ALWAYS);
+ INSTANTIATE_ALWAYS,
+ &foundNewFilter);
}
int
virNWFilterUpdateInstantiateFilter(virConnectPtr conn,
- const virDomainNetDefPtr net)
+ const virDomainNetDefPtr net,
+ bool *skipIface)
{
- return _virNWFilterInstantiateFilter(conn, net,
- 0,
- INSTANTIATE_FOLLOW_NEWFILTER);
+ bool foundNewFilter = false;
+
+ int rc = _virNWFilterInstantiateFilter(conn, net,
+ 0,
+ INSTANTIATE_FOLLOW_NEWFILTER,
+ &foundNewFilter);
+
+ *skipIface = !foundNewFilter;
+ return rc;
}
int virNWFilterRollbackUpdateFilter(virConnectPtr conn,
virDomainDefPtr vm = obj->def;
struct domUpdateCBStruct *cb = data;
int i;
+ bool skipIface;
virDomainObjLock(obj);
switch (cb->step) {
case STEP_APPLY_NEW:
cb->err = virNWFilterUpdateInstantiateFilter(cb->conn,
- net);
+ net,
+ &skipIface);
+ if (cb->err == 0 && skipIface == true) {
+ // filter tree unchanged -- no update needed
+ cb->err = virHashAddEntry(cb->skipInterfaces,
+ net->ifname,
+ (void *)~0);
+ if (cb->err)
+ virReportOOMError();
+ }
break;
case STEP_TEAR_NEW:
- cb->err = virNWFilterRollbackUpdateFilter(cb->conn, net);
+ if ( !virHashLookup(cb->skipInterfaces, net->ifname)) {
+ cb->err = virNWFilterRollbackUpdateFilter(cb->conn,
+ net);
+ }
break;
case STEP_TEAR_OLD:
- cb->err = virNWFilterTearOldFilter(cb->conn, net);
+ if ( !virHashLookup(cb->skipInterfaces, net->ifname)) {
+ cb->err = virNWFilterTearOldFilter(cb->conn, net);
+ }
break;
}
if (cb->err)