All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions
@ 2020-01-23 10:32 Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value Ron Diskin
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

This patchset converts devlink prints (json and non-json) to use the
same common json library as the rest of iproute2.
Patches 1-2 add necessary functionality to json_print library.
Patch 3 removes the direct calls to json_writer. 
Patches 4-6 use the new functionality, replacing different pr_out_#type
wrapper.

Ron Diskin (6):
  json_print: Introduce print_#type_name_value
  json_print: Add new json object function not as array item
  devlink: Replace json prints by common library functions
  devlink: Replace pr_out_str wrapper function with common function
  devlink: Replace pr_#type_value wrapper functions with common
    functions
  devlink: Replace pr_out_bool/uint() wrappers with common print
    functions

 devlink/devlink.c    | 610 +++++++++++++++++++++----------------------
 include/json_print.h |   9 +
 lib/json_print.c     |  43 ++-
 3 files changed, 345 insertions(+), 317 deletions(-)

-- 
2.19.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value
  2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
@ 2020-01-23 10:32 ` Ron Diskin
  2020-01-27 13:52   ` Stephen Hemminger
  2020-01-23 10:32 ` [PATCH iproute2 2/6] json_print: Add new json object function not as array item Ron Diskin
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

Until now print_#type functions supported printing constant names and
unknown (variable) values only.
Add functions to allow printing when the name is also sent to the
function as a variable.

Signed-off-by: Ron Diskin <rondi@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
---
 include/json_print.h |  7 +++++++
 lib/json_print.c     | 13 +++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/include/json_print.h b/include/json_print.h
index 6695654f..fd76cf75 100644
--- a/include/json_print.h
+++ b/include/json_print.h
@@ -72,4 +72,11 @@ _PRINT_FUNC(lluint, unsigned long long)
 _PRINT_FUNC(float, double)
 #undef _PRINT_FUNC
 
+#define _PRINT_NAME_VALUE_FUNC(type_name, type, format_char)		  \
+	void print_##type_name##_name_value(const char *name, type value); \
+
+_PRINT_NAME_VALUE_FUNC(uint, unsigned int, u)
+_PRINT_NAME_VALUE_FUNC(string, const char*, s)
+#undef _PRINT_NAME_VALUE_FUNC
+
 #endif /* _JSON_PRINT_H_ */
diff --git a/lib/json_print.c b/lib/json_print.c
index 43ea69bb..fb5f0e5d 100644
--- a/lib/json_print.c
+++ b/lib/json_print.c
@@ -127,6 +127,19 @@ _PRINT_FUNC(lluint, unsigned long long);
 _PRINT_FUNC(float, double);
 #undef _PRINT_FUNC
 
+#define _PRINT_NAME_VALUE_FUNC(type_name, type, format_char)		 \
+	void print_##type_name##_name_value(const char *name, type value)\
+	{								 \
+		SPRINT_BUF(format);					 \
+									 \
+		snprintf(format, SPRINT_BSIZE,				 \
+			 "%s %%"#format_char, name);			 \
+		print_##type_name(PRINT_ANY, name, format, value);	 \
+	}
+_PRINT_NAME_VALUE_FUNC(uint, unsigned int, u);
+_PRINT_NAME_VALUE_FUNC(string, const char*, s);
+#undef _PRINT_NAME_VALUE_FUNC
+
 void print_color_string(enum output_type type,
 			enum color_attr color,
 			const char *key,
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iproute2 2/6] json_print: Add new json object function not as array item
  2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value Ron Diskin
@ 2020-01-23 10:32 ` Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 3/6] devlink: Replace json prints by common library functions Ron Diskin
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

Currently new json object opens (and delete_json_obj closes) the object as
an array, what adds prints for the matching bracket '[' ']' at the
start/end of the object. This patch adds new_json_obj_plain() and the
matching delete_json_obj_plain() to enable opening and closing json object,
not as array and leave it to the using function to decide which type of
object to open/close as the main object.

Signed-off-by: Ron Diskin <rondi@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
---
 include/json_print.h |  2 ++
 lib/json_print.c     | 30 ++++++++++++++++++++++++++----
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/include/json_print.h b/include/json_print.h
index fd76cf75..4bcaccf7 100644
--- a/include/json_print.h
+++ b/include/json_print.h
@@ -31,6 +31,8 @@ enum output_type {
 
 void new_json_obj(int json);
 void delete_json_obj(void);
+void new_json_obj_plain(int json);
+void delete_json_obj_plain(void);
 
 bool is_json_context(void);
 
diff --git a/lib/json_print.c b/lib/json_print.c
index fb5f0e5d..8e7f32dc 100644
--- a/lib/json_print.c
+++ b/lib/json_print.c
@@ -20,7 +20,7 @@ static json_writer_t *_jw;
 #define _IS_JSON_CONTEXT(type) ((type & PRINT_JSON || type & PRINT_ANY) && _jw)
 #define _IS_FP_CONTEXT(type) (!_jw && (type & PRINT_FP || type & PRINT_ANY))
 
-void new_json_obj(int json)
+static void __new_json_obj(int json, bool have_array)
 {
 	if (json) {
 		_jw = jsonw_new(stdout);
@@ -30,18 +30,40 @@ void new_json_obj(int json)
 		}
 		if (pretty)
 			jsonw_pretty(_jw, true);
-		jsonw_start_array(_jw);
+		if (have_array)
+			jsonw_start_array(_jw);
 	}
 }
 
-void delete_json_obj(void)
+static void __delete_json_obj(bool have_array)
 {
 	if (_jw) {
-		jsonw_end_array(_jw);
+		if (have_array)
+			jsonw_end_array(_jw);
 		jsonw_destroy(&_jw);
 	}
 }
 
+void new_json_obj(int json)
+{
+	__new_json_obj(json, true);
+}
+
+void delete_json_obj(void)
+{
+	__delete_json_obj(true);
+}
+
+void new_json_obj_plain(int json)
+{
+	__new_json_obj(json, false);
+}
+
+void delete_json_obj_plain(void)
+{
+	__delete_json_obj(false);
+}
+
 bool is_json_context(void)
 {
 	return _jw != NULL;
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iproute2 3/6] devlink: Replace json prints by common library functions
  2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 2/6] json_print: Add new json object function not as array item Ron Diskin
