[ovs-dev] [PATCH ovn 08/11] dummy: Introduce new --enable-dummy=system option.

Alex Wang alexw at nicira.com
Mon Jun 15 18:04:04 UTC 2015


Do you think it is better to change the optarg to "override-all" and
"override-system"?

Acked-by: Alex Wang <alexw at nicira.com>

On Sun, Jun 14, 2015 at 12:19 PM, Ben Pfaff <blp at nicira.com> wrote:

> Until now there have been two variants for --enable-dummy:
>
>     * --enable-dummy: This adds support for "dummy" dpif and netdev.
>
>     * --enable-dummy=override: In addition, this replaces *every* existing
>       dpif and netdev by the dummy type.
>
> The latter is useful for testing but it defeats the possibility of using
> the userspace native tunneling implementation (because all the tunnel
> netdevs get replaced by dummy netdevs).  Thus, this commit adds a third
> variant:
>
>     * --enable-dummy=system: This replaces the "system" dpif and netdev
>       by dummies but leaves the others untouched.
>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
>  lib/dpif-netdev.c       | 18 +++++++++++++-----
>  lib/dummy.c             | 28 ++++++++++++++++++++--------
>  lib/dummy.h             | 19 +++++++++++++++----
>  lib/netdev-dummy.c      | 44 +++++++++++++++++++++++++-------------------
>  vswitchd/ovs-vswitchd.c |  4 ++--
>  5 files changed, 75 insertions(+), 38 deletions(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index d306f77..be09bff 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -3688,21 +3688,29 @@ dpif_dummy_register__(const char *type)
>      dp_register_provider(class);
>  }
>
> +static void
> +dpif_dummy_override(const char *type)
> +{
> +    if (!dp_unregister_provider(type)) {
> +        dpif_dummy_register__(type);
> +    }
> +}
> +
>  void
> -dpif_dummy_register(bool override)
> +dpif_dummy_register(enum dummy_level level)
>  {
> -    if (override) {
> +    if (level == DUMMY_OVERRIDE_ALL) {
>          struct sset types;
>          const char *type;
>
>          sset_init(&types);
>          dp_enumerate_types(&types);
>          SSET_FOR_EACH (type, &types) {
> -            if (!dp_unregister_provider(type)) {
> -                dpif_dummy_register__(type);
> -            }
> +            dpif_dummy_override(type);
>          }
>          sset_destroy(&types);
> +    } else if (level == DUMMY_OVERRIDE_SYSTEM) {
> +        dpif_dummy_override("system");
>      }
>
>      dpif_dummy_register__("dummy");
> diff --git a/lib/dummy.c b/lib/dummy.c
> index 0918037..ef36578 100644
> --- a/lib/dummy.c
> +++ b/lib/dummy.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2010, 2011, 2012, 2013 Nicira, Inc.
> + * Copyright (c) 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -15,23 +15,35 @@
>   */
>
>  #include <config.h>
> -
>  #include "dummy.h"
> +#include <string.h>
> +#include "util.h"
>
>  /* Enables support for "dummy" network devices and dpifs, which are
> useful for
>   * testing.  A client program might call this function if it is designed
>   * specifically for testing or the user enables it on the command line.
>   *
> - * If 'override' is false, then "dummy" dpif and netdev classes will be
> - * created.  If 'override' is true, then in addition all existing dpif and
> - * netdev classes will be deleted and replaced by dummy classes.
> + * 'arg' is parsed to determine the override level (see the definition of
> enum
> + * dummy_level).
>   *
>   * There is no strong reason why dummy devices shouldn't always be
> enabled. */
>  void
> -dummy_enable(bool override)
> +dummy_enable(const char *arg)
>  {
> -    netdev_dummy_register(override);
> -    dpif_dummy_register(override);
> +    enum dummy_level level;
> +
> +    if (!arg || !arg[0]) {
> +        level = DUMMY_OVERRIDE_NONE;
> +    } else if (!strcmp(arg, "system")) {
> +        level = DUMMY_OVERRIDE_SYSTEM;
> +    } else if (!strcmp(arg, "override")) {
> +        level = DUMMY_OVERRIDE_ALL;
> +    } else {
> +        ovs_fatal(0, "%s: unknown dummy level", arg);
> +    }
> +
> +    netdev_dummy_register(level);
> +    dpif_dummy_register(level);
>      timeval_dummy_register();
>      vlandev_dummy_enable();
>  }
> diff --git a/lib/dummy.h b/lib/dummy.h
> index b20519a..a94658b 100644
> --- a/lib/dummy.h
> +++ b/lib/dummy.h
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2010, 2011, 2012, 2013 Nicira, Inc.
> + * Copyright (c) 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -19,12 +19,23 @@
>
>  #include <stdbool.h>
>
> +/* Degree of dummy support.
> + *
> + * Beyond enabling support for dummies, it can be useful to replace some
> kinds
> + * of bridges and netdevs, or all kinds, by dummies.  This enum expresses
> the
> + * degree to which this should happen. */
> +enum dummy_level {
> +    DUMMY_OVERRIDE_NONE,        /* Support dummy but don't force its use.
> */
> +    DUMMY_OVERRIDE_SYSTEM,      /* Replace "system" by dummy. */
> +    DUMMY_OVERRIDE_ALL,         /* Replace all types by dummy. */
> +};
> +
>  /* For client programs to call directly to enable dummy support. */
> -void dummy_enable(bool override);
> +void dummy_enable(const char *arg);
>
>  /* Implementation details. */
> -void dpif_dummy_register(bool override);
> -void netdev_dummy_register(bool override);
> +void dpif_dummy_register(enum dummy_level);
> +void netdev_dummy_register(enum dummy_level);
>  void timeval_dummy_register(void);
>  void vlandev_dummy_enable(void);
>
> diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
> index ff65689..c8072b6 100644
> --- a/lib/netdev-dummy.c
> +++ b/lib/netdev-dummy.c
> @@ -1426,8 +1426,27 @@ netdev_dummy_ip4addr(struct unixctl_conn *conn, int
> argc OVS_UNUSED,
>
>  }
>
> +static void
> +netdev_dummy_override(const char *type)
> +{
> +    if (!netdev_unregister_provider(type)) {
> +        struct netdev_class *class;
> +        int error;
> +
> +        class = xmemdup(&dummy_class, sizeof dummy_class);
> +        class->type = xstrdup(type);
> +        error = netdev_register_provider(class);
> +        if (error) {
> +            VLOG_ERR("%s: failed to register netdev provider (%s)",
> +                     type, ovs_strerror(error));
> +            free(CONST_CAST(char *, class->type));
> +            free(class);
> +        }
> +    }
> +}
> +
>  void
> -netdev_dummy_register(bool override)
> +netdev_dummy_register(enum dummy_level level)
>  {
>      unixctl_command_register("netdev-dummy/receive", "name
> packet|flow...",
>                               2, INT_MAX, netdev_dummy_receive, NULL);
> @@ -1441,33 +1460,20 @@ netdev_dummy_register(bool override)
>                               "[netdev] ipaddr/mask-prefix-len", 2, 2,
>                               netdev_dummy_ip4addr, NULL);
>
> -
> -    if (override) {
> +    if (level == DUMMY_OVERRIDE_ALL) {
>          struct sset types;
>          const char *type;
>
>          sset_init(&types);
>          netdev_enumerate_types(&types);
>          SSET_FOR_EACH (type, &types) {
> -            if (!strcmp(type, "patch")) {
> -                continue;
> -            }
> -            if (!netdev_unregister_provider(type)) {
> -                struct netdev_class *class;
> -                int error;
> -
> -                class = xmemdup(&dummy_class, sizeof dummy_class);
> -                class->type = xstrdup(type);
> -                error = netdev_register_provider(class);
> -                if (error) {
> -                    VLOG_ERR("%s: failed to register netdev provider
> (%s)",
> -                             type, ovs_strerror(error));
> -                    free(CONST_CAST(char *, class->type));
> -                    free(class);
> -                }
> +            if (strcmp(type, "patch")) {
> +                netdev_dummy_override(type);
>              }
>          }
>          sset_destroy(&types);
> +    } else if (level == DUMMY_OVERRIDE_SYSTEM) {
> +        netdev_dummy_override("system");
>      }
>      netdev_register_provider(&dummy_class);
>
> diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
> index a1b33da..ba1c6bf 100644
> --- a/vswitchd/ovs-vswitchd.c
> +++ b/vswitchd/ovs-vswitchd.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
> +/* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira,
> Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -204,7 +204,7 @@ parse_options(int argc, char *argv[], char
> **unixctl_pathp)
>              break;
>
>          case OPT_ENABLE_DUMMY:
> -            dummy_enable(optarg && !strcmp(optarg, "override"));
> +            dummy_enable(optarg);
>              break;
>
>          case OPT_DISABLE_SYSTEM:
> --
> 2.1.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list