#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config ARCH_HAVE_NET
	bool
	default n

config ARCH_HAVE_PHY
	bool
	default n

config ARCH_PHY_INTERRUPT
	bool
	default n

config ARCH_PHY_POLLED
	bool
	default n

config ARCH_HAVE_NETDEV_STATISTICS
	bool
	default n

config ARCH_HAVE_NETDEV_TIMESTAMP
	bool
	default n

config NET_WRITE_BUFFERS
	bool
	default n
	select MM_IOB

config NET_READAHEAD
	bool
	default n
	select MM_IOB

config NET_MCASTGROUP
	bool
	default n

config NET
	bool "Networking support"
	default n
	select ARCH_HAVE_NET
	---help---
		Enable or disable all network features

if NET

config NET_PROMISCUOUS
	bool "Promiscuous mode"
	default n
	---help---
		Force the Ethernet driver to operate in promiscuous mode (if supported
		by the Ethernet driver).

config NET_DEFAULT_MIN_PORT
	int "Net Default Min Port"
	range 1 65535
	default 4096
	---help---
		Default Network min port

config NET_DEFAULT_MAX_PORT
	int "Net Default Max Port"
	range NET_DEFAULT_MIN_PORT 65535
	default 32000
	---help---
		Default Network max port

menu "Driver buffer configuration"

config NET_ETH_PKTSIZE
	int "Ethernet packet buffer size"
	default 1294 if NET_IPv6
	default 590 if !NET_IPv6
	range 1294 1518 if NET_IPv6
	range 590 1518 if !NET_IPv6
	depends on NET_ETHERNET
	---help---
		Packet buffer size.  This size includes the TCP/UDP payload plus the
		size of TCP/UDP header, the IP header, and the Ethernet header.
		This value is related to the MTU (Maximum Transmission Unit), except
		that it includes the size of the link layer header; the payload is
		the MSS (Maximum Segment Size).

		IPv4 hosts are required to be able to handle an MSS of at least
		536 octets, resulting in a minimum buffer size of 536+20+20+14 =
		590.

		IPv6 hosts are required to be able to handle an MSS of 1220 octets,
		resulting in a minimum buffer size of 1220+20+40+14 = 1294

		To get an MTU of 1500, for example, you would need packet buffer of
		size 1514.

config NET_SLIP_PKTSIZE
	int "SLIP packet buffer size"
	default 296
	depends on NET_SLIP
	range 296 1518
	---help---
		Provides the size of the SLIP packet buffers.  This size includes
		the TCP/UDP payload plus the size of TCP/UDP header and the IP header.
		This value is related to the MTU (Maximum Transmission Unit), except
		that it includes the size of the link layer header; the payload is
		the MSS (Maximum Segment Size).  SLIP has no link layer header so for
		SLIP the MTU is the same as the PKTSIZE.

		SLIP is required to support at least 256+20+20 = 296.  Values other than
		296 are not recommended.

		The Linux slip module hard-codes its MTU size to 296 (40 bytes for
		the IP+TCP headers plus 256 bytes of data).  So you might as well
		set CONFIG_NET_SLIP_PKTSIZE to 296 as well.

		There may be an issue with this setting, however.  I see that Linux
		uses a MTU of 296 and window of 256, but actually only sends 168
		bytes of data: 40 + 128.  I believe that is to allow for the 2x
		worst cast packet expansion.  Ideally we would like to advertise the
		256 MSS, but restrict transfers to 128 bytes (possibly by modifying
		the MSS value in the TCP connection structure).

config NET_GUARDSIZE
	int "Driver I/O guard size"
	default 2
	---help---
		Network drivers often receive packets with garbage at the end and
		are longer than the size of packet in the TCP header.  The following
		"fudge" factor increases the size of the I/O buffering by a small
		amount to allocate slightly oversize packets.  After receipt, the
		packet size will be chopped down to the size indicated in the TCP
		header.

config NET_LL_GUARDSIZE
	int "Data Link Layer(L2) Guard size of Network buffer(IOB)"
	default 50 if RNDIS
	default 16 if NET_CAN && NET_TIMESTAMP
	default 14 if NET_ETHERNET
	default 0
	---help---
		This is reserved l2 buffer header size of network buffer to isolate
		the L2/L3 (MAC/IP) data on Network layer, which will be beneficial
		to L3 network layer protocol transparent transmission and forwarding

