From e763e3310ec77159fbe02f3b7ac1bde4912072db Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Fri, 20 Jan 2017 15:15:21 +0100 Subject: [PATCH] ipmroute: add support for RTNH_F_UNRESOLVED This patch adds a new field that is printed in the end of the line which denotes the real entry state. Before this patch an entry's IIF could disappear and it would look like an unresolved one (iif = unresolved): (3.0.16.1, 225.11.16.1) Iif: unresolved with no way to really distinguish it from an unresolved entry. After the patch if the dumped entry has RTNH_F_UNRESOLVED set we get: (3.0.16.1, 225.11.16.1) Iif: unresolved State: unresolved for unresolved entries and: (0.0.0.0, 225.11.11.11) Iif: eth4 Oifs: eth3 State: resolved for resolved entries after the OIF list. Note that "State:" has ':' in it so it cannot be mistaken for an interface name. And for the example above, we'd get: (0.0.0.0, 225.11.11.11) Iif: unresolved State: resolved Also when dumping all routes via ip route show table all, it will show up as: multicast 225.11.16.1/32 from 3.0.16.1/32 table default proto 17 unresolved Signed-off-by: Nikolay Aleksandrov Signed-off-by: Stephen Hemminger --- ip/ipmroute.c | 2 ++ ip/iproute.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ip/ipmroute.c b/ip/ipmroute.c index 512afcd2..593ce3a1 100644 --- a/ip/ipmroute.c +++ b/ip/ipmroute.c @@ -159,6 +159,8 @@ int print_mroute(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) nh = RTNH_NEXT(nh); } } + fprintf(fp, " State: %s", + r->rtm_flags & RTNH_F_UNRESOLVED ? "unresolved" : "resolved"); if (show_stats && tb[RTA_MFC_STATS]) { struct rta_mfc_stats *mfcs = RTA_DATA(tb[RTA_MFC_STATS]); diff --git a/ip/iproute.c b/ip/iproute.c index e433de8b..c1957833 100644 --- a/ip/iproute.c +++ b/ip/iproute.c @@ -448,6 +448,8 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) fprintf(fp, "notify "); if (r->rtm_flags & RTNH_F_LINKDOWN) fprintf(fp, "linkdown "); + if (r->rtm_flags & RTNH_F_UNRESOLVED) + fprintf(fp, "unresolved "); if (tb[RTA_MARK]) { unsigned int mark = *(unsigned int *)RTA_DATA(tb[RTA_MARK]);