]> git.baikalelectronics.ru Git - kernel.git/commit
Bluetooth: clean up connection in hci_cs_disconnect
authorJoseph Hwang <josephsih@chromium.org>
Thu, 12 Mar 2020 02:20:14 +0000 (19:20 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 12 Mar 2020 07:21:15 +0000 (08:21 +0100)
commitb47a214e0f047a60efee8eb5c32cd6e301a7efe2
tree107aa62255523663a4a7f10cd12df434a4fca3d4
parent3cc569c1b38d961350499863467331220490cd4f
Bluetooth: clean up connection in hci_cs_disconnect

In bluetooth core specification 4.2,
Vol 2, Part E, 7.8.9 LE Set Advertise Enable Command, it says

    The Controller shall continue advertising until ...
    or until a connection is created or ...
    In these cases, advertising is then disabled.

Hence, advertising would be disabled before a connection is
established. In current kernel implementation, advertising would
be re-enabled when all connections are terminated.

The correct disconnection flow looks like

  < HCI Command: Disconnect

  > HCI Event: Command Status
      Status: Success

  > HCI Event: Disconnect Complete
      Status: Success

Specifically, the last Disconnect Complete Event would trigger a
callback function hci_event.c:hci_disconn_complete_evt() to
cleanup the connection and re-enable advertising when proper.

However, sometimes, there might occur an exception in the controller
when disconnection is being executed. The disconnection flow might
then look like

  < HCI Command: Disconnect

  > HCI Event: Command Status
      Status: Unknown Connection Identifier

  Note that "> HCI Event: Disconnect Complete" is missing when such an
exception occurs. This would result in advertising staying disabled
forever since the connection in question is not cleaned up correctly.

To fix the controller exception issue, we need to do some connection
cleanup when the disconnect command status indicates an error.

Signed-off-by: Joseph Hwang <josephsih@chromium.org>
Signed-off-by: Manish Mandlik <mmandlik@google.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/hci_event.c