I missed handling RTM_CHANGES with my changes.
BTW I just finished testing what wasn't working right with my ospfd
setup before and now everything is working properly. Yipee!
dmo
Index: rtsock.c
===================================================================
RCS file: /cvs/src/sys/net/rtsock.c,v
retrieving revision 1.95
diff -u -p rtsock.c
--- rtsock.c 3 Nov 2009 10:59:04 -0000 1.95
+++ rtsock.c 13 Dec 2009 05:01:25 -0000
@@ -490,17 +490,17 @@ route_output(struct mbuf *m, ...)
*/
if (rn_mpath_capable(rnh)) {
/* first find correct priority bucket */
- rn = rn_mpath_prio(rn, prio);
+ rn = rn_mpath_prio_lookup(rn, prio);
rt = (struct rtentry *)rn;
- if (prio != RTP_ANY &&
- (rt->rt_priority & RTP_MASK) != prio) {
+ if (!rn || (prio != RTP_ANY &&
+ (rt->rt_priority & RTP_MASK) != prio)) {
error = ESRCH;
rt->rt_refcnt++;
goto flush;
}
/* if multipath routes */
- if (rn_mpath_next(rn, 0)) {
+ if (rn_mpath_next(rn, 2)) {
if (gate)
rt = rt_mpath_matchgate(rt, gate, prio);
else if (rtm->rtm_type != RTM_GET)
@@ -639,6 +639,19 @@ report:
ifa->ifa_refcnt++;
rt->rt_ifp = ifp;
}
+ }
+
+ /* new gateway, possible link state change */
+ if ((LINK_STATE_IS_UP(ifa->ifa_ifp->if_link_state) ||
+ ifa->ifa_ifp->if_link_state ==
LINK_STATE_UNKNOWN) &&
+ ifa->ifa_ifp->if_flags & IFF_UP) {
+ rt->rt_flags |= RTF_UP;
+ rt->rt_priority &= RTP_MASK;
+ }
+ else {
+ rt->rt_flags &= ~RTF_UP;
+ rtm->rtm_flags &= RTF_UP;
+ rt->rt_priority |= RTP_DOWN;
}
/* XXX Hack to allow some flags to be toggled */