# OpenThread driver configuration options

# Copyright (c) 2018 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

#
# OpenThread options
#
menuconfig NET_L2_OPENTHREAD
	bool "OpenThread L2"
	depends on FLASH
	depends on FLASH_PAGE_LAYOUT
	depends on CPLUSPLUS
	depends on REBOOT
	select OPENTHREAD_PLAT
	select MBEDTLS
	select MBEDTLS_ENABLE_HEAP
	select MBEDTLS_CIPHER_AES_ENABLED
	select MBEDTLS_CIPHER_CCM_ENABLED
	select MBEDTLS_MAC_SHA256_ENABLED
	select MBEDTLS_ENTROPY_ENABLED

if NET_L2_OPENTHREAD

config OPENTHREAD_DTLS
	# Hidden option to enable DTLS support in OpenThread
	bool
	select MBEDTLS_TLS_VERSION_1_2
	select MBEDTLS_DTLS
	select MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
	select MBEDTLS_ECP_DP_SECP256R1_ENABLED
	select MBEDTLS_ECP_NIST_OPTIM
	select MBEDTLS_MAC_CMAC_ENABLED
	select MBEDTLS_SSL_EXPORT_KEYS
	select MBEDTLS_CTR_DRBG_ENABLED
	select MBEDTLS_HMAC_DRBG_ENABLED

config OPENTHREAD_PLAT
	bool
	help
	  This option enables OpenThread platform

if OPENTHREAD_PLAT

menuconfig OPENTHREAD_DEBUG
	bool "OpenThread stack log support"
	help
	  This option enables log support for OpenThread

if OPENTHREAD_DEBUG

choice
	prompt "OpenThread stack log level"
	help
	  This option selects log level for OpenThread stack.

config OPENTHREAD_LOG_LEVEL_ERROR
	bool "Error"
config OPENTHREAD_LOG_LEVEL_WARNING
	bool "Warning"
config OPENTHREAD_LOG_LEVEL_INFO
	bool "Info"
config OPENTHREAD_LOG_LEVEL_DEBUG
	bool "Debug"
endchoice

endif

endif

config OPENTHREAD_LOG_LEVEL
	int
	default 1 if OPENTHREAD_LOG_LEVEL_ERROR
	default 2 if OPENTHREAD_LOG_LEVEL_WARNING
	default 3 if OPENTHREAD_LOG_LEVEL_INFO
	default 4 if OPENTHREAD_LOG_LEVEL_DEBUG
	default 0

menuconfig OPENTHREAD_L2_DEBUG
	bool "OpenThread L2 log support"
	help
	  This option enables log support for OpenThread

if OPENTHREAD_L2_DEBUG
config OPENTHREAD_L2_DEBUG_DUMP_15_4
	bool "Dump 802.15.4 packets"
	help
	  This option enables dumping of 802.15.4 packets

config OPENTHREAD_L2_DEBUG_DUMP_IPV6
	bool "Dump IPv6 packets"
	help
	  This option enables dumping of IPv6 packets

endif

module = OPENTHREAD_L2
module-dep = NET_LOG
module-str = Log level for OpenThread driver
module-help = Enables OpenThread driver to output debug messages.
source "subsys/net/Kconfig.template.log_config.net"

config OPENTHREAD_THREAD_PRIORITY
	int "OpenThread thread priority"
	default 8

config OPENTHREAD_THREAD_STACK_SIZE
	int "OpenThread thread stack size"
	default 6144 if OPENTHREAD_COMMISSIONER
	default 3072

config OPENTHREAD_PKT_LIST_SIZE
	int "List size for Ip6 packet buffering"
	default 10

config OPENTHREAD_PANID
	int "Default PAN ID"
	default 43981

config OPENTHREAD_CHANNEL
	int "Default Channel"
	default 11

config OPENTHREAD_NETWORK_NAME
	string "Default network name"
	default "ot_zephyr"
	help
	  Network name for OpenThread

config OPENTHREAD_XPANID
	string "Default Extended PAN ID"
	default "de:ad:00:be:ef:00:ca:fe"
	help
	  Extended PAN ID for OpenThread with
	  format "de:ad:00:be:ef:00:ca:fe"

choice
	prompt "OpenThread device type"
	help
	  This option selects Thread network device type

config OPENTHREAD_FTD
	bool "FTD - Full Thread Device"
config OPENTHREAD_MTD
	bool "MTD - Minimal Thread Device"
endchoice

config OPENTHREAD_SHELL
	bool "Enable OpenThread shell"
	select SHELL
	default y

config OPENTHREAD_DIAG
	bool "Diagnostic functions support"
	help
	  Enable OpenThread CLI diagnostic commands

config OPENTHREAD_COMMISSIONER
	bool "Commissioner functions support"
	select OPENTHREAD_DTLS
	help
	  Enable commissioner capability in OpenThread stack. Note, that DTLS
	  handshake used in the commissioning procedure requires a larger
	  mbedTLS heap than the default value. A minimum recommended value of
	  CONFIG_MBEDTLS_HEAP_SIZE for the commissioning is 8KB.

config OPENTHREAD_JOINER
	bool "Joiner functions support"
	select OPENTHREAD_DTLS
	help
	  Enable joiner capability in OpenThread stack. Note, that DTLS
	  handshake used in the commissioning procedure requires a larger
	  mbedTLS heap than the default value. A minimum recommended value of
	  CONFIG_MBEDTLS_HEAP_SIZE for the commissioning is 8KB.

config OPENTHREAD_JOINER_AUTOSTART
	bool "Support for automatic joiner start"
	depends on OPENTHREAD_JOINER
	help
	  Enable automatic joiner start

config OPENTHREAD_JOINER_PSKD
	string "Default Pre Shared key for the Device to start joiner"
	depends on OPENTHREAD_JOINER_AUTOSTART
	default "J01NME"
	help
	  Pre Shared Key for the Device to start joiner

config OPENTHREAD_DHCP6_CLIENT
	bool "DHCPv6 client support"
	help
	  Enable DHCPv6 client capability in OpenThread stack

config OPENTHREAD_DHCP6_SERVER
	bool "DHCPv6 server support"
	help
	  Enable DHCPv6 server capability in OpenThread stack

config OPENTHREAD_PLATFORM_INFO
	string "Platform information for OpenThread"
	default "ZEPHYR"
	help
	  Platform information for OpenThread

config OPENTHREAD_JAM_DETECTION
	bool "Jam detection support"
	help
	  Enable jam detection in OpenThread stack

config OT_PLAT_FLASH_PAGES_COUNT
	int "Flash pages count used by OpenThread platform"
	default 4
	help
	  This option sets flash pages count used by OpenThread to store its settings. They are located at the end of flash.

endif
