# 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_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_OBSERVER_EVENTS
	bool "CoAP resource observer events"
	help
	  This option enables to register a callback function to CoAP resources
	  that will be called when adding/removing observers.

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_PENDING_RETRANSMITS
	int "CoAP retransmit count"
	default 2
	help
	  Maximum number of retries to send a pending message.

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
