# Bluetooth common configuration options

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

menu "Bluetooth buffer configuration"

config BT_BUF_ACL_TX_SIZE
	int "Maximum supported ACL size for outgoing data"
	range 27 $(UINT16_MAX)
	default 37 if BT_MESH_GATT
	default 27
	help
	  Maximum supported ACL size of data packets sent from the Host to the
	  Controller. This value does not include the HCI ACL header.

	  In a combined build this value will be set in both the Host and the
	  Controller.

	  In a Host-only build the Host will read the maximum ACL size supported
	  by the Controller and use the smallest value supported by both the
	  Host and the Controller.

	  The Host supports sending of larger L2CAP PDUs than the ACL size and
	  will fragment L2CAP PDUs into ACL data packets.
	  The Controller will return this value in the HCI LE Read Buffer
	  Size command response. If this size if greater than effective Link
	  Layer transmission size then the Controller will perform
	  fragmentation before transmitting the packet(s) on air.
	  If this value is less than the effective Link Layer transmission size
	  then this will restrict the maximum Link Layer transmission size.

config BT_BUF_ACL_TX_COUNT
	int "Number of outgoing ACL data buffers"
	default 7 if BT_HCI_RAW
	default 4 if BT_MESH_GATT
	default 3
	range 1 $(UINT8_MAX)
	help
	  Number of outgoing ACL data buffers sent from the Host to the
	  Controller. This determines the maximum amount of data packets the
	  Host can have queued in the Controller before waiting for the
	  to notify the Host that more packets can be queued with the Number of
	  Completed Packets event.
	  The buffers are shared between all of the connections and the Host
	  determines how to divide the buffers between the connections.
	  The Controller will return this value in the HCI LE Read Buffer Size
	  command response.

config BT_BUF_ACL_RX_SIZE
	int "Maximum supported ACL size for incoming data"
	default 200 if BT_CLASSIC
	default 70 if BT_EATT
	default 69 if BT_SMP
	default 37 if BT_MESH_GATT
	default 27
	range 70 $(UINT16_MAX) if BT_EATT
	range 69 $(UINT16_MAX) if BT_SMP
	range 27 $(UINT16_MAX)
	help
	  Maximum support ACL size of data packets sent from the Controller to
	  the Host. This value does not include the HCI ACL header.

	  In a combined Host and Controller build, both the
	  Host and the Controller will use this value for buffer sizes, making
	  Controller to Host flow control not strictly necessary.

	  In a Host only build with Controller to Host flow control enabled
	  the Host will inform the Controller about the maximum ACL data size it
	  can send by setting this value in the Host Buffer Size command.

	  If Controller to Host flow control is not enabled then the Controller
	  can assume the Host has to receive and process ACL data faster than
	  the controller can produce it.

	  In a Controller only build this will determine the maximum ACL size
	  that the Controller will send to the Host.

config BT_BUF_ACL_RX_COUNT
	int "Number of incoming ACL data buffers"
	default 6
	range 2 256
	help
	  Number or incoming ACL data buffers sent from the Controller to the
	  Host.
	  In a combined Host and Controller build the buffers are shared and
	  therefore Controller to Host flow control is not needed.

	  In a Host only build with Controller to Host flow control enabled
	  the Host will inform the Controller about the maximum number of
	  buffers by setting this value in the Host Buffer Size command.

	  When Controller to Host flow control is not enabled the Controller
	  can assume that the Host has infinite amount of buffers.

	  For both configurations, there is an additional requirement that is
	  enforced by a build-time check: BT_BUF_ACL_RX_COUNT needs to be at
	  least one greater than BT_MAX_CONN.

config BT_BUF_EVT_RX_SIZE
	int "Maximum supported HCI Event buffer length"
	default $(UINT8_MAX) if (BT_EXT_ADV && BT_OBSERVER) || BT_PER_ADV_SYNC || BT_DF_CONNECTION_CTE_RX || BT_CLASSIC || BT_CHANNEL_SOUNDING
	# LE Read Supported Commands command complete event.
	default 68
	range 68 $(UINT8_MAX)
	range 78 $(UINT8_MAX) if BT_CHANNEL_SOUNDING
	help
	  Maximum supported HCI event buffer size. This value does not include
	  the HCI Event header.
	  This value is used by both the Host and the Controller for buffer
	  sizes that include HCI events. It should be set according to the
	  expected HCI events that can be generated from the configuration.
	  If the subset of possible HCI events is unknown, this should be set to
	  the maximum of 255.

