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

+
Modyfing virtual link state
+
+  ...
+  <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 +

+

Input devices

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)