# Bluetooth LE stack configuration options

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

comment "Host Stack Configuration"

config BT_HCI_HOST
	# Hidden option to make the conditions more intuitive
	bool
	default y
	depends on !BT_HCI_RAW
	select POLL


config BT_HCI_TX_STACK_SIZE
	# NOTE: This value is derived from other symbols and should only be
	# changed if required by architecture
	int
	prompt "HCI Tx thread stack size" if BT_HCI_TX_STACK_SIZE_WITH_PROMPT
	default 512 if BT_H4
	default 512 if BT_H5
	default 416 if BT_SPI
	default 940 if BT_CTLR && BT_LL_SW_SPLIT && NO_OPTIMIZATIONS
	default 1024 if BT_CTLR && BT_LL_SW_SPLIT && BT_CENTRAL
	default 640 if BT_CTLR && BT_LL_SW_SPLIT
	default 512 if BT_USERCHAN
	default 640 if BT_STM32_IPM
	# Even if no driver is selected the following default is still
	# needed e.g. for unit tests. This default will also server as
	# the worst-case stack size if an out-of-tree controller is used.
	default 1024
	help
	  Stack size needed for executing bt_send with specified driver.
	  NOTE: This is an advanced setting and should not be changed unless
	  absolutely necessary.  To change this you must first select
	  BT_HCI_TX_STACK_SIZE_WITH_PROMPT.

config BT_HCI_TX_STACK_SIZE_WITH_PROMPT
	bool "Override HCI Tx thread stack size"

config BT_HCI_ECC_STACK_SIZE
	# NOTE: This value is derived from other symbols and should only be
	# changed if required by architecture
	int "HCI ECC thread stack size"
	default 1140
	help
	  NOTE: This is an advanced setting and should not be changed unless
	  absolutely necessary

config BT_HCI_TX_PRIO
	# Hidden option for Co-Operative Tx thread priority
	int
	default 7

config BT_HCI_RESERVE
	int
	default 0 if BT_H4
	default 1 if BT_H5
	default 1 if BT_RPMSG
	default 1 if BT_SPI
	default 1 if BT_STM32_IPM
	default 1 if BT_USERCHAN
	default 1 if BT_ESP32
	# Even if no driver is selected the following default is still
	# needed e.g. for unit tests.
	default 0
	help
	  Headroom that the driver needs for sending and receiving buffers. Add a
	  new 'default' entry for each new driver.

config BT_RECV_IS_RX_THREAD
	# Hidden option set by the HCI driver to indicate that there's
	# no need for the host to have its own RX thread.
	# If this option has been enabled it is then the responsibility of the
	# HCI driver to call bt_recv_prio from a higher priority context than
	# bt_recv in order to avoid deadlocks.
	# If this option is disabled then only bt_recv should be called.
	bool
	prompt "bt_recv is called from RX thread" if BT_NO_DRIVER

config BT_RX_STACK_SIZE
	int "Size of the receiving thread stack"
	depends on BT_HCI_HOST || BT_RECV_IS_RX_THREAD
	default 512 if BT_HCI_RAW
	default 2048 if BT_MESH
	default 2200 if BT_SETTINGS
	default 1024
	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.

config BT_RX_PRIO
	# Hidden option for Co-Operative Rx thread priority
	int
	depends on BT_HCI_HOST || BT_RECV_IS_RX_THREAD
	default 8

config BT_DRIVER_RX_HIGH_PRIO
	# Hidden option for Co-Operative HCI driver RX thread priority
	int
	default 6

if BT_HCI_HOST

config BT_HOST_CRYPTO
	# Hidden option that compiles in random number generation and AES
	# encryption support using TinyCrypt library if this is not provided
	# by the controller implementation.
	bool
	default y if !BT_CTLR_CRYPTO
	select TINYCRYPT
	select TINYCRYPT_AES
	select TINYCRYPT_SHA256
	select TINYCRYPT_SHA256_HMAC
	select TINYCRYPT_SHA256_HMAC_PRNG

