On Tuesday, December 24, 2024 3:34:45 AM UTC Santiago Martinez wrote:
> Hi,
> here’s another user of fibs. Each of our servers have multiple fibs and
> jails with fibs. I like the proposed.
> Santi

Cool. Read on.

On Tuesday, December 24, 2024 5:06:32 AM UTC Jamie Landeg-Jones wrote:
> Paul Vixie <p...@redbarn.org> wrote:
> > ...
> I like that. I isolate 5 seperate networks by assigning a fib to each
> interface, and was initially surprised that I had to jump through ipfw
> hoops to get it to work properly, in fact at the end of my ipfw rules for
> these interfaces, just to guarantee no leaking, ...
> 
> So, yes, I agree that it's crocky, and your proposal is how I originally
> expected it to work, and indeed, I can so no reason for it not to work that
> way, but am prepared to be enlightened if anyone else has an opinion on
> this.
> 
> Jamie

Groovy. See attached patch. This is just for TCP since I have no way to test 
SCTP and I 
think UDP will have to be handled at the application layer. There are two one 
line changes 
here.

First, save the FIB number from the SYN in the syncache. This FIB number was in 
the 
incoming m_pkthdr so I didn't need to change any function signatures. Note that 
if the 
listener socket has a non-zero FIB number it will be used instead of the 
interface FIB 
number -- it's more specific and likely to be right.

Second, when the initial ACK arrives and it's time for the connection to exit 
from the 
syncache and to become a socket, restore the original FIB number and apply it 
to the 
cloned socket, which will already have inherited its FIB number from the 
listener socket.

This works here. The diff is for a 14.2 kernel but is likely backward-portable. 
I'd very much 
like to hear anybody's experience with this patch, or commentary on its 
approach and/or 
advisability.

-- 
Paul Vixie
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 83f85a50e..0e030f24f 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -1057,7 +1057,7 @@ tcp_input_with_port(struct mbuf **mp, int *offp, int proto, uint16_t port)
 		}
 		inc.inc_fport = th->th_sport;
 		inc.inc_lport = th->th_dport;
-		inc.inc_fibnum = so->so_fibnum;
+		inc.inc_fibnum = so->so_fibnum || m->m_pkthdr.fibnum;
 
 		/*
 		 * Check for an existing connection attempt in syncache if
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index 15244a61d..a50648fa5 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -805,6 +805,7 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
 	 */
 	if ((so = solisten_clone(lso)) == NULL)
 		goto allocfail;
+	so->so_fibnum = sc->sc_inc.inc_fibnum;
 #ifdef MAC
 	mac_socketpeer_set_from_mbuf(m, so);
 #endif

Reply via email to