# Bluetooth Mesh configuration options

# Copyright (c) 2017 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

menuconfig BT_MESH
	bool "Bluetooth Mesh support"
	depends on BT_OBSERVER && BT_BROADCASTER
	help
	  This option enables Bluetooth Mesh support. The specific
	  features that are available may depend on other features
	  that have been enabled in the stack, such as GATT support.

if BT_MESH

###################################################################################################
# Invisible options
###################################################################################################

# Virtual option enabled whenever Proxy Server or Client is needed
config BT_MESH_PROXY
	bool

config BT_MESH_GATT
	bool

config BT_MESH_PROXY_MSG_LEN
	int
	default 66 if BT_MESH_PB_GATT_COMMON
	default 33 if BT_MESH_GATT_PROXY
	depends on BT_MESH_GATT

config BT_MESH_GATT_CLIENT
	bool
	select BT_MESH_GATT

config BT_MESH_GATT_SERVER
	bool
	select BT_MESH_GATT
	select BT_GATT_DYNAMIC_DB

config BT_MESH_PB_GATT_COMMON
	bool

# Virtual option enabled whenever Generic Provisioning layer is needed
config BT_MESH_PROV
	bool

###################################################################################################
# Visible options
###################################################################################################

menu "Advertiser"

choice BT_MESH_ADV
	prompt "Advertiser mode"
	default BT_MESH_ADV_EXT if BT_EXT_ADV
	default BT_MESH_ADV_LEGACY

menuconfig BT_MESH_ADV_LEGACY
	bool "Legacy advertising"
	help
	  Use legacy advertising commands for mesh sending. Legacy
	  advertising is significantly slower than the extended advertising, but
	  is supported by all controllers.

	  WARNING: The legacy advertiser can occasionally do more message
	  retransmissions than requested because of limitations of HCI
	  interface API.

if BT_MESH_ADV_LEGACY

config BT_MESH_ADV_STACK_SIZE
	int "Mesh advertiser thread stack size"
	default 1024 if BT_HOST_CRYPTO
	default 776 if BT_MESH_PRIV_BEACONS
	default 768
	help
	  Size of bt mesh adv thread stack.

	  NOTE: This is an advanced setting and should not be changed unless
	  absolutely necessary

config BT_MESH_ADV_PRIO
	int "Mesh advertiser thread priority"
	default 7
	help
	  Priority of bt mesh adv thread.

	  NOTE: This is an advanced setting and should not be changed unless
	  absolutely necessary

endif # BT_MESH_ADV_LEGACY

menuconfig BT_MESH_ADV_EXT
	bool "Extended advertising"
	depends on BT_CTLR_ADV_EXT || !BT_CTLR
	depends on BT_EXT_ADV
	help
	  Use extended advertising commands for operating the advertiser.
	  Extended advertising is faster and uses less memory than legacy
	  advertising, but isn't supported by all controllers.

if BT_MESH_ADV_EXT

config BT_MESH_RELAY_ADV_SETS
	int "Maximum of simultaneous relay message support"
	default 0
	range 0 BT_EXT_ADV_MAX_ADV_SET
	depends on BT_MESH_RELAY
	help
	  Maximum of simultaneous relay message support. Requires controller support
	  multiple advertising sets.

config BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET
	bool "Use the main advertising set to relay messages"
	depends on BT_MESH_RELAY_ADV_SETS > 0
	help
	  When this option is enabled, there is a message that needs to be
	  relayed, all relay advertising sets defined by
	  CONFIG_BT_MESH_RELAY_ADV_SETS are busy with relaying messages
	  and the main advertising set is not busy with sending local
	  messages, the stack will use the main advertising set to relay
	  the message. This maximizes the utilization efficiency of
	  advertising sets, which is helpful for the sending of dense
	  relays. With CONFIG_BT_MESH_RELAY_RETRANSMIT_COUNT value
	  greater than zero, this can noticeably delay transmission of
	  local messages. When Friend feature is enabled and the node is
	  in a friendship, this option can delay transmission of local
	  messages thus requiring bigger CONFIG_BT_MESH_FRIEND_RECV_WIN
	  value. This in turn will result in increase of the power
	  consumption of the Low Power node.

config BT_MESH_ADV_EXT_GATT_SEPARATE
	bool "Use a separate extended advertising set for GATT Server Advertising"
	depends on BT_MESH_GATT_SERVER
	help
	  Use a separate extended advertising set for GATT Server Advertising,
	  otherwise a shared advertising set will be used.

config BT_MESH_ADV_EXT_FRIEND_SEPARATE
	bool "Use a separate extended advertising set for Friend advertising"
	depends on BT_MESH_FRIEND
	help
	  Use a separate extended advertising set for Friend advertising,
	  otherwise a shared advertising set will be used. Using the separate
	  extended advertising set makes the Friend node send friendship
	  messages as close to the start of the ReceiveWindow as possible,
	  thus reducing the scanning time on the Low Power node.

endif # BT_MESH_ADV_EXT

endchoice

config BT_MESH_ADV_BUF_COUNT
	int "Number of advertising buffers for local messages"
	default 6
	range 1 256
	help
	  Number of advertising buffers available for sending local messages.
	  This should be chosen based on the number of local messages that the node
	  can send simultaneously.

config BT_MESH_DEBUG_USE_ID_ADDR
	bool "Use identity address for all advertising"
	help
	  This option forces the usage of the local identity address for
	  all advertising. This can be a help for debugging (analyzing
	  traces), however it should never be enabled for a production
	  build as it compromises the privacy of the device.

endmenu # Advertiser

menu "Provisioning"

menuconfig BT_MESH_PB_ADV
	bool "PB-ADV support"
	select BT_MESH_PROV
	default y
	help
	  Enable this option to allow the device to be provisioned over
	  the advertising bearer.

config BT_MESH_UNPROV_BEACON_INT
	int
	prompt "The interval (in seconds) to send the unprovisioned beacon" if BT_MESH_PB_ADV
	default 5
	range 1 10
	help
	  This option specifies the interval (in seconds) at which the
	  device sends unprovisioned beacon.

if BT_MESH_PB_ADV

config BT_MESH_PB_ADV_USE_RELAY_SETS
	bool "Use relay advertising sets to send provisioning PDUs"
	depends on BT_MESH_RELAY_ADV_SETS > 0
	help
	  Use relay advertising sets to send provisioning PDUs

config BT_MESH_PB_ADV_TRANS_PDU_RETRANSMIT_COUNT
	int "Link Open and Transaction PDU retransmit count"
	default 7 if BT_MESH_PB_ADV_USE_RELAY_SETS
	default 0
	range 0 7
	help
	  Controls the number of retransmissions of original Link Open and Transaction PDU,
	  in addition to the first transmission.

config BT_MESH_PB_ADV_TRANS_ACK_RETRANSMIT_COUNT
	int "Link Ack and Transaction Ack retransmit count"
	default 2
	range 0 7
	help
	  Controls the number of retransmissions of original Link Ack and Transaction Acknowledgment PDU,
	  in addition to the first transmission.

config BT_MESH_PB_ADV_LINK_CLOSE_RETRANSMIT_COUNT
	int "Link Close retransmit count"
	default 7 if BT_MESH_PB_ADV_USE_RELAY_SETS
	default 2
	range 0 7
	help
	  Controls the number of retransmissions of original Link Close,
	  in addition to the first transmission.

config BT_MESH_PB_ADV_RETRANS_TIMEOUT
	int "Timeout value of retransmit provisioning PDUs"
	default 500
	range 100 800
	help
	  Timeout value of retransmit provisioning PDUs.

endif # BT_MESH_PB_ADV

if BT_CONN

config BT_MESH_PB_GATT
	bool "PB-GATT Server support"
	select BT_MESH_GATT_SERVER
	select BT_MESH_PROV
	select BT_MESH_PB_GATT_COMMON
	select BT_MESH_PROVISIONEE
	help
	  Enable this option to allow the device to be provisioned over
	  GATT.

