# Copyright Runtime.io 2018. All rights reserved.
# Copyright Nordic Semiconductor ASA 2020. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

menuconfig MCUMGR
	bool "mcumgr Support"
	select NET_BUF
	select ZCBOR
	help
	  This option enables the mcumgr management library.

if MCUMGR

module = MCUMGR
module-str = mcumgr
source "subsys/logging/Kconfig.template.log_config"


config APP_LINK_WITH_MCUMGR
	bool "Link 'app' with MCUMGR"
	default y
	help
	  Add MCUMGR header files to the 'app' include path. It may be
	  disabled if the include paths for MCUMGR are causing aliasing
	  issues for 'app'.

rsource "lib/Kconfig"

config MGMT_MAX_MAIN_MAP_ENTRIES
	int "Number of predicted maximum entries to main response map"
	default 15
	help
	  This is number of predicted entries in main response map,
	  the one that encapsulates everything within response.
	  This value is used by zcbor to predict needed map encoding,
	  and does not affect memory allocation or usage.
	  Builtin command processors rarely add large amounts of
	  data directly to main map, creating sub-maps instead so
	  the default value works fine with them.
	  If your app directly adds fields to main map, without
	  encapsulating them, you may want to increase this value
	  in case when encoding starts to fail.

config MGMT_MIN_DECODING_LEVELS
	int
	help
	  Minimal decoding levels, map/list encapsulation, required
	  to be supported by zcbor decoding of SMP responses
	  is auto genereated from MGMT_MIN_DECODING_LEVEL_? options.
	  A group or command that adds additional maps/lists above the
	  base map, which is already taken into account, should
	  select one of the MGMT_MIN_DECODING_LEVEL_?.
	default 5 if MGMT_MIN_DECODING_LEVEL_5
	default 4 if MGMT_MIN_DECODING_LEVEL_4
	default 3 if MGMT_MIN_DECODING_LEVEL_3
	default 2 if MGMT_MIN_DECODING_LEVEL_2
	default 1 if MGMT_MIN_DECODING_LEVEL_1
	default 0


config MGMT_MIN_DECODING_LEVEL_1
	bool

config MGMT_MIN_DECODING_LEVEL_2
	bool

config MGMT_MIN_DECODING_LEVEL_3
	bool

config MGMT_MIN_DECODING_LEVEL_4
	bool

config MGMT_MIN_DECODING_LEVEL_5
	bool

config MGMT_MAX_DECODING_LEVELS
	int "Number of map/list encapsulations allowed by SMP encoding"
	range MGMT_MIN_DECODING_LEVELS 15
	default MGMT_MIN_DECODING_LEVELS
	help
	  This is a maximum number of levels of maps/lists that will
	  be expected to be decoded within different command groups.
	  SMP commands/groups that provide no CBOR encoded payload
	  have no requirements.
	  Commands that provide CBOR payload require at least 1 level,
	  and additional levels for each map/list encapsulation.
	  For example if command accepts payload of map of parameters
	  it will need 2 levels.
	  This number translates to zcbor backup states, it increases
	  size of cbor_nb_reader structure by zcbor_state_t size per
	  one unit selected here.

menu "Command Handlers"

rsource "lib/cmd/Kconfig"

rsource "zephyr_grp/Kconfig"

endmenu

menu "Transports and Transport Related Configuration Options"

config MCUMGR_SMP_REASSEMBLY
	bool
	help
	  Enable structures and functions needed for packet reassembly by SMP backend.

config MCUMGR_BUF_COUNT
	int "Number of mcumgr buffers"
	default 2 if MCUMGR_SMP_UDP
	default 4
	help
	  The number of net_bufs to allocate for mcumgr.  These buffers are
	  used for both requests and responses.

config MCUMGR_BUF_SIZE
	int "Size of each mcumgr buffer"
	default 2048 if MCUMGR_SMP_UDP
	default 384
	help
	  The size, in bytes, of each mcumgr buffer.  This value must satisfy
	  the following relation:
	  MCUMGR_BUF_SIZE >= transport-specific-MTU + transport-overhead
	  In case when MCUMGR_SMP_SHELL is enabled this value should be set to
	  at least SHELL_BACKEND_DUMMY_BUF_SIZE + 32.

