diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index f6477c28d4..fb0a0d14c9 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2372,6 +2372,12 @@
+
backenddomain
+ The optional backenddomain
element allows specifying a
+ backend domain (aka driver domain) hosting the disk. Use the
+ name
attribute to specify the backend domain name.
+ Since 1.2.13 (Xen only)
+
boot
Specifies that the disk is bootable. The order
attribute determines the order in which devices will be tried during
@@ -4256,6 +4262,29 @@ qemu-kvm -net nic,model=? /dev/null
network device.
Since 0.9.10 (QEMU and KVM only).
+
+
+ ...
+ <devices>
+ ...
+ <interface type='bridge'>
+ <source bridge='br0'/>
+ <backenddomain name='netvm'/>
+ </interface>
+ ...
+ </devices>
+ ...
+
+
+ The optional backenddomain
element allows specifying a
+ backend domain (aka driver domain) for the interface. Use the
+ name
attribute to specify the backend domain name. You
+ can use it to create a direct network link between domains (so data
+ will not go through host system). Use with type 'ethernet' to create
+ plain network link, or with type 'bridge' to connect to a bridge inside
+ the backend domain.
+ Since 1.2.13 (Xen only)
+
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 27a24b46ba..f41ca43434 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1173,6 +1173,14 @@
+
+
+
+
+
+
+
+
@@ -2371,6 +2379,14 @@
+
+
+
+
+
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b155a5a34c..d95dd3ebd5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1267,6 +1267,7 @@ virDomainDiskDefFree(virDomainDiskDefPtr def)
VIR_FREE(def->wwn);
VIR_FREE(def->vendor);
VIR_FREE(def->product);
+ VIR_FREE(def->domain_name);
virDomainDeviceInfoClear(&def->info);
VIR_FREE(def);
@@ -1449,6 +1450,7 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
VIR_FREE(def->backend.vhost);
VIR_FREE(def->virtPortProfile);
VIR_FREE(def->script);
+ VIR_FREE(def->domain_name);
VIR_FREE(def->ifname);
VIR_FREE(def->ifname_guest);
VIR_FREE(def->ifname_guest_actual);
@@ -5887,6 +5889,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
char *discard = NULL;
char *mirrorFormat = NULL;
char *mirrorType = NULL;
+ char *domain_name = NULL;
int expected_secret_usage = -1;
int auth_secret_usage = -1;
int ret = 0;
@@ -5952,6 +5955,9 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
if (target &&
STRPREFIX(target, "ioemu:"))
memmove(target, target+6, strlen(target)-5);
+ } else if (!domain_name &&
+ xmlStrEqual(cur->name, BAD_CAST "backenddomain")) {
+ domain_name = virXMLPropString(cur, "name");
} else if (xmlStrEqual(cur->name, BAD_CAST "geometry")) {
if (virXPathUInt("string(./geometry/@cyls)",
ctxt, &def->geometry.cylinders) < 0) {
@@ -6676,6 +6682,8 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
driverName = NULL;
def->src->encryption = encryption;
encryption = NULL;
+ def->domain_name = domain_name;
+ domain_name = NULL;
def->serial = serial;
serial = NULL;
def->wwn = wwn;
@@ -6738,6 +6746,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_FREE(product);
VIR_FREE(mirrorType);
VIR_FREE(mirrorFormat);
+ VIR_FREE(domain_name);
ctxt->node = save_ctxt;
return def;
@@ -7527,6 +7536,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
char *mode = NULL;
char *linkstate = NULL;
char *addrtype = NULL;
+ char *domain_name = NULL;
char *vhostuser_mode = NULL;
char *vhostuser_path = NULL;
char *vhostuser_type = NULL;
@@ -7666,6 +7676,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
} else if (!script &&
xmlStrEqual(cur->name, BAD_CAST "script")) {
script = virXMLPropString(cur, "path");
+ } else if (!domain_name &&
+ xmlStrEqual(cur->name, BAD_CAST "backenddomain")) {
+ domain_name = virXMLPropString(cur, "name");
} else if (xmlStrEqual(cur->name, BAD_CAST "model")) {
model = virXMLPropString(cur, "type");
} else if (xmlStrEqual(cur->name, BAD_CAST "driver")) {
@@ -7965,6 +7978,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
def->script = script;
script = NULL;
}
+ if (domain_name != NULL) {
+ def->domain_name = domain_name;
+ domain_name = NULL;
+ }
if (ifname != NULL) {
def->ifname = ifname;
ifname = NULL;
@@ -8234,6 +8251,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_FREE(mode);
VIR_FREE(linkstate);
VIR_FREE(addrtype);
+ VIR_FREE(domain_name);
VIR_FREE(trustGuestRxFilters);
VIR_FREE(ips);
VIR_FREE(vhost_path);
@@ -17162,6 +17180,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
def->src->backingStoreRaw, 1) < 0)
return -1;
+ virBufferEscapeString(buf, "\n", def->domain_name);
+
virDomainDiskGeometryDefFormat(buf, def);
virDomainDiskBlockIoDefFormat(buf, def);
@@ -18136,6 +18156,7 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferEscapeString(buf, "\n",
def->script);
+ virBufferEscapeString(buf, "\n", def->domain_name);
if (def->ifname &&
!((flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) &&
(STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX)))) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 86db2ab9df..02ddd93a4d 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -700,6 +700,7 @@ struct _virDomainDiskDef {
int sgio; /* enum virDomainDeviceSGIO */
int discard; /* enum virDomainDiskDiscard */
unsigned int iothread; /* unused = 0, > 0 specific thread # */
+ char *domain_name; /* backend domain name */
};
@@ -996,6 +997,7 @@ struct _virDomainNetDef {
unsigned long sndbuf;
} tune;
char *script;
+ char *domain_name; /* backend domain name */
char *ifname;
char *ifname_guest;
char *ifname_guest_actual;