config BT_MESH_PB_GATT_USE_DEVICE_NAME
	bool "Include Bluetooth device name in scan response"
	depends on BT_MESH_PB_GATT
	default y
	help
	  This option includes GAP device name in scan response when
	  the PB-GATT is enabled.

config BT_MESH_PB_GATT_CLIENT
	bool "PB-GATT Client support"
	select BT_MESH_PROV
	select BT_GATT_CLIENT
	select BT_MESH_GATT_CLIENT
	select BT_MESH_PB_GATT_COMMON
	select BT_MESH_PROVISIONER
	depends on BT_CENTRAL
	help
	  Enable this option to allow the provisioner provisioning the
	  device over GATT.

endif # BT_CONN

config BT_MESH_PROV_DEVICE
	bool "[DEPRECATED] Provisioning device role support"
	select DEPRECATED
	select BT_MESH_PROVISIONEE
	help
	  Enable this option to allow the device to be provisioned into a mesh network.
	  The option is marked as deprecated and will be replaced by BT_MESH_PROVISIONEE
	  option.

config BT_MESH_PROVISIONEE
	bool "Provisionee role support"
	depends on BT_MESH_PB_ADV || BT_MESH_PB_GATT
	default y
	help
	  Enable this option to allow the device to be provisioned into a mesh network.

config BT_MESH_PROV_OOB_PUBLIC_KEY
	bool "OOB Public key support"
	depends on BT_MESH_PROVISIONEE
	help
	  Enable this option if public key is to be exchanged via Out of Band (OOB) technology.

config BT_MESH_ECDH_P256_CMAC_AES128_AES_CCM
	bool "Support CMAC AES128 for OOB authentication"
	depends on BT_MESH_PROV
	default y
	help
	  Enable this option to support CMAC AES128 for OOB authentication.

config BT_MESH_ECDH_P256_HMAC_SHA256_AES_CCM
	bool "Support HMAC SHA256 for OOB authentication"
	depends on BT_MESH_PROV
	default y
	help
	  Enable this option to support HMAC SHA256 for OOB authentication.

config BT_MESH_OOB_AUTH_REQUIRED
	bool "OOB authentication mandates to use HMAC SHA256"
	depends on BT_MESH_ECDH_P256_HMAC_SHA256_AES_CCM

config BT_MESH_PROVISIONER
	bool "Provisioner support"
	depends on BT_MESH_CDB
	depends on BT_MESH_PROV
	depends on BT_MESH_PB_ADV || BT_MESH_PB_GATT_CLIENT
	help
	  Enable this option to have support for provisioning remote devices.

menuconfig BT_MESH_CDB
	bool "Mesh Configuration Database"

if BT_MESH_CDB

config BT_MESH_CDB_NODE_COUNT
	int "Maximum number of nodes in the database"
	default 8
	range 1 4096
	help
	  This option specifies how many nodes each network can at most
	  save in the configuration database.

config BT_MESH_CDB_SUBNET_COUNT
	int "Maximum number of subnets in the database"
	default 1
	range 1 4096
	help
	  This option specifies how many subnets that can at most be
	  saved in the configuration database.

config BT_MESH_CDB_APP_KEY_COUNT
	int "Maximum number of application keys in the database"
	default 1
	range 1 4096
	help
	  This option specifies how many application keys that can at most
	  be saved in the configuration database.

endif # BT_MESH_CDB

endmenu # Provisioning

menu "Network layer"

config BT_MESH_LOOPBACK_BUFS
	int "Number of loopback buffers"
	default 3
	help
	  The number of buffers allocated for the network loopback mechanism.
	  Loopback is used when the device sends messages to itself.

config BT_MESH_NETWORK_TRANSMIT_COUNT
	int "Network Transmit Count"
	default 2
	range 0 7
	help
	  Controls the initial number of retransmissions of original messages,
	  in addition to the first transmission. Can be changed through runtime
	  configuration.

config BT_MESH_NETWORK_TRANSMIT_INTERVAL
	int "Network Transmit Interval"
	default 20
	range 10 330
	help
	  Controls the initial interval between retransmissions of original
	  messages, in milliseconds. Can be changed through runtime
	  configuration.

config BT_MESH_MSG_CACHE_SIZE
	int "Network message cache size"
	default 32
	range 2 65535
	help
	  Number of messages that are cached by the node to avoid acting on the
	  recently seen duplicate messages. This option is similar to
	  the replay protection list, but has a different purpose. Network message
	  cache helps prevent unnecessary decryption operations. This also prevents
	  unnecessary relaying and helps in getting rid of relay loops. Setting
	  this value to a very low number can cause unnecessary network traffic.
	  Setting this value to a very large number can impact the processing time
	  for each received network PDU and increases RAM footprint proportionately.

menuconfig BT_MESH_RELAY
	bool "Relay support"
	help
	  Support for acting as a Mesh Relay Node.

if BT_MESH_RELAY

config BT_MESH_RELAY_ENABLED
	bool "Relay feature enabled by default"
	default y
	help
	  Controls whether the Relay feature is enabled by default when the
	  device boots up for the first time or unprovisioned. Can be changed
	  at runtime using bt_mesh_relay_set() function.

config BT_MESH_RELAY_RETRANSMIT_COUNT
	int "Relay Retransmit Count"
	default 2
	range 0 7
	help
	  Controls the initial number of retransmissions of relayed messages, in
	  addition to the first transmission. Can be changed through runtime
	  configuration.

config BT_MESH_RELAY_RETRANSMIT_INTERVAL
	int "Relay Retransmit Interval"
	default 20
	range 10 330
	help
	  Controls the initial interval between retransmissions of relayed
	  messages, in milliseconds. Can be changed through runtime
	  configuration.

config BT_MESH_RELAY_BUF_COUNT
	int "Number of advertising buffers for relayed messages"
	default 32
	range 1 256
	help
	  Number of advertising buffers available for messages to be relayed.
	  High number of advertising buffers increases the reliability of the
	  mesh network. Low number of advertising buffers reduces the message
	  latency on the Relay Node, but at the same time increases the amount
	  of packet drops. When considering the message latency, also consider
	  the values of BT_MESH_RELAY_RETRANSMIT_COUNT and
	  BT_MESH_RELAY_RETRANSMIT_INTERVAL. A higher number of
	  BT_MESH_RELAY_ADV_SETS allows the increase in the number of buffers
	  while maintaining the latency.

endif # BT_MESH_RELAY

endmenu # Network layer

menu "Transport layer"

menu "Transport SAR configuration"

config BT_MESH_TX_SEG_MSG_COUNT
	int "Maximum number of simultaneous outgoing segmented messages"
	default 1
	range 0 255
	help
	  Maximum number of simultaneous outgoing multi-segment and/or
	  reliable messages.

	  Note that: Since Mesh Segmentation/reassembling is a mandatory
	  feature of specification, set to zero will not allow send any
	  Mesh Segment message.

config BT_MESH_RX_SEG_MSG_COUNT
	int "Maximum number of simultaneous incoming segmented messages"
	default 1
	range 0 255
	help
	  Maximum number of simultaneous incoming multi-segment and/or
	  reliable messages.

	  Note that: Since Mesh Segmentation/reassemblying is a mandatory
	  feature of specification, set to zero will not allow receive any
	  Mesh Segment message.

config BT_MESH_SEG_BUFS
	int "Number of segment buffers available"
	default 64
	range BT_MESH_RX_SEG_MAX 16384 if BT_MESH_RX_SEG_MAX > \
					  BT_MESH_TX_SEG_MAX
	range BT_MESH_TX_SEG_MAX 16384
	help
	  The incoming and outgoing segmented messages allocate their
	  segments from the same pool. Each segment is a 12 byte block,
	  and may only be used by one message at the time.

	  Outgoing messages will allocate their segments at the start of the
	  transmission, and release them one by one as soon as they have been
	  acknowledged by the receiver. Incoming messages allocate all their
	  segments at the start of the transaction, and won't release them until
	  the message is fully received.

