[libvirt] [PATCH v3 2/5] link-state: conf: Add element to XML for controling link state

Daniel Veillard veillard at redhat.com
Tue Sep 6 08:17:30 UTC 2011


On Mon, Sep 05, 2011 at 05:26:51PM +0200, Peter Krempa wrote:
> 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  - Documentation of new element
>  docs/schemas/network.rng   - Grammar for the new element
>  src/conf/domain_conf.c     - Parsing and generating code
>  src/conf/domain_conf.h     - Enum of available link states
> ---
>  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(+), 0 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index b960381..53de6c8 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -2092,6 +2092,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>
> +  ...
> +  <devices>
> +    <interface type='network'>
> +      <source network='default'/>
> +      <target dev='vnet0'/>
> +      <b><link state='down'/></b>
> +    </interface>
> +  <devices>
> +  ...</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>
> diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
> index 1c44471..937e180 100644
> --- a/docs/schemas/network.rng
> +++ b/docs/schemas/network.rng
> @@ -150,6 +150,17 @@
>         <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>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index cce9955..75431fb 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -251,6 +251,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",
> @@ -2945,6 +2950,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;
> @@ -3021,6 +3027,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) &&
> @@ -3285,6 +3294,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;

   right it catches state='default' as unknown :-)

> +        }
> +    }
> +
>      if (filter != NULL) {
>          switch (def->type) {
>          case VIR_DOMAIN_NET_TYPE_ETHERNET:
> @@ -3332,6 +3351,7 @@ cleanup:
>      VIR_FREE(internal);
>      VIR_FREE(devaddr);
>      VIR_FREE(mode);
> +    VIR_FREE(linkstate);
>      virNWFilterHashTableFree(filterparams);
> 
>      return def;
> @@ -9429,6 +9449,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;
> 
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index e218a30..dc094f7 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -394,6 +394,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
> @@ -479,6 +488,7 @@ struct _virDomainNetDef {
>      char *filter;
>      virNWFilterHashTablePtr filterparams;
>      virBandwidthPtr bandwidth;
> +    int linkstate;
>  };
> 
>  /* Used for prefix of ifname of any network name generated dynamically
> @@ -1789,6 +1799,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)

  ACK, looks fine,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list