Hi Daryl, > > so this means when we disconnect we must ensure that we also > > remove this > > connection from the accept queue if it is pending there. > > > > What I know think is that calling the bt_accept_unlink() function only > > from bt_accept_dequeue() is wrong. If bt_sk(sk)->parent is set and we > > ran into a disconnect then we must unlink it by ourself. Does > > this make > > sense? > > This makes sense to me, but I'm not convinced that it's enough of a problem > to warrant major changes. And I'm probably not the best person to ask. ;) for the L2CAP part the attached patch may fixes the problem and let the module reference count decrease after the disconnect. The patch is only compile tested. May you wanna give it a chance and run your L2CAP tests again. > Do we know how the tcp stack handles this kind of thing? (I had a quick look > at a text on sockets and it didn't specifically cover the case of > connections getting closed which are in the queue. But it was clear that the > precise behaviour of the queue varies for tcp-ip from unix to unix.) > > Most servers (I think) would sit with accept() blocking and then spend a > very brief time handing off the new connection before blocking on accept() > again. So this wouldn't cause much trouble. > > I suppose this could affect a very simple server which is single-threaded > (and so could spend significant time between accept() calls). Or a very busy > server. I'm not sure that this is really a major issue for bluetooth (the > bandwith and number of real connections is quite limited compared to > tcp-ip). The queueing for the accept case is different and so you can't really compare Bluetooth with TCP/IP. Maybe we made a design mistake in the early days of BlueZ that will now hit us very badly. Regards Marcel