diff mbox series

[iproute2-next,1/2] ip/ila: support json and color

Message ID 20180328010745.15270-2-stephen@networkplumber.org
State Accepted, archived
Delegated to: David Ahern
Headers show
Series more JSON support | expand

Commit Message

Stephen Hemminger March 28, 2018, 1:07 a.m. UTC
From: Stephen Hemminger <sthemmin@microsoft.com>

Use json print to enhance ila output.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 ip/ipila.c | 76 ++++++++++++++++++++++++++++++--------------------------------
 1 file changed, 37 insertions(+), 39 deletions(-)
diff mbox series

Patch

diff --git a/ip/ipila.c b/ip/ipila.c
index 9a324296ffd6..370385c0c375 100644
--- a/ip/ipila.c
+++ b/ip/ipila.c
@@ -23,6 +23,7 @@ 
 #include "utils.h"
 #include "ip_common.h"
 #include "ila_common.h"
+#include "json_print.h"
 
 static void usage(void)
 {
@@ -47,9 +48,7 @@  static int genl_family = -1;
 #define ILA_RTA(g) ((struct rtattr *)(((char *)(g)) +	\
 	NLMSG_ALIGN(sizeof(struct genlmsghdr))))
 
-#define ADDR_BUF_SIZE sizeof("xxxx:xxxx:xxxx:xxxx")
-
-static int print_addr64(__u64 addr, char *buff, size_t len)
+static void print_addr64(__u64 addr, char *buff, size_t len)
 {
 	__u16 *words = (__u16 *)&addr;
 	__u16 v;
@@ -64,38 +63,27 @@  static int print_addr64(__u64 addr, char *buff, size_t len)
 			sep = "";
 
 		ret = snprintf(&buff[written], len - written, "%x%s", v, sep);
-		if (ret < 0)
-			return ret;
-
 		written += ret;
 	}
-
-	return written;
 }
 
-static void print_ila_locid(FILE *fp, int attr, struct rtattr *tb[], int space)
+static void print_ila_locid(const char *tag, int attr, struct rtattr *tb[])
 {
 	char abuf[256];
-	size_t blen;
-	int i;
 
-	if (tb[attr]) {
-		blen = print_addr64(rta_getattr_u64(tb[attr]),
-				    abuf, sizeof(abuf));
-		fprintf(fp, "%s", abuf);
-	} else {
-		fprintf(fp, "-");
-		blen = 1;
-	}
+	if (tb[attr])
+		print_addr64(rta_getattr_u64(tb[attr]),
+			     abuf, sizeof(abuf));
+	else
+		snprintf(abuf, sizeof(abuf), "-");
 
-	for (i = 0; i < space - blen; i++)
-		fprintf(fp, " ");
+	/* 20 = sizeof("xxxx:xxxx:xxxx:xxxx") */
+	print_string(PRINT_ANY, tag, "%-20s", abuf);
 }
 
 static int print_ila_mapping(const struct sockaddr_nl *who,
 			     struct nlmsghdr *n, void *arg)
 {
-	FILE *fp = (FILE *)arg;
 	struct genlmsghdr *ghdr;
 	struct rtattr *tb[ILA_ATTR_MAX + 1];
 	int len = n->nlmsg_len;
@@ -110,31 +98,38 @@  static int print_ila_mapping(const struct sockaddr_nl *who,
 	ghdr = NLMSG_DATA(n);
 	parse_rtattr(tb, ILA_ATTR_MAX, (void *) ghdr + GENL_HDRLEN, len);
 
-	print_ila_locid(fp, ILA_ATTR_LOCATOR_MATCH, tb, ADDR_BUF_SIZE);
-	print_ila_locid(fp, ILA_ATTR_LOCATOR, tb, ADDR_BUF_SIZE);
+	open_json_object(NULL);
+	print_ila_locid("locator_match", ILA_ATTR_LOCATOR_MATCH, tb);
+	print_ila_locid("locator", ILA_ATTR_LOCATOR, tb);
 
-	if (tb[ILA_ATTR_IFINDEX])
-		fprintf(fp, "%-16s",
-			ll_index_to_name(rta_getattr_u32(
-						tb[ILA_ATTR_IFINDEX])));
-	else
-		fprintf(fp, "%-10s ", "-");
+	if (tb[ILA_ATTR_IFINDEX]) {
+		__u32 ifindex
+			= rta_getattr_u32(tb[ILA_ATTR_IFINDEX]);
 
-	if (tb[ILA_ATTR_CSUM_MODE])
-		fprintf(fp, "%s",
-			ila_csum_mode2name(rta_getattr_u8(
-						tb[ILA_ATTR_CSUM_MODE])));
-	else
-		fprintf(fp, "%-10s ", "-");
+		print_color_string(PRINT_ANY, COLOR_IFNAME,
+				   "interface", "%-16s",
+				   ll_index_to_name(ifindex));
+	} else {
+		print_string(PRINT_FP, NULL, "%-10s ", "-");
+	}
+
+	if (tb[ILA_ATTR_CSUM_MODE]) {
+		__u8 csum = rta_getattr_u8(tb[ILA_ATTR_CSUM_MODE]);
+
+		print_string(PRINT_ANY, "csum_mode", "%s",
+			     ila_csum_mode2name(csum));
+	} else
+		print_string(PRINT_FP, NULL, "%-10s ", "-");
 
 	if (tb[ILA_ATTR_IDENT_TYPE])
-		fprintf(fp, "%s",
+		print_string(PRINT_ANY, "ident_type", "%s",
 			ila_ident_type2name(rta_getattr_u8(
 						tb[ILA_ATTR_IDENT_TYPE])));
 	else
-		fprintf(fp, "-");
+		print_string(PRINT_FP, NULL, "%s", "-");
 
-	fprintf(fp, "\n");
+	print_string(PRINT_FP, NULL, "%s", _SL_);
+	close_json_object();
 
 	return 0;
 }
@@ -156,10 +151,13 @@  static int do_list(int argc, char **argv)
 		exit(1);
 	}
 
+	new_json_obj(json);
 	if (rtnl_dump_filter(&genl_rth, print_ila_mapping, stdout) < 0) {
 		fprintf(stderr, "Dump terminated\n");
 		return 1;
 	}
+	delete_json_obj();
+	fflush(stdout);
 
 	return 0;
 }