@ 2020-01-23 10:32 ` Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 4/6] devlink: Replace pr_out_str wrapper function with common function Ron Diskin
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

Substitute json prints to use json_print.c common library functions,
instead of directly calling jsonw_functions.

Signed-off-by: Ron Diskin <rondi@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
---
 devlink/devlink.c | 147 +++++++++++++++++++---------------------------
 1 file changed, 61 insertions(+), 86 deletions(-)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index 95f05a0b..a641c4dc 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -1715,19 +1715,17 @@ static void __pr_out_handle_start(struct dl *dl, struct nlattr **tb,
 	if (dl->json_output) {
 		if (array) {
 			if (should_arr_last_handle_end(dl, bus_name, dev_name))
-				jsonw_end_array(dl->jw);
+				close_json_array(PRINT_JSON, NULL);
 			if (should_arr_last_handle_start(dl, bus_name,
 							 dev_name)) {
-				jsonw_name(dl->jw, buf);
-				jsonw_start_array(dl->jw);
-				jsonw_start_object(dl->jw);
+				open_json_array(PRINT_JSON, buf);
+				open_json_object(NULL);
 				arr_last_handle_set(dl, bus_name, dev_name);
 			} else {
-				jsonw_start_object(dl->jw);
+				open_json_object(NULL);
 			}
 		} else {
-			jsonw_name(dl->jw, buf);
-			jsonw_start_object(dl->jw);
+			open_json_object(buf);
 		}
 	} else {
 		if (array) {
@@ -1754,7 +1752,7 @@ static void pr_out_handle_start_arr(struct dl *dl, struct nlattr **tb)
 static void pr_out_handle_end(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_object(dl->jw);
+		close_json_object();
 	else
 		__pr_out_newline();
 }
@@ -1816,21 +1814,19 @@ static void __pr_out_port_handle_start(struct dl *dl, const char *bus_name,
 			if (should_arr_last_port_handle_end(dl, bus_name,
 							    dev_name,
 							    port_index))
-				jsonw_end_array(dl->jw);
+				close_json_array(PRINT_JSON, NULL);
 			if (should_arr_last_port_handle_start(dl, bus_name,
 							      dev_name,
 							      port_index)) {
-				jsonw_name(dl->jw, buf);
-				jsonw_start_array(dl->jw);
-				jsonw_start_object(dl->jw);
+				open_json_array(PRINT_JSON, buf);
+				open_json_object(NULL);
 				arr_last_port_handle_set(dl, bus_name, dev_name,
 							 port_index);
 			} else {
-				jsonw_start_object(dl->jw);
+				open_json_object(NULL);
 			}
 		} else {
-			jsonw_name(dl->jw, buf);
-			jsonw_start_object(dl->jw);
+			open_json_object(buf);
 		}
 	} else {
 		pr_out("%s:", buf);
@@ -1864,7 +1860,7 @@ static void pr_out_port_handle_start_arr(struct dl *dl, struct nlattr **tb, bool
 static void pr_out_port_handle_end(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_object(dl->jw);
+		close_json_object();
 	else
 		pr_out("\n");
 }
@@ -1874,7 +1870,7 @@ static void pr_out_str(struct dl *dl, const char *name, const char *val)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_string_field(dl->jw, name, val);
+		print_string(PRINT_JSON, name, NULL, val);
 	else
 		pr_out("%s %s", name, val);
 }
@@ -1882,7 +1878,7 @@ static void pr_out_str(struct dl *dl, const char *name, const char *val)
 static void pr_out_bool(struct dl *dl, const char *name, bool val)
 {
 	if (dl->json_output)
-		jsonw_bool_field(dl->jw, name, val);
+		print_bool(PRINT_JSON, name, NULL, val);
 	else
 		pr_out_str(dl, name, val ? "true" : "false");
 }
@@ -1891,7 +1887,7 @@ static void pr_out_uint(struct dl *dl, const char *name, unsigned int val)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_uint_field(dl->jw, name, val);
+		print_uint(PRINT_JSON, name, NULL, val);
 	else
 		pr_out("%s %u", name, val);
 }
@@ -1903,7 +1899,7 @@ static void pr_out_u64(struct dl *dl, const char *name, uint64_t val)
 		return pr_out_str(dl, name, "unlimited");
 
 	if (dl->json_output)
-		jsonw_u64_field(dl->jw, name, val);
+		print_u64(PRINT_JSON, name, NULL, val);
 	else
 		pr_out("%s %"PRIu64, name, val);
 }
@@ -1912,7 +1908,7 @@ static void pr_out_bool_value(struct dl *dl, bool value)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_bool(dl->jw, value);
+		print_bool(PRINT_JSON, NULL, NULL, value);
 	else
 		pr_out("%s", value ? "true" : "false");
 }
@@ -1921,7 +1917,7 @@ static void pr_out_uint_value(struct dl *dl, unsigned int value)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_uint(dl->jw, value);
+		print_uint(PRINT_JSON, NULL, NULL, value);
 	else
 		pr_out("%u", value);
 }
@@ -1930,7 +1926,7 @@ static void pr_out_uint64_value(struct dl *dl, uint64_t value)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_u64(dl->jw, value);
+		print_u64(PRINT_JSON, NULL, NULL, value);
 	else
 		pr_out("%"PRIu64, value);
 }
@@ -1946,7 +1942,7 @@ static void pr_out_binary_value(struct dl *dl, uint8_t *data, uint32_t len)
 
 	while (i < len) {
 		if (dl->json_output)
-			jsonw_printf(dl->jw, "%d", data[i]);
+			print_int(PRINT_JSON, NULL, NULL, data[i]);
 		else
 			pr_out("%02x ", data[i]);
 		i++;
@@ -1961,7 +1957,7 @@ static void pr_out_str_value(struct dl *dl, const char *value)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_string(dl->jw, value);
+		print_string(PRINT_JSON, NULL, NULL, value);
 	else
 		pr_out("%s", value);
 }
@@ -1970,7 +1966,7 @@ static void pr_out_name(struct dl *dl, const char *name)
 {
 	__pr_out_indent_newline(dl);
 	if (dl->json_output)
-		jsonw_name(dl->jw, name);
+		print_string(PRINT_JSON, name, NULL, NULL);
 	else
 		pr_out("%s:", name);
 }
@@ -1978,17 +1974,15 @@ static void pr_out_name(struct dl *dl, const char *name)
 static void pr_out_region_chunk_start(struct dl *dl, uint64_t addr)
 {
 	if (dl->json_output) {
-		jsonw_name(dl->jw, "address");
-		jsonw_uint(dl->jw, addr);
-		jsonw_name(dl->jw, "data");
-		jsonw_start_array(dl->jw);
+		print_uint(PRINT_JSON, "address", NULL, addr);
+		open_json_array(PRINT_JSON, "data");
 	}
 }
 
 static void pr_out_region_chunk_end(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_array(dl->jw);
+		close_json_array(PRINT_JSON, NULL);
 }
 
 static void pr_out_region_chunk(struct dl *dl, uint8_t *data, uint32_t len,
@@ -2008,7 +2002,7 @@ static void pr_out_region_chunk(struct dl *dl, uint8_t *data, uint32_t len,
 		align_val++;
 
 		if (dl->json_output)
-			jsonw_printf(dl->jw, "%d", data[i]);
+			print_int(PRINT_JSON, NULL, NULL, data[i]);
 		else
 			pr_out("%02x ", data[i]);
 
@@ -2021,9 +2015,8 @@ static void pr_out_region_chunk(struct dl *dl, uint8_t *data, uint32_t len,
 static void pr_out_section_start(struct dl *dl, const char *name)
 {
 	if (dl->json_output) {
-		jsonw_start_object(dl->jw);
-		jsonw_name(dl->jw, name);
-		jsonw_start_object(dl->jw);
+		open_json_object(NULL);
+		open_json_object(name);
 	}
 }
 
@@ -2031,17 +2024,16 @@ static void pr_out_section_end(struct dl *dl)
 {
 	if (dl->json_output) {
 		if (dl->arr_last.present)
-			jsonw_end_array(dl->jw);
-		jsonw_end_object(dl->jw);
-		jsonw_end_object(dl->jw);
+			close_json_array(PRINT_JSON, NULL);
+		close_json_object();
+		close_json_object();
 	}
 }
 
 static void pr_out_array_start(struct dl *dl, const char *name)
 {
 	if (dl->json_output) {
-		jsonw_name(dl->jw, name);
-		jsonw_start_array(dl->jw);
+		open_json_array(PRINT_JSON, name);
 	} else {
 		__pr_out_indent_inc();
 		__pr_out_newline();
@@ -2054,7 +2046,7 @@ static void pr_out_array_start(struct dl *dl, const char *name)
 static void pr_out_array_end(struct dl *dl)
 {
 	if (dl->json_output) {
-		jsonw_end_array(dl->jw);
+		close_json_array(PRINT_JSON, NULL);
 	} else {
 		__pr_out_indent_dec();
 		__pr_out_indent_dec();
@@ -2064,8 +2056,7 @@ static void pr_out_array_end(struct dl *dl)
 static void pr_out_object_start(struct dl *dl, const char *name)
 {
 	if (dl->json_output) {
-		jsonw_name(dl->jw, name);
-		jsonw_start_object(dl->jw);
+		open_json_object(name);
 	} else {
 		__pr_out_indent_inc();
 		__pr_out_newline();
@@ -2078,7 +2069,7 @@ static void pr_out_object_start(struct dl *dl, const char *name)
 static void pr_out_object_end(struct dl *dl)
 {
 	if (dl->json_output) {
-		jsonw_end_object(dl->jw);
+		close_json_object();
 	} else {
 		__pr_out_indent_dec();
 		__pr_out_indent_dec();
@@ -2088,13 +2079,13 @@ static void pr_out_object_end(struct dl *dl)
 static void pr_out_entry_start(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_start_object(dl->jw);
+		open_json_object(NULL);
 }
 
 static void pr_out_entry_end(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_object(dl->jw);
+		close_json_object();
 	else
 		__pr_out_newline();
 }
@@ -3887,20 +3878,18 @@ static void pr_out_json_occ_show_item_list(struct dl *dl, const char *label,
 	struct occ_item *occ_item;
 	char buf[32];
 
-	jsonw_name(dl->jw, label);
-	jsonw_start_object(dl->jw);
+	open_json_object(label);
 	list_for_each_entry(occ_item, list, list) {
 		sprintf(buf, "%u", occ_item->index);
-		jsonw_name(dl->jw, buf);
-		jsonw_start_object(dl->jw);
+		open_json_object(buf);
 		if (bound_pool)
-			jsonw_uint_field(dl->jw, "bound_pool",
-					 occ_item->bound_pool_index);
-		jsonw_uint_field(dl->jw, "current", occ_item->cur);
-		jsonw_uint_field(dl->jw, "max", occ_item->max);
-		jsonw_end_object(dl->jw);
+			print_uint(PRINT_JSON, "bound_pool", NULL,
+				   occ_item->bound_pool_index);
+		print_uint(PRINT_JSON, "current", NULL, occ_item->cur);
+		print_uint(PRINT_JSON, "max", NULL, occ_item->max);
+		close_json_object();
 	}
-	jsonw_end_object(dl->jw);
+	close_json_object();
 }
 
 static void pr_out_occ_show_port(struct dl *dl, struct occ_port *occ_port)
@@ -6140,18 +6129,16 @@ static void pr_out_region_handle_start(struct dl *dl, struct nlattr **tb)
 	char buf[256];
 
 	sprintf(buf, "%s/%s/%s", bus_name, dev_name, region_name);
-	if (dl->json_output) {
-		jsonw_name(dl->jw, buf);
-		jsonw_start_object(dl->jw);
-	} else {
+	if (dl->json_output)
+		open_json_object(buf);
+	else
 		pr_out("%s:", buf);
-	}
 }
 
 static void pr_out_region_handle_end(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_object(dl->jw);
+		close_json_object();
 	else
 		pr_out("\n");
 }
@@ -6159,18 +6146,16 @@ static void pr_out_region_handle_end(struct dl *dl)
 static void pr_out_region_snapshots_start(struct dl *dl, bool array)
 {
 	__pr_out_indent_newline(dl);
-	if (dl->json_output) {
-		jsonw_name(dl->jw, "snapshot");
-		jsonw_start_array(dl->jw);
-	} else {
+	if (dl->json_output)
+		open_json_array(PRINT_JSON, "snapshot");
+	else
 		pr_out("snapshot %s", array ? "[" : "");
-	}
 }
 
 static void pr_out_region_snapshots_end(struct dl *dl, bool array)
 {
 	if (dl->json_output)
-		jsonw_end_array(dl->jw);
+		close_json_array(PRINT_JSON, NULL);
 	else if (array)
 		pr_out("]");
 }
@@ -6185,7 +6170,7 @@ static void pr_out_region_snapshots_id(struct dl *dl, struct nlattr **tb, int in
 	snapshot_id = mnl_attr_get_u32(tb[DEVLINK_ATTR_REGION_SNAPSHOT_ID]);
 
 	if (dl->json_output)
-		jsonw_uint(dl->jw, snapshot_id);
+		print_uint(PRINT_JSON, NULL, NULL, snapshot_id);
 	else
 		pr_out("%s%u", index ? " " : "", snapshot_id);
 }
@@ -6527,7 +6512,7 @@ static void pr_out_fmsg_start_object(struct dl *dl, char **name)
 {
 	if (dl->json_output) {
 		pr_out_fmsg_name(dl, name);
-		jsonw_start_object(dl->jw);
+		open_json_object(NULL);
 	} else {
 		pr_out_fmsg_group_start(dl, name);
 	}
@@ -6536,7 +6521,7 @@ static void pr_out_fmsg_start_object(struct dl *dl, char **name)
 static void pr_out_fmsg_end_object(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_object(dl->jw);
+		close_json_object();
 	else
 		pr_out_fmsg_group_end(dl);
 }
@@ -6545,7 +6530,7 @@ static void pr_out_fmsg_start_array(struct dl *dl, char **name)
 {
 	if (dl->json_output) {
 		pr_out_fmsg_name(dl, name);
-		jsonw_start_array(dl->jw);
+		open_json_array(PRINT_JSON, NULL);
 	} else {
 		pr_out_fmsg_group_start(dl, name);
 	}
@@ -6554,7 +6539,7 @@ static void pr_out_fmsg_start_array(struct dl *dl, char **name)
 static void pr_out_fmsg_end_array(struct dl *dl)
 {
 	if (dl->json_output)
-		jsonw_end_array(dl->jw);
+		close_json_array(PRINT_JSON, NULL);
 	else
 		pr_out_fmsg_group_end(dl);
 }
@@ -7206,18 +7191,9 @@ static int dl_init(struct dl *dl)
 		pr_err("Failed to create index map\n");
 		goto err_ifname_map_create;
 	}
-	if (dl->json_output) {
-		dl->jw = jsonw_new(stdout);
-		if (!dl->jw) {
-			pr_err("Failed to create JSON writer\n");
-			goto err_json_new;
-		}
-		jsonw_pretty(dl->jw, dl->pretty_output);
-	}
+	new_json_obj_plain(dl->json_output);
 	return 0;
 
-err_json_new:
-	ifname_map_fini(dl);
 err_ifname_map_create:
 	mnlg_socket_close(dl->nlg);
 	return err;
@@ -7225,8 +7201,7 @@ err_ifname_map_create:
 
 static void dl_fini(struct dl *dl)
 {
-	if (dl->json_output)
-		jsonw_destroy(&dl->jw);
+	delete_json_obj_plain();
 	ifname_map_fini(dl);
 	mnlg_socket_close(dl->nlg);
 }
@@ -7333,7 +7308,7 @@ int main(int argc, char **argv)
 			dl->json_output = true;
 			break;
 		case 'p':
-			dl->pretty_output = true;
+			pretty = true;
 			break;
 		case 'v':
 			dl->verbose = true;
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iproute2 4/6] devlink: Replace pr_out_str wrapper function with common function
  2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
                   ` (2 preceding siblings ...)
  2020-01-23 10:32 ` [PATCH iproute2 3/6] devlink: Replace json prints by common library functions Ron Diskin
@ 2020-01-23 10:32 ` Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 5/6] devlink: Replace pr_#type_value wrapper functions with common functions Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 6/6] devlink: Replace pr_out_bool/uint() wrappers with common print functions Ron Diskin
  5 siblings, 0 replies; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

