# Kconfig - Bluetooth LE stack configuration options

#
# Copyright (c) 2016-2017 Nordic Semiconductor ASA
# Copyright (c) 2015-2016 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

comment "Host Stack Configuration"

config BLUETOOTH_HCI_HOST
	# Virtual/hidden option to make the conditions more intuitive
	bool
	default y
	depends on !BLUETOOTH_HCI_RAW
	select POLL

config BLUETOOTH_HCI_CMD_COUNT
	int "Number of HCI command buffers"
	default 2
	range 2 64
	help
	  Number of buffers available for HCI commands.

config BLUETOOTH_RX_BUF_COUNT
	int "Number of HCI RX buffers"
	default 10
	default 3 if BLUETOOTH_RECV_IS_RX_THREAD
	range 2 255
	help
	  Number of buffers available for incoming ACL packets or HCI events
	  from the controller.

config BLUETOOTH_RX_BUF_LEN
	int "Maximum supported HCI RX buffer length"
	default 76
	default 264 if BLUETOOTH_BREDR
	range 73 2000
	help
	  Maximum data size for each HCI RX buffer. This size includes
	  everything starting with the ACL or HCI event headers. Note that
	  buffer sizes are always rounded up to the nearest multiple of 4,
	  so if this Kconfig value is something else then there will be some
	  wasted space. The minimum of 73 has been taken for LE SC which has
	  an L2CAP MTU of 65 bytes. On top of this there's the L2CAP header
	  (4 bytes) and the ACL header (also 4 bytes) which yields 73 bytes.

config BLUETOOTH_HCI_TX_STACK_SIZE
	# Stack size needed for executing bt_send with specified driver
	int
	# Even if no driver is selected the following default is still
	# needed e.g. for unit tests.
	default 256
	default 256 if BLUETOOTH_H4
	default 256 if BLUETOOTH_H5
	default 256 if BLUETOOTH_SPI
	default 640 if BLUETOOTH_CONTROLLER

config BLUETOOTH_RECV_IS_RX_THREAD
	# Virtual option set by the HCI driver to indicate that there's
	# no need for the host to have its own RX thread, rather the
	# context that bt_recv() gets called in is already good enough.
	# If this is set, the driver RX thread is required as the first
	# thing to make a call to bt_rx_thread_ready().
	bool

config BLUETOOTH_RX_STACK_SIZE
	int "Size of the receiving thread stack"
	depends on BLUETOOTH_HCI_HOST || BLUETOOTH_RECV_IS_RX_THREAD
	default 1024
	default 512 if CONFIG_BLUETOOTH_HCI_RAW
	range 1024 65536
	range 512 65536 if CONFIG_BLUETOOTH_HCI_RAW
	help
	  Size of the receiving thread stack. This is the context from
	  which all event callbacks to the application occur. The
	  default value is sufficient for basic operation, but if the
	  application needs to do advanced things in its callbacks that
	  require extra stack space, this value can be increased to
	  accommodate for that.

if BLUETOOTH_HCI_HOST
config BLUETOOTH_HOST_CRYPTO
	# Hidden option that compiles in random number generation and AES
	# encryption support using TinyCrypt library if software-based
	# controller is disabled.
	bool
	default y if !BLUETOOTH_CONTROLLER
	select TINYCRYPT
	select TINYCRYPT_AES
	select TINYCRYPT_SHA256
	select TINYCRYPT_SHA256_HMAC
	select TINYCRYPT_SHA256_HMAC_PRNG

config BLUETOOTH_INTERNAL_STORAGE
	bool "Use an internal persistent storage handler"
	depends on FILE_SYSTEM
	depends on PRINTK
	help
	  When selected the application doesn't need to register its own
	  persistent storage handlers through the bt_storage API, rather
	  an internal default handler is used for this.

if BLUETOOTH_CONN

if BLUETOOTH_HCI_ACL_FLOW_CONTROL
config BLUETOOTH_ACL_RX_COUNT
	int "Number of incoming ACL data buffers"
	default 6
	default BLUETOOTH_CONTROLLER_RX_BUFFERS if BLUETOOTH_CONTROLLER
	range 2 64
	help
	  Number of buffers available for incoming ACL data.

