Skip to content

Commit 4422aa5

Browse files
nimble/eatt: Introduce handling multiple EATT in event function
Add handling for multiple EATT instances in ble_l2cap_event_fn(). Improve logging by adding infomation with event and cid.
1 parent b0e351b commit 4422aa5

File tree

1 file changed

+60
-16
lines changed

1 file changed

+60
-16
lines changed

nimble/host/src/ble_eatt.c

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -250,35 +250,65 @@ ble_eatt_l2cap_event_fn(struct ble_l2cap_event *event, void *arg)
250250

251251
switch (event->type) {
252252
case BLE_L2CAP_EVENT_COC_CONNECTED:
253-
BLE_EATT_LOG_DEBUG("eatt: Connected \n");
253+
BLE_EATT_LOG_DEBUG("eatt: Connected event | conn_handle: %d | scid: %d | dcid: %d\n",
254+
event->connect.conn_handle, event->connect.chan->scid,
255+
event->connect.chan->dcid);
256+
254257
if (event->connect.status) {
258+
BLE_EATT_LOG_ERROR("eatt: Connected event status: %d \n");
255259
ble_eatt_free(eatt);
256260
return 0;
257261
}
262+
258263
eatt->chan = event->connect.chan;
264+
265+
/* Increase used channel number on connected event */
266+
eatt->chan_num++;
267+
259268
break;
260269
case BLE_L2CAP_EVENT_COC_DISCONNECTED:
261-
BLE_EATT_LOG_DEBUG("eatt: Disconnected \n");
262-
ble_eatt_free(eatt);
270+
BLE_EATT_LOG_DEBUG("eatt: Disconnected event | conn_handle: %d | scid: %d | dcid: %d\n",
271+
event->accept.conn_handle, event->accept.chan->scid,
272+
event->accept.chan->dcid);
273+
274+
eatt = ble_eatt_find(event->disconnect.conn_handle,
275+
event->disconnect.chan->scid);
276+
if (!eatt) {
277+
BLE_EATT_LOG_ERROR("eatt: Disconnected event | No eatt found\n");
278+
return 0;
279+
}
280+
281+
/* Decrease number of channels on disconnect event
282+
* If no channels are left - free the resources
283+
*/
284+
eatt->chan--;
285+
286+
if (eatt->chan == 0) {
287+
ble_eatt_free(eatt);
288+
}
263289
break;
264290
case BLE_L2CAP_EVENT_COC_ACCEPT:
265-
BLE_EATT_LOG_DEBUG("eatt: Accept request\n");
266-
eatt = ble_eatt_find_by_conn_handle(event->accept.conn_handle);
267-
if (eatt) {
268-
/* For now we accept only one additional coc channel per ACL
269-
* TODO: improve it
270-
*/
271-
return BLE_HS_ENOMEM;
272-
}
291+
BLE_EATT_LOG_DEBUG("eatt: Accepted | conn_handle: %d | scid: %d | dcid: %d\n",
292+
event->accept.conn_handle, event->accept.chan->scid,
293+
event->accept.chan->dcid);
273294

274-
eatt = ble_eatt_alloc();
295+
/* Lookup if EATT already exists for this connection */
296+
eatt = ble_eatt_find_by_conn_handle(event->accept.conn_handle);
275297
if (!eatt) {
276-
return BLE_HS_ENOMEM;
298+
eatt = ble_eatt_alloc();
299+
eatt->chan_num++;
300+
} else {
301+
/* Check for free resources for this connection */
302+
free_channels = MYNEWT_VAL(BLE_EATT_CHAN_PER_CONN) - ble_eatt_used_channels(event->accept.conn_handle);
303+
304+
if (free_channels == 0) {
305+
BLE_EATT_LOG_ERROR("eatt: Accepted | No free channel slots\n");
306+
ble_eatt_free(eatt);
307+
return BLE_HS_ENOMEM;
308+
}
309+
eatt->chan_num++;
277310
}
278311

279-
eatt->conn_handle = event->accept.conn_handle;
280-
event->accept.chan->cb_arg = eatt;
281-
282312
rc = ble_eatt_prepare_rx_sdu(event->accept.chan);
283313
if (rc) {
284314
ble_eatt_free(eatt);
@@ -287,9 +317,23 @@ ble_eatt_l2cap_event_fn(struct ble_l2cap_event *event, void *arg)
287317

288318
break;
289319
case BLE_L2CAP_EVENT_COC_TX_UNSTALLED:
320+
eatt = ble_eatt_find(event->tx_unstalled.conn_handle,
321+
event->tx_unstalled.chan->scid);
322+
if (!eatt) {
323+
BLE_EATT_LOG_ERROR("eatt: Unstalled event | EATT not found\n");
324+
return 0;
325+
}
326+
290327
ble_npl_eventq_put(ble_hs_evq_get(), &eatt->wakeup_ev);
291328
break;
292329
case BLE_L2CAP_EVENT_COC_DATA_RECEIVED:
330+
eatt = ble_eatt_find(event->receive.conn_handle,
331+
event->receive.chan->scid);
332+
if (!eatt) {
333+
BLE_EATT_LOG_ERROR("eatt: Data rx event | EATT not found\n");
334+
return 0;
335+
}
336+
293337
assert(eatt->chan == event->receive.chan);
294338
opcode = event->receive.sdu_rx->om_data[0];
295339
if (ble_eatt_supported_rsp(opcode)) {

0 commit comments

Comments
 (0)