From patchwork Thu Aug 2 00:35:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi-Hung Wei X-Patchwork-Id: 952497 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="LIUrW13Z"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41grzw3xwxz9s3q for ; Thu, 2 Aug 2018 10:45:00 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id EB907E67; Thu, 2 Aug 2018 00:41:17 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id E3015E4C for ; Thu, 2 Aug 2018 00:41:16 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 63FCA7AC for ; Thu, 2 Aug 2018 00:41:16 +0000 (UTC) Received: by mail-pf1-f170.google.com with SMTP id k21-v6so248312pff.11 for ; Wed, 01 Aug 2018 17:41:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mOX2GwrCPjW/Wd/fG7xb7nurEGEIK8umD50Li7uMSDo=; b=LIUrW13Z4YjBSLquLPSL2Q82a6y3/bu/sPmTndIsGYg9KNzEY8EfGJzQU47bDBPGjT UydTYyisiU2ZV8jOaYXcvkHFdj2OU5AFquhC8t8HxNMK2v6qXUuRj2L+z6AyOS4FTGjs dmRU832Zcj3wj5tQ1UhNyRD51IosBO13WtqjMkEKGNF2Co/AL4QFCdz57omHXIn3RgKV GMkyvjuHwvzupIsAk5M6bY+5X1qeQMGjv3QARwAr93YMLuLsYCUAd8iPCo6T+gEQFI/u igB2lednrnmvFWzyKPskSk0mPKtLO2kX8YQzh3DzFj/u4N2OpuZB6mn8NRHADi1koPj1 LANw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mOX2GwrCPjW/Wd/fG7xb7nurEGEIK8umD50Li7uMSDo=; b=Eqa1H6eq2avOchRrjgP2WF1Pa6MPC9nZFx2mR81dSC27IgNVxhdRL05nf9VMpqM5Rc PQHFL66TFjBN6IS3BGrOQ5V4WkLVpvMhlXti28cBw74E9dokfi/XhKtjUXgtPY379f6z 5Kw0EYsn6FFwBhESKjr27wgujWiUpSFsp/uq0kVhK9SKmxDnQcSxQ9iKDv51nm1jDWh/ IorqRtF+wDsaJCpYsExHWpzz1Ah85j4x9gPpWoTqZu7wNY+Nqf5+OdQl8VOawqDNFamY sH9IsHngv/Wtv6dr0dfASqyvVKz1BG6bqrcJLfzh4K8+MVNcLaqlFOT3riBYIear8siO 9ztw== X-Gm-Message-State: AOUpUlH3IyEFqigzsV5gymiyisYn+GHM0cEQ3POUYLFuunUoBrr12Sld i1FVQGfW7aaSU6v45mXbDD4oX1qp X-Google-Smtp-Source: AAOMgpcHcTMen12dvxWnBcZL8vJM7OcaP1w0H1BDu/RbUUhleNQlu/5OtZh43HmdOLhgVOZ/kUU30Q== X-Received: by 2002:a63:8b44:: with SMTP id j65-v6mr546016pge.248.1533170475465; Wed, 01 Aug 2018 17:41:15 -0700 (PDT) Received: from Husky.eng.vmware.com ([66.170.99.1]) by smtp.gmail.com with ESMTPSA id s73-v6sm328627pfi.154.2018.08.01.17.41.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Aug 2018 17:41:14 -0700 (PDT) From: Yi-Hung Wei To: dev@openvswitch.org Date: Wed, 1 Aug 2018 17:35:54 -0700 Message-Id: <1533170156-769-10-git-send-email-yihung.wei@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533170156-769-1-git-send-email-yihung.wei@gmail.com> References: <1533170156-769-1-git-send-email-yihung.wei@gmail.com> X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v2 09/11] dpctl: Refactor opt_dpif_open(). X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Make opt_dpif_open() to support mulitple optional arguments. It will be useful for the following patches. Signed-off-by: Yi-Hung Wei --- lib/dpctl.c | 85 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/lib/dpctl.c b/lib/dpctl.c index 4f1e443f2662..35733774b331 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -191,14 +191,40 @@ parsed_dpif_open(const char *arg_, bool create, struct dpif **dpifp) * * 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 current setup, assuming only one exists. + * For commands with multiple optional arguments, we try to use the first + * argument as the dpif name. If it is failed, then we fallback to + * retrieve it form the current setup. + * On success stores the opened dpif in '*dpifp', and the next arugment + * to be parsed in '*indexp'. */ static int opt_dpif_open(int argc, const char *argv[], struct dpctl_params *dpctl_p, - uint8_t max_args, struct dpif **dpifp) + uint8_t max_args, struct dpif **dpifp, bool multi_opt, + int *indexp) { + char *dpname; int error = 0; - char *dpname = argc >= max_args ? xstrdup(argv[1]) : get_one_dp(dpctl_p); + + if (indexp) { + *indexp = 1; + } + + if (multi_opt && argc > 1) { + error = parsed_dpif_open(argv[1], false, dpifp); + if (!error) { + if (indexp) { + *indexp = 2; + } + return 0; + } else if (argc == max_args) { + dpctl_error(dpctl_p, error, "invalid datapath"); + return error; + } + dpname = get_one_dp(dpctl_p); + } else { + dpname = argc >= max_args ? xstrdup(argv[1]) : get_one_dp(dpctl_p); + } + if (!dpname) { error = EINVAL; dpctl_error(dpctl_p, error, "datapath not found"); @@ -863,7 +889,7 @@ dpctl_dump_flows(int argc, const char *argv[], struct dpctl_params *dpctl_p) } } - error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (error) { goto out_free; } @@ -990,7 +1016,7 @@ dpctl_put_flow(int argc, const char *argv[], enum dpif_flow_put_flags flags, struct simap port_names; int n, error; - error = opt_dpif_open(argc, argv, dpctl_p, 4, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 4, &dpif, false, NULL); if (error) { return error; } @@ -1092,7 +1118,7 @@ dpctl_get_flow(int argc, const char *argv[], struct dpctl_params *dpctl_p) struct ds ds; int n, error; - error = opt_dpif_open(argc, argv, dpctl_p, 3, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 3, &dpif, false, NULL); if (error) { return error; } @@ -1141,7 +1167,7 @@ dpctl_del_flow(int argc, const char *argv[], struct dpctl_params *dpctl_p) struct simap port_names; int n, error; - error = opt_dpif_open(argc, argv, dpctl_p, 3, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 3, &dpif, false, NULL); if (error) { return error; } @@ -1210,7 +1236,7 @@ dpctl_del_flows(int argc, const char *argv[], struct dpctl_params *dpctl_p) { struct dpif *dpif; - int error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + int error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (error) { return error; } @@ -1271,7 +1297,7 @@ dpctl_dump_conntrack(int argc, const char *argv[], argc--; } - error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (error) { return error; } @@ -1313,34 +1339,11 @@ 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 (!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, true, &i); + if (error) { + return error; } /* Parse zone */ @@ -1412,7 +1415,7 @@ dpctl_ct_stats_show(int argc, const char *argv[], } } - error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (error) { return error; } @@ -1537,7 +1540,7 @@ dpctl_ct_bkts(int argc, const char *argv[], } } - error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (error) { return error; } @@ -1617,7 +1620,7 @@ dpctl_ct_set_maxconns(int argc, const char *argv[], struct dpctl_params *dpctl_p) { struct dpif *dpif; - int error = opt_dpif_open(argc, argv, dpctl_p, 3, &dpif); + int error = opt_dpif_open(argc, argv, dpctl_p, 3, &dpif, false, NULL); if (!error) { uint32_t maxconns; if (ovs_scan(argv[argc - 1], "%"SCNu32, &maxconns)) { @@ -1643,7 +1646,7 @@ dpctl_ct_get_maxconns(int argc, const char *argv[], struct dpctl_params *dpctl_p) { struct dpif *dpif; - int error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + int error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (!error) { uint32_t maxconns; error = ct_dpif_get_maxconns(dpif, &maxconns); @@ -1664,7 +1667,7 @@ dpctl_ct_get_nconns(int argc, const char *argv[], struct dpctl_params *dpctl_p) { struct dpif *dpif; - int error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif); + int error = opt_dpif_open(argc, argv, dpctl_p, 2, &dpif, false, NULL); if (!error) { uint32_t nconns; error = ct_dpif_get_nconns(dpif, &nconns);