# Kconfig - Bluetooth LE stack configuration options

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

comment "Host Stack Configuration"

# Stack size needed for executing bt_send with specified driver
config BLUETOOTH_HCI_TX_STACK_SIZE
	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_HCI_RAW
	bool "RAW HCI access"
	help
	  This option allows to access Bluetooth controller
	  from the application with the RAW HCI protocol.

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

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_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_UART_TO_HOST_DEV_NAME
	string "Device Name of UART Device to an external Bluetooth Host"
	default "UART_0"
	depends on BLUETOOTH_HCI_RAW
	help
	  This option specifies the name of UART device to be used
	  to connect to an external Bluetooth Host when Zephyr is
	  acting as a Bluetooth Controller.

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.

config BLUETOOTH_PERIPHERAL
	bool "Peripheral Role support"
	select BLUETOOTH_CONN
	help
	  Select this for LE Peripheral role support.

config BLUETOOTH_CENTRAL
	bool "Central Role support"
	select BLUETOOTH_CONN
	help
	  Select this for LE Central role support.

config BLUETOOTH_CONN
	bool

if BLUETOOTH_CONN
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_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_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_SMP
	bool "Security Manager Protocol support"
	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.

config BLUETOOTH_MAX_SCO_CONN
	int "Maximum number of simultaneous SCO connections"
	depends on BLUETOOTH_CONN || BLUETOOTH_CONTROLLER
	default 1
	range 1 3
	help
	  Maximum number of simultaneous Bluetooth synchronous connections
	  supported. The minimum (and default) number is 1.

config BLUETOOTH_MAX_CONN
	int "Maximum number of simultaneous connections"
	depends on BLUETOOTH_CONN || BLUETOOTH_CONTROLLER
	default 1
	range 1 64
	help
	  Maximum number of simultaneous Bluetooth connections
	  supported. The minimum (and default) number is 1.

config BLUETOOTH_DEBUG
	bool

choice
	prompt "Bluetooth debug type"
	depends on BLUETOOTH
	default BLUETOOTH_DEBUG_NONE

config BLUETOOTH_DEBUG_NONE
	bool "No debug log"
	help
	  Select this to disable all Bluetooth debug logs.

config BLUETOOTH_DEBUG_LOG
	bool "Normal printf-style to console"
	select BLUETOOTH_DEBUG
	select PRINTK
	select SYS_LOG
	help
	  This option enables Bluetooth debug going to standard
	  serial console.

config BLUETOOTH_DEBUG_MONITOR
	bool "Monitor protocol over UART"
	select BLUETOOTH_DEBUG
	select PRINTK
	select CONSOLE_HAS_DRIVER
	help
	  Use a custom logging protocol over the console UART
	  instead of plain-text output. Requires a special application
	  on the host side that can decode this protocol. Currently
	  the 'btmon' tool from BlueZ is capable of doing this.

	  If the target board has two or more external UARTs it is
	  possible to keep using UART_CONSOLE together with this option,
	  however if there is only a single external UART then
	  UART_CONSOLE needs to be disabled (in which case printk/printf
	  will get encoded into the monitor protocol).

endchoice

config BLUETOOTH_DEBUG_COLOR
	bool "Use colored logs"
	depends on BLUETOOTH_DEBUG_LOG
	select SYS_LOG_SHOW_COLOR
	default y
	help
	  Use color in the logs. This requires an ANSI capable terminal.

config BLUETOOTH_MONITOR_ON_DEV_NAME
	string "Device Name of Bluetooth monitor logging UART"
	depends on BLUETOOTH_DEBUG_MONITOR
	default "UART_0"
	help
	 This option specifies the name of UART device to be used
	 for the Bluetooth monitor logging.

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 optino 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_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
	depends on BLUETOOTH_RFCOMM
	range BLUETOOTH_RX_BUF_LEN 32767
	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
