# 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_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_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_DEVICE_NAME_GATT_WRITABLE
config DEVICE_NAME_GATT_WRITABLE_ENCRYPT
	bool "Encryption required to write name by remote GATT clients"
	default y
	help
	  Enabling this option requires the connection to be encrypted to write
	  to the device name GAP characteristic.


config DEVICE_NAME_GATT_WRITABLE_AUTHEN
	bool "Authentication required to write name by remote GATT clients"
	help
	  Enabling this option requires the connection to be encrypted and
	  authenticated to write to the device name GAP characteristic.

endif #BT_DEVICE_NAME_GATT_WRITABLE

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
