Skip to content

Commit 9e13870

Browse files
committed
fix(wifi_remote): Lock server before marshalling events
1 parent 3f12ef6 commit 9e13870

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

components/esp_wifi_remote/eppp/wifi_remote_rpc_server.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,34 @@ const unsigned char key[] = "-----BEGIN PRIVATE KEY-----\n" CONFIG_ESP_WIFI_REMO
3232

3333
using namespace server;
3434

35+
class Sync {
36+
friend class RpcInstance;
37+
public:
38+
void lock()
39+
{
40+
xSemaphoreTake(mutex, portMAX_DELAY);
41+
}
42+
void unlock()
43+
{
44+
xSemaphoreGive(mutex);
45+
}
46+
esp_err_t init()
47+
{
48+
mutex = xSemaphoreCreateMutex();
49+
return mutex == nullptr ? ESP_ERR_NO_MEM : ESP_OK;
50+
}
51+
~Sync()
52+
{
53+
if (mutex) {
54+
vSemaphoreDelete(mutex);
55+
}
56+
}
57+
private:
58+
SemaphoreHandle_t mutex{nullptr};
59+
};
60+
3561
class RpcInstance {
62+
friend class Sync;
3663
public:
3764
RpcEngine rpc{role::SERVER};
3865
int sock{-1};
@@ -43,11 +70,12 @@ class RpcInstance {
4370
ESP_RETURN_ON_ERROR(start_server(), TAG, "Failed to start RPC server");
4471
ESP_RETURN_ON_ERROR(rpc.init(), TAG, "Failed to init RPC engine");
4572
ESP_RETURN_ON_ERROR(esp_netif_napt_enable(netif), TAG, "Failed to enable NAPT");
73+
ESP_RETURN_ON_ERROR(sync.init(), TAG, "Failed to init locks");
4674
ESP_RETURN_ON_ERROR(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, handler, this), TAG, "Failed to register event");
4775
ESP_RETURN_ON_ERROR(esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, handler, this), TAG, "Failed to register event");
4876
return xTaskCreate(task, "server", 8192, this, 5, nullptr) == pdTRUE ? ESP_OK : ESP_FAIL;
4977
}
50-
78+
Sync sync;
5179
private:
5280
esp_netif_t *netif{nullptr};
5381
static void task(void *ctx)
@@ -81,6 +109,7 @@ class RpcInstance {
81109
esp_err_t wifi_event(int32_t id)
82110
{
83111
ESP_LOGI(TAG, "Received WIFI event %" PRIi32, id);
112+
std::lock_guard<Sync> lock(sync);
84113
ESP_RETURN_ON_ERROR(rpc.send(api_id::WIFI_EVENT, &id), TAG, "Failed to marshall WiFi event");
85114
return ESP_OK;
86115
}
@@ -97,6 +126,7 @@ class RpcInstance {
97126
ESP_RETURN_ON_ERROR(esp_netif_get_ip_info(netif, &ip_event.ppp_ip), TAG, "Failed to get IP info");
98127
ESP_LOGI(TAG, "IP address:" IPSTR, IP2STR(&ip_data->ip_info.ip));
99128
}
129+
std::lock_guard<Sync> lock(sync);
100130
ESP_RETURN_ON_ERROR(rpc.send(api_id::IP_EVENT, &ip_event), TAG, "Failed to marshal IP event");
101131
return ESP_OK;
102132
}
@@ -114,7 +144,7 @@ class RpcInstance {
114144
{
115145
auto header = rpc.get_header();
116146
ESP_LOGI(TAG, "Received header id %d", (int) header.id);
117-
147+
std::lock_guard<Sync> lock(sync);
118148
switch (header.id) {
119149
case api_id::SET_MODE: {
120150
auto req = rpc.get_payload<wifi_mode_t>(api_id::SET_MODE, header);

0 commit comments

Comments
 (0)