config BT_MESH_RX_SEG_MAX
	int "Maximum number of segments in incoming messages"
	default 6 if BT_MESH_BLOB_SRV || BT_MESH_BLOB_CLI || \
		     BT_MESH_RPR_SRV || BT_MESH_RPR_CLI
	default 3
	range 1 32
	depends on BT_MESH_RX_SEG_MSG_COUNT > 0
	help
	  Maximum number of segments supported for incoming messages.
	  This value should typically be fine-tuned based on what
	  models the local node supports, i.e. what's the largest
	  message payload that the node needs to be able to receive.
	  This value affects memory and call stack consumption, which
	  is why the default is lower than the maximum that the
	  specification would allow (32 segments).

	  The maximum incoming SDU size is 12 times this number (out of
	  which 4 or 8 bytes is used for the Transport Layer MIC). For
	  example, 5 segments means the maximum SDU size is 60 bytes,
	  which leaves 56 bytes for application layer data using a
	  4-byte MIC and 52 bytes using an 8-byte MIC.

config BT_MESH_TX_SEG_MAX
	int "Maximum number of segments in outgoing messages"
	default 6 if BT_MESH_BLOB_SRV || BT_MESH_BLOB_CLI || \
		     BT_MESH_RPR_SRV || BT_MESH_RPR_CLI
	default 3
	range 1 32
	depends on BT_MESH_TX_SEG_MSG_COUNT > 0
	help
	  Maximum number of segments supported for outgoing messages.
	  This value should typically be fine-tuned based on what
	  models the local node supports, i.e. what's the largest
	  message payload that the node needs to be able to send.
	  This value affects memory consumption, which is why the
	  default is lower than the maximum that the specification
	  would allow (32 segments).

	  The maximum outgoing SDU size is 12 times this number (out of
	  which 4 or 8 bytes is used for the Transport Layer MIC). For
	  example, 5 segments means the maximum SDU size is 60 bytes,
	  which leaves 56 bytes for application layer data using a
	  4-byte MIC and 52 bytes using an 8-byte MIC.

config BT_MESH_SAR_TX_SEG_INT_STEP
	hex "Interval between sending two consecutive segments"
	range 0x00 0x0F
	default 0x05
	help
	  This value controls the interval between sending two consecutive
	  segments in a segmented message. The interval is measured in
	  milliseconds and calculated using the following formula:
	  (CONFIG_BT_MESH_SAR_TX_SEG_INT_STEP + 1) * 10 ms.

config BT_MESH_SAR_TX_UNICAST_RETRANS_COUNT
	hex "Maximum number of retransmissions to unicast address"
	range 0x00 0x0F
	default 0x02
	help
	  This value controls the maximum number of retransmissions of a
	  segmented message to a unicast address before giving up the transfer.

config BT_MESH_SAR_TX_UNICAST_RETRANS_WITHOUT_PROG_COUNT
	hex "Maximum number of retransmissions without progress to a unicast address"
	range 0x00 0x0F
	default 0x02
	help
	  This value defines the maximum number of retransmissions of a
	  segmented message to a unicast address that the stack will send if no
	  acknowledgment was received during timeout, or if an
	  acknowledgment with already confirmed segments was received.

config BT_MESH_SAR_TX_UNICAST_RETRANS_INT_STEP
	hex "Retransmissions interval step of missing segments to unicast address"
	range 0x00 0x0F
	default 0x07
	help
	  This value controls the interval step used for delaying the
	  retransmissions of unacknowledged segments of a segmented message to
	  a unicast address. The interval step is measured in milliseconds and
	  calculated using the following formula:
	  (CONFIG_BT_MESH_SAR_TX_UNICAST_RETRANS_INT_STEP + 1) * 25 ms.

config BT_MESH_SAR_TX_UNICAST_RETRANS_INT_INC
	hex "Retransmissions interval increment of missing segments to unicast address"
	range 0x00 0x0F
	default 0x01
	help
	  This value controls the interval increment used for delaying the
	  retransmissions of unacknowledged segments of a segmented message to
	  a unicast address. The increment is measured in milliseconds and
	  calculated using the following formula:
	  (CONFIG_BT_MESH_SAR_TX_UNICAST_RETRANS_INT_INC + 1) * 25 ms.

config BT_MESH_SAR_TX_MULTICAST_RETRANS_COUNT
	hex "Total number of retransmissions to multicast address"
	range 0x00 0x0F
	default 0x02
	help
	  This value controls the total number of retransmissions of a segmented
	  message to a multicast address.

config BT_MESH_SAR_TX_MULTICAST_RETRANS_INT
	hex "Interval between retransmissions to multicast address"
	range 0x00 0x0F
	default 0x09
	help
	  This value controls the interval between retransmissions of all
	  segments in a segmented message to a multicast address. The
	  interval is measured in milliseconds and calculated using the
	  following formula:
	  (CONFIG_BT_MESH_SAR_TX_MULTICAST_RETRANS_INT + 1) * 25 ms.

config BT_MESH_SAR_RX_SEG_THRESHOLD
	hex "Acknowledgments retransmission threshold"
	range 0x00 0x1F
	default 0x03
	help
	  This value defines a threshold in number of segments of a segmented
	  message for acknowledgment retransmissions. When the number of
	  segments of a segmented message is above this threshold, the stack
	  will additionally retransmit every acknowledgment message the
	  number of times given by value of CONFIG_BT_MESH_SAR_RX_ACK_RETRANS_COUNT.

config BT_MESH_SAR_RX_ACK_DELAY_INC
	hex "Acknowledgment delay increment"
	range 0x00 0x07
	default 0x01
	help
	  This value controls the delay increment of an interval used for
	  delaying the transmission of an acknowledgment message after
	  receiving a new segment. The increment is measured in segments
	  and calculated using the following formula:
	  CONFIG_BT_MESH_SAR_RX_ACK_DELAY_INC + 1.5.

config BT_MESH_SAR_RX_SEG_INT_STEP
	hex "Segments reception interval step"
	range 0x00 0x0F
	default 0x05
	help
	  This value defines the segments reception interval step used for
	  delaying the transmission of an acknowledgment message after
	  receiving a new segmnet. The interval is measured in milliseconds
	  and calculated using the following formula:
	  (CONFIG_BT_MESH_SAR_RX_SEG_INT_STEP + 1) * 10 ms

config BT_MESH_SAR_RX_DISCARD_TIMEOUT
	hex "Discard timeout for reception of a segmented message"
	range 0x00 0x0F
	default 0x01
	help
	  This value defines the time since the last successfully received
	  segment before giving up the reception of a segmented message.

config BT_MESH_SAR_RX_ACK_RETRANS_COUNT
	hex "Total number of acknowledgment message retransmission"
	range 0x00 0x03
	default 0x00
	help
	  This value defines the total number of retranmissions of an
	  acknowledgment message that the stack will additionally send when the
	  size of segments in a segmented message is above the
	  CONFIG_BT_MESH_SAR_RX_SEG_THRESHOLD value.

endmenu # Transport SAR configuration

config BT_MESH_DEFAULT_TTL
	int "Default TTL value"
	default 7
	range 0 128
	help
	  Controls the default TTL value for outgoing messages. Can be changed
	  through runtime configuration.

menu "Replay Protection List"

config BT_MESH_CRPL
	int "Maximum capacity of the replay protection list"
	default 10
	range 2 65535
	help
	  This options specifies the maximum capacity of the replay
	  protection list. This option is similar to the network message
	  cache size, but has a different purpose.

choice BT_MESH_RPL_STORAGE_MODE
	prompt "Replay protection list storage mode"
	default BT_MESH_RPL_STORAGE_MODE_SETTINGS

