# Copyright 2020 Espressif Systems (Shanghai) PTE LTD

menuconfig WIFI_ESP32
	bool "ESP32 SoC WiFi support"
	default y
	depends on DT_HAS_ESPRESSIF_ESP32_WIFI_ENABLED
	depends on ZEPHYR_HAL_ESPRESSIF_MODULE_BLOBS || BUILD_ONLY_NO_BLOBS
	depends on !SMP
	select THREAD_CUSTOM_DATA
	select NET_L2_WIFI_MGMT
	select NET_L2_ETHERNET
	select WIFI_USE_NATIVE_NETWORKING
	select MBEDTLS
	select THREAD_STACK_INFO
	select DYNAMIC_THREAD
	select DYNAMIC_THREAD_ALLOC
	help
	  Enable ESP32 SoC WiFi support. Only supported in single
	  core mode because the network stack is not aware of SMP
	  stuff.

if WIFI_ESP32

config HEAP_MEM_POOL_ADD_SIZE_ESP_WIFI
	int
	default 40960 if ESP_WIFI_HEAP_SYSTEM
	default 19456 if ESP_WIFI_HEAP_SPIRAM
	help
	  Make sure there is a minimal heap available for Wi-Fi driver.

choice ESP_WIFI_HEAP
	prompt "Wi-Fi adapter heap memory"
	default ESP_WIFI_HEAP_SYSTEM

config ESP_WIFI_HEAP_SYSTEM
	bool "Wi-Fi adapter use kernel mempool heap (k_malloc)"

config ESP_WIFI_HEAP_SPIRAM
	bool "Wi-Fi adapter use spiram mempool heap (smh_malloc)"

endchoice # ESP_WIFI_HEAP

config NET_TCP_WORKQ_STACK_SIZE
	default 2048

config NET_RX_STACK_SIZE
	default 2048

config NET_MGMT_EVENT_STACK_SIZE
	default 2048

config ESP32_WIFI_STA_AUTO_DHCPV4
	bool "Automatically starts DHCP4 negotiation"
	default y if NET_DHCPV4
	depends on NET_IPV4
	help
	  WiFi driver will automatically initiate DHCPV4 negotiation when connected.

config ESP32_WIFI_AP_STA_MODE
	bool "Activates the Station/AP co-existence mode."
	default y if WIFI_USAGE_MODE_STA_AP
	depends on WIFI_NM
	help
	  The Station/AP coexistence mode allows the ESP32 to operate as both a station and
	  an access point simultaneously.

config ESP32_WIFI_STA_RECONNECT
	bool "WiFi connection retry"
	help
	  Set auto WiFI reconnection when disconnected.

config ESP32_WIFI_STA_SCAN_ALL
	bool "Scan all available APs when connecting in station mode"
	help
	  When connecting in station mode, scan all channels and connect to the channel with the
	  highest RSSI. Without this, a fast scan is performed which connects to the first AP
	  found.

config ESP32_WIFI_NET_ALLOC_SPIRAM
	bool "Allocate memory of WiFi and NET in SPIRAM"
	depends on ESP_SPIRAM
	help
	  Allocate memory of WiFi and NET stack in SPIRAM, increasing available RAM memory space
	  for application stack.

config ESP32_WIFI_STATIC_RX_BUFFER_NUM
	int "Max number of WiFi static RX buffers"
	range 2 25
	default 10
	help
	  Set the number of WiFi static RX buffers. Each buffer takes approximately 1.6KB of RAM.
	  The static rx buffers are allocated when esp_wifi_init is called, they are not freed
	  until esp_wifi_deinit is called.

	  WiFi hardware use these buffers to receive all 802.11 frames.
	  A higher number may allow higher throughput but increases memory use. If ESP32_WIFI_AMPDU_RX_ENABLED
	  is enabled, this value is recommended to set equal or bigger than ESP32_WIFI_RX_BA_WIN in order to
	  achieve better throughput and compatibility with both stations and APs.

config ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM
	int "Max number of WiFi dynamic RX buffers"
	range 0 128
	default 32
	help
	  Set the number of WiFi dynamic RX buffers, 0 means unlimited RX buffers
	  will be allocated (provided sufficient free RAM). The size of each dynamic
	  RX buffer depends on the size of the received data frame.

	  For each received data frame, the WiFi driver makes a copy to an RX buffer
	  and then delivers it to the high layer TCP/IP stack. The dynamic RX buffer
	  is freed after the higher layer has successfully received the data frame.

	  For some applications, WiFi data frames may be received faster than the
	  application can process them. In these cases we may run out of memory if
	  RX buffer number is unlimited (0). If a dynamic RX buffer limit is set,
	  it should be at least the number of static RX buffers.

choice ESP32_WIFI_TX_BUFFER
	prompt "Type of WiFi TX buffers"
	default ESP32_WIFI_DYNAMIC_TX_BUFFER
	help
	  Select type of WiFi TX buffers:

	  If "Static" is selected, WiFi TX buffers are allocated when WiFi is
	  initialized and released when WiFi is de-initialized. The size of each
	  static TX buffer is fixed to about 1.6KB.

	  If "Dynamic" is selected, each WiFi TX buffer is allocated as needed
	  when a data frame is delivered to the Wifi driver from the TCP/IP stack.
	  The buffer is freed after the data frame has been sent by the WiFi driver.
	  The size of each dynamic TX buffer depends on the length of each data
	  frame sent by the TCP/IP layer.

	  If PSRAM is enabled, "Static" should be selected to guarantee enough
	  WiFi TX buffers. If PSRAM is disabled, "Dynamic" should be selected
	  to improve the utilization of RAM.

config ESP32_WIFI_STATIC_TX_BUFFER
	bool "Static"

config ESP32_WIFI_DYNAMIC_TX_BUFFER
	bool "Dynamic"

endchoice # ESP32_WIFI_TX_BUFFER

config ESP32_WIFI_TX_BUFFER_TYPE
	int
	default 0 if ESP32_WIFI_STATIC_TX_BUFFER
	default 1 if ESP32_WIFI_DYNAMIC_TX_BUFFER

config ESP32_WIFI_STATIC_TX_BUFFER_NUM
	int "Max number of WiFi static TX buffers"
	depends on ESP32_WIFI_STATIC_TX_BUFFER
	range 1 64
	default 16
	help
	  Set the number of WiFi static TX buffers. Each buffer takes approximately
	  1.6KB of RAM. The static RX buffers are allocated when esp_wifi_init() is
	  called, they are not released until esp_wifi_deinit() is called.

	  For each transmitted data frame from the higher layer TCP/IP stack,
	  the WiFi driver makes a copy of it in a TX buffer.  For some applications
	  especially UDP applications, the upper layer can deliver frames faster
	  than WiFi layer can transmit.
	  In these cases, we may run out of TX buffers.

config ESP32_WIFI_CACHE_TX_BUFFER_NUM
	int "Max number of WiFi cache TX buffers"
	depends on ESP_SPIRAM && ESP_WIFI_HEAP_SPIRAM
	range 16 128
	default 32
	help
	  Set the number of WiFi cache TX buffer number.

	  For each TX packet from uplayer, such as LWIP etc, WiFi driver needs to
	  allocate a static TX buffer and makes a copy of uplayer packet. If WiFi
	  driver fails to allocate the static TX buffer, it caches the uplayer
	  packets to a dedicated buffer queue, this option is used to configure the
	  size of the cached TX queue.

config ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM
	int "Max number of WiFi dynamic TX buffers"
	depends on ESP32_WIFI_DYNAMIC_TX_BUFFER
	range 1 128
	default 32
	help
	  Set the number of WiFi dynamic TX buffers. The size of each
	  dynamic TXbuffer is not fixed, it depends on the size of each
	  transmitted data frame.

	  For each transmitted frame from the higher layer TCP/IP stack,
	  the WiFi driver makes a copy of it in a TX buffer. For some applications,
	  especially UDP applications, the upper layer can deliver frames faster
	  than WiFi layer can transmit. In these cases, we may run out of TX
	  buffers.

