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