# 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 TINYCBOR
	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'.

config MGMT_CBORATTR_MAX_SIZE
	int "The maximum size of a CBOR attribute during decoding"
        default 512
        help
          The maximum size of a CBOR attribute during decoding

config MGMT_CBORATTR_FLOAT_SUPPORT
	bool "Enable support for float"
	help
	  The option enables float processing within CBOR attributes.
	  If your code requires processing of float numbers by CBOR,
	  the option needs to be enabled.
	  Disabling the option slightly reduces code footprint.

menu "Command Handlers"
menuconfig MCUMGR_CMD_FS_MGMT
	bool "Enable mcumgr handlers for file management (insecure)"
	depends on FILE_SYSTEM
	help
	  Enables mcumgr handlers for file management

	  This option allows mcumgr clients to access anything in the
	  file system, including application-stored secrets like
	  private keys. Use of this feature in production is strongly
	  discouraged.

if MCUMGR_CMD_FS_MGMT

choice FS_MGMT_MAX_FILE_SIZE
	prompt "Maximum file size that could be uploaded/downloaded"
	default FS_MGMT_MAX_FILE_SIZE_64KB
	help
	  Maximum file size that will be allowed to be downloaded from
	  device.
	  This option decides on number of bytes that are reserved in
	  CBOR frame for storage of offset/size of file downloaded.

config FS_MGMT_MAX_FILE_SIZE_64KB
	bool "<= 64KB"
	help
	  Files that have size up to 64KB require 1 to 3 bytes to encode
	  size/offset within CBOR frame with file chunk.

config FS_MGMT_MAX_FILE_SIZE_4GB
	bool "<= 4GB"
	help
	  Files that have size up to 4GB require 1 to 5 bytes to encode
	  size/offset within CBOR frame with file chunk.

endchoice

config FS_MGMT_MAX_OFFSET_LEN
	int
	default	3 if FS_MGMT_MAX_FILE_SIZE_64KB
	default 5 if FS_MGMT_MAX_FILE_SIZE_4GB
	help
	  Maximal byte length of encoded offset/size, within transferred
	  CBOR frame containing chunk of downloaded file.
	  This value affects how much of data will fit into download buffer,
	  as it selects sizes of fields within headers.
	  NOTE: This option is hidden intentionally as it is intended
	  to be assigned from limited set of allowed values, depending on
	  the selection made in FS_MGMT_MAX_FILE_SIZE menu.

config FS_MGMT_UL_CHUNK_SIZE
	int "Maximum chunk size for file uploads"
	default 512
	help
	  Limits the maximum chunk size for file uploads, in bytes.  A buffer of
	  this size gets allocated on the stack during handling of a file upload command.

config FS_MGMT_DL_CHUNK_SIZE_LIMIT
	bool "Enable setting custom size of download file chunk"
	help
	  By default file chunk, that will be read off storage and fit into
	  mcumgr frame, is automatically calculated to fit into buffer
	  of size MCUGMR_BUF_SIZE with all headers.
	  Enabling this option allows to set MAXIMUM value that will be
	  allowed for such chunk.
	  Look inside fs_mgmt_config.h for details.

if FS_MGMT_DL_CHUNK_SIZE_LIMIT

config FS_MGMT_DL_CHUNK_SIZE
	int "Maximum chunk size for file downloads"
	range 65 MCUMGR_BUF_SIZE
	default MCUMGR_BUF_SIZE
	help
	  Sets the MAXIMUM size of chunk which will be rounded down to
	  number of bytes that, with all the required headers, will fit
	  into MCUMGR_BUF_SIZE. This means that actual value might be lower
	  then selected, in which case compiler warning will be issued.
	  Look inside fs_mgmt_config.h for details.
	  Note that header sizes are affected by FS_MGMT_MAX_OFFSET_LEN.

endif


config FS_MGMT_PATH_SIZE
	int "Maximum file path length"
	default 64
	help
	  Limits the maximum path length for file operations, in bytes.  A buffer
	  of this size gets allocated on the stack during handling of file upload
	  and download commands.
endif

config MCUMGR_CMD_SHELL_MGMT
	bool "Enable mcumgr handlers for shell management"
	depends on SHELL
	select SHELL_BACKEND_DUMMY
	help
	  Enables mcumgr handlers for shell management. The handler will utilize
	  the dummy backend to execute shell commands and capture the output to
	  an internal memory buffer. This way, there is no interaction with
	  physical interfaces outside of the scope of the user.
	  It is possible to use additional shell backends in coordination
	  with this handler and they will not interfere.
	  The SHELL_BACKEND_DUMMY_BUF_SIZE will affect how many characters
	  will be returned from command output, if your output gets cut, then
	  increase the value. Remember to set MCUMGR_BUF_SIZE accordingly.

menuconfig MCUMGR_CMD_IMG_MGMT
	bool "Enable mcumgr handlers for image management"
	select FLASH
	select MPU_ALLOW_FLASH_WRITE if ARM_MPU
	select IMG_MANAGER
	help
	  Enables mcumgr handlers for image management

