# Kconfig.app - Options for networking applications

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

menuconfig NET_APP
	bool "Network application API support [EXPERIMENTAL]"
	default y
	select NET_MGMT
	select NET_MGMT_EVENT
	help
	Enable API that helps to create client/server network applications.
	This API is experimental and subject to change.

if NET_APP

config NET_APP_AUTO_INIT
	bool "Init networking support automatically during device startup"
	default y
	help
	If this option is set, then the net_app API is automatically
	initialized when the device is started. If you do not wish to do
	this, then disable this and call net_app_init() in your application.

config NET_APP_INIT_PRIO
	int "Startup priority for the network application init"
	default 95
	depends on NET_APP_AUTO_INIT

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

config NET_APP_NEED_IPV6
	bool "This application wants IPv6 support"
	depends on NET_APP_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_APP_NEED_IPV6_ROUTER
	bool "This application wants IPv6 router to exists"
	depends on NET_APP_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_APP_NEED_IPV4
	bool "This application wants IPv4 support"
	depends on NET_APP_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.

config NET_DEBUG_APP
	bool "Debug net app library"
	default n
	default y if NET_LOG_GLOBAL
	help
	Enables net app library to output debug messages

config NET_APP_SERVER
	bool "Enable server support"
	default n
	help
	Enables net app library server APIs.

config NET_APP_SERVER_NUM_CONN
	int "Number of simultaneous incoming connections"
	default 1
	depends on NET_APP_SERVER
	help
	Tells how many simultaneous incoming connections the server instance can
	support. The value of CONFIG_NET_TCP_BACKLOG_SIZE must be greater than
	or equal to CONFIG_NET_APP_SERVER_NUM_CONN.

config NET_APP_CLIENT
	bool "Enable client support"
	default n
	help
	Enables net app library client APIs.

config NET_APP_TLS
	bool "Enable TLS support for TCP applications"
	default n
	depends on NET_TCP
	select MBEDTLS
	help
	Enables net app library to use TLS for encrypted communication.

config NET_APP_DTLS
	bool "Enable DTLS support for UDP applications"
	depends on NET_UDP
	select MBEDTLS
	default n
	help
	Enables net app library to use DTLS for encrypted UDP communication.

config NET_APP_DTLS_TIMEOUT
	int "DTLS session timeout"
	depends on NET_APP_DTLS
	default 15
	help
	If a DTLS session does not have any activity, then disconnect
	the session. The value is in seconds.

config NET_DEBUG_APP_TLS_LEVEL
	int "Debug level for mbedtls in net app library"
	depends on (NET_APP_TLS || NET_APP_DTLS) && NET_DEBUG_APP
	default 0
	range 0 4
	help
	Sets log level for the mbedtls when debugging net_app library.
	Levels are (from ext/lib/crypto/mbedtls/include/mbedtls/debug.h):
	0 No debug
	1 Error
	2 State change
	3 Information
	4 Verbose

config NET_APP_TLS_STACK_SIZE
	int "TLS handler thread stack size"
	default 8192
	depends on NET_APP_TLS || NET_APP_DTLS
	help
	TLS handler thread stack size. The mbedtls routines will use this stack
	thus it is by default very large.

endif # NET_APP

menuconfig NET_APP_SETTINGS
	bool "Set network settings for applications"
	default n
	depends on NET_APP
	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_APP_SETTINGS

if NET_IPV6

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

config NET_APP_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_APP_MY_IPV4_ADDR
	string "My IPv4 address"
	help
	  Use 192.0.2.1 here if uncertain.

config NET_APP_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_APP_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_APP_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 || NET_L2_RAW_CHANNEL

config NET_APP_IEEE802154_DEV_NAME
	string "IEEE 802.15.4 device name"
	help
	  The device name to get bindings from in the sample application.

config NET_APP_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_APP_IEEE802154_CHANNEL
	int "IEEE 802.15.4 channel"
	default 26
	help
	  The channel to use by default in the sample application.

config NET_APP_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_APP_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_APP_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_APP_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 || NET_L2_RAW_CHANNEL

if NET_L2_BT

config NET_APP_BT_NODE
	bool "Enable Bluetooth node support"
	default n
	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_L2_BT

endif # NET_APP_SETTINGS