Replace calls for pr_out_str() and pr_out_str_value() with direct calls to
common json_print library functions.

Signed-off-by: Ron Diskin <rondi@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
---
 devlink/devlink.c | 292 ++++++++++++++++++++++++++--------------------
 1 file changed, 166 insertions(+), 126 deletions(-)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index a641c4dc..a25dd818 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -395,6 +395,17 @@ static void __pr_out_indent_newline(struct dl *dl)
 		pr_out(" ");
 }
 
+static void check_indent_newline(struct dl *dl)
+{
+	__pr_out_indent_newline(dl);
+
+	if (g_indent_newline && !is_json_context()) {
+		printf("%s", g_indent_str);
+		g_indent_newline = false;
+	}
+	g_new_line_count = 0;
+}
+
 static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
 	[DEVLINK_ATTR_BUS_NAME] = MNL_TYPE_NUL_STRING,
 	[DEVLINK_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
@@ -1865,22 +1876,12 @@ static void pr_out_port_handle_end(struct dl *dl)
 		pr_out("\n");
 }
 
-
-static void pr_out_str(struct dl *dl, const char *name, const char *val)
-{
-	__pr_out_indent_newline(dl);
-	if (dl->json_output)
-		print_string(PRINT_JSON, name, NULL, val);
-	else
-		pr_out("%s %s", name, val);
-}
-
 static void pr_out_bool(struct dl *dl, const char *name, bool val)
 {
 	if (dl->json_output)
 		print_bool(PRINT_JSON, name, NULL, val);
 	else
-		pr_out_str(dl, name, val ? "true" : "false");
+		print_string_name_value(name, val ? "true" : "false");
 }
 
 static void pr_out_uint(struct dl *dl, const char *name, unsigned int val)
@@ -1896,7 +1897,7 @@ static void pr_out_u64(struct dl *dl, const char *name, uint64_t val)
 {
 	__pr_out_indent_newline(dl);
 	if (val == (uint64_t) -1)
-		return pr_out_str(dl, name, "unlimited");
+		return print_string_name_value(name, "unlimited");
 
 	if (dl->json_output)
 		print_u64(PRINT_JSON, name, NULL, val);
@@ -1953,15 +1954,6 @@ static void pr_out_binary_value(struct dl *dl, uint8_t *data, uint32_t len)
 		__pr_out_newline();
 }
 
-static void pr_out_str_value(struct dl *dl, const char *value)
-{
-	__pr_out_indent_newline(dl);
-	if (dl->json_output)
-		print_string(PRINT_JSON, NULL, NULL, value);
-	else
-		pr_out("%s", value);
-}
-
 static void pr_out_name(struct dl *dl, const char *name)
 {
 	__pr_out_indent_newline(dl);
@@ -2156,19 +2148,24 @@ static void pr_out_eswitch(struct dl *dl, struct nlattr **tb)
 {
 	__pr_out_handle_start(dl, tb, true, false);
 
-	if (tb[DEVLINK_ATTR_ESWITCH_MODE])
-		pr_out_str(dl, "mode",
-			   eswitch_mode_name(mnl_attr_get_u16(tb[DEVLINK_ATTR_ESWITCH_MODE])));
-
-	if (tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])
-		pr_out_str(dl, "inline-mode",
-			   eswitch_inline_mode_name(mnl_attr_get_u8(
-				   tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])));
-
+	if (tb[DEVLINK_ATTR_ESWITCH_MODE]) {
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "mode", "mode %s",
+			     eswitch_mode_name(mnl_attr_get_u16(
+				     tb[DEVLINK_ATTR_ESWITCH_MODE])));
+	}
+	if (tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE]) {
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "inline-mode", "inline-mode %s",
+			     eswitch_inline_mode_name(mnl_attr_get_u8(
+				     tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])));
+	}
 	if (tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
 		bool encap_mode = !!mnl_attr_get_u8(tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
 
-		pr_out_str(dl, "encap", encap_mode ? "enable" : "disable");
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "encap", "encap %s",
+			     encap_mode ? "enable" : "disable");
 	}
 
 	pr_out_handle_end(dl);
@@ -2355,8 +2352,10 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 	     !nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
 		return;
 
