Index: sys/net/route.h =================================================================== --- sys/net/route.h (revision 251615) +++ sys/net/route.h (working copy) @@ -185,6 +185,9 @@ #define RTF_RNH_LOCKED 0x40000000 /* radix node head is locked */ +#define RTF_RTAPP_COMPAT 0x80000000 /* a compatibility bit for interacting + with existing routing apps */ + /* Mask of RTF flags that are allowed to be modified by RTM_CHANGE. */ #define RTF_FMASK \ (RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \ Index: sys/net/rtsock.c =================================================================== --- sys/net/rtsock.c (revision 251615) +++ sys/net/rtsock.c (working copy) @@ -652,8 +652,10 @@ */ if (gw_ro.ro_rt != NULL && gw_ro.ro_rt->rt_gateway->sa_family == AF_LINK && - gw_ro.ro_rt->rt_ifp->if_flags & IFF_LOOPBACK) + gw_ro.ro_rt->rt_ifp->if_flags & IFF_LOOPBACK) { info.rti_flags &= ~RTF_GATEWAY; + info.rti_flags |= RTF_RTAPP_COMPAT; + } if (gw_ro.ro_rt != NULL) RTFREE(gw_ro.ro_rt); } @@ -853,7 +855,11 @@ Free(rtm); rtm = new_rtm; } (void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, NULL); - rtm->rtm_flags = rt->rt_flags; + if (rt->rt_flags & RTF_RTAPP_COMPAT) + rtm->rtm_flags = RTF_GATEWAY | + (rt->rt_flags & ~RTF_RTAPP_COMPAT); + else + rtm->rtm_flags = rt->rt_flags; rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx); rtm->rtm_addrs = info.rti_addrs; break; @@ -905,6 +911,7 @@ RT_UNLOCK(rt); senderr(error); } + rt->rt_flags &= ~RTF_GATEWAY; rt->rt_flags |= (RTF_GATEWAY & info.rti_flags); } if (info.rti_ifa != NULL &&