Skip to content

Commit 993cad1

Browse files
Jordan Yatescarlescufi
authored andcommitted
wifi: esp_at: cleanup sockets at network close
Some sockets (UDP sockets at least) do not generate "<N>,CLOSED" messages when the WiFi network drops. As a result the networking stack thinks these sockets are still open after the network has dropped, and after any subsequent reconnections. This affects the DNS resolver library in particular, which leaves UDP sockets open permanently by default. Manually close these sockets when the network drops to ensure a clean state the next time the network connects. Signed-off-by: Jordan Yates <[email protected]>
1 parent a2c0bd8 commit 993cad1

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

drivers/wifi/esp_at/esp.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -384,20 +384,37 @@ MODEM_CMD_DEFINE(on_cmd_wifi_connected)
384384
return 0;
385385
}
386386

387-
MODEM_CMD_DEFINE(on_cmd_wifi_disconnected)
387+
static void esp_mgmt_disconnect_work(struct k_work *work)
388388
{
389-
struct esp_data *dev = CONTAINER_OF(data, struct esp_data,
390-
cmd_handler_data);
389+
struct esp_socket *sock;
390+
struct esp_data *dev;
391391

392-
if (!esp_flags_are_set(dev, EDF_STA_CONNECTED)) {
393-
return 0;
392+
dev = CONTAINER_OF(work, struct esp_data, disconnect_work);
393+
394+
/* Cleanup any sockets that weren't closed */
395+
for (int i = 0; i < ARRAY_SIZE(dev->sockets); i++) {
396+
sock = &dev->sockets[i];
397+
if (esp_socket_connected(sock)) {
398+
LOG_WRN("Socket %d left open, manually closing", i);
399+
esp_socket_close(sock);
400+
}
394401
}
395402

396403
esp_flags_clear(dev, EDF_STA_CONNECTED);
397404
esp_mode_switch_submit_if_needed(dev);
398405

399406
net_if_ipv4_addr_rm(dev->net_iface, &dev->ip);
400407
wifi_mgmt_raise_disconnect_result_event(dev->net_iface, 0);
408+
}
409+
410+
MODEM_CMD_DEFINE(on_cmd_wifi_disconnected)
411+
{
412+
struct esp_data *dev = CONTAINER_OF(data, struct esp_data,
413+
cmd_handler_data);
414+
415+
if (esp_flags_are_set(dev, EDF_STA_CONNECTED)) {
416+
k_work_submit_to_queue(&dev->workq, &dev->disconnect_work);
417+
}
401418

402419
return 0;
403420
}
@@ -1102,6 +1119,7 @@ static int esp_init(const struct device *dev)
11021119
k_work_init_delayable(&data->ip_addr_work, esp_ip_addr_work);
11031120
k_work_init(&data->scan_work, esp_mgmt_scan_work);
11041121
k_work_init(&data->connect_work, esp_mgmt_connect_work);
1122+
k_work_init(&data->disconnect_work, esp_mgmt_disconnect_work);
11051123
k_work_init(&data->mode_switch_work, esp_mode_switch_work);
11061124
if (IS_ENABLED(CONFIG_WIFI_ESP_AT_DNS_USE)) {
11071125
k_work_init(&data->dns_work, esp_dns_work);

drivers/wifi/esp_at/esp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ struct esp_data {
250250
struct k_work_delayable ip_addr_work;
251251
struct k_work scan_work;
252252
struct k_work connect_work;
253+
struct k_work disconnect_work;
253254
struct k_work mode_switch_work;
254255
struct k_work dns_work;
255256

0 commit comments

Comments
 (0)