choice ESP32_WIFI_MGMT_RX_BUFFER
	prompt "Type of WiFi RX MGMT buffers"
	default ESP32_WIFI_STATIC_RX_MGMT_BUFFER
	help
	  Select type of WiFi RX MGMT buffers:

	  If "Static" is selected, WiFi RX MGMT buffers are allocated when WiFi is initialized and released
	  when WiFi is de-initialized. The size of each static RX MGMT buffer is fixed to about 500 Bytes.

	  If "Dynamic" is selected, each WiFi RX MGMT buffer is allocated as needed when a MGMT data frame is
	  received. The MGMT buffer is freed after the MGMT data frame has been processed by the WiFi driver.

config ESP32_WIFI_STATIC_RX_MGMT_BUFFER
	bool "Static"

config ESP32_WIFI_DYNAMIC_RX_MGMT_BUFFER
	bool "Dynamic"

endchoice # ESP32_WIFI_MGMT_RX_BUFFER

config ESP32_WIFI_DYNAMIC_RX_MGMT_BUF
	int
	default 0 if ESP32_WIFI_STATIC_RX_MGMT_BUFFER
	default 1 if ESP32_WIFI_DYNAMIC_RX_MGMT_BUFFER

config ESP32_WIFI_RX_MGMT_BUF_NUM_DEF
	int "Max number of WiFi RX MGMT buffers"
	range 1 10
	default 5
	help
	  Set the number of WiFi RX_MGMT buffers.

	  For Management buffers, the number of dynamic and static management buffers is the same.
	  In order to prevent memory fragmentation, the management buffer type should be set to static first.

config ESP32_WIFI_CSI_ENABLED
	bool "WiFi CSI(Channel State Information)"
	help
	  Select this option to enable CSI(Channel State Information) feature.
	  CSI takes about CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM KB of RAM.
	  If CSI is not used, it is better to disable this feature in order
	  to save memory.

config ESP32_WIFI_AMPDU_TX_ENABLED
	bool "WiFi AMPDU TX"
	default y
	help
	  Select this option to enable AMPDU TX feature. It improves transmission
	  error checking and overall network performance with the cost of processing
	  speed. Helpful when the device is operating in crowded wireless area.

config ESP32_WIFI_TX_BA_WIN
	int "WiFi AMPDU TX BA window size"
	depends on ESP32_WIFI_AMPDU_TX_ENABLED
	range 2 32
	default 6
	help
	  Set the size of WiFi Block Ack TX window. Generally a bigger value means
	  higher throughput but more memory. Most of time we should NOT change the
	  default value unless special reason, e.g. test the maximum
	  UDP TX throughput with iperf etc. For iperf test in shieldbox,
	  the recommended value is 9~12.

config ESP32_WIFI_AMPDU_RX_ENABLED
	bool "WiFi AMPDU RX"
	default y
	help
	  Select this option to enable AMPDU RX feature. It improves transmission
	  error checking and overall network performance with the cost of processing
	  speed. Helpful when the device is operating in crowded wireless area.

config ESP32_WIFI_RX_BA_WIN
	int "WiFi AMPDU RX BA window size"
	depends on ESP32_WIFI_AMPDU_RX_ENABLED
	range 2 32
	default 6
	help
	  Set the size of WiFi Block Ack RX window. Generally a bigger value means
	  higher throughput and better compatibility but more memory. Most of time
	  we should NOT change the default value unless special reason,
	  e.g. test the maximum UDP RX throughput with iperf etc. For iperf test in
	  shieldbox, the recommended value is 9~12. If PSRAM is used and WiFi memory
	  is preferred to be allocated in PSRAM first, the default and minimum value
	  should be 16 to achieve better throughput and compatibility with both
	  stations and APs.

config ESP32_WIFI_AMSDU_TX_ENABLED
	bool "WiFi AMSDU TX"
	depends on ESP_SPIRAM
	help
	  Select this option to enable AMSDU TX feature

config ESP32_WIFI_MGMT_SBUF_NUM
	int "WiFi mgmt short buffer number"
	range 6 32
	default 32
	help
	  Set the number of WiFi management short buffer.

config ESP32_WIFI_IRAM_OPT
	bool "WiFi IRAM speed optimization"
	help
	  Select this option to place frequently called Wi-Fi library functions in IRAM.
	  When this option is disabled, more than 10Kbytes of IRAM memory will be saved
	  but Wi-Fi throughput will be reduced.

