# 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 100

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
