# Kconfig - BSD Sockets compatible API

#
# Copyright (c) 2017 Linaro Limited.
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig NET_SOCKETS
	bool "BSD Sockets compatible API"
	help
	  Provide BSD Sockets like API on top of native Zephyr networking API.

if NET_SOCKETS

config NET_SOCKETS_POSIX_NAMES
	bool "Standard POSIX names for Sockets API"
	help
	  By default, Sockets API function are prefixed with ``zsock_`` to avoid
	  namespacing issues. If this option is enabled, they will be provided
	  with standard POSIX names like socket(), recv(), and close(), to help
	  with porting existing code. Note that close() may require a special
	  attention, as in POSIX it closes any file descriptor, while with this
	  option enabled, it will still apply only to sockets.

config NET_SOCKETS_POLL_MAX
	int "Max number of supported poll() entries"
	default 3
	help
	  Maximum number of entries supported for poll() call.

config NET_SOCKETS_DNS_TIMEOUT
	int "Timeout value in milliseconds for DNS queries"
	default 2000
	range 1000 300000
	depends on DNS_RESOLVER
	help
	  This variable specifies time in milliseconds after which DNS
	  query is considered timeout. Minimum timeout is 1 second and
	  maximum timeout is 5 min.

config NET_SOCKETS_SOCKOPT_TLS
	bool "Enable TCP TLS socket option support [EXPERIMENTAL]"
	select TLS_CREDENTIALS
	help
	  Enable TLS socket option support which automatically establishes
	  a TLS connection to the remote host.

config NET_SOCKETS_ENABLE_DTLS
	bool "Enable DTLS socket support [EXPERIMENTAL]"
	depends on NET_SOCKETS_SOCKOPT_TLS
	select MBEDTLS_DTLS
	help
	  Enable DTLS socket support. By default only TLS over TCP is supported.

config NET_SOCKETS_DTLS_TIMEOUT
	int "Timeout value in milliseconds for DTLS connection"
	default 5000
	depends on NET_SOCKETS_ENABLE_DTLS
	help
	  This variable specifies time in milliseconds after which DTLS
	  connection is considered dead by TLS server and DTLS resources are
	  freed. This is needed to prevent situation when DTLS client shuts down
	  without closing connection gracefully, which can prevent other peers
	  from connecting. Value of 0 indicates no timeout - resources will be
	  freed only when connection is gracefully closed by peer sending TLS
	  notification or socket is closed.

config NET_SOCKETS_TLS_MAX_CONTEXTS
	int "Maximum number of TLS/DTLS contexts"
	default 1
	depends on NET_SOCKETS_SOCKOPT_TLS
	help
	  "This variable specifies maximum number of TLS/DTLS contexts that can
	   be allocated at the same time."

config NET_SOCKETS_TLS_MAX_CREDENTIALS
	int "Maximum number of TLS/DTLS credentials per socket"
	default 4
	depends on NET_SOCKETS_SOCKOPT_TLS
	help
	  This variable sets maximum number of TLS/DTLS credentials that can be
	  used with a specific socket.

config NET_SOCKETS_TLS_MAX_CIPHERSUITES
	int "Maximum number of TLS/DTLS ciphersuites per socket"
	default 4
	depends on NET_SOCKETS_SOCKOPT_TLS
	help
	  This variable sets maximum number of TLS/DTLS ciphersuites that can
	  be used with specific socket, if set explicitly by socket option.
	  By default, all ciphersuites that are available in the system are
	  available to the socket.

config NET_SOCKETS_OFFLOAD
	bool "Offload Socket APIs [EXPERIMENTAL]"
	select NET_SOCKETS_POSIX_NAMES
	help
	  Enables direct offloading of socket operations to dedicated TCP/IP
	  hardware.
	  This feature is intended to save resources by bypassing the Zephyr
	  TCP/IP stack in the case where there is only one network interface
	  required in the system, providing full BSD socket offload capability.
	  As a result, it bypasses any potential IP routing that Zephyr might
	  provide between multiple network interfaces.
	  See NET_OFFLOAD for a more deeply integrated approach which offloads
	  from the net_context() API within the Zephyr IP stack.

config NET_SOCKETS_PACKET
	bool "Enable packet socket support"
	depends on NET_L2_ETHERNET
	help
	  This is an initial version of packet socket support (special type
	  raw socket). Packets are passed to and from the device driver
	  without any changes in the packet headers. It's API caller
	  responsibility to provide all the headers (e.g L2, L3 and so on)
	  while sending. While receiving, packets (including all the headers)
	  will be feed to sockets as it as from the driver.

config NET_SOCKETS_CAN
	bool "Enable socket CAN support [EXPERIMENTAL]"
	select NET_L2_CANBUS
	help
	  The value depends on your network needs.

module = NET_SOCKETS
module-dep = NET_LOG
module-str = Log level for BSD sockets compatible API calls
module-help = Enables logging for sockets code.
source "subsys/net/Kconfig.template.log_config.net"

endif # NET_SOCKETS
