[libvirt] [PATCH 3/5] Introduce forward mode='hostdev' for network XML in order to use the functionality of interface pools.

Shradha Shah sshah at solarflare.com
Fri Jun 8 15:29:37 UTC 2012


This new forward mode sets up a PCI network device to be assigned to the guest with PCI passthrough.
The PCI network device is chosen from an interface pool.
Currently there is no support for USB devices when using this forward mode.

Example XML:
Network XML:
<network>
  <name>direct-network</name>
  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a8f</uuid>
  <forward mode="hostdev">
    <pf dev="eth2"/>
  </forward>
</network>

The above xml leads to the creation of an implicit interface pool and a free network device
is chosen from the pool. This patch would also work if an interface pool is given explicitly.
The interface dev value can be an interface name or a PCI device address.

Example XML:
Network XML:
<network>
  <name>direct-network</name>
  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a8f</uuid>
  <forward mode="hostdev">
    <interface dev="0000:04:00.1"/>
    <interface dev="0000:04:00.2"/>
    <interface dev="0000:04:00.3"/>
  </forward>
</network>

The MAC address would be provided in the domain xml.

Signed-off-by: Shradha Shah <sshah at solarflare.com>
---
 docs/schemas/network.rng    |    1 +
 src/conf/network_conf.c     |    3 ++-
 src/conf/network_conf.h     |    1 +
 src/network/bridge_driver.c |    6 ++++--
 4 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 2ae879e..a0046f1 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -82,6 +82,7 @@
                   <value>passthrough</value>
                   <value>private</value>
                   <value>vepa</value>
+                  <value>hostdev</value>
                 </choice>
               </attribute>
             </optional>
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 8fcba16..6b346c3 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -51,7 +51,7 @@ VIR_ENUM_DECL(virNetworkForward)
 
 VIR_ENUM_IMPL(virNetworkForward,
               VIR_NETWORK_FORWARD_LAST,
-              "none", "nat", "route", "bridge", "private", "vepa", "passthrough" )
+              "none", "nat", "route", "bridge", "private", "vepa", "passthrough", "hostdev")
 
 #define virNetworkReportError(code, ...)                                \
     virReportErrorHelper(VIR_FROM_NETWORK, code, __FILE__,              \
@@ -1251,6 +1251,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
         case VIR_NETWORK_FORWARD_PRIVATE:
         case VIR_NETWORK_FORWARD_VEPA:
         case VIR_NETWORK_FORWARD_PASSTHROUGH:
+        case VIR_NETWORK_FORWARD_HOSTDEV:
             if (def->bridge) {
                 virNetworkReportError(VIR_ERR_XML_ERROR,
                                       _("bridge name not allowed in %s mode (network '%s'"),
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index b205cb0..d473c71 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -45,6 +45,7 @@ enum virNetworkForwardType {
     VIR_NETWORK_FORWARD_PRIVATE,
     VIR_NETWORK_FORWARD_VEPA,
     VIR_NETWORK_FORWARD_PASSTHROUGH,
+    VIR_NETWORK_FORWARD_HOSTDEV,
 
     VIR_NETWORK_FORWARD_LAST,
 };
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 8540003..cc53551 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -1974,7 +1974,7 @@ networkStartNetworkExternal(struct network_driver *driver ATTRIBUTE_UNUSED,
                             virNetworkObjPtr network ATTRIBUTE_UNUSED)
 {
     /* put anything here that needs to be done each time a network of
-     * type BRIDGE, PRIVATE, VEPA, or PASSTHROUGH is started. On
+     * type BRIDGE, PRIVATE, VEPA, HOSTDEV or PASSTHROUGH is started. On
      * failure, undo anything you've done, and return -1. On success
      * return 0.
      */
@@ -1985,7 +1985,7 @@ static int networkShutdownNetworkExternal(struct network_driver *driver ATTRIBUT
                                         virNetworkObjPtr network ATTRIBUTE_UNUSED)
 {
     /* put anything here that needs to be done each time a network of
-     * type BRIDGE, PRIVATE, VEPA, or PASSTHROUGH is shutdown. On
+     * type BRIDGE, PRIVATE, VEPA, HOSTDEV or PASSTHROUGH is shutdown. On
      * failure, undo anything you've done, and return -1. On success
      * return 0.
      */
@@ -2016,6 +2016,7 @@ networkStartNetwork(struct network_driver *driver,
     case VIR_NETWORK_FORWARD_PRIVATE:
     case VIR_NETWORK_FORWARD_VEPA:
     case VIR_NETWORK_FORWARD_PASSTHROUGH:
+    case VIR_NETWORK_FORWARD_HOSTDEV:
         ret = networkStartNetworkExternal(driver, network);
         break;
     }
@@ -2075,6 +2076,7 @@ static int networkShutdownNetwork(struct network_driver *driver,
     case VIR_NETWORK_FORWARD_PRIVATE:
     case VIR_NETWORK_FORWARD_VEPA:
     case VIR_NETWORK_FORWARD_PASSTHROUGH:
+    case VIR_NETWORK_FORWARD_HOSTDEV:
         ret = networkShutdownNetworkExternal(driver, network);
         break;
     }
-- 
1.7.4.4





More information about the libvir-list mailing list