config MCUMGR_BUF_USER_DATA_SIZE
	int "Size of mcumgr buffer user data"
	default 24 if MCUMGR_SMP_UDP && MCUMGR_SMP_UDP_IPV6
	default 8 if MCUMGR_SMP_UDP && MCUMGR_SMP_UDP_IPV4
	default 4
	help
	  The size, in bytes, of user data to allocate for each mcumgr buffer.

	  Different mcumgr transports impose different requirements for this
	  setting. A value of 4 is sufficient for UART, shell, and bluetooth.
	  For UDP, the userdata must be large enough to hold a IPv4/IPv6 address.


menuconfig MCUMGR_SMP_BT
	bool "Bluetooth mcumgr SMP transport"
	select BT
	select BT_PERIPHERAL
	select BT_GATT_DYNAMIC_DB
	help
	  Enables handling of SMP commands received over Bluetooth.

if MCUMGR_SMP_BT

config MCUMGR_SMP_REASSEMBLY_BT
	bool "Reassemble packets in Bluetooth SMP transport"
	select MCUMGR_SMP_REASSEMBLY
	help
	  When enabled, the SMP BT transport will buffer and reassemble received
	  packet fragments before passing it for further processing.


config MCUMGR_SMP_BT_AUTHEN
	bool "Authenticated requirement for Bluetooth mcumgr SMP transport"
	select BT_SMP
	default y
	help
	  Enables encrypted and authenticated connection requirement to
	  Bluetooth SMP transport.

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL
	bool "Request specific connection parameters for SMP packet exchange"
	depends on SYSTEM_WORKQUEUE_PRIORITY < 0
	depends on BT_GAP_PERIPHERAL_PREF_PARAMS
	help
	  Enables support for requesting specific connection parameters when
	  SMP commands are handled. This option allows to speed up the command
	  exchange process.
	  Its recommended to enable this if SMP is used for DFU.

if MCUMGR_SMP_BT_CONN_PARAM_CONTROL

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL_MIN_INT
	int "Minimum connection interval for SMP packet exchange"
	default 6
	range 6 3200
	help
	  Minimum connection interval in 1.25ms units used during the exchange of SMP packets.

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL_MAX_INT
	int "Maximum connection interval for SMP packet exchange"
	default 9
	range MCUMGR_SMP_BT_CONN_PARAM_CONTROL_MIN_INT 3200
	help
	  Maximum connection interval in 1.25ms units used during the exchange of SMP packets.

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL_LATENCY
	int "Peripheral latency for SMP packet exchange"
	default 0
	range 0 499
	help
	  Peripheral latency in Connection Intervals used during the exchange of SMP packets.

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL_TIMEOUT
	int "Supervision timeout for SMP packet exchange"
	default 42
	range 10 3200
	help
	  Supervision timeout in 10ms used during the exchange of SMP packets.

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL_RESTORE_TIME
	int "Connection parameters restore time in milliseconds"
	default 5000
	range 1000 65535
	help
	  The value is a time of inactivity on the SMP characteristic after which
	  connection parameters are restored to peripheral preferred values
	  (BT_GAP_PERIPHERAL_PREF_PARAMS).

config MCUMGR_SMP_BT_CONN_PARAM_CONTROL_RETRY_TIME
	int "Connection parameters update retry time in milliseconds"
	default 1000
	range 1 5000
	help
	  In case connection parameters update fails due to an error, this
	  option specifies the time of the next update attempt.

endif # MCUMGR_SMP_BT_CONN_PARAM_CONTROL

endif # MCUMGR_SMP_BT

menuconfig MCUMGR_SMP_SHELL
	bool "Shell mcumgr SMP transport"
	select SHELL
	select SHELL_BACKEND_SERIAL
	select BASE64
	help
	  Enables handling of SMP commands received over shell.  This allows
	  the shell to be use for both mcumgr commands and shell commands.

if MCUMGR_SMP_SHELL

