Skip to content

Commit 7093538

Browse files
jori-nordicjhedberg
authored andcommitted
Bluetooth: att: don't re-use the ATT buffer for confirmations
If the peer is a zephyr host, there is no problem, as the Zephyr host limits sending parallel REQs and INDs. But the spec allows sending those in parallel, and it may end up that the re-used REQ buffer hasn't been destroyed when an indication comes. Only re-use the buffer when enqueuing ATT responses. This means that we may run out of buffers if the peer sends too many indications and our application also sends a lot of commands/notifications. The rationale for this is that having to handle a lot of requests is a more plausible scenario (e.g. being discovered by multiple peers) than handling lots of parallel indications. Signed-off-by: Jonathan Rico <[email protected]>
1 parent 3bfeadf commit 7093538

File tree

1 file changed

+5
-3
lines changed
  • subsys/bluetooth/host

1 file changed

+5
-3
lines changed

subsys/bluetooth/host/att.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -670,11 +670,13 @@ static struct net_buf *bt_att_chan_create_pdu(struct bt_att_chan *chan, uint8_t
670670

671671
switch (att_op_get_type(op)) {
672672
case ATT_RESPONSE:
673-
case ATT_CONFIRMATION:
674-
/* Use a timeout only when responding/confirming */
673+
/* Use a timeout only when responding */
675674
timeout = BT_ATT_TIMEOUT;
676675
re_use = true;
677676
break;
677+
case ATT_CONFIRMATION:
678+
timeout = BT_ATT_TIMEOUT;
679+
break;
678680
default:
679681
timeout = K_FOREVER;
680682
}
@@ -701,7 +703,7 @@ static struct net_buf *bt_att_chan_create_pdu(struct bt_att_chan *chan, uint8_t
701703
* This is better than an assert as an assert would
702704
* allow a peer to DoS us.
703705
*/
704-
LOG_ERR("already processing a transaction on chan %p", chan);
706+
LOG_ERR("already processing a REQ/RSP on chan %p", chan);
705707

706708
return NULL;
707709
}

0 commit comments

Comments
 (0)