From 20dc46ca498293619e73de7751575aa699eb9486 Mon Sep 17 00:00:00 2001 From: zhangyanjiao Date: Fri, 18 Dec 2020 14:41:28 +0800 Subject: [PATCH] Revert "esp_wifi: optimize WiFi TX performance" This reverts commit 5de5eb567631be2cee35586088ba9039bf60c85a. --- components/esp_common/src/esp_err_to_name.c | 6 -- components/esp_netif/include/esp_netif.h | 16 ---- .../esp_netif/include/esp_netif_net_stack.h | 14 ---- .../esp_netif/include/esp_netif_types.h | 1 - components/esp_netif/lwip/esp_netif_lwip.c | 19 ----- .../esp_netif/lwip/esp_netif_lwip_internal.h | 1 - components/esp_wifi/Kconfig | 16 +--- .../esp_wifi/include/esp_private/wifi.h | 78 ++++--------------- components/esp_wifi/include/esp_wifi.h | 19 ++--- components/esp_wifi/lib | 2 +- components/esp_wifi/src/wifi_default.c | 4 - components/esp_wifi/src/wifi_init.c | 3 - components/esp_wifi/src/wifi_netif.c | 11 --- components/lwip/port/esp32/netif/wlanif.c | 16 +--- 14 files changed, 28 insertions(+), 178 deletions(-) diff --git a/components/esp_common/src/esp_err_to_name.c b/components/esp_common/src/esp_err_to_name.c index c1dfba6ebc..808f369716 100644 --- a/components/esp_common/src/esp_err_to_name.c +++ b/components/esp_common/src/esp_err_to_name.c @@ -351,12 +351,6 @@ static const esp_err_msg_t esp_err_msg_table[] = { # endif # ifdef ESP_ERR_WIFI_STOP_STATE ERR_TBL_IT(ESP_ERR_WIFI_STOP_STATE), /* 12308 0x3014 Returned when WiFi is stopping */ -# endif -# ifdef ESP_ERR_WIFI_NOT_ASSOC - ERR_TBL_IT(ESP_ERR_WIFI_NOT_ASSOC), /* 12309 0x3015 The WiFi connection is not associated */ -# endif -# ifdef ESP_ERR_WIFI_TX_DISALLOW - ERR_TBL_IT(ESP_ERR_WIFI_TX_DISALLOW), /* 12310 0x3016 The WiFi TX is disallowed */ # endif // components/wpa_supplicant/include/esp_supplicant/esp_wps.h # ifdef ESP_ERR_WIFI_REGISTRAR diff --git a/components/esp_netif/include/esp_netif.h b/components/esp_netif/include/esp_netif.h index 7007cc3994..9c8057f9bb 100644 --- a/components/esp_netif/include/esp_netif.h +++ b/components/esp_netif/include/esp_netif.h @@ -760,22 +760,6 @@ esp_netif_t *esp_netif_next(esp_netif_t *esp_netif); */ size_t esp_netif_get_nr_of_ifs(void); -/** - * @brief increase the reference counter of net stack buffer - * - * @param[in] netstack_buf the net stack buffer - * - */ -void esp_netif_netstack_buf_ref(void *netstack_buf); - -/** - * @brief free the netstack buffer - * - * @param[in] netstack_buf the net stack buffer - * - */ -void esp_netif_netstack_buf_free(void *netstack_buf); - /** * @} */ diff --git a/components/esp_netif/include/esp_netif_net_stack.h b/components/esp_netif/include/esp_netif_net_stack.h index ab6d6a07fd..c38297a9f7 100644 --- a/components/esp_netif/include/esp_netif_net_stack.h +++ b/components/esp_netif/include/esp_netif_net_stack.h @@ -69,20 +69,6 @@ void* esp_netif_get_netif_impl(esp_netif_t *esp_netif); */ esp_err_t esp_netif_transmit(esp_netif_t *esp_netif, void* data, size_t len); -/** - * @brief Outputs packets from the TCP/IP stack to the media to be transmitted - * - * This function gets called from network stack to output packets to IO driver. - * - * @param[in] esp_netif Handle to esp-netif instance - * @param[in] data Data to be transmitted - * @param[in] len Length of the data frame - * @param[in] netstack_buf net stack buffer - * - * @return ESP_OK on success, an error passed from the I/O driver otherwise - */ -esp_err_t esp_netif_transmit_wrap(esp_netif_t *esp_netif, void *data, size_t len, void *netstack_buf); - /** * @brief Free the rx buffer allocated by the media driver * diff --git a/components/esp_netif/include/esp_netif_types.h b/components/esp_netif/include/esp_netif_types.h index 9ff5006233..9c785ad883 100644 --- a/components/esp_netif/include/esp_netif_types.h +++ b/components/esp_netif/include/esp_netif_types.h @@ -182,7 +182,6 @@ typedef struct esp_netif_driver_base_s { struct esp_netif_driver_ifconfig { esp_netif_iodriver_handle handle; esp_err_t (*transmit)(void *h, void *buffer, size_t len); - esp_err_t (*transmit_wrap)(void *h, void *buffer, size_t len, void *netstack_buffer); void (*driver_free_rx_buffer)(void *h, void* buffer); }; diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index 345c647e10..e5cf960c6a 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -384,9 +384,6 @@ static esp_err_t esp_netif_init_configuration(esp_netif_t *esp_netif, const esp_ if (esp_netif_driver_config->transmit) { esp_netif->driver_transmit = esp_netif_driver_config->transmit; } - if (esp_netif_driver_config->transmit_wrap) { - esp_netif->driver_transmit_wrap = esp_netif_driver_config->transmit_wrap; - } if (esp_netif_driver_config->driver_free_rx_buffer) { esp_netif->driver_free_rx_buffer = esp_netif_driver_config->driver_free_rx_buffer; } @@ -541,7 +538,6 @@ esp_err_t esp_netif_set_driver_config(esp_netif_t *esp_netif, } esp_netif->driver_handle = driver_config->handle; esp_netif->driver_transmit = driver_config->transmit; - esp_netif->driver_transmit_wrap = driver_config->transmit_wrap; esp_netif->driver_free_rx_buffer = driver_config->driver_free_rx_buffer; return ESP_OK; } @@ -729,16 +725,6 @@ esp_err_t esp_netif_stop(esp_netif_t *esp_netif) return esp_netif_lwip_ipc_call(esp_netif_stop_api, esp_netif, NULL); } -void esp_netif_netstack_buf_ref(void *pbuf) -{ - pbuf_ref(pbuf); -} - -void esp_netif_netstack_buf_free(void *pbuf) -{ - pbuf_free(pbuf); -} - // // IO translate functions // @@ -753,11 +739,6 @@ esp_err_t esp_netif_transmit(esp_netif_t *esp_netif, void* data, size_t len) return (esp_netif->driver_transmit)(esp_netif->driver_handle, data, len); } -esp_err_t esp_netif_transmit_wrap(esp_netif_t *esp_netif, void *data, size_t len, void *pbuf) -{ - return (esp_netif->driver_transmit_wrap)(esp_netif->driver_handle, data, len, pbuf); -} - esp_err_t esp_netif_receive(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb) { esp_netif->lwip_input_fn(esp_netif->netif_handle, buffer, len, eb); diff --git a/components/esp_netif/lwip/esp_netif_lwip_internal.h b/components/esp_netif/lwip/esp_netif_lwip_internal.h index fd802b0e29..853b0629e8 100644 --- a/components/esp_netif/lwip/esp_netif_lwip_internal.h +++ b/components/esp_netif/lwip/esp_netif_lwip_internal.h @@ -81,7 +81,6 @@ struct esp_netif_obj { // io driver related void* driver_handle; esp_err_t (*driver_transmit)(void *h, void *buffer, size_t len); - esp_err_t (*driver_transmit_wrap)(void *h, void *buffer, size_t len, void *pbuf); void (*driver_free_rx_buffer)(void *h, void* buffer); // dhcp related diff --git a/components/esp_wifi/Kconfig b/components/esp_wifi/Kconfig index 868c4058f3..53713db11b 100644 --- a/components/esp_wifi/Kconfig +++ b/components/esp_wifi/Kconfig @@ -90,19 +90,6 @@ menu "Wi-Fi" 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 (ESP32_SPIRAM_SUPPORT || ESP32S2_SPIRAM_SUPPORT) - 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 @@ -152,7 +139,8 @@ menu "Wi-Fi" config ESP32_WIFI_RX_BA_WIN int "WiFi AMPDU RX BA window size" depends on ESP32_WIFI_AMPDU_RX_ENABLED - range 2 32 + range 2 32 if !SPIRAM_TRY_ALLOCATE_WIFI_LWIP + range 16 32 if SPIRAM_TRY_ALLOCATE_WIFI_LWIP default 6 if !SPIRAM_TRY_ALLOCATE_WIFI_LWIP default 16 if SPIRAM_TRY_ALLOCATE_WIFI_LWIP help diff --git a/components/esp_wifi/include/esp_private/wifi.h b/components/esp_wifi/include/esp_private/wifi.h index 6a26dc5e81..15f30eee09 100644 --- a/components/esp_wifi/include/esp_private/wifi.h +++ b/components/esp_wifi/include/esp_private/wifi.h @@ -120,6 +120,15 @@ esp_err_t esp_wifi_init_internal(const wifi_init_config_t *config); */ esp_err_t esp_wifi_deinit_internal(void); +/** + * @brief get whether the wifi driver is allowed to transmit data or not + * + * @return + * - true : upper layer should stop to transmit data to wifi driver + * - false : upper layer can transmit data to wifi driver + */ +bool esp_wifi_internal_tx_is_stop(void); + /** * @brief free the rx buffer which allocated by wifi driver * @@ -130,79 +139,18 @@ void esp_wifi_internal_free_rx_buffer(void* buffer); /** * @brief transmit the buffer via wifi driver * - * This API makes a copy of the input buffer and then forwards the buffer - * copy to WiFi driver. - * * @param wifi_interface_t wifi_if : wifi interface id * @param void *buffer : the buffer to be tansmit * @param uint16_t len : the length of buffer * * @return - * - ESP_OK : Successfully transmit the buffer to wifi driver - * - ESP_ERR_NO_MEM: out of memory - * - ESP_ERR_WIFI_ARG: invalid argument - * - ESP_ERR_WIFI_IF : WiFi interface is invalid - * - ESP_ERR_WIFI_CONN : WiFi interface is not created, e.g. send the data to STA while WiFi mode is AP mode - * - ESP_ERR_WIFI_NOT_STARTED : WiFi is not started - * - ESP_ERR_WIFI_STATE : WiFi internal state is not ready, e.g. WiFi is not started - * - ESP_ERR_WIFI_NOT_ASSOC : WiFi is not associated - * - ESP_ERR_WIFI_TX_DISALLOW : WiFi TX is disallowed, e.g. WiFi hasn't pass the authentication - * - ESP_ERR_WIFI_POST : caller fails to post event to WiFi task + * - ERR_OK : Successfully transmit the buffer to wifi driver + * - ERR_MEM : Out of memory + * - ERR_IF : WiFi driver error + * - ERR_ARG : Invalid argument */ int esp_wifi_internal_tx(wifi_interface_t wifi_if, void *buffer, uint16_t len); -/** - * @brief The net stack buffer reference counter callback function - * - */ -typedef void (*wifi_netstack_buf_ref_cb_t)(void *netstack_buf); - -/** - * @brief The net stack buffer free callback function - * - */ -typedef void (*wifi_netstack_buf_free_cb_t)(void *netstack_buf); - -/** - * @brief transmit the buffer by reference via wifi driver - * - * This API firstly increases the reference counter of the input buffer and - * then forwards the buffer to WiFi driver. The WiFi driver will free the buffer - * after processing it. Use esp_wifi_internal_tx() if the uplayer buffer doesn't - * supports reference counter. - * - * @param wifi_if : wifi interface id - * @param buffer : the buffer to be tansmit - * @param len : the length of buffer - * @param netstack_buf : the netstack buffer related to bufffer - * - * @return - * - ESP_OK : Successfully transmit the buffer to wifi driver - * - ESP_ERR_NO_MEM: out of memory - * - ESP_ERR_WIFI_ARG: invalid argument - * - ESP_ERR_WIFI_IF : WiFi interface is invalid - * - ESP_ERR_WIFI_CONN : WiFi interface is not created, e.g. send the data to STA while WiFi mode is AP mode - * - ESP_ERR_WIFI_NOT_STARTED : WiFi is not started - * - ESP_ERR_WIFI_STATE : WiFi internal state is not ready, e.g. WiFi is not started - * - ESP_ERR_WIFI_NOT_ASSOC : WiFi is not associated - * - ESP_ERR_WIFI_TX_DISALLOW : WiFi TX is disallowed, e.g. WiFi hasn't pass the authentication - * - ESP_ERR_WIFI_POST : caller fails to post event to WiFi task - */ -esp_err_t esp_wifi_internal_tx_by_ref(wifi_interface_t ifx, void *buffer, size_t len, void *netstack_buf); - -/** - * @brief register the net stack buffer reference increasing and free callback - * - * @param ref : net stack buffer reference callback - * @param free: net stack buffer free callback - * - * @return - * - ESP_OK : Successfully transmit the buffer to wifi driver - * - others : failed to register the callback - */ -esp_err_t esp_wifi_internal_reg_netstack_buf_cb(wifi_netstack_buf_ref_cb_t ref, wifi_netstack_buf_free_cb_t free); - - /** * @brief The WiFi RX callback function * diff --git a/components/esp_wifi/include/esp_wifi.h b/components/esp_wifi/include/esp_wifi.h index 00ec1b2424..eba2d14b8f 100644 --- a/components/esp_wifi/include/esp_wifi.h +++ b/components/esp_wifi/include/esp_wifi.h @@ -88,8 +88,6 @@ extern "C" { #define ESP_ERR_WIFI_POST (ESP_ERR_WIFI_BASE + 18) /*!< Failed to post the event to WiFi task */ #define ESP_ERR_WIFI_INIT_STATE (ESP_ERR_WIFI_BASE + 19) /*!< Invalod WiFi state when init/deinit is called */ #define ESP_ERR_WIFI_STOP_STATE (ESP_ERR_WIFI_BASE + 20) /*!< Returned when WiFi is stopping */ -#define ESP_ERR_WIFI_NOT_ASSOC (ESP_ERR_WIFI_BASE + 21) /*!< The WiFi connection is not associated */ -#define ESP_ERR_WIFI_TX_DISALLOW (ESP_ERR_WIFI_BASE + 22) /*!< The WiFi TX is disallowed */ /** * @brief WiFi stack configuration parameters passed to esp_wifi_init call. @@ -103,12 +101,12 @@ typedef struct { int tx_buf_type; /**< WiFi TX buffer type */ int static_tx_buf_num; /**< WiFi static TX buffer number */ int dynamic_tx_buf_num; /**< WiFi dynamic TX buffer number */ - int cache_tx_buf_num; /**< WiFi TX cache buffer number */ int csi_enable; /**< WiFi channel state information enable flag */ int ampdu_rx_enable; /**< WiFi AMPDU RX feature enable flag */ int ampdu_tx_enable; /**< WiFi AMPDU TX feature enable flag */ int nvs_enable; /**< WiFi NVS flash enable flag */ int nano_enable; /**< Nano option for printf/scan family enable flag */ + int tx_ba_win; /**< WiFi Block Ack TX window size */ int rx_ba_win; /**< WiFi Block Ack RX window size */ int wifi_task_core_id; /**< WiFi Task Core ID */ int beacon_max_len; /**< WiFi softAP maximum length of the beacon */ @@ -123,12 +121,6 @@ typedef struct { #define WIFI_STATIC_TX_BUFFER_NUM 0 #endif -#if (CONFIG_ESP32_SPIRAM_SUPPORT | CONFIG_ESP32S2_SPIRAM_SUPPORT) -#define WIFI_CACHE_TX_BUFFER_NUM CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM -#else -#define WIFI_CACHE_TX_BUFFER_NUM 0 -#endif - #ifdef CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM #define WIFI_DYNAMIC_TX_BUFFER_NUM CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM #else @@ -170,6 +162,12 @@ extern uint64_t g_wifi_feature_caps; #define WIFI_INIT_CONFIG_MAGIC 0x1F2F3F4F +#ifdef CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED +#define WIFI_DEFAULT_TX_BA_WIN CONFIG_ESP32_WIFI_TX_BA_WIN +#else +#define WIFI_DEFAULT_TX_BA_WIN 0 /* unused if ampdu_tx_enable == false */ +#endif + #ifdef CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED #define WIFI_DEFAULT_RX_BA_WIN CONFIG_ESP32_WIFI_RX_BA_WIN #else @@ -195,7 +193,6 @@ extern uint64_t g_wifi_feature_caps; #endif #define CONFIG_FEATURE_WPA3_SAE_BIT (1<<0) -#define CONFIG_FEATURE_CACHE_TX_BUF_BIT (1<<1) #define WIFI_INIT_CONFIG_DEFAULT() { \ .event_handler = &esp_event_send_internal, \ @@ -206,12 +203,12 @@ extern uint64_t g_wifi_feature_caps; .tx_buf_type = CONFIG_ESP32_WIFI_TX_BUFFER_TYPE,\ .static_tx_buf_num = WIFI_STATIC_TX_BUFFER_NUM,\ .dynamic_tx_buf_num = WIFI_DYNAMIC_TX_BUFFER_NUM,\ - .cache_tx_buf_num = WIFI_CACHE_TX_BUFFER_NUM,\ .csi_enable = WIFI_CSI_ENABLED,\ .ampdu_rx_enable = WIFI_AMPDU_RX_ENABLED,\ .ampdu_tx_enable = WIFI_AMPDU_TX_ENABLED,\ .nvs_enable = WIFI_NVS_ENABLED,\ .nano_enable = WIFI_NANO_FORMAT_ENABLED,\ + .tx_ba_win = WIFI_DEFAULT_TX_BA_WIN,\ .rx_ba_win = WIFI_DEFAULT_RX_BA_WIN,\ .wifi_task_core_id = WIFI_TASK_CORE_ID,\ .beacon_max_len = WIFI_SOFTAP_BEACON_MAX_LEN, \ diff --git a/components/esp_wifi/lib b/components/esp_wifi/lib index 3df01f9884..f8d36f1a74 160000 --- a/components/esp_wifi/lib +++ b/components/esp_wifi/lib @@ -1 +1 @@ -Subproject commit 3df01f9884c73a440a069eb4b5d04069282d8e30 +Subproject commit f8d36f1a74e0646d74e5f5a738722aa262fae396 diff --git a/components/esp_wifi/src/wifi_default.c b/components/esp_wifi/src/wifi_default.c index d060b5100a..a42b7d056a 100644 --- a/components/esp_wifi/src/wifi_default.c +++ b/components/esp_wifi/src/wifi_default.c @@ -58,10 +58,6 @@ static void wifi_start(void *esp_netif, esp_event_base_t base, int32_t event_id, } } - if ((ret = esp_wifi_internal_reg_netstack_buf_cb(esp_netif_netstack_buf_ref, esp_netif_netstack_buf_free)) != ESP_OK) { - ESP_LOGE(TAG, "netstack cb reg failed with %d", ret); - return; - } esp_netif_set_mac(esp_netif, mac); esp_netif_action_start(esp_netif, base, event_id, data); } diff --git a/components/esp_wifi/src/wifi_init.c b/components/esp_wifi/src/wifi_init.c index 80ceabe5c6..cef5e2ae8d 100644 --- a/components/esp_wifi/src/wifi_init.c +++ b/components/esp_wifi/src/wifi_init.c @@ -47,9 +47,6 @@ uint64_t g_wifi_feature_caps = #if CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE CONFIG_FEATURE_WPA3_SAE_BIT | #endif -#if (CONFIG_ESP32_SPIRAM_SUPPORT | CONFIG_ESP32S2_SPIRAM_SUPPORT) - CONFIG_FEATURE_CACHE_TX_BUF_BIT | -#endif 0; static const char* TAG = "wifi_init"; diff --git a/components/esp_wifi/src/wifi_netif.c b/components/esp_wifi/src/wifi_netif.c index 168b1a0c49..ab2216cc30 100644 --- a/components/esp_wifi/src/wifi_netif.c +++ b/components/esp_wifi/src/wifi_netif.c @@ -63,16 +63,6 @@ static esp_err_t wifi_transmit(void *h, void *buffer, size_t len) return esp_wifi_internal_tx(driver->wifi_if, buffer, len); } -static esp_err_t wifi_transmit_wrap(void *h, void *buffer, size_t len, void *netstack_buf) -{ - wifi_netif_driver_t driver = h; -#if (CONFIG_ESP32_SPIRAM_SUPPORT | CONFIG_ESP32S2_SPIRAM_SUPPORT) - return esp_wifi_internal_tx_by_ref(driver->wifi_if, buffer, len, netstack_buf); -#else - return esp_wifi_internal_tx(driver->wifi_if, buffer, len); -#endif -} - static esp_err_t wifi_driver_start(esp_netif_t * esp_netif, void * args) { wifi_netif_driver_t driver = args; @@ -80,7 +70,6 @@ static esp_err_t wifi_driver_start(esp_netif_t * esp_netif, void * args) esp_netif_driver_ifconfig_t driver_ifconfig = { .handle = driver, .transmit = wifi_transmit, - .transmit_wrap= wifi_transmit_wrap, .driver_free_rx_buffer = wifi_free }; diff --git a/components/lwip/port/esp32/netif/wlanif.c b/components/lwip/port/esp32/netif/wlanif.c index 22f296e2a9..f4c5707590 100644 --- a/components/lwip/port/esp32/netif/wlanif.c +++ b/components/lwip/port/esp32/netif/wlanif.c @@ -129,10 +129,10 @@ low_level_output(struct netif *netif, struct pbuf *p) } struct pbuf *q = p; - esp_err_t ret; + err_t ret; if(q->next == NULL) { - ret = esp_netif_transmit_wrap(esp_netif, q->payload, q->len, q); + ret = esp_netif_transmit(esp_netif, q->payload, q->len); } else { LWIP_DEBUGF(PBUF_DEBUG, ("low_level_output: pbuf is a list, application may has bug")); @@ -143,20 +143,12 @@ low_level_output(struct netif *netif, struct pbuf *p) } else { return ERR_MEM; } - ret = esp_netif_transmit_wrap(esp_netif, q->payload, q->len, q); + ret = esp_netif_transmit(esp_netif, q->payload, q->len); pbuf_free(q); } - if (ret == ESP_OK) { - return ERR_OK; - } else if (ret == ESP_ERR_NO_MEM) { - return ERR_MEM; - } else if (ret == ESP_ERR_INVALID_ARG) { - return ERR_ARG; - } else { - return ERR_IF; - } + return ret; } /**