Bluetooth: ATT: remove BT_ATT_ENFORCE_FLOW

Enforcing the peer's behavior is not strictly necessary. All the host
should do is make sure it is resilient to a spec-violating peer.

Moreover, a growing number of platforms were disabling the check, as the
spec allows "batching" HCI num complete packets events, stalling ATT RX.

Signed-off-by: Jonathan Rico <jonathan.rico@nordicsemi.no>
Co-authored-by: Aleksander Wasaznik <aleksander.wasaznik@nordicsemi.no>
This commit is contained in:
Jonathan Rico 2023-11-29 13:14:31 +01:00 committed by Fabio Baltieri
commit ea04fd95f9
4 changed files with 0 additions and 40 deletions

View file

@ -129,11 +129,6 @@ config AIROC_CUSTOM_FIRMWARE_HCD_BLOB
config BT_BUF_CMD_TX_SIZE config BT_BUF_CMD_TX_SIZE
default 255 default 255
# Disable ATT_ENFORCE_FLOW feature, CYW43XX informs about frees buffer
# (HCL Number Of Completed Packets event) after second packet.
config BT_ATT_ENFORCE_FLOW
default n
endif # BT_AIROC endif # BT_AIROC
if BT_PSOC6_BLESS if BT_PSOC6_BLESS

View file

@ -7,5 +7,4 @@ CONFIG_BT_DIS_PNP=n
CONFIG_BT_BAS=y CONFIG_BT_BAS=y
CONFIG_BT_DEVICE_NAME="Zephyr Health Thermometer" CONFIG_BT_DEVICE_NAME="Zephyr Health Thermometer"
CONFIG_BT_DEVICE_APPEARANCE=768 CONFIG_BT_DEVICE_APPEARANCE=768
CONFIG_BT_ATT_ENFORCE_FLOW=n
CONFIG_CBPRINTF_FP_SUPPORT=y CONFIG_CBPRINTF_FP_SUPPORT=y

View file

@ -5,17 +5,6 @@
menu "ATT and GATT Options" menu "ATT and GATT Options"
config BT_ATT_ENFORCE_FLOW
bool "Enforce strict flow control semantics for incoming PDUs"
default y if !(BOARD_QEMU_CORTEX_M3 || BOARD_QEMU_X86 || ARCH_POSIX || BT_SPI_BLUENRG)
help
Enforce flow control rules on incoming PDUs, preventing a peer
from sending new requests until a previous one has been responded
or sending a new indication until a previous one has been
confirmed. This may need to be disabled to avoid potential race
conditions arising from a USB based HCI transport that splits
HCI events and ACL data to separate endpoints.
config BT_ATT_PREPARE_COUNT config BT_ATT_PREPARE_COUNT
int "Number of ATT prepare write buffers" int "Number of ATT prepare write buffers"
default 0 default 0

View file

@ -72,8 +72,6 @@ K_MEM_SLAB_DEFINE(req_slab, sizeof(struct bt_att_req),
CONFIG_BT_L2CAP_TX_BUF_COUNT, __alignof__(struct bt_att_req)); CONFIG_BT_L2CAP_TX_BUF_COUNT, __alignof__(struct bt_att_req));
enum { enum {
ATT_PENDING_RSP,
ATT_PENDING_CFM,
ATT_CONNECTED, ATT_CONNECTED,
ATT_ENHANCED, ATT_ENHANCED,
ATT_PENDING_SENT, ATT_PENDING_SENT,
@ -540,10 +538,6 @@ static void chan_cfm_sent(struct bt_conn *conn, struct bt_att_tx_meta_data *user
LOG_DBG("chan %p", chan); LOG_DBG("chan %p", chan);
if (IS_ENABLED(CONFIG_BT_ATT_ENFORCE_FLOW)) {
atomic_clear_bit(chan->flags, ATT_PENDING_CFM);
}
tx_meta_data_free(data); tx_meta_data_free(data);
} }
@ -554,10 +548,6 @@ static void chan_rsp_sent(struct bt_conn *conn, struct bt_att_tx_meta_data *user
LOG_DBG("chan %p", chan); LOG_DBG("chan %p", chan);
if (IS_ENABLED(CONFIG_BT_ATT_ENFORCE_FLOW)) {
atomic_clear_bit(chan->flags, ATT_PENDING_RSP);
}
tx_meta_data_free(data); tx_meta_data_free(data);
} }
@ -2908,19 +2898,6 @@ static int bt_att_recv(struct bt_l2cap_chan *chan, struct net_buf *buf)
return 0; return 0;
} }
if (IS_ENABLED(CONFIG_BT_ATT_ENFORCE_FLOW)) {
if (handler->type == ATT_REQUEST &&
atomic_test_and_set_bit(att_chan->flags, ATT_PENDING_RSP)) {
LOG_WRN("Ignoring unexpected request");
return 0;
} else if (handler->type == ATT_INDICATION &&
atomic_test_and_set_bit(att_chan->flags,
ATT_PENDING_CFM)) {
LOG_WRN("Ignoring unexpected indication");
return 0;
}
}
if (buf->len < handler->expect_len) { if (buf->len < handler->expect_len) {
LOG_ERR("Invalid len %u for code 0x%02x", buf->len, hdr->code); LOG_ERR("Invalid len %u for code 0x%02x", buf->len, hdr->code);
err = BT_ATT_ERR_INVALID_PDU; err = BT_ATT_ERR_INVALID_PDU;