提交 edd1295e 编写于 作者: P Peter Krempa 提交者: Daniel Veillard

link-state: conf: Add element to XML for controling link state

A new element is introduced to XML that allows to control
state of virtual network interfaces in hypervisors.

Live modification of the link state allows networking tools
propagate topology changes to guest OS or testing of
scenarios in complex (virtual) networks.

This patch adds elements to XML grammars and parsing and generating
code.
上级 c246b025
...@@ -2131,6 +2131,27 @@ qemu-kvm -net nic,model=? /dev/null ...@@ -2131,6 +2131,27 @@ qemu-kvm -net nic,model=? /dev/null
<span class="since">Since 0.9.4</span> <span class="since">Since 0.9.4</span>
</p> </p>
<h5><a name="elementLink">Modyfing virtual link state</a></h5>
<pre>
...
&lt;devices&gt;
&lt;interface type='network'&gt;
&lt;source network='default'/&gt;
&lt;target dev='vnet0'/&gt;
<b>&lt;link state='down'/&gt;</b>
&lt;/interface&gt;
&lt;devices&gt;
...</pre>
<p>
This element provides means of setting state of the virtual network link.
Possible values for attribute <code>state</code> are <code>up</code> and
<code>down</code>. If <code>down</code> 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 <code>up</code>.
<span class="since">Since 0.9.5</span>
</p>
<h4><a name="elementsInput">Input devices</a></h4> <h4><a name="elementsInput">Input devices</a></h4>
<p> <p>
......
...@@ -150,6 +150,17 @@ ...@@ -150,6 +150,17 @@
<optional> <optional>
<ref name="bandwidth"/> <ref name="bandwidth"/>
</optional> </optional>
<optional>
<element name="link">
<attribute name="state">
<choice>
<value>up</value>
<value>down</value>
</choice>
</attribute>
<empty/>
</element>
</optional>
<!-- <ip> element --> <!-- <ip> element -->
<zeroOrMore> <zeroOrMore>
......
...@@ -257,6 +257,11 @@ VIR_ENUM_IMPL(virDomainNetVirtioTxMode, VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST, ...@@ -257,6 +257,11 @@ VIR_ENUM_IMPL(virDomainNetVirtioTxMode, VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST,
"iothread", "iothread",
"timer") "timer")
VIR_ENUM_IMPL(virDomainNetInterfaceLinkState, VIR_DOMAIN_NET_INTERFACE_LINK_STATE_LAST,
"default",
"up",
"down")
VIR_ENUM_IMPL(virDomainChrChannelTarget, VIR_ENUM_IMPL(virDomainChrChannelTarget,
VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST, VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST,
"guestfwd", "guestfwd",
...@@ -2980,6 +2985,7 @@ virDomainNetDefParseXML(virCapsPtr caps, ...@@ -2980,6 +2985,7 @@ virDomainNetDefParseXML(virCapsPtr caps,
char *internal = NULL; char *internal = NULL;
char *devaddr = NULL; char *devaddr = NULL;
char *mode = NULL; char *mode = NULL;
char *linkstate = NULL;
virNWFilterHashTablePtr filterparams = NULL; virNWFilterHashTablePtr filterparams = NULL;
virVirtualPortProfileParamsPtr virtPort = NULL; virVirtualPortProfileParamsPtr virtPort = NULL;
virDomainActualNetDefPtr actual = NULL; virDomainActualNetDefPtr actual = NULL;
...@@ -3056,6 +3062,9 @@ virDomainNetDefParseXML(virCapsPtr caps, ...@@ -3056,6 +3062,9 @@ virDomainNetDefParseXML(virCapsPtr caps,
/* An auto-generated target name, blank it out */ /* An auto-generated target name, blank it out */
VIR_FREE(ifname); VIR_FREE(ifname);
} }
} else if ((linkstate == NULL) &&
xmlStrEqual(cur->name, BAD_CAST "link")) {
linkstate = virXMLPropString(cur, "state");
} else if ((script == NULL) && } else if ((script == NULL) &&
(def->type == VIR_DOMAIN_NET_TYPE_ETHERNET || (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET ||
def->type == VIR_DOMAIN_NET_TYPE_BRIDGE) && def->type == VIR_DOMAIN_NET_TYPE_BRIDGE) &&
...@@ -3320,6 +3329,16 @@ virDomainNetDefParseXML(virCapsPtr caps, ...@@ -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) { if (filter != NULL) {
switch (def->type) { switch (def->type) {
case VIR_DOMAIN_NET_TYPE_ETHERNET: case VIR_DOMAIN_NET_TYPE_ETHERNET:
...@@ -3367,6 +3386,7 @@ cleanup: ...@@ -3367,6 +3386,7 @@ cleanup:
VIR_FREE(internal); VIR_FREE(internal);
VIR_FREE(devaddr); VIR_FREE(devaddr);
VIR_FREE(mode); VIR_FREE(mode);
VIR_FREE(linkstate);
virNWFilterHashTableFree(filterparams); virNWFilterHashTableFree(filterparams);
return def; return def;
...@@ -9510,6 +9530,10 @@ virDomainNetDefFormat(virBufferPtr buf, ...@@ -9510,6 +9530,10 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAddLit(buf, " </tune>\n"); virBufferAddLit(buf, " </tune>\n");
} }
if (def->linkstate)
virBufferAsprintf(buf, " <link state='%s'/>\n",
virDomainNetInterfaceLinkStateTypeToString(def->linkstate));
if (virBandwidthDefFormat(buf, def->bandwidth, " ") < 0) if (virBandwidthDefFormat(buf, def->bandwidth, " ") < 0)
return -1; return -1;
......
...@@ -410,6 +410,15 @@ enum virDomainNetVirtioTxModeType { ...@@ -410,6 +410,15 @@ enum virDomainNetVirtioTxModeType {
VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST, 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 /* Config that was actually used to bring up interface, after
* resolving network reference. This is private data, only used within * resolving network reference. This is private data, only used within
* libvirt, but still must maintain backward compatibility, because * libvirt, but still must maintain backward compatibility, because
...@@ -495,6 +504,7 @@ struct _virDomainNetDef { ...@@ -495,6 +504,7 @@ struct _virDomainNetDef {
char *filter; char *filter;
virNWFilterHashTablePtr filterparams; virNWFilterHashTablePtr filterparams;
virBandwidthPtr bandwidth; virBandwidthPtr bandwidth;
int linkstate;
}; };
/* Used for prefix of ifname of any network name generated dynamically /* Used for prefix of ifname of any network name generated dynamically
...@@ -1829,6 +1839,7 @@ VIR_ENUM_DECL(virDomainFSAccessMode) ...@@ -1829,6 +1839,7 @@ VIR_ENUM_DECL(virDomainFSAccessMode)
VIR_ENUM_DECL(virDomainNet) VIR_ENUM_DECL(virDomainNet)
VIR_ENUM_DECL(virDomainNetBackend) VIR_ENUM_DECL(virDomainNetBackend)
VIR_ENUM_DECL(virDomainNetVirtioTxMode) VIR_ENUM_DECL(virDomainNetVirtioTxMode)
VIR_ENUM_DECL(virDomainNetInterfaceLinkState)
VIR_ENUM_DECL(virDomainChrDevice) VIR_ENUM_DECL(virDomainChrDevice)
VIR_ENUM_DECL(virDomainChrChannelTarget) VIR_ENUM_DECL(virDomainChrChannelTarget)
VIR_ENUM_DECL(virDomainChrConsoleTarget) VIR_ENUM_DECL(virDomainChrConsoleTarget)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册