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:
parent
083d782718
commit
1f483fc618
76
ip/ipila.c
76
ip/ipila.c
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue