Currently route messages are sent to all listeners of PF_ROUTE, regardless or which FIB the listener socket was started on.
The upshot of this is that one can't really use routing daemons together with multiple FIBs. The routing daemon sees the messages from the alternate FIBs and rapidly gets confused. In the future, someone might decide to expose FIB numbers in the route messages themselves. This could allow routing daemons to filter them out. Such a solution might be appropriate for FreeBSD 9.x and later, as it would likely break API and ABI. In any case, I'm not really qualified to argue the merits/problems of such an approach, and coding it is beyond my abilities... Attached is a patch which fixes this problem in a simple way. It limits route messages to listening PF_ROUTE sockets on the same FIB that the route message was for. It compiles and works on 7.1+ and 8.0 and CURRENT. FreeBSD PR: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/134931 How can I help this get into FreeBSD? It would be awesome if this fix or one like it made it in before the 8.0 release. Cheers, Stef
--- sys/net/rtsock.c.orig 2009-08-31 15:26:03.000000000 +0000 +++ sys/net/rtsock.c 2009-08-31 16:07:06.000000000 +0000 @@ -777,4 +777,5 @@ } if (m) { + M_SETFIB(m, so->so_fibnum); if (rp) { /* --- sys/net/raw_usrreq.c.orig 2009-08-31 16:04:58.000000000 +0000 +++ sys/net/raw_usrreq.c 2009-08-31 16:05:11.000000000 +0000 @@ -84,4 +84,7 @@ rp->rcb_proto.sp_protocol != proto->sp_protocol) continue; + if (proto->sp_family == PF_ROUTE && rp->rcb_socket && + M_GETFIB (m) != rp->rcb_socket->so_fibnum) + continue; if (last) { struct mbuf *n;
_______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"