summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniël van de Giessen <daniel@dvdgiessen.nl>2025-07-10 14:43:29 +0200
committerDamien George <damien@micropython.org>2025-08-11 12:38:37 +1000
commitadcfdf625be4ce1a8506dccc33ea60ab5d84ab46 (patch)
tree77810a96d4f13ae4931f44dc4fa98ffab3d55a25
parent361c615f3e272df012fc18315e226f9131d25c05 (diff)
esp32/network_ppp: Use non-thread-safe API inside status callback.
The status callback runs on the lwIP tcpip_thread, and thus must use the non-thread-safe API because the thread-safe API would cause a deadlock. Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
-rw-r--r--extmod/network_ppp_lwip.c8
-rw-r--r--ports/esp32/network_ppp.c11
2 files changed, 13 insertions, 6 deletions
diff --git a/extmod/network_ppp_lwip.c b/extmod/network_ppp_lwip.c
index 2c3dac920..883275f48 100644
--- a/extmod/network_ppp_lwip.c
+++ b/extmod/network_ppp_lwip.c
@@ -62,8 +62,6 @@ typedef struct _network_ppp_obj_t {
const mp_obj_type_t mp_network_ppp_lwip_type;
-static mp_obj_t network_ppp___del__(mp_obj_t self_in);
-
static void network_ppp_stream_uart_irq_disable(network_ppp_obj_t *self) {
if (self->stream == mp_const_none) {
return;
@@ -88,8 +86,12 @@ static void network_ppp_status_cb(ppp_pcb *pcb, int err_code, void *ctx) {
// only need to free the PPP PCB, not close it.
self->state = STATE_ACTIVE;
}
+ network_ppp_stream_uart_irq_disable(self);
// Clean up the PPP PCB.
- network_ppp___del__(MP_OBJ_FROM_PTR(self));
+ if (ppp_free(pcb) == ERR_OK) {
+ self->state = STATE_INACTIVE;
+ self->pcb = NULL;
+ }
break;
default:
self->state = STATE_ERROR;
diff --git a/ports/esp32/network_ppp.c b/ports/esp32/network_ppp.c
index 77e4385ca..3a9cb239d 100644
--- a/ports/esp32/network_ppp.c
+++ b/ports/esp32/network_ppp.c
@@ -68,8 +68,6 @@ typedef struct _network_ppp_obj_t {
const mp_obj_type_t esp_network_ppp_lwip_type;
-static mp_obj_t network_ppp___del__(mp_obj_t self_in);
-
static void network_ppp_stream_uart_irq_disable(network_ppp_obj_t *self) {
if (self->stream == mp_const_none) {
return;
@@ -94,8 +92,15 @@ static void network_ppp_status_cb(ppp_pcb *pcb, int err_code, void *ctx) {
// only need to free the PPP PCB, not close it.
self->state = STATE_ACTIVE;
}
+ network_ppp_stream_uart_irq_disable(self);
// Clean up the PPP PCB.
- network_ppp___del__(MP_OBJ_FROM_PTR(self));
+ // Note: Because we use pppapi_close instead of ppp_close, this
+ // callback will run on the lwIP tcpip_thread, thus to prevent a
+ // deadlock we must use the non-threadsafe function here.
+ if (ppp_free(pcb) == ERR_OK) {
+ self->state = STATE_INACTIVE;
+ self->pcb = NULL;
+ }
break;
default:
self->state = STATE_ERROR;