config BT_MESH_RPL_STORAGE_MODE_SETTINGS
	bool "Persistent storage of RPL in Settings"
	help
	  Persistent storage of RPL in Settings. If BT_SETTINGS is not
	  enabled this choise will provide a non-persistent implementation
	  variant of the RPL list.

endchoice

endmenu # Replay Protection List

endmenu # Transport layer

menu "Access layer"

config BT_MESH_ACCESS_LAYER_MSG
	bool "Direct Bluetooth message access layer messages"
	help
	  This option allows the application to directly access
	  Bluetooth access layer messages without the need to
	  instantiate Bluetooth Mesh models.

config BT_MESH_MODEL_VND_MSG_CID_FORCE
	bool "Force vendor model to use the corresponding CID field message"
	default y
	help
	  This option forces vendor model to use messages for the
	  corresponding CID field.

config BT_MESH_MODEL_EXTENSIONS
	bool "Support for Model extensions"
	help
	  Enable support for the model extension concept, allowing the Access
	  layer to know about mesh model relationships.

config BT_MESH_COMP_PAGE_1
	bool "Support for Composition Data Page 1"
	default y
	help
	  Enable support for Composition Data Page 1.

config BT_MESH_MODEL_EXTENSION_LIST_SIZE
	int "Model extensions list size"
	depends on BT_MESH_COMP_PAGE_1
	range 0 255
	default 0 if !BT_MESH_MODEL_EXTENSIONS
	default 10
	help
	  This option specifies how many models relations can be saved.
	  Equals to the number of `bt_mesh_model_extend` and `bt_mesh_model_correspond` calls.
	  This information is used to construct Composition Data Page 1.

config BT_MESH_COMP_PAGE_2
	bool "Support for Composition Data Page 2"
	help
	  Enable support for Composition Data Page 2.

config BT_MESH_COMP_PST_BUF_SIZE
	int "Composition Data Page persistence buffer size"
	default 100
	help
	  Stack allocated buffer used to temporarily hold Composition
	  Data Pages during flash operations. Should reflect the size
	  of the largest Composition Data Page present in the application.
	  Note that this buffer should still be large enough to restore previously stored
	  pages after a performed device firmware update.

config BT_MESH_LABEL_NO_RECOVER
	bool "[DEPRECATED] Don't recover Label UUIDs from groups address subscription list"
	select DEPRECATED
	depends on BT_MESH_LABEL_COUNT > 0
	help
	  After adding support for virtual addresses with collision (where two Label UUIDs have the
	  same virtual address), the format of the data in the persistent storage with the Label
	  UUIDs which a model is subscribed to or publishes to has been changed. The recovery
	  code is added and the Label UUIDs will be recovered by picking first Label UUID matching
	  to the virtual address in the subscription list or model publication. This options can
	  disable the recovery code and save some flash if the recovery is not required (e.g.
	  virtual address support wasn't enabled before this option was added, or the devices were
	  unprovisioned before upgrading to the version with this option). The option is marked as
	  deprecated to remove the recovery code eventually.

menuconfig BT_MESH_ACCESS_DELAYABLE_MSG
	bool "Access layer tx delayable message"
	default y
	help
	  Enable following of the message transmitting recommendations, the Access layer
	  specification. The recommendations are optional.
	  However, they are strictly recommended if the device participates in the network with
	  intensive communication where the device receives a lot of requests that require responses.

if BT_MESH_ACCESS_DELAYABLE_MSG

config BT_MESH_ACCESS_DELAYABLE_MSG_CTX_ENABLED
	bool "The delayable message in the notification message context"
	default y
	help
	  Controls whether the delayable message feature is enabled by default in
	  the message context of the opcode notifications. This allows the server part of any
	  model to not bother about additional context configuration to enable the delayable message.
	  Note that if this is disabled then all foundation models stop using the delayable message
	  functionality.

config BT_MESH_ACCESS_DELAYABLE_MSG_COUNT
	int "Number of simultaneously delayed messages"
	default 4
	help
	  The maximum number of messages the Access layer can manage to delay
	  at the same time. The number of messages can be handled only if the Access layer
	  has a sufficient amount of memory to store the model payload for them.

config BT_MESH_ACCESS_DELAYABLE_MSG_CHUNK_SIZE
	int "Maximum delayable message storage chunk"
	default 10
	help
	  Size of memory that Access layer uses to split model message to. It allocates
	  a sufficient number of these chunks from the pool to store the full model payload.

config BT_MESH_ACCESS_DELAYABLE_MSG_CHUNK_COUNT
	int "Maximum number of available chunks"
	default 40
	help
	  The maximum number of available chunks the Access layer allocates to store model payload.
	  It is recommended to keep chunk size equal to the reasonable small value to prevent
	  unnecessary memory wasting.

endif # BT_MESH_ACCESS_DELAYABLE_MSG

config BT_MESH_DELAYABLE_PUBLICATION
	bool "Delayable publication"
	default y
	help
	  When enabled, the periodic publications are randomly delayed by 20 to 50ms. Publications
	  triggered at the start of the stack or by the bt_mesh_model_publish() call are delayed by
	  20 to 500ms. This option reduces the probability of collisions when multiple nodes publish
	  at the same time.

endmenu # Access layer

menu "Models"

config BT_MESH_CFG_CLI
	bool "Support for Configuration Client Model"
	help
	  Enable support for the configuration client model.

if BT_MESH_CFG_CLI

config BT_MESH_CFG_CLI_TIMEOUT
	int "Config Client model timeout in milliseconds"
	default 5000
	help
	  This timeout controls how long config client waits for a response
	  message to arrive. This value can be changed at runtime using
	  @ref bt_mesh_cfg_cli_timeout_set.

endif # BT_MESH_CFG_CLI

config BT_MESH_HEALTH_CLI
	bool "Support for Health Client Model"
	help
	  Enable support for the health client model.

if BT_MESH_HEALTH_CLI

config BT_MESH_HEALTH_CLI_TIMEOUT
	int "Health Client model timeout in milliseconds"
	default 2000
	help
	  This timeout controls how long health client waits for a response
	  message to arrive. This value can be changed at runtime using
	  @ref bt_mesh_health_cli_timeout_set.

endif # BT_MESH_HEALTH_CLI

menuconfig BT_MESH_BLOB_SRV
	bool "Support for BLOB Transfer Server model"
	help
	  Enable the Binary Large Object (BLOB) Transfer Server model.

if BT_MESH_BLOB_SRV

config BT_MESH_BLOB_SRV_PULL_REQ_COUNT
	int "Number of chunks to request for each pull"
	default 4
	range 1 16
	help
	  In Pull mode (Pull BLOB Transfer Mode), the BLOB Transfer Server
	  requests a fixed number of chunks from the Client. Use this option to
	  control the chunk count in the request. If the BLOB Transfer Server
	  is instantiated on a Low Power node, the pull request count will be
	  trimmed to not overflow the Friend queue.

config BT_MESH_BLOB_SIZE_MAX
	int "Largest BLOB size in bytes"
	default 524288
	range 1 3257617792
	help
	  The maximum object size a BLOB Transfer Server can receive.

config BT_MESH_BLOB_BLOCK_SIZE_MIN
	int "Minimum block size"
	default 4096
	range 64 1048576 # 2^6 - 2^20
	help
	  Minimum acceptable block size in a BLOB transfer. The transfer block
	  size will be some number that is a power of two, and is between block
	  size min and block size max. If no such number exists, a compile
	  time warning will be issued.

config BT_MESH_BLOB_BLOCK_SIZE_MAX
	int "Maximum block size"
	default 4096
	range BT_MESH_BLOB_BLOCK_SIZE_MIN 1048576
	help
	  Maximum acceptable block size in a BLOB transfer. The transfer block
	  size will be some number that is a power of two, and is between block
	  size min and block size max. If no such number exists, a compile
	  time warning will be issued.

