diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 54e81b0d9e..0a7abafac4 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2131,6 +2131,27 @@ qemu-kvm -net nic,model=? /dev/null
Since 0.9.4
+
+
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet0'/>
+ <link state='down'/>
+ </interface>
+ <devices>
+ ...
+
+
+ This element provides means of setting state of the virtual network link.
+ Possible values for attribute state
are up
and
+ down
. If down
is specified as the value, the interface
+ behaves as if it had the network cable disconnected. Default behavior if this
+ element is unspecified is to have the link state up
.
+ Since 0.9.5
+
+
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 1c44471271..937e1808ee 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -150,6 +150,17 @@
+
+
+
+
+ up
+ down
+
+
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 5d95ee7136..74f8d6aec3 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -257,6 +257,11 @@ VIR_ENUM_IMPL(virDomainNetVirtioTxMode, VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST,
"iothread",
"timer")
+VIR_ENUM_IMPL(virDomainNetInterfaceLinkState, VIR_DOMAIN_NET_INTERFACE_LINK_STATE_LAST,
+ "default",
+ "up",
+ "down")
+
VIR_ENUM_IMPL(virDomainChrChannelTarget,
VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST,
"guestfwd",
@@ -2980,6 +2985,7 @@ virDomainNetDefParseXML(virCapsPtr caps,
char *internal = NULL;
char *devaddr = NULL;
char *mode = NULL;
+ char *linkstate = NULL;
virNWFilterHashTablePtr filterparams = NULL;
virVirtualPortProfileParamsPtr virtPort = NULL;
virDomainActualNetDefPtr actual = NULL;
@@ -3056,6 +3062,9 @@ virDomainNetDefParseXML(virCapsPtr caps,
/* An auto-generated target name, blank it out */
VIR_FREE(ifname);
}
+ } else if ((linkstate == NULL) &&
+ xmlStrEqual(cur->name, BAD_CAST "link")) {
+ linkstate = virXMLPropString(cur, "state");
} else if ((script == NULL) &&
(def->type == VIR_DOMAIN_NET_TYPE_ETHERNET ||
def->type == VIR_DOMAIN_NET_TYPE_BRIDGE) &&
@@ -3320,6 +3329,16 @@ virDomainNetDefParseXML(virCapsPtr caps,
}
}
+ def->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT;
+ if (linkstate != NULL) {
+ if ((def->linkstate = virDomainNetInterfaceLinkStateTypeFromString(linkstate)) <= 0) {
+ virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown interface link state '%s'"),
+ linkstate);
+ goto error;
+ }
+ }
+
if (filter != NULL) {
switch (def->type) {
case VIR_DOMAIN_NET_TYPE_ETHERNET:
@@ -3367,6 +3386,7 @@ cleanup:
VIR_FREE(internal);
VIR_FREE(devaddr);
VIR_FREE(mode);
+ VIR_FREE(linkstate);
virNWFilterHashTableFree(filterparams);
return def;
@@ -9510,6 +9530,10 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAddLit(buf, " \n");
}
+ if (def->linkstate)
+ virBufferAsprintf(buf, " \n",
+ virDomainNetInterfaceLinkStateTypeToString(def->linkstate));
+
if (virBandwidthDefFormat(buf, def->bandwidth, " ") < 0)
return -1;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index bb9d3dbc76..371f2701f9 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -410,6 +410,15 @@ enum virDomainNetVirtioTxModeType {
VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST,
};
+/* link interface states */
+enum virDomainNetInterfaceLinkState {
+ VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT = 0, /* Default link state (up) */
+ VIR_DOMAIN_NET_INTERFACE_LINK_STATE_UP, /* Link is up. ("cable" connected) */
+ VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN , /* Link is down. ("cable" disconnected) */
+
+ VIR_DOMAIN_NET_INTERFACE_LINK_STATE_LAST
+};
+
/* Config that was actually used to bring up interface, after
* resolving network reference. This is private data, only used within
* libvirt, but still must maintain backward compatibility, because
@@ -495,6 +504,7 @@ struct _virDomainNetDef {
char *filter;
virNWFilterHashTablePtr filterparams;
virBandwidthPtr bandwidth;
+ int linkstate;
};
/* Used for prefix of ifname of any network name generated dynamically
@@ -1829,6 +1839,7 @@ VIR_ENUM_DECL(virDomainFSAccessMode)
VIR_ENUM_DECL(virDomainNet)
VIR_ENUM_DECL(virDomainNetBackend)
VIR_ENUM_DECL(virDomainNetVirtioTxMode)
+VIR_ENUM_DECL(virDomainNetInterfaceLinkState)
VIR_ENUM_DECL(virDomainChrDevice)
VIR_ENUM_DECL(virDomainChrChannelTarget)
VIR_ENUM_DECL(virDomainChrConsoleTarget)