diff mbox series

[for-next,1/4] devlink: refactor validation of finding required arguments

Message ID 1549823329-10377-2-git-send-email-ayal@mellanox.com
State Changes Requested
Delegated to: David Ahern
Headers show
Series Add support for devlink health | expand

Commit Message

Aya Levin Feb. 10, 2019, 6:28 p.m. UTC
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(-)

Comments

David Ahern Feb. 11, 2019, 2:46 a.m. UTC | #1
On 2/10/19 11:28 AM, Aya Levin wrote:
> @@ -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;
> +}
> +

much better. Thank you for refactoring this.
Jiri Pirko Feb. 11, 2019, 10:29 a.m. UTC | #2
Sun, Feb 10, 2019 at 07:28:46PM CET, ayal@mellanox.com wrote:
>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"},

Remove the "\n" from there and put it to the pr_err() call.


>+};
>+
>+static int validate_finding_required_dl_args(uint32_t o_required,

Please maintain the current naming scheme of functions. This should be
named something like:
dl_args_finding_required_validate()


>+					     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;
>+}
>+

[...]
diff mbox series

Patch

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)