[ovs-dev] [patch v7] dpctl: Make opt_dpif_open() more general.

Darrell Ball dlu998 at gmail.com
Wed Aug 8 21:12:41 UTC 2018


Ben

If you apply this, I have one line to delete inline.

Darrell

On Wed, Aug 8, 2018 at 2:09 PM, Darrell Ball <dlu998 at gmail.com> wrote:

> By making opt_dpif_open() more general, it can be used effectively
> by all potential callers and avoids trying to open potentially bogus
> datapaths provided by the user. Also, the error handling is improved by
> reducing bogus errors and having more specific real errors.
>
> Signed-off-by: Darrell Ball <dlu998 at gmail.com>
> ---
>  lib/dpctl.c             | 56 ++++++++++++++++++++++++++++++
> ++++++++++++++-----
>  tests/system-traffic.at | 10 ++++-----
>  2 files changed, 56 insertions(+), 10 deletions(-)
>
> diff --git a/lib/dpctl.c b/lib/dpctl.c
> index c600eeb..ef057aa 100644
> --- a/lib/dpctl.c
> +++ b/lib/dpctl.c
> @@ -187,18 +187,64 @@ parsed_dpif_open(const char *arg_, bool create,
> struct dpif **dpifp)
>      return result;
>  }
>
> +static bool
> +dp_exists(const char *queried_dp)
> +{
> +    struct sset dpif_names = SSET_INITIALIZER(&dpif_names),
> +                dpif_types = SSET_INITIALIZER(&dpif_types);
> +    bool found = false;
> +    char *queried_name, *queried_type;
> +
> +    dp_parse_name(queried_dp, &queried_name, &queried_type);
> +    dp_enumerate_types(&dpif_types);
> +
> +    if (!sset_contains(&dpif_types, queried_type)) {
> +        goto out;
> +    }
> +
> +    int error = dp_enumerate_names(queried_type, &dpif_names);
> +    if (!error && sset_contains(&dpif_names, queried_name)) {
> +        found = true;
> +        goto out;
>

Pls remove the above "goto out;"



> +    }
> +
> +out:
> +    sset_destroy(&dpif_names);
> +    sset_destroy(&dpif_types);
> +    return found;
> +}
> +
> +static bool
> +dp_arg_exists(int argc, const char *argv[])
> +{
> +    if (argc > 1 && dp_exists(argv[1])) {
> +        return true;
> +    }
> +    return false;
> +}
> +
>  /* Open a dpif with an optional name argument.
>   *
> - * The datapath name is not a mandatory parameter for this command.  If
> - * it is not specified -- so 'argc' < 'max_args' -- we retrieve it from
> - * the current setup, assuming only one exists.  On success stores the
> - * opened dpif in '*dpifp'. */
> + * The datapath name is not a mandatory parameter for this command.  If
> it is
> + * not specified, we retrieve it from the current setup, assuming only one
> + * exists.  On success stores the opened dpif in '*dpifp'. */
>  static int
>  opt_dpif_open(int argc, const char *argv[], struct dpctl_params *dpctl_p,
>                uint8_t max_args, struct dpif **dpifp)
>  {
> +    char *dpname;
> +    if (dp_arg_exists(argc, argv)) {
> +        dpname = xstrdup(argv[1]);
> +    } else if (argc != max_args) {
> +        dpname = get_one_dp(dpctl_p);
> +    } else {
> +        /* If the arguments are the maximum possible number and there is
> no
> +         * valid datapath argument, then we fall into the case of dpname
> is
> +         * NULL, since this is an error. */
> +        dpname = NULL;
> +    }
> +
>      int error = 0;
> -    char *dpname = argc >= max_args ? xstrdup(argv[1]) :
> get_one_dp(dpctl_p);
>      if (!dpname) {
>          error = EINVAL;
>          dpctl_error(dpctl_p, error, "datapath not found");
> diff --git a/tests/system-traffic.at b/tests/system-traffic.at
> index cbd9542..a7c8a24 100644
> --- a/tests/system-traffic.at
> +++ b/tests/system-traffic.at
> @@ -1040,7 +1040,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack zone=5
> $ICMP_TUPLE])
>  AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep
> "orig=.src=10\.1\.1\.2,"], [1], [dnl
>  ])
>
> -OVS_TRAFFIC_VSWITCHD_STOP(["/could not create datapath/d"])
> +OVS_TRAFFIC_VSWITCHD_STOP
>  AT_CLEANUP
>
>  AT_SETUP([conntrack - IPv4 ping])
> @@ -1124,17 +1124,17 @@ ovs-appctl: ovs-vswitchd: server returned an error
>  ])
>
>  AT_CHECK([ovs-appctl dpctl/ct-set-maxconns one-bad-dp 10], [2], [], [dnl
> -ovs-vswitchd: opening datapath (Address family not supported by protocol)
> +ovs-vswitchd: datapath not found (Invalid argument)
>  ovs-appctl: ovs-vswitchd: server returned an error
>  ])
>
>  AT_CHECK([ovs-appctl dpctl/ct-get-maxconns one-bad-dp], [2], [], [dnl
> -ovs-vswitchd: opening datapath (Address family not supported by protocol)
> +ovs-vswitchd: datapath not found (Invalid argument)
>  ovs-appctl: ovs-vswitchd: server returned an error
>  ])
>
>  AT_CHECK([ovs-appctl dpctl/ct-get-nconns one-bad-dp], [2], [], [dnl
> -ovs-vswitchd: opening datapath (Address family not supported by protocol)
> +ovs-vswitchd: datapath not found (Invalid argument)
>  ovs-appctl: ovs-vswitchd: server returned an error
>  ])
>
> @@ -1164,7 +1164,7 @@ AT_CHECK([ovs-appctl dpctl/ct-get-maxconns], [], [dnl
>  10
>  ])
>
> -OVS_TRAFFIC_VSWITCHD_STOP(["/could not create datapath one-bad-dp of
> unknown type system/d"])
> +OVS_TRAFFIC_VSWITCHD_STOP
>  AT_CLEANUP
>
>  AT_SETUP([conntrack - IPv6 ping])
> --
> 1.9.1
>
>


More information about the dev mailing list