# Kconfig - IP stack config

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

menu "IP stack"
	depends on NETWORKING

# Hidden option
config NET_RAW_MODE
	bool
	default n
	help
	  This is a very specific option used to built only the very minimal
	  part of the net stack in order to get network drivers working without
	  any net stack above: core, L2 etc... Basically this will build only
	  net_pkt part. It is currently used only by IEEE 802.15.4 drivers,
	  though any type of net drivers could use it.

if !NET_RAW_MODE

config NET_INIT_PRIO
	int
	default 90
	help
	  Network initialization priority level. This number tells how
	  early in the boot the network stack is initialized.

source "subsys/net/ip/Kconfig.debug"

source "subsys/net/ip/Kconfig.ipv6"

source "subsys/net/ip/Kconfig.ipv4"

config NET_SHELL
	bool "Enable network shell utilities"
	default n
	select CONSOLE_SHELL
	help
	  Activate shell module that provides network commands like
	  ping to the console.

config NET_TC_TX_COUNT
	int "How many Tx traffic classes to have for each network device"
	default 1
	range 1 8
	help
	  Define how many Tx traffic classes (queues) the system should have
	  when sending a network packet. The network packet priority can then
	  be mapped to this traffic class so that higher prioritized packets
	  can be processed before lower prioritized ones. Each queue is handled
	  by a separate thread which will need RAM for stack space.
	  Only increase the value from 1 if you really need this feature.
	  The default value is 1 which means that all the network traffic is
	  handled equally. In this implementation, the higher traffic class
	  value corresponds to lower thread priority.

config NET_TC_RX_COUNT
	int "How many Rx traffic classes to have for each network device"
	default 1
	range 1 8
	help
	  Define how many Rx traffic classes (queues) the system should have
	  when receiving a network packet. The network packet priority can then
	  be mapped to this traffic class so that higher prioritized packets
	  can be processed before lower prioritized ones. Each queue is handled
	  by a separate thread which will need RAM for stack space.
	  Only increase the value from 1 if you really need this feature.
	  The default value is 1 which means that all the network traffic is
	  handled equally. In this implementation, the higher traffic class
	  value corresponds to lower thread priority.

config NET_TX_DEFAULT_PRIORITY
	int "Default network packet priority if none have been set"
	default 1
	range 0 7
	help
	  What is the default network packet priority if user has not specified
	  one. The value 0 means lowest priority and 7 is the highest.

config NET_IP_ADDR_CHECK
	bool "Check IP address validity before sending IP packet"
	default y
	help
	  Check that either the source or destination address is
	  correct before sending either IPv4 or IPv6 network packet.

config NET_MAX_ROUTERS
	int "How many routers are supported"
	default 2 if NET_IPV4 && NET_IPV6
	default 1 if NET_IPV4 && !NET_IPV6
	default 1 if !NET_IPV4 && NET_IPV6
	range 1 254
	help
	  The value depends on your network needs.

# Normally the route support is enabled by RPL or similar technology
# that needs to use the routing infrastructure.
config NET_ROUTE
	bool
	depends on NET_IPV6_NBR_CACHE
	default n
	default y if NET_IPV6_NBR_CACHE

config NET_ROUTING
	bool "IP routing between interfaces"
	default n
	depends on NET_ROUTE
	help
	  Allow IPv6 routing between different network interfaces and
	  technologies.

config	NET_MAX_ROUTES
	int "Max number of routing entries stored."
	default NET_IPV6_MAX_NEIGHBORS
	depends on NET_ROUTE
	help
	  This determines how many entries can be stored in routing table.

config	NET_MAX_NEXTHOPS
	int "Max number of next hop entries stored."
	default NET_MAX_ROUTES
	depends on NET_ROUTE
	help
	  This determines how many entries can be stored in nexthop table.

config NET_ROUTE_MCAST
	bool
	depends on NET_ROUTE
	default n

config	NET_MAX_MCAST_ROUTES
	int "Max number of multicast routing entries stored."
	default 1
	depends on NET_ROUTE_MCAST
	help
	  This determines how many entries can be stored in multicast
	  routing table.

config NET_TCP
	bool "Enable TCP"
	default n
	help
	  The value depends on your network needs.

config NET_TCP_CHECKSUM
	bool "Check TCP checksum"
	default y
	depends on NET_TCP
	help
	  Enables TCP handler to check TCP checksum. If the checksum is invalid,
	  then the packet is discarded.

config NET_DEBUG_TCP
	bool "Debug TCP"
	default n
	depends on NET_TCP && NET_LOG
	help
	  Enables TCP handler output debug messages

