[libvirt] [PATCH 2/2] Implement support for <hostdev caps=net>. This allows a container-type domain to have exclusive access to one of the host's NICs.

Bogdan Purcareata bogdan.purcareata at freescale.com
Thu Apr 4 16:06:40 UTC 2013


Signed-off-by: Bogdan Purcareata <bogdan.purcareata at freescale.com>
---
 src/lxc/lxc_container.c  |  4 +++-
 src/lxc/lxc_controller.c | 19 +++++++++++++++++++
 src/lxc/lxc_hostdev.c    |  1 +
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index 002ba9e..e59bfdf 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -1551,7 +1551,6 @@ cleanup:
     return ret;
 }
 
-
 static int lxcContainerSetupHostdevSubsys(virDomainDefPtr vmDef,
                                           virDomainHostdevDefPtr def,
                                           const char *dstprefix,
@@ -1582,6 +1581,9 @@ static int lxcContainerSetupHostdevCaps(virDomainDefPtr vmDef,
     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"),
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index cede445..ab488d8 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -1050,12 +1050,31 @@ cleanup2:
 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.interface, ctrl->initpid) < 0) {
+            return -1;
+	}
+    }
+
     return 0;
 }
 
diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c
index 33b0b60..53a1a31 100644
--- a/src/lxc/lxc_hostdev.c
+++ b/src/lxc/lxc_hostdev.c
@@ -307,6 +307,7 @@ int virLXCPrepareHostDevices(virLXCDriverPtr driver,
             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,
-- 
1.7.11.7





More information about the libvir-list mailing list