Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jun 2007 10:17:47 -0700
From:      Julian Elischer <julian@elischer.org>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        FreeBSD Net <freebsd-net@freebsd.org>
Subject:   Re: [6.x] problem with AIO, non-blocking sockets on freebSD and IE7 on windows.
Message-ID:  <467FF8BB.1040507@elischer.org>
In-Reply-To: <20070626023944.M82078@besplex.bde.org>
References:  <467C727D.4060703@elischer.org> <20070626023944.M82078@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?467FF8BB.1040507>