# CoAP implementation for Zephyr

# Copyright (c) 2017 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

config COAP
	bool "CoAP Support"
	help
	  This option enables the CoAP implementation.


if COAP

# This setting is only used by unit test. Do not enable it in applications
config COAP_TEST_API_ENABLE
	bool "Test API for CoAP unit tests"
	help
	  Do not enable this for normal use.

config COAP_WELL_KNOWN_BLOCK_WISE
	bool "CoAP ./well-known/core services block wise support"
	help
	  This option enables the block wise support of CoAP response
	  to ./well-known/core request. Without this option all resource's
	  information will be sent in a single IP packet (can be multiple
	  fragments depends on MTU size). This will be useful in mesh kind
	  of networks.

config COAP_WELL_KNOWN_BLOCK_WISE_SIZE
	int "CoAP ./well-known/core services block wise support"
	default 32
	depends on COAP_WELL_KNOWN_BLOCK_WISE
	help
	  Maximum size of CoAP block. Valid values are 16, 32, 64, 128,
	  256, 512 and 1024.

config COAP_EXTENDED_OPTIONS_LEN
	bool "Support for CoAP extended options"
	help
	  This option enables the parsing of extended CoAP options length.
	  CoAP extended options length can be 2 byte value, which
	  requires more memory. User can save memory by disabling this.
	  That means only length of maximum 12 bytes are supported by default.
	  Enable this if length field going to bigger that 12.

config COAP_EXTENDED_OPTIONS_LEN_VALUE
	int "CoAP extended options length value"
	default 13
	depends on COAP_EXTENDED_OPTIONS_LEN
	help
	  This option specifies the maximum value of length field when
	  COAP_EXTENDED_OPTIONS_LEN is enabled. Define the value according to
	  user requirement.

config COAP_INIT_ACK_TIMEOUT_MS
	int "base length of the random generated initial ACK timeout in ms"
	default 2000
	range 1000 100000
	help
	  This value is used as a base value to retry pending CoAP packets.

config COAP_RANDOMIZE_ACK_TIMEOUT
	bool "Randomize initial ACK timeout, as specified in RFC 7252"
	default y
	help
	  If enabled, the initial ACK timeout will be randomized, as specified
	  in RFC 7252, i.e. will be a random number between ACK_TIMEOUT and
	  ACK_TIMEOUT * ACK_RANDOM_FACTOR (where ACK_TIMEOUT is specified by
	  COAP_INIT_ACK_TIMEOUT_MS option). Otherwise, the initial ACK timeout
	  will be fixed to the value of COAP_INIT_ACK_TIMEOUT_MS option.

config COAP_ACK_RANDOM_PERCENT
	int "Random factor for ACK timeout described as percentage"
	default 150
	depends on COAP_RANDOMIZE_ACK_TIMEOUT
	help
	  Factor described as percentage to extend CoAP ACK timeout. A value
	  of 150 means a factor of 1.50.

config COAP_MAX_RETRANSMIT
	int "Max retransmission of a CoAP packet"
	default 4
	range 1 10

config COAP_BACKOFF_PERCENT
	int "Retransmission backoff factor for ACK timeout described as percentage"
	default 200
	help
	  Factor described as percentage to extend CoAP ACK timeout for retransmissions.
	  A value of 200 means a factor of 2.0.

config COAP_URI_WILDCARD
	bool "Wildcards in CoAP resource path"
	default y
	help
	  This option enables MQTT-style wildcards in path. Disable it if
	  resource path may contain plus or hash symbol.

config COAP_KEEP_USER_DATA
	bool "Keeping user data in the CoAP packet"
	help
	  This option enables keeping application-specific user data

config COAP_CLIENT
	bool "CoAP client support [EXPERIMENTAL]"
	select EXPERIMENTAL
	help
	  This option enables the API for CoAP-client for sending CoAP requests

if COAP_CLIENT

config COAP_CLIENT_THREAD_PRIORITY
	int "Coap client thread priority"
	default NUM_PREEMPT_PRIORITIES
	help
	  Priority of receive thread of the CoAP client.

config COAP_CLIENT_BLOCK_SIZE
	int "LWM2M CoAP block-wise transfer size"
	default 256
	range 64 1024
	help
	  CoAP block size used by CoAP client when performing block-wise
	  transfers. Possible values: 64, 128, 256, 512 and 1024.

