Due to the routing related networking kernel redesign work
in FBSD 8.0, interface routes have been returened to the applications without the RTF_GATEWAY bit. This incompatibility has caused some issues with Zebra, Qugga and the like. This patch provides the RTF_GATEWAY flag bit in returned interface routes so to behave similarly to pre 8.0 systems. Reviewed by: hrs Verified by: mackn at opendns dot com
This commit is contained in:
parent
f33856104f
commit
f672f56f21
@ -185,6 +185,9 @@ struct ortentry {
|
|||||||
|
|
||||||
#define RTF_RNH_LOCKED 0x40000000 /* radix node head is locked */
|
#define RTF_RNH_LOCKED 0x40000000 /* radix node head is locked */
|
||||||
|
|
||||||
|
#define RTF_GWFLAG_COMPAT 0x80000000 /* a compatibility bit for interacting
|
||||||
|
with existing routing apps */
|
||||||
|
|
||||||
/* Mask of RTF flags that are allowed to be modified by RTM_CHANGE. */
|
/* Mask of RTF flags that are allowed to be modified by RTM_CHANGE. */
|
||||||
#define RTF_FMASK \
|
#define RTF_FMASK \
|
||||||
(RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
|
(RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
|
||||||
|
@ -652,8 +652,10 @@ route_output(struct mbuf *m, struct socket *so)
|
|||||||
*/
|
*/
|
||||||
if (gw_ro.ro_rt != NULL &&
|
if (gw_ro.ro_rt != NULL &&
|
||||||
gw_ro.ro_rt->rt_gateway->sa_family == AF_LINK &&
|
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_GATEWAY;
|
||||||
|
info.rti_flags |= RTF_GWFLAG_COMPAT;
|
||||||
|
}
|
||||||
if (gw_ro.ro_rt != NULL)
|
if (gw_ro.ro_rt != NULL)
|
||||||
RTFREE(gw_ro.ro_rt);
|
RTFREE(gw_ro.ro_rt);
|
||||||
}
|
}
|
||||||
@ -853,7 +855,11 @@ route_output(struct mbuf *m, struct socket *so)
|
|||||||
Free(rtm); rtm = new_rtm;
|
Free(rtm); rtm = new_rtm;
|
||||||
}
|
}
|
||||||
(void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, NULL);
|
(void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, NULL);
|
||||||
rtm->rtm_flags = rt->rt_flags;
|
if (rt->rt_flags & RTF_GWFLAG_COMPAT)
|
||||||
|
rtm->rtm_flags = RTF_GATEWAY |
|
||||||
|
(rt->rt_flags & ~RTF_GWFLAG_COMPAT);
|
||||||
|
else
|
||||||
|
rtm->rtm_flags = rt->rt_flags;
|
||||||
rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx);
|
rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx);
|
||||||
rtm->rtm_addrs = info.rti_addrs;
|
rtm->rtm_addrs = info.rti_addrs;
|
||||||
break;
|
break;
|
||||||
@ -905,6 +911,7 @@ route_output(struct mbuf *m, struct socket *so)
|
|||||||
RT_UNLOCK(rt);
|
RT_UNLOCK(rt);
|
||||||
senderr(error);
|
senderr(error);
|
||||||
}
|
}
|
||||||
|
rt->rt_flags &= ~RTF_GATEWAY;
|
||||||
rt->rt_flags |= (RTF_GATEWAY & info.rti_flags);
|
rt->rt_flags |= (RTF_GATEWAY & info.rti_flags);
|
||||||
}
|
}
|
||||||
if (info.rti_ifa != NULL &&
|
if (info.rti_ifa != NULL &&
|
||||||
@ -1591,7 +1598,11 @@ sysctl_dumpentry(struct radix_node *rn, void *vw)
|
|||||||
if (w->w_req && w->w_tmem) {
|
if (w->w_req && w->w_tmem) {
|
||||||
struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem;
|
struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem;
|
||||||
|
|
||||||
rtm->rtm_flags = rt->rt_flags;
|
if (rt->rt_flags & RTF_GWFLAG_COMPAT)
|
||||||
|
rtm->rtm_flags = RTF_GATEWAY |
|
||||||
|
(rt->rt_flags & ~RTF_GWFLAG_COMPAT);
|
||||||
|
else
|
||||||
|
rtm->rtm_flags = rt->rt_flags;
|
||||||
/*
|
/*
|
||||||
* let's be honest about this being a retarded hack
|
* let's be honest about this being a retarded hack
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user