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

# The Kconfig file is dedicated to smp subdirectory of MCUmgr
# subsystem and provides Kconfig options to control aspects of
# Simple Management Protocol (SMP) processing source code provided
# under the subdirectory.
#
# Options defined in this file should be prefixed:
#  MCUMGR_SMP_ -- for general SMP options;
#  MCUMGR_SMP_CBOR -- for CBOR encoding specific options;

config MCUMGR_SMP_CBOR_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 MCUMGR_SMP_CBOR_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 MCUMGR_SMP_CBOR_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 MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_?.
	default 5 if MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_5
	default 4 if MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_4
	default 3 if MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_3
	default 2 if MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_2
	default 1 if MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_1
	default 0

config MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_1
	bool

config MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_2
	bool

config MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_3
	bool

config MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_4
	bool

config MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_5
	bool

config MCUMGR_SMP_CBOR_MAX_DECODING_LEVELS
	int "Number of map/list encapsulations allowed by SMP encoding"
	range MCUMGR_SMP_CBOR_MIN_DECODING_LEVELS 15
	default MCUMGR_SMP_CBOR_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.

config MCUMGR_SMP_COMMAND_STATUS_HOOKS
	bool "SMP command status hooks"
	depends on MCUMGR_MGMT_NOTIFICATION_HOOKS
	help
	  This will enable SMP command status notification hooks for when an SMP message is
	  received or processed.

config MCUMGR_SMP_VERBOSE_ERR_RESPONSE
	bool "Support verbose error response"
	help
	  Support for encoding "rc" code explanation in form of "rsn"
	  text string.  This is useful, when returning MGMT_ERR_EUNKNOWN,
	  to add additional information on the source of an error.
	  Note that the "rsn" is string additional to "rc" code,
	  so MCUMGR_TRANSPORT_NETBUF_SIZE should be large enough to be able
	  to encode both.