-	pr_out_str(dl, "cmode",
-		   param_cmode_name(mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE])));
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "cmode", "cmode %s",
+		     param_cmode_name(mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE])));
+
 	val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
 
 	conv_exists = param_val_conv_exists(param_val_conv, PARAM_VAL_CONV_LEN,
@@ -2372,7 +2371,7 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 						     &vstr);
 			if (err)
 				return;
-			pr_out_str(dl, "value", vstr);
+			print_string(PRINT_ANY, "value", " value %s", vstr);
 		} else {
 			pr_out_uint(dl, "value", mnl_attr_get_u8(val_attr));
 		}
@@ -2386,7 +2385,7 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 						     &vstr);
 			if (err)
 				return;
-			pr_out_str(dl, "value", vstr);
+			print_string(PRINT_ANY, "value", " value %s", vstr);
 		} else {
 			pr_out_uint(dl, "value", mnl_attr_get_u16(val_attr));
 		}
@@ -2400,13 +2399,14 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 						     &vstr);
 			if (err)
 				return;
-			pr_out_str(dl, "value", vstr);
+			print_string(PRINT_ANY, "value", " value %s", vstr);
 		} else {
 			pr_out_uint(dl, "value", mnl_attr_get_u32(val_attr));
 		}
 		break;
 	case MNL_TYPE_STRING:
-		pr_out_str(dl, "value", mnl_attr_get_str(val_attr));
+		print_string(PRINT_ANY, "value", " value %s",
+			     mnl_attr_get_str(val_attr));
 		break;
 	case MNL_TYPE_FLAG:
 		pr_out_bool(dl, "value", val_attr ? true : false);
@@ -2438,12 +2438,12 @@ static void pr_out_param(struct dl *dl, struct nlattr **tb, bool array)
 	nla_type = mnl_attr_get_u8(nla_param[DEVLINK_ATTR_PARAM_TYPE]);
 
 	nla_name = mnl_attr_get_str(nla_param[DEVLINK_ATTR_PARAM_NAME]);
-	pr_out_str(dl, "name", nla_name);
-
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "name", "name %s ", nla_name);
 	if (!nla_param[DEVLINK_ATTR_PARAM_GENERIC])
-		pr_out_str(dl, "type", "driver-specific");
+		print_string(PRINT_ANY, "type", "type %s", "driver-specific");
 	else
-		pr_out_str(dl, "type", "generic");
+		print_string(PRINT_ANY, "type", "type %s", "generic");
 
 	pr_out_array_start(dl, "values");
 	mnl_attr_for_each_nested(param_value_attr,
@@ -2807,7 +2807,8 @@ static void pr_out_versions_single(struct dl *dl, const struct nlmsghdr *nlh,
 		ver_name = mnl_attr_get_str(tb[DEVLINK_ATTR_INFO_VERSION_NAME]);
 		ver_value = mnl_attr_get_str(tb[DEVLINK_ATTR_INFO_VERSION_VALUE]);
 
-		pr_out_str(dl, ver_name, ver_value);
+		check_indent_newline(dl);
+		print_string_name_value(ver_name, ver_value);
 		if (!dl->json_output)
 			__pr_out_newline();
 	}
@@ -2827,7 +2828,9 @@ static void pr_out_info(struct dl *dl, const struct nlmsghdr *nlh,
 
 		if (!dl->json_output)
 			__pr_out_newline();
-		pr_out_str(dl, "driver", mnl_attr_get_str(nla_drv));
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "driver", "driver %s",
+			     mnl_attr_get_str(nla_drv));
 	}
 
 	if (tb[DEVLINK_ATTR_INFO_SERIAL_NUMBER]) {
@@ -2835,7 +2838,9 @@ static void pr_out_info(struct dl *dl, const struct nlmsghdr *nlh,
 
 		if (!dl->json_output)
 			__pr_out_newline();
-		pr_out_str(dl, "serial_number", mnl_attr_get_str(nla_sn));
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "serial_number", "serial_number %s",
+			     mnl_attr_get_str(nla_sn));
 	}
 	__pr_out_indent_dec();
 
@@ -3208,29 +3213,34 @@ static void pr_out_port(struct dl *dl, struct nlattr **tb)
 	struct nlattr *dpt_attr = tb[DEVLINK_ATTR_PORT_DESIRED_TYPE];
 
 	pr_out_port_handle_start(dl, tb, false);
+	check_indent_newline(dl);
 	if (pt_attr) {
 		uint16_t port_type = mnl_attr_get_u16(pt_attr);
 
-		pr_out_str(dl, "type", port_type_name(port_type));
+		print_string(PRINT_ANY, "type", "type %s",
+			     port_type_name(port_type));
 		if (dpt_attr) {
 			uint16_t des_port_type = mnl_attr_get_u16(dpt_attr);
 
 			if (port_type != des_port_type)
-				pr_out_str(dl, "des_type",
-					   port_type_name(des_port_type));
+				print_string(PRINT_ANY, "des_type", " des_type %s",
+					     port_type_name(des_port_type));
 		}
 	}
-	if (tb[DEVLINK_ATTR_PORT_NETDEV_NAME])
-		pr_out_str(dl, "netdev",
-			   mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_NETDEV_NAME]));
-	if (tb[DEVLINK_ATTR_PORT_IBDEV_NAME])
-		pr_out_str(dl, "ibdev",
-			   mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_IBDEV_NAME]));
+	if (tb[DEVLINK_ATTR_PORT_NETDEV_NAME]) {
+		print_string(PRINT_ANY, "netdev", " netdev %s",
+			     mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_NETDEV_NAME]));
+	}
+	if (tb[DEVLINK_ATTR_PORT_IBDEV_NAME]) {
+		print_string(PRINT_ANY, "ibdev", " ibdev %s",
+			     mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_IBDEV_NAME]));
+		}
 	if (tb[DEVLINK_ATTR_PORT_FLAVOUR]) {
 		uint16_t port_flavour =
 				mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_FLAVOUR]);
 
-		pr_out_str(dl, "flavour", port_flavour_name(port_flavour));
+		print_string(PRINT_ANY, "flavour", " flavour %s",
+			     port_flavour_name(port_flavour));
 
 		switch (port_flavour) {
 		case DEVLINK_PORT_FLAVOUR_PCI_PF:
@@ -3381,6 +3391,7 @@ static void cmd_sb_help(void)
 static void pr_out_sb(struct dl *dl, struct nlattr **tb)
 {
 	pr_out_handle_start_arr(dl, tb);
+	check_indent_newline(dl);
 	pr_out_uint(dl, "sb",
 		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
 	pr_out_uint(dl, "size",
@@ -3462,12 +3473,12 @@ static void pr_out_sb_pool(struct dl *dl, struct nlattr **tb)
 		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
 	pr_out_uint(dl, "pool",
 		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
-	pr_out_str(dl, "type",
-		   pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
+	print_string(PRINT_ANY, "type", " type %s",
+		     pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
 	pr_out_uint(dl, "size",
 		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_SIZE]));
-	pr_out_str(dl, "thtype",
-		   threshold_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE])));
+	print_string(PRINT_ANY, "thtype", " thtype %s",
+		     threshold_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE])));
 	if (tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE])
 		pr_out_uint(dl, "cell_size",
 			    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE]));
@@ -3652,8 +3663,8 @@ static void pr_out_sb_tc_bind(struct dl *dl, struct nlattr **tb)
 	       mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
 	pr_out_uint(dl, "tc",
 	       mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_TC_INDEX]));
