# 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_PRIORITY_DEFAULT
	int "Default processing priority for sockets"
	default 50
	help
	  Default processing priority for socket implementations. This defines
	  the order of processing of particular socket implementations when
	  creating a new socket, lower value indicate earlier processing. This
	  allows to for instance prioritize offloaded socket processing during
	  socket creation over the native one, or vice versa.

config NET_SOCKETS_POSIX_NAMES
	bool "POSIX names for Sockets API (without full POSIX API)"
	default y if !POSIX_API
	depends on !POSIX_API
	help
	  With this option, Socket API functions are available under the
	  standard POSIX names like socket(), recv(), and close(), etc.,
	  even if full POSIX API (CONFIG_POSIX_API) is not enabled. (Note
	  that close() may require a special attention, as in POSIX it
	  closes any file descriptor, while with this option enabled, it
	  will apply only to sockets.)

	  Various networking libraries require either
	  CONFIG_NET_SOCKETS_POSIX_NAMES or CONFIG_POSIX_API to be set.
	  If both are disabled, Zephyr's socket functions will be
	  available (only) with ``zsock_`` prefix, (e.g. `zsock_socket`).
	  This is useful only in peculiar cases, e.g. when integrating
	  with 3rd-party socket libraries.

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_CONNECT_TIMEOUT
	int "Timeout value in milliseconds to CONNECT"
	default 3000
	range 0 60000
	help
	  This variable specifies time in milliseconds after connect()
	  API call will timeout if we have not received SYN-ACK from
	  peer.

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 "TCP TLS socket option support [EXPERIMENTAL]"
	imply TLS_CREDENTIALS
	select MBEDTLS if NET_NATIVE
	select EXPERIMENTAL
	help
	  Enable TLS socket option support which automatically establishes
	  a TLS connection to the remote host.

config NET_SOCKETS_TLS_PRIORITY
	int "Default processing priority for TLS sockets"
	default 45
	help
	  Processing priority for TLS sockets. Should be lower than
	  NET_SOCKETS_PRIORITY_DEFAULT in order to be processed correctly.

config NET_SOCKETS_TLS_SET_MAX_FRAGMENT_LENGTH
	bool "Set Maximum Fragment Length (MFL)"
	default y
	help
	  Call mbedtls_ssl_conf_max_frag_len() on created TLS context
	  configuration, so that Maximum Fragment Length (MFL) will be sent to
	  peer using RFC 6066 max_fragment_length extension.

	  Maximum Fragment Length (MFL) value is automatically chosen based on
	  MBEDTLS_SSL_OUT_CONTENT_LEN and MBEDTLS_SSL_IN_CONTENT_LEN mbed TLS
	  macros (which are configured by CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN in
	  case of default mbed TLS config).

	  This is mostly useful for TLS client side to tell TLS server what is
	  the maximum supported receive record length.

config NET_SOCKETS_ENABLE_DTLS
	bool "DTLS socket support [EXPERIMENTAL]"
	depends on NET_SOCKETS_SOCKOPT_TLS
	select MBEDTLS_DTLS if NET_NATIVE
	select EXPERIMENTAL
	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_TLS_MAX_APP_PROTOCOLS
	int "Maximum number of supported application layer protocols"
	default 2
	depends on NET_SOCKETS_SOCKOPT_TLS && MBEDTLS_SSL_ALPN
	help
	  This variable sets maximum number of supported application layer
	  protocols over TLS/DTL that can be set explicitly by a socket option.
	  By default, no supported application layer protocol is set.

config NET_SOCKETS_TLS_MAX_CLIENT_SESSION_COUNT
	  int "Maximum number of stored client TLS/DTLS sessions"
	  default 1
	  depends on NET_SOCKETS_SOCKOPT_TLS
	  help
	    This variable specifies maximum number of stored TLS/DTLS sessions,
	    used for TLS/DTLS session resumption.

config NET_SOCKETS_OFFLOAD
	bool "Offload Socket APIs"
	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_OFFLOAD_PRIORITY
	int "Default processing priority for offloaded sockets"
	default 40
	help
	  Processing priority for offloaded sockets.

	  If native TLS is enabled, lower value than NET_SOCKETS_TLS_PRIORITY
	  means that TLS will be offloaded as well (if supported by offloaded
	  socket implementation). Higher value than NET_SOCKETS_TLS_PRIORITY
	  means that native TLS will be used.

config NET_SOCKETS_OFFLOAD_DISPATCHER
	bool "Intermediate socket offloading layer"
	depends on NET_SOCKETS_OFFLOAD
	help
	  If enabled, an intermediate socket offloading layer is included
	  (called socket dispatcher), allowing to select an offloaded network
	  interface and thus socket implementation with SO_BINDTODEVICE socket
	  option. This can be useful, when multiple offloaded sockets
	  implementations are available in the system, allowing to easily bind
	  a socket to a particular implementation.

config NET_SOCKETS_OFFLOAD_DISPATCHER_CONTEXT_MAX
	int "Maximum number of dispatcher sockets created"
	default 4
	depends on NET_SOCKETS_OFFLOAD_DISPATCHER
	help
	  Maximum number of dispatcher sockets created at a time. Note, that
	  only sockets that has not been dispatched yet count into the limit.
	  After a proper socket has been created for a given file descriptor,
	  the dispatcher context is released and can be reused.

config NET_SOCKETS_PACKET
	bool "Packet socket support"
	select NET_CONNECTION_SOCKETS
	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 fed to sockets unchanged as provided by the driver.

config NET_SOCKETS_PACKET_DGRAM
	bool "Packet socket SOCK_DGRAM support"
	depends on NET_SOCKETS_PACKET
	default y
	help
	  For AF_PACKET sockets with SOCK_DGRAM type, the L2 header
	  is removed before the packet is passed to the user.  Packets sent
	  through a SOCK_DGRAM packet socket get a suitable L2 header based
	  on the information in the sockaddr_ll destination address before
	  they are queued.

config NET_SOCKETS_CAN
	bool "Socket CAN support [EXPERIMENTAL]"
	select NET_L2_CANBUS_RAW
	select NET_CONNECTION_SOCKETS
	select EXPERIMENTAL
	help
	  The value depends on your network needs.

config NET_SOCKETS_CAN_RECEIVERS
	int "How many simultaneous SocketCAN receivers are allowed"
	default 1
	depends on NET_SOCKETS_CAN
	help
	  The value tells how many sockets can receive data from same
	  Socket-CAN interface.

config NET_SOCKETPAIR
	bool "Support for socketpair"
	select PIPES
	depends on HEAP_MEM_POOL_SIZE != 0
	help
	  Communicate over a pair of connected, unnamed UNIX domain sockets.

config NET_SOCKETPAIR_BUFFER_SIZE
	int "Size of the intermediate buffer, in bytes"
	default 64
	range 1 4096
	depends on NET_SOCKETPAIR
	help
	  Buffer size for socketpair(2)

config NET_SOCKETS_NET_MGMT
	bool "Network management socket support [EXPERIMENTAL]"
	depends on NET_MGMT_EVENT
	select NET_MGMT_EVENT_INFO
	select EXPERIMENTAL
	help
	  Select this if you want to use socket API to get network
	  managements events to your application.

config NET_SOCKETS_NET_MGMT_MAX_LISTENERS
	int "Max number of sockets to listen"
	default 1
	depends on NET_SOCKETS_NET_MGMT
	help
	  This sets the maximum number of net_mgmt sockets that can
	  be set by the socket interface. So if you have two separate
	  sockets that are used for listening events, you need to set
	  this to two.

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
