[PATCH iproute2-next] ipneigh: add support to print brief output of neigh cache in tabular format
From: Gokul Sivakumar <hidden>
Date: 2021-07-25 15:39:40
Make use of the already available brief flag and print the basic details of the IPv4 or IPv6 neighbour cache in a tabular format for better readability when the brief output is expected. $ ip -br neigh bridge0 172.16.12.100 b0:fc:36:2f:07:43 bridge0 172.16.12.174 8c:16:45:2f:bc:1c bridge0 172.16.12.250 04:d9:f5:c1:0c:74 bridge0 fe80::267b:9f70:745e:d54d b0:fc:36:2f:07:43 bridge0 fd16:a115:6a62:0:8744:efa1:9933:2c4c 8c:16:45:2f:bc:1c bridge0 fe80::6d9:f5ff:fec1:c74 04:d9:f5:c1:0c:74 And add "ip neigh show" to the list of ip sub commands mentioned in the man page that support the brief output in tabular format. Signed-off-by: Gokul Sivakumar <redacted> --- ip/ipneigh.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- man/man8/ip.8 | 2 +- 2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/ip/ipneigh.c b/ip/ipneigh.c
index 2d6b7f58..91c157f9 100644
--- a/ip/ipneigh.c
+++ b/ip/ipneigh.c@@ -251,6 +251,51 @@ static void print_neigh_state(unsigned int nud) close_json_array(PRINT_JSON, NULL); } +static int print_neigh_brief(FILE *fp, struct ndmsg *r, struct rtattr *tb[]) +{ + if (!filter.index && r->ndm_ifindex) { + print_color_string(PRINT_ANY, COLOR_IFNAME, + "dev", "%-16s ", + ll_index_to_name(r->ndm_ifindex)); + } + + if (tb[NDA_DST]) { + const char *dst; + int family = r->ndm_family; + + if (family == AF_BRIDGE) { + if (RTA_PAYLOAD(tb[NDA_DST]) == sizeof(struct in6_addr)) + family = AF_INET6; + else + family = AF_INET; + } + + dst = format_host_rta(family, tb[NDA_DST]); + print_color_string(PRINT_ANY, ifa_family_color(family), + "dst", "%-40s", dst); + } + + if (tb[NDA_LLADDR]) { + const char *lladdr; + + SPRINT_BUF(b1); + + lladdr = ll_addr_n2a(RTA_DATA(tb[NDA_LLADDR]), + RTA_PAYLOAD(tb[NDA_LLADDR]), + ll_index_to_type(r->ndm_ifindex), + b1, sizeof(b1)); + + print_color_string(PRINT_ANY, COLOR_MAC, + "lladdr", "%s", lladdr); + } + + print_string(PRINT_FP, NULL, "%s", "\n"); + close_json_object(); + fflush(fp); + + return 0; +} + int print_neigh(struct nlmsghdr *n, void *arg) { FILE *fp = (FILE *)arg;
@@ -337,6 +382,9 @@ int print_neigh(struct nlmsghdr *n, void *arg) else if (n->nlmsg_type == RTM_GETNEIGH) print_null(PRINT_ANY, "miss", "%s ", "miss"); + if (brief) + return print_neigh_brief(fp, r, tb); + if (tb[NDA_DST]) { const char *dst; int family = r->ndm_family;
@@ -412,7 +460,7 @@ int print_neigh(struct nlmsghdr *n, void *arg) print_string(PRINT_FP, NULL, "\n", ""); close_json_object(); - fflush(stdout); + fflush(fp); return 0; }
diff --git a/man/man8/ip.8 b/man/man8/ip.8
index c9f7671e..3f572889 100644
--- a/man/man8/ip.8
+++ b/man/man8/ip.8@@ -227,7 +227,7 @@ print human readable rates in IEC units (e.g. 1Ki = 1024). .BR "\-br" , " \-brief" Print only basic information in a tabular format for better readability. This option is currently only supported by -.BR "ip addr show " and " ip link show " commands. +.BR "ip addr show ", " ip link show " & " ip neigh show " commands. .TP .BR "\-j", " \-json"
--
2.25.1