# Options for networking configuration

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

config NET_CONFIG_AUTO_INIT
	bool "Init networking support automatically during device startup"
	default n if USB_DEVICE_NETWORK
	default y
	help
	  If this option is set, then the networking system is automatically
	  initialized when the device is started. If you do not wish to do
	  this, then disable this and call net_config_init() in your application.

config NET_CONFIG_INIT_PRIO
	int "Startup priority for the network application init"
	default 95
	depends on NET_CONFIG_AUTO_INIT

config NET_CONFIG_INIT_TIMEOUT
	int "How long to wait for networking to be ready and available"
	default 30
	help
	  The value is in seconds. If for example IPv4 address from DHCPv4 is not
	  received within this limit, then the net_config_init() call will fail
	  during the device startup.

config NET_CONFIG_NEED_IPV6
	bool "This application wants IPv6 support"
	depends on NET_CONFIG_AUTO_INIT
	select NET_IPV6
	help
	  The network application needs IPv6 support to function properly.
	  This option makes sure the network application is initialized properly
	  in order to use IPv6.

config NET_CONFIG_NEED_IPV6_ROUTER
	bool "This application wants IPv6 router to exists"
	depends on NET_CONFIG_AUTO_INIT
	depends on NET_IPV6
	help
	  The network application needs IPv6 router to exists before continuing.
	  What this means that the application wants to wait until it receives
	  IPv6 router advertisement message before continuing.

config NET_CONFIG_NEED_IPV4
	bool "This application wants IPv4 support"
	depends on NET_CONFIG_AUTO_INIT
	select NET_IPV4
	help
	  The network application needs IPv4 support to function properly.
	  This option makes sure the network application is initialized properly
	  in order to use IPv4.

module = NET_CONFIG
module-dep = NET_LOG
module-str = Log level for network config library
module-help = Enables net config library to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"

menuconfig NET_CONFIG_SETTINGS
	bool "Set network settings for applications"
	select NET_MGMT
	select NET_MGMT_EVENT
	help
	  Allow IP addresses to be set in config file for
	  networking client/server sample applications, or
	  some link-layer dedicated settings like the channel.
	  Beware this is not meant to be used for proper
	  provisioning but quick sampling/testing.

if NET_CONFIG_SETTINGS

if NET_IPV6

config NET_CONFIG_MY_IPV6_ADDR
	string "My IPv6 address"
	help
	  Use 2001:db8::1 here if uncertain.

config NET_CONFIG_PEER_IPV6_ADDR
	string "Peer IPv6 address"
	help
	  This is only applicable in client side applications that try
	  to establish a connection to peer host.
	  Use 2001:db8::2 here if uncertain.

endif # NET_IPV6

if NET_IPV4

config NET_CONFIG_MY_IPV4_ADDR
	string "My IPv4 address"
	help
	  Use 192.0.2.1 here if uncertain.

config NET_CONFIG_MY_IPV4_NETMASK
	string "My IPv4 netmask"
	default "255.255.255.0"
	help
	  Static netmask to use if not overridden by DHCP. Use empty value to
	  skip setting static value.

config NET_CONFIG_MY_IPV4_GW
	string "My IPv4 gateway"
	help
	  Static gateway to use if not overridden by DHCP. Use empty value to
	  skip setting static value.

config NET_CONFIG_PEER_IPV4_ADDR
	string "Peer IPv4 address"
	help
	  This is only applicable in client side applications that try
	  to establish a connection to peer host.
	  Use 192.0.2.2 here if uncertain.

endif # NET_IPV4

if NET_L2_IEEE802154 || IEEE802154_RAW_MODE

config NET_CONFIG_IEEE802154_PAN_ID
	hex "IEEE 802.15.4 PAN ID"
	default 0xabcd
	help
	  The PAN ID to use by default in the sample.

config NET_CONFIG_IEEE802154_CHANNEL
	int "IEEE 802.15.4 channel"
	default 26
	help
	  The channel to use by default in the sample application.

config NET_CONFIG_IEEE802154_RADIO_TX_POWER
	int "IEEE 802.15.4 TX power in dbm"
	default 0
	help
	  The TX power to use by default in the sample application.
	  See NET_L2_IEEE802154_RADIO_DFLT_TX_POWER for more info.

config NET_CONFIG_IEEE802154_SECURITY_KEY
	string "IEEE 802.15.4 security key"
	default "moooh!"
	depends on NET_L2_IEEE802154_SECURITY
	help
	  The key string to use for the link-layer security part.

config NET_CONFIG_IEEE802154_SECURITY_KEY_MODE
	int "IEEE 802.15.4 security key mode"
	default 0
	range 0 0
	depends on NET_L2_IEEE802154_SECURITY
	help
	  The key mode to use for the link-layer security part.
	  Only implicit mode is supported, thus 0.

config NET_CONFIG_IEEE802154_SECURITY_LEVEL
	int "IEEE 802.15.4 security level (0-7)"
	default 0
	range 0 7
	depends on NET_L2_IEEE802154_SECURITY
	help
	  The security level to use for the link-layer security part.
	  0 means no security
	  1 authentication only with a 4 bytes length tag
	  2 authentication only with a 8 bytes length tag
	  3 authentication only with a 16 bytes length tag
	  4 encryption only
	  5 encryption/authentication with a 4 bytes length tag
	  6 encryption/authentication with a 8 bytes length tag
	  7 encryption/authentication with a 16 bytes length tag

endif # NET_L2_IEEE802154 || IEEE802154_RAW_MODE

config NET_CONFIG_BT_NODE
	bool "Bluetooth node support"
	depends on NET_L2_BT
	select NET_L2_BT_MGMT
	help
	  Enables application to operate in node mode which requires GATT
	  service to be registered and start advertising as peripheral.

endif # NET_CONFIG_SETTINGS

config NET_CONFIG_CLOCK_SNTP_INIT
	bool "Initialize system clock using SNTP on application startup"
	depends on SNTP && POSIX_CLOCK
	help
	  Perform an SNTP request over networking to get and absolute
	  wall clock time, and initialize system time from it, so
	  functions like time(), gettimeofday(), etc. returned the
	  correct absolute time (no just time since system startup).
	  Requires networking.

if NET_CONFIG_CLOCK_SNTP_INIT

config NET_CONFIG_SNTP_INIT_SERVER
	string "SNTP server to use for system clock init"
	default ""
	help
	  Zephyr does not provide default setting for this option. Each
	  application and vendor should choose a suitable setting based
	  on their locality, needs, and server's terms of service. See
	  e.g. server information at
	  https://support.ntp.org/bin/view/Servers/NTPPoolServers

config NET_CONFIG_SNTP_INIT_TIMEOUT
	int "SNTP timeout to init system clock (ms)"
	default 3000

endif # NET_CONFIG_CLOCK_SNTP_INIT
