diff --git a/sbin/route/route_netlink.c b/sbin/route/route_netlink.c --- a/sbin/route/route_netlink.c +++ b/sbin/route/route_netlink.c @@ -355,7 +355,10 @@ print_getmsg(struct nl_helper *h, struct nlmsghdr *hdr, struct sockaddr *dst) { struct snl_state *ss = &h->ss_cmd; - struct snl_parsed_route r = { .rtax_weight = RT_DEFAULT_WEIGHT }; + struct snl_parsed_route r = { + .rtax_weight = RT_DEFAULT_WEIGHT, + .rta_metric = RT_DEFAULT_METRIC, + }; if (!snl_parse_nlmsg(ss, hdr, &snl_rtm_route_parser, &r)) return; @@ -405,7 +408,10 @@ print_nhop_getmsg(struct nl_helper *h, struct nlmsghdr *hdr, struct sockaddr *dst) { struct snl_state *ss = &h->ss_cmd; - struct snl_parsed_route r = { .rtax_weight = RT_DEFAULT_WEIGHT }; + struct snl_parsed_route r = { + .rtax_weight = RT_DEFAULT_WEIGHT, + .rta_metric = RT_DEFAULT_METRIC, + }; struct snl_parsed_link_simple link = {}; struct sockaddr *mask; @@ -570,7 +576,10 @@ print_nlmsg_route(struct nl_helper *h, struct nlmsghdr *hdr, struct snl_msg_info *cinfo) { - struct snl_parsed_route r = { .rtax_weight = RT_DEFAULT_WEIGHT }; + struct snl_parsed_route r = { + .rtax_weight = RT_DEFAULT_WEIGHT, + .rta_metric = RT_DEFAULT_METRIC, + }; struct snl_state *ss = &h->ss_cmd; if (!snl_parse_nlmsg(ss, hdr, &snl_rtm_route_parser, &r)) @@ -941,7 +950,10 @@ nl_helper_init(&h); while ((hdr = snl_read_reply_multi(&ss, nlm_seq, &e)) != NULL) { - struct snl_parsed_route r = { .rtax_weight = RT_DEFAULT_WEIGHT }; + struct snl_parsed_route r = { + .rtax_weight = RT_DEFAULT_WEIGHT, + .rta_metric = RT_DEFAULT_METRIC, + }; int error; if (!snl_parse_nlmsg(&ss, hdr, &snl_rtm_route_parser, &r)) diff --git a/sys/netlink/route/rt.c b/sys/netlink/route/rt.c --- a/sys/netlink/route/rt.c +++ b/sys/netlink/route/rt.c @@ -224,7 +224,8 @@ nlattr_add_u32(nw, NL_RTA_RTFLAGS, rtflags); if (rtflags & RTF_FIXEDMTU) dump_rc_nhop_mtu(nw, wn[i].nh); - nlattr_add_u32(nw, NL_RTA_PRIORITY, nhop_get_metric(wn[i].nh)); + if (nhop_get_metric(wn[i].nh) != RT_DEFAULT_METRIC) + nlattr_add_u32(nw, NL_RTA_PRIORITY, nhop_get_metric(wn[i].nh)); nh_expire = nhop_get_expire(wn[i].nh); if (nh_expire > 0) nlattr_add_u32(nw, NL_RTA_EXPIRES, nh_expire - time_uptime); @@ -241,7 +242,8 @@ rtnh->rtnh_len = nlattr_save_offset(nw) - nh_off; } nlattr_set_len(nw, off); - nlattr_add_u32(nw, NL_RTA_PRIORITY, nhop_metric); + if (nhop_metric != RT_DEFAULT_METRIC) + nlattr_add_u32(nw, NL_RTA_PRIORITY, nhop_metric); nlattr_add_u32(nw, NL_RTA_WEIGHT, nhop_weight); } @@ -283,7 +285,8 @@ /* In any case, fill outgoing interface */ nlattr_add_u32(nw, NL_RTA_OIF, if_getindex(nh->nh_ifp)); - nlattr_add_u32(nw, NL_RTA_PRIORITY, nhop_get_metric(nh)); + if (nhop_get_metric(nh) != RT_DEFAULT_METRIC) + nlattr_add_u32(nw, NL_RTA_PRIORITY, nhop_get_metric(nh)); if (rnd->rnd_weight != RT_DEFAULT_WEIGHT) nlattr_add_u32(nw, NL_RTA_WEIGHT, rnd->rnd_weight); } diff --git a/usr.bin/netstat/common.h b/usr.bin/netstat/common.h --- a/usr.bin/netstat/common.h +++ b/usr.bin/netstat/common.h @@ -69,6 +69,7 @@ struct ifmap_entry *prepare_ifmap(size_t *ifmap_size); extern const uint32_t rt_default_weight; +extern const uint32_t rt_default_metric; struct rt_msghdr; struct nhops_map { diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c --- a/usr.bin/netstat/route.c +++ b/usr.bin/netstat/route.c @@ -103,6 +103,7 @@ static void domask(char *, size_t, u_long); const uint32_t rt_default_weight = RT_DEFAULT_WEIGHT; +const uint32_t rt_default_metric = RT_DEFAULT_METRIC; /* * Print routing tables. diff --git a/usr.bin/netstat/route_netlink.c b/usr.bin/netstat/route_netlink.c --- a/usr.bin/netstat/route_netlink.c +++ b/usr.bin/netstat/route_netlink.c @@ -234,6 +234,8 @@ return; if (rt.rtax_weight == 0) rt.rtax_weight = rt_default_weight; + if (rt.rta_metric == 0) + rt.rta_metric = rt_default_metric; if (rt.rta_multipath.num_nhops != 0) { uint32_t orig_rtflags = rt.rta_rtflags; @@ -244,7 +246,7 @@ rt.rta_gw = nhop->gw; rt.rta_oif = nhop->ifindex; rt.rtax_weight = nhop->rtnh_weight; - rt.rta_metric = nhop->rta_metric; + rt.rta_metric = nhop->rta_metric != 0 ? nhop->rta_metric : rt_default_metric; rt.rta_rtflags = nhop->rta_rtflags ? nhop->rta_rtflags : orig_rtflags; rt.rtax_mtu = nhop->rtax_mtu ? nhop->rtax_mtu : orig_mtu; rt.rta_expire = nhop->rta_expire;