config BT_MESH_BLOB_REPORT_TIMEOUT
	int "Partial Block Report interval in Pull mode"
	default 10
	range 1 31
	help
	  The timer value that Pull BLOB Transfer Server uses to report missed chunks.

endif # BT_MESH_BLOB_SRV

menuconfig BT_MESH_BLOB_CLI
	bool "Support for BLOB Transfer Client model"
	help
	  Enable the Binary Large Object (BLOB) Transfer Client model.

if BT_MESH_BLOB_CLI

config BT_MESH_BLOB_CLI_BLOCK_RETRIES
	int "Number of retries per block"
	default 5
	help
	  Controls the number of times the client will attempt to resend missing
	  chunks to the BLOB receivers for every block.

endif

menu "BLOB models common configuration"
	visible if BT_MESH_BLOB_SRV || BT_MESH_BLOB_CLI

config BT_MESH_BLOB_CHUNK_COUNT_MAX
	int "Maximum chunk count per block"
	default 256
	range 1 2992
	help
	  A BLOB transfer contains several blocks. Each block is made up of
	  several chunks. This option controls the maximum chunk count per
	  block.

endmenu

config BT_MESH_BLOB_IO_FLASH
	bool "BLOB flash stream"
	default y
	depends on BT_MESH_BLOB_SRV || BT_MESH_BLOB_CLI
	depends on FLASH_MAP
	help
	  Enable the BLOB flash stream for reading and writing BLOBs directly to
	  and from flash.

config BT_MESH_DFU_SRV
	bool "Support for Firmware Update Server model"
	depends on BT_MESH_BLOB_SRV
	help
	  Enable the Firmware Update Server model.

config BT_MESH_DFU_CLI
	bool "Support for Firmware Update Client model"
	depends on BT_MESH_BLOB_CLI
	help
	  Enable the Firmware Update Client model.

menu "Firmware Update model configuration"
	visible if BT_MESH_DFU_SRV || BT_MESH_DFU_CLI

config BT_MESH_DFU_FWID_MAXLEN
	int "DFU FWID max length"
	default 16
	range 0 106
	help
	  This value defines the maximum length of an image's firmware ID.

config BT_MESH_DFU_METADATA_MAXLEN
	int "DFU metadata max length"
	default 32
	range 18 255 if BT_MESH_DFU_METADATA
	range 0 255
	help
	  This value defines the maximum length of an image's metadata.

config BT_MESH_DFU_METADATA
	bool "Support for the default metadata format"
	help
	  This option adds a set of functions that can be used to encode and decode a firmware
	  metadata using the format defined in the Bluetooth Mesh DFU subsystem.

config BT_MESH_DFU_URI_MAXLEN
	int "DFU URI max length"
	default 32
	range 0 255
	help
	  This value defines the maximum length of an image's URI, not including
	  a string terminator.

endmenu # Firmware Update model configuration

menuconfig BT_MESH_DFU_SLOTS
	bool "Firmware image slot manager"
	default y if BT_MESH_DFU_CLI
	help
	  Enable the DFU image slot manager, for managing firmware distribution slots
	  for the Firmware Update Client model.

if BT_MESH_DFU_SLOTS

config BT_MESH_DFU_SLOT_CNT
	int "Number of firmware image slots"
	default 1
	range 1 32767
	help
	  This value defines the number of firmware slots the DFU image slot manager
	  can keep simultaneously.

endif

menuconfig BT_MESH_DFD_SRV
	bool "Support for Firmware Distribution Server model"
	depends on BT_MESH_BLOB_SRV
	depends on BT_MESH_DFU_CLI
	help
	  Enable the Firmware Distribution Server model.

if BT_MESH_DFD_SRV

config BT_MESH_DFD_SRV_SLOT_MAX_SIZE
	int "Largest DFU image that can be stored"
	default BT_MESH_BLOB_SIZE_MAX
	range 0 BT_MESH_BLOB_SIZE_MAX
	help
	  This value defines the largest DFU image a single slot can store.

config BT_MESH_DFD_SRV_SLOT_SPACE
	int "Total DFU image storage space"
	default BT_MESH_DFD_SRV_SLOT_MAX_SIZE
	range 0 4294967295
	help
	  This value defines the total storage space dedicated to storing DFU
	  images on the Firmware Distribution Server.

config BT_MESH_DFD_SRV_TARGETS_MAX
	int "Maximum Target node count"
	default 8
	range 1 65535
	help
	  This value defines the maximum number of Target nodes the Firmware
	  Distribution Server can target simultaneously.

config BT_MESH_DFD_SRV_OOB_UPLOAD
	bool "Support for DFU image OOB upload"
	help
	  This enables support for OOB upload of firmware images for
	  distribution. This makes several callbacks and use of the init
	  macro BT_MESH_DFD_SRV_INIT_OOB mandatory. See the API documentation
	  for bt_mesh_dfd_srv_cb for details about the mandatory callbacks.

endif

config BT_MESH_RPR_SRV
	bool "Support for Remote Provisioning Server model"
	help
	  The Remote Provisioning Server is the proxy for a provisioning
	  process, allowing provisioners to tunnel their provisioning
	  messages through the mesh to the Remote Provisioning Server, which
	  communicates directly with the unprovisioned node.

config BT_MESH_RPR_CLI
	bool "Support for Remote Provisioning Client model"
	depends on BT_MESH_PROVISIONER
	help
	  The Remote Provisioning Client is instantiated on the provisioner
	  node, and allows provisioning of new devices through the mesh network
	  by tunnelling provisioning messages to a Remote Provisioning Server.

menu "Remote Provisioning configuration"
	visible if BT_MESH_RPR_SRV || BT_MESH_RPR_CLI

config BT_MESH_RPR_AD_TYPES_MAX
	int "Max AD types in extended scanning"
	default 1
	range 1 16
	help
	  During extended scanning, the Remote Provisioning Server can include
	  a set of AD types in the scan reports, collected from the
	  unprovisioned device's advertisement data. This option controls
	  the highest number of AD types a single server can scan for, and a
	  Client can request.

config BT_MESH_RPR_SRV_SCANNED_ITEMS_MAX
	int "Max scannable unprovisioned devices for Remote Provisioning Server"
	default 4
	range 4 255
	help
	  Max number of unique unprovisioned devices a single Remote
	  Provisioning Server can hold.

config BT_MESH_RPR_SRV_AD_DATA_MAX
	int "Max additional advertisement data to report"
	default 31
	range 3 255
	help
	  Buffer size for the additional advertisement data reported during
	  extended scanning.

endmenu # Remote Provisioning configuration

config BT_MESH_SAR_CFG
	bool

config BT_MESH_SAR_CFG_SRV
	bool "Support for SAR Configuration Server model"
	select BT_MESH_SAR_CFG
	help
	  Enable support for the SAR configuration server model.

config BT_MESH_SAR_CFG_CLI
	bool "Support for SAR Configuration Client Model"
	select BT_MESH_SAR_CFG
	help
	  Enable support for the SAR configuration client model.

config BT_MESH_OP_AGG
	bool

config BT_MESH_OP_AGG_SRV
	bool "Support for Opcode Aggregator Server Model"
	select BT_MESH_OP_AGG
	help
	  Enable support for the Opcode Aggregator Server model.

config BT_MESH_OP_AGG_CLI
	bool "Support for Opcode Aggregator Client Model"
	select BT_MESH_OP_AGG
	help
	  Enable support for the Opcode Aggregator Client model.

if BT_MESH_OP_AGG_CLI

config BT_MESH_OP_AGG_CLI_TIMEOUT
	int "Opcodes Aggregator Client model timeout in milliseconds"
	default 10000
	help
	  This timeout controls how long Opcodes Aggregator Client waits
	  for a response message to arrive. This value can be changed at
	  runtime using @ref bt_mesh_op_agg_cli_timeout_set.

