I did find a bug. Not certain wethe rthis is what affects you. We look at fields from rt_msghdr that the RTM_IFINFO messages do not have - they use if_msghdr instead. We do abort on rtm->rtm_errno != 0, but if_msghdr has no errno, so we look at something in the data part instead. Surprising that this didn't bite us before! So we must only do these checks for RTM_ADD/CHANGE/DELETE that actually use rt_msghdr. ospfd has teh same issue.
Index: kroute.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v retrieving revision 1.145 diff -u -p -r1.145 kroute.c --- kroute.c 22 Mar 2006 13:30:35 -0000 1.145 +++ kroute.c 11 Apr 2006 11:07:27 -0000 @@ -2123,21 +2123,23 @@ dispatch_rtmsg(void) lim = buf + n; for (next = buf; next < lim; next += rtm->rtm_msglen) { rtm = (struct rt_msghdr *)next; - sa = (struct sockaddr *)(rtm + 1); - get_rtaddrs(rtm->rtm_addrs, sa, rti_info); - - if (rtm->rtm_pid == kr_state.pid) /* cause by us */ - continue; - - if (rtm->rtm_errno) /* failed attempts... */ - continue; switch (rtm->rtm_type) { case RTM_ADD: case RTM_CHANGE: case RTM_DELETE: + sa = (struct sockaddr *)(rtm + 1); + get_rtaddrs(rtm->rtm_addrs, sa, rti_info); + + if (rtm->rtm_pid == kr_state.pid) /* cause by us */ + continue; + + if (rtm->rtm_errno) /* failed attempts... */ + continue; + if (rtm->rtm_flags & RTF_LLINFO) /* arp cache */ continue; + if (dispatch_rtmsg_addr(rtm, rti_info) == -1) return (-1); break; -- BS Web Services, http://www.bsws.de/ OpenBSD-based Webhosting, Mail Services, Managed Servers, ... Unix is very simple, but it takes a genius to understand the simplicity. (Dennis Ritchie)