netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Aya Levin <ayal@mellanox.com>
To: David Ahern <dsahern@gmail.com>,
	netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
	Jiri Pirko <jiri@mellanox.com>
Cc: Moshe Shemesh <moshe@mellanox.com>, Aya Levin <ayal@mellanox.com>,
	Eran Ben Elisha <eranbe@mellanox.com>,
	Tal Alon <talal@mellanox.com>, Ariel Almog <ariela@mellanox.com>
Subject: [PATCH for-next 1/4] devlink: refactor validation of finding required arguments
Date: Sun, 10 Feb 2019 20:28:46 +0200	[thread overview]
Message-ID: <1549823329-10377-2-git-send-email-ayal@mellanox.com> (raw)
In-Reply-To: <1549823329-10377-1-git-send-email-ayal@mellanox.com>

Introducing argument's metadata structure matching a bitmap flag per
required argument and an error message if missing. Using this static
array to refactor validation of finding required arguments in devlink
command line and to ease further maintenance.

Signed-off-by: Aya Levin <ayal@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
---
 devlink/devlink.c | 155 +++++++++++++++++-------------------------------------
 1 file changed, 47 insertions(+), 108 deletions(-)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index d823512a4030..a05755385a49 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -39,6 +39,7 @@
 #define PARAM_CMODE_RUNTIME_STR "runtime"
 #define PARAM_CMODE_DRIVERINIT_STR "driverinit"
 #define PARAM_CMODE_PERMANENT_STR "permanent"
+#define DL_ARGS_REQUIRED_MAX_ERR_LEN 80
 
 static int g_new_line_count;
 
@@ -950,6 +951,51 @@ static int param_cmode_get(const char *cmodestr,
 	return 0;
 }
 
