feat(esp_netif): Allow traffic reporting runtime enable/disable

This commit is contained in:
Abhik Roy
2024-04-06 01:18:06 +11:00
parent 5debb23da9
commit ad9787bb4d
6 changed files with 160 additions and 25 deletions

View File

@ -9,7 +9,7 @@ menu "ESP NETIF Adapter"
The IP address may be lost because of some reasons, e.g. when the station disconnects The IP address may be lost because of some reasons, e.g. when the station disconnects
from soft-AP, or when DHCP IP renew fails etc. If the IP lost timer is enabled, it will from soft-AP, or when DHCP IP renew fails etc. If the IP lost timer is enabled, it will
be started everytime the IP is lost. Event SYSTEM_EVENT_STA_LOST_IP will be raised if be started every time the IP is lost. Event SYSTEM_EVENT_STA_LOST_IP will be raised if
the timer expires. The IP lost timer is stopped if the station get the IP again before the timer expires. The IP lost timer is stopped if the station get the IP again before
the timer expires. the timer expires.
@ -38,7 +38,7 @@ menu "ESP NETIF Adapter"
config ESP_NETIF_REPORT_DATA_TRAFFIC config ESP_NETIF_REPORT_DATA_TRAFFIC
bool "Report data traffic via events" bool "Report data traffic via events"
default n default y
help help
Enable if esp_netif_transmit() and esp_netif_receive() should generate events. This can be useful Enable if esp_netif_transmit() and esp_netif_receive() should generate events. This can be useful
to blink data traffic indication lights. to blink data traffic indication lights.
@ -83,5 +83,5 @@ menu "ESP NETIF Adapter"
default n default n
help help
Enable LwIP IEEE 802.1D bridge support in ESP-NETIF. Note that "Number of clients store data in netif" Enable LwIP IEEE 802.1D bridge support in ESP-NETIF. Note that "Number of clients store data in netif"
(LWIP_NUM_NETIF_CLIENT_DATA) option needs to be properly configured to be LwIP bridge avaiable! (LWIP_NUM_NETIF_CLIENT_DATA) option needs to be properly configured to be LwIP bridge available!
endmenu endmenu

View File

