Wrong outgoing interface with multiple routing tables
Julian Elischer
julian at elischer.org
Tue Jul 28 15:47:00 UTC 2009
Oleg Sharoyko wrote:
> On Mon, 2009-07-27 at 16:24 -0700, Julian Elischer wrote:
>
>>> in addition to the patches already sent you might like to add the
>>> following line to netinet/tcp_input.c
>>>
>>> }
>>> inc.inc_fport = th->th_sport;
>>> inc.inc_lport = th->th_dport;
>>> inc.inc_fibnum = so->so_fibnum; <-------------
>>> /*
>>> * Check for an existing connection attempt in syncache if
>>> * the flag is only ACK. A successful lookup creates a new
>>> * socket appended to the listen queue in SYN_RECEIVED
>>> state.
>>> */
>> in fact you might try just this on its own
>
> With this patch alone all the packets but SYN+ACK are being sent out
> correctly. SYN+ACK still uses wrong interface.
>
> ip_output() uses struct inpcb *inp argument to set fib. But when
> syncache_respond() sends SYN+ACK, ip_output() is being called without
> inp (from netinet/tcp_syncache.c, syncache_respond()):
>
> error = ip_output(m, sc->sc_ipopts, NULL, 0, NULL, NULL);
>
> It I add
> M_SETFIB(m, sc->sc_inc.inc_fibnum);
excellent!
I'll get that checked in!
>
> before the call to ip_output(), then SYN+ACK goes the right way.
>
More information about the freebsd-net
mailing list