config BT_SETTINGS
	bool "Store Bluetooth state and configuration persistently"
	depends on SETTINGS
	select MPU_ALLOW_FLASH_WRITE if ARM_MPU
	help
	  When selected, the Bluetooth stack will take care of storing
	  (and restoring) the Bluetooth state (e.g. pairing keys) and
	  configuration persistently in flash.

	  When this option has been enabled, it's important that the
	  application makes a call to settings_load() after having done
	  all necessary initialization (e.g. calling bt_enable). The
	  reason settings_load() is handled externally to the stack, is
	  that there may be other subsystems using the settings API, in
	  which case it's more efficient to load all settings in one go,
	  instead of each subsystem doing it independently.

if BT_SETTINGS
config BT_SETTINGS_CCC_LAZY_LOADING
	bool "Load CCC values from settings when peer connects"
	depends on BT_CONN
	default y
	help
	  Load Client Configuration Characteristic setting right after a bonded
	  device connects.
	  Disabling this option will increase memory usage as CCC values for all
	  bonded devices will be loaded when calling settings_load.

config BT_SETTINGS_CCC_STORE_ON_WRITE
	bool "Store CCC value immediately after it has been written"
	depends on BT_CONN
	help
	  Store Client Configuration Characteristic value right after it has
	  been updated.

	  By default, CCC is only stored on disconnection.
	  Choosing this option is safer for battery-powered devices or devices
	  that expect to be reset suddenly. However, it requires additional
	  workqueue stack space.

config BT_SETTINGS_USE_PRINTK
	bool "Use snprintk to encode Bluetooth settings key strings"
	depends on SETTINGS && PRINTK
	default y
	help
	  When selected, Bluetooth settings will use snprintk to encode
	  key strings.
	  When not selected, Bluetooth settings will use a faster builtin
	  function to encode the key string. The drawback is that if
	  printk is enabled then the program memory footprint will be larger.
endif # BT_SETTINGS

config BT_WHITELIST
	bool "Enable whitelist support"
	help
	  This option enables the whitelist API. This takes advantage of the
	  whitelisting feature of a BLE controller.
	  The whitelist is a global list and the same whitelist is used
	  by both scanner and advertiser. The whitelist cannot be modified while
	  it is in use.

	  An Advertiser can whitelist which peers can connect or request scan
	  response data.
	  A scanner can whitelist advertiser for which it will generate
	  advertising reports.
	  Connections can be established automatically for whitelisted peers.

	  This options deprecates the bt_le_set_auto_conn API in favor of the
	  bt_conn_create_aute_le API.

if BT_CONN

config BT_CONN_TX_MAX
	int "Maximum number of pending TX buffers with a callback"
	default BT_L2CAP_TX_BUF_COUNT
	range BT_L2CAP_TX_BUF_COUNT 255
	help
	  Maximum number of pending TX buffers that have an associated
	  callback. Normally this can be left to the default value, which
	  is equal to the number of TX buffers in the stack-internal pool.

config BT_USER_PHY_UPDATE
	bool "User control of PHY Update Procedure"
	depends on BT_PHY_UPDATE
	help
	  Enable application access to initiate the PHY Update Procedure.
	  The application can also register a callback to be notified about PHY
	  changes on the connection. The current PHY info is available in the
	  connection info.

config BT_AUTO_PHY_UPDATE
	bool "Auto-initiate PHY Update Procedure"
	depends on BT_PHY_UPDATE
	default y if !BT_USER_PHY_UPDATE
	help
	  Initiate PHY Update Procedure on connection establishment.

	  Disable this if you want the PHY Update Procedure feature supported
	  but want to rely on the remote device to initiate the procedure at its
	  discretion or want to initiate manually.

config BT_USER_DATA_LEN_UPDATE
	bool "User control of Data Length Update Procedure"
	depends on BT_DATA_LEN_UPDATE
	help
	  Enable application access to initiate the Data Length Update
	  Procedure. The application can also a register callback to be notified
	  about Data Length changes on the connection. The current Data Length
	  info is available in the connection info.