if MCUMGR_CMD_IMG_MGMT
config IMG_MGMT_UL_CHUNK_SIZE
	int "Maximum chunk size for image uploads"
	default 512
	depends on MCUMGR_CMD_IMG_MGMT
	help
	  Limits the maximum chunk size for image uploads, in bytes.  A buffer of
	  this size gets allocated on the stack during handling of a image upload
	  command.

config IMG_MGMT_UPDATABLE_IMAGE_NUMBER
	int "Number of supported images"
	default UPDATEABLE_IMAGE_NUMBER
	range 1 2
	help
	  Sets how many application images are supported (pairs of secondary and primary slots).
	  Setting this to 2 requires MCUMGR_BUF_SIZE to be at least 512b.
	  NOTE: The UPDATEABLE_IMAGE_NUMBER of MCUBOOT configuration, even for Zephyr build,
	  needs to be set to the same value; this is due to the fact that the mcumgr uses
	  boot_util and the UPDATEABLE_IMAGE_NUMBER controls number of images supported
	  by that library.

config IMG_MGMT_VERBOSE_ERR
	bool "Verbose logging when uploading a new image"
	help
	  Enable verbose logging during a firmware upgrade.

config IMG_MGMT_DUMMY_HDR
	bool "Return dummy image header data for imgr functions"
	help
	  Returns dummy image header data for imgr functions,
	  useful when there are no images present, Eg: unit tests.

config IMG_MGMT_DIRECT_IMAGE_UPLOAD
	bool "Allow direct image upload"
	help
	  Enables directly uploading image to selected image partition.
	  This changes how "image" is understood by mcumgr: normally the mcumgr allows to upload
	  to first slot of the only image it knows, where image is understood as two slots
	  (two DTS images for Zephyr); this allows to treat every DTS defined image as direct
	  target for upload, and more than two may be used (4 at this time).
	  NOTE: When direct upload is used the image numbers are shifted by + 1, and the default
	  behaviour is, when image is not selected, to upload to image that represents secndary
	  slot in normal operation.

config IMG_MGMT_REJECT_DIRECT_XIP_MISMATCHED_SLOT
	bool "Reject Direct-XIP applications with mismatched address"
	help
	  When enabled, the mcumgr will compare base address of application,
	  encoded into .bin file header with use of imgtool, on upload and will
	  reject binaries that would not be able to start from available
	  Direct-XIP address.
	  The base address can be set, to an image binary header, with imgtool,
	  using the --rom-fixed command line option.

config IMG_MGMT_FRUGAL_LIST
	bool "Omit zero, empty or false values from status list"
	help
	  The status list send back from the device will only be filled with data that is non-zero,
	  non-empty or true.  This option slightly reduces number of bytes transferred back from
	  a device but requires support in client software, which has to default omitted values.
	  Works correctly with mcumgr-cli.

endif


menuconfig MCUMGR_CMD_OS_MGMT
	bool "Enable mcumgr handlers for OS management"
	select REBOOT
	help
	  Enables mcumgr handlers for OS management

if MCUMGR_CMD_OS_MGMT
config OS_MGMT_RESET_MS
	int "Delay before executing reset command (ms)"
	default 250
	help
	  When a reset command is received, the system waits this many milliseconds
	  before performing the reset.  This delay allows time for the mcumgr
	  response to be delivered.

config OS_MGMT_TASKSTAT
	bool "Support for taskstat command"
	depends on THREAD_MONITOR

if OS_MGMT_TASKSTAT

config OS_MGMT_TASKSTAT_ONLY_SUPPORTED_STATS
	bool "Send only data gathered by Zephyr"
	default y
	help
	  Response will not include fields the Zephyr does not collect statistic for.
	  Enable this if your client software is able to process "taskstat" response
	  that would be missing "runtime", "cswcnt", "last_checkin" and "next_checkin"
	  map entries for each listed task.
	  Enabling this option will slightly reduce code size.

choice OS_MGMT_TASKSTAT_THREAD_NAME_CHOICE
	prompt "Characteristic used as thread name in taskstat"
	default OS_MGMT_TASKSTAT_USE_THREAD_NAME_FOR_NAME if THREAD_NAME
	default OS_MGMT_TASKSTAT_USE_THREAD_PRIO_FOR_NAME
	help
	  Select what will serve as thread name in "taskstat" response.
	  By default taskstat responses use thread priority, when THREAD_NAME is disabled,

	config OS_MGMT_TASKSTAT_USE_THREAD_NAME_FOR_NAME
		bool "Thread name"
		depends on THREAD_NAME

	config OS_MGMT_TASKSTAT_USE_THREAD_IDX_FOR_NAME
		bool "Thread index"

	config OS_MGMT_TASKSTAT_USE_THREAD_PRIO_FOR_NAME
		bool "Thread priority"

endchoice

