When using l2cap to stream data at a high rate from device to an app we are seeing a hard fault in l2cap_data_pull when there is queued l2cap send data.
When using l2cap to stream data at a high rate from device to an app we are seeing a hard fault in l2cap_data_pull when there is queued l2cap send data.
Hi,
The race condition could be in the your applications, please check if you already do something like in the linked code snippet to avoid calling APIs with the conn pointer while you unref the conn pointer on disconnected:
Regards,
Amanda H.
The bt_l2cap_chan_send function that we use checks the channel connection state. Is that not adequate?
If I add some checks to l2cap_data_pull then I don't see the hard fault:
If your application is calling bt_conn_unref()
from multiple threads/callbacks on a global variable conn
pointer that the application has declared, then every threads/callbacks that pass this global variable conn
pointer will need to take a reference count (call bt_conn_ref()
to ensure the other thread does not unreference this global variable conn
pointer.
We only call bt_conn_ref and hold the conn in one (volatile) global when the connected callback of struct bt_conn_cb is called. That global is zeroed and then bt_conn_unref is called from struct bt_conn_cb disconnected callback. The conn is not referenced when sending. The struct bt_l2cap_le_chan is used when sending. There is only one place that calls bt_l2cap_chan_send. I added a check there that the conn is not zero and it is never zero when bt_l2cap_chan_send is called.