config BLUETOOTH_L2CAP_RX_MTU
	int "Maximum supported L2CAP MTU for incoming data"
	default 23
	default 65 if BLUETOOTH_SMP
	default 200 if BLUETOOTH_BREDR
	range 23 1300
	range 65 1300 if BLUETOOTH_SMP
	help
	  Maximum size of each incoming L2CAP PDU.
endif # BLUETOOTH_HCI_ACL_FLOW_CONTROL

config BLUETOOTH_L2CAP_TX_BUF_COUNT
	int "Number of L2CAP TX buffers"
	default 3
	range 2 255
	help
	  Number of buffers available for outgoing L2CAP packets.

config BLUETOOTH_L2CAP_TX_MTU
	int "Maximum supported L2CAP MTU for L2CAP TX buffers"
	default 23
	default 65 if BLUETOOTH_SMP
	default 253 if BLUETOOTH_BREDR
	range 23 2000
	range 65 2000 if BLUETOOTH_SMP
	help
	  Maximum L2CAP MTU for L2CAP TX buffers.

config BLUETOOTH_CONN_TX_MAX
	int "Maximum number of pending TX buffers"
	default 7
	default BLUETOOTH_CONTROLLER_TX_BUFFERS if BLUETOOTH_CONTROLLER
	range 1 128
	help
	  Maximum number of pending TX buffers that have not yet
	  been acknowledged by the controller.

config BLUETOOTH_L2CAP_TX_USER_DATA_SIZE
	int "Maximum supported user data size for L2CAP TX buffers"
	default 4
	range 4 65535
	help
	  Maximum supported user data size for L2CAP TX buffers.

config BLUETOOTH_ATT_ENFORCE_FLOW
	bool "Enforce strict flow control semantics for incoming PDUs"
	default y
	default n if BOARD_QEMU_CORTEX_M3 || BOARD_QEMU_X86
	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 BLUETOOTH_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 BLUETOOTH_ATT_TX_MAX
	int "Maximum number of queued outgoing ATT PDUs"
	default 2
	range 1 BLUETOOTH_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 BLUETOOTH_SMP
	bool "Security Manager Protocol support"
	select BLUETOOTH_RPA
	select TINYCRYPT
	select TINYCRYPT_AES
	select TINYCRYPT_AES_CMAC
	help
	  This option enables support for the Security Manager Protocol
	  (SMP), making it possible to pair devices over LE.

if BLUETOOTH_SMP
config BLUETOOTH_PRIVACY
	bool "Privacy Feature"
	help
	  Enable local Privacy Feature support. This makes it possible
	  to use Resolvable Private Addresses (RPAs).

config BLUETOOTH_RPA_TIMEOUT
	int "Resolvable Private Address timeout"
	depends on BLUETOOTH_PRIVACY
	default 900
	range 1 65535
	help
	  This option defines how often resolvable private address is rotated.
	  Value is provided in seconds and defaults to 900 seconds (15 minutes).

config BLUETOOTH_SIGNING
	bool "Data signing support"
	help
	  This option enables data signing which is used for transferring
	  authenticated data in an unencrypted connection.

config BLUETOOTH_SMP_SC_ONLY
	bool "Secure Connections Only Mode"
	help
	  This option enables support for Secure Connection Only Mode. In this
	  mode device shall only use Security Mode 1 Level 4 with exception
	  for services that only require Security Mode 1 Level 1 (no security).
	  Security Mode 1 Level 4 stands for authenticated LE Secure Connections
	  pairing with encryption. Enabling this option disables legacy pairing.

config BLUETOOTH_USE_DEBUG_KEYS
	bool "Enable Security Manager Debug Mode"
	depends on BLUETOOTH_TINYCRYPT_ECC
	help
	  This option places Security Manager in a Debug Mode. In this mode
	  predefined Diffie-Hellman private/public key pair is used as described
	  in Core Specification Vol. 3, Part H, 2.3.5.6.1. This option should
	  only be enabled for debugging and should never be used in production.
	  If this option is enabled anyone is able to decipher encrypted air
	  traffic.

