From owner-freebsd-net@FreeBSD.ORG Mon Jun 25 17:17:43 2007 Return-Path: X-Original-To: freebsd-net@freebsd.org Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 4972816A477 for ; Mon, 25 Jun 2007 17:17:43 +0000 (UTC) (envelope-from julian@elischer.org) Received: from outF.internet-mail-service.net (outF.internet-mail-service.net [216.240.47.229]) by mx1.freebsd.org (Postfix) with ESMTP id 3621913C4D9 for ; Mon, 25 Jun 2007 17:17:43 +0000 (UTC) (envelope-from julian@elischer.org) Received: from mx0.idiom.com (HELO idiom.com) (216.240.32.160) by out.internet-mail-service.net (qpsmtpd/0.32) with ESMTP; Mon, 25 Jun 2007 10:17:43 -0700 Received: from julian-mac.elischer.org (home.elischer.org [216.240.48.38]) by idiom.com (Postfix) with ESMTP id 76C86125B45; Mon, 25 Jun 2007 10:17:42 -0700 (PDT) Message-ID: <467FF8BB.1040507@elischer.org> Date: Mon, 25 Jun 2007 10:17:47 -0700 From: Julian Elischer User-Agent: Thunderbird 2.0.0.4 (Macintosh/20070604) MIME-Version: 1.0 To: Bruce Evans References: <467C727D.4060703@elischer.org> <20070626023944.M82078@besplex.bde.org> In-Reply-To: <20070626023944.M82078@besplex.bde.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: FreeBSD Net Subject: Re: [6.x] problem with AIO, non-blocking sockets on freebSD and IE7 on windows. 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: Mon, 25 Jun 2007 17:17:43 -0000 Bruce Evans wrote: > On Fri, 22 Jun 2007, Julian Elischer wrote: > >> If one has an event-driven process that accepts tcp connections, one >> needs to set eh non-blocking socket option and use kqueue or similar >> to schedule work. >> >> This is ok for data transfers, however when it comes to the close() >> call there is a problem. The problem in in the following code in >> so_close() >> >> >> if (so->so_options & SO_LINGER) { >> if ((so->so_state & SS_ISDISCONNECTING) && >> (so->so_state & SS_NBIO)) >> goto drop; >> ... >> drop: >> [ continues on to destroy socket ] >> >> >> because SS_NBIO is set, the socket acts as if SO_LINGER was set, with >> a timeout of 0. >> the result of this, is the following behaviour: > > [ patckets in flight get lost ] > > This seems to be the correct behaviour. The application doesn't care > about its data and/or wants to close the descriptor without blocking, > so it doesn't turn off the blocking flag and/or wait for i/o to complete > (so that it can see if the i/o actually worked) before calling close(). It's not the correct behaviour if the only packet coming back is an Ack of the FIN (and a FIN) because in the real world, making IE7 throw an error screen is not an acceptable option. This is the sort of thing that gets FreeBSD thrown out on favour of "anything else". Believe me, our customers are "NOT HAPPY" about this. Instead of getting an "authorization required" page along with the opportunity to log in, they get an error, and no opportunity to log in, which makes the system unusable. Yes, Blame Microsoft, but we are breaking the TCP spec, not them. We need to fix this some how. > > I implemented this behaviour for tty drivers in FreeBSD. Old BSD tty > drivers didn't check the nonblocking flag and didn't have a timeout, > so close() on tty devices tended to hang forever (normally at long > weekends) even for closes that should have been nonblocking. > > Bruce