# Native posix ethernet driver configuration options

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

menuconfig ETH_NATIVE_POSIX
	bool "Native Posix Ethernet driver"
	depends on ARCH_POSIX && EXTERNAL_LIBC
	help
	  Enable native posix ethernet driver. Note, this driver is run inside
	  a process in your host system.

if ETH_NATIVE_POSIX
config ETH_NATIVE_POSIX_STARTUP_AUTOMATIC
	bool "Start network interface automatically"
	help
	  If set, the native_posix ethernet driver will set up the network
	  interface, requiring ``zephyr.exe`` to be run with root privileges
	  (needed to create and configure the TAP device).
	  If not set (the default and recommended way), the network interface
	  must be set up manually using ``net-setup.sh`` (from the net-tools
	  project repo). The ``zephyr.exe`` program can then be run as a
	  non-root user.

if ETH_NATIVE_POSIX_STARTUP_AUTOMATIC

config ETH_NATIVE_POSIX_SETUP_SCRIPT
	string "Host setup script"
	default "${ZEPHYR_BASE}/samples/net/eth_native_posix/net_setup_host"
	help
	  This option sets the name of the script that is run when the host TAP
	  network interface is created. The script should setup IP addresses
	  etc. for the host TAP network interface.
	  The default script accepts following options:
	  -i|--interface <network interface name>, default is zeth
	  -f|--file <config file name>, default is net_setup_host.conf
	  If needed, you can add these options to this script name option.
	  Note that the driver will add -i option with the value of
	  CONFIG_ETH_NATIVE_POSIX_DRV_NAME option to the end of the options
	  list when calling the host setup script.

config ETH_NATIVE_POSIX_STARTUP_SCRIPT
	string "Host startup script"
	default ""
	help
	  This option sets the name of the script that is run when the host TAP
	  network interface is created and setup script has been run.
	  The startup script could launch e.g., wireshark to capture
	  the network traffic for the freshly started network interface.
	  Note that the network interface name CONFIG_ETH_NATIVE_POSIX_DRV_NAME
	  is appended at the end of this startup script name.
	  Example script for starting wireshark is provided in
	  ${ZEPHYR_BASE}/samples/net/eth_native_posix/net_start_wireshark.sh
	  file.

config ETH_NATIVE_POSIX_STARTUP_SCRIPT_USER
	string "Username to run the host startup script"
	default ""
	help
	  By default the startup script is run as a root user. Set here the
	  username to run the script if running it as a root user is not
	  desired. Note that this setting is only for startup script and not
	  for the setup script. The setup script needs to be run always as
	  a root user.

endif # ETH_NATIVE_POSIX_STARTUP_AUTOMATIC

config ETH_NATIVE_POSIX_INTERFACE_COUNT
	int "Number of network interfaces created"
	default NET_GPTP_NUM_PORTS if NET_GPTP
	default 1
	range 1 32
	help
	  By default only one network interface is created. It is possible
	  to create multiple interfaces in certain use cases. For example if
	  multiple ports are defined in gPTP, then multiple network interfaces
	  must be created here.

config ETH_NATIVE_POSIX_DRV_NAME
	string "Ethernet driver name"
	default "zeth"
	help
	  This option sets the driver name and name of the network interface
	  in your host system. If there are multiple network interfaces defined,
	  then this value is used as a prefix and the interface names will be
	  zeth0, zeth1, etc.

config ETH_NATIVE_POSIX_DEV_NAME
	string "Host ethernet TUN/TAP device name"
	default "/dev/net/tun"
	help
	  This option sets the TUN/TAP device name in your host system.

config ETH_NATIVE_POSIX_PTP_CLOCK
	bool "PTP clock driver support"
	default y if NET_GPTP
	select PTP_CLOCK
	depends on NET_GPTP
	help
	  Enable PTP clock support.

config ETH_NATIVE_POSIX_RANDOM_MAC
	bool "Random MAC address"
	depends on ENTROPY_GENERATOR
	default y
	help
	  Generate a random MAC address dynamically.

config ETH_NATIVE_POSIX_VLAN_TAG_STRIP
	bool "Strip VLAN tag from Rx frames"
	depends on NET_VLAN
	help
	  Native posix ethernet driver will strip of VLAN tag from
	  Rx Ethernet frames and sets tag information in net packet
	  metadata.

config ETH_NATIVE_POSIX_MAC_ADDR
	string "MAC address for the interface"
	default ""
	depends on !ETH_NATIVE_POSIX_RANDOM_MAC
	help
	  Specify a MAC address for the ethernet 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 ETH_NATIVE_POSIX_RX_TIMEOUT
	int "Ethernet RX timeout"
	default 1 if NET_GPTP
	default 50
	range 1 100
	help
	  Native posix ethernet driver repeatedly checks for new data.
	  Specify how long the thread sleeps between these checks if no new data
	  available.

endif # ETH_NATIVE_POSIX
