Re: [PATCH] domain_conf: set ifname for ovs vhostuser ifname

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09.12.2016 13:24, Mehdi Abaakouk wrote:
> This change adds a new helper function that
> return a ifname from the vhostuser unix-socket path but only
> if the interface is managed by openvswitch
> 
> This new function is issue to autodetect the ifname for openvswitch
> managed vhostuser interface.
> ---
>  src/conf/domain_conf.c          |  5 +++++
>  src/libvirt_private.syms        |  1 +
>  src/util/virnetdevopenvswitch.c | 41 +++++++++++++++++++++++++++++++++++++++++
>  src/util/virnetdevopenvswitch.h |  3 +++
>  4 files changed, 50 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 7715cad..178208e 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -55,6 +55,7 @@
>  #include "virtpm.h"
>  #include "virstring.h"
>  #include "virnetdev.h"
> +#include "virnetdevopenvswitch.h"
>  #include "virhostdev.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_DOMAIN
> @@ -9582,6 +9583,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>  
>          def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX;
>          def->data.vhostuser->data.nix.path = vhostuser_path;
> +
> +        if (!ifname)
> +            ifname = virNetDevOpenvswitchGetVhostuserIfname(vhostuser_path);


This should go into post parse callback. I mean, I know that we still do
fill out some defaults in parse phase, but we shouldn't really. Once
domain XML is parsed, post parse callbacks are called and it their jobs
to fill in missing pieces (or chose some sane defaults).
qemuDomainDefPostParse() looks like a good candidate.

> +
>          vhostuser_path = NULL;
>  
>          if (STREQ(vhostuser_mode, "server")) {
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 867acdb..1b3d8d4 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2047,6 +2047,7 @@ virNetDevMidonetUnbindPort;
>  # util/virnetdevopenvswitch.h
>  virNetDevOpenvswitchAddPort;
>  virNetDevOpenvswitchGetMigrateData;
> +virNetDevOpenvswitchGetVhostuserIfname;
>  virNetDevOpenvswitchInterfaceStats;
>  virNetDevOpenvswitchRemovePort;
>  virNetDevOpenvswitchSetMigrateData;
> diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c
> index f003b3b..94b730b 100644
> --- a/src/util/virnetdevopenvswitch.c
> +++ b/src/util/virnetdevopenvswitch.c
> @@ -377,3 +377,44 @@ virNetDevOpenvswitchInterfaceStats(const char *ifname,
>      virCommandFree(cmd);
>      return ret;
>  }
> +
> +/**
> + * virNetDevOpenvswitchVhostuserGetIfname:
> + * @path: the path of the unix socket
> + *
> + * Retreives the ovs ifname from vhostuser unix socket path
> + *
> + * Returns a new string which must be deallocated by caller or NULL
> + */
> +char *
> +virNetDevOpenvswitchGetVhostuserIfname(const char *path)
> +{
> +    virCommandPtr cmd = NULL;
> +    char *ifname = NULL;
> +    char **tokens = NULL;
> +    size_t ntokens = 0;
> +
> +    /* Openvswitch vhostuser path are hardcoded to
> +     * /<runstatedir>/openvswitch/<ifname>
> +     * for example: /var/run/openvswitch/dpdkvhostuser0
> +     *
> +     * so we pick the filename and check it's a openvswitch interface
> +     */
> +    if ((tokens = virStringSplitCount(path, "/", 0, &ntokens))) {
> +         if (VIR_STRDUP(ifname, tokens[ntokens - 1]) < 0)
> +             goto cleanup;
> +    }
> +    if (ifname != NULL) {
> +        cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "get", "Interface",
> +                                   ifname, "name", NULL);
> +        if (virCommandRun(cmd, NULL) < 0) {
> +            /* it's not a openvswitch vhostuser interface */
> +            VIR_FREE(ifname);
> +        }
> +    }
> +
> + cleanup:
> +    virStringListFreeCount(tokens, ntokens);
> +    return ifname;

The @cmd needs to be freed.

> +
> +}
> diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitch.h
> index 0f9e1df..fe86e28 100644
> --- a/src/util/virnetdevopenvswitch.h
> +++ b/src/util/virnetdevopenvswitch.h
> @@ -52,4 +52,7 @@ int virNetDevOpenvswitchInterfaceStats(const char *ifname,
>                                         virDomainInterfaceStatsPtr stats)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
>  
> +char *virNetDevOpenvswitchGetVhostuserIfname(const char *path)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
> +
>  #endif /* __VIR_NETDEV_OPENVSWITCH_H__ */
> 

Michal

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]
  Powered by Linux