config COAP_CLIENT_MESSAGE_SIZE
	int "Message payload size"
	default COAP_CLIENT_BLOCK_SIZE
	help
	  CoAP client message payload size. Can't be smaller than COAP_CLIENT_BLOCK_SIZE.

config COAP_CLIENT_MESSAGE_HEADER_SIZE
	int "Room for CoAP header data"
	default 48
	range 24 128
	help
	  Extra room allocated to handle CoAP header data

config COAP_CLIENT_STACK_SIZE
	int "Stack size of the CoAP client thread"
	default 1024

config COAP_CLIENT_MAX_INSTANCES
	int "Maximum number of CoAP clients"
	default 2
	help
	  Maximum number of CoAP clients

config COAP_CLIENT_MAX_REQUESTS
	int "Maximum number of simultaneous requests per client"
	default 2
	help
	  Maximum number of CoAP requests a single client can handle at a time

endif # COAP_CLIENT

config COAP_SERVER
	bool "CoAP server support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select NET_SOCKETS
	select NET_SOCKETPAIR
	help
	  This option enables the API for CoAP-services to register resources.

if COAP_SERVER

config COAP_SERVER_STACK_SIZE
	int "CoAP server thread stack size"
	default 4096
	help
	  CoAP server thread stack size for processing RX/TX events.

config COAP_SERVER_BLOCK_SIZE
	int "CoAP server block-wise transfer size"
	default 256
	range 64 1024
	help
	  CoAP block size used by CoAP server resources when performing block-wise
	  transfers. Possible values: 64, 128, 256, 512 and 1024.

config COAP_SERVER_MESSAGE_SIZE
	int "CoAP server message payload size"
	default COAP_SERVER_BLOCK_SIZE
	help
	  CoAP server message payload size. Can't be smaller than COAP_SERVER_BLOCK_SIZE.

config COAP_SERVER_MESSAGE_OPTIONS
	int "CoAP server message options"
	default 16
	help
	  CoAP server message maximum number of options to parse.

config COAP_SERVER_WELL_KNOWN_CORE
	bool "CoAP server support ./well-known/core service"
	default y
	help
	  Enable responding to the ./well-known/core service resource.

config COAP_SERVICE_PENDING_MESSAGES
	int "CoAP service pending messages"
	default 10
	help
	  Maximum number of pending CoAP messages to retransmit per active service.

config COAP_SERVICE_OBSERVERS
	int "CoAP service observers"
	default 3
	help
	  Maximum number of CoAP observers per active service.

choice COAP_SERVER_PENDING_ALLOCATOR
	prompt "Pending data allocator"
	default COAP_SERVER_PENDING_ALLOCATOR_STATIC

config COAP_SERVER_PENDING_ALLOCATOR_NONE
	bool "No pending packets"
	help
	  Never allocate data for pending requests, this disables retransmits for confirmable
	  packets.

config COAP_SERVER_PENDING_ALLOCATOR_STATIC
	bool "Static reserved memory"
	help
	  Static memory will be reserved for pending messages. The total size is equal to
	  COAP_SERVER_PENDING_ALLOCATOR_STATIC_BLOCKS * COAP_SERVER_MESSAGE_SIZE.

config COAP_SERVER_PENDING_ALLOCATOR_SYSTEM_HEAP
	bool "System heap allocator"
	depends on HEAP_MEM_POOL_SIZE > 0
	help
	  Use k_malloc/k_free for pending data.

endchoice

config COAP_SERVER_PENDING_ALLOCATOR_STATIC_BLOCKS
	int "Number of pending data blocks"
	default COAP_SERVICE_PENDING_MESSAGES
	depends on COAP_SERVER_PENDING_ALLOCATOR_STATIC
	help
	  The number of data blocks to reserve for pending messages to retransmit.

config COAP_SERVER_SHELL
	bool "CoAP service shell commands"
	depends on SHELL
	help
	  Enable CoAP service shell commands.

endif

module = COAP
module-dep = NET_LOG
module-str = Log level for CoAP
module-help = Enables CoAP debug messages.
source "subsys/net/Kconfig.template.log_config.net"

endif # COAP