config BT_AUTO_DATA_LEN_UPDATE
	bool "Auto-initiate Data Length Update procedure"
	depends on BT_DATA_LEN_UPDATE
	default y if !BT_USER_DATA_LEN_UPDATE
	help
	  Initiate Data Length Update Procedure on connection establishment.

	  Disable this if you want the Data Length Update Procedure feature
	  supported but want to rely on the remote device to initiate the
	  procedure at its discretion or want to initiate manually.

config BT_REMOTE_INFO
	bool "Enable application access to remote information"
	help
	  Enable application access to the remote information available in the
	  stack. The remote information is retrieved once a connection has been
	  established and the application will be notified when this information
	  is available through the remote_version_available connection callback.

config BT_REMOTE_VERSION
	bool "Enable remote version information"
	depends on BT_REMOTE_INFO
	help
	  Enable this to get access to the remote version through
	  the remote_version_available callback. The host will automatically ask
	  the remote device after the connection has been established.

config BT_SMP
	bool "Security Manager Protocol support"
	select TINYCRYPT
	select TINYCRYPT_AES
	select TINYCRYPT_AES_CMAC
	select BT_RPA
	select BT_ECC
	help
	  This option enables support for the Security Manager Protocol
	  (SMP), making it possible to pair devices over LE.

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

config BT_RPA_TIMEOUT
	int "Resolvable Private Address timeout"
	depends on BT_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 BT_SIGNING
	bool "Data signing support"
	help
	  This option enables data signing which is used for transferring
	  authenticated data in an unencrypted connection.

config BT_SMP_APP_PAIRING_ACCEPT
	bool "Accept or reject pairing initiative"
	help
	  When receiving pairing request or pairing response query the
	  application whether to accept to proceed with pairing or not. This is
	  for pairing over SMP and does not affect SSP, which will continue
	  pairing without querying the application.
	  The application can return an error code, which is translated into
	  a SMP return value if the pairing is not allowed.

config BT_SMP_SC_PAIR_ONLY
	bool "Disable legacy pairing"
	help
	  This option disables LE legacy pairing and forces LE secure connection
	  pairing. All Security Mode 1 levels can be used with legacy pairing
	  disabled, but pairing with devices that do not support secure
	  connections pairing will not be supported.
	  To force a higher security level use "Secure Connections Only Mode"

config BT_SMP_SC_ONLY
	bool "Secure Connections Only Mode"
	select BT_SMP_SC_PAIR_ONLY
	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 BT_SMP_OOB_LEGACY_PAIR_ONLY
	bool "Force Out Of Band Legacy pairing"
	depends on !(BT_SMP_SC_PAIR_ONLY || BT_SMP_SC_ONLY)
	help
	  This option disables Legacy and LE SC pairing and forces legacy OOB.

config BT_SMP_DISABLE_LEGACY_JW_PASSKEY
	bool "Forbid usage of insecure legacy pairing methods"
	depends on !(BT_SMP_SC_PAIR_ONLY || BT_SMP_SC_ONLY || \
		     BT_SMP_OOB_LEGACY_PAIR_ONLY)
	help
	  This option disables Just Works and Passkey legacy pairing methods to
	  increase security.

config BT_SMP_ALLOW_UNAUTH_OVERWRITE
	bool "Allow unauthenticated pairing for paired device"
	help
	  This option allows all unauthenticated pairing attempts made by the
	  peer where an unauthenticated bond already exists.
	  This would enable cases where an attacker could copy the peer device
	  address to connect and start an unauthenticated pairing procedure
	  to replace the existing bond. When this option is disabled in order
	  to create a new bond the old bond has to be explicitly deleted with
	  bt_unpair.

config BT_SMP_USB_HCI_CTLR_WORKAROUND
	bool "Workaround for USB HCI controller out-of-order events"
	depends on BT_TESTING
	help
	  This option enables support for USB HCI controllers that sometimes
	  send out-of-order HCI events and ACL Data due to using different USB
	  endpoints.
	  Enabling this option will make the master role not require the
	  encryption-change event to be received before accepting key-distribution
	  data.
	  It opens up for a potential vulnerability as the master cannot detect
	  if the keys are distributed over an encrypted link.

