# Bluetooth LE stack configuration options

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

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 768 if BT_HCI_RAW
	default 3092 if BT_MESH_GATT_CLIENT
	default 2048 if BT_MESH
	default 2048 if BT_AUDIO
	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

menu "Bluetooth Host"

if BT_HCI_HOST

rsource "../mesh/Kconfig"
rsource "../audio/Kconfig"

config BT_HOST_CRYPTO
	# Hidden option that compiles in 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

config BT_HOST_CRYPTO_PRNG
	bool "Use Tinycrypt library for random number generation"
	default y
	select TINYCRYPT_SHA256
	select TINYCRYPT_SHA256_HMAC
	select TINYCRYPT_SHA256_HMAC_PRNG
	depends on BT_HOST_CRYPTO
	help
	  When selected, will use tinycrypt library for random number generation.
	  This will consume additional ram, but may speed up the generation of random
	  numbers.

	  Otherwise, random numbers will be generated through multiple HCI calls,
	  which will not consume additional resources, but may take a long time,
	  depending on the length of the random data.
	  This method is generally recommended within 16 bytes.

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
	default y
	help
	  Store Client Configuration Characteristic value right after it has
	  been updated. If the option is disabled, the CCC is only stored on
	  disconnection.

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 "DEPRECATED: Use BT_FILTER_ACCEPT_LIST instead"
	select BT_FILTER_ACCEPT_LIST

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

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

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

config BT_LIM_ADV_TIMEOUT
	int "Timeout for limited advertising in 1s units"
	default 30
	range 1 180
	depends on BT_BROADCASTER
	help
	  After this timeout is reached, advertisement with BT_LE_AD_LIMITED flag
	  set shall be terminated. As per BT Core Spec 5.2, Vol 3, Part C,
	  Appendix A (NORMATIVE): TIMERS AND CONSTANTS it's required to be no more
	  than 180s.

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 "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_info_available connection callback.

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 central role not require the
	  encryption-change event to be received before accepting key-distribution
	  data.
	  It opens up for a potential vulnerability as the central 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_confirm() callback will be called for all incoming pairings.

config BT_USE_DEBUG_KEYS
	bool "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 the oldest key if key storage is full"
	help
	  If a pairing attempt occurs and the key storage is full then the
	  oldest key from the set of not currently in use keys will be selected
	  and overwritten by the pairing device.

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

rsource "Kconfig.l2cap"
rsource "Kconfig.gatt"
rsource "../services/Kconfig"

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

config BT_EXT_SCAN_BUF_SIZE
	int "Maximum advertisement report size"
	depends on BT_EXT_ADV
	range 1 1650
	default 229
	help
	  Maximum size of an advertisement report in octets. If the advertisement
	  provided by the controller is larger than this buffer size,
	  the remaining data will be discarded.

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_DYNAMIC
	bool "Runtime Bluetooth Appearance changing"
	help
	  Enables use of bt_set_appearance.
	  If CONFIG_BT_SETTINGS is set, the appearance is persistently stored.

config BT_DEVICE_APPEARANCE_GATT_WRITABLE
	bool "Allow authenticated peers to set GAP Appearance"
	depends on BT_DEVICE_APPEARANCE_DYNAMIC

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 250
	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 "Direction Finding support [EXPERIMENTAL]"
	select 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.

if BT_DF

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

config BT_DF_CONNECTIONLESS_CTE_TX
	bool "Support for transmission of CTE in connectionless mode"
	help
	  Enable support for transmission of Constant Tone Extension in
	  connectionless mode.

config BT_DF_CONNECTION_CTE_RX
	bool "Support for receive of CTE in connection mode"
	help
	  Enable support for reception and sampling of Constant Tone Extension
	  in connection mode.

config BT_DF_CONNECTION_CTE_TX
	bool "Support for transmission of CTE in connection mode"
	help
	  Enable support for transmission of Constant Tone Extension in
	  connection mode.

config BT_DF_CONNECTION_CTE_REQ
	bool "Support for CTE request procedure in connection mode"
	depends on BT_DF_CONNECTION_CTE_RX
	help
	  Enable support for request of Constant Tone Extension in connection
	  mode.

config BT_DF_CONNECTION_CTE_RSP
	bool "Support for CTE request procedure in connection mode"
	depends on BT_DF_CONNECTION_CTE_TX
	help
	  Enable support for request of Constant Tone Extension in connection
	  mode.

config BT_DF_CTE_RX_AOA
	bool "Antenna switching during CTE reception (AoA) feature"
	depends on BT_DF_CONNECTIONLESS_CTE_RX || BT_DF_CONNECTION_CTE_RX
	default y
	help
	  Enable support for antenna switching during CTE reception.
	  Also known as Angle of Arrival mode.

config BT_DF_CTE_TX_AOD
	bool "Antenna switching during CTE transmission (AoD) feature"
	depends on BT_DF_CONNECTIONLESS_CTE_TX || BT_DF_CONNECTION_CTE_TX
	default y
	help
	  Enable support for antenna switching during CTE transmission.
	  Also known as Angle of Departure mode.

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

endif # BT_DF
endif # BT_HCI_HOST

config BT_ECC
	bool "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 "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.

config BT_PER_ADV_SYNC_BUF_SIZE
	int "Maximum periodic advertising report size"
	depends on BT_PER_ADV_SYNC
	range 0 1650
	default 0
	help
	  Maximum size of a fragmented periodic advertising report. If the periodic
	  advertising report provided by the controller is fragmented and larger
	  than this buffer size, then the data will be discarded.
	  Unfragmented reports are forwarded as they are received.

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 || BT_ISO
	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
	select EXPERIMENTAL
	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]"
	select 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
	select EXPERIMENTAL
	help
	  This option enables Bluetooth HF support

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

config BT_A2DP
	bool "Bluetooth A2DP Profile [EXPERIMENTAL]"
	select BT_AVDTP
	select EXPERIMENTAL
	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

endmenu