endif # BT_MESH_OP_AGG_CLI

config BT_MESH_LARGE_COMP_DATA_SRV
	bool "Support for Large Composition Data Server Model"
	help
	  Enable support for the Large Composition Data Server model.

if BT_MESH_LARGE_COMP_DATA_SRV

config BT_MESH_MODELS_METADATA_PAGE_LEN
	int "Maximum length of the Models Metadata Page"
	default 150
	help
	  This value is the combined total metadata length for
	  all models on the device.

endif # BT_MESH_LARGE_COMP_DATA_SRV

config BT_MESH_LARGE_COMP_DATA_CLI
	bool "Support for Large Composition Data Client model"
	help
	  Enable support for the Large Composition Data Client model.

if BT_MESH_PRIV_BEACONS

config BT_MESH_PRIV_BEACON_SRV
	bool "Support for Private Beacon Server Model"
	help
	  Enable support for the Private Beacon Server model.

config BT_MESH_PRIV_BEACON_CLI
	bool "Support for Private Beacon Client Model"
	help
	  Enable support for the Private Beacon Client model.

endif # BT_MESH_PRIV_BEACONS

config BT_MESH_OD_PRIV_PROXY_CLI
	bool "Support for On-Demand Private Proxy Client model"
	help
	  On-Demand Private Proxy Client allows to configure and check the state
	  of On-Demand Private Proxy Servers. The state determines if the peers will
	  advertise the Private Network Identity type after receiving a Solicitation PDU.


config BT_MESH_OD_PRIV_PROXY_CLI_TIMEOUT
	int "Solicitation PDU RPL Configuration Client model timeout in milliseconds"
	default 5000
	depends on BT_MESH_OD_PRIV_PROXY_CLI
	help
	  This timeout controls how long the On-Demand Private Proxy Client waits
	  for a response message to arrive. This value can be changed at runtime
	  using @ref bt_mesh_od_priv_proxy_cli_timeout_set.

config BT_MESH_OD_PRIV_PROXY_SRV
	bool "Support for On-Demand Private Proxy Server model"
	depends on BT_MESH_PRIV_BEACON_SRV
	select BT_MESH_SOLICITATION
	help
	  The On-Demand Private Proxy Server is used to support configuration of
	  advertising with Private Network Identity type of a node.
	  When enabled, the Solicitation PDU RPL Configuration Server model is also enabled.

config BT_MESH_PROXY_SRPL_SIZE
	int "Size of solicitation replay protection list (SRPL)"
	depends on BT_MESH_OD_PRIV_PROXY_SRV
	default 10
	range 1 255
	help
	  Size of SRPL. The list is used to determine if a received Solicitation PDU
	  is valid. It is valid when the SSRC field value of the received Solicitation PDU
	  is stored in the SRPL and the SSEQ field value is bigger than the corresponding
	  stored SSEQ value, or if the SSRC was not stored in the RPL and the SRPL still has
	  space for new entries.

config BT_MESH_SOL_PDU_RPL_CLI
	bool "Support for Solicitation PDU RPL Configuration Client model"
	help
	  The Solicitation PDU RPL Configuration Client is used to support the
	  functionality of removing addresses from the solicitation replay
	  protection list (SRPL) of a node that supports the Solicitation
	  PDU RPL Configuration Server model.

config BT_MESH_SOL_PDU_RPL_CLI_TIMEOUT
	int "Solicitation PDU RPL Configuration Client model timeout in milliseconds"
	default 5000
	depends on BT_MESH_SOL_PDU_RPL_CLI
	help
	  This timeout controls how long Solicitation PDU RPL Configuration Client waits
	  for a response message to arrive. This value can be changed at runtime
	  using @ref bt_mesh_sol_pdu_rpl_cli_timeout_set.

endmenu # Models

menu "Proxy"
	visible if BT_CONN

menuconfig BT_MESH_GATT_PROXY
	bool "GATT Proxy Service support"
	select BT_MESH_GATT_SERVER
	select BT_MESH_PROXY
	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.

if BT_MESH_GATT_PROXY

config BT_MESH_GATT_PROXY_ENABLED
	bool "GATT Proxy enabled"
	depends on BT_MESH_GATT_PROXY
	default y
	help
	  Controls whether the GATT Proxy feature is enabled by default.
	  Can be changed through runtime configuration.

config BT_MESH_NODE_ID_TIMEOUT
	int "Node Identity advertising timeout"
	range 1 60
	default 60
	help
	  This option determines for how long the local node advertises
	  using Node Identity. The given value is in seconds. The
	  specification limits this to 60 seconds, and implies that to
	  be the appropriate value as well, so just leaving this as the
	  default is the safest option.

config BT_MESH_PROXY_USE_DEVICE_NAME
	bool "Include Bluetooth device name in scan response"
	help
	  This option includes GAP device name in scan response when
	  the GATT Proxy feature is enabled.

config BT_MESH_PROXY_FILTER_SIZE
	int "Maximum number of filter entries per Proxy Client"
	default 16
	range 1 32767
	help
	  This option specifies how many Proxy Filter entries the local
	  node supports. This helps in reducing unwanted traffic getting sent to
	  the proxy client. This value is application specific and should be large
	  enough so that proxy client can communicate with several devices through
	  this proxy server node using the default accept list filter type.

endif # BT_MESH_GATT_PROXY

config BT_MESH_PROXY_CLIENT
	bool "Proxy client support"
	select BT_GATT_CLIENT
	select BT_MESH_GATT_CLIENT
	depends on BT_CENTRAL
	help
	  This option enables support for the Mesh GATT Proxy Client,
	  i.e. the ability to act as a proxy between a Mesh GATT Service
	  and a Mesh network.

config BT_MESH_SOLICITATION
	bool

config BT_MESH_PROXY_SOLICITATION
	bool "Proxy solicitation feature"
	select BT_MESH_SOLICITATION
	help
	  This option enables support for sending Solicitation PDUs.

config BT_MESH_SOL_ADV_XMIT
	int "Solicitation PDU retransmission count"
	depends on BT_MESH_PROXY_SOLICITATION
	range 0 10
	default 2
	help
	  How many times Solicitation PDU advertisements will be repeated. 0 means that there will be
	  1 transmission without retransmissions.

endmenu # Proxy

choice BT_MESH_CRYPTO_LIB
	prompt "Crypto library:"
	default BT_MESH_USES_TFM_PSA if BUILD_WITH_TFM
	default BT_MESH_USES_TINYCRYPT
	help
	  Crypto library selection for mesh security.

config BT_MESH_USES_TINYCRYPT
	bool "TinyCrypt"
	select TINYCRYPT
	select TINYCRYPT_AES
	select TINYCRYPT_AES_CMAC
	select TINYCRYPT_ECC_DH
	select TINYCRYPT_SHA256
	select TINYCRYPT_SHA256_HMAC
	select BT_HOST_CCM
	help
	  Use TinyCrypt library to perform crypto operations.

config BT_MESH_USES_MBEDTLS_PSA
	bool "mbed TLS PSA [EXPERIMENTAL]"
	select EXPERIMENTAL
	select MBEDTLS
	select MBEDTLS_ZEPHYR_ENTROPY
	select MBEDTLS_PSA_CRYPTO_C
	select MBEDTLS_MAC_CMAC_ENABLED
	select MBEDTLS_CIPHER_AES_ENABLED
	select MBEDTLS_AES_ROM_TABLES
	select MBEDTLS_CIPHER_CCM_ENABLED
	select MBEDTLS_ECP_C
	select MBEDTLS_ECDH_C
	select MBEDTLS_ECDSA_C
	select MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
	select MBEDTLS_ECP_DP_SECP256R1_ENABLED
	select MBEDTLS_PK_WRITE_C
	help
	  Use mbed TLS library to perform crypto operations. Support of
	  mbed TLS and PSA is experimental and only BabbleSim tests were run.
	  Mbed TLS still does not support ITS (internal trust storage) based
	  on Zephyr's settings subsystem.
	  Not possible to use for embedded devices yet.

