Date: Mon, 27 Jul 2009 12:52:42 -0700 From: Julian Elischer <julian@elischer.org> To: Oleg Sharoyko <os@sfedu.ru> Cc: freebsd-net@freebsd.org Subject: Re: Wrong outgoing interface with multiple routing tables Message-ID: <4A6E058A.6060004@elischer.org> In-Reply-To: <4A6DFFA1.1010709@elischer.org> References: <1248704237.96833.127.camel@brain.cc.rsu.ru> <4A6DE356.6040006@elischer.org> <4A6DEE30.6000108@sfedu.ru> <4A6DFFA1.1010709@elischer.org>
next in thread | previous in thread | raw e-mail | index | archive | help
So there are two possible ways a daemon might assign a fib to a socket that it is accepting: 1/ the accept socket could take the FIB of the process. 2/ the accept socket could take the fib of the incoming SYN packet. I chose #1, but it is possible something in changes between 6 and 7 broke the "chain of custody" for the fib. This code is in production in 6.x based systems but was only introduced to FreeBSD in 7.x. The process makes a socket which inherits the fib from it. The socket includes an INET PCB (Protocol Control Block) which gets a copy too.. when "listen() is called and a syn comes in, a new entry is made in the syncache code and this includes a new connection block which is supposed to inherrit the fib number from the originating listen socket. Eventually a new socket is created and it is supposed to inherit teh fibnum from the syncache entry, and to copy it to the inpcb attached to it. It's possible that somewhere this has been broken by changes. but I don't see it right at the moment.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4A6E058A.6060004>