config BT_FIXED_PASSKEY
	bool "Use a fixed passkey for pairing"
	help
	  With this option enabled, the application will be able to call the
	  bt_passkey_set() API to set a fixed passkey. If set, the
	  pairing_confim() callback will be called for all incoming pairings.

config BT_USE_DEBUG_KEYS
	bool "Enable Security Manager Debug Mode"
	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.

	  WARNING: This option enables anyone to decrypt on-air traffic.
	  Use of this feature in production is strongly discouraged.

config BT_BONDABLE
	bool "Bondable Mode"
	default y
	help
	  This option enables support for Bondable Mode. In this mode,
	  Bonding flag in AuthReq of SMP Pairing Request/Response will be set
	  indicating the support for this mode.

config BT_BONDING_REQUIRED
	bool "Always require bonding"
	depends on BT_BONDABLE
	help
	  When this option is enabled remote devices are required to always
	  set the bondable flag in their pairing request. Any other kind of
	  requests will be rejected.

config BT_STORE_DEBUG_KEYS
	bool "Store Debug Mode bonds"
	help
	  This option enables support for storing bonds where either of devices
	  is using the predefined Diffie-Hellman private/public key pair as
	  described in the Core Specification Vol 3, Part H, 2.3.5.6.1.

	  WARNING: This option potentially enables anyone to decrypt on-air
	  traffic.
	  Use of this feature in production is strongly discouraged.

config BT_SMP_ENFORCE_MITM
	bool "Enforce MITM protection"
	default y
	help
	  With this option enabled, the Security Manager will set MITM option in
	  the Authentication Requirements Flags whenever local IO Capabilities
	  allow the generated key to be authenticated.

config BT_OOB_DATA_FIXED
	bool "Use a fixed random number for LESC OOB pairing"
	depends on BT_TESTING
	help
	  With this option enabled, the application will be able to perform LESC
	  pairing with OOB data that consists of fixed random number and confirm
	  value.

	  WARNING: This option stores a hardcoded Out-of-Band value in the image.
	  Use of this feature in production is strongly discouraged.

config BT_KEYS_OVERWRITE_OLDEST
	bool "Overwrite oldest keys with new ones if key storage is full"
	help
	  With this option enabled, if a pairing attempt occurs and the key storage
	  is full, then the oldest keys in storage will be removed to free space
	  for the new pairing keys.

config BT_KEYS_SAVE_AGING_COUNTER_ON_PAIRING
	bool "Store aging counter every time a successful paring occurs"
	depends on BT_SETTINGS && BT_KEYS_OVERWRITE_OLDEST
	help
	  With this option enabled, aging counter will be stored in settings every
	  time a successful pairing occurs. This increases flash wear out but offers
	  a more correct finding of the oldest unused pairing info.

config BT_SMP_MIN_ENC_KEY_SIZE
	int
	prompt "Minimum encryption key size accepted in octets" if !BT_SMP_SC_ONLY
	range 7 16
	default 7
	default 16 if BT_SMP_SC_ONLY
	help
	  This option sets the minimum encryption key size accepted during pairing.

endif # BT_SMP

source "subsys/bluetooth/host/Kconfig.l2cap"
source "subsys/bluetooth/host/Kconfig.gatt"

config BT_MAX_PAIRED
	int "Maximum number of paired devices"
	default 0 if !BT_SMP
	default 1
	range 0 128
	help
	  Maximum number of paired Bluetooth devices. The minimum (and
	  default) number is 1.

config BT_CREATE_CONN_TIMEOUT
	int "Timeout for pending LE Create Connection command in seconds"
	default 3
	range 1 BT_RPA_TIMEOUT if BT_PRIVACY && (BT_RPA_TIMEOUT < 655)
	range 1 655