config NET_RECV_BUFSIZE
	int "Net Default Receive buffer size"
	default 0
	---help---
		This is the default value for receive buffer size.

config NET_MAX_RECV_BUFSIZE
	int "Net Max Receive buffer size"
	depends on NET_RECV_BUFSIZE > 0
	default 0
	---help---
		Limit the max value for receive buffer size to avoid overconsumption.
		Zero means no limit.

config NET_SEND_BUFSIZE
	int "Net Default Send buffer size"
	depends on NET_TCP_WRITE_BUFFERS || NET_UDP_WRITE_BUFFERS
	default 0
	---help---
		This is the default value for send buffer size.

config NET_MAX_SEND_BUFSIZE
	int "Net Max Send buffer size"
	depends on NET_SEND_BUFSIZE > 0
	default 0
	---help---
		Limit the max value for send buffer size to avoid overconsumption.
		Zero means no limit.

endmenu # Driver buffer configuration

menu "Link layer support"

config NET_ETHERNET
	bool "Ethernet support"
	default y
	---help---
		If NET_SLIP is not selected, then Ethernet will be used (there is
		no need to define anything special in the configuration file to use
		Ethernet -- it is the default).

config NET_CELLULAR
	bool "Cellular Link support"
	default n
	---help---
		Add support for the cellular network device. Unlike Ethernet, cellular
		network transmit pure IP packets.

config NET_LOOPBACK
	bool "Local loopback"
	select ARCH_HAVE_NETDEV_STATISTICS
	default n
	---help---
		Add support for the local network loopback device, lo.

config NET_LOOPBACK_PKTSIZE
	int "Loopback packet buffer size"
	default 0
	depends on NET_LOOPBACK
	range 0 65535
	---help---
		The loopback driver packet buffer should be quite large.  The larger
		the loopback packet buffer, the better will be TCP performance of
		the loopback transfers.  The Linux loopback device historically used
		packet buffers of size 16Kb, but that was increased in recent Linux
		versions to 64Kb.  Those sizes may be excessive for resource
		constrained MCUs, however.

		The network enforces a lower limit that is the maximum packet size
		of all enabled link layer protocols.  The default value of
		CONFIG_NET_LOOPBACK_PKTSIZE is zero, meaning that this maximum
		packet size will be used by loopback driver.

menuconfig NET_MBIM
	bool "MBIM modem support"
	depends on USBHOST_CDCMBIM
	default n

menuconfig NET_SLIP
	bool "SLIP support"
	select ARCH_HAVE_NETDEV_STATISTICS
	depends on NET_IPv4
	default n
	---help---
		Enables building of the SLIP driver. SLIP requires
		at least one IP protocol selected.

		SLIP supports point-to-point IP communications over a serial port.
		The default link layer for network layer is Ethernet. If NET_SLIP
		is defined in the NuttX configuration file, then SLIP will be
		supported.  The basic differences between the SLIP and Ethernet
		configurations is that when SLIP is selected:

			* The link level header (that comes before the IP header) is omitted.
			* All MAC address processing is suppressed.
			* ARP is disabled.

		If NET_SLIP is not selected, then Ethernet will be used (there is
		no need to define anything special in the configuration file to use
		Ethernet -- it is the default).

if NET_SLIP

config NET_SLIP_NINTERFACES
	int "Number of SLIP interfaces"
	default 1
	---help---
		Selects the number of physical SLIP
		interfaces to support.
		Default: 1

endif # NET_SLIP

menuconfig NET_TUN
	bool "TUN Virtual Network Device support"
	default n
	depends on ALLOW_BSD_COMPONENTS
	select ARCH_HAVE_NETDEV_STATISTICS

if NET_TUN

config TUN_NINTERFACES
	int "Number of TUN interfaces"
	default 1
	range 1 8
	---help---
		Selects the number of TUN
		interfaces to support.
		Default: 1

config NET_TUN_PKTSIZE
	int "TUN packet buffer size"
	default 296
	range 296 1518
	---help---
		Provides the size of the TUN packet buffers.  This size includes
		the TCP/UDP payload plus the size of TCP/UDP header and the IP header.
		This value is related to the MTU (Maximum Transmission Unit), except
		that it includes the size of the link layer header; the payload is
		the MSS (Maximum Segment Size).  TUN has no link layer header so for
		TUN the MTU is the same as the PKTSIZE.

