fix: add explicit route send failure results
This commit is contained in:
+68
-15
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user