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

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 || IEEE802154_RAW_MODE

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
