choice BT_NIMBLE_MEM_ALLOC_MODE
    prompt "Memory allocation strategy"
    default BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL
    help
        Allocation strategy for NimBLE host stack, essentially provides ability to
        allocate all required dynamic allocations from,

        - Internal DRAM memory only
        - External SPIRAM memory only
        - Either internal or external memory based on default malloc()
          behavior in ESP-IDF
        - Internal IRAM memory wherever applicable else internal DRAM

        Recommended mode here is always internal, since that is most preferred
        from security perspective. But if application requirement does not
        allow sufficient free internal memory then alternate mode can be
        selected.

    config BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL
        bool "Internal memory"

    config BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL
        bool "External SPIRAM"
        depends on ESP32_SPIRAM_SUPPORT

    config BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT
        bool "Default alloc mode"

    config BT_NIMBLE_MEM_ALLOC_MODE_IRAM_8BIT
        bool "Internal IRAM"
        depends on ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY
        help
            Allows to use IRAM memory region as 8bit accessible region.

            Every unaligned (8bit or 16bit) access will result in an exception
            and incur penalty of certain clock cycles per unaligned read/write.

endchoice #BT_NIMBLE_MEM_ALLOC_MODE

config BT_NIMBLE_MAX_CONNECTIONS
    int "Maximum number of concurrent connections"
    range 1 9
    default BTDM_CTRL_BLE_MAX_CONN
    depends on BT_NIMBLE_ENABLED
    help
        Defines maximum number of concurrent BLE connections

config BT_NIMBLE_MAX_BONDS
    int "Maximum number of bonds to save across reboots"
    default 3
    depends on BT_NIMBLE_ENABLED
    help
        Defines maximum number of bonds to save for peer security and our security

config BT_NIMBLE_MAX_CCCDS
    int "Maximum number of CCC descriptors to save across reboots"
    default 8
    depends on BT_NIMBLE_ENABLED
    help
        Defines maximum number of CCC descriptors to save

config BT_NIMBLE_L2CAP_COC_MAX_NUM
    int "Maximum number of connection oriented channels"
    range 0 9
    depends on BT_NIMBLE_ENABLED
    default 0
    help
        Defines maximum number of BLE Connection Oriented Channels. When set to (0), BLE COC is not compiled in

choice BT_NIMBLE_PINNED_TO_CORE_CHOICE
    prompt "The CPU core on which NimBLE host will run"
    depends on BT_NIMBLE_ENABLED && !FREERTOS_UNICORE
    help
        The CPU core on which NimBLE host will run. You can choose Core 0 or Core 1.
        Cannot specify no-affinity

    config BT_NIMBLE_PINNED_TO_CORE_0
        bool "Core 0 (PRO CPU)"
    config BT_NIMBLE_PINNED_TO_CORE_1
        bool "Core 1 (APP CPU)"
        depends on !FREERTOS_UNICORE
endchoice

config BT_NIMBLE_PINNED_TO_CORE
    int
    depends on BT_NIMBLE_ENABLED
    default 0 if BT_NIMBLE_PINNED_TO_CORE_0
    default 1 if BT_NIMBLE_PINNED_TO_CORE_1
    default 0

config BT_NIMBLE_TASK_STACK_SIZE
    int "NimBLE Host task stack size"
    depends on BT_NIMBLE_ENABLED
    default 5120 if BLE_MESH
    default 4096
    help
        This configures stack size of NimBLE host task

config BT_NIMBLE_ROLE_CENTRAL
    bool "Enable BLE Central role"
    depends on BT_NIMBLE_ENABLED
    default y

config BT_NIMBLE_ROLE_PERIPHERAL
    bool "Enable BLE Peripheral role"
    depends on BT_NIMBLE_ENABLED
    default y

config BT_NIMBLE_ROLE_BROADCASTER
    bool "Enable BLE Broadcaster role"
    depends on BT_NIMBLE_ENABLED
    default y

config BT_NIMBLE_ROLE_OBSERVER
    bool "Enable BLE Observer role"
    depends on BT_NIMBLE_ENABLED
    default y