config MCUMGR_SMP_SHELL_MTU
	int "Shell SMP MTU"
	default 256
	help
	  Maximum size of SMP frames sent and received over shell.  This value
	  must satisfy the following relation:
	  MCUMGR_SMP_SHELL_MTU <= MCUMGR_BUF_SIZE + 2

config MCUMGR_SMP_SHELL_RX_BUF_COUNT
	int "Shell SMP RX buffer count"
	default 2
	help
	  Number of buffers used for receiving SMP fragments over shell.

endif # MCUMGR_SMP_SHELL

menuconfig MCUMGR_SMP_UART
	bool "UART mcumgr SMP transport"
	select UART_MCUMGR
	select BASE64
	help
	  Enables handling of SMP commands received over UART.  This is a
	  lightweight alternative to MCUMGR_SMP_SHELL.  It allows mcumgr
	  commands to be received over UART without requiring an additional
	  thread.

if UART_ASYNC_API && MCUMGR_SMP_UART

menuconfig MCUMGR_SMP_UART_ASYNC
	bool "Use async UART API when available"
	help
	  The option enables use of UART async API when available for selected mcumgr uart port.

if MCUMGR_SMP_UART_ASYNC
config MCUMGR_SMP_UART_ASYNC_BUFS
	int "Number of async RX UART buffers"
	range 2 8
	default 2
	help
	  The asynchronous UART API requires registering RX buffers for received data; when the RX
	  reaches the end of a buffer, it will send event requesting next buffer, to be able to
	  receive data without stopping due to running out of buffer space.  At least two buffers
	  area required for smooth RX operation.

config MCUMGR_SMP_UART_ASYNC_BUF_SIZE
	int "Size of single async RX UART buffer"
	default 64
	help
	  The size of single buffer for asynchronous RX.

endif # MCUMGR_SMP_UART_ASYNC
endif # UART_ASYNC_API

config MCUMGR_SMP_UART_MTU
	int "UART SMP MTU"
	default 256
	depends on MCUMGR_SMP_UART
	help
	  Maximum size of SMP frames sent and received over UART, in bytes.
	  This value must satisfy the following relation:
	  MCUMGR_SMP_UART_MTU <= MCUMGR_BUF_SIZE + 2


menuconfig MCUMGR_SMP_UDP
	bool "UDP mcumgr SMP transport"
	select NETWORKING
	select NET_UDP
	select NET_SOCKETS
	select NET_SOCKETS_POSIX_NAMES if !POSIX_API
	help
	  Enables handling of SMP commands received over UDP.
	  Will start a thread for listening on the configured UDP port.

if MCUMGR_SMP_UDP
config MCUMGR_SMP_UDP_IPV4
	bool "UDP SMP using IPv4"
	depends on NET_IPV4
	default y
	help
	  Enable SMP UDP using IPv4 addressing.
	  Can be enabled alongside IPv6 addressing.

config MCUMGR_SMP_UDP_IPV6
	bool "UDP SMP using IPv6"
	depends on NET_IPV6
	help
	  Enable SMP UDP using IPv6 addressing.
	  Can be enabled alongside IPv4 addressing.

config MCUMGR_SMP_UDP_PORT
	int "UDP SMP port"
	default 1337
	help
	  UDP port that SMP server will listen for SMP commands on.

config MCUMGR_SMP_UDP_STACK_SIZE
	int "UDP SMP stack size"
	default 512
	help
	  Stack size of the SMP UDP listening thread

config MCUMGR_SMP_UDP_THREAD_PRIO
	int "UDP SMP thread priority"
	default 0
	help
	  Scheduling priority of the SMP UDP listening thread.

config MCUMGR_SMP_UDP_MTU
	int "UDP SMP MTU"
	default 1500
	help
	  Maximum size of SMP frames sent and received over UDP, in bytes.
	  This value must satisfy the following relation:
	  MCUMGR_SMP_UDP_MTU <= MCUMGR_BUF_SIZE + SMP msg overhead - address size
	  where address size is determined by IPv4/IPv6 selection.

endif # MCUMGR_SMP_UDP

endmenu

module = MCUMGR_SMP
module-str = mcumgr_smp
source "subsys/logging/Kconfig.template.log_config"

endif # MCUMGR
