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

# The Kconfig file is dedicated to File System management group of
# of MCUmgr subsystem and provides Kconfig options to configure
# group commands behaviour and other aspects.
#
# Options defined in this file should be prefixed:
#  MCUMGR_GRP_FS_ -- general group options;
#
# When adding Kconfig options, that control the same feature,
# try to group them together by the same stem after prefix.

menuconfig MCUMGR_GRP_FS
	bool "MCUmgr handlers for file management"
	depends on FILE_SYSTEM
	select MCUMGR_SMP_CBOR_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 without adequate
	  protection mechanisms is strongly discouraged (applications can
	  enable MCUMGR_GRP_FS_FILE_ACCESS_HOOK and register to receive
	  callbacks when file access is attempted, which they can then filter,
	  allow, deny or rewrite paths).

if MCUMGR_GRP_FS

choice MCUMGR_GRP_FS_MAX_FILE_SIZE
	prompt "Maximum file size that could be uploaded/downloaded"
	default MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_MAX_OFFSET_LEN
	int
	default	3 if MCUMGR_GRP_FS_MAX_FILE_SIZE_64KB
	default 5 if MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_MAX_FILE_SIZE menu.

config MCUMGR_GRP_FS_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 MCUMGR_TRANSPORT_NETBUF_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 MCUMGR_GRP_FS_DL_CHUNK_SIZE_LIMIT

config MCUMGR_GRP_FS_DL_CHUNK_SIZE
	int "Maximum chunk size for file downloads"
	range 65 MCUMGR_TRANSPORT_NETBUF_SIZE
	default MCUMGR_TRANSPORT_NETBUF_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_TRANSPORT_NETBUF_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 MCUMGR_GRP_FS_MAX_OFFSET_LEN.

endif

config MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_CHECKSUM_HASH

config MCUMGR_GRP_FS_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 MCUMGR_GRP_FS_CHECKSUM_IEEE_CRC32
	bool "IEEE CRC32 checksum support"
	select CRC
	default y
	help
	  Enable IEEE CRC32 checksum support for MCUmgr.

config MCUMGR_GRP_FS_HASH_SHA256
	bool "SHA256 hash support"
	select PSA_CRYPTO
	select PSA_WANT_ALG_SHA_256
	help
	  Enable SHA256 hash support for MCUmgr.

config MCUMGR_GRP_FS_CHECKSUM_HASH_SUPPORTED_CMD
	bool "Supported hash/checksum command"
	select MCUMGR_SMP_CBOR_MIN_ENCODING_LEVEL_3 if ZCBOR_CANONICAL
	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 MCUMGR_GRP_FS_PATH_LEN
	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 access hooks"
	depends on MCUMGR_MGMT_NOTIFICATION_HOOKS
	help
	  Allows applications to control file access (e.g. for uploading and
	  downloading of files) by registering for a callback which is then
	  triggered whenever a files are accessed using the FS management group
	  function. This also, optionally, allows re-writing or changing of
	  supplied file paths.
	  Note that this may be called multiple times for each file read and
	  write due to MCUmgr's method of operation with a single file state.

config MCUMGR_GRP_FS_FILE_SEMAPHORE_TAKE_TIME
	int "File handle semaphore take time (ms)"
	default 100
	help
	  Maximum time (in ms) to acquire the file handle semaphore when a file
	  upload/download command is used. If unable to acquire the semaphore,
	  then MGMT_ERR_EBUSY will be returned.

	  Can specify 0 to not wait for the lock and return instantly if it
	  cannot be acquired.

config MCUMGR_GRP_FS_FILE_AUTOMATIC_IDLE_CLOSE_TIME
	int "Automatic file handle close time (ms)"
	default 4000
	range 1 99999999
	help
	  Time (in ms) for a file upload/download to be declared aborted and
	  file handle cleaned up. Each access to the file will reset the idle
	  time to 0.

module = MCUMGR_GRP_FS
module-str = mcumgr_grp_fs
source "subsys/logging/Kconfig.template.log_config"

endif
