# 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_L2_RAW_CHANNEL
	bool
	default n

if !NET_L2_RAW_CHANNEL

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_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.

config NET_ROUTE
	bool
	depends on NET_IPV6
	default n
	default y if NET_IPV6

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_DEBUG_TCP
	bool "Debug TCP"
	default n
	depends on NET_TCP && NET_LOG
	help
	Enables TCP handler output debug messages

config NET_TCP_TIME_WAIT
	bool "Enable TCP TIME_WAIT timeouts"
	default n
	help
	Officially, the TCP standard requires a 4 minute timeout on
	connection close before that particular port pair can be used
	again.  This requires that the net_context and net_tcp structs
	persist for the full duration, so has non-trivial memory costs
	and is optional.  Modern systems with well-randomized sequence
	numbers don't need this, but it is present for specification
	compliance where needed.

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

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_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.

choice
	prompt "Use SLIP connectivity with QEMU"
	optional
	default NET_SLIP_TUN
	help
	The SLIP support is only used when the application is
	run inside QEMU and the network peer is run in your
	host.
	The SLIP support is only used when the application is
	run inside QEMU and the network peer is run in your
	host. The host needs to have tunslip running in order
	to receive and send network packets via the SLIP driver.
	The SLIP driver Kconfig options can be tweaked in drivers
	section.
	Options are provided to communicate with QEMU via a TUN driver,
	the default, as it requires less configuration in the host side,
	or via a TAP driver.
config NET_SLIP_TUN
	bool "TUN SLIP driver"
	select SLIP
	select UART_PIPE
	select UART_INTERRUPT_DRIVEN
	select NET_L2_DUMMY
	help
	The host needs to have tunslip running in order
	to receive and send network packets via the SLIP driver.
	Choose this if unsure.
config NET_SLIP_TAP
	bool "TAP SLIP driver"
	select SLIP
	select UART_PIPE
	select UART_INTERRUPT_DRIVEN
	select SLIP_TAP
	help
	SLIP TAP support is necessary when testing IPv4/ARP. The host
	needs to have tunslip with TAP support running in order to
	communicate via the SLIP driver.
endchoice

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_L2_RAW_CHANNEL

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

config NET_NBUF_TX_COUNT
	int "How many network sends can be pending at the same time"
	default 2
	help
	Each TX buffer will occupy smallish amount of memory.
	See include/net/nbuf.h and the sizeof(struct nbuf)

config NET_NBUF_DATA_COUNT
	int "How many network data buffers are allocated"
	default 16
	help
	Each data buffer will occupy CONFIG_NBUF_DATA_SIZE + smallish
	header (sizeof(struct net_buf)) amount of data.

config NET_NBUF_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.

config NET_NBUF_USER_DATA_SIZE
	int "Size of user_data reserved"
	default 0
	default 4 if NET_L2_BLUETOOTH
	help
	This is for drivers to set how much user_data shall be included in
	each network data fragment.
	Example: For Bluetooth, the user_data shall be at least 4 bytes as
	that is used for identifying the type of data they are carrying.

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"

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

endmenu
