fix: add explicit route send failure results

This commit is contained in:
2026-04-23 18:06:02 +08:00
parent 22bc6a7fef
commit c1a0822227
2 changed files with 107 additions and 46 deletions
+68 -15
View File
@@ -12,6 +12,22 @@ typedef struct {
static route_slot_t g_route_slots[ROUTE_MSG_POOL_SIZE]; static route_slot_t g_route_slots[ROUTE_MSG_POOL_SIZE];
const char *route_send_result_to_str(route_send_result_t result)
{
switch (result) {
case ROUTE_SEND_OK:
return "ok";
case ROUTE_SEND_INVALID_INPUT:
return "invalid";
case ROUTE_SEND_POOL_EXHAUSTED:
return "pool";
case ROUTE_SEND_QUEUE_FULL:
return "queue";
default:
return "unknown";
}
}
void route_msg_init(void) void route_msg_init(void)
{ {
memset(g_route_slots, 0, sizeof(g_route_slots)); memset(g_route_slots, 0, sizeof(g_route_slots));
@@ -108,7 +124,7 @@ void route_msg_free_from_isr(route_msg_t *msg)
taskEXIT_CRITICAL_FROM_ISR(saved_interrupt_status); taskEXIT_CRITICAL_FROM_ISR(saved_interrupt_status);
} }
static bool route_prepare(route_msg_t *msg, static route_send_result_t route_prepare(route_msg_t *msg,
uint8_t src_id, uint8_t src_id,
uint8_t dst_mask, uint8_t dst_mask,
uint8_t conn_type, uint8_t conn_type,
@@ -116,7 +132,7 @@ static bool route_prepare(route_msg_t *msg,
uint16_t len) uint16_t len)
{ {
if (msg == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) { if (msg == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) {
return false; return ROUTE_SEND_INVALID_INPUT;
} }
msg->src_id = src_id; msg->src_id = src_id;
@@ -124,10 +140,21 @@ static bool route_prepare(route_msg_t *msg,
msg->conn_type = conn_type; msg->conn_type = conn_type;
msg->len = len; msg->len = len;
memcpy(msg->data, data, len); memcpy(msg->data, data, len);
return true; return ROUTE_SEND_OK;
} }
bool route_send(QueueHandle_t queue, static route_send_result_t route_validate_args(QueueHandle_t queue,
const uint8_t *data,
uint16_t len)
{
if (queue == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) {
return ROUTE_SEND_INVALID_INPUT;
}
return ROUTE_SEND_OK;
}
route_send_result_t route_send(QueueHandle_t queue,
uint8_t src_id, uint8_t src_id,
uint8_t dst_mask, uint8_t dst_mask,
uint8_t conn_type, uint8_t conn_type,
@@ -135,22 +162,35 @@ bool route_send(QueueHandle_t queue,
uint16_t len, uint16_t len,
TickType_t wait_ticks) TickType_t wait_ticks)
{ {
route_msg_t *msg = route_msg_alloc(wait_ticks); route_send_result_t result;
route_msg_t *msg;
if (!route_prepare(msg, src_id, dst_mask, conn_type, data, len)) { result = route_validate_args(queue, data, len);
if (result != ROUTE_SEND_OK) {
return result;
}
msg = route_msg_alloc(wait_ticks);
if (msg == NULL) {
return ROUTE_SEND_POOL_EXHAUSTED;
}
result = route_prepare(msg, src_id, dst_mask, conn_type, data, len);
if (result != ROUTE_SEND_OK) {
route_msg_free(msg); route_msg_free(msg);
return false; return result;
} }
if (xQueueSend(queue, &msg, wait_ticks) != pdPASS) { if (xQueueSend(queue, &msg, wait_ticks) != pdPASS) {
route_msg_free(msg); route_msg_free(msg);
return false; return ROUTE_SEND_QUEUE_FULL;
} }
return true; return ROUTE_SEND_OK;
} }
bool route_send_from_isr(QueueHandle_t queue, route_send_result_t route_send_from_isr(QueueHandle_t queue,
uint8_t src_id, uint8_t src_id,
uint8_t dst_mask, uint8_t dst_mask,
uint8_t conn_type, uint8_t conn_type,
@@ -158,17 +198,30 @@ bool route_send_from_isr(QueueHandle_t queue,
uint16_t len, uint16_t len,
BaseType_t *xHigherPriorityTaskWoken) BaseType_t *xHigherPriorityTaskWoken)
{ {
route_msg_t *msg = route_msg_alloc_from_isr(xHigherPriorityTaskWoken); route_send_result_t result;
route_msg_t *msg;
if (!route_prepare(msg, src_id, dst_mask, conn_type, data, len)) { result = route_validate_args(queue, data, len);
if (result != ROUTE_SEND_OK) {
return result;
}
msg = route_msg_alloc_from_isr(xHigherPriorityTaskWoken);
if (msg == NULL) {
return ROUTE_SEND_POOL_EXHAUSTED;
}
result = route_prepare(msg, src_id, dst_mask, conn_type, data, len);
if (result != ROUTE_SEND_OK) {
route_msg_free_from_isr(msg); route_msg_free_from_isr(msg);
return false; return result;
} }
if (xQueueSendFromISR(queue, &msg, xHigherPriorityTaskWoken) != pdPASS) { if (xQueueSendFromISR(queue, &msg, xHigherPriorityTaskWoken) != pdPASS) {
route_msg_free_from_isr(msg); route_msg_free_from_isr(msg);
return false; return ROUTE_SEND_QUEUE_FULL;
} }
return true; return ROUTE_SEND_OK;
} }
+10 -2
View File
@@ -29,6 +29,13 @@ typedef enum {
ROUTE_CONN_C2 ROUTE_CONN_C2
} route_conn_type_t; } route_conn_type_t;
typedef enum {
ROUTE_SEND_OK = 0,
ROUTE_SEND_INVALID_INPUT,
ROUTE_SEND_POOL_EXHAUSTED,
ROUTE_SEND_QUEUE_FULL
} route_send_result_t;
typedef struct { typedef struct {
uint8_t src_id; uint8_t src_id;
uint8_t dst_mask; uint8_t dst_mask;
@@ -42,14 +49,15 @@ route_msg_t *route_msg_alloc(TickType_t wait_ticks);
route_msg_t *route_msg_alloc_from_isr(BaseType_t *xHigherPriorityTaskWoken); route_msg_t *route_msg_alloc_from_isr(BaseType_t *xHigherPriorityTaskWoken);
void route_msg_free(route_msg_t *msg); void route_msg_free(route_msg_t *msg);
void route_msg_free_from_isr(route_msg_t *msg); void route_msg_free_from_isr(route_msg_t *msg);
bool route_send(QueueHandle_t queue, const char *route_send_result_to_str(route_send_result_t result);
route_send_result_t route_send(QueueHandle_t queue,
uint8_t src_id, uint8_t src_id,
uint8_t dst_mask, uint8_t dst_mask,
uint8_t conn_type, uint8_t conn_type,
const uint8_t *data, const uint8_t *data,
uint16_t len, uint16_t len,
TickType_t wait_ticks); TickType_t wait_ticks);
bool route_send_from_isr(QueueHandle_t queue, route_send_result_t route_send_from_isr(QueueHandle_t queue,
uint8_t src_id, uint8_t src_id,
uint8_t dst_mask, uint8_t dst_mask,
uint8_t conn_type, uint8_t conn_type,