From edd1295e1da6bfe8e4e257e5fbfad71ac0bf7c87 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 6 Sep 2011 16:08:15 +0800 Subject: [PATCH] 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. --- docs/formatdomain.html.in | 21 +++++++++++++++++++++ docs/schemas/network.rng | 11 +++++++++++ src/conf/domain_conf.c | 24 ++++++++++++++++++++++++ src/conf/domain_conf.h | 11 +++++++++++ 4 files changed, 67 insertions(+) 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)