From patchwork Mon Dec 18 16:27:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Darrell Ball X-Patchwork-Id: 850165 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" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="k9kH1+4J"; 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 3z0mgq3JZgz9s03 for ; Tue, 19 Dec 2017 03:28:55 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id D553ACB5; Mon, 18 Dec 2017 16:27:40 +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 A73EDC9A for ; Mon, 18 Dec 2017 16:27:37 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 327E21A6 for ; Mon, 18 Dec 2017 16:27:37 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id p84so9883083pfd.3 for ; Mon, 18 Dec 2017 08:27:37 -0800 (PST) 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=RH2bQ5h20NLb4cEykp5B/QbmWhtBs1cEdUVAsRvCKjQ=; b=k9kH1+4Jh8JzViOOgph/RFLtA0GgabZ7R4n8vV5++fyEqsuLaVxz65bv5g2l9voFJ8 6ix/uS/aBWHw7WQF4drl93EgpN8QIsfqkzdJMfh6mZ+P4vCMd3NsF5wuKxBpliexbZw2 WyiGnjbOYlXELNbdsDM9ofvTtGPmyy6+jl2b9DqVRz1f9n94rH3p4M57lAgxWzuh91tY jrQw2PSh1b9QD6VS7IDSAp/4/uamjj4NPAPKUy7YqBh+9efsBvZokvb4NWeMS8tE2SDM 4t2U3vwKwNzF1VhWcmajs4dAPm7GrFiXqGf46z1kGrFpzYVxIaiwuHRODz7uX5DKx/rY P2fw== 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=RH2bQ5h20NLb4cEykp5B/QbmWhtBs1cEdUVAsRvCKjQ=; b=OYiDR/+HrqZHFHQo7jCSMMbp875CGQUfcUzhrPwU+Wz6sOsjIaE5LcJnOR23HS296k Jv7xNzchBKZZnUWIY4WmV9/6DI5phXr/36QXNJZFTKPNbjtqy95EfD+m3SwDZzxvKX9W fEJ+yaB2fnF3bbZT/0U8qj9gk+heUw7S4x7DXsACN8p5qRXtgPE56thew6ZdlnHeLqCj R7Iz9avchwNaWXvvKd9yxO4r26eM37hfkVbESU07qotXJRrAi5wlrufJvrqntYLdHFQP VJq0GJb9sRHC7n01cIjwUynMUApArJGnUyklgAySJR1CXlDbNLZR4qDPyFHfNjyZXUda Ybag== X-Gm-Message-State: AKGB3mLzepLVVB3eh3ESZPkhJAmbk7LPmOE4tHPQx1q0khGgghvEXxAs 2zBkDEIzg0BEI17CQyGrlY9lbg== X-Google-Smtp-Source: ACJfBosfKl/L+4oxl+hAQwK0w48ITi1WWyH2Pv2G/lwk/nq7FwuCjqCzIrQCwxfx8EH9MQBbhLsXzw== X-Received: by 10.98.89.4 with SMTP id n4mr249002pfb.133.1513614456582; Mon, 18 Dec 2017 08:27:36 -0800 (PST) Received: from localhost.localdomain (c-73-162-236-45.hsd1.ca.comcast.net. [73.162.236.45]) by smtp.gmail.com with ESMTPSA id 84sm27006938pfp.180.2017.12.18.08.27.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 18 Dec 2017 08:27:36 -0800 (PST) From: Darrell Ball To: dev@openvswitch.org Date: Mon, 18 Dec 2017 08:27:18 -0800 Message-Id: <1513614439-40419-3-git-send-email-dlu998@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1513614439-40419-1-git-send-email-dlu998@gmail.com> References: <1513614439-40419-1-git-send-email-dlu998@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [patch v1 2/3] dpctl conntrack: Add get number of connections 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: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org A get command is added for number of conntrack connections. This command is only supported in the userspace datapath at this time. Signed-off-by: Darrell Ball Signed-off-by: Antonio Fischetti Co-authored-by: Antonio Fischetti --- lib/conntrack.c | 7 +++++++ lib/conntrack.h | 1 + lib/ct-dpif.c | 8 ++++++++ lib/ct-dpif.h | 1 + lib/dpctl.c | 22 ++++++++++++++++++++++ lib/dpctl.man | 4 ++++ lib/dpif-netdev.c | 9 +++++++++ lib/dpif-netlink.c | 1 + lib/dpif-provider.h | 2 ++ 9 files changed, 55 insertions(+) diff --git a/lib/conntrack.c b/lib/conntrack.c index 4761fa0..9a47daa 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -2576,6 +2576,13 @@ conntrack_get_maxconns(struct conntrack *ct, uint32_t *maxconns) return 0; } +int +conntrack_get_nconns(struct conntrack *ct, uint32_t *nconns) +{ + *nconns = atomic_count_get(&ct->n_conn); + return 0; +} + /* This function must be called with the ct->resources read lock taken. */ static struct alg_exp_node * expectation_lookup(struct hmap *alg_expectations, diff --git a/lib/conntrack.h b/lib/conntrack.h index c7f9b77..e453170 100644 --- a/lib/conntrack.h +++ b/lib/conntrack.h @@ -116,6 +116,7 @@ int conntrack_dump_done(struct conntrack_dump *); int conntrack_flush(struct conntrack *, const uint16_t *zone); int conntrack_set_maxconns(struct conntrack *ct, uint32_t maxconns); int conntrack_get_maxconns(struct conntrack *ct, uint32_t *maxconns); +int conntrack_get_nconns(struct conntrack *ct, uint32_t *nconns); /* 'struct ct_lock' is a wrapper for an adaptive mutex. It's useful to try * different types of locks (e.g. spinlocks) */ diff --git a/lib/ct-dpif.c b/lib/ct-dpif.c index 21f900f..5fa3a97 100644 --- a/lib/ct-dpif.c +++ b/lib/ct-dpif.c @@ -156,6 +156,14 @@ ct_dpif_get_maxconns(struct dpif *dpif, uint32_t *maxconns) : EOPNOTSUPP); } +int +ct_dpif_get_nconns(struct dpif *dpif, uint32_t *nconns) +{ + return (dpif->dpif_class->ct_get_nconns + ? dpif->dpif_class->ct_get_nconns(dpif, nconns) + : EOPNOTSUPP); +} + void ct_dpif_entry_uninit(struct ct_dpif_entry *entry) { diff --git a/lib/ct-dpif.h b/lib/ct-dpif.h index 37001b4..09e7698 100644 --- a/lib/ct-dpif.h +++ b/lib/ct-dpif.h @@ -199,6 +199,7 @@ int ct_dpif_flush(struct dpif *, const uint16_t *zone, const struct ct_dpif_tuple *); int ct_dpif_set_maxconns(struct dpif *dpif, uint32_t maxconns); int ct_dpif_get_maxconns(struct dpif *dpif, uint32_t *maxconns); +int ct_dpif_get_nconns(struct dpif *dpif, uint32_t *nconns); void ct_dpif_entry_uninit(struct ct_dpif_entry *); void ct_dpif_format_entry(const struct ct_dpif_entry *, struct ds *, bool verbose, bool print_stats); diff --git a/lib/dpctl.c b/lib/dpctl.c index 9d90f15..5884ef2 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -1724,6 +1724,27 @@ dpctl_ct_get_maxconns(int argc, const char *argv[], return error; } +static int +dpctl_ct_get_nconns(int argc, const char *argv[], + struct dpctl_params *dpctl_p) +{ + struct dpif *dpif; + int error = dpctl_ct_open_dp(argc, argv, dpctl_p, &dpif, 2); + if (!error) { + uint32_t nconns; + error = ct_dpif_get_nconns(dpif, &nconns); + + if (!error) { + dpctl_print(dpctl_p, "%u\n", nconns); + } else { + dpctl_error(dpctl_p, error, "nconns could not be retrieved"); + } + dpif_close(dpif); + } + + return error; +} + /* Undocumented commands for unit testing. */ static int @@ -2022,6 +2043,7 @@ static const struct dpctl_command all_commands[] = { { "ct-bkts", "[dp] [gt=N]", 0, 2, dpctl_ct_bkts, DP_RO }, { "ct-set-maxconns", "[dp] maxconns", 1, 2, dpctl_ct_set_maxconns, DP_RW }, { "ct-get-maxconns", "[dp]", 0, 1, dpctl_ct_get_maxconns, DP_RO }, + { "ct-get-nconns", "[dp]", 0, 1, dpctl_ct_get_nconns, 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 bd55930..0ebe7d5 100644 --- a/lib/dpctl.man +++ b/lib/dpctl.man @@ -261,3 +261,7 @@ normally happens due to connection expiry. .TP \*(DX\fBct\-get\-maxconns\fR [\fIdp\fR] Read the maximum limit of connection tracker connections. +. +.TP +\*(DX\fBct\-get\-nconns\fR [\fIdp\fR] +Read the current number of connection tracker connections. diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index f14aa4a..e7fc11b 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -5755,6 +5755,14 @@ dpif_netdev_ct_get_maxconns(struct dpif *dpif, uint32_t *maxconns) return conntrack_get_maxconns(&dp->conntrack, maxconns); } +static int +dpif_netdev_ct_get_nconns(struct dpif *dpif, uint32_t *nconns) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + + return conntrack_get_nconns(&dp->conntrack, nconns); +} + const struct dpif_class dpif_netdev_class = { "netdev", dpif_netdev_init, @@ -5802,6 +5810,7 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_ct_flush, dpif_netdev_ct_set_maxconns, dpif_netdev_ct_get_maxconns, + dpif_netdev_ct_get_nconns, dpif_netdev_meter_get_features, dpif_netdev_meter_set, dpif_netdev_meter_get, diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index c080e66..f8d75eb 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -2991,6 +2991,7 @@ const struct dpif_class dpif_netlink_class = { dpif_netlink_ct_flush, NULL, /* ct_set_maxconns */ NULL, /* ct_get_maxconns */ + NULL, /* ct_get_nconns */ dpif_netlink_meter_get_features, dpif_netlink_meter_set, dpif_netlink_meter_get, diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 98f4115..62b3598 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -441,6 +441,8 @@ struct dpif_class { int (*ct_set_maxconns)(struct dpif *, uint32_t maxconns); /* Get max connections allowed. */ int (*ct_get_maxconns)(struct dpif *, uint32_t *maxconns); + /* Get number of connections tracked. */ + int (*ct_get_nconns)(struct dpif *, uint32_t *nconns); /* Meters */