svn commit: r252184 - head/sys/net
Qing Li
qingli at FreeBSD.org
Tue Jun 25 00:10:50 UTC 2013
Author: qingli
Date: Tue Jun 25 00:10:49 2013
New Revision: 252184
URL: http://svnweb.freebsd.org/changeset/base/252184
Log:
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
Modified:
head/sys/net/route.h
head/sys/net/rtsock.c
Modified: head/sys/net/route.h
==============================================================================
--- head/sys/net/route.h Mon Jun 24 23:41:16 2013 (r252183)
+++ head/sys/net/route.h Tue Jun 25 00:10:49 2013 (r252184)
@@ -185,6 +185,9 @@ struct ortentry {
#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. */
#define RTF_FMASK \
(RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
Modified: head/sys/net/rtsock.c
==============================================================================
--- head/sys/net/rtsock.c Mon Jun 24 23:41:16 2013 (r252183)
+++ head/sys/net/rtsock.c Tue Jun 25 00:10:49 2013 (r252184)
@@ -652,8 +652,10 @@ route_output(struct mbuf *m, struct sock
*/
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_GWFLAG_COMPAT;
+ }
if (gw_ro.ro_rt != NULL)
RTFREE(gw_ro.ro_rt);
}
@@ -853,7 +855,11 @@ route_output(struct mbuf *m, struct sock
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_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);
rtm->rtm_addrs = info.rti_addrs;
break;
@@ -905,6 +911,7 @@ route_output(struct mbuf *m, struct sock
RT_UNLOCK(rt);
senderr(error);
}
+ rt->rt_flags &= ~RTF_GATEWAY;
rt->rt_flags |= (RTF_GATEWAY & info.rti_flags);
}
if (info.rti_ifa != NULL &&
@@ -1591,7 +1598,11 @@ sysctl_dumpentry(struct radix_node *rn,
if (w->w_req && 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
*/
More information about the svn-src-all
mailing list