endif # BLUETOOTH_SMP

config BLUETOOTH_L2CAP_DYNAMIC_CHANNEL
	bool "L2CAP Dynamic Channel support"
	depends on BLUETOOTH_SMP
	help
	  This option enables support for LE Connection oriented Channels,
	  allowing the creation of dynamic L2CAP Channels.

config BLUETOOTH_GATT_DYNAMIC_DB
	bool "GATT dynamic database support"
	help
	  This option enables GATT services to be added dynamically to database.

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

config BLUETOOTH_MAX_PAIRED
	int "Maximum number of paired devices"
	default 1
	range 1 128
	help
	  Maximum number of paired Bluetooth devices. The minimum (and
	  default) number is 1.

endif # BLUETOOTH_CONN

config BLUETOOTH_DEVICE_NAME
	string "Bluetooth device name"
	default "Zephyr"
	help
	  Bluetooth device name. Name can be up to 248 bytes long (excluding
	  NULL termination). Can be empty string.

endif # BLUETOOTH_HCI_HOST

config BLUETOOTH_TINYCRYPT_ECC
	bool "Use TinyCrypt library for ECDH"
	select TINYCRYPT
	select TINYCRYPT_ECC_DH
	depends on BLUETOOTH_HCI_RAW || BLUETOOTH_HCI_HOST
	help
	  If this option is set TinyCrypt library is used for emulating the
	  ECDH HCI commands and events needed by e.g. LE Secure Connections.
	  In builds including the BLE Host, if not set the controller crypto is
	  used for ECDH and if the controller doesn't support the required HCI
	  commands the LE Secure Connections support will be disabled.
	  In builds including the HCI Raw interface and the BLE Controller, this
	  option injects support for the 2 HCI commands required for LE Secure
	  Connections so that Hosts can make use of those.

if BLUETOOTH_DEBUG
config BLUETOOTH_DEBUG_HCI_CORE
	bool "Bluetooth HCI core debug"
	help
	  This option enables debug support for Bluetooth HCI
	  core.

config BLUETOOTH_DEBUG_CONN
	bool "Bluetooth connection debug"
	depends on BLUETOOTH_CONN
	help
	  This option enables debug support for Bluetooth
	  connection handling.

config BLUETOOTH_DEBUG_KEYS
	bool "Bluetooth security keys debug"
	depends on BLUETOOTH_HCI_HOST
	depends on BLUETOOTH_SMP
	help
	  This option enables debug support for the handling of
	  Bluetooth security keys.

config BLUETOOTH_DEBUG_L2CAP
	bool "Bluetooth L2CAP debug"
	depends on BLUETOOTH_CONN
	help
	  This option enables debug support for the Bluetooth
	  L2ACP layer.

config BLUETOOTH_DEBUG_SMP
	bool "Bluetooth Security Manager Protocol (SMP) debug"
	depends on BLUETOOTH_HCI_HOST
	depends on BLUETOOTH_SMP
	help
	  This option enables debug support for the Bluetooth
	  Security Manager Protocol (SMP).

config BLUETOOTH_SMP_SELFTEST
	bool "Bluetooth SMP self tests executed on init"
	depends on BLUETOOTH_DEBUG_SMP
	help
	  This option enables SMP self-tests executed on startup
	  to verify security and crypto functions.

config BLUETOOTH_SMP_FORCE_BREDR
	bool "Force Bluetooth SMP over BR/EDR"
	depends on BLUETOOTH_DEBUG_SMP
	help
	  This option enables SMP over BR/EDR even if controller is not
	  supporting BR/EDR Secure Connections. This option is solely for
	  testing and should never be enabled on production devices.

config BLUETOOTH_DEBUG_ATT
	bool "Bluetooth Attribute Protocol (ATT) debug"
	depends on BLUETOOTH_CONN
	help
	  This option enables debug support for the Bluetooth
	  Attribute Protocol (ATT).