@ -112,7 +112,7 @@ esp_err_t esp_netif_attach(esp_netif_t *esp_netif, esp_netif_iodriver_handle dri
* to TCP/IP stack. Similarly esp_netif_transmit is called from the TCP/IP stack whenever * to TCP/IP stack. Similarly esp_netif_transmit is called from the TCP/IP stack whenever
* a packet ought to output to the communication media. * a packet ought to output to the communication media.
* *
* @note These IO functions are registerd (installed) automatically for default interfaces * @note These IO functions are registered (installed) automatically for default interfaces
* (interfaces with the keys such as WIFI_STA_DEF, WIFI_AP_DEF, ETH_DEF). Custom interface * (interfaces with the keys such as WIFI_STA_DEF, WIFI_AP_DEF, ETH_DEF). Custom interface
* has to register these IO functions when creating interface using @ref esp_netif_new * has to register these IO functions when creating interface using @ref esp_netif_new
* *
@ -138,6 +138,33 @@ esp_err_t esp_netif_attach(esp_netif_t *esp_netif, esp_netif_iodriver_handle dri
*/ */
esp_err_t esp_netif_receive(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb); esp_err_t esp_netif_receive(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb);
/**
* @brief Enables transmit/receive event reporting for a network interface.
*
* These functions enables transmit and receive events reporting for a given esp-netif instance.
* Event reporting can be used to track data transfer activity and trigger application-specific actions.
*
* @param[in] esp_netif Handle to esp-netif instance
*
* @return
* - ESP_OK: Successfully enabled event reporting
* - ESP_FAIL: Event reporting not configured
*/
esp_err_t esp_netif_tx_rx_event_enable(esp_netif_t *esp_netif);
/**
* @brief Disables transmit/receive event reporting for a network interface.
*
* These functions disables transmit and receive events reporting for a given esp-netif instance.
*
* @param[in] esp_netif Handle to esp-netif instance
*
* @return
* - ESP_OK: Successfully disabled event reporting
* - ESP_FAIL: Event reporting not configured
*/
esp_err_t esp_netif_tx_rx_event_disable(esp_netif_t *esp_netif);
/** /**
* @} * @}
*/ */
@ -898,7 +925,7 @@ esp_err_t esp_netif_str_to_ip4(const char *src, esp_ip4_addr_t *dst);
/** /**
* @brief Converts Ascii internet IPv6 address into esp_ip4_addr_t * @brief Converts Ascii internet IPv6 address into esp_ip4_addr_t
* Zeros in the IP address can be stripped or completely ommited: "2001:db8:85a3:0:0:0:2:1" or "2001:db8::2:1") * Zeros in the IP address can be stripped or completely omitted: "2001:db8:85a3:0:0:0:2:1" or "2001:db8::2:1")
* *
* @param[in] src IPv6 address in ascii representation (e.g. ""2001:0db8:85a3:0000:0000:0000:0002:0001") * @param[in] src IPv6 address in ascii representation (e.g. ""2001:0db8:85a3:0000:0000:0000:0002:0001")
* @param[out] dst Address of the target esp_ip6_addr_t structure to receive converted address * @param[out] dst Address of the target esp_ip6_addr_t structure to receive converted address
@ -972,7 +999,7 @@ const char *esp_netif_get_desc(esp_netif_t *esp_netif);
* *
* @param[in] esp_netif Handle to esp-netif instance * @param[in] esp_netif Handle to esp-netif instance
* *
* @return Integer representing the instance's route-prio, or -1 if invalid paramters * @return Integer representing the instance's route-prio, or -1 if invalid parameters
*/ */
int esp_netif_get_route_prio(esp_netif_t *esp_netif); int esp_netif_get_route_prio(esp_netif_t *esp_netif);

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -37,7 +37,7 @@ extern "C" {
/** /**
* @brief Definition of ESP-NETIF bridge controll * @brief Definition of ESP-NETIF bridge control
*/ */
#define ESP_NETIF_BR_FLOOD -1 #define ESP_NETIF_BR_FLOOD -1
#define ESP_NETIF_BR_DROP 0 #define ESP_NETIF_BR_DROP 0
@ -101,10 +101,7 @@ typedef enum {
IP_EVENT_ETH_LOST_IP, /*!< ethernet lost IP and the IP is reset to 0 */ IP_EVENT_ETH_LOST_IP, /*!< ethernet lost IP and the IP is reset to 0 */
IP_EVENT_PPP_GOT_IP, /*!< PPP interface got IP */ IP_EVENT_PPP_GOT_IP, /*!< PPP interface got IP */
IP_EVENT_PPP_LOST_IP, /*!< PPP interface lost IP */ IP_EVENT_PPP_LOST_IP, /*!< PPP interface lost IP */
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC IP_EVENT_TX_RX, /*!< transmitting/receiving data packet */
IP_EVENT_TRANSMIT, /*!< transmitting data */
IP_EVENT_RECEIVE, /*!< receiving data */
#endif
} ip_event_t; } ip_event_t;
/** @brief IP event base declaration */ /** @brief IP event base declaration */
@ -131,7 +128,7 @@ typedef struct {
*/ */
typedef struct { typedef struct {
esp_netif_t *esp_netif; /*!< Pointer to corresponding esp-netif object */ esp_netif_t *esp_netif; /*!< Pointer to corresponding esp-netif object */
esp_netif_ip_info_t ip_info; /*!< IP address, netmask, gatway IP address */ esp_netif_ip_info_t ip_info; /*!< IP address, netmask, gateway IP address */
bool ip_changed; /*!< Whether the assigned IP has changed or not */ bool ip_changed; /*!< Whether the assigned IP has changed or not */
} ip_event_got_ip_t; } ip_event_got_ip_t;
@ -155,12 +152,18 @@ typedef struct {
uint8_t mac[6]; /*!< MAC address of the connected client */ uint8_t mac[6]; /*!< MAC address of the connected client */
} ip_event_ap_staipassigned_t; } ip_event_ap_staipassigned_t;
typedef enum {
ESP_NETIF_TX = 0, // Data is being transmitted.
ESP_NETIF_RX = 1, // Data is being received.
} esp_netif_tx_rx_direction_t;
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC #ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
/** Event structure for IP_EVENT_TRANSMIT and IP_EVENT_RECEIVE */ /** Event structure for IP_EVENT_TRANSMIT and IP_EVENT_RECEIVE */
typedef struct { typedef struct {
esp_netif_t *esp_netif; /*!< Pointer to the associated netif handle */ esp_netif_t *esp_netif; /*!< Pointer to the associated netif handle */
size_t len; /*!< Length of the data */ size_t len; /*!< Length of the data */
} ip_event_transmit_receive_t; esp_netif_tx_rx_direction_t dir; /*!< Directions for data transfer >*/
} ip_event_tx_rx_t;
#endif #endif
typedef enum esp_netif_flags { typedef enum esp_netif_flags {

View File

@ -1240,31 +1240,81 @@ void esp_netif_free_rx_buffer(void *h, void* buffer)
esp_netif->driver_free_rx_buffer(esp_netif->driver_handle, buffer); esp_netif->driver_free_rx_buffer(esp_netif->driver_handle, buffer);
} }
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
static esp_err_t esp_netif_tx_rx_event_api(esp_netif_api_msg_t *msg)
{
bool enable = (bool)msg->data;
esp_netif_t *esp_netif = msg->esp_netif;
if (esp_netif == NULL) {
ESP_LOGE(TAG, "Invalid esp_netif");
}
ESP_LOGD(TAG, "%s esp_netif:%p", __func__, esp_netif);
esp_netif->tx_rx_events_enabled = enable;
return ESP_OK;
}
#endif
esp_err_t esp_netif_tx_rx_event_enable(esp_netif_t *esp_netif)
{
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
return esp_netif_lwip_ipc_call(esp_netif_tx_rx_event_api, esp_netif, (void*)true /* Enable */);
#else
return ESP_FAIL;
#endif
}
esp_err_t esp_netif_tx_rx_event_disable(esp_netif_t *esp_netif)
{
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
return esp_netif_lwip_ipc_call(esp_netif_tx_rx_event_api, esp_netif, (void*)false /* Disable */);
#else
return ESP_FAIL;
#endif
}
esp_err_t esp_netif_transmit(esp_netif_t *esp_netif, void* data, size_t len) esp_err_t esp_netif_transmit(esp_netif_t *esp_netif, void* data, size_t len)
{ {
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC #ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
ip_event_transmit_receive_t evt = { if (unlikely(esp_netif->tx_rx_events_enabled)) {
.esp_netif = esp_netif, ip_event_tx_rx_t evt = {
.len = len, .esp_netif = esp_netif,
}; .len = len,
esp_event_post(IP_EVENT, IP_EVENT_TRANSMIT, &evt, sizeof(evt), 0); .dir = ESP_NETIF_TX,
};
esp_event_post(IP_EVENT, IP_EVENT_TX_RX, &evt, sizeof(evt), 0);
}
#endif #endif
return (esp_netif->driver_transmit)(esp_netif->driver_handle, data, 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) esp_err_t esp_netif_transmit_wrap(esp_netif_t *esp_netif, void *data, size_t len, void *pbuf)
{ {
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
if (unlikely(esp_netif->tx_rx_events_enabled)) {
ip_event_tx_rx_t evt = {
.esp_netif = esp_netif,
.len = len,
.dir = ESP_NETIF_TX,
};
esp_event_post(IP_EVENT, IP_EVENT_TX_RX, &evt, sizeof(evt), 0);
}
#endif
return (esp_netif->driver_transmit_wrap)(esp_netif->driver_handle, data, len, 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_err_t esp_netif_receive(esp_netif_t *esp_netif, void *buffer, size_t len, void *eb)
{ {
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC #ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
ip_event_transmit_receive_t evt = { if (unlikely(esp_netif->tx_rx_events_enabled)) {
.esp_netif = esp_netif, ip_event_tx_rx_t evt = {
.len = len, .esp_netif = esp_netif,
}; .len = len,
esp_event_post(IP_EVENT, IP_EVENT_RECEIVE, &evt, sizeof(evt), 0); .dir = ESP_NETIF_RX,
};
esp_event_post(IP_EVENT, IP_EVENT_TX_RX, &evt, sizeof(evt), 0);
}
#endif #endif
#ifdef CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS #ifdef CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS
return esp_netif->lwip_input_fn(esp_netif->netif_handle, buffer, len, eb); return esp_netif->lwip_input_fn(esp_netif->netif_handle, buffer, len, eb);

View File

@ -98,6 +98,9 @@ struct esp_netif_obj {
// event translation // event translation
ip_event_t get_ip_event; ip_event_t get_ip_event;
ip_event_t lost_ip_event; ip_event_t lost_ip_event;
#ifdef CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC
bool tx_rx_events_enabled;
#endif
// misc flags, types, keys, priority // misc flags, types, keys, priority
esp_netif_flags_t flags; esp_netif_flags_t flags;

View File

@ -373,6 +373,58 @@ For more specific cases, please consult this guide: :doc:`/api-reference/network
* When using Wi-Fi in ``AP+STA`` mode, both these interfaces have to be created. * When using Wi-Fi in ``AP+STA`` mode, both these interfaces have to be created.
IP Event: Transmit/Receive Packet
---------------------------------
This event, ``IP_EVENT_TX_RX``, is triggered for every transmitted or received IP packet. It provides information about packet transmission or reception, data length, and the ``esp_netif`` handle.
Enabling the Event
------------------
**Compile Time:**
The feature can be completely disabled during compilation time using the flag :ref:`CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC` in the kconfig.
**Run Time:**
At runtime, you can enable or disable this event using the functions :cpp:func:`esp_netif_tx_rx_event_enable()` and :cpp:func:`esp_netif_tx_rx_event_disable()`.
Event Registration
------------------
To handle this event, you need to register a handler using the following syntax:
.. code-block:: c
static void
tx_rx_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{
ip_event_tx_rx_t *event = (ip_event_tx_rx_t *)event_data;
if (event->dir == ESP_NETIF_TX) {
ESP_LOGI(TAG, "Got TX event: Interface \"%s\" data len: %d", esp_netif_get_desc(event->esp_netif), event->len);
} else if (event->dir == ESP_NETIF_RX) {
ESP_LOGI(TAG, "Got RX event: Interface \"%s\" data len: %d", esp_netif_get_desc(event->esp_netif), event->len);
} else {
ESP_LOGI(TAG, "Got Unknown event: Interface \"%s\"", esp_netif_get_desc(event->esp_netif));
}
}
esp_event_handler_register(IP_EVENT, IP_EVENT_TX_RX, &tx_rx_event_handler, NULL);
Here, ``tx_rx_event_handler`` is the name of the function that will handle the event.
Event Data Structure
---------------------
The event data structure, :cpp:class:`ip_event_tx_rx_t`, contains the following fields:
- :cpp:member:`ip_event_tx_rx_t::dir`: Indicates whether the packet was transmitted (``ESP_NETIF_TX``) or received (``ESP_NETIF_RX``).
- :cpp:member:`ip_event_tx_rx_t::len`: Length of the data frame.
- :cpp:member:`ip_event_tx_rx_t::esp_netif`: The network interface on which the packet was sent or received.
API Reference API Reference
------------- -------------