config NET_TCP_BACKLOG_SIZE
	int "Number of simultaneous incoming TCP connections"
	depends on NET_TCP
	default 1
	range 1 128
	help
	  The number of simultaneous TCP connection attempts, i.e. outstanding
	  TCP connections waiting for initial ACK.

config NET_TCP_TIME_WAIT_DELAY
	int "How long to wait in TIME_WAIT state (in milliseconds)"
	depends on NET_TCP
	default 250
	help
	  To avoid a (low-probability) issue when delayed packets from
	  previous connection get delivered to next connection reusing
	  the same local/remote ports, RFC 793 (TCP) suggests to keep
	  an old, closed connection in a special "TIME_WAIT" state for
	  the duration of 2*MSL (Maximum Segment Lifetime). The RFC
	  suggests to use MSL of 2 minutes, but notes "This is an
	  engineering choice, and may be changed if experience indicates
	  it is desirable to do so." For low-resource systems, having
	  large MSL may lead to quick resource exhaustion (and related
	  DoS attacks). At the same time, the issue of packet misdelivery
	  is largely alleviated in the modern TCP stacks by using random,
	  non-repeating port numbers and initial sequence numbers. Due
	  to this, Zephyr uses much lower value of 250ms by default.
	  Value of 0 disables TIME_WAIT state completely.

config NET_TCP_ACK_TIMEOUT
	int "How long to wait for ACK (in milliseconds)"
	depends on NET_TCP
	default 1000
	range 1 2147483647
	help
	  This value affects the timeout when waiting ACK to arrive in
	  various TCP states. The value is in milliseconds. Note that
	  having a very low value here could prevent connectivity.

config NET_TCP_INIT_RETRANSMISSION_TIMEOUT
	int "Initial value of Retransmission Timeout (RTO) (in milliseconds)"
	depends on NET_TCP
	default 200
	range 100 60000
	help
	  This value affects the timeout between initial retransmission
	  of TCP data packets. The value is in milliseconds.

config NET_TCP_RETRY_COUNT
	int "Maximum number of TCP segment retransmissions"
	depends on NET_TCP
	default 9
	help
	  The following formula can be used to determine the time (in ms)
	  that a segment will be be buffered awaiting retransmission:
	  n=NET_TCP_RETRY_COUNT
	  Sum((1<<n) * NET_TCP_INIT_RETRANSMISSION_TIMEOUT)
	  n=0
	  With the default value of 9, the IP stack will try to
	  retransmit for up to 1:42 minutes.  This is as close as possible
	  to the minimum value recommended by RFC1122 (1:40 minutes).
	  Only 5 bits are dedicated for the retransmission count, so accepted
	  values are in the 0-31 range.  It's highly recommended to not go
	  below 9, though.
	  Should a retransmission timeout occur, the receive callback is
	  called with -ECONNRESET error code and the context is dereferenced.

config NET_UDP
	bool "Enable UDP"
	default y
	help
	  The value depends on your network needs.

config NET_UDP_CHECKSUM
	bool "Check UDP checksum"
	default y
	depends on NET_UDP
	help
	  Enables UDP handler to check UDP checksum. If the checksum is invalid,
	  then the packet is discarded.

config NET_DEBUG_UDP
	bool "Debug UDP"
	default n
	depends on NET_UDP && NET_LOG
	help
	  Enables UDP handler output debug messages

config NET_MAX_CONN
	int "How many network connections are supported"
	depends on NET_UDP || NET_TCP
	default 4
	default 8 if NET_IPV6 && NET_IPV4
	help
	  The value depends on your network needs. The value
	  should include both UDP and TCP connections.

config NET_CONN_CACHE
	bool "Cache network connections"
	depends on NET_UDP || NET_TCP
	default n
	help
	  Caching takes slight more memory but will speedup connection
	  handling of UDP and TCP connections.

config NET_MAX_CONTEXTS
	int "Number of network contexts to allocate"
	default 6
	help
	  Each network context is used to describe a network 5-tuple that
	  is used when listening or sending network traffic. This is very
	  similar as one could call a network socket in some other systems.

config NET_CONTEXT_NET_PKT_POOL
	bool "Enable net_buf TX pool / context"
	default n
	default y if NET_TCP && NET_6LO
	help
	  If enabled, then it is possible to fine-tune network packet pool
	  for each context when sending network data. If this setting is
	  enabled, then you should define the context pools in your application
	  using NET_PKT_TX_POOL_DEFINE() and NET_PKT_DATA_POOL_DEFINE()
	  macros and tie these pools to desired context using the
	  net_context_setup_pools() function.

