mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 02:37:19 +02:00
fix(openthread): use esp_netif_tcpip_exec when sending a trel message
This commit is contained in:
@ -91,6 +91,8 @@ static void trel_browse_notifier(mdns_result_t *result)
|
||||
|
||||
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;
|
||||
struct pbuf *recv_buf = task_ctx->p;
|
||||
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) {
|
||||
data_buf = (uint8_t *)malloc(recv_buf->tot_len);
|
||||
if (data_buf != NULL) {
|
||||
length = recv_buf->tot_len;
|
||||
data_buf_to_free = data_buf;
|
||||
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();
|
||||
}
|
||||
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;
|
||||
data_buf_to_free = data_buf;
|
||||
pbuf_copy_partial(recv_buf, data_buf, recv_buf->tot_len, 0);
|
||||
}
|
||||
otPlatTrelHandleReceived(esp_openthread_get_instance(), data_buf, length, task_ctx->source_addr);
|
||||
|
||||
exit:
|
||||
if (data_buf_to_free) {
|
||||
free(data_buf_to_free);
|
||||
}
|
||||
pbuf_free(recv_buf);
|
||||
if(task_ctx) {
|
||||
free(task_ctx->source_addr);
|
||||
if (recv_buf) {
|
||||
pbuf_free(recv_buf);
|
||||
}
|
||||
free(data_buf_to_free);
|
||||
free(task_ctx->source_addr);
|
||||
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)
|
||||
{
|
||||
esp_err_t ret = ESP_OK;
|
||||
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));
|
||||
if (task_ctx == NULL) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
|
||||
ExitNow();
|
||||
}
|
||||
ESP_GOTO_ON_FALSE(task_ctx, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
|
||||
task_ctx->p = p;
|
||||
task_ctx->source_addr = (otSockAddr *)malloc(sizeof(otSockAddr));
|
||||
if (task_ctx->source_addr == NULL) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
|
||||
ExitNow();
|
||||
}
|
||||
ESP_GOTO_ON_FALSE(task_ctx->source_addr, ESP_ERR_NO_MEM, exit, OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
|
||||
memset(task_ctx->source_addr, 0, sizeof(otSockAddr));
|
||||
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));
|
||||
|
||||
if (esp_openthread_task_queue_post(trel_recv_task, task_ctx) != ESP_OK) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to receive OpenThread TREL message");
|
||||
ExitNow();
|
||||
}
|
||||
return;
|
||||
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");
|
||||
|
||||
exit:
|
||||
if(task_ctx) {
|
||||
if (ret != ESP_OK) {
|
||||
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)
|
||||
@ -176,7 +167,7 @@ void otPlatTrelEnable(otInstance *aInstance, uint16_t *aUdpPort)
|
||||
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;
|
||||
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->local_port = s_ot_trel.port;
|
||||
send_buf = pbuf_alloc(PBUF_TRANSPORT, task->length, PBUF_RAM);
|
||||
if (send_buf == NULL) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate data buf when sending Thread TREL message");
|
||||
ExitNow();
|
||||
}
|
||||
ESP_RETURN_ON_FALSE(send_buf, ESP_ERR_NO_MEM, OT_PLAT_LOG_TAG, "Failed to allocate data buf when sending Thread TREL message");
|
||||
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));
|
||||
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);
|
||||
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,
|
||||
@ -209,23 +194,18 @@ void otPlatTrelSend(otInstance *aInstance,
|
||||
uint16_t aUdpPayloadLen,
|
||||
const otSockAddr *aDestSockAddr)
|
||||
{
|
||||
if (!s_trel_netif) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "None Thread TREL interface");
|
||||
return;
|
||||
}
|
||||
ot_trel_send_task_t *task = (ot_trel_send_task_t *)malloc(sizeof(ot_trel_send_task_t));
|
||||
if (task == NULL) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to allocate buf for Thread TREL");
|
||||
return;
|
||||
}
|
||||
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_err_t err = ESP_OK;
|
||||
ot_trel_send_task_t task;
|
||||
|
||||
ESP_RETURN_ON_FALSE(s_trel_netif, , OT_PLAT_LOG_TAG, "None Thread TREL interface");
|
||||
memcpy(task.peer_addr.u_addr.ip6.addr, aDestSockAddr->mAddress.mFields.m32, OT_IP6_ADDRESS_SIZE);
|
||||
task.peer_port = aDestSockAddr->mPort;
|
||||
task.payload = aUdpPayload;
|
||||
task.length = aUdpPayloadLen;
|
||||
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_RETURN_ON_FALSE(err == ESP_OK, , OT_PLAT_LOG_TAG, "Failed to send TREL message");
|
||||
}
|
||||
|
||||
void otPlatTrelNotifyPeerSocketAddressDifference(otInstance *aInstance,
|
||||
|
Reference in New Issue
Block a user