[libvirt] [PATCH] Add support for 'passthru' mode for direct network interfaces
D. Herrendoerfer
d.herrendoerfer at herrendoerfer.name
Tue May 17 11:26:09 UTC 2011
On May 11, 2011, at 12:21 AM, Eric Blake wrote:
>
> Missing corresponding documentation in docs/formatdomain.html.in to
> describe the new mode.
>
> What happens if you try to use this mode but you have an older kernel?
> Do we need to add any sanity checking to give a saner error message
> than
> just blindly trying the string and reporting back whatever message
> gets
> returned about an unknown argument?
>
> The rest of this patch looks okay to me (with my disclaimer that I've
> never used an SRIOV card), but I'd rather wait for a v2 than push this
> without documentation.
>
> --
> Eric Blake eblake at redhat.com +1-801-349-2682
> Libvirt virtualization library http://libvirt.org
>
This patch includes the documentation part.
The error returned by libvirt when a using an older kernel
is imho sufficient to point to the macvtap setup. Apart from that
I doubt that someone will use this feature by chance. But still - I
believe the error returned is detailed enough for now.
Signed-off-by: Dirk Herrendoerfer <d.herrendoerfer at
herrendoerfer.name>
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 989dcf6..3f6bec8 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1429,6 +1429,12 @@
external router or gateway and that device sends them back to the
host. This procedure is followed if either the source or
destination
device is in <code>private</code> mode.</dd>
+ <dt><code>passthru</code></dt>
+ <dd>This feature allows to attach a virtual function of a SRIOV
capable
+ NIC directly to a VM without loosing the migration capability.
+ All packets are sent to the VF/IF of the configured network
device.
+ Depending on the capabilities of the device additional
prerequisites or
+ limitations may apply. <span class="since">(Since Linux
2.6.38.)</span></dd>
</dl>
<pre>
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index 7163c6e..e2a66ae 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -2351,7 +2351,7 @@
</define>
<define name="bridgeMode">
<data type="string">
- <param name="pattern">(vepa|bridge|private)</param>
+ <param name="pattern">(vepa|bridge|private|passthru)</param>
</data>
</define>
<define name="addrMAC">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d3efec6..4c4bfad 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -383,7 +383,8 @@ VIR_ENUM_IMPL(virDomainSeclabel,
VIR_DOMAIN_SECLABEL_LAST,
VIR_ENUM_IMPL(virDomainNetdevMacvtap,
VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
"vepa",
"private",
- "bridge")
+ "bridge",
+ "passthru" )
VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
"none",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index a0f820c..70943f9 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -335,6 +335,7 @@ enum virDomainNetdevMacvtapType {
VIR_DOMAIN_NETDEV_MACVTAP_MODE_VEPA,
VIR_DOMAIN_NETDEV_MACVTAP_MODE_PRIVATE,
VIR_DOMAIN_NETDEV_MACVTAP_MODE_BRIDGE,
+ VIR_DOMAIN_NETDEV_MACVTAP_MODE_PASSTHRU,
VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
};
diff --git a/src/util/macvtap.c b/src/util/macvtap.c
index a7af0cb..1b274cc 100644
--- a/src/util/macvtap.c
+++ b/src/util/macvtap.c
@@ -473,6 +473,9 @@ macvtapModeFromInt(enum virDomainNetdevMacvtapType
mode)
case VIR_DOMAIN_NETDEV_MACVTAP_MODE_BRIDGE:
return MACVLAN_MODE_BRIDGE;
+ case VIR_DOMAIN_NETDEV_MACVTAP_MODE_PASSTHRU:
+ return MACVLAN_MODE_PASSTHRU;
+
case VIR_DOMAIN_NETDEV_MACVTAP_MODE_VEPA:
default:
return MACVLAN_MODE_VEPA;
@@ -546,7 +549,7 @@ configMacvtapTap(int tapfd, int vnet_hdr)
* be NULL if this function is supposed to choose a name
* @macaddress: The MAC address for the macvtap device
* @linkdev: The interface name of the NIC to connect to the external
bridge
- * @mode: int describing the mode for 'bridge', 'vepa' or 'private'.
+ * @mode: int describing the mode for 'bridge', 'vepa', 'private' or
'passthru'.
* @vnet_hdr: 1 to enable IFF_VNET_HDR, 0 to disable it
* @vmuuid: The UUID of the VM the macvtap belongs to
* @virtPortProfile: pointer to object holding the virtual port
profile data
diff --git a/src/util/macvtap.h b/src/util/macvtap.h
index 54205c7..c45dd13 100644
--- a/src/util/macvtap.h
+++ b/src/util/macvtap.h
@@ -92,6 +92,7 @@ void delMacvtap(const char *ifname,
# define MACVTAP_MODE_PRIVATE_STR "private"
# define MACVTAP_MODE_VEPA_STR "vepa"
# define MACVTAP_MODE_BRIDGE_STR "bridge"
+# define MACVTAP_MODE_PASSTHRU_STR "passthru"
int vpAssociatePortProfileId(const char *macvtap_ifname,
const unsigned char *macvtap_macaddr,
More information about the libvir-list
mailing list