From owner-freebsd-net@FreeBSD.ORG Tue Jul 28 15:46:59 2009 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B9670106566B for ; Tue, 28 Jul 2009 15:46:59 +0000 (UTC) (envelope-from julian@elischer.org) Received: from outM.internet-mail-service.net (outm.internet-mail-service.net [216.240.47.236]) by mx1.freebsd.org (Postfix) with ESMTP id 9E9848FC2E for ; Tue, 28 Jul 2009 15:46:59 +0000 (UTC) (envelope-from julian@elischer.org) Received: from idiom.com (mx0.idiom.com [216.240.32.160]) by out.internet-mail-service.net (Postfix) with ESMTP id 6376AB755C; Tue, 28 Jul 2009 08:46:59 -0700 (PDT) X-Client-Authorized: MaGic Cook1e X-Client-Authorized: MaGic Cook1e Received: from julian-mac.elischer.org (home.elischer.org [216.240.48.38]) by idiom.com (Postfix) with ESMTP id C6A152D6019; Tue, 28 Jul 2009 08:46:58 -0700 (PDT) Message-ID: <4A6F1D76.7040806@elischer.org> Date: Tue, 28 Jul 2009 08:47:02 -0700 From: Julian Elischer User-Agent: Thunderbird 2.0.0.22 (Macintosh/20090605) MIME-Version: 1.0 To: Oleg Sharoyko References: <1248704237.96833.127.camel@brain.cc.rsu.ru> <4A6DE356.6040006@elischer.org> <4A6DEE30.6000108@sfedu.ru> <4A6DFFA1.1010709@elischer.org> <4A6E0121.2020004@sfedu.ru> <4A6E05EC.8050401@elischer.org> <4A6E0A8B.5000103@sfedu.ru> <4A6E2666.2040906@elischer.org> <4A6E3743.7050708@elischer.org> <1248788292.71222.10.camel@brain.cc.rsu.ru> In-Reply-To: <1248788292.71222.10.camel@brain.cc.rsu.ru> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-net@freebsd.org Subject: Re: Wrong outgoing interface with multiple routing tables X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Jul 2009 15:47:00 -0000 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. >