From 5252a06d65533894cdc77d19ff9eed2809644559 Mon Sep 17 00:00:00 2001 From: Dirk Herrendorefer Date: Tue, 17 May 2011 13:26:09 +0200 Subject: [PATCH] Add support for 'passthru' mode for direct network interfaces starting with kernel 2.6.38 macvtap supports a 'passthru' mode for attaching virtual functions of a SRIOV capable network card directly to a VM. This patch adds the capability to configure such a device. Signed-off-by: Dirk Herrendoerfer --- AUTHORS | 1 + configure.ac | 7 +++++++ docs/formatdomain.html.in | 7 +++++++ docs/schemas/domain.rng | 2 +- src/conf/domain_conf.c | 3 ++- src/conf/domain_conf.h | 1 + src/util/macvtap.c | 12 ++++++++++-- src/util/macvtap.h | 5 +---- 8 files changed, 30 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 1bb1f0f1ab..a1e93db6bd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -170,6 +170,7 @@ Patches have also been contributed by: Mark Wu Yufang Zhang Supriya Kannery + Dirk Herrendoerfer [....send patches to get your name here....] diff --git a/configure.ac b/configure.ac index 233e4afa51..8db3226bb1 100644 --- a/configure.ac +++ b/configure.ac @@ -2240,6 +2240,13 @@ if test "$with_macvtap" != "no" ; then fi AM_CONDITIONAL([WITH_MACVTAP], [test "$with_macvtap" = "yes"]) AC_MSG_RESULT([$with_macvtap]) +if test "$with_macvtap" = yes; then + AC_CHECK_DECLS([MACVLAN_MODE_PASSTHRU], [], [], [[ + #include + #include + ]]) +fi + AC_ARG_WITH([virtualport], AC_HELP_STRING([--with-virtualport],[enable virtual port support @<:@default=check@:>@]), diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 989dcf6317..facdaf2972 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1429,6 +1429,13 @@ 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 private mode. +
passthrough
+
This feature attaches a virtual function of a SRIOV capable + NIC directly to a VM without losing 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; for example, on Linux this requires + kernel 2.6.38 or newer. Since 0.9.2
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index 7163c6e186..b252547eb9 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -2351,7 +2351,7 @@
   
   
     
-      (vepa|bridge|private)
+      (vepa|bridge|private|passthrough)
     
   
   
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 498438a489..3298c80e57 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -433,7 +433,8 @@ VIR_ENUM_IMPL(virDomainSeclabel, VIR_DOMAIN_SECLABEL_LAST,
 VIR_ENUM_IMPL(virDomainNetdevMacvtap, VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
               "vepa",
               "private",
-              "bridge")
+              "bridge",
+              "passthrough")
 
 VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
               "none",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index fe42f21dad..5fe31d41d2 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 a7af0cb781..068638e71b 100644
--- a/src/util/macvtap.c
+++ b/src/util/macvtap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Red Hat, Inc.
+ * Copyright (C) 2010-2011 Red Hat, Inc.
  * Copyright (C) 2010 IBM Corporation
  *
  * This library is free software; you can redistribute it and/or
@@ -45,6 +45,11 @@
 
 # include 
 
+/* Older kernels lacked this enum value.  */
+# if !HAVE_DECL_MACVLAN_MODE_PASSTHRU
+#  define MACVLAN_MODE_PASSTHRU 8
+# endif
+
 #endif /* WITH_MACVTAP || WITH_VIRTUALPORT */
 
 #include "util.h"
@@ -473,6 +478,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 +554,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 54205c7613..a1383c4545 100644
--- a/src/util/macvtap.h
+++ b/src/util/macvtap.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Red Hat, Inc.
  * Copyright (C) 2010 IBM Corporation
  *
  * This library is free software; you can redistribute it and/or
@@ -89,10 +90,6 @@ void delMacvtap(const char *ifname,
                 const char *linkdev,
                 virVirtualPortProfileParamsPtr virtPortProfile);
 
-#  define MACVTAP_MODE_PRIVATE_STR  "private"
-#  define MACVTAP_MODE_VEPA_STR     "vepa"
-#  define MACVTAP_MODE_BRIDGE_STR   "bridge"
-
 int vpAssociatePortProfileId(const char *macvtap_ifname,
                              const unsigned char *macvtap_macaddr,
                              const char *linkdev,