Skip to content

Commit 6adcb90

Browse files
committed
feat(eppp): Support for channeling WiFi data
fix(eppp): Make host-side networking configurable test(eppp): Check host side networking in CI fix(examples): Use local wrmt_over_eppp fix(test): Update the pytest for check for universal msg
1 parent 5d307cc commit 6adcb90

File tree

13 files changed

+506
-16
lines changed

13 files changed

+506
-16
lines changed

components/esp_wifi_remote/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ if(CONFIG_ESP_WIFI_REMOTE_LIBRARY_HOSTED)
4141
endif()
4242
endif()
4343

44+
if(CONFIG_ESP_WIFI_ENABLED OR CONFIG_ESP_HOST_WIFI_ENABLED)
45+
list(APPEND wifi_sources "esp_wifi_remote_net2.c")
46+
endif()
4447

4548
target_include_directories(${COMPONENT_LIB} PUBLIC ${IDF_VER_DIR}/include)
4649
target_sources(${COMPONENT_LIB} PRIVATE ${src_wifi_remote_weak}
@@ -56,6 +59,7 @@ endif()
5659

5760
target_link_libraries(${wifi} PUBLIC ${COMPONENT_LIB})
5861

62+
5963
if(CONFIG_ESP_WIFI_REMOTE_EAP_ENABLED)
6064
idf_component_optional_requires(PRIVATE wpa_supplicant)
6165
endif()
Lines changed: 378 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,378 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
#include "sdkconfig.h"
7+
#include "esp_system.h"
8+
#include "esp_wifi.h"
9+
#include "esp_netif.h"
10+
#include "esp_log.h"
11+
#include "esp_check.h"
12+
#include "esp_wifi_netif.h"
13+
#include <string.h>
14+
#include "esp_wifi_remote.h"
15+
16+
#define CHANNELS 2
17+
#define WEAK __attribute__((weak))
18+
19+
/**
20+
* This is a simplified driver, since we support only STA and AP interfaces
21+
* no need to implement the driver, only assure that the handle is not NULL
22+
*/
23+
#define WIFI_REMOTE_DRIVER_HANDLE ((void*)1)
24+
25+
typedef esp_err_t (*wifi_rxcb_t)(void *buffer, uint16_t len, void *eb);
26+
27+
static bool wifi_default_handlers_set = false;
28+
static esp_netif_t *s_wifi_netifs[MAX_WIFI_IFS] = { NULL };
29+
static esp_remote_channel_tx_fn_t s_tx_cb[CHANNELS];
30+
static esp_remote_channel_t s_channel[CHANNELS];
31+
static wifi_rxcb_t s_rx_fn[CHANNELS];
32+
static const char* TAG = "wifi_remote_default_netif";
33+
34+
WEAK esp_err_t internal_set_sta_ip(void)
35+
{
36+
// TODO: Pass this information to the slave target
37+
// Note that this function is called from the default event loop, so we shouldn't block here
38+
return ESP_OK;
39+
}
40+
41+
WEAK esp_err_t esp_wifi_remote_channel_rx(void *h, void *buffer, void *buff_to_free, size_t len)
42+
{
43+
assert(h);
44+
if (h == s_channel[0] && s_rx_fn[0]) {
45+
return s_rx_fn[0](buffer, len, buff_to_free);
46+
}
47+
if (h == s_channel[1] && s_rx_fn[1]) {
48+
return s_rx_fn[1](buffer, len, buff_to_free);
49+
}
50+
return ESP_FAIL;
51+
}
52+
53+
WEAK esp_err_t esp_wifi_remote_channel_set(wifi_interface_t ifx, void *h, esp_remote_channel_tx_fn_t tx_cb)
54+
{
55+
if (ifx == WIFI_IF_STA) {
56+
s_channel[0] = h;
57+
s_tx_cb[0] = tx_cb;
58+
return ESP_OK;
59+
}
60+
if (ifx == WIFI_IF_AP) {
61+
s_channel[1] = h;
62+
s_tx_cb[1] = tx_cb;
63+
return ESP_OK;
64+
}
65+
return ESP_FAIL;
66+
}
67+
68+
69+
__attribute__((always_inline)) static inline int internal_tx(wifi_interface_t ifx, void *buffer, uint16_t len)
70+
{
71+
if (ifx == WIFI_IF_STA && s_tx_cb[0]) {
72+
/* TODO: If not needed, remove arg3 */
73+
return s_tx_cb[0](s_channel[0], buffer, len);
74+
}
75+
if (ifx == WIFI_IF_AP && s_tx_cb[1]) {
76+
return s_tx_cb[1](s_channel[1], buffer, len);
77+
}
78+
79+
return -1;
80+
}
81+
82+
#define IMPLEMENT_WIFI_TRANSMIT(name, interface) static esp_err_t name(void *h, void *buffer, size_t len) \
83+
{ return internal_tx(interface, buffer, len); }
84+
#define IMPLEMENT_WIFI_TRANSMIT_WRAP(name, interface) static esp_err_t name(void *h, void *buffer, size_t len, void *netbuf) \
85+
{ return internal_tx(interface, buffer, len); }
86+
87+
IMPLEMENT_WIFI_TRANSMIT(transmit_sta, WIFI_IF_STA)
88+
IMPLEMENT_WIFI_TRANSMIT(transmit_ap, WIFI_IF_AP)
89+
IMPLEMENT_WIFI_TRANSMIT_WRAP(transmit_wrap_sta, WIFI_IF_STA)
90+
IMPLEMENT_WIFI_TRANSMIT_WRAP(transmit_wrap_ap, WIFI_IF_AP)
91+
92+
93+
static void wifi_free(void *h, void* buffer)
94+
{
95+
// remote wifi, no need to free the buffer
96+
}
97+
98+
static esp_err_t receive_sta(void *buffer, uint16_t len, void *eb)
99+
{
100+
return esp_netif_receive(s_wifi_netifs[WIFI_IF_STA], buffer, len, eb);
101+
}
102+
103+
static esp_err_t receive_ap(void *buffer, uint16_t len, void *eb)
104+
{
105+
return esp_netif_receive(s_wifi_netifs[WIFI_IF_AP], buffer, len, eb);
106+
}
107+
108+
/**
109+
* @brief Wifi start action when station or AP get started
110+
*/
111+
static void wifi_start(wifi_interface_t ifx, esp_event_base_t base, int32_t event_id, void *data)
112+
{
113+
uint8_t mac[6];
114+
esp_err_t ret;
115+
116+
if ((ret = esp_wifi_remote_get_mac(ifx, mac)) != ESP_OK) {
117+
ESP_LOGE(TAG, "esp_wifi_get_mac failed with %d", ret);
118+
return;
119+
}
120+
ESP_LOGI(TAG, "WIFI mac address: %x %x %x %x %x %x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
121+
122+
if (ifx == WIFI_IF_AP) {
123+
s_rx_fn[1] = receive_ap;
124+
}
125+
esp_netif_set_mac(s_wifi_netifs[ifx], mac);
126+
esp_netif_action_start(s_wifi_netifs[ifx], base, event_id, data);
127+
}
128+
129+
/**
130+
* @brief Wifi default handlers for specific events for station and APs
131+
*/
132+
static void wifi_default_action_sta_start(void *arg, esp_event_base_t base, int32_t event_id, void *data)
133+
{
134+
if (s_wifi_netifs[WIFI_IF_STA] != NULL) {
135+
wifi_start(WIFI_IF_STA, base, event_id, data);
136+
}
137+
}
138+
139+
static void wifi_default_action_sta_stop(void *arg, esp_event_base_t base, int32_t event_id, void *data)
140+
{
141+
if (s_wifi_netifs[WIFI_IF_STA] != NULL) {
142+
esp_netif_action_stop(s_wifi_netifs[WIFI_IF_STA], base, event_id, data);
143+
}
144+
}
145+
146+
static void wifi_default_action_sta_connected(void *arg, esp_event_base_t base, int32_t event_id, void *data)
147+
{
148+
if (s_wifi_netifs[WIFI_IF_STA] != NULL) {
149+
s_rx_fn[0] = receive_sta;
150+
esp_netif_action_connected(s_wifi_netifs[WIFI_IF_STA], base, event_id, data);
151+
}
152+
}
153+
154+
static void wifi_default_action_sta_disconnected(void *arg, esp_event_base_t base, int32_t event_id, void *data)
155+
{
156+
if (s_wifi_netifs[WIFI_IF_STA] != NULL) {
157+
esp_netif_action_disconnected(s_wifi_netifs[WIFI_IF_STA], base, event_id, data);
158+
}
159+
}
160+
161+
#ifdef CONFIG_WIFI_RMT_SOFTAP_SUPPORT
162+
static void wifi_default_action_ap_start(void *arg, esp_event_base_t base, int32_t event_id, void *data)
163+
{
164+
if (s_wifi_netifs[WIFI_IF_AP] != NULL) {
165+
wifi_start(WIFI_IF_AP, base, event_id, data);
166+
}
167+
}
168+
169+
static void wifi_default_action_ap_stop(void *arg, esp_event_base_t base, int32_t event_id, void *data)
170+
{
171+
if (s_wifi_netifs[WIFI_IF_AP] != NULL) {
172+
esp_netif_action_stop(s_wifi_netifs[WIFI_IF_AP], base, event_id, data);
173+
}
174+
}
175+
#endif
176+
177+
static void wifi_default_action_sta_got_ip(void *arg, esp_event_base_t base, int32_t event_id, void *data)
178+
{
179+
if (s_wifi_netifs[WIFI_IF_STA] != NULL) {
180+
ESP_LOGD(TAG, "Got IP wifi default handler entered");
181+
int ret = internal_set_sta_ip();
182+
if (ret != ESP_OK) {
183+
ESP_LOGI(TAG, "esp_wifi_internal_set_sta_ip failed with %d", ret);
184+
}
185+
esp_netif_action_got_ip(s_wifi_netifs[WIFI_IF_STA], base, event_id, data);
186+
}
187+
}
188+
/**
189+
* @brief Clear default handlers
190+
*/
191+
static esp_err_t clear_default_wifi_handlers(void)
192+
{
193+
esp_event_handler_unregister(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_START, wifi_default_action_sta_start);
194+
esp_event_handler_unregister(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_STOP, wifi_default_action_sta_stop);
195+
esp_event_handler_unregister(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_CONNECTED, wifi_default_action_sta_connected);
196+
esp_event_handler_unregister(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_DISCONNECTED, wifi_default_action_sta_disconnected);
197+
#ifdef CONFIG_WIFI_RMT_SOFTAP_SUPPORT
198+
esp_event_handler_unregister(WIFI_REMOTE_EVENT, WIFI_EVENT_AP_START, wifi_default_action_ap_start);
199+
esp_event_handler_unregister(WIFI_REMOTE_EVENT, WIFI_EVENT_AP_STOP, wifi_default_action_ap_stop);
200+
#endif
201+
esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_default_action_sta_got_ip);
202+
esp_unregister_shutdown_handler((shutdown_handler_t)esp_wifi_stop);
203+
wifi_default_handlers_set = false;
204+
return ESP_OK;
205+
}
206+
/**
207+
* @brief Set default handlers
208+
*/
209+
static esp_err_t set_default_wifi_handlers(void)
210+
{
211+
esp_err_t ret = ESP_OK;
212+
if (wifi_default_handlers_set) {
213+
return ret;
214+
}
215+
ESP_GOTO_ON_ERROR(esp_event_handler_register(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_START, wifi_default_action_sta_start, NULL),
216+
err, TAG, "Failed to register WiFi event");
217+
ESP_GOTO_ON_ERROR(esp_event_handler_register(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_STOP, wifi_default_action_sta_stop, NULL),
218+
err, TAG, "Failed to register WiFi event");
219+
ESP_GOTO_ON_ERROR(esp_event_handler_register(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_CONNECTED, wifi_default_action_sta_connected, NULL),
220+
err, TAG, "Failed to register WiFi event");
221+
ESP_GOTO_ON_ERROR(esp_event_handler_register(WIFI_REMOTE_EVENT, WIFI_EVENT_STA_DISCONNECTED, wifi_default_action_sta_disconnected, NULL),
222+
err, TAG, "Failed to register WiFi event");
223+
#ifdef CONFIG_WIFI_RMT_SOFTAP_SUPPORT
224+
ESP_GOTO_ON_ERROR(esp_event_handler_register(WIFI_REMOTE_EVENT, WIFI_EVENT_AP_START, wifi_default_action_ap_start, NULL),
225+
err, TAG, "Failed to register WiFi event");
226+
ESP_GOTO_ON_ERROR(esp_event_handler_register(WIFI_REMOTE_EVENT, WIFI_EVENT_AP_STOP, wifi_default_action_ap_stop, NULL),
227+
err, TAG, "Failed to register WiFi event");
228+
#endif
229+
ESP_GOTO_ON_ERROR(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_default_action_sta_got_ip, NULL),
230+
err, TAG, "Failed to register IP event");
231+
ret = esp_register_shutdown_handler((shutdown_handler_t)esp_wifi_stop);
232+
ESP_GOTO_ON_FALSE(ret == ESP_OK || ret == ESP_ERR_INVALID_STATE, ESP_FAIL, err, TAG, "Failed to register WiFi event");
233+
wifi_default_handlers_set = true;
234+
return ESP_OK;
235+
236+
err:
237+
clear_default_wifi_handlers();
238+
return ret;
239+
}
240+
241+
/**
242+
* @brief User init custom wifi interface
243+
*/
244+
esp_netif_t* esp_netif_create_wifi_remote(wifi_interface_t wifi_if, const esp_netif_inherent_config_t *esp_netif_config)
245+
{
246+
esp_netif_driver_ifconfig_t driver_ifconfig = {
247+
.handle = WIFI_REMOTE_DRIVER_HANDLE,
248+
.driver_free_rx_buffer = wifi_free
249+
};
250+
esp_netif_config_t cfg = {
251+
.base = esp_netif_config,
252+
.driver = &driver_ifconfig
253+
};
254+
if (wifi_if == WIFI_IF_STA) {
255+
cfg.stack = _g_esp_netif_netstack_default_wifi_sta;
256+
driver_ifconfig.transmit = transmit_sta;
257+
driver_ifconfig.transmit_wrap = transmit_wrap_sta;
258+
} else if (wifi_if == WIFI_IF_AP) {
259+
cfg.stack = _g_esp_netif_netstack_default_wifi_ap;
260+
driver_ifconfig.transmit = transmit_ap;
261+
driver_ifconfig.transmit_wrap = transmit_wrap_ap;
262+
} else {
263+
return NULL;
264+
}
265+
266+
esp_netif_t *netif = esp_netif_new(&cfg);
267+
assert(netif);
268+
s_wifi_netifs[wifi_if] = netif;
269+
return netif;
270+
}
271+
272+
/**
273+
* @brief Set default handlers for station (official API)
274+
*/
275+
esp_err_t esp_wifi_set_default_wifi_remote_sta_handlers(void)
276+
{
277+
return set_default_wifi_handlers();
278+
}
279+
280+
/**
281+
* @brief Set default handlers for AP (official API)
282+
*/
283+
esp_err_t esp_wifi_set_default_wifi_remote_ap_handlers(void)
284+
{
285+
return set_default_wifi_handlers();
286+
}
287+
288+
/**
289+
* @brief Clear default handlers and destroy appropriate objects (official API)
290+
*/
291+
esp_err_t esp_wifi_remote_clear_default_wifi_driver_and_handlers(void *esp_netif)
292+
{
293+
int i;
294+
wifi_interface_t ifx;
295+
for (i = 0; i < MAX_WIFI_IFS; ++i) {
296+
// clear internal static pointers to netifs
297+
if (s_wifi_netifs[i] == esp_netif) {
298+
s_wifi_netifs[i] = NULL;
299+
ifx = i;
300+
}
301+
}
302+
for (i = 0; i < MAX_WIFI_IFS; ++i) {
303+
// check if all netifs are cleared to delete default handlers
304+
if (s_wifi_netifs[i] != NULL) {
305+
break;
306+
}
307+
}
308+
309+
if (i == MAX_WIFI_IFS) { // if all wifi default netifs are null
310+
ESP_LOGD(TAG, "Clearing wifi default handlers");
311+
clear_default_wifi_handlers();
312+
}
313+
s_rx_fn[ifx] = NULL;
314+
return ESP_OK;
315+
}
316+
317+
void esp_netif_destroy_wifi_remote(void *esp_netif)
318+
{
319+
if (esp_netif) {
320+
esp_wifi_remote_clear_default_wifi_driver_and_handlers(esp_netif);
321+
}
322+
esp_netif_destroy(esp_netif);
323+
}
324+
325+
326+
#if defined(CONFIG_WIFI_RMT_SOFTAP_SUPPORT) && !defined(CONFIG_ESP_WIFI_SOFTAP_SUPPORT)
327+
328+
static const esp_netif_ip_info_t s_wifi_remote_soft_ap_ip = {
329+
.ip = { .addr = ESP_IP4TOADDR( 192, 168, 4, 1) },
330+
.gw = { .addr = ESP_IP4TOADDR( 192, 168, 4, 1) },
331+
.netmask = { .addr = ESP_IP4TOADDR( 255, 255, 255, 0) },
332+
};
333+
334+
#ifdef CONFIG_LWIP_IPV4
335+
#define ESP_NETIF_IPV4_ONLY_FLAGS(flags) (flags)
336+
#else
337+
#define ESP_NETIF_IPV4_ONLY_FLAGS(flags) (0)
338+
#endif
339+
340+
#define ESP_NETIF_INHERENT_DEFAULT_WIFI_AP() \
341+
{ \
342+
.flags = (esp_netif_flags_t)(ESP_NETIF_IPV4_ONLY_FLAGS(ESP_NETIF_DHCP_SERVER) | ESP_NETIF_FLAG_AUTOUP), \
343+
ESP_COMPILER_DESIGNATED_INIT_AGGREGATE_TYPE_EMPTY(mac) \
344+
.ip_info = &s_wifi_remote_soft_ap_ip, \
345+
.get_ip_event = 0, \
346+
.lost_ip_event = 0, \
347+
.if_key = "WIFI_AP_DEF", \
348+
.if_desc = "ap", \
349+
.route_prio = 10, \
350+
.bridge_info = NULL \
351+
}
352+
#endif
353+
354+
/**
355+
* @brief User init default AP (official API)
356+
*/
357+
esp_netif_t* esp_wifi_remote_create_default_ap(void)
358+
{
359+
esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_WIFI_AP();
360+
esp_netif_config.if_key = "WIFI_AP_RMT";
361+
esp_netif_config.if_desc = "wifi_ap_remote";
362+
esp_netif_t *netif= esp_netif_create_wifi_remote(WIFI_IF_AP, &esp_netif_config);
363+
esp_wifi_set_default_wifi_remote_ap_handlers();
364+
return netif;
365+
}
366+
367+
/**
368+
* @brief User init default station (official API)
369+
*/
370+
esp_netif_t* esp_wifi_remote_create_default_sta(void)
371+
{
372+
esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_WIFI_STA();
373+
esp_netif_config.if_key = "WIFI_STA_RMT";
374+
esp_netif_config.if_desc = "wifi_sta_remote";
375+
esp_netif_t *netif= esp_netif_create_wifi_remote(WIFI_IF_STA, &esp_netif_config);
376+
esp_wifi_set_default_wifi_remote_sta_handlers();
377+
return netif;
378+
}

0 commit comments

Comments
 (0)