This patch introduces the new forward mode='hostdev-hybrid' along with attribute managed Includes updates to the network RNG and new xml parser/formatter code. --- docs/formatnetwork.html.in | 46 +++++++++++++++++++++++++ docs/schemas/network.rng | 1 + src/conf/network_conf.c | 9 +++-- src/conf/network_conf.h | 1 + tests/networkxml2xmlin/hostdev-hybrid-pf.xml | 7 ++++ tests/networkxml2xmlin/hostdev-hybrid.xml | 10 +++++ tests/networkxml2xmlout/hostdev-hybrid-pf.xml | 7 ++++ tests/networkxml2xmlout/hostdev-hybrid.xml | 10 +++++ tests/networkxml2xmltest.c | 2 + 9 files changed, 90 insertions(+), 3 deletions(-) diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in index 49206dd..5a5392c 100644 --- a/docs/formatnetwork.html.in +++ b/docs/formatnetwork.html.in @@ -259,6 +259,22 @@ with <code><forward mode='hostdev'/></code>. </p> </dd> + <dt><code>hostdev-hybrid</code></dt> + <dd> + Libvirt later than 0.10.0 also supports "intelligent + passthrough" of VF in the hybrid mode. This is done by + using the <interface type='hostdev-hybrid'/> + functionality. Similar to <interface type='hostdev'/> + the device's MAC address is first optionally configured and + the device is optionally associated with an 802.1Qbh capable + switch using an optionally specified <virtualport> + element (see the examples of virtualport given above for + type='direct' network devices). The Vf is passed into the + guest as a PCI device and at the same time a virtual interface + with type='direct' mode='bridge' is created in the guest. This + hybrid mode of intelligent passthrough makes Live migration + possible. + </dd> </dl> As mentioned above, a <code><forward></code> element can have multiple <code><interface></code> subelements, each @@ -341,6 +357,36 @@ ... </pre> + Similarly hostdev-hybrid mode can be used to support PCI- + passthrough of VF in hybrid mode as described above. The + interface pool can be specified with a list of + <code><address></code> elements, each of which has + <code>< type></code> (must always be <code>'pci'</code>, + <code><domain></code>, <code><bus></code>, + <code><slot></code>, and <code><function></code> + attributes or the interface pool can also be defined using a + single physical function <code><pf></code> subelement to + call out the corresponding physical interface associated with + multiple virtual interfaces (similar to passthrough mode). + + <pre> +... + <forward mode='hostdev-hybrid' managed='yes'> + <address type='pci' domain='0' bus='4' slot='0' function='1'/> + <address type='pci' domain='0' bus='4' slot='0' function='2'/> + <address type='pci' domain='0' bus='4' slot='0' function='3'/> + </forward> +... + </pre> + + <pre> +... + <forward mode='hostdev-hybrid' managed='yes'> + <pf dev='eth0'/> + </forward> +... + </pre> + </dd> </dl> <h5><a name="elementQoS">Quality of service</a></h5> diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng index 4abfd91..1f2136a 100644 --- a/docs/schemas/network.rng +++ b/docs/schemas/network.rng @@ -88,6 +88,7 @@ <value>private</value> <value>vepa</value> <value>hostdev</value> + <value>hostdev-hybrid</value> </choice> </attribute> </optional> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 9d53d8e..443b060 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -50,7 +50,7 @@ VIR_ENUM_IMPL(virNetworkForward, VIR_NETWORK_FORWARD_LAST, - "none", "nat", "route", "bridge", "private", "vepa", "passthrough", "hostdev") + "none", "nat", "route", "bridge", "private", "vepa", "passthrough", "hostdev", "hostdev-hybrid") VIR_ENUM_DECL(virNetworkForwardHostdevDevice) VIR_ENUM_IMPL(virNetworkForwardHostdevDevice, @@ -1289,6 +1289,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) case VIR_NETWORK_FORWARD_VEPA: case VIR_NETWORK_FORWARD_PASSTHROUGH: case VIR_NETWORK_FORWARD_HOSTDEV: + case VIR_NETWORK_FORWARD_HOSTDEV_HYBRID: if (def->bridge) { virReportError(VIR_ERR_XML_ERROR, _("bridge name not allowed in %s mode (network '%s')"), @@ -1590,7 +1591,8 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags) virBufferAddLit(&buf, "<forward"); virBufferEscapeString(&buf, " dev='%s'", dev); virBufferAsprintf(&buf, " mode='%s'", mode); - if (def->forwardType == VIR_NETWORK_FORWARD_HOSTDEV) { + if (def->forwardType == VIR_NETWORK_FORWARD_HOSTDEV || + def->forwardType == VIR_NETWORK_FORWARD_HOSTDEV_HYBRID) { if (def->managed == 1) virBufferAddLit(&buf, " managed='yes'"); else @@ -1608,7 +1610,8 @@ char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags) if (def->nForwardIfs && (!def->nForwardPfs || !(flags & VIR_NETWORK_XML_INACTIVE))) { for (ii = 0; ii < def->nForwardIfs; ii++) { - if (def->forwardType != VIR_NETWORK_FORWARD_HOSTDEV) { + if (def->forwardType != VIR_NETWORK_FORWARD_HOSTDEV && + def->forwardType != VIR_NETWORK_FORWARD_HOSTDEV_HYBRID) { virBufferEscapeString(&buf, "<interface dev='%s'", def->forwardIfs[ii].device.dev); if (!(flags & VIR_NETWORK_XML_INACTIVE) && diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index f49c367..a9d8b12 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -48,6 +48,7 @@ enum virNetworkForwardType { VIR_NETWORK_FORWARD_VEPA, VIR_NETWORK_FORWARD_PASSTHROUGH, VIR_NETWORK_FORWARD_HOSTDEV, + VIR_NETWORK_FORWARD_HOSTDEV_HYBRID, VIR_NETWORK_FORWARD_LAST, }; diff --git a/tests/networkxml2xmlin/hostdev-hybrid-pf.xml b/tests/networkxml2xmlin/hostdev-hybrid-pf.xml new file mode 100644 index 0000000..f8b8f9b --- /dev/null +++ b/tests/networkxml2xmlin/hostdev-hybrid-pf.xml @@ -0,0 +1,7 @@ +<network> + <name>hostdev-hybrid</name> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid> + <forward mode='hostdev-hybrid' managed='yes'> + <pf dev='eth2'/> + </forward> +</network> diff --git a/tests/networkxml2xmlin/hostdev-hybrid.xml b/tests/networkxml2xmlin/hostdev-hybrid.xml new file mode 100644 index 0000000..94c9d65 --- /dev/null +++ b/tests/networkxml2xmlin/hostdev-hybrid.xml @@ -0,0 +1,10 @@ +<network> + <name>hostdev-hybrid</name> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid> + <forward mode='hostdev-hybrid' managed='yes'> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x2'/> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x3'/> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x4'/> + </forward> +</network> diff --git a/tests/networkxml2xmlout/hostdev-hybrid-pf.xml b/tests/networkxml2xmlout/hostdev-hybrid-pf.xml new file mode 100644 index 0000000..f8b8f9b --- /dev/null +++ b/tests/networkxml2xmlout/hostdev-hybrid-pf.xml @@ -0,0 +1,7 @@ +<network> + <name>hostdev-hybrid</name> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid> + <forward mode='hostdev-hybrid' managed='yes'> + <pf dev='eth2'/> + </forward> +</network> diff --git a/tests/networkxml2xmlout/hostdev-hybrid.xml b/tests/networkxml2xmlout/hostdev-hybrid.xml new file mode 100644 index 0000000..94c9d65 --- /dev/null +++ b/tests/networkxml2xmlout/hostdev-hybrid.xml @@ -0,0 +1,10 @@ +<network> + <name>hostdev-hybrid</name> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid> + <forward mode='hostdev-hybrid' managed='yes'> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x2'/> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x3'/> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x4'/> + </forward> +</network> diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c index e57d190..d8da37a 100644 --- a/tests/networkxml2xmltest.c +++ b/tests/networkxml2xmltest.c @@ -108,6 +108,8 @@ mymain(void) DO_TEST_FULL("passthrough-pf", VIR_NETWORK_XML_INACTIVE); DO_TEST("hostdev"); DO_TEST_FULL("hostdev-pf", VIR_NETWORK_XML_INACTIVE); + DO_TEST("hostdev-hybrid"); + DO_TEST_FULL("hostdev-hybrid-pf", VIR_NETWORK_XML_INACTIVE); return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list