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
                 */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to