endif # NET_TUN

config NETDEV_LATEINIT
	bool "Late driver initialization"
	default n
	---help---
		Normally, networking initialization occur in the later phase of the
		boot process in the function up_initialize() when it calls the
		driver initialization function, xxx_netinitialize().  This
		initialization occurs after a sufficient amount of the OS has been
		initialized so that driver registration can be performed, but
		before the completion of OS initialization and before the first
		application is started.

		In a few situations, however, you may want to suppress this early
		network driver initialization.  As examples:

			- If you are using SLIP or PPPD, then there will be no network
			  driver to be initialized,
			- Certain multi-network configurations where a simple call to
			  xxx_netinitialize() may be insufficient, and
			- Situations where there are other board-level hardware
			  dependencies so that the hardware is not in an appropriate
			  state for xxx_netinitialize() to be called.

		Examples of this latter situation include such things as network
		drivers that required some setup via an I2C I/O expander, or network
		drivers that depend on USB, SPI, I2C, PCI, serial, or other
		interfaces that may not be ready when xxx_netinitialize() is normally
		called.

endmenu # Link layer support

source "net/netdev/Kconfig"

menu "Internet Protocol Selection"

config NET_IPv4
	bool "IPv4"
	default y
	---help---
		Build in support for IPv4.

config NET_IPv6
	bool "IPv6"
	default n
	---help---
		Build in support for IPv6.

source "net/neighbor/Kconfig"

menuconfig NET_6LOWPAN
	bool "6LoWPAN support"
	default n
	select NETDEV_IOCTL
	select NET_HAVE_STAR
	depends on NET_IPv6
	---help---
		Enable support for Low power Wireless Personal Area Networking (6LoWPAN)
		for IEEE 802.15.4 or other packet radios.

source "net/sixlowpan/Kconfig"
source "net/ipforward/Kconfig"
source "net/nat/Kconfig"
source "net/netfilter/Kconfig"
source "net/ipfrag/Kconfig"

endmenu # Internet Protocol Selection

source "net/socket/Kconfig"
source "net/inet/Kconfig"
source "net/pkt/Kconfig"
source "net/local/Kconfig"
source "net/rpmsg/Kconfig"
source "net/can/Kconfig"
source "net/netlink/Kconfig"
source "net/tcp/Kconfig"
source "net/udp/Kconfig"
source "net/bluetooth/Kconfig"
source "net/ieee802154/Kconfig"
source "net/icmp/Kconfig"
source "net/icmpv6/Kconfig"
source "net/mld/Kconfig"
source "net/igmp/Kconfig"
source "net/arp/Kconfig"
source "net/procfs/Kconfig"
source "net/usrsock/Kconfig"
source "net/utils/Kconfig"

config NET_STATISTICS
	bool "Collect network statistics"
	default n
	---help---
		Network layer statistics on or off

config NET_HAVE_STAR
	bool
	default n
	---help---
		Automatically enabled if at least one selected L2 protocol supports
		a STAR topology.  In order to support the star topology, the L2
		protocol must support relaying all packets to a well-known hub node.

menu "Network Topologies"

config NET_STAR
	bool "Enable star topology"
	default n
	depends on NET_HAVE_STAR && NET_IPv6
	---help---
		Enable support for a star network topology.

		NOTE: Currently only supported by 6LoWPAN.
		NOTE: L2 forwarding only supported for IPv6.

choice
	prompt "Node role"
	depends on NET_STAR
	default NET_STARPOINT
	---help---
		Specifies the role of this node in the star configuration.

config NET_STARPOINT
	bool "Point node in star"
	---help---
		The node is a "point" in the star configuration and must send all
		packets to the star hub node.

config NET_STARHUB
	bool "Hub node of star"
	select NET_IPFORWARD
	---help---
		This is the "hub" node in the star configurations.  It will receive
		packets packets from all "point" nodes and perform L2 forwarding of
		the packets that are not destined for this node.

endchoice # Node role
endmenu # Network Topologies

source "net/route/Kconfig"

endif # NET
