# Misc network drivers configuration options
# SPDX-License-Identifier: Apache-2.0

menuconfig NET_DRIVERS
	bool "Network drivers"

if NET_DRIVERS

#
# PPP options
#
menuconfig NET_PPP
	bool "Point-to-point (PPP) UART based driver"
	depends on NET_L2_PPP
	depends on NET_NATIVE
	select RING_BUFFER
	select CRC
	select UART_MUX if GSM_MUX

if NET_PPP

config NET_PPP_ASYNC_UART
	bool "Asynchronous UART API is used"
	depends on UART_ASYNC_API
	depends on !GSM_MUX

config NET_PPP_DRV_NAME
	string "PPP Driver name"
	default "ppp"
	help
	  This option sets the driver name

config NET_PPP_MTU_MRU
	int "PPP MTU and MRU"
	default 1500
	help
	  This options sets MTU and MRU for PPP link.

config NET_PPP_UART_BUF_LEN
	int "Buffer length when reading from UART"
	default 8
	help
	  This options sets the size of the UART buffer where data
	  is being read to.

config NET_PPP_RINGBUF_SIZE
	int "PPP ring buffer size"
	default 256
	help
	  PPP ring buffer size when passing data from RX ISR to worker
	  thread that will pass the data to IP stack.

config NET_PPP_RX_STACK_SIZE
	int "Size of the stack allocated for receiving data from modem"
	default 768
	help
	  Sets the stack size which will be used by the PPP RX workqueue.

config NET_PPP_RX_PRIORITY
	int "RX workqueue thread priority"
	default 7
	help
	  Sets the priority of the RX workqueue thread.

config NET_PPP_VERIFY_FCS
	bool "Verify that received FCS is valid"
	default y
	help
	  If you have a reliable link, then it might make sense
	  to disable this as it takes some time to verify the received
	  packet.

config NET_PPP_CAPTURE
	bool "Capture received PPP packets"
	depends on NET_CAPTURE_COOKED_MODE
	help
	  This enables PPP packet capture. One needs to configure the
	  packet capturing in core network stack to send the captured packets
	  to outside system. This requires a non-PPP network connection
	  where the captured packets are sent for processing. Note that you
	  cannot use the PPP connection to sending packets as that would
	  lead recursion.

config NET_PPP_CAPTURE_BUF_SIZE
	int "Capture buffer for storing full PPP packets"
	depends on NET_PPP_CAPTURE
	default 1500
	help
	  The captured PPP frames are temporarily stored into this buffer.

config PPP_MAC_ADDR
	string "MAC address for the interface"
	help
	  Specify a MAC address for the PPP interface in the form of
	  six hex 8-bit chars separated by colons (e.g.:
	  aa:33:cc:22:e2:c0).  The default is an empty string, which
	  means the code will make 00:00:5E:00:53:XX, where XX will be
	  random.

config PPP_CLIENT_CLIENTSERVER
	bool "Reply to the request CLIENT with CLIENTSERVER"
	help
	  This is only necessary if a ppp connection should be
	  established with a Microsoft Windows PC.

config PPP_NET_IF_NO_AUTO_START
	bool "Disable PPP interface auto-start"
	help
	  This option allows user to disable autostarting of the PPP interface
	  immediately after initialization.

if NET_PPP_ASYNC_UART

config NET_PPP_ASYNC_UART_TX_BUF_LEN
	int "Length of the UART TX buffer to which data is written."
	default 2048

config NET_PPP_ASYNC_UART_TX_TIMEOUT
	int "The timeout for UART transfers in milliseconds, or 0 for no timeout."
	default 0

config NET_PPP_ASYNC_UART_RX_RECOVERY_TIMEOUT
	int "UART RX recovery timeout in milliseconds"
	default 200
	help
	  The time that UART RX is in disabled state in case
	  when we cannot receive more data from UART.

config NET_PPP_ASYNC_UART_RX_ENABLE_TIMEOUT
	int "A timeout for uart_rx_enable() in milliseconds"
	default 100

