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

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.

endif # ETH_NATIVE_POSIX
