# Kconfig - Bluetooth LE stack configuration options

#
# Copyright (c) 2015 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

menuconfig BLUETOOTH
	bool "Bluetooth support"
	default n
	select NANO_TIMEOUTS
	select NET_BUF
	select BLUETOOTH_LE if !BLUETOOTH_STACK_NBLE
	help
	  This option enables Bluetooth support.

choice
	prompt "Bluetooth Stack Selection"
	depends on BLUETOOTH
	default BLUETOOTH_STACK_HCI
	help
	  Select the Bluetooth stack to compile.

config BLUETOOTH_STACK_HCI
	bool "HCI Stack"
	help
	  Select the Bluetooth stack to use with HCI drivers.

config BLUETOOTH_STACK_NBLE
	bool "Nordic BLE Stack"
	help
	  Select the Bluetooth stack to use with Nordic BLE drivers.

endchoice

if BLUETOOTH

comment "HCI Stack Configurations"
	depends on BLUETOOTH_STACK_HCI

config BLUETOOTH_LE
	bool "Bluetooth Low Energy (LE) support"
	default n
	select TINYCRYPT
	select TINYCRYPT_AES if BLUETOOTH_SMP
	select TINYCRYPT_AES_CMAC if BLUETOOTH_SMP
	select TINYCRYPT_SHA256
	select TINYCRYPT_SHA256_HMAC
	select TINYCRYPT_SHA256_HMAC_PRNG
	depends on BLUETOOTH_STACK_HCI
	help
	  This option enables Bluetooth Low Energy (LE) support.
	  Currently it is mandatory whenever Bluetooth support
	  (CONFIG_BLUETOOTH) is enabled.

if BLUETOOTH_LE
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_MAX_CMD_LEN
	int "Maximum supported HCI command length"
	default 64
	range 64 255
	help
	  Maximum length of each HCI command.

config  BLUETOOTH_HCI_EVT_COUNT
	int "Number of HCI event buffers"
	default 8 if BLUETOOTH_CONN
	default 4 if !BLUETOOTH_CONN
	range 2 64
	help
	  Number of buffers available for HCI events. This number should
	  ideally be at least as large as the available outgoing buffers
	  to make sure we've got enough buffers to handle bursts of
	  Number of Completed Packets HCI events.

config  BLUETOOTH_MAX_EVT_LEN
	int "Maximum supported HCI event length"
	default 68 if !BLUETOOTH_BREDR
	default 255 if BLUETOOTH_BREDR
	range 68 255
	help
	  Maximum size of each HCI event buffer. E.g. one big event
	  for LE is the Command Complete for Read Local Supported
	  Commands. It is a 3 byte Command Complete header + 65 byte
	  return parameters = 68 bytes in total.

config  BLUETOOTH_RX_STACK_SIZE
	int "Size of the receiving fiber stack"
	default 1024
	range 1024 65536
	help
	  Size of the receiving fiber 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
	  accomodate for that.

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

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

config BLUETOOTH_CONN
	bool
	default n

if BLUETOOTH_CONN
config  BLUETOOTH_ACL_IN_COUNT
	int "Number of incoming ACL data buffers"
	default 5
	range 2 64
	help
	  Number of buffers available for incoming ACL data.

config  BLUETOOTH_L2CAP_IN_MTU
	int "Maximum supported L2CAP MTU for incoming data"
	default 65 if BLUETOOTH_SMP
	default 23 if !BLUETOOTH_SMP
	range 65 1300 if BLUETOOTH_SMP
	range 23 1300 if !BLUETOOTH_SMP
	help
	  Maximum size of each incoming L2CAP PDU.

config  BLUETOOTH_ATT_MTU
	int "Attribute Protocol (ATT) channel MTU"
	default 50 if BLUETOOTH_SMP # BLUETOOTH_L2CAP_IN_MTU is big enough
				    # for two complete ACL packets
	default 23 if !BLUETOOTH_SMP
	range 23 BLUETOOTH_L2CAP_IN_MTU
	help
	  The MTU for the ATT channel. The minimum and default is 23,
	  whereas the maximum is limited by CONFIG_BLUETOOTH_L2CAP_IN_MTU.

config BLUETOOTH_SMP
	bool "Security Manager Protocol support"
	default n
	help
	  This option enables support for the Security Manager Protocol
	  (SMP), making it possible to pair devices over LE.

if BLUETOOTH_SMP
config BLUETOOTH_SIGNING
	bool "Data signing support"
	default n
	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"
	default n
	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_TINYCRYPT_ECC
	bool "Use TinyCrypt library for LE SC ECDH"
	default n
	select TINYCRYPT_ECC_DH
	help
	  If this option is set TinyCrypt library is also used for LE Secure
	  Connections elliptic curve Diffie-Hellman key agreement. If not set
	  controller crypto is used for ECDH and if controller doesn't support
	  required HCI commands LE Secure Connections support will be disabled.

config	BLUETOOTH_USE_DEBUG_KEYS
	bool "Enable Security Manager Debug Mode"
	default n
	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"
	default n
	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"
	default n
	help
	  This option enables GATT services to be added dynamically to database.

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

config	BLUETOOTH_MAX_CONN
	int "Maximum number of simultaneous connections"
	default 1
	range 1 16
	help
	  Maximum number of simultaneous Bluetooth connections
	  supported. The minimum (and default) number is 1.

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

endif # BLUETOOTH_CONN

endif # BLUETOOTH_LE

config	BLUETOOTH_DEBUG
	bool "Bluetooth debug support"
	select STDOUT_CONSOLE
	default n
	help
	  This option enables Bluetooth debug going to standard
	  serial console.

if BLUETOOTH_DEBUG
config  BLUETOOTH_DEBUG_COLOR
	bool "Use colored logs"
	default y
	help
	  Use color in the logs. This requires an ANSI capable terminal.

config	BLUETOOTH_DEBUG_HCI_CORE
	bool "Bluetooth HCI core debug"
	depends on BLUETOOTH_STACK_HCI
	default n
	help
	  This option enables debug support for Bluetooth HCI
	  core.

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

config	BLUETOOTH_DEBUG_KEYS
	bool "Bluetooth security keys debug"
	depends on BLUETOOTH_STACK_HCI
	depends on BLUETOOTH_SMP
	default n
	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
	default n
	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_STACK_HCI
	depends on BLUETOOTH_SMP
	default n
	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
	default n
	help
	  This option enables SMP self-tests executed on startup
	  to verify security and crypto functions.

config	BLUETOOTH_DEBUG_ATT
	bool "Bluetooth Attribute Protocol (ATT) debug"
	depends on BLUETOOTH_CONN
	default n
	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
	default n
	help
	  This option enables debug support for the Bluetooth
	  Generic Attribute Profile (GATT).

endif # BLUETOOTH_DEBUG

config BLUETOOTH_BREDR
	bool "Bluetooth BR/EDR support [EXPERIMENTAL]"
	default n
	depends on BLUETOOTH_STACK_HCI
	select BLUETOOTH_CONN
	help
	  This option enables Bluetooth BR/EDR support"

endif # BLUETOOTH
