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

menuconfig MCUMGR_CMD_FS_MGMT
	bool "Mcumgr handlers for file management (insecure)"
	depends on FILE_SYSTEM
	select MGMT_MIN_DECODING_LEVEL_2
	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_DL_CHUNK_SIZE_LIMIT
	bool "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_FILE_STATUS
	bool "File status command"
	default y
	help
	  This command allows a remote device to retrieve the status of a file,
	  at present only the size of the file is returned (if it exists).

config FS_MGMT_CHECKSUM_HASH
	bool "Checksum/hash mcumgr functions"
	help
	  Enable this to support the hash/checksum mcumgr functionality,
	  individual checksum and hash types need to be enabled below.
	  Note that this requires enough stack space to buffer data
	  from the file being read and generate the output hash/checksum.

if FS_MGMT_CHECKSUM_HASH

config FS_MGMT_CHECKSUM_HASH_CHUNK_SIZE
	int "Checksum calculation buffer size"
	range 32 16384
	default 128
	help
	  Chunk size of buffer to use when calculating file checksum or hash
	  (uses stack).

config FS_MGMT_CHECKSUM_IEEE_CRC32
	bool "IEEE CRC32 checksum support"
	default y
	help
	  Enable IEEE CRC32 checksum support for mcumgr.

config FS_MGMT_HASH_SHA256
	bool "SHA256 hash support"
	depends on TINYCRYPT_SHA256 || MBEDTLS_MAC_SHA256_ENABLED
	help
	  Enable SHA256 hash support for mcumgr.

config MCUMGR_GRP_FS_CHECKSUM_HASH_SUPPORTED_CMD
	bool "Supported hash/checksum command"
	help
	  Enable the supported hash/checksum command which will return details on
	  supported hash and checksum types that can be used.

config MCUMGR_GRP_FS_CHECKSUM_HASH_SUPPORTED_MAX_TYPES
	int "Predicted maximum number of types to return on supported list"
	default 10
	depends on MCUMGR_GRP_FS_CHECKSUM_HASH_SUPPORTED_CMD
	help
	  This is used for defining CBOR map holding supported hash/checksum info.
	  The value does not affect memory allocation, it is used by zcbor to
	  figure out how to encode map depending on its predicted size.

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.

config MCUMGR_GRP_FS_FILE_ACCESS_HOOK
	bool "File read/write access hook"
	depends on MCUMGR_MGMT_NOTIFICATION_HOOKS
	help
	  Allows applications to control file read and write access by
	  registering for a callback which is then triggered whenever a file
	  read or write attempt is made. This also, optionally, allows
	  re-writing or changing of supplied file paths.
	  Note that this will be called multiple times for each file read and
	  write due to mcumgr's method of stateless operation.

endif
