# Bluetooth ATT/GATT configuration options

# Copyright (c) 2019 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

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)
	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
	int "Number of ATT prepare write buffers"
	default 0
	range 0 64
	help
	  Number of buffers available for ATT prepare write, setting
	  this to 0 disables GATT long/reliable writes.

config BT_ATT_TX_MAX
	int "Maximum number of queued outgoing ATT PDUs"
	default BT_L2CAP_TX_BUF_COUNT
	range 1 BT_L2CAP_TX_BUF_COUNT
	help
	  Number of ATT PDUs that can be at a single moment queued for
	  transmission. If the application tries to send more than this
	  amount the calls will block until an existing queued PDU gets
	  sent.

config BT_EATT
	bool "Enhanced ATT Bearers support [EXPERIMENTAL]"
	depends on BT_L2CAP_ECRED
	help
	  This option enables support for Enhanced ATT bearers support. When
	  enabled additional L2CAP channels can be connected as bearers enabling
	  multiple outstanding request.

if BT_EATT

config BT_EATT_MAX
	int "Maximum number of Enhanced ATT bearers"
	default 3
	range 1 16

	help
	  Number of Enhanced ATT bearers available.

config BT_EATT_RX_MTU
	int "Maximum supported Enhanced ATT MTU for incoming data"
	default 70
	range 70 519
	depends on BT_EATT
	help
	  Maximum size incoming PDUs on EATT bearers, value shall include L2CAP
	  headers and SDU length, maximum is limited to 512 bytes payload, which
	  is the maximum size for a GATT attribute, plus 1 byte for ATT opcode.
	  This option influences the stack buffer size and by that may also
	  limit the outgoing MTU.

config BT_EATT_SEC_LEVEL
	int "Enhanced ATT bearer security level"
	default 1
	range 1 4
	help
	  L2CAP server required security level of EATT bearers:
	  Level 1 (BT_SECURITY_L1) = No encryption or authentication required
	  Level 2 (BT_SECURITY_L2) = Only encryption required
	  Level 3 (BT_SECURITY_L3) = Encryption and authentication required
	  Level 4 (BT_SECURITY_L4) = Secure connection required

endif # BT_EATT

config BT_GATT_SERVICE_CHANGED
	bool "GATT Service Changed support"
	default y
	help
	  This option enables support for the service changed characteristic.

config BT_GATT_DYNAMIC_DB
	bool "GATT dynamic database support"
	depends on BT_GATT_SERVICE_CHANGED
	help
	  This option enables registering/unregistering services at runtime.

config BT_GATT_CACHING
	bool "GATT Caching support"
	default y
	depends on BT_GATT_SERVICE_CHANGED
	select TINYCRYPT
	select TINYCRYPT_AES
	select TINYCRYPT_AES_CMAC
	help
	  This option enables support for GATT Caching. When enabled the stack
	  will register Client Supported Features and Database Hash
	  characteristics which can be used by clients to detect if anything has
	  changed on the GATT database.

if BT_GATT_CACHING

config BT_GATT_NOTIFY_MULTIPLE
	bool "GATT Notify Multiple Characteristic Values support"
	depends on BT_GATT_CACHING
	help
	  This option enables support for the GATT Notify Multiple
	  Characteristic Values procedure.

config BT_GATT_ENFORCE_CHANGE_UNAWARE
	bool "GATT Enforce change-unaware state"
	depends on BT_GATT_CACHING
	help
	  When enable this option blocks notification and indications to client
	  to conform to the following statement from the Bluetooth 5.1
	  specification:
	  '...the server shall not send notifications and indications to such
	  a client until it becomes change-aware."
	  In case the service cannot deal with sudden errors (-EAGAIN) then it
	  shall not use this option.

endif # BT_GATT_CACHING

config BT_GATT_CLIENT
	bool "GATT client support"
	help
	  This option enables support for the GATT Client role.

config BT_GATT_READ_MULTIPLE
	bool "GATT Read Multiple Characteristic Values support"
	default y
	help
	  This option enables support for the GATT Read Multiple Characteristic
	  Values procedure.

config BT_GATT_AUTO_DISCOVER_CCC
	bool "Support to automatic discover the CCC handles of characteristics"
	depends on BT_GATT_CLIENT
	help
	  This option enables support for GATT to initiate discovery for CCC
	  handles if the CCC handle is unknown by the application.

config BT_GAP_AUTO_UPDATE_CONN_PARAMS
	bool "Automatic Update of Connection Parameters"
	default y
	depends on BT_PERIPHERAL
	help
	  This option if enabled allows automatically sending request for connection
	  parameters update after GAP recommended 5 seconds of connection as
	  peripheral.

config BT_GAP_PERIPHERAL_PREF_PARAMS
	bool "Configure peripheral preferred connection parameters"
	default y
	depends on BT_PERIPHERAL
	help
	  This allows to configure peripheral preferred connection parameters.
	  Enabling this option results in adding PPCP characteristic in GAP.
	  If disabled it is up to application to set expected connection parameters.

if BT_GAP_PERIPHERAL_PREF_PARAMS
config BT_PERIPHERAL_PREF_MIN_INT
	int "Peripheral preferred minimum connection interval in 1.25ms units"
	default 24
	range 6 65535
	help
	  Range 3200 to 65534 is invalid. 65535 represents no specific value.

config BT_PERIPHERAL_PREF_MAX_INT
	int "Peripheral preferred maximum connection interval in 1.25ms units"
	default 40
	range 6 65535
	help
	  Range 3200 to 65534 is invalid. 65535 represents no specific value.

config BT_PERIPHERAL_PREF_SLAVE_LATENCY
	int "Peripheral preferred slave latency in Connection Intervals"
	default 0
	range 0 499

config BT_PERIPHERAL_PREF_TIMEOUT
	int "Peripheral preferred supervision timeout in 10ms units"
	default 42
	range 10 65535
	help
	  It is up to user to provide valid timeout which pass required minimum
	  value: in milliseconds it shall be larger than
	  "(1+ Conn_Latency) * Conn_Interval_Max * 2"
	  where Conn_Interval_Max is given in milliseconds.
	  Range 3200 to 65534 is invalid. 65535 represents no specific value.
endif # BT_GAP_PERIPHERAL_PREF_PARAMS

config BT_DEVICE_NAME_GATT_WRITABLE
	bool "Allow to write name by remote GATT clients"
	depends on BT_DEVICE_NAME_DYNAMIC
	default y
	help
	  Enabling this option allows remote GATT clients to write to device
	  name GAP characteristic.

if BT_DEBUG

config BT_DEBUG_ATT
	bool "Bluetooth Attribute Protocol (ATT) debug"
	help
	  This option enables debug support for the Bluetooth
	  Attribute Protocol (ATT).

config BT_DEBUG_GATT
	bool "Bluetooth Generic Attribute Profile (GATT) debug"
	help
	  This option enables debug support for the Bluetooth
	  Generic Attribute Profile (GATT).

endif # BT_DEBUG

endmenu
