• David Herrmann's avatar
    Bluetooth: hidp: fix device disconnect on idle timeout · 660f0fc0
    David Herrmann authored
    The HIDP specs define an idle-timeout which automatically disconnects a
    device. This has always been implemented in the HIDP layer and forced a
    synchronous shutdown of the hidp-scheduler. This works just fine, but
    lacks a forced disconnect on the underlying l2cap channels. This has been
    broken since:
    
        commit 5205185d
        Author: David Herrmann <dh.herrmann@gmail.com>
        Date:   Sat Apr 6 20:28:47 2013 +0200
    
            Bluetooth: hidp: remove old session-management
    
    The old session-management always forced an l2cap error on the ctrl/intr
    channels when shutting down. The new session-management skips this, as we
    don't want to enforce channel policy on the caller. In other words, if
    user-space removes an HIDP device, the underlying channels (which are
    *owned* and *referenced* by user-space) are still left active. User-space
    needs to call shutdown(2) or close(2) to release them.
    
    Unfortunately, this does not work with idle-timeouts. There is no way to
    signal user-space that the HIDP layer has been stopped. The API simply
    does not support any event-passing except for poll(2). Hence, we restore
    old behavior and force EUNATCH on the sockets if the HIDP layer is
    disconnected due to idle-timeouts (behavior of explicit disconnects
    remains unmodified). User-space can still call
    
        getsockopt(..., SO_ERROR, ...)
    
    ..to retrieve the EUNATCH error and clear sk_err. Hence, the channels can
    still be re-used (which nobody does so far, though). Therefore, the API
    still supports the new behavior, but with this patch it's also compatible
    to the old implicit channel shutdown.
    
    Cc: <stable@vger.kernel.org> # 3.10+
    Reported-by: default avatarMark Haun <haunma@keteu.org>
    Reported-by: default avatarLuiz Augusto von Dentz <luiz.dentz@gmail.com>
    Signed-off-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    660f0fc0
core.c 38.3 KB