# 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"
	# For GOEP over RFCOMM, including,
	# 255 bytes - the minimum MTU of GOEP,
	# 4 bytes - L2CAP Header,
	# 5 bytes - 4 bytes for RFCOMM header with extended length, 1 byte for FCS.
	default 264 if BT_CLASSIC && BT_GOEP
	default 200 if BT_CLASSIC
	default 70 if BT_EATT
	default 69 if BT_SMP
	default 37 if BT_MESH_GATT
	default 27
	range 264 $(UINT16_MAX) if BT_CLASSIC && BT_GOEP
	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_EXTRA
	# As Host implementation unconditionally references this Kconfig, we
	# hide it for !BT_CONN and default to 0.
	int "Number of extra incoming ACL data buffers" if BT_CONN
	range 1 65535 if BT_CONN
	default BT_MAX_CONN if BT_CONN
	range 0 0
	default 0
	help
	  Number of incoming extra ACL data buffers sent from the Controller to
	  the Host.

	  By default, the total number of incoming ACL data buffers is equal to
	  CONFIG_BT_MAX_CONN + 1, to support L2CAP recombination.

	  The L2CAP recombination in the Host keeps the first Rx buffer for each
	  connection and uses one Rx buffer across all connections to receive a
	  fragment from the Controller.

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 || BT_LE_EXTENDED_FEAT_SET
	# 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_CMD_TX_SIZE
	int "Maximum support HCI Command buffer length"
	default $(UINT8_MAX) if (BT_EXT_ADV || BT_CLASSIC || BT_ISO_CENTRAL || BT_CHANNEL_SOUNDING)
	# 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
	# This option is only visible for a user when Host and Controller are build together, or for
	# Host-only builds.
	int "Number of HCI command buffers" if !BT_HCI_RAW || !HAS_BT_CTLR
	# This option is present when Host and Controller are build together, or
	# for Host only builds, or when Controller-to-Host ACL data flow control
	# is disabled.
	depends on !BT_HCI_RAW || !HAS_BT_CTLR || !BT_HCI_ACL_FLOW_CONTROL
	# The Mesh stack usage in applications and tests can start both advertising and scanning in
	# parallel. Also, when BT_MESH_WORKQ_SYS is enabled, the Mesh stack is starting Extended
	# Advertising in the receive callback run in the system work queue and as the Host also uses
	# the system work queue for HCI command Tx towards the Controller, one additional HCI
	# command buffer is needed.
	range 2 64 if BT_MESH
	range 1 64
	default 2 if BT_MESH
	default 1
	help
	  Number of buffers available for outgoing HCI commands from the Host.

	  HCI Controllers may not support Num_HCI_Command_Packets > 1, hence they default to 1 when
	  not enabling Controller to Host data flow control (BT_HCI_ACL_FLOW_CONTROL), Read Remote
	  Version Information (BT_REMOTE_VERSION), Auto-Initiate PHY update (BT_AUTO_PHY_UPDATE), or
	  Auto-Initiate Data Length Update (BT_AUTO_DATA_LEN_UPDATE).

	  Normal HCI commands follow the HCI command flow control using Num_HCI_Command_Packets
	  return in HCI command complete and status.

	  The Host Number of Completed Packets command does not follow normal flow control of HCI
	  commands and the Controller side HCI drivers that allocates HCI command buffers with
	  K_NO_WAIT can end up running out of command buffers.

	  When Controller to Host data flow control is enabled in the Host-only or combined
	  Host plus Controller build, the internal BT_BUF_CMD_TX_COUNT is adjusted accordingly
	  taking into considerations the enabled auto-initiated procedures, and to follow the normal
	  HCI command flow control to be able to send Ncmd normal HCI commands and
	  BT_BUF_ACL_RX_COUNT of Host Number of Completed Packets command down to the Controller.

	  When Controller to Host data flow control is supported in the Controller-only build,
	  the internal BT_BUF_CMD_TX_COUNT is adjusted to be equal to (BT_BUF_RX_COUNT + Ncmd).

	  Where Ncmd is supported maximum Num_HCI_Command_Packets in the Controller implementation.

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 || !HAS_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 && !HAS_BT_CTLR
	default y if BOARD_QEMU_X86 || BOARD_QEMU_CORTEX_M3 || 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
	depends on BT_HOST_CRYPTO || BT_CTLR_CRYPTO

config BT_PRIVATE_SHELL
	bool
	default n

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
