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