config BT_NIMBLE_NVS_PERSIST
    bool "Persist the BLE Bonding keys in NVS"
    depends on BT_NIMBLE_ENABLED
    default y
    help
        Enable this flag to make bonding persistent across device reboots

config BT_NIMBLE_SM_LEGACY
    bool "Security manager legacy pairing"
    depends on BT_NIMBLE_ENABLED
    default y
    help
        Enable security manager legacy pairing

config BT_NIMBLE_SM_SC
    bool "Security manager secure connections (4.2)"
    depends on BT_NIMBLE_ENABLED
    default y
    help
        Enable security manager secure connections

config BT_NIMBLE_DEBUG
    bool "Enable extra runtime asserts and host debugging"
    default n
    depends on BT_NIMBLE_ENABLED
    help
        This enables extra runtime asserts and host debugging

config BT_NIMBLE_SM_SC_DEBUG_KEYS
    bool "Use predefined public-private key pair"
    default n
    depends on BT_NIMBLE_SM_SC
    help
        If this option is enabled, SM uses predefined DH key pair as described
        in Core Specification, Vol. 3, Part H, 2.3.5.6.1. This allows to
        decrypt air traffic easily and thus should only be used for debugging.

config BT_NIMBLE_SVC_GAP_DEVICE_NAME
    string "BLE GAP default device name"
    depends on BT_NIMBLE_ENABLED
    default "nimble"
    help
        The Device Name characteristic shall contain the name of the device as an UTF-8 string.
        This name can be changed by using API ble_svc_gap_device_name_set()

config BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN
    int "Maximum length of BLE device name in octets"
    depends on BT_NIMBLE_ENABLED
    default 31
    help
        Device Name characteristic value shall be 0 to 248 octets in length

config BT_NIMBLE_ATT_PREFERRED_MTU
    int "Preferred MTU size in octets"
    depends on BT_NIMBLE_ENABLED
    default 256
    help
        This is the default value of ATT MTU indicated by the device during an ATT MTU exchange.
        This value can be changed using API ble_att_set_preferred_mtu()

config BT_NIMBLE_SVC_GAP_APPEARANCE
    hex "External appearance of the device"
    depends on BT_NIMBLE_ENABLED
    default 0
    help
        Standard BLE GAP Appearance value in HEX format e.g. 0x02C0

config BT_NIMBLE_ACL_BUF_COUNT
    int "ACL Buffer count"
    depends on BT_NIMBLE_ENABLED
    default 12
    help
        The number of ACL data buffers.

config BT_NIMBLE_ACL_BUF_SIZE
    int "ACL Buffer size"
    depends on BT_NIMBLE_ENABLED
    default 255
    help
        This is the maximum size of the data portion of HCI ACL data packets.
        It does not include the HCI data header (of 4 bytes)

config BT_NIMBLE_HCI_EVT_BUF_SIZE
    int "HCI Event Buffer size"
    depends on BT_NIMBLE_ENABLED
    default 70
    help
        This is the size of each HCI event buffer in bytes

config BT_NIMBLE_HCI_EVT_HI_BUF_COUNT
    int "High Priority HCI Event Buffer count"
    depends on BT_NIMBLE_ENABLED
    default 30
    help
        This is the high priority HCI events' buffer size. High-priority
        event buffers are for everything except advertising reports. If there
        are no free high-priority event buffers then host will try to allocate a
        low-priority buffer instead

config BT_NIMBLE_HCI_EVT_LO_BUF_COUNT
    int "Low Priority HCI Event Buffer count"
    depends on BT_NIMBLE_ENABLED
    default 8
    help
        This is the low priority HCI events' buffer size. Low-priority event
        buffers are only used for advertising reports. If there are no free
        low-priority event buffers, then an incoming advertising report will
        get dropped

config BT_NIMBLE_MSYS1_BLOCK_COUNT
    int "MSYS_1 Block Count"
    depends on BT_NIMBLE_ENABLED
    default 12
    help
        MSYS is a system level mbuf registry. For prepare write & prepare
        responses MBUFs are allocated out of msys_1 pool. For NIMBLE_MESH
        enabled cases, this block count is increased by 8 than user defined
        count.