config BT_BUF_EVT_RX_COUNT
	int "Number of HCI Event buffers"
	default 20 if (BT_MESH && !(BT_BUF_EVT_DISCARDABLE_COUNT > 0))
	default 10
	range 2 $(UINT8_MAX)
	help
	  Number of buffers available for incoming HCI events from the
	  Controller.

config BT_BUF_EVT_DISCARDABLE_SIZE
	int "Maximum supported discardable HCI Event buffer length"
	range 43 $(UINT8_MAX) if !BT_EXT_ADV
	range 58 $(UINT8_MAX) if BT_EXT_ADV
	# LE Extended Advertising Report event
	default $(UINT8_MAX) if BT_CLASSIC
	# Le Advertising Report event
	default 43 if !BT_EXT_ADV
	default 58 if BT_EXT_ADV
	help
	  Maximum support discardable HCI event size of buffers in the separate
	  discardable event buffer pool. This value does not include the
	  HCI Event header.
	  The minimum size is set based on the Advertising Report. Setting
	  the buffer size different than BT_BUF_EVT_RX_SIZE can save memory.

config BT_BUF_EVT_DISCARDABLE_COUNT
	int "Number of discardable HCI Event buffers"
	range 1 $(UINT8_MAX)
	default 20 if BT_MESH
	default 3
	depends on !BT_HCI_RAW
	help
	  Number of buffers in a separate buffer pool for events which
	  the HCI driver considers discardable. Examples of such events
	  could be e.g. Advertising Reports. The benefit of having such
	  a pool is that the if there is a heavy inflow of such events
	  it will not cause the allocation for other critical events to
	  block and may even eliminate deadlocks in some cases.

config BT_BUF_CMD_TX_SIZE
	int "Maximum support HCI Command buffer length"
	default $(UINT8_MAX) if (BT_EXT_ADV || BT_CLASSIC || BT_ISO_CENTRAL)
	# LE Set Connection CTE Receive Parameters. Value required to store max allowed number
	# of antenna ids for platforms other than Nordic.
	default 83 if (!BT_EXT_ADV && !BT_CLASSIC && BT_CTLR_DF && BT_CTLR_DF_CONN_CTE_REQ && !SOC_COMPATIBLE_NRF)
	# LE Generate DHKey v2 command
	default 65
	range 65 $(UINT8_MAX)
	help
	  Maximum data size for each HCI Command buffer. This value does not
	  include the HCI Command header.
	  This value is used by both the Host and the Controller for buffer
	  sizes that include HCI commands. It should be set according to the
	  expected HCI commands that can be sent from the configuration.
	  If the subset of possible HCI commands is unknown, this should be set
	  to the maximum of 255.

config BT_BUF_CMD_TX_COUNT
	int "Number of HCI command buffers"
	default 2
	range 2 64
	help
	  Number of buffers available for outgoing HCI commands from the Host.

endmenu

# Workaround to have commas on function arguments
ZEPHYR_BT_HCI := zephyr,bt-hci

config BT_HAS_HCI_VS
	bool
	default $(dt_chosen_bool_prop,$(ZEPHYR_BT_HCI),bt-hci-vs-ext)
	help
	  This option is set by the Bluetooth controller to indicate support
	  for the Zephyr HCI Vendor-Specific Commands and Event.

config BT_HCI_VS
	bool "Zephyr HCI Vendor-Specific Commands"
	depends on BT_HAS_HCI_VS || !BT_CTLR
	default y if BT_HAS_HCI_VS
	help
	  Enable support for the Zephyr HCI Vendor-Specific Commands in the
	  Host and/or Controller. This enables Set Version Information,
	  Supported Commands, Supported Features vendor commands.