config BT_CONN_PARAM_UPDATE_TIMEOUT
	int "Peripheral connection parameter update timeout in milliseconds"
	default 5000
	range 0 65535

	help
	  The value is a timeout used by peripheral device to wait until it
	  starts the first connection parameters update procedure after a
	  connection has been established.
	  The connection parameters requested will be the parameters set by the
	  application, or the peripheral preferred connection parameters if
	  configured.
	  The default value is set to 5 seconds, to comply with the Bluetooth
	  Core specification: Core 4.2 Vol 3, Part C, 9.3.12.2:
	  "The Peripheral device should not perform a Connection Parameter
	  Update procedure within 5 seconds after establishing a connection."

endif # BT_CONN

if BT_OBSERVER
config BT_BACKGROUND_SCAN_INTERVAL
	int "Scan interval used for background scanning in 0.625 ms units"
	default 2048
	range 4 16384
config BT_BACKGROUND_SCAN_WINDOW
	int "Scan window used for background scanning in 0.625 ms units"
	default 18
	range 4 16384
endif # BT_OBSERVER

config BT_SCAN_WITH_IDENTITY
	bool "Perform active scanning using local identity address"
	depends on !BT_PRIVACY && (BT_CENTRAL || BT_OBSERVER)
	help
	  Enable this if you want to perform active scanning using the local
	  identity address as the scanner address. By default the stack will
	  always use a non-resolvable private address (NRPA) in order to avoid
	  disclosing local identity information. By not scanning with the
	  identity address the scanner will receive directed advertise reports
	  for for the local identity. If this use case is required, then enable
	  this option.

config BT_DEVICE_NAME_DYNAMIC
	bool "Allow to set Bluetooth device name on runtime"
	help
	  Enabling this option allows for runtime configuration of Bluetooth
	  device name.

config BT_DEVICE_NAME_MAX
	int "Maximum size in bytes for device name"
	depends on BT_DEVICE_NAME_DYNAMIC
	default 28
	range 2 248
	help
	  Bluetooth device name storage size. Storage can be up to 248 bytes
	  long (excluding NULL termination).

config BT_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.

config BT_DEVICE_APPEARANCE
	int "Bluetooth device appearance"
	range 0 65535
	default 0
	help
	  Bluetooth device appearance. For the list of possible values please
	  consult the following link:
	  https://www.bluetooth.com/specifications/assigned-numbers

config BT_ID_MAX
	int "Maximum number of local identities"
	range 1 10
	default 1
	help
	  Maximum number of supported local identity addresses. For most
	  products this is safe to leave as the default value (1).

config BT_DF
	bool "Enable Direction Finding support [EXPERIMENTAL]"
	help
	  Enable support for Bluetooth 5.1 Direction Finding.
	  It will allow to: get information about antennae, configure
	  Constant Tone Extension, transmit CTE and sample incoming CTE.

config BT_DF_CONNECTIONLESS_CTE_RX
	bool "Enable support for receive of CTE in connectionless mode"
	depends on BT_DF
	help
	  Enable support for reception and sampling of Constant Tone Extension
	  in connectionless mode.

config BT_DEBUG_DF
	bool "Bluetooth Direction Finding debug"
	depends on BT_DF
	help
	  This option enables debug support for Bluetooth Direction Finding

endif # BT_HCI_HOST

config BT_ECC
	bool "Enable ECDH key generation support"
	default y if BT_MESH_PROV || (BT_SMP && !BT_SMP_OOB_LEGACY_PAIR_ONLY)
	help
	  This option adds support for ECDH HCI commands.

config BT_TINYCRYPT_ECC
	bool "Emulate ECDH in the Host using TinyCrypt library"
	select TINYCRYPT
	select TINYCRYPT_ECC_DH
	depends on BT_ECC && (BT_HCI_RAW || BT_HCI_HOST)
	default y if BT_CTLR && !BT_CTLR_ECDH
	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. The option defaults
	  to enabled for a combined build with Zephyr's own controller, since it
	  does not have any special ECC support itself (at least not currently).

config BT_HOST_CCM
	bool "Enable host side AES-CCM module"
	help
	  Enables the software based AES-CCM engine in the host. Will use the
	  controller's AES encryption functions if available, or BT_HOST_CRYPTO
	  otherwise.