config BT_NIMBLE_HS_FLOW_CTRL
    bool "Enable Host Flow control"
    depends on BT_NIMBLE_ENABLED
    default y
    help
        Enable Host Flow control

config BT_NIMBLE_HS_FLOW_CTRL_ITVL
    int "Host Flow control interval"
    depends on BT_NIMBLE_HS_FLOW_CTRL
    default 1000
    help
        Host flow control interval in msecs

config BT_NIMBLE_HS_FLOW_CTRL_THRESH
    int "Host Flow control threshold"
    depends on BT_NIMBLE_HS_FLOW_CTRL
    default 2
    help
        Host flow control threshold, if the number of free buffers are at or
        below this threshold, send an immediate number-of-completed-packets
        event

config BT_NIMBLE_HS_FLOW_CTRL_TX_ON_DISCONNECT
    bool "Host Flow control on disconnect"
    depends on BT_NIMBLE_HS_FLOW_CTRL
    default y
    help
        Enable this option to send number-of-completed-packets event to
        controller after disconnection

config BT_NIMBLE_RPA_TIMEOUT
    int "RPA timeout in seconds"
    range 1 41400
    depends on BT_NIMBLE_ENABLED
    default 900
    help
        Time interval between RPA address change. This is applicable in case of
        Host based RPA

menuconfig BT_NIMBLE_MESH
    bool "Enable BLE mesh functionality"
    select BT_NIMBLE_SM_SC
    depends on BT_NIMBLE_ENABLED
    default n
    help
        Enable BLE Mesh functionality

config BT_NIMBLE_MESH_PROXY
    bool "Enable mesh proxy functionality"
    default n
    depends on BT_NIMBLE_MESH
    help
        Enable proxy. This is automatically set whenever NIMBLE_MESH_PB_GATT or
        NIMBLE_MESH_GATT_PROXY is set


config BT_NIMBLE_MESH_PROV
    bool "Enable BLE mesh provisioning"
    default y
    depends on BT_NIMBLE_MESH
    help
        Enable mesh provisioning

config BT_NIMBLE_MESH_PB_ADV
    bool "Enable mesh provisioning over advertising bearer"
    default y
    depends on BT_NIMBLE_MESH_PROV
    help
        Enable this option to allow the device to be provisioned over
        the advertising bearer


config BT_NIMBLE_MESH_PB_GATT
    bool "Enable mesh provisioning over GATT bearer"
    default y
    select BT_NIMBLE_MESH_PROXY
    depends on BT_NIMBLE_MESH_PROV
    help
        Enable this option to allow the device to be provisioned over the GATT
        bearer

config BT_NIMBLE_MESH_GATT_PROXY
    bool "Enable GATT Proxy functionality"
    default y
    select BT_NIMBLE_MESH_PROXY
    depends on BT_NIMBLE_MESH
    help
        This option enables support for the Mesh GATT Proxy Service,
        i.e. the ability to act as a proxy between a Mesh GATT Client
        and a Mesh network

config BT_NIMBLE_MESH_RELAY
    bool "Enable mesh relay functionality"
    default n
    depends on BT_NIMBLE_MESH
    help
        Support for acting as a Mesh Relay Node

config BT_NIMBLE_MESH_LOW_POWER
    bool "Enable mesh low power mode"
    default n
    depends on BT_NIMBLE_MESH
    help
        Enable this option to be able to act as a Low Power Node

config BT_NIMBLE_MESH_FRIEND
    bool "Enable mesh friend functionality"
    default n
    depends on BT_NIMBLE_MESH
    help
        Enable this option to be able to act as a Friend Node

config BT_NIMBLE_MESH_DEVICE_NAME
    string "Set mesh device name"
    default "nimble-mesh-node"
    depends on BT_NIMBLE_MESH
    help
        This value defines Bluetooth Mesh device/node name

config BT_NIMBLE_CRYPTO_STACK_MBEDTLS
    bool "Override TinyCrypt with mbedTLS for crypto computations"
    default y
    depends on BT_NIMBLE_ENABLED
    select MBEDTLS_ECP_RESTARTABLE
    select MBEDTLS_CMAC_C
    help
        Enable this option to choose mbedTLS instead of TinyCrypt for crypto
        computations.