config BT_HCI_VS_FATAL_ERROR
	bool "Allow vendor specific HCI event Zephyr Fatal Error"
	depends on BT_HCI_VS
	help
	  Enable emitting HCI Vendor-Specific events for system and Controller
	  errors that are unrecoverable.

config BT_HCI_VS_EXT_DETECT
	bool "Use heuristics to guess HCI vendor extensions support in advance"
	depends on BT_HCI_VS && !BT_CTLR
	default y if BOARD_QEMU_X86 || BOARD_QEMU_CORTEX_M3 || BOARD_NATIVE_POSIX || BOARD_NATIVE_SIM
	help
	  Use some heuristics to try to guess in advance whether the controller
	  supports the HCI vendor extensions in advance, in order to prevent
	  sending vendor commands to controller which may interpret them in
	  completely different ways.

config BT_HCI_MESH_EXT
	bool "Mesh HCI Command support"
	depends on BT_BROADCASTER && BT_OBSERVER && !BT_LL_SW_SPLIT
	help
	  Enable support for the Bluetooth Mesh HCI Commands.

config BT_WAIT_NOP
	bool "Wait for \"NOP\" Command Complete event during init"
	help
	  Emit a Command Complete event from the Controller (and wait for it
	  from the Host) for the NOP opcode to indicate that the Controller is
	  ready to receive commands.

config BT_RPA
	bool
	select TINYCRYPT
	select TINYCRYPT_AES

config BT_ASSERT
	bool "Custom Bluetooth assert implementation"
	default y
	help
	  Use a custom Bluetooth assert implementation instead of the
	  kernel-wide __ASSERT() when CONFIG_ASSERT is disabled.

if BT_ASSERT

config BT_ASSERT_VERBOSE
	bool "Print out an assert string when using BT_ASSERT"
	default y
	help
	  When CONFIG_BT_ASSERT is enabled, this option turns on printing the
	  cause of the assert to the console using printk().

config BT_ASSERT_PANIC
	bool "Use k_panic() instead of k_oops()"
	help
	  When CONFIG_BT_ASSERT is enabled, this option makes the code call
	  k_panic() instead of k_oops() when an assertion is triggered.

endif # BT_ASSERT

config BT_HCI_ERR_TO_STR
	bool "Print HCI error codes as strings [EXPERIMENTAL]"
	select EXPERIMENTAL
	help
	  This configuration enables printing of HCI error
	  codes represented as strings.
	  See bt_hci_err_to_str() for more details.

config BT_MONITOR
	bool
	select LOG_OUTPUT

choice BT_DEBUG_TYPE
	prompt "Bluetooth debug type"
	default BT_DEBUG_NONE

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

config BT_DEBUG_MONITOR_UART
	bool "Monitor protocol over UART"
	select LOG
	select CONSOLE_HAS_DRIVER
	select BT_MONITOR
	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).

config BT_DEBUG_MONITOR_RTT
	bool "Monitor protocol over RTT"
	depends on USE_SEGGER_RTT
	depends on SEGGER_RTT_MAX_NUM_UP_BUFFERS >= 2
	select LOG
	select CONSOLE_HAS_DRIVER
	select BT_MONITOR
	help
	  Use a custom logging protocol over the RTT buffer 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 BT_DEBUG_MONITOR_RTT

config BT_DEBUG_MONITOR_RTT_BUFFER
	int "Buffer number used for custom logger output."
	range 1 SEGGER_RTT_MAX_NUM_UP_BUFFERS
	default 1
	help
	  Select index of up-buffer used for logger output.
	  Make sure the buffer number is not used by other logger,
	  e.g. in LOG_BACKEND_RTT_BUFFER, otherwise the buffer will be
	  overwritten.

config BT_DEBUG_MONITOR_RTT_BUFFER_NAME
	string "Buffer name used for custom logger output."
	default "btmonitor"
	help
	  Select index of up-buffer used for logger output.

config BT_DEBUG_MONITOR_RTT_BUFFER_SIZE
	int "Size of reserved up-buffer for custom logger output."
	default 1024
	help
	  Specify reserved size of up-buffer used for custom logger output.

endif # BT_DEBUG_MONITOR_RTT

endchoice # Bluetooth debug type