config ESP32_WIFI_RX_IRAM_OPT
	bool "WiFi RX IRAM speed optimization"
	help
	  Select this option to place frequently called Wi-Fi library RX functions in IRAM.
	  When this option is disabled, more than 17Kbytes of IRAM memory will be saved
	  but Wi-Fi performance will be reduced.

config ESP32_WIFI_MAX_THREAD_PRIORITY
	int "Maximum work queue thread priority"
	default 7
	help
	  Maximum priority of thread used for processing driver work queue items.

config ESP32_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME
	int "Minimum active time"
	range 8 60
	default 50
	help
	  Only for station in WIFI_PS_MIN_MODEM or WIFI_PS_MAX_MODEM. When the station enters the active state,
	  it will work for at least ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME. If a data packet is received or sent
	  during this period, the time will be refreshed. If the time is up, but the station still has packets
	  to receive or send, the time will also be refreshed. unit: milliseconds.

config ESP32_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME
	int "Maximum keep alive time"
	range 10 60
	default 10
	help
	  Only for station in WIFI_PS_MIN_MODEM or WIFI_PS_MAX_MODEM. If no packet has been
	  sent within ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME, a null data packet will be sent
	  to maintain the connection with the AP. unit: seconds.

config ESP32_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME
	int "Minimum wait broadcast data time"
	range 10 30
	default 15
	help
	  Only for station in WIFI_PS_MIN_MODEM or WIFI_PS_MAX_MODEM. When the station knows through the beacon
	  that AP will send broadcast packet, it will wait for ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME
	  before entering the sleep process. If a broadcast packet is received with more data bits, the time
	  will refreshed. unit: milliseconds.

config ESP32_WIFI_FTM_ENABLE
	bool "WiFi FTM"
	depends on SOC_SERIES_ESP32C2 || SOC_SERIES_ESP32C3 || SOC_SERIES_ESP32C6 || SOC_SERIES_ESP32S2 || SOC_SERIES_ESP32S3
	help
	  Enable feature Fine Timing Measurement for calculating WiFi Round-Trip-Time (RTT).

config ESP32_WIFI_FTM_INITIATOR_SUPPORT
	bool "FTM Initiator support"
	default y
	depends on ESP32_WIFI_FTM_ENABLE

config ESP32_WIFI_FTM_RESPONDER_SUPPORT
	bool "FTM Responder support"
	default y
	depends on ESP32_WIFI_FTM_ENABLE

config ESP32_WIFI_SOFTAP_SUPPORT
	bool
	default y
	help
	  Hidden option to enable Wi-Fi SoftAP functions in WPA supplicant and RF libraries.

config ESP32_WIFI_MBEDTLS_CRYPTO
	bool "Use MbedTLS crypto APIs"
	select MBEDTLS_ECP_C
	select MBEDTLS_ECDH_C
	select MBEDTLS_ECDSA_C
	select MBEDTLS_PKCS5_C
	select MBEDTLS_PK_WRITE_C
	select MBEDTLS_CIPHER_MODE_CTR_ENABLED
	select MBEDTLS_CMAC
	select MBEDTLS_ENTROPY_C
	help
	  Select this option to use MbedTLS crypto APIs which utilize hardware acceleration.

config ESP32_WIFI_ENABLE_WPA3_SAE
	bool "WPA3-Personal"
	select ESP32_WIFI_MBEDTLS_CRYPTO
	help
	  Select this option to allow the device to establish a WPA3-Personal connection.

config ESP32_WIFI_ENABLE_WPA3_OWE_STA
	bool "OWE STA"
	default y
	depends on ESP32_WIFI_ENABLE_WPA3_SAE
	help
	  Select this option to allow the device to establish OWE connection with eligible AP's.

config ESP32_WIFI_ENABLE_SAE_PK
	bool "SAE-PK"
	default y
	depends on ESP32_WIFI_ENABLE_WPA3_SAE
	help
	  Select this option to enable SAE-PK

config ESP32_WIFI_DEBUG_PRINT
	bool "Print debug messages from WPA Supplicant"
	help
	  Select this option to print logging information from WPA supplicant,
	  this includes handshake information and key hex dumps depending
	  on the project logging level.

	  Enabling this could increase the build size ~60kb
	  depending on the project logging level.

endif # WIFI_ESP32
