# 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 MCUGMR_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"
	default y
	help
	  Enable IEEE CRC32 checksum support for MCUmgr.

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