config NET_CONTEXT_SYNC_RECV
	bool "Support synchronous functionality in net_context_recv() API"
	default y
	help
	  You can disable sync support to save some memory if you are calling
	  net_context_recv() in async way only when timeout is set to 0.

config NET_CONTEXT_CHECK
	bool "Check options when calling various net_context functions"
	default y
	help
	  If you know that the options passed to net_context...() functions
	  are ok, then you can disable the checks to save some memory.

config NET_CONTEXT_PRIORITY
	bool "Add priority support to net_context"
	default n
	help
	  It is possible to prioritize network traffic. This requires
	  also traffic class support to work as expected.

config NET_TEST
	bool "Network Testing"
	default n
	help
	  Used for self-contained networking tests that do not require a
	  network device.

config NET_SLIP_TAP
	bool "TAP SLIP driver"
	select SLIP
	select UART_PIPE
	select UART_INTERRUPT_DRIVEN
	select SLIP_TAP
	default n
	default y if (QEMU_TARGET && !NET_TEST && !NET_L2_BT)
	help
	  SLIP TAP support is necessary when testing with QEMU. The host
	  needs to have tunslip6 with TAP support running in order to
	  communicate via the SLIP driver. See net-tools project at
	  https://github.com/zephyrproject-rtos/net-tools for more details.

config NET_TRICKLE
	bool "Enable Trickle library"
	default n
	help
	  Normally this is enabled automatically if needed,
	  so say 'n' if unsure.

config NET_DEBUG_TRICKLE
	bool "Debug Trickle algorithm"
	default n
	depends on NET_TRICKLE && NET_LOG
	help
	  Enables Trickle library output debug messages

endif # NET_RAW_MODE

config NET_PKT_RX_COUNT
	int "How many packet receives can be pending at the same time"
	default 4
	default 14 if NET_L2_ETHERNET
	help
	  Each RX buffer will occupy smallish amount of memory.
	  See include/net/net_pkt.h and the sizeof(struct net_pkt)

config NET_PKT_TX_COUNT
	int "How many packet sends can be pending at the same time"
	default 4
	default 14 if NET_L2_ETHERNET
	help
	  Each TX buffer will occupy smallish amount of memory.
	  See include/net/net_pkt.h and the sizeof(struct net_pkt)

config NET_BUF_RX_COUNT
	int "How many network buffers are allocated for receiving data"
	default 16
	default 36 if NET_L2_ETHERNET
	help
	  Each data buffer will occupy CONFIG_NET_BUF_DATA_SIZE + smallish
	  header (sizeof(struct net_buf)) amount of data.

config NET_BUF_TX_COUNT
	int "How many network buffers are allocated for sending data"
	default 16
	default 36 if NET_L2_ETHERNET
	help
	  Each data buffer will occupy CONFIG_NET_BUF_DATA_SIZE + smallish
	  header (sizeof(struct net_buf)) amount of data.

config NET_BUF_DATA_SIZE
	int "Size of each network data fragment"
	default 128
	default 125 if NET_L2_IEEE802154
	help
	  This value tells what is the size of the data fragment that is
	  received from the network.
	  Example: For IEEE 802.15.4, the network packet is 127 bytes long,
	  which leaves in worst case 81 bytes for user data (MTU).
	  In order to be able to receive at least full IPv6 packet which
	  has a size of 1280 bytes, the one should allocate 16 fragments here.

choice
	prompt "Default Network Interface"
	default NET_DEFAULT_IF_FIRST
	help
	  If system has multiple interfaces enabled, then user shall be able
	  to choose default interface. Otherwise first interface will be the
	  default interface.

config NET_DEFAULT_IF_FIRST
	bool "First available interface"

config NET_DEFAULT_IF_ETHERNET
	bool "Ethernet"
	depends on NET_L2_ETHERNET

config NET_DEFAULT_IF_BLUETOOTH
	bool "Bluetooth"
	depends on NET_L2_BT

config NET_DEFAULT_IF_IEEE802154
	bool "IEEE 802.15.4"
	depends on NET_L2_IEEE802154

config NET_DEFAULT_IF_OFFLOAD
	bool "Offloaded interface"
	depends on NET_OFFLOAD

config NET_DEFAULT_IF_DUMMY
	bool "Dummy testing interface"
	depends on NET_L2_DUMMY

endchoice

source "subsys/net/ip/Kconfig.stack"

source "subsys/net/ip/l2/Kconfig"

source "subsys/net/ip/Kconfig.mgmt"

source "subsys/net/ip/Kconfig.rpl"

source "subsys/net/ip/Kconfig.stats"

endmenu
