From patchwork Sun Jul 23 17:28:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Darrell Ball X-Patchwork-Id: 792576 X-Patchwork-Delegate: dlu998@gmail.com 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; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=onevmw.onmicrosoft.com header.i=@onevmw.onmicrosoft.com header.b="bNSSW7W5"; 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 3xFs0x18CBz9s81 for ; Mon, 24 Jul 2017 03:28:33 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id F3A139B9; Sun, 23 Jul 2017 17:28:28 +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 3696C8FF for ; Sun, 23 Jul 2017 17:28:28 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0082.outbound.protection.outlook.com [104.47.34.82]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id CC35F12C for ; Sun, 23 Jul 2017 17:28:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=onevmw.onmicrosoft.com; s=selector1-vmware-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=8+yi0uaQxn+KFZRQ7QrdMtrsYbDUOuuA3hF0awacGgQ=; b=bNSSW7W5BqXnqYBr9MCaIBy5pUX/hvXObOGo1yS+vgRLIMXrDp4N7ouigwZa2Jv4vpreiAeUYbvyd67Qumzoi3BciHKuxGXpgGJ9f2TsX74Hr9qCjpOtI2622vN+Zb0gTBw4Pxv0iDKoJBPYVw/G4MwxnNBk8J6+JQMPxKhyN68= Received: from BLUPR05MB611.namprd05.prod.outlook.com (10.141.204.27) by BLUPR05MB1953.namprd05.prod.outlook.com (10.162.224.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1304.10; Sun, 23 Jul 2017 17:28:24 +0000 Received: from BLUPR05MB611.namprd05.prod.outlook.com ([10.141.204.27]) by BLUPR05MB611.namprd05.prod.outlook.com ([10.141.204.27]) with mapi id 15.01.1304.010; Sun, 23 Jul 2017 17:28:24 +0000 From: Darrell Ball To: "antonio.fischetti@intel.com" , "dev@openvswitch.org" Thread-Topic: [ovs-dev] [PATCH v4] dpctl: Add new 'ct-bkts' command. Thread-Index: AQHTAvhPwC4+tr6bgkC/Mi4LwW3FLKJhNuoA Date: Sun, 23 Jul 2017 17:28:24 +0000 Message-ID: <151E7AB3-EE38-4537-B1A1-74D585CF54F4@vmware.com> References: <1500734330-22102-1-git-send-email-antonio.fischetti@intel.com> In-Reply-To: <1500734330-22102-1-git-send-email-antonio.fischetti@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Microsoft-MacOutlook/f.20.0.170309 authentication-results: spf=none (sender IP is ) smtp.mailfrom=dball@vmware.com; x-originating-ip: [73.162.236.45] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; BLUPR05MB1953; 20:Zs3w23j1O3/dJ1z920zbySeXHOZtULesTvSPqVKgfqXpnCrHzBT46zFxQKYL8KI1XVw39TFqwZNIIZy/Sg72FQXaeVw6dKw99+/7FUo5QrvvRHtRz3MOEsEe/Q0McWA6HR8rE1YgvNsmcZIdIQiXtKXcSBtB6nIZ2/B/qZW4pRE= x-ms-office365-filtering-correlation-id: 2e8f4d59-cdea-45b1-cb93-08d4d1f0392a x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254075)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:BLUPR05MB1953; x-ms-traffictypediagnostic: BLUPR05MB1953: x-exchange-antispam-report-test: UriScan:(10436049006162)(216315784871565)(228905959029699); x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(93006095)(93001095)(10201501046)(3002001)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123555025)(20161123562025)(20161123560025)(20161123558100)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BLUPR05MB1953; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BLUPR05MB1953; x-forefront-prvs: 0377802854 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39410400002)(39400400002)(39450400003)(39850400002)(39840400002)(189002)(13464003)(377454003)(199003)(53946003)(8936002)(5660300001)(86362001)(575784001)(305945005)(7736002)(106356001)(105586002)(4001350100001)(2501003)(101416001)(2906002)(54356999)(33656002)(76176999)(50986999)(81156014)(81166006)(82746002)(8676002)(102836003)(3846002)(6116002)(966005)(6306002)(6512007)(53936002)(6436002)(83506001)(99286003)(83716003)(6246003)(2900100001)(38730400002)(2950100002)(53546010)(14454004)(6486002)(6506006)(77096006)(229853002)(189998001)(3660700001)(66066001)(97736004)(36756003)(25786009)(3280700002)(478600001)(68736007)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR05MB1953; H:BLUPR05MB611.namprd05.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; received-spf: None (protection.outlook.com: vmware.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-ID: <910A764DD9968C40B59AF4098A9EC733@namprd05.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: vmware.com X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Jul 2017 17:28:24.5825 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: b39138ca-3cee-4b4a-a4d6-cd83d9dd62f0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR05MB1953 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,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: Re: [ovs-dev] [PATCH v4] dpctl: Add new 'ct-bkts' command. 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: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Minor comment: When applying the patch, there is a complaint about new whitespace below +the number of connections in a bucket is greater than \fIThreshold\fR. + Two comments inline -----Original Message----- From: on behalf of "antonio.fischetti@intel.com" Date: Saturday, July 22, 2017 at 7:38 AM To: "dev@openvswitch.org" Subject: [ovs-dev] [PATCH v4] dpctl: Add new 'ct-bkts' command. With the command: ovs-appctl dpctl/ct-bkts shows the number of connections per bucket. By using a threshold: ovs-appctl dpctl/ct-bkts gt=N for each bucket shows the number of connections when they are greater than N. Signed-off-by: Antonio Fischetti Signed-off-by: Bhanuprakash Bodireddy Co-authored-by: Bhanuprakash Bodireddy --- lib/conntrack.c | 9 ++-- lib/conntrack.h | 2 +- lib/ct-dpif.c | 4 +- lib/ct-dpif.h | 3 +- lib/dpctl.c | 108 ++++++++++++++++++++++++++++++++++++++++- lib/dpctl.man | 8 +++ lib/dpif-netdev.c | 4 +- lib/dpif-netlink.c | 4 +- lib/dpif-provider.h | 2 +- lib/netlink-conntrack.c | 6 ++- lib/netlink-conntrack.h | 3 +- tests/test-netlink-conntrack.c | 3 +- utilities/ovs-dpctl.c | 1 + 13 files changed, 140 insertions(+), 17 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index de46a6b..e290b20 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -1931,7 +1931,7 @@ conn_key_to_tuple(const struct conn_key *key, struct ct_dpif_tuple *tuple) static void conn_to_ct_dpif_entry(const struct conn *conn, struct ct_dpif_entry *entry, - long long now) + long long now, int bkt) { struct ct_l4_proto *class; long long expiration; @@ -1954,11 +1954,12 @@ conn_to_ct_dpif_entry(const struct conn *conn, struct ct_dpif_entry *entry, if (class->conn_get_protoinfo) { class->conn_get_protoinfo(conn, &entry->protoinfo); } + entry->bkt = bkt; } int conntrack_dump_start(struct conntrack *ct, struct conntrack_dump *dump, - const uint16_t *pzone) + const uint16_t *pzone, int *ptot_bkts) { memset(dump, 0, sizeof(*dump)); if (pzone) { @@ -1967,6 +1968,8 @@ conntrack_dump_start(struct conntrack *ct, struct conntrack_dump *dump, } dump->ct = ct; + *ptot_bkts = CONNTRACK_BUCKETS; + return 0; } @@ -1991,7 +1994,7 @@ conntrack_dump_next(struct conntrack_dump *dump, struct ct_dpif_entry *entry) INIT_CONTAINER(conn, node, node); if ((!dump->filter_zone || conn->key.zone == dump->zone) && (conn->conn_type != CT_CONN_TYPE_UN_NAT)) { - conn_to_ct_dpif_entry(conn, entry, now); + conn_to_ct_dpif_entry(conn, entry, now, dump->bucket); break; } /* Else continue, until we find an entry in the appropriate zone diff --git a/lib/conntrack.h b/lib/conntrack.h index defde4c..3f48444 100644 --- a/lib/conntrack.h +++ b/lib/conntrack.h @@ -108,7 +108,7 @@ struct conntrack_dump { struct ct_dpif_entry; int conntrack_dump_start(struct conntrack *, struct conntrack_dump *, - const uint16_t *pzone); + const uint16_t *pzone, int *); int conntrack_dump_next(struct conntrack_dump *, struct ct_dpif_entry *); int conntrack_dump_done(struct conntrack_dump *); diff --git a/lib/ct-dpif.c b/lib/ct-dpif.c index f8d2cf1..c79e69e 100644 --- a/lib/ct-dpif.c +++ b/lib/ct-dpif.c @@ -65,12 +65,12 @@ static const struct flags ct_dpif_status_flags[] = { * that represents the error. Otherwise it returns zero. */ int ct_dpif_dump_start(struct dpif *dpif, struct ct_dpif_dump_state **dump, - const uint16_t *zone) + const uint16_t *zone, int *ptot_bkts) { int err; err = (dpif->dpif_class->ct_dump_start - ? dpif->dpif_class->ct_dump_start(dpif, dump, zone) + ? dpif->dpif_class->ct_dump_start(dpif, dump, zone, ptot_bkts) : EOPNOTSUPP); if (!err) { diff --git a/lib/ct-dpif.h b/lib/ct-dpif.h index cd35f3e..d5f9661 100644 --- a/lib/ct-dpif.h +++ b/lib/ct-dpif.h @@ -169,6 +169,7 @@ struct ct_dpif_entry { /* Timeout for this entry in seconds */ uint32_t timeout; uint32_t mark; + uint32_t bkt; /* CT bucket number. */ }; enum { @@ -191,7 +192,7 @@ struct ct_dpif_dump_state { }; int ct_dpif_dump_start(struct dpif *, struct ct_dpif_dump_state **, - const uint16_t *zone); + const uint16_t *zone, int *); int ct_dpif_dump_next(struct ct_dpif_dump_state *, struct ct_dpif_entry *); int ct_dpif_dump_done(struct ct_dpif_dump_state *); int ct_dpif_flush(struct dpif *, const uint16_t *zone); diff --git a/lib/dpctl.c b/lib/dpctl.c index 6aa6c8e..3ccc7a3 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -1258,6 +1258,7 @@ dpctl_dump_conntrack(int argc, const char *argv[], struct ct_dpif_dump_state *dump; struct ct_dpif_entry cte; uint16_t zone, *pzone = NULL; + int tot_bkts; struct dpif *dpif; char *name; int error; @@ -1277,7 +1278,7 @@ dpctl_dump_conntrack(int argc, const char *argv[], return error; } - error = ct_dpif_dump_start(dpif, &dump, pzone); + error = ct_dpif_dump_start(dpif, &dump, pzone, &tot_bkts); if (error) { dpctl_error(dpctl_p, error, "starting conntrack dump"); dpif_close(dpif); @@ -1339,6 +1340,7 @@ dpctl_ct_stats_show(int argc, const char *argv[], struct ct_dpif_dump_state *dump; struct ct_dpif_entry cte; uint16_t zone, *pzone = NULL; + int tot_bkts; bool verbose = false; int lastargc = 0; @@ -1373,7 +1375,7 @@ dpctl_ct_stats_show(int argc, const char *argv[], memset(proto_stats, 0, sizeof(proto_stats)); memset(tcp_conn_per_states, 0, sizeof(tcp_conn_per_states)); - error = ct_dpif_dump_start(dpif, &dump, pzone); + error = ct_dpif_dump_start(dpif, &dump, pzone, &tot_bkts); if (error) { dpctl_error(dpctl_p, error, "starting conntrack dump"); dpif_close(dpif); @@ -1464,6 +1466,107 @@ dpctl_ct_stats_show(int argc, const char *argv[], dpif_close(dpif); return error; } + +#define CT_BKTS_GT "gt=" +static int +dpctl_ct_bkts(int argc, const char *argv[], + struct dpctl_params *dpctl_p) +{ + struct dpif *dpif; + char *name; + + struct ct_dpif_dump_state *dump; + struct ct_dpif_entry cte; + uint16_t gt = 0; /* Threshold: display value when greater than gt. */ + uint16_t *pzone = NULL; + int tot_bkts = 0; + int lastargc = 0; + + int error; + + while (argc > 1 && lastargc != argc) { + lastargc = argc; + if (!strncmp(argv[argc - 1], CT_BKTS_GT, strlen(CT_BKTS_GT))) { + if (ovs_scan(argv[argc - 1], CT_BKTS_GT"%"SCNu16, >)) { + argc--; + break; + } + } + } [Darrell] When, I do this, I get a failure, which is expected. > 2017-07-23T02:28:02.155Z|00052|connmgr|INFO|br0<->unix: 11 flow_mods in the last 0 s (11 adds) > 2017-07-23T02:28:02.346Z|00053|unixctl|DBG|received request dpctl/ct-bkts["gt=0","netdev@ovs-netdev"], id=0 > 2017-07-23T02:28:02.346Z|00054|dpctl|INFO|set_names=0 verbosity=0 names=0 > 2017-07-23T02:28:02.346Z|00057|dpif|WARN|could not create datapath gt=0 of unknown type system > 2017-07-23T02:28:02.347Z|00058|unixctl|DBG|replying with error, id=0: "ovs-vswitchd: opening datapath (Address family not supported by protocol) But, your command requires a maximum of 2 parameters and if there are 2, the datapath name must be first and ‘gt=x’ second Hence, I think you can just remove the while loop completely since ‘gt=x’ must always be last, if present. ////////////////////////////// + + name = (argc > 1) ? xstrdup(argv[1]) : 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 = ct_dpif_dump_start(dpif, &dump, pzone, &tot_bkts); + if (error) { + dpctl_error(dpctl_p, error, "starting conntrack dump"); + dpif_close(dpif); + return error; + } + if (tot_bkts == -1) { + /* Command not available when called by kernel OvS. */ + dpctl_print(dpctl_p, + "Command is available for UserSpace ConnTracker only.\n"); + ct_dpif_dump_done(dump); [Darrell] dpctl_print(dpctl_p, "Command is available for UserSpace ConnTracker only.\n"); ct_dpif_dump_done(dump); + dpif_close(dpif); return 0; } ////////////////////////////// + return 0; + } + + dpctl_print(dpctl_p, "Total Buckets: %d\n", tot_bkts); + + int tot_conn = 0; + uint32_t conn_per_bkts[tot_bkts]; + memset(conn_per_bkts, 0, sizeof(uint32_t) * tot_bkts); + + while (!ct_dpif_dump_next(dump, &cte)) { + ct_dpif_entry_uninit(&cte); + tot_conn++; + if (tot_bkts > 0) { + if (cte.bkt < tot_bkts) { + conn_per_bkts[cte.bkt]++; + } else { + dpctl_print(dpctl_p, "Bucket nr out of range: %d >= %d\n", + cte.bkt, tot_bkts); + } + } + } + + dpctl_print(dpctl_p, "Current Connections: %d\n", tot_conn); + dpctl_print(dpctl_p, "\n"); + if (tot_bkts && tot_conn) { + dpctl_print(dpctl_p, "+-----------+" + "-----------------------------------------+\n"); + dpctl_print(dpctl_p, "| Buckets |" + " Connections per Buckets |\n"); + dpctl_print(dpctl_p, "+-----------+" + "-----------------------------------------+"); +#define NUM_BKTS_DIPLAYED_PER_ROW 8 + for (int i = 0; i < tot_bkts; i++) { + if (i % NUM_BKTS_DIPLAYED_PER_ROW == 0) { + dpctl_print(dpctl_p, "\n %3d..%3d | ", + i, i + NUM_BKTS_DIPLAYED_PER_ROW - 1); + } + if (conn_per_bkts[i] > gt) { + dpctl_print(dpctl_p, "%5d", conn_per_bkts[i]); + } else { + dpctl_print(dpctl_p, "%5s", "."); + } + } + dpctl_print(dpctl_p, "\n\n"); + } + + ct_dpif_dump_done(dump); + dpif_close(dpif); + return error; +} ? /* Undocumented commands for unit testing. */ @@ -1760,6 +1863,7 @@ static const struct dpctl_command all_commands[] = { { "flush-conntrack", "[dp] [zone=N]", 0, 2, dpctl_flush_conntrack, DP_RW }, { "ct-stats-show", "[dp] [zone=N] [verbose]", 0, 3, dpctl_ct_stats_show, DP_RO }, + { "ct-bkts", "[dp] [gt=N]", 0, 2, dpctl_ct_bkts, DP_RO }, { "help", "", 0, INT_MAX, dpctl_help, DP_RO }, { "list-commands", "", 0, INT_MAX, dpctl_list_commands, DP_RO }, diff --git a/lib/dpctl.man b/lib/dpctl.man index f95d54a..077fd99 100644 --- a/lib/dpctl.man +++ b/lib/dpctl.man @@ -228,3 +228,11 @@ Displays the number of connections grouped by protocol used by \fIdp\fR. If \fBzone=\fIzone\fR is specified, numbers refer to the connections in \fBzone\fR. The \fBverbose\fR option allows to group by connection state for each protocol. +. +.TP +\*(DX\fBct\-bkts\fR [\fIdp\fR] [\fBgt=\fIThreshold\fR] +For each ConnTracker bucket, displays the number of connections used +by \fIdp\fR. +If \fBgt=\fIThreshold\fR is specified, bucket numbers are displayed when +the number of connections in a bucket is greater than \fIThreshold\fR. + diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 47a9fa0..10435e7 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -5333,7 +5333,7 @@ struct dp_netdev_ct_dump { static int dpif_netdev_ct_dump_start(struct dpif *dpif, struct ct_dpif_dump_state **dump_, - const uint16_t *pzone) + const uint16_t *pzone, int *ptot_bkts) { struct dp_netdev *dp = get_dp_netdev(dpif); struct dp_netdev_ct_dump *dump; @@ -5342,7 +5342,7 @@ dpif_netdev_ct_dump_start(struct dpif *dpif, struct ct_dpif_dump_state **dump_, dump->dp = dp; dump->ct = &dp->conntrack; - conntrack_dump_start(&dp->conntrack, &dump->dump, pzone); + conntrack_dump_start(&dp->conntrack, &dump->dump, pzone, ptot_bkts); *dump_ = &dump->up; diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 55effd1..b87bb16 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -2847,13 +2847,13 @@ struct dpif_netlink_ct_dump_state { static int dpif_netlink_ct_dump_start(struct dpif *dpif OVS_UNUSED, struct ct_dpif_dump_state **dump_, - const uint16_t *zone) + const uint16_t *zone, int *ptot_bkts) { struct dpif_netlink_ct_dump_state *dump; int err; dump = xzalloc(sizeof *dump); - err = nl_ct_dump_start(&dump->nl_ct_dump, zone); + err = nl_ct_dump_start(&dump->nl_ct_dump, zone, ptot_bkts); if (err) { free(dump); return err; diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 64ac2e2..1d82a09 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -419,7 +419,7 @@ struct dpif_class { * ct_dump_done() should perform any cleanup necessary (including * deallocating the 'state' structure, if applicable). */ int (*ct_dump_start)(struct dpif *, struct ct_dpif_dump_state **state, - const uint16_t *zone); + const uint16_t *zone, int *); int (*ct_dump_next)(struct dpif *, struct ct_dpif_dump_state *state, struct ct_dpif_entry *entry); int (*ct_dump_done)(struct dpif *, struct ct_dpif_dump_state *state); diff --git a/lib/netlink-conntrack.c b/lib/netlink-conntrack.c index f0e2aea..ac48b15 100644 --- a/lib/netlink-conntrack.c? +++ b/lib/netlink-conntrack.c @@ -123,7 +123,8 @@ struct nl_ct_dump_state { /* Initialize a conntrack netlink dump. */ int -nl_ct_dump_start(struct nl_ct_dump_state **statep, const uint16_t *zone) +nl_ct_dump_start(struct nl_ct_dump_state **statep, const uint16_t *zone, + int *ptot_bkts) { struct nl_ct_dump_state *state; @@ -140,6 +141,9 @@ nl_ct_dump_start(struct nl_ct_dump_state **statep, const uint16_t *zone) nl_dump_start(&state->dump, NETLINK_NETFILTER, &state->buf); ofpbuf_clear(&state->buf); + /* Buckets to store connections are not used. */ + *ptot_bkts = -1; + [Darrell] I tested this and looks good. return 0; } diff --git a/lib/netlink-conntrack.h b/lib/netlink-conntrack.h index 1263b21..a95aa69 100644 --- a/lib/netlink-conntrack.h +++ b/lib/netlink-conntrack.h @@ -35,7 +35,8 @@ enum nl_ct_event_type { struct nl_ct_dump_state; -int nl_ct_dump_start(struct nl_ct_dump_state **, const uint16_t *zone); +int nl_ct_dump_start(struct nl_ct_dump_state **, const uint16_t *zone, + int *ptot_bkts); int nl_ct_dump_next(struct nl_ct_dump_state *, struct ct_dpif_entry *); int nl_ct_dump_done(struct nl_ct_dump_state *); diff --git a/tests/test-netlink-conntrack.c b/tests/test-netlink-conntrack.c index 000062d..0d9dace 100644 --- a/tests/test-netlink-conntrack.c +++ b/tests/test-netlink-conntrack.c @@ -106,6 +106,7 @@ test_nl_ct_dump(struct ovs_cmdl_context *ctx) uint16_t zone, *pzone = NULL; struct ct_dpif_entry entry; int err; + int tot_bkts; if (ctx->argc >= 2) { if (!ovs_scan(ctx->argv[1], "zone=%"SCNu16, &zone)) { @@ -113,7 +114,7 @@ test_nl_ct_dump(struct ovs_cmdl_context *ctx) } pzone = &zone; } - err = nl_ct_dump_start(&dump, pzone); + err = nl_ct_dump_start(&dump, pzone, &tot_bkts); if (err) { ovs_fatal(err, "Error creating conntrack netlink dump"); } diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 7292fca..7b005ac 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -202,6 +202,7 @@ usage(void *userdata OVS_UNUSED) "delete all conntrack entries in ZONE\n" " ct-stats-show [DP] [zone=ZONE] [verbose] " \ "CT connections grouped by protocol\n" + " ct-bkts [DP] [gt=N] display connections per CT bucket\n" "Each IFACE on add-dp, add-if, and set-if may be followed by\n" "comma-separated options. See ovs-dpctl(8) for syntax, or the\n" "Interface table in ovs-vswitchd.conf.db(5) for an options list.\n" -- 2.4.11 _______________________________________________ dev mailing list dev@openvswitch.org https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openvswitch.org_mailman_listinfo_ovs-2Ddev&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=DzNptgj_q8j7ukiP3_wi0zYxZ4WDkZkhE1w1OSsoeD0&s=wOJItkDVJYq7hVfEWV_b7k3n8wFSLxdVYOIT2toHc40&e= diff --git a/lib/dpctl.c b/lib/dpctl.c index cb791ca..5f3801c 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -1480,17 +1480,11 @@ dpctl_ct_bkts(int argc, const char *argv[], uint16_t gt = 0; /* Threshold: display value when greater than gt. */ uint16_t *pzone = NULL; int tot_bkts = 0; - int lastargc = 0; - int error; - while (argc > 1 && lastargc != argc) { - lastargc = argc; - if (!strncmp(argv[argc - 1], CT_BKTS_GT, strlen(CT_BKTS_GT))) { - if (ovs_scan(argv[argc - 1], CT_BKTS_GT"%"SCNu16, >)) { - argc--; - break; - } + if (argc > 1 && !strncmp(argv[argc - 1], CT_BKTS_GT, strlen(CT_BKTS_GT))) { + if (ovs_scan(argv[argc - 1], CT_BKTS_GT"%"SCNu16, >)) { + argc--; } }