fix(openthread): use esp_netif_tcpip_exec when sending a trel message

This commit is contained in:
Xu Si Yu
2025-04-16 16:27:29 +08:00
parent b6c5152231
commit 6aa0f96ae8

View File

@@ -91,6 +91,8 @@ static void trel_browse_notifier(mdns_result_t *result)
static void trel_recv_task(void *ctx) static void trel_recv_task(void *ctx)
{ {
esp_err_t ret = ESP_OK;
OT_UNUSED_VARIABLE(ret);
ot_trel_recv_task_t *task_ctx = (ot_trel_recv_task_t *)ctx; ot_trel_recv_task_t *task_ctx = (ot_trel_recv_task_t *)ctx;
struct pbuf *recv_buf = task_ctx->p; struct pbuf *recv_buf = task_ctx->p;
uint8_t *data_buf = (uint8_t *)recv_buf->payload; uint8_t *data_buf = (uint8_t *)recv_buf->payload;
@@ -99,58 +101,47 @@ static void trel_recv_task(void *ctx)
if (recv_buf->next != NULL) { if (recv_buf->next != NULL) {
data_buf = (uint8_t *)malloc(recv_buf->tot_len); data_buf = (uint8_t *)malloc(recv_buf->tot_len);
if (data_buf != NULL) { ESP_GOTO_ON_FALSE(data_buf, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate data buf when receiving Thread TREL message");
length = recv_buf->tot_len; length = recv_buf->tot_len;
data_buf_to_free = data_buf; data_buf_to_free = data_buf;
pbuf_copy_partial(recv_buf, data_buf, recv_buf->tot_len, 0); pbuf_copy_partial(recv_buf, data_buf, recv_buf->tot_len, 0);
} else {
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate data buf when receiving Thread TREL message");
ExitNow();
}
} }
otPlatTrelHandleReceived(esp_openthread_get_instance(), data_buf, length, task_ctx->source_addr); otPlatTrelHandleReceived(esp_openthread_get_instance(), data_buf, length, task_ctx->source_addr);
exit: exit:
if (data_buf_to_free) { if (recv_buf) {
free(data_buf_to_free); pbuf_free(recv_buf);
}
pbuf_free(recv_buf);
if(task_ctx) {
free(task_ctx->source_addr);
} }
free(data_buf_to_free);
free(task_ctx->source_addr);
free(task_ctx); free(task_ctx);
} }
// TZ-1704
static void handle_trel_udp_recv(void *ctx, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, uint16_t port) static void handle_trel_udp_recv(void *ctx, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, uint16_t port)
{ {
esp_err_t ret = ESP_OK;
ESP_LOGD(OT_PLAT_LOG_TAG, "Receive from %s:%d", ip6addr_ntoa(&(addr->u_addr.ip6)), port); ESP_LOGD(OT_PLAT_LOG_TAG, "Receive from %s:%d", ip6addr_ntoa(&(addr->u_addr.ip6)), port);
ot_trel_recv_task_t *task_ctx = (ot_trel_recv_task_t *)malloc(sizeof(ot_trel_recv_task_t)); ot_trel_recv_task_t *task_ctx = (ot_trel_recv_task_t *)malloc(sizeof(ot_trel_recv_task_t));
if (task_ctx == NULL) { ESP_GOTO_ON_FALSE(task_ctx, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
ExitNow();
}
task_ctx->p = p; task_ctx->p = p;
task_ctx->source_addr = (otSockAddr *)malloc(sizeof(otSockAddr)); task_ctx->source_addr = (otSockAddr *)malloc(sizeof(otSockAddr));
if (task_ctx->source_addr == NULL) { ESP_GOTO_ON_FALSE(task_ctx->source_addr, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
ExitNow();
}
memset(task_ctx->source_addr, 0, sizeof(otSockAddr)); memset(task_ctx->source_addr, 0, sizeof(otSockAddr));
task_ctx->source_addr->mPort = port; task_ctx->source_addr->mPort = port;
memcpy(&task_ctx->source_addr->mAddress.mFields.m32, addr->u_addr.ip6.addr, sizeof(addr->u_addr.ip6.addr)); memcpy(&task_ctx->source_addr->mAddress.mFields.m32, addr->u_addr.ip6.addr, sizeof(addr->u_addr.ip6.addr));
if (esp_openthread_task_queue_post(trel_recv_task, task_ctx) != ESP_OK) { ESP_GOTO_ON_ERROR(esp_openthread_task_queue_post(trel_recv_task, task_ctx), exit, OT_PLAT_LOG_TAG, "Failed to receive OpenThread TREL message");
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to receive OpenThread TREL message");
ExitNow();
}
return;
exit: exit:
if(task_ctx) { if (ret != ESP_OK) {
free(task_ctx->source_addr); free(task_ctx->source_addr);
free(task_ctx);
if (p) {
pbuf_free(p);
}
} }
free(task_ctx);
pbuf_free(p);
} }
static esp_err_t ot_new_trel(void *ctx) static esp_err_t ot_new_trel(void *ctx)
@@ -176,7 +167,7 @@ void otPlatTrelEnable(otInstance *aInstance, uint16_t *aUdpPort)
esp_openthread_task_switching_lock_acquire(portMAX_DELAY); esp_openthread_task_switching_lock_acquire(portMAX_DELAY);
} }
static void trel_send_task(void *ctx) static esp_err_t trel_send_task(void *ctx)
{ {
err_t err = ERR_OK; err_t err = ERR_OK;
struct pbuf *send_buf = NULL; struct pbuf *send_buf = NULL;
@@ -190,18 +181,12 @@ static void trel_send_task(void *ctx)
task->pcb->flags = (task->pcb->flags & (~UDP_FLAGS_MULTICAST_LOOP)); task->pcb->flags = (task->pcb->flags & (~UDP_FLAGS_MULTICAST_LOOP));
task->pcb->local_port = s_ot_trel.port; task->pcb->local_port = s_ot_trel.port;
send_buf = pbuf_alloc(PBUF_TRANSPORT, task->length, PBUF_RAM); send_buf = pbuf_alloc(PBUF_TRANSPORT, task->length, PBUF_RAM);
if (send_buf == NULL) { ESP_RETURN_ON_FALSE(send_buf, ESP_ERR_NO_MEM, OT_PLAT_LOG_TAG, "Failed to allocate data buf when sending Thread TREL message");
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate data buf when sending Thread TREL message");
ExitNow();
}
memcpy(send_buf->payload, task->payload, task->length); memcpy(send_buf->payload, task->payload, task->length);
err = udp_sendto_if(task->pcb, send_buf, &task->peer_addr, task->peer_port, netif_get_by_index(task->pcb->netif_idx)); err = udp_sendto_if(task->pcb, send_buf, &task->peer_addr, task->peer_port, netif_get_by_index(task->pcb->netif_idx));
if(err != ERR_OK) {
ESP_LOGE(OT_PLAT_LOG_TAG, "Fail to send trel msg to %s:%d %d (%d)", ip6addr_ntoa(&(task->peer_addr.u_addr.ip6)), task->peer_port, task->pcb->netif_idx, err);
}
exit:
pbuf_free(send_buf); pbuf_free(send_buf);
free(task); ESP_RETURN_ON_FALSE(err == ERR_OK, ESP_FAIL, OT_PLAT_LOG_TAG, "Fail to send trel msg to %s:%d %d (%d)", ip6addr_ntoa(&(task->peer_addr.u_addr.ip6)), task->peer_port, task->pcb->netif_idx, err);
return ESP_OK;
} }
void otPlatTrelSend(otInstance *aInstance, void otPlatTrelSend(otInstance *aInstance,
@@ -209,23 +194,18 @@ void otPlatTrelSend(otInstance *aInstance,
uint16_t aUdpPayloadLen, uint16_t aUdpPayloadLen,
const otSockAddr *aDestSockAddr) const otSockAddr *aDestSockAddr)
{ {
if (!s_trel_netif) { esp_err_t err = ESP_OK;
ESP_LOGE(OT_PLAT_LOG_TAG, "None Thread TREL interface"); ot_trel_send_task_t task;
return;
} ESP_RETURN_ON_FALSE(s_trel_netif, , OT_PLAT_LOG_TAG, "None Thread TREL interface");
ot_trel_send_task_t *task = (ot_trel_send_task_t *)malloc(sizeof(ot_trel_send_task_t)); memcpy(task.peer_addr.u_addr.ip6.addr, aDestSockAddr->mAddress.mFields.m32, OT_IP6_ADDRESS_SIZE);
if (task == NULL) { task.peer_port = aDestSockAddr->mPort;
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL"); task.payload = aUdpPayload;
return; task.length = aUdpPayloadLen;
}
memcpy(task->peer_addr.u_addr.ip6.addr, aDestSockAddr->mAddress.mFields.m32, OT_IP6_ADDRESS_SIZE);
task->peer_port = aDestSockAddr->mPort;
ESP_LOGD(OT_PLAT_LOG_TAG, "send trel msg to %s:%d", ip6addr_ntoa(&(task->peer_addr.u_addr.ip6)), task->peer_port);
task->payload = aUdpPayload;
task->length = aUdpPayloadLen;
esp_openthread_task_switching_lock_release(); esp_openthread_task_switching_lock_release();
tcpip_callback(trel_send_task, task); err = esp_netif_tcpip_exec(trel_send_task, &task);
esp_openthread_task_switching_lock_acquire(portMAX_DELAY); esp_openthread_task_switching_lock_acquire(portMAX_DELAY);
ESP_RETURN_ON_FALSE(err == ESP_OK, , OT_PLAT_LOG_TAG, "Failed to send TREL message");
} }
void otPlatTrelNotifyPeerSocketAddressDifference(otInstance *aInstance, void otPlatTrelNotifyPeerSocketAddressDifference(otInstance *aInstance,