+struct dl_args_metadata {
+	uint32_t o_flag;
+	char err_msg[DL_ARGS_REQUIRED_MAX_ERR_LEN];
+};
+
+static const struct dl_args_metadata dl_args_required[] = {
+	{DL_OPT_PORT_TYPE,	      "Port type not set.\n"},
+	{DL_OPT_PORT_COUNT,	      "Port split count option expected.\n"},
+	{DL_OPT_SB_POOL,	      "Pool index option expected.\n"},
+	{DL_OPT_SB_SIZE,	      "Pool size option expected.\n"},
+	{DL_OPT_SB_TYPE,	      "Pool type option expected.\n"},
+	{DL_OPT_SB_THTYPE,	      "Pool threshold type option expected.\n"},
+	{DL_OPT_SB_TH,		      "Threshold option expected.\n"},
+	{DL_OPT_SB_TC,		      "TC index option expected.\n"},
+	{DL_OPT_ESWITCH_MODE,	      "E-Switch mode option expected.\n"},
+	{DL_OPT_ESWITCH_INLINE_MODE,  "E-Switch inline-mode option expected.\n"},
+	{DL_OPT_DPIPE_TABLE_NAME,     "Dpipe table name expected\n"},
+	{DL_OPT_DPIPE_TABLE_COUNTERS, "Dpipe table counter state expected\n"},
+	{DL_OPT_ESWITCH_ENCAP_MODE,   "E-Switch encapsulation option expected.\n"},
+	{DL_OPT_PARAM_NAME,	      "Parameter name expected.\n"},
+	{DL_OPT_PARAM_VALUE,	      "Value to set expected.\n"},
+	{DL_OPT_PARAM_CMODE,	      "Configuration mode expected.\n"},
+	{DL_OPT_REGION_SNAPSHOT_ID,   "Region snapshot id expected.\n"},
+	{DL_OPT_REGION_ADDRESS,	      "Region address value expected.\n"},
+	{DL_OPT_REGION_LENGTH,	      "Region length value expected.\n"},
+};
+
+static int validate_finding_required_dl_args(uint32_t o_required,
+					     uint32_t o_found)
+{
+	uint32_t dl_args_required_size;
+	uint32_t o_flag;
+	int i;
+
+	dl_args_required_size = ARRAY_SIZE(dl_args_required);
+	for (i = 0; i < dl_args_required_size; i++) {
+		o_flag = dl_args_required[i].o_flag;
+		if ((o_required & o_flag) && !(o_found & o_flag)) {
+			pr_err("%s", dl_args_required[i].err_msg);
+			return -EINVAL;
+		}
+	}
+	return 0;
+}
+
 static int dl_argv_parse(struct dl *dl, uint32_t o_required,
 			 uint32_t o_optional)
 {
@@ -1198,114 +1244,7 @@ static int dl_argv_parse(struct dl *dl, uint32_t o_required,
 		opts->present |= DL_OPT_SB;
 	}
 
-	if ((o_required & DL_OPT_PORT_TYPE) && !(o_found & DL_OPT_PORT_TYPE)) {
-		pr_err("Port type option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_PORT_COUNT) &&
-	    !(o_found & DL_OPT_PORT_COUNT)) {
-		pr_err("Port split count option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_SB_POOL) && !(o_found & DL_OPT_SB_POOL)) {
-		pr_err("Pool index option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_SB_SIZE) && !(o_found & DL_OPT_SB_SIZE)) {
-		pr_err("Pool size option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_SB_TYPE) && !(o_found & DL_OPT_SB_TYPE)) {
-		pr_err("Pool type option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_SB_THTYPE) && !(o_found & DL_OPT_SB_THTYPE)) {
-		pr_err("Pool threshold type option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_SB_TH) && !(o_found & DL_OPT_SB_TH)) {
-		pr_err("Threshold option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_SB_TC) && !(o_found & DL_OPT_SB_TC)) {
-		pr_err("TC index option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_ESWITCH_MODE) &&
-	    !(o_found & DL_OPT_ESWITCH_MODE)) {
-		pr_err("E-Switch mode option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_ESWITCH_INLINE_MODE) &&
-	    !(o_found & DL_OPT_ESWITCH_INLINE_MODE)) {
-		pr_err("E-Switch inline-mode option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_DPIPE_TABLE_NAME) &&
-	    !(o_found & DL_OPT_DPIPE_TABLE_NAME)) {
-		pr_err("Dpipe table name expected\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_DPIPE_TABLE_COUNTERS) &&
-	    !(o_found & DL_OPT_DPIPE_TABLE_COUNTERS)) {
-		pr_err("Dpipe table counter state expected\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_ESWITCH_ENCAP_MODE) &&
-	    !(o_found & DL_OPT_ESWITCH_ENCAP_MODE)) {
-		pr_err("E-Switch encapsulation option expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_PARAM_NAME) &&
-	    !(o_found & DL_OPT_PARAM_NAME)) {
-		pr_err("Parameter name expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_PARAM_VALUE) &&
-	    !(o_found & DL_OPT_PARAM_VALUE)) {
-		pr_err("Value to set expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_PARAM_CMODE) &&
-	    !(o_found & DL_OPT_PARAM_CMODE)) {
-		pr_err("Configuration mode expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_REGION_SNAPSHOT_ID) &&
-	    !(o_found & DL_OPT_REGION_SNAPSHOT_ID)) {
-		pr_err("Region snapshot id expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_REGION_ADDRESS) &&
-	    !(o_found & DL_OPT_REGION_ADDRESS)) {
-		pr_err("Region address value expected.\n");
-		return -EINVAL;
-	}
-
-	if ((o_required & DL_OPT_REGION_LENGTH) &&
-	    !(o_found & DL_OPT_REGION_LENGTH)) {
-		pr_err("Region length value expected.\n");
-		return -EINVAL;
-	}
-
-	return 0;
+	return validate_finding_required_dl_args(o_required, o_found);
 }
 
 static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
-- 
2.14.1


  reply	other threads:[~2019-02-10 18:29 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-07  9:36 [PATCH v4 net-next 00/11] Devlink health reporting and recovery system Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 01/11] devlink: Add devlink formatted message (fmsg) API Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 02/11] devlink: Add health reporter create/destroy functionality Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 03/11] devlink: Add health report functionality Eran Ben Elisha
2019-02-07  9:38   ` Jiri Pirko
2019-02-07  9:36 ` [PATCH v4 net-next 04/11] devlink: Add health get command Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 05/11] devlink: Add health set command Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 06/11] devlink: Add health recover command Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 07/11] devlink: Add health diagnose command Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 08/11] devlink: Add health dump {get,clear} commands Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 09/11] net/mlx5e: Add tx reporter support Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 10/11] net/mlx5e: Add tx timeout support for mlx5e tx reporter Eran Ben Elisha
2019-02-07  9:36 ` [PATCH v4 net-next 11/11] devlink: Add Documentation/networking/devlink-health.txt Eran Ben Elisha
2019-02-07 18:37 ` [PATCH v4 net-next 00/11] Devlink health reporting and recovery system David Miller
2019-02-10 18:28 ` [iproute2-next, 0/4] Add support for devlink health Aya Levin
2019-02-10 18:28   ` Aya Levin [this message]
2019-02-11  2:46     ` [PATCH for-next 1/4] devlink: refactor validation of finding required arguments David Ahern
2019-02-11 10:29     ` Jiri Pirko
2019-02-10 18:28   ` [PATCH for-next 2/4] devlink: fix print of uint64_t Aya Levin
2019-02-10 20:34     ` Stephen Hemminger
2019-02-11  2:44       ` David Ahern
2019-02-11 10:32     ` Jiri Pirko
2019-02-10 18:28   ` [PATCH for-next 3/4] devlink: fix boolean JSON print Aya Levin
2019-02-10 20:34     ` Stephen Hemminger
2019-02-10 18:28   ` [PATCH for-next 4/4] devlink: add health command support Aya Levin
2019-02-10 20:42     ` Stephen Hemminger
2019-02-11 10:41     ` Jiri Pirko
2019-02-10 18:35 ` [iproute2-next, 0/4] Add support for devlink health Aya Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1549823329-10377-2-git-send-email-ayal@mellanox.com \
    --to=ayal@mellanox.com \
    --cc=ariela@mellanox.com \
    --cc=davem@davemloft.net \
    --cc=dsahern@gmail.com \
    --cc=eranbe@mellanox.com \
    --cc=jiri@mellanox.com \
    --cc=moshe@mellanox.com \
    --cc=netdev@vger.kernel.org \
    --cc=talal@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).