Bluetooth: ISO: Handle central disc of pending CIS

If the central disconnects a CIS while it is being
established, then we receive both a CIS established event
with BT_HCI_ERR_OP_CANCELLED_BY_HOST and a disconnect complete
event.

In this case we should not call bt_iso_disconnected in the
CIS established event handler, as that will also be
called from the disconnect complete event handler.

Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
Emil Gydesen 2023-09-05 15:48:20 +02:00 committed by Carles Cufí
commit 1e50132237

View file

@ -1035,8 +1035,14 @@ void hci_le_cis_established(struct net_buf *buf)
/* ISO connection handles are already assigned at this point */
iso = bt_conn_lookup_handle(handle, BT_CONN_TYPE_ISO);
if (!iso) {
LOG_ERR("No connection found for handle %u", handle);
bt_conn_unref(iso);
/* If it is a local disconnect, then we may have received the disconnect complete
* event before this event, and in which case we do not expect to find the CIS
* object
*/
if (evt->status != BT_HCI_ERR_OP_CANCELLED_BY_HOST) {
LOG_ERR("No connection found for handle %u", handle);
}
return;
}
@ -1107,10 +1113,11 @@ void hci_le_cis_established(struct net_buf *buf)
bt_conn_set_state(iso, BT_CONN_CONNECTED);
bt_conn_unref(iso);
return;
}
} else if (evt->status != BT_HCI_ERR_OP_CANCELLED_BY_HOST) {
iso->err = evt->status;
bt_iso_disconnected(iso);
} /* else we wait for disconnect event */
iso->err = evt->status;
bt_iso_disconnected(iso);
bt_conn_unref(iso);
}