config OS_MGMT_TASKSTAT_THREAD_NAME_LEN
	int "Length of thread name to return in response"
	default THREAD_MAX_NAME_LEN if THREAD_NAME
	default 5 if !THREAD_NAME
	range 3 THREAD_MAX_NAME_LEN if THREAD_NAME
	range 3 6 if !THREAD_NAME
	help
	  The length, including terminating 0, of the string that is sent in response
	  to taskstat command, as a thread name.
	  When THREAD_NAME is enabled then this defaults to THREAD_MAX_NAME_LEN.
	  When THREAD_NAME is disabled the name is generated from thread priority,
	  signed integer, and this number regulates how many digits will be used;
	  in such case this value should also take into account possible '-'
	  sign.

config OS_MGMT_TASKSTAT_SIGNED_PRIORITY
	bool "Enable signed priorities"
	help
	  Zephyr uses int8_t as thread priorities, but in taskstat response it encodes
	  them as unsigned.  Enabling this option will use signed int for priorities in
	  responses, which is more natural for Zephyr.
	  Enable this option only if your client software is able to properly decode
	  and accept signed integers as priorities.

config OS_MGMT_TASKSTAT_STACK_INFO
	bool "Include stack info in taskstat responses"
	depends on THREAD_STACK_INFO
	help
	  Enabling this option adds stack information into "taskstat" command
	  responses, this is default when THREAD_STACK_INFO is selected.
	  Disable this option only when your client application is able to
	  process "taskstat" response without the "stksiz" and "stkuse" fields.
	  It is worth disabling this option when THREAD_STACK_INFO is disabled,
	  as it will prevent sending zeroed stack information just to fill
	  all the fields in "taskstat" responses, and it will slightly reduce code size.

endif

config OS_MGMT_ECHO
	bool "Support for echo command"
	default y
endif


menuconfig MCUMGR_CMD_STAT_MGMT
	bool "Enable mcumgr handlers for statistics management"
	depends on STATS
	help
	  Enables mcumgr handlers for statistics management.

config STAT_MGMT_MAX_NAME_LEN
	int "Maximum stat group name length"
	default 32
	depends on MCUMGR_CMD_STAT_MGMT
	help
	  Limits the maximum stat group name length in mcumgr requests, in bytes.
	  A buffer of this size gets allocated on the stack during handling of all
	  stat read commands.  If a stat group's name exceeds this limit, it will
	  be impossible to retrieve its values with a stat show command.


menuconfig MCUMGR_GRP_ZEPHYR_BASIC
	bool "Enable Zephyr specific basic group of commands"
	help
	  Enables mcumgr to processing of Zephyr specific groups.

if MCUMGR_GRP_ZEPHYR_BASIC
config MCUMGR_GRP_BASIC_CMD_STORAGE_ERASE
	bool "Enables storage erase command"
	help
	  Enables command that allows to erase storage partition.

module=MGMT_SETTINGS
module-dep=LOG
module-str=SETTINGS
source "${ZEPHYR_BASE}/subsys/logging/Kconfig.template.log_config"

endif

endmenu

config 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_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_LATENCY_CONTROL
	bool "Request low latency connection when handling SMP commands"
	depends on SYSTEM_WORKQUEUE_PRIORITY < 0
	help
	  Enables support for requesting low latency connection parameter 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.

config MCUMGR_SMP_BT_LATENCY_CONTROL_DEFAULT_LATENCY
	int "Default value for connection latency"
	depends on MCUMGR_SMP_BT_LATENCY_CONTROL
	default BT_PERIPHERAL_PREF_LATENCY if BT_GAP_PERIPHERAL_PREF_PARAMS
	default 99
	range 0 499
	help
	  The value is a default connection latency that is used when restoring
	  from low latency mode.

config MCUMGR_SMP_BT_LATENCY_CONTROL_RESTORE_TIME
	int "Connection latency restore time in milliseconds"
	depends on MCUMGR_SMP_BT_LATENCY_CONTROL
	default 5000
	range 1 65535
	help
	  The value is a time after which connection latency is restored
	  to default value
	  (:kconfig:`MCUMGR_SMP_BT_LATENCY_CONTROL_DEFAULT_LATENCY`). Latency
	  restoration time could take up to twice as long as specified time.
	  This is because of limiting CPU time needed to support this feature.
	  The implementation periodically checks if the low latency is still
	  needed every :kconfig:`MCUMGR_SMP_BT_LATENCY_CONTROL_RESTORE_TIME`.
	  The default latency is restored during check only if there was no SMP
	  command exchanged in period before the check

config MCUMGR_SMP_BT_LATENCY_CONTROL_RESTORE_RETRY_TIME
	int "Connection latency restore retry time in milliseconds"
	depends on MCUMGR_SMP_BT_LATENCY_CONTROL
	default 1000
	range 1 5000
	help
	  In case connection latency restoration fails due to an error, this
	  option specifies the time after retry to set the default latency
	  (:kconfig:`MCUMGR_SMP_BT_LATENCY_CONTROL_DEFAULT_LATENCY`) would be
	  executed.

endif # MCUMGR_SMP_BT

config 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

config 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


config MCUMGR_SMP_UDP
	bool "UDP mcumgr SMP transport"
	select NETWORKING
	select NET_UDP
	select NET_SOCKETS
	select NET_SOCKETS_POSIX_NAMES
	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

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.
endif # MCUMGR
