ip/ila: support json and color

Use json print to enhance ila output.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Stephen Hemminger 2018-03-27 18:07:44 -07:00 committed by David Ahern
parent 083d782718
commit 1f483fc618
1 changed files with 37 additions and 39 deletions

View File

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