diff --git a/sbin/route/route.c b/sbin/route/route.c index 03ff8fb..34ecffc 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -1277,7 +1277,7 @@ const char * const msgtypes[] = { const char metricnames[] = "\011pksent\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire\2hopcount\1mtu"; const char routeflags[] = -"\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE\010MASK_PRESENT\011CLONING\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE\016CLONED\017PROTO2\020PROTO1\023LOCAL\024BROADCAST"; +"\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE\010MASK_PRESENT\011CONNECTED\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE\016CLONED\017PROTO2\020PROTO1\023LOCAL\024BROADCAST"; const char ifnetflags[] = "\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5PTP\6NOTRAILERS\7RUNNING\010NOARP\011PPROMISC\012ALLMULTI\013OACTIVE\014SIMPLEX\015LINK0\016LINK1\017LINK2\020MULTICAST"; const char addrnames[] = diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index c775b94..78de4bf 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -643,8 +643,19 @@ COMPATNAME(route_output)(struct mbuf *m, struct socket *so) senderr(ETOOMANYREFS); } - /* XXX workaround when rt is a cloning route */ - if (rtm->rtm_type == RTM_GET && + /* + * XXX if arp/ndp requests an L2 entry, we have to obtain + * it from lltable while for the route command we have to + * return a route as it is. How to distinguish them? + * For newer arp/ndp, RTF_LLDATA flag set by arp/ndp + * indicates an L2 entry is requested. For old arp/ndp + * binaries, we check RTF_UP flag is NOT set; it works + * by the fact that arp/ndp don't set it while the route + * command sets it. + */ + if (((rtm->rtm_flags & RTF_LLDATA) != 0 || + (rtm->rtm_flags & RTF_UP) == 0) && + rtm->rtm_type == RTM_GET && sockaddr_cmp(rt_getkey(rt), info.rti_info[RTAX_DST]) != 0) { route_get_sdl(rt->rt_ifp, info.rti_info[RTAX_DST], &sdl, &ll_flags); diff --git a/usr.sbin/arp/arp.c b/usr.sbin/arp/arp.c index 6d750ec..fb5ddf5 100644 --- a/usr.sbin/arp/arp.c +++ b/usr.sbin/arp/arp.c @@ -659,6 +659,7 @@ rtmsg(const int s, const int cmd, const struct sockaddr_inarp *sin, rtm->rtm_addrs |= RTA_DST; break; case RTM_GET: + rtm->rtm_flags |= RTF_LLDATA; rtm->rtm_addrs |= RTA_DST | RTA_IFP; } diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index ba6dd0e..e4f46cd 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -825,6 +825,7 @@ rtmsg(int cmd) rtm->rtm_addrs |= RTA_DST; break; case RTM_GET: + rtm->rtm_flags |= RTF_LLDATA; rtm->rtm_addrs |= RTA_DST | RTA_IFP; } #define NEXTADDR(w, s) \