config BT_MESH_USES_TFM_PSA
	bool "Use TF-M PSA [EXPERIMENTAL]"
	select EXPERIMENTAL
	depends on BUILD_WITH_TFM
	help
	  Use TF-M that implements PSA security framework. Support of TF-M is
	  experimental. It is only possible to use with platforms that TF-M supports.
	  For more platform details see TF-M documentation.

endchoice

if BT_MESH_USES_MBEDTLS_PSA || BT_MESH_USES_TFM_PSA

config BT_MESH_PSA_KEY_ID_USER_MIN_OFFSET
	int "Offset of BLE Mesh key id range regarding PSA_KEY_ID_USER_MIN"
	default 0
	help
	  The PSA specification mandates to set key identifiers for keys
	  with persistent lifetime. The users of the PSA API is responsible
	  (BLE Mesh is user of PSA API) to provide correct and unique identifiers.
	  The BLE Mesh identifier range should be between PSA_KEY_ID_USER_MIN and
	  PSA_KEY_ID_USER_MAX. BLE Mesh requires two ids for each subnetwork, two ids
	  for each application key, and two ids for the device key and device key candidate.
	  It should consider the Mesh Configuration Database instances if database enabled.

endif # BT_MESH_USES_MBEDTLS_PSA || BT_MESH_USES_TFM_PSA

menu "Beacons"

config BT_MESH_BEACON_ENABLED
	bool "Secure network beacon enabled"
	default y
	help
	  Controls whether the Secure network beacon feature is enabled by
	  default. Can be changed through runtime configuration.

config BT_MESH_PRIV_BEACONS
	bool "Support for private beacons"
	default y
	help
	  Enable support for private beacons.

endmenu # Beacons

menu "IV Index & Sequence number"

config BT_MESH_IV_UPDATE_TEST
	bool "Test the IV Update Procedure"
	help
	  This option removes the 96 hour limit of the IV Update
	  Procedure and lets the state be changed at any time.

config BT_MESH_IV_UPDATE_SEQ_LIMIT
	hex "Sequence number limit to start iv update"
	default 0x800000
	range 0x000001 0xFFFFFE
	help
	  This option specifies the sequence number value to start iv update.

config BT_MESH_IVU_DIVIDER
	int "Divider for IV Update state refresh timer"
	default 4
	range 2 96
	help
	  When the IV Update state enters Normal operation or IV Update
	  in Progress, we need to keep track of how many hours has passed
	  in the state, since the specification requires us to remain in
	  the state at least for 96 hours (Update in Progress has an
	  additional upper limit of 144 hours).

	  In order to fulfill the above requirement, even if the node might
	  be powered off once in a while, we need to store persistently
	  how many hours the node has been in the state. This doesn't
	  necessarily need to happen every hour (thanks to the flexible
	  duration range). The exact cadence will depend a lot on the
	  ways that the node will be used and what kind of power source it
	  has.

	  Since there is no single optimal answer, this configuration
	  option allows specifying a divider, i.e. how many intervals
	  the 96 hour minimum gets split into. After each interval the
	  duration that the node has been in the current state gets
	  stored to flash. E.g. the default value of 4 means that the
	  state is saved every 24 hours (96 / 4).

endmenu # IV Index & Sequence number

menuconfig BT_MESH_LOW_POWER
	bool "Support for Low Power features"
	help
	  Enable this option to be able to act as a Low Power Node.

if BT_MESH_LOW_POWER

config BT_MESH_LPN_ESTABLISHMENT
	bool "Perform Friendship establishment using low power"
	default y
	help
	  Perform the Friendship establishment using low power, with
	  the help of a reduced scan duty cycle. The downside of this
	  is that the node may miss out on messages intended for it
	  until it has successfully set up Friendship with a Friend
	  node.

config BT_MESH_LPN_AUTO
	bool "Automatically start looking for Friend nodes once provisioned"
	default y
	help
	  Automatically enable LPN functionality once provisioned and start
	  looking for Friend nodes. If this option is disabled LPN mode
	  needs to be manually enabled by calling bt_mesh_lpn_set(true).

config BT_MESH_LPN_AUTO_TIMEOUT
	int "Time from last received message before going to LPN mode"
	default 15
	range 0 3600
	depends on BT_MESH_LPN_AUTO
	help
	  Time in seconds from the last received message, that the node
	  will wait before starting to look for Friend nodes.

config BT_MESH_LPN_RETRY_TIMEOUT
	int "Retry timeout for Friend requests"
	default 8
	range 1 3600
	help
	  Time in seconds between Friend Requests, if a previous Friend
	  Request did not receive any acceptable Friend Offers.

config BT_MESH_LPN_RSSI_FACTOR
	int "RSSIFactor, used in the Friend Offer Delay calculation"
	range 0 3
	default 0
	help
	  The contribution of the RSSI measured by the Friend node used
	  in Friend Offer Delay calculations. 0 = 1, 1 = 1.5, 2 = 2, 3 = 2.5.

config BT_MESH_LPN_RECV_WIN_FACTOR
	int "ReceiveWindowFactor, used in the Friend Offer Delay calculation"
	range 0 3
	default 0
	help
	  The contribution of the supported Receive Window used in
	  Friend Offer Delay calculations. 0 = 1, 1 = 1.5, 2 = 2, 3 = 2.5.

config BT_MESH_LPN_MIN_QUEUE_SIZE
	int "Minimum size of acceptable friend queue (MinQueueSizeLog)"
	range 1 7
	default 1
	help
	  The MinQueueSizeLog field is defined as log_2(N), where N is
	  the minimum number of maximum size Lower Transport PDUs that
	  the Friend node can store in its Friend Queue. As an example,
	  MinQueueSizeLog value 1 gives N = 2, and value 7 gives N = 128.

config BT_MESH_LPN_RECV_DELAY
	int "Receive delay requested by the local node"
	range 50 255 if BT_MESH_ADV_LEGACY
	range 10 255
	default 100
	help
	  The ReceiveDelay is the time between the Low Power node
	  sending a request and listening for a response. This delay
	  allows the Friend node time to prepare the response. The value
	  is in units of milliseconds. When BT_MESH_ADV_LEGACY is used,
	  the minimal value for the delay can not be less than 50ms due
	  to a limitation in the legacy advertiser implementation.

config BT_MESH_LPN_POLL_TIMEOUT
	int "The value of the PollTimeout timer"
	range 10 244735
	default 300
	help
	  PollTimeout timer is used to measure time between two
	  consecutive requests sent by the Low Power node. If no
	  requests are received by the Friend node before the
	  PollTimeout timer expires, then the friendship is considered
	  terminated. The value is in units of 100 milliseconds, so e.g.
	  a value of 300 means 30 seconds.

config BT_MESH_LPN_INIT_POLL_TIMEOUT
	int "The starting value of the PollTimeout timer"
	range 10 BT_MESH_LPN_POLL_TIMEOUT
	default BT_MESH_LPN_POLL_TIMEOUT
	help
	  The initial value of the PollTimeout timer when Friendship
	  gets established for the first time. After this the timeout
	  will gradually grow toward the actual PollTimeout, doubling
	  in value for each iteration. The value is in units of 100
	  milliseconds, so e.g. a value of 300 means 30 seconds.

config BT_MESH_LPN_SCAN_LATENCY
	int "Latency for enabling scanning"
	range 0 50
	default 15
	help
	  Latency in milliseconds that it takes to enable scanning. This
	  is in practice how much time in advance before the Receive Window
	  that scanning is requested to be enabled.