if BT_DEBUG
config BT_DEBUG_SETTINGS
	bool "Bluetooth storage debug"
	depends on BT_SETTINGS
	help
	  This option enables debug support for Bluetooth storage.

config BT_DEBUG_HCI_CORE
	bool "Bluetooth HCI core debug"
	help
	  This option enables debug support for Bluetooth HCI
	  core.

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

config BT_DEBUG_ISO
	bool "ISO channel debug"
	help
	  Use this option to enable ISO channels debug logs for the
	  Bluetooth Audio functionality.

config BT_DEBUG_KEYS
	bool "Bluetooth security keys debug"
	depends on BT_HCI_HOST
	depends on BT_SMP
	help
	  This option enables debug support for the handling of
	  Bluetooth security keys.

	  WARNING: This option prints out private security keys such as
	  the Long Term Key.
	  Use of this feature in production is strongly discouraged.

config BT_DEBUG_SMP
	bool "Bluetooth Security Manager Protocol (SMP) debug"
	depends on BT_HCI_HOST
	depends on BT_SMP
	help
	  This option enables debug support for the Bluetooth
	  Security Manager Protocol (SMP).

	  WARNING: This option prints out private security keys such as
	  the Long Term Key.
	  Use of this feature in production is strongly discouraged.

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

config BT_SMP_FORCE_BREDR
	bool "Force Bluetooth SMP over BR/EDR"
	depends on BT_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 BT_DEBUG_RFCOMM
	bool "Bluetooth RFCOMM debug"
	depends on BT_RFCOMM
	help
	  This option enables debug support for the Bluetooth
	  RFCOMM layer.

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

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

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

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

config BT_DEBUG_SERVICE
	bool "Bluetooth Services debug"
	depends on BT_CONN
	help
	  This option enables debug support for the Bluetooth
	  Services.

endif # BT_DEBUG

config BT_LOG_SNIFFER_INFO
	bool "Bluetooth log information for sniffer"
	help
	  This option enables the Bluetooth stack to log information such as
	  DH private key and LTK keys, which can be used by sniffers to decrypt
	  the connection without the use of Debug keys.

	  WARNING: This option prints out private security keys such as
	  the Long Term Key.
	  Use of this feature in production is strongly discouraged

config BT_TESTING
	bool "Bluetooth Testing"
	help
	  This option enables custom Bluetooth testing interface.
	  Shall only be used for testing purposes.

config BT_CONN_DISABLE_SECURITY
	bool "Disable security"
	depends on BT_TESTING
	help
	  This option disables security checks for incoming requests enabling
	  to test accessing GATT attributes and L2CAP channels that would
	  otherwise require encryption/authentication in order to be accessed.

	  WARNING: This option enables anyone to snoop on-air traffic.
	  Use of this feature in production is strongly discouraged.

config BT_BREDR
	bool "Bluetooth BR/EDR support [EXPERIMENTAL]"
	depends on BT_HCI_HOST
	select BT_PERIPHERAL
	select BT_CENTRAL
	select BT_SMP
	select BT_L2CAP_DYNAMIC_CHANNEL
	help
	  This option enables Bluetooth BR/EDR support

if BT_BREDR
config BT_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 BT_RFCOMM
	bool "Bluetooth RFCOMM protocol support [EXPERIMENTAL]"
	help
	  This option enables Bluetooth RFCOMM support

config BT_RFCOMM_L2CAP_MTU
	int "L2CAP MTU for RFCOMM frames"
	depends on BT_RFCOMM
	# RX MTU will be truncated to account for the L2CAP PDU header.
	default BT_BUF_ACL_RX_SIZE
	range 23 32767
	help
	  Maximum size of L2CAP PDU for RFCOMM frames.

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

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

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

config BT_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 # BT_BREDR

config BT_HCI_VS_EVT_USER
	bool "User Vendor-Specific event handling"
	help
	  Enable registering a callback for delegating to the user the handling of
	  VS events that are not known to the stack
