return ret;
}
-
static int lxcContainerSetupHostdevSubsys(virDomainDefPtr vmDef,
virDomainHostdevDefPtr def,
const char *dstprefix,
case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_MISC:
return lxcContainerSetupHostdevCapsMisc(vmDef, def, dstprefix, securityDriver);
+ case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET:
+ return 0; // case is handled in virLXCControllerMoveInterfaces
+
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unsupported host device mode %s"),
}
+static bool
+lxcNeedNetworkNamespace(virDomainDefPtr def)
+{
+ size_t i;
+ if (def->nets != NULL)
+ return true;
+ if (def->features & (1 << VIR_DOMAIN_FEATURE_PRIVNET))
+ return true;
+ for (i = 0 ; i < def->nhostdevs ; i++) {
+ if (def->hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES &&
+ def->hostdevs[i]->source.caps.type == VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET)
+ return true;
+ }
+ return false;
+}
+
/**
* lxcContainerStart:
* @def: pointer to virtual machine structure
cflags |= CLONE_NEWUSER;
}
- if (def->nets != NULL ||
- (def->features & (1 << VIR_DOMAIN_FEATURE_PRIVNET))) {
+ if (lxcNeedNetworkNamespace(def)) {
VIR_DEBUG("Enable network namespaces");
cflags |= CLONE_NEWNET;
}
static int virLXCControllerMoveInterfaces(virLXCControllerPtr ctrl)
{
size_t i;
+ virDomainDefPtr def = ctrl->def;
for (i = 0 ; i < ctrl->nveths ; i++) {
if (virNetDevSetNamespace(ctrl->veths[i], ctrl->initpid) < 0)
return -1;
}
+ for (i = 0; i < def->nhostdevs; i ++) {
+ virDomainHostdevDefPtr hdev = def->hostdevs[i];
+
+ if (hdev->mode != VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES)
+ continue;
+
+ virDomainHostdevCaps hdcaps = hdev->source.caps;
+
+ if (hdcaps.type != VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET)
+ continue;
+
+ if (virNetDevSetNamespace(hdcaps.u.net.iface, ctrl->initpid) < 0)
+ return -1;
+ }
+
return 0;
}
switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE:
case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_MISC:
+ case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET:
break;
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,