config BT_MESH_LPN_GROUPS
	int "Number of groups the LPN can subscribe to"
	range 0 16384
	default 8
	help
	  Maximum number of groups that the LPN can subscribe to.

config BT_MESH_LPN_SUB_ALL_NODES_ADDR
	bool "Automatically subscribe all nodes address"
	help
	  Automatically subscribe all nodes address when friendship
	  established.

endif # BT_MESH_LOW_POWER

menuconfig BT_MESH_FRIEND
	bool "Support for acting as a Friend Node"
	help
	  Enable this option to be able to act as a Friend Node.

if BT_MESH_FRIEND

config BT_MESH_FRIEND_ENABLED
	bool "Friend feature enabled by default"
	default y
	help
	  Controls whether the Friend feature is enabled by default when the
	  device boots up for the first time or unprovisioned. Can be changed
	  at runtime using bt_mesh_friend_set() function.

config BT_MESH_FRIEND_RECV_WIN
	int "Friend Receive Window"
	range 1 255
	default 255
	help
	  Receive Window in milliseconds supported by the Friend node.

config BT_MESH_FRIEND_QUEUE_SIZE
	int "Minimum number of buffers supported per Friend Queue"
	range 2 65536
	default 16
	help
	  Minimum number of buffers available to be stored for each
	  local Friend Queue.

config BT_MESH_FRIEND_SUB_LIST_SIZE
	int "Friend Subscription List Size"
	range 0 1023
	default 3
	help
	  Size of the Subscription List that can be supported by a
	  Friend node for a Low Power node.

config BT_MESH_FRIEND_LPN_COUNT
	int "Number of supported LPN nodes"
	range 1 1000
	default 2
	help
	  Number of Low Power Nodes the Friend can have a Friendship
	  with simultaneously.

config BT_MESH_FRIEND_SEG_RX
	int "Number of incomplete segment lists per LPN"
	range 1 1000
	default 1
	help
	  Number of incomplete segment lists that we track for each LPN
	  that we are Friends for. In other words, this determines how
	  many elements we can simultaneously be receiving segmented
	  messages from when the messages are going into the Friend queue.

config BT_MESH_FRIEND_ADV_LATENCY
	int "Latency for enabling advertising"
	range 0 4
	default 0
	help
	  Latency in milliseconds between request for and start of Friend
	  advertising. Used to tune the ReceiveDelay, making Friend
	  start sending a message earlier thus compensating for the time between
	  pushing the message to the Bluetooth host and the actual advertising
	  start.

endif # BT_MESH_FRIEND

menu "Capabilities"

config BT_MESH_SUBNET_COUNT
	int "Maximum number of mesh subnets per network"
	default 1
	range 1 4096
	help
	  This option specifies how many subnets a Mesh network can
	  participate in at the same time.

config BT_MESH_APP_KEY_COUNT
	int "Maximum number of application keys per network"
	default 1
	range 1 4096
	help
	  This option specifies how many application keys the device can
	  store per network.

config BT_MESH_MODEL_KEY_COUNT
	int "Maximum number of application keys per model"
	default 1
	range 1 4096
	help
	  This option specifies how many application keys each model can
	  at most be bound to.

config BT_MESH_MODEL_GROUP_COUNT
	int "Maximum number of group address subscriptions per model"
	default 1
	range 1 4096
	help
	  This option specifies how many group addresses each model can
	  at most be subscribed to.

config BT_MESH_LABEL_COUNT
	int "Maximum number of Label UUIDs used for Virtual Addresses"
	default 1
	range 0 4096
	help
	  This option specifies how many Label UUIDs can be stored.

endmenu # Capabilities

menu "Persistent storage"
	visible if BT_SETTINGS

config BT_MESH_STORE_TIMEOUT
	int "Delay (in seconds) before storing anything persistently"
	range 0 1000000
	default 2
	help
	  This value defines in seconds how soon any pending changes
	  are actually written into persistent storage (flash) after
	  a change occurs.

config BT_MESH_SEQ_STORE_RATE
	int "How often the sequence number gets updated in storage"
	range 0 1000000
	default 128
	default 1 if !BT_SETTINGS # To keep compiling the code
	help
	  This value defines how often the local sequence number gets
	  updated in persistent storage (i.e. flash). E.g. a value of 100
	  means that the sequence number will be stored to flash on every
	  100th increment. If the node sends messages very frequently a
	  higher value makes more sense, whereas if the node sends
	  infrequently a value as low as 0 (update storage for every
	  increment) can make sense. When the stack gets initialized it
	  will add this number to the last stored one, so that it starts
	  off with a value that's guaranteed to be larger than the last
	  one used before power off.

if BT_MESH_RPL_STORAGE_MODE_SETTINGS && BT_SETTINGS

config BT_MESH_RPL_STORE_TIMEOUT
	int "Minimum interval after which unsaved RPL and SRPL entries are updated in the settings subsystem"
	range -1 1000000
	default 5
	help
	  This value defines time in seconds until unsaved RPL and SRPL entries
	  are written to the persistent storage. Setting this value
	  to a large number may lead to security vulnerabilities if a node
	  gets powered off before the timer is fired. When flash is used
	  as the persistent storage setting this value to a low number
	  may wear out flash sooner or later. However, if the RPL gets
	  updated infrequently a value as low as 0 (write immediately)
	  may make sense. Setting this value to -1 will disable this timer.
	  In this case, a user is responsible to store pending RPL entries
	  using @ref bt_mesh_rpl_pending_store. In the mean time, when
	  IV Index is updated, the outdated RPL entries will still be
	  stored by @ref BT_MESH_STORE_TIMEOUT. Finding the right balance
	  between this timeout and calling @ref bt_mesh_rpl_pending_store
	  may reduce a risk of security vulnerability and flash wear out.
	  Failure to store the RPL and becoming vulnerable after reboot
	  will cause the device to not perform the replay protection
	  required by the spec.

endif # BT_MESH_RPL_STORAGE_MODE_SETTINGS && BT_SETTINGS

config BT_MESH_SETTINGS_WORKQ
	bool "Store the Bluetooth Mesh settings in a separate work queue"
	default y
	help
	  This option enables a separate cooperative thread which is used to
	  store Bluetooth Mesh configuration. When this option is disabled,
	  the stack's configuration is stored in the system workqueue. This
	  means that the system workqueue will be blocked for the time needed
	  to store the pending data. This time may significantly increase if
	  the flash driver does the erase operation. Enabling this option
	  allows Bluetooth Mesh not to block the system workqueue, and thus
	  process the incoming and outgoing messages while the flash driver
	  waits for the controller to allocate the time needed to write the
	  data and/or erase the required flash pages.

if BT_MESH_SETTINGS_WORKQ

config BT_MESH_SETTINGS_WORKQ_PRIO
	int
	default 1

config BT_MESH_SETTINGS_WORKQ_STACK_SIZE
	int "Stack size of the settings workq"
	default 1200 if BT_MESH_RPR_SRV
	default 880
	help
	  Size of the settings workqueue stack.

endif # BT_MESH_SETTINGS_WORKQ

endmenu # Persistent storage

rsource "shell/Kconfig"

if BT_CONN

config BT_MESH_MAX_CONN
	int "Maximum number of simultaneous Bluetooth connections"
	default BT_MAX_CONN
	range 1 BT_MAX_CONN
	help
	  Maximum number of simultaneous Bluetooth connections that the Bluetooth
	  mesh stack can use.

endif # BT_CONN

config BT_MESH_SELF_TEST
	bool "Perform self-tests"
	help
	  This option adds extra self-tests which are run every time
	  mesh networking is initialized.

config BT_MESH_STATISTIC
	bool "The frame handling statistics [EXPERIMENTAL]"
	select EXPERIMENTAL
	help
	  The module gathers statistics of received, relayed, and transmitted
	  frames. This helps to estimate the quality of the communication and
	  the sufficiency of configured advertiser instances.

endif # BT_MESH