endif # NET_PPP_ASYNC_UART

module = NET_PPP
module-dep = LOG
module-str = Log level for ppp driver
module-help = Sets log level for ppp driver.
source "subsys/net/Kconfig.template.log_config.net"

endif # NET_PPP

#
# SLIP options
#
menuconfig SLIP
	bool "SLIP driver" if !QEMU_TARGET
	depends on NET_NATIVE
	select UART_PIPE
	select UART_INTERRUPT_DRIVEN

if SLIP

config SLIP_DRV_NAME
	string "SLIP Driver name"
	default "slip"
	help
	  This option sets the driver name

module = SLIP
module-dep = LOG
module-str = Log level for slip driver
module-help = Sets log level for slip driver.
source "subsys/net/Kconfig.template.log_config.net"

config SLIP_STATISTICS
	bool "SLIP network connection statistics"
	help
	  This option enables statistics support for SLIP driver.

config SLIP_TAP
	bool "Use TAP interface to host"
	default y
	help
	  In TAP the Ethernet frames are transferred over SLIP.

config SLIP_MAC_ADDR
	string "MAC address for the interface"
	help
	  Specify a MAC address for the SLIP interface in the form of
	  six hex 8-bit chars separated by colons (e.g.:
	  aa:33:cc:22:e2:c0).  The default is an empty string, which
	  means the code will make 00:00:5E:00:53:XX, where XX will be
	  random.

endif

#
# Net loopback options
#
menuconfig NET_LOOPBACK
	bool "Net loopback driver"
	select NET_L2_DUMMY

if NET_LOOPBACK

config NET_LOOPBACK_SIMULATE_PACKET_DROP
	bool "Controlable packet drop"
	help
	  Enable interface to have a controlable packet drop rate, only for
	  testing, should not be enabled for normal applications

config NET_LOOPBACK_MTU
	int "MTU for loopback interface"
	default 576
	help
	  This option sets the MTU for loopback interface.

module = NET_LOOPBACK
module-dep = LOG
module-str = Log level for network loopback driver
module-help = Sets log level for network loopback driver.
source "subsys/net/Kconfig.template.log_config.net"

endif

#
# CAN bus network driver options
#
menuconfig NET_CANBUS
	bool "Controller Area Network (CAN) bus network driver"
	help
	  Enable the CAN bus network driver. This driver provides a network interface on top of the
	  CAN controller driver API.

if NET_CANBUS

module = NET_CANBUS
module-dep = LOG
module-str = Log level for CAN bus network driver
module-help = Sets log level CAN bus network driver.
source "subsys/net/Kconfig.template.log_config.net"

config NET_CANBUS_INIT_PRIORITY
	int "CAN bus network device init priority"
	default 81
	help
	  CAN bus network device initialization priority.

	  The priority needs to be lower than the network stack and higher than the CAN controller
	  driver.

endif # NET_CAN

#
# Native simulator offloaded sockets
#

menuconfig NET_NATIVE_OFFLOADED_SOCKETS
	bool "Native Simulator offloaded sockets"
	depends on ARCH_POSIX
	depends on NATIVE_LIBRARY
	depends on NET_SOCKETS_OFFLOAD
	help
	  Offloaded sockets for Native Simulator utilize host BSD sockets API (like socket(),
	  connect(), send(), recvfrom(), etc.) in order to provide networking capability.

	  This driver main advantage is that it is possible to use this driver without any
	  additional setup on the host side, unlike with the native TAP Ethernet driver.

if NET_NATIVE_OFFLOADED_SOCKETS

config NET_NATIVE_OFFLOADED_SOCKETS_EPOLL_WAIT_INTERVAL
	int "Interval between epoll_wait() calls (in simulated microseconds)"
	default 1000
	help
	  Number of simulated microseconds before next epoll_wait() call, when there were no pending
	  events detected.

	  Decrease that value when lower network traffic latency is expected, at the expense of more
	  CPU processing overhead.

endif # NET_NATIVE_OFFLOADED_SOCKETS

endif # NET_DRIVERS
