The function dpctl_flush_conntrack() and other such functions with multiple optional arguments can be simplified by introducing a new function to check whether a valid datapath name is supplied as an argument to the functions.
opt_dpif_open() can also make use of this new function to allow it to handle callers with multiple optional arguments. Signed-off-by: Darrell Ball <dlu...@gmail.com> --- v1->v2: Cleanup only. lib/dpctl.c | 62 +++++++++++++++++++++++++------------------------ tests/system-traffic.at | 8 +++---- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/lib/dpctl.c b/lib/dpctl.c index 4f1e443..93ca3d2 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -187,18 +187,39 @@ parsed_dpif_open(const char *arg_, bool create, struct dpif **dpifp) return result; } +static bool +check_for_dpif_arg(int argc, const char *argv[]) +{ + if (argc > 1) { + struct dpif *dpif; + int error = parsed_dpif_open(argv[1], false, &dpif); + if (!error) { + dpif_close(dpif); + 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 = NULL; int error = 0; - char *dpname = argc >= max_args ? xstrdup(argv[1]) : get_one_dp(dpctl_p); + + if (check_for_dpif_arg(argc, argv)) { + dpname = xstrdup(argv[1]); + } else if (argc != max_args) { + dpname = get_one_dp(dpctl_p); + } + if (!dpname) { error = EINVAL; dpctl_error(dpctl_p, error, "datapath not found"); @@ -1313,34 +1334,15 @@ dpctl_flush_conntrack(int argc, const char *argv[], struct ct_dpif_tuple tuple, *ptuple = NULL; struct ds ds = DS_EMPTY_INITIALIZER; uint16_t zone, *pzone = NULL; - char *name; int error, i = 1; - bool got_dpif = false; - /* Parse datapath name. It is not a mandatory parameter for this command. - * If it is not specified, we retrieve it from the current setup, - * assuming only one exists. */ - if (argc >= 2) { - error = parsed_dpif_open(argv[i], false, &dpif); - if (!error) { - got_dpif = true; - i++; - } else if (argc == 4) { - dpctl_error(dpctl_p, error, "invalid datapath"); - return error; - } + if (check_for_dpif_arg(argc, argv)) { + i++; } - if (!got_dpif) { - name = get_one_dp(dpctl_p); - if (!name) { - return EINVAL; - } - error = parsed_dpif_open(name, false, &dpif); - free(name); - if (error) { - dpctl_error(dpctl_p, error, "opening datapath"); - return error; - } + + error = opt_dpif_open(argc, argv, dpctl_p, 4, &dpif); + if (error) { + return error; } /* Parse zone */ diff --git a/tests/system-traffic.at b/tests/system-traffic.at index cbd9542..f53e51b 100644 --- a/tests/system-traffic.at +++ b/tests/system-traffic.at @@ -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(["/could not create datapath.*/d"]) AT_CLEANUP AT_SETUP([conntrack - IPv6 ping]) -- 1.9.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev