]> xenbits.xensource.com Git - libvirt.git/commitdiff
link-state: conf: Add element to XML for controling link state
authorPeter Krempa <pkrempa@redhat.com>
Tue, 6 Sep 2011 08:08:15 +0000 (16:08 +0800)
committerDaniel Veillard <veillard@redhat.com>
Tue, 6 Sep 2011 08:08:15 +0000 (16:08 +0800)
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
docs/schemas/network.rng
src/conf/domain_conf.c
src/conf/domain_conf.h

index 54e81b0d9e25368417289ca90eb0febd09bb5212..0a7abafac4203786c9cc9e043186149065182d5b 100644 (file)
@@ -2131,6 +2131,27 @@ qemu-kvm -net nic,model=? /dev/null
       <span class="since">Since 0.9.4</span>
     </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>
 
     <p>
index 1c44471271e1bafa75f3c848c5aefe07630ee86d..937e1808ee074c2a55363c32800e89c4206311ec 100644 (file)
        <optional>
          <ref name="bandwidth"/>
        </optional>
+       <optional>
+         <element name="link">
+           <attribute name="state">
+             <choice>
+               <value>up</value>
+               <value>down</value>
+             </choice>
+           </attribute>
+           <empty/>
+         </element>
+        </optional>
 
         <!-- <ip> element -->
         <zeroOrMore>
index 5d95ee71368e45718f011c7f859cf3022317ed7a..74f8d6aec3090f06d4cfb2fe52aed6de7a1a7edc 100644 (file)
@@ -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,   "      </tune>\n");
     }
 
+    if (def->linkstate)
+        virBufferAsprintf(buf, "      <link state='%s'/>\n",
+                          virDomainNetInterfaceLinkStateTypeToString(def->linkstate));
+
     if (virBandwidthDefFormat(buf, def->bandwidth, "      ") < 0)
         return -1;
 
index bb9d3dbc766fb22c8869e391eb181e53f7b8879a..371f2701f9b71abf007b287b2ad98a965e1df629 100644 (file)
@@ -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)