From 60078478cf0db8f156e45f12d9c7c52b604df48a Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 23 Jul 2019 11:35:27 -0500 Subject: [PATCH] monitor: Dump RTM_NEWROUTE/DELROUTE/GETROUTE --- monitor/nlmon.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/monitor/nlmon.c b/monitor/nlmon.c index 346b2e9e..68aa9429 100644 --- a/monitor/nlmon.c +++ b/monitor/nlmon.c @@ -5748,6 +5748,23 @@ static struct attr_entry addr_entry[] = { { }, }; +static struct attr_entry route_entry[] = { + { RTA_DST, "Destination Address", ATTR_CUSTOM, + { .function = print_inet_addr } }, + { RTA_SRC, "Source Address", ATTR_CUSTOM, + { .function = print_inet_addr } }, + { RTA_IIF, "Input Interface Index", ATTR_S32 }, + { RTA_OIF, "Output Interface Index", ATTR_S32 }, + { RTA_GATEWAY, "Gateway", ATTR_CUSTOM, + { .function = print_inet_addr } }, + { RTA_PRIORITY, "Priority of the route", ATTR_S32 }, + { RTA_METRICS, "Metric of the route", ATTR_S32 }, + { RTA_TABLE, "Routing Table", ATTR_U32 }, + { RTA_PREFSRC, "Preferred Source", ATTR_CUSTOM, + { .function = print_inet_addr } }, + { }, +}; + static void print_rtnl_attributes(int indent, const struct attr_entry *table, struct rtattr *rt_attr, int len) { @@ -5947,6 +5964,28 @@ static void print_ifaddrmsg(const struct ifaddrmsg *addr) print_field("IFA Flags: %u", addr->ifa_flags); } +static void print_rtmsg(const struct rtmsg *msg) +{ + static struct flag_names rtm_flags[] = { + { RTM_F_NOTIFY, "notify" }, + { RTM_F_CLONED, "cloned" }, + { RTM_F_EQUALIZE, "multipath-equalizer" }, + { }, + }; + char str[256]; + + print_field("RTM Family: %hhu", msg->rtm_family); + print_field("RTM Destination Len: %hhu", msg->rtm_dst_len); + print_field("RTM Source Len: %hhu", msg->rtm_src_len); + print_field("RTM TOS Field: %hhu", msg->rtm_tos); + print_field("RTM Table: %hhu", msg->rtm_table); + print_field("RTM Protocol: %hhu", msg->rtm_protocol); + print_field("RTM Scope: %hhu", msg->rtm_scope); + print_field("RTM Type: %hhu", msg->rtm_type); + flags_str(rtm_flags, str, sizeof(str), msg->rtm_flags); + print_field("RTM Flags: %s", str); +} + static void read_uevent(const char *ifname, int index) { char filename[64], line[128]; @@ -6036,6 +6075,15 @@ static void print_rtm_link(uint16_t type, const struct ifinfomsg *info, int len) } } +static void print_rtm_route(uint16_t type, const struct rtmsg *msg, size_t len) +{ + if (!msg || len < sizeof(struct rtmsg)) + return; + + print_rtmsg(msg); + print_rtnl_attributes(1, route_entry, RTM_RTA(msg), len); +} + static const char *nlmsg_type_to_str(uint32_t msg_type) { const char *str = NULL; @@ -6147,6 +6195,7 @@ static void print_rtnl_msg(const struct timeval *tv, { struct ifinfomsg *info; struct ifaddrmsg *addr; + struct rtmsg *rtm; struct wlan_iface *iface; int len; @@ -6161,6 +6210,24 @@ static void print_rtnl_msg(const struct timeval *tv, print_rtm_link(nlmsg->nlmsg_type, info, len); break; + case RTM_NEWROUTE: + case RTM_GETROUTE: + case RTM_DELROUTE: + rtm = (struct rtmsg *) NLMSG_DATA(nlmsg); + len = RTM_PAYLOAD(nlmsg); + + if (!rtm || len <= (int) sizeof(struct rtmsg)) + return; + + /* Skip 'kernel' and 'default' tables */ + if (rtm->rtm_table == RT_TABLE_LOCAL || + rtm->rtm_table == RT_TABLE_DEFAULT) + return; + + print_nlmsghdr(tv, nlmsg); + print_rtm_route(nlmsg->nlmsg_type, rtm, len); + break; + case RTM_NEWADDR: case RTM_DELADDR: case RTM_GETADDR: @@ -6206,6 +6273,9 @@ void nlmon_print_rtnl(struct nlmon *nlmon, const struct timeval *tv, case RTM_NEWADDR: case RTM_DELADDR: case RTM_GETADDR: + case RTM_NEWROUTE: + case RTM_GETROUTE: + case RTM_DELROUTE: print_rtnl_msg(tv, nlmsg); break; }