config BLUETOOTH_DEBUG_GATT
	bool "Bluetooth Generic Attribute Profile (GATT) debug"
	depends on BLUETOOTH_CONN
	help
	  This option enables debug support for the Bluetooth
	  Generic Attribute Profile (GATT).

config BLUETOOTH_DEBUG_RFCOMM
	bool "Bluetooth RFCOMM debug"
	depends on BLUETOOTH_RFCOMM
	help
	  This option enables debug support for the Bluetooth
	  RFCOMM layer.

config BLUETOOTH_DEBUG_HFP_HF
	bool "Bluetooth Hands Free Profile (HFP) debug"
	depends on BLUETOOTH_HFP_HF
	help
	  This option enables debug support for the Bluetooth
	  Hands Free Profile (HFP).

config BLUETOOTH_DEBUG_AVDTP
	bool "Bluetooth AVDTP debug"
	depends on BLUETOOTH_AVDTP
	help
	  This option enables debug support for the Bluetooth AVDTP.

config BLUETOOTH_DEBUG_A2DP
	bool "Bluetooth A2DP debug"
	depends on BLUETOOTH_A2DP
	help
	  This option enables debug support for the Bluetooth
	  A2DP profile.

config BLUETOOTH_DEBUG_SDP
	bool "Bluetooth Service Discovery Protocol (SDP) debug"
	depends on BLUETOOTH_BREDR
	help
		This option enables debug support for the Bluetooth
		Service Discovery Protocol (SDP).

endif # BLUETOOTH_DEBUG

config BLUETOOTH_BREDR
	bool "Bluetooth BR/EDR support [EXPERIMENTAL]"
	depends on BLUETOOTH_HCI_HOST
	select BLUETOOTH_PERIPHERAL
	select BLUETOOTH_CENTRAL
	select BLUETOOTH_SMP
	select BLUETOOTH_L2CAP_DYNAMIC_CHANNEL
	help
	  This option enables Bluetooth BR/EDR support"

if BLUETOOTH_BREDR
config BLUETOOTH_MAX_SCO_CONN
	int "Maximum number of simultaneous SCO connections"
	default 1
	range 1 3
	help
	  Maximum number of simultaneous Bluetooth synchronous connections
	  supported. The minimum (and default) number is 1.

config BLUETOOTH_RFCOMM
	bool "Bluetooth RFCOMM protocol support [EXPERIMENTAL]"
	help
	  This option enables Bluetooth RFCOMM support

config BLUETOOTH_RFCOMM_L2CAP_MTU
	int "L2CAP MTU for RFCOMM frames"
	default BLUETOOTH_RX_BUF_LEN
	default BLUETOOTH_L2CAP_RX_MTU if BLUETOOTH_HCI_ACL_FLOW_CONTROL
	depends on BLUETOOTH_RFCOMM
	range BLUETOOTH_RX_BUF_LEN 32767
	range BLUETOOTH_L2CAP_RX_MTU 32767 if BLUETOOTH_HCI_ACL_FLOW_CONTROL
	help
	  Maximum size of L2CAP PDU for RFCOMM frames.

config BLUETOOTH_HFP_HF
	bool "Bluetooth Handsfree profile HF Role support [EXPERIMENTAL]"
	depends on PRINTK
	select BLUETOOTH_RFCOMM
	help
	  This option enables Bluetooth HF support

config BLUETOOTH_AVDTP
	bool "Bluetooth AVDTP protocol support [EXPERIMENTAL]"
	help
	  This option enables Bluetooth AVDTP support

config BLUETOOTH_A2DP
	bool "Bluetooth A2DP Profile [EXPERIMENTAL]"
	select BLUETOOTH_AVDTP
	help
	  This option enables the A2DP profile

config BLUETOOTH_PAGE_TIMEOUT
	hex "Bluetooth Page Timeout"
	default 0x2000
	range 0x0001 0xffff
	help
	  This option sets the page timeout value. Value is selected as
	  (N * 0.625) ms.

endif # BLUETOOTH_BREDR
