Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/818629/?format=api
{ "id": 818629, "url": "http://patchwork.ozlabs.org/api/patches/818629/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/1506429324-10416-3-git-send-email-antonio.fischetti@intel.com/", "project": { "id": 47, "url": "http://patchwork.ozlabs.org/api/projects/47/?format=api", "name": "Open vSwitch", "link_name": "openvswitch", "list_id": "ovs-dev.openvswitch.org", "list_email": "ovs-dev@openvswitch.org", "web_url": "http://openvswitch.org/", "scm_url": "git@github.com:openvswitch/ovs.git", "webscm_url": "https://github.com/openvswitch/ovs", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1506429324-10416-3-git-send-email-antonio.fischetti@intel.com>", "list_archive_url": null, "date": "2017-09-26T12:35:22", "name": "[ovs-dev,v2,2/4] conntrack: add commands to r/w CT parameters.", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "ac38ea2f2f8938929fb71db15fd02c16701c80d1", "submitter": { "id": 68178, "url": "http://patchwork.ozlabs.org/api/people/68178/?format=api", "name": "Fischetti, Antonio", "email": "antonio.fischetti@intel.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/1506429324-10416-3-git-send-email-antonio.fischetti@intel.com/mbox/", "series": [ { "id": 5130, "url": "http://patchwork.ozlabs.org/api/series/5130/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=5130", "date": "2017-09-26T12:35:20", "name": "Conntrack: add commands to r/w CT parameters.", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/5130/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/818629/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/818629/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<ovs-dev-bounces@openvswitch.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "dev@openvswitch.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "ovs-dev@mail.linuxfoundation.org" ], "Authentication-Results": "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=openvswitch.org\n\t(client-ip=140.211.169.12; helo=mail.linuxfoundation.org;\n\tenvelope-from=ovs-dev-bounces@openvswitch.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from mail.linuxfoundation.org (mail.linuxfoundation.org\n\t[140.211.169.12])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3y1gT70KWyz9s83\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 26 Sep 2017 22:37:31 +1000 (AEST)", "from mail.linux-foundation.org (localhost [127.0.0.1])\n\tby mail.linuxfoundation.org (Postfix) with ESMTP id F0491BC2;\n\tTue, 26 Sep 2017 12:35:37 +0000 (UTC)", "from smtp1.linuxfoundation.org (smtp1.linux-foundation.org\n\t[172.17.192.35])\n\tby mail.linuxfoundation.org (Postfix) with ESMTPS id 900D7B37\n\tfor <dev@openvswitch.org>; Tue, 26 Sep 2017 12:35:33 +0000 (UTC)", "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby smtp1.linuxfoundation.org (Postfix) with ESMTPS id DD621452\n\tfor <dev@openvswitch.org>; Tue, 26 Sep 2017 12:35:32 +0000 (UTC)", "from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t26 Sep 2017 05:35:29 -0700", "from sivswdev01.ir.intel.com (HELO localhost.localdomain)\n\t([10.237.217.45])\n\tby fmsmga001.fm.intel.com with ESMTP; 26 Sep 2017 05:35:27 -0700" ], "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6", "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos; i=\"5.42,440,1500966000\"; d=\"scan'208\";\n\ta=\"1199143987\"", "From": "antonio.fischetti@intel.com", "To": "dev@openvswitch.org", "Date": "Tue, 26 Sep 2017 13:35:22 +0100", "Message-Id": "<1506429324-10416-3-git-send-email-antonio.fischetti@intel.com>", "X-Mailer": "git-send-email 1.7.0.7", "In-Reply-To": "<1506429324-10416-1-git-send-email-antonio.fischetti@intel.com>", "References": "<1506429324-10416-1-git-send-email-antonio.fischetti@intel.com>", "X-Spam-Status": "No, score=-5.0 required=5.0 tests=RCVD_IN_DNSWL_HI,\n\tRP_MATCHES_RCVD autolearn=disabled version=3.3.1", "X-Spam-Checker-Version": "SpamAssassin 3.3.1 (2010-03-16) on\n\tsmtp1.linux-foundation.org", "Subject": "[ovs-dev] [PATCH v2 2/4] conntrack: add commands to r/w CT\n\tparameters.", "X-BeenThere": "ovs-dev@openvswitch.org", "X-Mailman-Version": "2.1.12", "Precedence": "list", "List-Id": "<ovs-dev.openvswitch.org>", "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n\t<mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>", "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>", "List-Post": "<mailto:ovs-dev@openvswitch.org>", "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>", "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n\t<mailto:ovs-dev-request@openvswitch.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Sender": "ovs-dev-bounces@openvswitch.org", "Errors-To": "ovs-dev-bounces@openvswitch.org" }, "content": "Add infrastructure to implement:\n - dpctl/ct-get-glbl-cfg to read a current value of available\n conntrack parameters.\n - dpctl/ct-set-glbl-cfg to set a value to the available conntrack\n parameters.\n\nCC: Kevin Traynor <ktraynor@redhat.com>\nSigned-off-by: Antonio Fischetti <antonio.fischetti@intel.com>\n---\n lib/conntrack.c | 60 ++++++++++++++++++++++++++++++++++++++++++\n lib/conntrack.h | 3 +++\n lib/ct-dpif.c | 28 ++++++++++++++++++++\n lib/ct-dpif.h | 2 ++\n lib/dpctl.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++\n lib/dpif-netdev.c | 19 ++++++++++++++\n lib/dpif-netlink.c | 2 ++\n lib/dpif-provider.h | 4 +++\n 8 files changed, 194 insertions(+)", "diff": "diff --git a/lib/conntrack.c b/lib/conntrack.c\nindex 419cb1d..391d008 100644\n--- a/lib/conntrack.c\n+++ b/lib/conntrack.c\n@@ -67,6 +67,13 @@ enum ct_alg_mode {\n CT_TFTP_MODE,\n };\n \n+/* Variable to manage read/write on CT parameters. */\n+struct ct_cfg_params {\n+ char *cli; /* Parameter name in human format. */\n+ int (*wr)(struct conntrack *, uint32_t);\n+ int (*rd)(struct conntrack *, uint32_t *);\n+};\n+\n static bool conn_key_extract(struct conntrack *, struct dp_packet *,\n ovs_be16 dl_type, struct conn_lookup_ctx *,\n uint16_t zone);\n@@ -2391,6 +2398,59 @@ conntrack_flush(struct conntrack *ct, const uint16_t *zone)\n return 0;\n }\n \n+/* List of parameters that can be read/written at run-time. */\n+struct ct_cfg_params cfg_params[] = {};\n+\n+int\n+conntrack_set_param(struct conntrack *ct,\n+ const char *set_param)\n+{\n+ uint32_t max_conn;\n+ char buf[16] = \"\";\n+\n+ /* Check if the specified param can be managed. */\n+ for (int i = 0; i < sizeof(cfg_params) / sizeof(struct ct_cfg_params);\n+ i++) {\n+ if (!strncmp(set_param, cfg_params[i].cli,\n+ strlen(cfg_params[i].cli))) {\n+ ovs_strzcpy(buf, cfg_params[i].cli, sizeof(buf) - 1);\n+ strncat(buf, \"=%\"SCNu32, sizeof(buf) - 1 - strlen(buf));\n+ if (ovs_scan(set_param, buf, &max_conn)) {\n+ return (cfg_params[i].wr\n+ ? cfg_params[i].wr(ct, max_conn)\n+ : EOPNOTSUPP);\n+ } else {\n+ return EINVAL;\n+ }\n+ }\n+ }\n+ /* The entered param didn't match any in the list. */\n+ VLOG_WARN(\"%s parameter is not managed by this command.\", set_param);\n+\n+ return EINVAL;\n+}\n+\n+int\n+conntrack_get_param(struct conntrack *ct,\n+ const char *get_param, uint32_t *val)\n+{\n+ /* Check if the specified param can be managed. */\n+ for (int i = 0; i < sizeof(cfg_params) / sizeof(struct ct_cfg_params);\n+ i++) {\n+ if (!strncmp(get_param, cfg_params[i].cli,\n+ strlen(cfg_params[i].cli))) {\n+\n+ return (cfg_params[i].rd\n+ ? cfg_params[i].rd(ct, val)\n+ : EOPNOTSUPP);\n+ }\n+ }\n+ /* The entered param didn't match any in the list. */\n+ VLOG_WARN(\"%s parameter is not managed by this command.\", get_param);\n+\n+ return EINVAL;\n+}\n+\n /* This function must be called with the ct->resources read lock taken. */\n static struct alg_exp_node *\n expectation_lookup(struct hmap *alg_expectations,\ndiff --git a/lib/conntrack.h b/lib/conntrack.h\nindex fbeef1c..4eb9a9a 100644\n--- a/lib/conntrack.h\n+++ b/lib/conntrack.h\n@@ -114,6 +114,9 @@ int conntrack_dump_next(struct conntrack_dump *, struct ct_dpif_entry *);\n int conntrack_dump_done(struct conntrack_dump *);\n \n int conntrack_flush(struct conntrack *, const uint16_t *zone);\n+int conntrack_set_param(struct conntrack *, const char *set_param);\n+int conntrack_get_param(struct conntrack *, const char *get_param,\n+ uint32_t *val);\n \f\n /* 'struct ct_lock' is a wrapper for an adaptive mutex. It's useful to try\n * different types of locks (e.g. spinlocks) */\ndiff --git a/lib/ct-dpif.c b/lib/ct-dpif.c\nindex c79e69e..599bc57 100644\n--- a/lib/ct-dpif.c\n+++ b/lib/ct-dpif.c\n@@ -127,6 +127,34 @@ ct_dpif_flush(struct dpif *dpif, const uint16_t *zone)\n : EOPNOTSUPP);\n }\n \n+int\n+ct_dpif_set_param(struct dpif *dpif, const char *set_param)\n+{\n+ if (!set_param) {\n+ VLOG_DBG(\"%s: ct_set_param: no input param\", dpif_name(dpif));\n+ return EINVAL;\n+ }\n+ VLOG_DBG(\"%s: ct_set_param: %s\", dpif_name(dpif), set_param);\n+\n+ return (dpif->dpif_class->ct_set_param\n+ ? dpif->dpif_class->ct_set_param(dpif, set_param)\n+ : EOPNOTSUPP);\n+}\n+\n+int\n+ct_dpif_get_param(struct dpif *dpif, const char *get_param, uint32_t *val)\n+{\n+ if (!get_param) {\n+ VLOG_DBG(\"%s: ct_get_param: no input param\", dpif_name(dpif));\n+ return EINVAL;\n+ }\n+ VLOG_DBG(\"%s: ct_get_param: %s\", dpif_name(dpif), get_param);\n+\n+ return (dpif->dpif_class->ct_get_param\n+ ? dpif->dpif_class->ct_get_param(dpif, get_param, val)\n+ : EOPNOTSUPP);\n+}\n+\n void\n ct_dpif_entry_uninit(struct ct_dpif_entry *entry)\n {\ndiff --git a/lib/ct-dpif.h b/lib/ct-dpif.h\nindex d5f9661..92ce3e9 100644\n--- a/lib/ct-dpif.h\n+++ b/lib/ct-dpif.h\n@@ -196,6 +196,8 @@ int ct_dpif_dump_start(struct dpif *, struct ct_dpif_dump_state **,\n int ct_dpif_dump_next(struct ct_dpif_dump_state *, struct ct_dpif_entry *);\n int ct_dpif_dump_done(struct ct_dpif_dump_state *);\n int ct_dpif_flush(struct dpif *, const uint16_t *zone);\n+int ct_dpif_set_param(struct dpif *dpif, const char *set_param);\n+int ct_dpif_get_param(struct dpif *dpif, const char *get_param, uint32_t *val);\n void ct_dpif_entry_uninit(struct ct_dpif_entry *);\n void ct_dpif_format_entry(const struct ct_dpif_entry *, struct ds *,\n bool verbose, bool print_stats);\ndiff --git a/lib/dpctl.c b/lib/dpctl.c\nindex b6eecf0..5b02951 100644\n--- a/lib/dpctl.c\n+++ b/lib/dpctl.c\n@@ -1589,6 +1589,80 @@ dpctl_ct_bkts(int argc, const char *argv[],\n free(conn_per_bkts);\n return error;\n }\n+\n+static int\n+dpctl_ct_set_param(int argc, const char *argv[],\n+ struct dpctl_params *dpctl_p)\n+{\n+ struct dpif *dpif;\n+ char *name;\n+ int error;\n+\n+ /* The datapath name is not a mandatory parameter for this command.\n+ * If it is not specified - so argc < 3 - we retrieve it from the\n+ * current setup, assuming only one exists. */\n+ name = argc == 3 ? xstrdup(argv[1]) : get_one_dp(dpctl_p);\n+ if (!name) {\n+ return EINVAL;\n+ }\n+ error = parsed_dpif_open(name, false, &dpif);\n+ free(name);\n+ if (error) {\n+ dpctl_error(dpctl_p, error, \"opening datapath\");\n+ return error;\n+ }\n+\n+ error = ct_dpif_set_param(dpif, argv[argc - 1]);\n+\n+ if (!error) {\n+ dpctl_print(dpctl_p, \"Ok\");\n+ } else {\n+ dpctl_print(dpctl_p, \"CT set global cfg failed (%s)\",\n+ ovs_strerror(error));\n+ }\n+\n+ dpif_close(dpif);\n+\n+ return error;\n+}\n+\n+static int\n+dpctl_ct_get_param(int argc, const char *argv[],\n+ struct dpctl_params *dpctl_p)\n+{\n+ struct dpif *dpif;\n+ uint32_t param_val;\n+ char *name;\n+ int error;\n+\n+ /* The datapath name is not a mandatory parameter for this command.\n+ * If it is not specified - so argc < 3 - we retrieve it from the\n+ * current setup, assuming only one exists. */\n+ name = argc == 3 ? xstrdup(argv[1]) : get_one_dp(dpctl_p);\n+ if (!name) {\n+ return EINVAL;\n+ }\n+ error = parsed_dpif_open(name, false, &dpif);\n+ free(name);\n+ if (error) {\n+ dpctl_error(dpctl_p, error, \"opening datapath\");\n+ return error;\n+ }\n+\n+ error = ct_dpif_get_param(dpif, argv[argc - 1], ¶m_val);\n+\n+ if (!error) {\n+ dpctl_print(dpctl_p, \"Current value: %d\", param_val);\n+ } else {\n+ dpctl_print(dpctl_p, \"CT get global cfg failed (%s)\",\n+ ovs_strerror(error));\n+ }\n+\n+ dpif_close(dpif);\n+\n+ return error;\n+}\n+\n \f\n /* Undocumented commands for unit testing. */\n \n@@ -1885,6 +1959,8 @@ static const struct dpctl_command all_commands[] = {\n { \"ct-stats-show\", \"[dp] [zone=N] [verbose]\",\n 0, 3, dpctl_ct_stats_show, DP_RO },\n { \"ct-bkts\", \"[dp] [gt=N]\", 0, 2, dpctl_ct_bkts, DP_RO },\n+ { \"ct-set-glbl-cfg\", \"[dp] param=..\", 1, 2, dpctl_ct_set_param, DP_RW },\n+ { \"ct-get-glbl-cfg\", \"[dp] param\", 1, 2, dpctl_ct_get_param, DP_RO },\n { \"help\", \"\", 0, INT_MAX, dpctl_help, DP_RO },\n { \"list-commands\", \"\", 0, INT_MAX, dpctl_list_commands, DP_RO },\n \ndiff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c\nindex ca74df8..8fda2a9 100644\n--- a/lib/dpif-netdev.c\n+++ b/lib/dpif-netdev.c\n@@ -5689,6 +5689,23 @@ dpif_netdev_ct_flush(struct dpif *dpif, const uint16_t *zone)\n return conntrack_flush(&dp->conntrack, zone);\n }\n \n+static int\n+dpif_netdev_ct_set_param(struct dpif *dpif, const char *set_param)\n+{\n+ struct dp_netdev *dp = get_dp_netdev(dpif);\n+\n+ return conntrack_set_param(&dp->conntrack, set_param);\n+}\n+\n+static int\n+dpif_netdev_ct_get_param(struct dpif *dpif, const char *get_param,\n+ uint32_t *val)\n+{\n+ struct dp_netdev *dp = get_dp_netdev(dpif);\n+\n+ return conntrack_get_param(&dp->conntrack, get_param, val);\n+}\n+\n const struct dpif_class dpif_netdev_class = {\n \"netdev\",\n dpif_netdev_init,\n@@ -5734,6 +5751,8 @@ const struct dpif_class dpif_netdev_class = {\n dpif_netdev_ct_dump_next,\n dpif_netdev_ct_dump_done,\n dpif_netdev_ct_flush,\n+ dpif_netdev_ct_set_param,\n+ dpif_netdev_ct_get_param,\n dpif_netdev_meter_get_features,\n dpif_netdev_meter_set,\n dpif_netdev_meter_get,\ndiff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c\nindex 29001fb..0945fad 100644\n--- a/lib/dpif-netlink.c\n+++ b/lib/dpif-netlink.c\n@@ -2986,6 +2986,8 @@ const struct dpif_class dpif_netlink_class = {\n dpif_netlink_ct_dump_next,\n dpif_netlink_ct_dump_done,\n dpif_netlink_ct_flush,\n+ NULL, /* ct_set_param */\n+ NULL, /* ct_get_param */\n dpif_netlink_meter_get_features,\n dpif_netlink_meter_set,\n dpif_netlink_meter_get,\ndiff --git a/lib/dpif-provider.h b/lib/dpif-provider.h\nindex 1d82a09..262b2e0 100644\n--- a/lib/dpif-provider.h\n+++ b/lib/dpif-provider.h\n@@ -427,6 +427,10 @@ struct dpif_class {\n /* Flushes the connection tracking tables. If 'zone' is not NULL,\n * only deletes connections in '*zone'. */\n int (*ct_flush)(struct dpif *, const uint16_t *zone);\n+ /* Set a value to a connection tracking working parameter. */\n+ int (*ct_set_param)(struct dpif *, const char *set_param);\n+ /* Read the current value of a connection tracking working parameter. */\n+ int (*ct_get_param)(struct dpif *, const char *get_param, uint32_t *val);\n \n /* Meters */\n \n", "prefixes": [ "ovs-dev", "v2", "2/4" ] }