-	pr_out_str(dl, "type",
-	       pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
+	print_string(PRINT_ANY, "type", " type %s",
+		     pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
 	pr_out_uint(dl, "pool",
 	       mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
 	pr_out_uint(dl, "threshold",
@@ -4232,13 +4243,16 @@ static void pr_out_flash_update(struct dl *dl, struct nlattr **tb)
 {
 	__pr_out_handle_start(dl, tb, true, false);
 
-	if (tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG])
-		pr_out_str(dl, "msg",
-			   mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG]));
-
-	if (tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT])
-		pr_out_str(dl, "component",
-			   mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT]));
+	if (tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG]) {
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "msg", "msg %s",
+			     mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG]));
+	}
+	if (tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT]) {
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "component", "component %s",
+			     mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT]));
+	}
 
 	if (tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE])
 		pr_out_u64(dl, "done",
@@ -4705,13 +4719,15 @@ static void pr_out_dpipe_fields(struct dpipe_ctx *ctx,
 	for (i = 0; i < field_count; i++) {
 		field = &fields[i];
 		pr_out_entry_start(ctx->dl);
-		pr_out_str(ctx->dl, "name", field->name);
+		check_indent_newline(ctx->dl);
+		print_string(PRINT_ANY, "name", "name %s", field->name);
 		if (ctx->dl->verbose)
 			pr_out_uint(ctx->dl, "id", field->id);
 		pr_out_uint(ctx->dl, "bitwidth", field->bitwidth);
-		if (field->mapping_type)
-			pr_out_str(ctx->dl, "mapping_type",
-				   dpipe_field_mapping_e2s(field->mapping_type));
+		if (field->mapping_type) {
+			print_string(PRINT_ANY, "mapping_type", " mapping_type %s",
+				     dpipe_field_mapping_e2s(field->mapping_type));
+		}
 		pr_out_entry_end(ctx->dl);
 	}
 }
@@ -4721,11 +4737,11 @@ pr_out_dpipe_header(struct dpipe_ctx *ctx, struct nlattr **tb,
 		    struct dpipe_header *header, bool global)
 {
 	pr_out_handle_start_arr(ctx->dl, tb);
-	pr_out_str(ctx->dl, "name", header->name);
+	check_indent_newline(ctx->dl);
+	print_string(PRINT_ANY, "name", "name %s", header->name);
 	if (ctx->dl->verbose) {
 		pr_out_uint(ctx->dl, "id", header->id);
-		pr_out_str(ctx->dl, "global",
-			   global ? "true" : "false");
+		print_bool(PRINT_ANY, "global", " global %s", global);
 	}
 	pr_out_array_start(ctx->dl, "field");
 	pr_out_dpipe_fields(ctx, header->fields,
@@ -4949,20 +4965,21 @@ static void pr_out_dpipe_action(struct dpipe_action *action,
 	struct dpipe_op_info *op_info = &action->info;
 	const char *mapping;
 
-	pr_out_str(ctx->dl, "type",
-		   dpipe_action_type_e2s(action->type));
-	pr_out_str(ctx->dl, "header",
-		   dpipe_header_id2s(ctx, op_info->header_id,
-				     op_info->header_global));
-	pr_out_str(ctx->dl, "field",
-		   dpipe_field_id2s(ctx, op_info->header_id,
-				    op_info->field_id,
-				    op_info->header_global));
+	check_indent_newline(ctx->dl);
+	print_string(PRINT_ANY, "type", "type %s",
+		     dpipe_action_type_e2s(action->type));
+	print_string(PRINT_ANY, "header", " header %s",
+		     dpipe_header_id2s(ctx, op_info->header_id,
+				       op_info->header_global));
+	print_string(PRINT_ANY, "field", " field %s",
+		     dpipe_field_id2s(ctx, op_info->header_id,
+				      op_info->field_id,
+				      op_info->header_global));
 	mapping = dpipe_mapping_get(ctx, op_info->header_id,
 				    op_info->field_id,
 				    op_info->header_global);
 	if (mapping)
-		pr_out_str(ctx->dl, "mapping", mapping);
+		print_string(PRINT_ANY, "mapping", " mapping %s", mapping);
 }
 
 static int dpipe_action_parse(struct dpipe_action *action, struct nlattr *nl)
@@ -5031,20 +5048,21 @@ static void pr_out_dpipe_match(struct dpipe_match *match,
 	struct dpipe_op_info *op_info = &match->info;
 	const char *mapping;
 
-	pr_out_str(ctx->dl, "type",
-		   dpipe_match_type_e2s(match->type));
-	pr_out_str(ctx->dl, "header",
-		   dpipe_header_id2s(ctx, op_info->header_id,
-				     op_info->header_global));
-	pr_out_str(ctx->dl, "field",
-		   dpipe_field_id2s(ctx, op_info->header_id,
-				    op_info->field_id,
-				    op_info->header_global));
+	check_indent_newline(ctx->dl);
+	print_string(PRINT_ANY, "type", "type %s",
+		     dpipe_match_type_e2s(match->type));
+	print_string(PRINT_ANY, "header", " header %s",
+		     dpipe_header_id2s(ctx, op_info->header_id,
+				       op_info->header_global));
+	print_string(PRINT_ANY, "field", " field %s",
+		     dpipe_field_id2s(ctx, op_info->header_id,
+				      op_info->field_id,
+				      op_info->header_global));
 	mapping = dpipe_mapping_get(ctx, op_info->header_id,
 				    op_info->field_id,
 				    op_info->header_global);
 	if (mapping)
-		pr_out_str(ctx->dl, "mapping", mapping);
+		print_string(PRINT_ANY, "mapping", " mapping %s", mapping);
 }
 
 static int dpipe_match_parse(struct dpipe_match *match,
@@ -5149,7 +5167,8 @@ resource_path_print(struct dl *dl, struct resources *resources,
 		path -= strlen(del);
 		memcpy(path, del, strlen(del));
 	}
-	pr_out_str(dl, "resource_path", path);
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "resource_path", "resource_path %s", path);
 	free(path);
 }
 
@@ -5194,10 +5213,10 @@ static int dpipe_table_show(struct dpipe_ctx *ctx, struct nlattr *nl)
 	if (!ctx->print_tables)
 		return 0;
 
-	pr_out_str(ctx->dl, "name", table->name);
+	check_indent_newline(ctx->dl);
+	print_string(PRINT_ANY, "name", "name %s", table->name);
 	pr_out_uint(ctx->dl, "size", size);
-	pr_out_str(ctx->dl, "counters_enabled",
-		   counters_enabled ? "true" : "false");
+	print_bool(PRINT_ANY, "counters_enabled", " counters_enabled %s", counters_enabled);
 
 	if (resource_valid) {
 		resource_units = mnl_attr_get_u32(nla_table[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS]);
@@ -5374,7 +5393,8 @@ static void dpipe_field_printer_ipv4_addr(struct dpipe_ctx *ctx,
 	struct in_addr ip_addr;
 
 	ip_addr.s_addr = htonl(*(uint32_t *)value);
-	pr_out_str(ctx->dl, dpipe_value_type_e2s(type), inet_ntoa(ip_addr));
+	check_indent_newline(ctx->dl);
+	print_string_name_value(dpipe_value_type_e2s(type), inet_ntoa(ip_addr));
 }
 
 static void
@@ -5382,8 +5402,9 @@ dpipe_field_printer_ethernet_addr(struct dpipe_ctx *ctx,
 				  enum dpipe_value_type type,
 				  void *value)
 {
-	pr_out_str(ctx->dl, dpipe_value_type_e2s(type),
-		   ether_ntoa((struct ether_addr *)value));
+	check_indent_newline(ctx->dl);
+	print_string_name_value(dpipe_value_type_e2s(type),
+				ether_ntoa((struct ether_addr *)value));
 }
 
 static void dpipe_field_printer_ipv6_addr(struct dpipe_ctx *ctx,
@@ -5393,7 +5414,8 @@ static void dpipe_field_printer_ipv6_addr(struct dpipe_ctx *ctx,
 	char str[INET6_ADDRSTRLEN];
 
 	inet_ntop(AF_INET6, value, str, INET6_ADDRSTRLEN);
-	pr_out_str(ctx->dl, dpipe_value_type_e2s(type), str);
+	check_indent_newline(ctx->dl);
+	print_string_name_value(dpipe_value_type_e2s(type), str);
 }
 
 static struct dpipe_field_printer dpipe_field_printers_ipv4[] = {
@@ -5872,7 +5894,8 @@ static void resource_show(struct resource *resource,
 	struct dl *dl = ctx->dl;
 	bool array = false;
 
-	pr_out_str(dl, "name", resource->name);
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "name", "name %s", resource->name);
 	if (dl->verbose)
 		resource_path_print(dl, ctx->resources, resource->id);
 	pr_out_u64(dl, "size", resource->size);
@@ -5880,7 +5903,8 @@ static void resource_show(struct resource *resource,
 		pr_out_u64(dl, "size_new", resource->size_new);
 	if (resource->occ_valid)
 		pr_out_uint(dl, "occ", resource->size_occ);
-	pr_out_str(dl, "unit", resource_unit_str_get(resource->unit));
+	print_string(PRINT_ANY, "unit", " unit %s",
+		     resource_unit_str_get(resource->unit));
 
 	if (resource->size_min != resource->size_max) {
 		pr_out_uint(dl, "size_min", resource->size_min);
@@ -5896,14 +5920,17 @@ static void resource_show(struct resource *resource,
 	if (array)
 		pr_out_array_start(dl, "dpipe_tables");
 	else
-		pr_out_str(dl, "dpipe_tables", "none");
+		print_string(PRINT_ANY, "dpipe_tables", " dpipe_tables none",
+			     "none");
 
 	list_for_each_entry(table, &ctx->tables->table_list, list) {
 		if (table->resource_id != resource->id ||
 		    !table->resource_valid)
 			continue;
 		pr_out_entry_start(dl);
-		pr_out_str(dl, "table_name", table->name);
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "table_name", "table_name %s",
+			     table->name);
 		pr_out_entry_end(dl);
 	}
 	if (array)
@@ -5912,9 +5939,11 @@ static void resource_show(struct resource *resource,
 	if (list_empty(&resource->resource_list))
 		return;
 
-	if (ctx->pending_change)
-		pr_out_str(dl, "size_valid", resource->size_valid ?
-			   "true" : "false");
+	if (ctx->pending_change) {
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, "size_valid", "size_valid %s",
+			     resource->size_valid ? "true" : "false");
+	}
 	pr_out_array_start(dl, "resources");
 	list_for_each_entry(child_resource, &resource->resource_list, list) {
 		pr_out_entry_start(dl);
@@ -6418,6 +6447,7 @@ static int fmsg_value_show(struct dl *dl, int type, struct nlattr *nl_data)
 	uint8_t *data;
 	uint32_t len;
 
+	check_indent_newline(dl);
 	switch (type) {
 	case MNL_TYPE_FLAG:
 		pr_out_bool_value(dl, mnl_attr_get_u8(nl_data));
@@ -6435,7 +6465,7 @@ static int fmsg_value_show(struct dl *dl, int type, struct nlattr *nl_data)
 		pr_out_uint64_value(dl, mnl_attr_get_u64(nl_data));
 		break;
 	case MNL_TYPE_NUL_STRING:
-		pr_out_str_value(dl, mnl_attr_get_str(nl_data));
+		print_string(PRINT_ANY, NULL, "%s", mnl_attr_get_str(nl_data));
 		break;
 	case MNL_TYPE_BINARY:
 		len = mnl_attr_get_payload_len(nl_data);
@@ -6733,8 +6763,9 @@ static void pr_out_dump_reporter_format_logtime(struct dl *dl, const struct nlat
 out:
 	strftime(dump_date, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%Y-%m-%d", info);
 	strftime(dump_time, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%H:%M:%S", info);
-	pr_out_str(dl, "last_dump_date", dump_date);
-	pr_out_str(dl, "last_dump_time", dump_time);
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "last_dump_date", "last_dump_date %s", dump_date);
+	print_string(PRINT_ANY, "last_dump_time", " last_dump_time %s", dump_time);
 }
 
 static void pr_out_dump_report_timestamp(struct dl *dl, const struct nlattr *attr)
@@ -6752,8 +6783,9 @@ static void pr_out_dump_report_timestamp(struct dl *dl, const struct nlattr *att
 	strftime(dump_date, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%Y-%m-%d", tm);
 	strftime(dump_time, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%H:%M:%S", tm);
 
-	pr_out_str(dl, "last_dump_date", dump_date);
-	pr_out_str(dl, "last_dump_time", dump_time);
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "last_dump_date", "last_dump_date %s", dump_date);
+	print_string(PRINT_ANY, "last_dump_time", " last_dump_time %s", dump_time);
 }
 
 static void pr_out_health(struct dl *dl, struct nlattr **tb_health)
@@ -6775,14 +6807,16 @@ static void pr_out_health(struct dl *dl, struct nlattr **tb_health)
 
 	pr_out_handle_start_arr(dl, tb_health);
 
-	pr_out_str(dl, "reporter",
-		   mnl_attr_get_str(tb[DEVLINK_ATTR_HEALTH_REPORTER_NAME]));
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "reporter", "reporter %s",
+		     mnl_attr_get_str(tb[DEVLINK_ATTR_HEALTH_REPORTER_NAME]));
 	if (!dl->json_output) {
 		__pr_out_newline();
 		__pr_out_indent_inc();
 	}
 	state = mnl_attr_get_u8(tb[DEVLINK_ATTR_HEALTH_REPORTER_STATE]);
-	pr_out_str(dl, "state", health_state_name(state));
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "state", "state %s", health_state_name(state));
 	pr_out_u64(dl, "error",
 		   mnl_attr_get_u64(tb[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT]));
 	pr_out_u64(dl, "recover",
@@ -6923,8 +6957,11 @@ static void pr_out_trap_metadata(struct dl *dl, struct nlattr *attr)
 	struct nlattr *attr_metadata;
 
 	pr_out_array_start(dl, "metadata");
-	mnl_attr_for_each_nested(attr_metadata, attr)
-		pr_out_str_value(dl, trap_metadata_name(attr_metadata));
+	mnl_attr_for_each_nested(attr_metadata, attr) {
+		check_indent_newline(dl);
+		print_string(PRINT_ANY, NULL, "%s",
+			     trap_metadata_name(attr_metadata));
+	}
 	pr_out_array_end(dl);
 }
 
@@ -6938,12 +6975,14 @@ static void pr_out_trap(struct dl *dl, struct nlattr **tb, bool array)
 	else
 		__pr_out_handle_start(dl, tb, true, false);
 
-	pr_out_str(dl, "name", mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_NAME]));
-	pr_out_str(dl, "type", trap_type_name(type));
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "name", "name %s",
+		     mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_NAME]));
+	print_string(PRINT_ANY, "type", " type %s", trap_type_name(type));
 	pr_out_bool(dl, "generic", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
-	pr_out_str(dl, "action", trap_action_name(action));
-	pr_out_str(dl, "group",
-		   mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
+	print_string(PRINT_ANY, "action", " action %s", trap_action_name(action));
+	print_string(PRINT_ANY, "group", " group %s",
+		     mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
 	if (dl->verbose)
 		pr_out_trap_metadata(dl, tb[DEVLINK_ATTR_TRAP_METADATA]);
 	pr_out_stats(dl, tb[DEVLINK_ATTR_STATS]);
@@ -7025,8 +7064,9 @@ static void pr_out_trap_group(struct dl *dl, struct nlattr **tb, bool array)
 	else
 		__pr_out_handle_start(dl, tb, true, false);
 
-	pr_out_str(dl, "name",
-		   mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
+	check_indent_newline(dl);
+	print_string(PRINT_ANY, "name", "name %s",
+		     mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
 	pr_out_bool(dl, "generic", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
 	pr_out_stats(dl, tb[DEVLINK_ATTR_STATS]);
 	pr_out_handle_end(dl);
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iproute2 5/6] devlink: Replace pr_#type_value wrapper functions with common functions
  2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
                   ` (3 preceding siblings ...)
  2020-01-23 10:32 ` [PATCH iproute2 4/6] devlink: Replace pr_out_str wrapper function with common function Ron Diskin
@ 2020-01-23 10:32 ` Ron Diskin
  2020-01-23 10:32 ` [PATCH iproute2 6/6] devlink: Replace pr_out_bool/uint() wrappers with common print functions Ron Diskin
  5 siblings, 0 replies; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

Replace calls for pr_bool/uint/uint64_value with direct calls for the
matching common json_print library function: print_bool(), print_uint()
and print_u64()

Signed-off-by: Ron Diskin <rondi@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
---
 devlink/devlink.c | 37 +++++--------------------------------
 1 file changed, 5 insertions(+), 32 deletions(-)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index a25dd818..231a2838 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -1905,33 +1905,6 @@ static void pr_out_u64(struct dl *dl, const char *name, uint64_t val)
 		pr_out("%s %"PRIu64, name, val);
 }
 
-static void pr_out_bool_value(struct dl *dl, bool value)
-{
-	__pr_out_indent_newline(dl);
-	if (dl->json_output)
-		print_bool(PRINT_JSON, NULL, NULL, value);
-	else
-		pr_out("%s", value ? "true" : "false");
-}
-
-static void pr_out_uint_value(struct dl *dl, unsigned int value)
-{
-	__pr_out_indent_newline(dl);
-	if (dl->json_output)
-		print_uint(PRINT_JSON, NULL, NULL, value);
-	else
-		pr_out("%u", value);
-}
-
-static void pr_out_uint64_value(struct dl *dl, uint64_t value)
-{
-	__pr_out_indent_newline(dl);
-	if (dl->json_output)
-		print_u64(PRINT_JSON, NULL, NULL, value);
-	else
-		pr_out("%"PRIu64, value);
-}
-
 static bool is_binary_eol(int i)
 {
 	return !(i%16);
@@ -6450,19 +6423,19 @@ static int fmsg_value_show(struct dl *dl, int type, struct nlattr *nl_data)
 	check_indent_newline(dl);
 	switch (type) {
 	case MNL_TYPE_FLAG:
-		pr_out_bool_value(dl, mnl_attr_get_u8(nl_data));
+		print_bool(PRINT_ANY, NULL, "%s", mnl_attr_get_u8(nl_data));
 		break;
 	case MNL_TYPE_U8:
-		pr_out_uint_value(dl, mnl_attr_get_u8(nl_data));
+		print_uint(PRINT_ANY, NULL, "%u", mnl_attr_get_u8(nl_data));
 		break;
 	case MNL_TYPE_U16:
-		pr_out_uint_value(dl, mnl_attr_get_u16(nl_data));
+		print_uint(PRINT_ANY, NULL, "%u", mnl_attr_get_u16(nl_data));
 		break;
 	case MNL_TYPE_U32:
-		pr_out_uint_value(dl, mnl_attr_get_u32(nl_data));
+		print_uint(PRINT_ANY, NULL, "%u", mnl_attr_get_u32(nl_data));
 		break;
 	case MNL_TYPE_U64:
-		pr_out_uint64_value(dl, mnl_attr_get_u64(nl_data));
+		print_u64(PRINT_ANY, NULL, "%"PRIu64, mnl_attr_get_u64(nl_data));
 		break;
 	case MNL_TYPE_NUL_STRING:
 		print_string(PRINT_ANY, NULL, "%s", mnl_attr_get_str(nl_data));
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH iproute2 6/6] devlink: Replace pr_out_bool/uint() wrappers with common print functions
  2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
                   ` (4 preceding siblings ...)
  2020-01-23 10:32 ` [PATCH iproute2 5/6] devlink: Replace pr_#type_value wrapper functions with common functions Ron Diskin
@ 2020-01-23 10:32 ` Ron Diskin
  5 siblings, 0 replies; 8+ messages in thread
From: Ron Diskin @ 2020-01-23 10:32 UTC (permalink / raw
  To: Stephen Hemminger, David Ahern
  Cc: Jiri Pirko, Moshe Shemesh, netdev, Ron Diskin

Replace calls for pr_out_bool() and pr_out_uint() with direct calls
to common json_print library function print_bool() and print_uint().

Signed-off-by: Ron Diskin <rondi@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
---
 devlink/devlink.c | 150 ++++++++++++++++++++++------------------------
 1 file changed, 73 insertions(+), 77 deletions(-)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index 231a2838..73ce9865 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -1876,23 +1876,6 @@ static void pr_out_port_handle_end(struct dl *dl)
 		pr_out("\n");
 }
 
-static void pr_out_bool(struct dl *dl, const char *name, bool val)
-{
-	if (dl->json_output)
-		print_bool(PRINT_JSON, name, NULL, val);
-	else
-		print_string_name_value(name, val ? "true" : "false");
-}
-
-static void pr_out_uint(struct dl *dl, const char *name, unsigned int val)
-{
-	__pr_out_indent_newline(dl);
-	if (dl->json_output)
-		print_uint(PRINT_JSON, name, NULL, val);
-	else
-		pr_out("%s %u", name, val);
-}
-
 static void pr_out_u64(struct dl *dl, const char *name, uint64_t val)
 {
 	__pr_out_indent_newline(dl);
@@ -2346,7 +2329,8 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 				return;
 			print_string(PRINT_ANY, "value", " value %s", vstr);
 		} else {
-			pr_out_uint(dl, "value", mnl_attr_get_u8(val_attr));
+			print_uint(PRINT_ANY, "value", " value %u",
+				   mnl_attr_get_u8(val_attr));
 		}
 		break;
 	case MNL_TYPE_U16:
@@ -2360,7 +2344,8 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 				return;
 			print_string(PRINT_ANY, "value", " value %s", vstr);
 		} else {
-			pr_out_uint(dl, "value", mnl_attr_get_u16(val_attr));
+			print_uint(PRINT_ANY, "value", " value %u",
+				   mnl_attr_get_u16(val_attr));
 		}
 		break;
 	case MNL_TYPE_U32:
@@ -2374,7 +2359,8 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 				return;
 			print_string(PRINT_ANY, "value", " value %s", vstr);
 		} else {
-			pr_out_uint(dl, "value", mnl_attr_get_u32(val_attr));
+			print_uint(PRINT_ANY, "value", " value %u",
+				   mnl_attr_get_u32(val_attr));
 		}
 		break;
 	case MNL_TYPE_STRING:
@@ -2382,7 +2368,7 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
 			     mnl_attr_get_str(val_attr));
 		break;
 	case MNL_TYPE_FLAG:
-		pr_out_bool(dl, "value", val_attr ? true : false);
+		print_bool(PRINT_ANY, "value", " value %s", val_attr);
 		break;
 	}
 }
@@ -2693,7 +2679,8 @@ static int cmd_dev_show_cb(const struct nlmsghdr *nlh, void *data)
 
 	if (reload_failed) {
 		__pr_out_handle_start(dl, tb, true, false);
-		pr_out_bool(dl, "reload_failed", true);
+		check_indent_newline(dl);
+		print_bool(PRINT_ANY, "reload_failed", "reload_failed %s", true);
 		pr_out_handle_end(dl);
 	} else {
 		pr_out_handle(dl, tb);
@@ -3172,11 +3159,11 @@ static void pr_out_port_pfvf_num(struct dl *dl, struct nlattr **tb)
 
 	if (tb[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) {
 		fn_num = mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]);
-		pr_out_uint(dl, "pfnum", fn_num);
+		print_uint(PRINT_ANY, "pfnum", " pfnum %u", fn_num);
 	}
 	if (tb[DEVLINK_ATTR_PORT_PCI_VF_NUMBER]) {
 		fn_num = mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_PCI_VF_NUMBER]);
-		pr_out_uint(dl, "vfnum", fn_num);
+		print_uint(PRINT_ANY, "vfnum", " vfnum %u", fn_num);
 	}
 }
 
@@ -3228,11 +3215,11 @@ static void pr_out_port(struct dl *dl, struct nlattr **tb)
 		uint32_t port_number;
 
 		port_number = mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_NUMBER]);
-		pr_out_uint(dl, "port", port_number);
+		print_uint(PRINT_ANY, "port", " port %u", port_number);
 	}
 	if (tb[DEVLINK_ATTR_PORT_SPLIT_GROUP])
-		pr_out_uint(dl, "split_group",
-			    mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_GROUP]));
+		print_uint(PRINT_ANY, "split_group", " split_group %u",
+			   mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_GROUP]));
 	pr_out_port_handle_end(dl);
 }
 
@@ -3365,18 +3352,18 @@ static void pr_out_sb(struct dl *dl, struct nlattr **tb)
 {
 	pr_out_handle_start_arr(dl, tb);
 	check_indent_newline(dl);
-	pr_out_uint(dl, "sb",
-		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
-	pr_out_uint(dl, "size",
-		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_SIZE]));
-	pr_out_uint(dl, "ing_pools",
-		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT]));
-	pr_out_uint(dl, "eg_pools",
-		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT]));
-	pr_out_uint(dl, "ing_tcs",
-		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_TC_COUNT]));
-	pr_out_uint(dl, "eg_tcs",
-		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_TC_COUNT]));
+	print_uint(PRINT_ANY, "sb", "sb %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+	print_uint(PRINT_ANY, "size", " size %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_SIZE]));
+	print_uint(PRINT_ANY, "ing_pools", " ing_pools %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT]));
+	print_uint(PRINT_ANY, "eg_pools", " eg_pools %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT]));
+	print_uint(PRINT_ANY, "ing_tcs", " ing_tcs %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_TC_COUNT]));
+	print_uint(PRINT_ANY, "eg_tcs", " eg_tcs %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_TC_COUNT]));
 	pr_out_handle_end(dl);
 }
 
@@ -3442,19 +3429,20 @@ static const char *threshold_type_name(uint8_t type)
 static void pr_out_sb_pool(struct dl *dl, struct nlattr **tb)
 {
 	pr_out_handle_start_arr(dl, tb);
-	pr_out_uint(dl, "sb",
-		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
-	pr_out_uint(dl, "pool",
-		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
+	check_indent_newline(dl);
+	print_uint(PRINT_ANY, "sb", "sb %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+	print_uint(PRINT_ANY, "pool", " pool %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
 	print_string(PRINT_ANY, "type", " type %s",
 		     pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
-	pr_out_uint(dl, "size",
-		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_SIZE]));
+	print_uint(PRINT_ANY, "size", " size %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_SIZE]));
 	print_string(PRINT_ANY, "thtype", " thtype %s",
 		     threshold_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE])));
 	if (tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE])
-		pr_out_uint(dl, "cell_size",
-			    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE]));
+		print_uint(PRINT_ANY, "cell_size", " cell size %u",
+			   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE]));
 	pr_out_handle_end(dl);
 }
 
@@ -3534,12 +3522,13 @@ static int cmd_sb_pool(struct dl *dl)
 static void pr_out_sb_port_pool(struct dl *dl, struct nlattr **tb)
 {
 	pr_out_port_handle_start_arr(dl, tb, true);
-	pr_out_uint(dl, "sb",
-		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
-	pr_out_uint(dl, "pool",
-		    mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
-	pr_out_uint(dl, "threshold",
-		    mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
+	check_indent_newline(dl);
+	print_uint(PRINT_ANY, "sb", "sb %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+	print_uint(PRINT_ANY, "pool", " pool %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
+	print_uint(PRINT_ANY, "threshold", " threshold %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
 	pr_out_port_handle_end(dl);
 }
 
@@ -3632,16 +3621,17 @@ static int cmd_sb_port(struct dl *dl)
 static void pr_out_sb_tc_bind(struct dl *dl, struct nlattr **tb)
 {
 	pr_out_port_handle_start_arr(dl, tb, true);
-	pr_out_uint(dl, "sb",
-	       mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
-	pr_out_uint(dl, "tc",
-	       mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_TC_INDEX]));
+	check_indent_newline(dl);
+	print_uint(PRINT_ANY, "sb", "sb %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+	print_uint(PRINT_ANY, "tc", " tc %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_TC_INDEX]));
 	print_string(PRINT_ANY, "type", " type %s",
 		     pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
-	pr_out_uint(dl, "pool",
-	       mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
-	pr_out_uint(dl, "threshold",
-	       mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
+	print_uint(PRINT_ANY, "pool", " pool %u",
+		   mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
+	print_uint(PRINT_ANY, "threshold", " threshold %u",
+		   mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
 	pr_out_port_handle_end(dl);
 }
 
@@ -4695,8 +4685,8 @@ static void pr_out_dpipe_fields(struct dpipe_ctx *ctx,
 		check_indent_newline(ctx->dl);
 		print_string(PRINT_ANY, "name", "name %s", field->name);
 		if (ctx->dl->verbose)
-			pr_out_uint(ctx->dl, "id", field->id);
-		pr_out_uint(ctx->dl, "bitwidth", field->bitwidth);
+			print_uint(PRINT_ANY, "id", " id %u", field->id);
+		print_uint(PRINT_ANY, "bitwidth", " bitwidth %u", field->bitwidth);
 		if (field->mapping_type) {
 			print_string(PRINT_ANY, "mapping_type", " mapping_type %s",
 				     dpipe_field_mapping_e2s(field->mapping_type));
@@ -4713,7 +4703,7 @@ pr_out_dpipe_header(struct dpipe_ctx *ctx, struct nlattr **tb,
 	check_indent_newline(ctx->dl);
 	print_string(PRINT_ANY, "name", "name %s", header->name);
 	if (ctx->dl->verbose) {
-		pr_out_uint(ctx->dl, "id", header->id);
+		print_uint(PRINT_ANY, "id", " id %u", header->id);
 		print_bool(PRINT_ANY, "global", " global %s", global);
 	}
 	pr_out_array_start(ctx->dl, "field");
@@ -5188,14 +5178,15 @@ static int dpipe_table_show(struct dpipe_ctx *ctx, struct nlattr *nl)
 
 	check_indent_newline(ctx->dl);
 	print_string(PRINT_ANY, "name", "name %s", table->name);
-	pr_out_uint(ctx->dl, "size", size);
+	print_uint(PRINT_ANY, "size", " size %u", size);
 	print_bool(PRINT_ANY, "counters_enabled", " counters_enabled %s", counters_enabled);
 
 	if (resource_valid) {
 		resource_units = mnl_attr_get_u32(nla_table[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS]);
 		resource_path_print(ctx->dl, ctx->resources,
 				    table->resource_id);
-		pr_out_uint(ctx->dl, "resource_units", resource_units);
+		print_uint(PRINT_ANY, "resource_units", " resource_units %u",
+			   resource_units);
 	}
 
 	pr_out_array_start(ctx->dl, "match");
@@ -5478,7 +5469,8 @@ static void __pr_out_entry_value(struct dpipe_ctx *ctx,
 	if (value_len == sizeof(uint32_t)) {
 		uint32_t *value_32 = value;
 
-		pr_out_uint(ctx->dl, dpipe_value_type_e2s(type), *value_32);
+		check_indent_newline(ctx->dl);
+		print_uint_name_value(dpipe_value_type_e2s(type), *value_32);
 	}
 }
 
@@ -5499,7 +5491,8 @@ static void pr_out_dpipe_entry_value(struct dpipe_ctx *ctx,
 
 	if (mapping) {
 		value_mapping = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MAPPING]);
-		pr_out_uint(ctx->dl, "mapping_value", value_mapping);
+		check_indent_newline(ctx->dl);
+		print_uint(PRINT_ANY, "mapping_value", "mapping_value %u", value_mapping);
 	}
 
 	if (mask) {
@@ -5616,12 +5609,13 @@ static int dpipe_entry_show(struct dpipe_ctx *ctx, struct nlattr *nl)
 		return -EINVAL;
 	}
 
+	check_indent_newline(ctx->dl);
 	entry_index = mnl_attr_get_u32(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_INDEX]);
-	pr_out_uint(ctx->dl, "index", entry_index);
+	print_uint(PRINT_ANY, "index", "index %u", entry_index);
 
 	if (nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]) {
 		counter = mnl_attr_get_u64(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]);
-		pr_out_uint(ctx->dl, "counter", counter);
+		print_uint(PRINT_ANY, "counter", " counter %u", counter);
 	}
 
 	pr_out_array_start(ctx->dl, "match_value");
@@ -5875,14 +5869,16 @@ static void resource_show(struct resource *resource,
 	if (resource->size != resource->size_new)
 		pr_out_u64(dl, "size_new", resource->size_new);
 	if (resource->occ_valid)
-		pr_out_uint(dl, "occ", resource->size_occ);
+		print_uint(PRINT_ANY, "occ", " occ %u",  resource->size_occ);
 	print_string(PRINT_ANY, "unit", " unit %s",
 		     resource_unit_str_get(resource->unit));
 
 	if (resource->size_min != resource->size_max) {
-		pr_out_uint(dl, "size_min", resource->size_min);
+		print_uint(PRINT_ANY, "size_min", " size_min %u",
+			   resource->size_min);
 		pr_out_u64(dl, "size_max", resource->size_max);
-		pr_out_uint(dl, "size_gran", resource->size_gran);
+		print_uint(PRINT_ANY, "size_gran", " size_gran %u",
+			   resource->size_gran);
 	}
 
 	list_for_each_entry(table, &ctx->tables->table_list, list)
@@ -6802,8 +6798,8 @@ static void pr_out_health(struct dl *dl, struct nlattr **tb_health)
 		pr_out_u64(dl, "grace_period",
 			   mnl_attr_get_u64(tb[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD]));
 	if (tb[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER])
-		pr_out_bool(dl, "auto_recover",
-			    mnl_attr_get_u8(tb[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER]));
+		print_bool(PRINT_ANY, "auto_recover", " auto_recover %s",
+			   mnl_attr_get_u8(tb[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER]));
 
 	__pr_out_indent_dec();
 	pr_out_handle_end(dl);
@@ -6952,7 +6948,7 @@ static void pr_out_trap(struct dl *dl, struct nlattr **tb, bool array)
 	print_string(PRINT_ANY, "name", "name %s",
 		     mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_NAME]));
 	print_string(PRINT_ANY, "type", " type %s", trap_type_name(type));
-	pr_out_bool(dl, "generic", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
+	print_bool(PRINT_ANY, "generic", " generic %s", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
 	print_string(PRINT_ANY, "action", " action %s", trap_action_name(action));
 	print_string(PRINT_ANY, "group", " group %s",
 		     mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
@@ -7040,7 +7036,7 @@ static void pr_out_trap_group(struct dl *dl, struct nlattr **tb, bool array)
 	check_indent_newline(dl);
 	print_string(PRINT_ANY, "name", "name %s",
 		     mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
-	pr_out_bool(dl, "generic", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
+	print_bool(PRINT_ANY, "generic", " generic %s", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
 	pr_out_stats(dl, tb[DEVLINK_ATTR_STATS]);
 	pr_out_handle_end(dl);
 }
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value
  2020-01-23 10:32 ` [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value Ron Diskin
@ 2020-01-27 13:52   ` Stephen Hemminger
  0 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2020-01-27 13:52 UTC (permalink / raw
  To: Ron Diskin; +Cc: David Ahern, Jiri Pirko, Moshe Shemesh, netdev

On Thu, 23 Jan 2020 12:32:26 +0200
Ron Diskin <rondi@mellanox.com> wrote:

> Until now print_#type functions supported printing constant names and
> unknown (variable) values only.
> Add functions to allow printing when the name is also sent to the
> function as a variable.
> 
> Signed-off-by: Ron Diskin <rondi@mellanox.com>
> Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
> Reviewed-by: Jiri Pirko <jiri@mellanox.com>

Series applied.
I fixed one style complaint from checkpatch by removing semi-colon
in macro.

WARNING: macros should not use a trailing semicolon
#80: FILE: include/json_print.h:75:
+#define _PRINT_NAME_VALUE_FUNC(type_name, type, format_char)		  \
+	void print_##type_name##_name_value(const char *name, type value); \
+


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-01-27 13:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-01-23 10:32 [PATCH iproute2 0/6] devlink: Replace devlink print helper functions with common library functions Ron Diskin
2020-01-23 10:32 ` [PATCH iproute2 1/6] json_print: Introduce print_#type_name_value Ron Diskin
2020-01-27 13:52   ` Stephen Hemminger
2020-01-23 10:32 ` [PATCH iproute2 2/6] json_print: Add new json object function not as array item Ron Diskin
2020-01-23 10:32 ` [PATCH iproute2 3/6] devlink: Replace json prints by common library functions Ron Diskin
2020-01-23 10:32 ` [PATCH iproute2 4/6] devlink: Replace pr_out_str wrapper function with common function Ron Diskin
2020-01-23 10:32 ` [PATCH iproute2 5/6] devlink: Replace pr_#type_value wrapper functions with common functions Ron Diskin
2020-01-23 10:32 ` [PATCH iproute2 6/6] devlink: Replace pr_out_bool/uint() wrappers with common print functions Ron Diskin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.