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"

Reply via email to