@@ -250,35 +250,65 @@ ble_eatt_l2cap_event_fn(struct ble_l2cap_event *event, void *arg)
250
250
251
251
switch (event -> type ) {
252
252
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
+
254
257
if (event -> connect .status ) {
258
+ BLE_EATT_LOG_ERROR ("eatt: Connected event status: %d \n" );
255
259
ble_eatt_free (eatt );
256
260
return 0 ;
257
261
}
262
+
258
263
eatt -> chan = event -> connect .chan ;
264
+
265
+ /* Increase used channel number on connected event */
266
+ eatt -> chan_num ++ ;
267
+
259
268
break ;
260
269
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
+ }
263
289
break ;
264
290
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 );
273
294
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 );
275
297
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 ++ ;
277
310
}
278
311
279
- eatt -> conn_handle = event -> accept .conn_handle ;
280
- event -> accept .chan -> cb_arg = eatt ;
281
-
282
312
rc = ble_eatt_prepare_rx_sdu (event -> accept .chan );
283
313
if (rc ) {
284
314
ble_eatt_free (eatt );
@@ -287,9 +317,23 @@ ble_eatt_l2cap_event_fn(struct ble_l2cap_event *event, void *arg)
287
317
288
318
break ;
289
319
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
+
290
327
ble_npl_eventq_put (ble_hs_evq_get (), & eatt -> wakeup_ev );
291
328
break ;
292
329
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
+
293
337
assert (eatt -> chan == event -> receive .chan );
294
338
opcode = event -> receive .sdu_rx -> om_data [0 ];
295
339
if (ble_eatt_supported_rsp (opcode )) {
0 commit comments