fix(examples): Update SLIP example with error checks

This commit is contained in:
David Cermak
2022-09-30 15:25:43 +02:00
parent fcd6f0bb14
commit 7a21db23ad
4 changed files with 49 additions and 35 deletions

View File

@ -29,10 +29,10 @@
extern esp_netif_netstack_config_t *netstack_default_slip; extern esp_netif_netstack_config_t *netstack_default_slip;
typedef struct slip_modem slip_modem_t; typedef struct slip_modem* slip_modem_handle;
// Filter callbacks for handling application specific slip messages // Filter callbacks for handling application specific slip messages
typedef bool slip_rx_filter_cb_t(slip_modem_t *slip, uint8_t *data, uint32_t len); typedef bool slip_rx_filter_cb_t(slip_modem_handle slip, uint8_t *data, uint32_t len);
/** @brief Configuration structure for SLIP modem interface /** @brief Configuration structure for SLIP modem interface
@ -63,26 +63,26 @@ typedef struct {
* @returns * @returns
* - slip modem driver glue object * - slip modem driver glue object
*/ */
slip_modem_t *slip_modem_create(esp_netif_t *slip_netif, const slip_modem_config_t *modem_config); slip_modem_handle slip_modem_create(esp_netif_t *slip_netif, const slip_modem_config_t *modem_config);
/** @brief Destroy a slip modem /** @brief Destroy a slip modem
* *
* @param[in] slip modem object for destruction * @param[in] slip modem handle for destruction
* *
* @return * @return
* - ESP_OK on success * - ESP_OK on success
*/ */
esp_err_t slip_modem_destroy(slip_modem_t *slip); esp_err_t slip_modem_destroy(slip_modem_handle slip);
/** /**
* @brief Getter for the internally configured IPv6 address * @brief Getter for the internally configured IPv6 address
* *
* @param[in] slip modem object * @param[in] slip modem handle
* *
* @returns * @returns
* - ipv6 address returned by copy * - ipv6 address
*/ */
esp_ip6_addr_t slip_modem_get_ipv6_address(slip_modem_t *slip); esp_ip6_addr_t slip_modem_get_ipv6_address(slip_modem_handle slip);
/** /**
* @brief Data path API that forward the supplied data to the attached network interface * @brief Data path API that forward the supplied data to the attached network interface
@ -92,4 +92,4 @@ esp_ip6_addr_t slip_modem_get_ipv6_address(slip_modem_t *slip);
* @param[in] len length of the data * @param[in] len length of the data
* *
*/ */
void slip_modem_raw_write(slip_modem_t *slip, void *buffer, size_t len); void slip_modem_raw_write(slip_modem_handle slip, void *buffer, size_t len);

View File

@ -68,13 +68,17 @@ static void slip_modem_uart_rx_task(void *arg);
static esp_err_t slip_modem_post_attach(esp_netif_t *esp_netif, void *args); static esp_err_t slip_modem_post_attach(esp_netif_t *esp_netif, void *args);
// Create a new slip modem // Create a new slip modem
slip_modem_t *slip_modem_create(esp_netif_t *slip_netif, const slip_modem_config_t *modem_config) slip_modem_handle slip_modem_create(esp_netif_t *slip_netif, const slip_modem_config_t *modem_config)
{ {
if (slip_netif == NULL || modem_config == NULL) {
ESP_LOGE(TAG, "invalid parameters");
return NULL;
}
ESP_LOGI(TAG, "%s: Creating slip modem (netif: %p)", __func__, slip_netif); ESP_LOGI(TAG, "%s: Creating slip modem (netif: %p)", __func__, slip_netif);
ESP_LOGD(TAG, "%s (netif: %p)", __func__, slip_netif); ESP_LOGD(TAG, "%s (netif: %p)", __func__, slip_netif);
slip_modem_t *slip_modem = calloc(1, sizeof(slip_modem_t)); slip_modem_handle slip_modem = calloc(1, sizeof(struct slip_modem));
if (!slip_modem) { if (!slip_modem) {
ESP_LOGE(TAG, "create netif glue failed"); ESP_LOGE(TAG, "create netif glue failed");
return NULL; return NULL;
@ -93,14 +97,14 @@ slip_modem_t *slip_modem_create(esp_netif_t *slip_netif, const slip_modem_config
slip_modem->uart.uart_baud = modem_config->uart_baud; slip_modem->uart.uart_baud = modem_config->uart_baud;
slip_modem->uart.uart_rx_pin = modem_config->uart_rx_pin; slip_modem->uart.uart_rx_pin = modem_config->uart_rx_pin;
slip_modem->uart.uart_tx_pin = modem_config->uart_tx_pin; slip_modem->uart.uart_tx_pin = modem_config->uart_tx_pin;
memcpy(&slip_modem->addr, modem_config->ipv6_addr, sizeof(esp_ip6_addr_t)); slip_modem->addr = *modem_config->ipv6_addr;
// Return the new modem // Return the new modem
return slip_modem; return slip_modem;
} }
// Internal handler called on driver start // Internal handler called on driver start
static esp_err_t esp_slip_driver_start(slip_modem_t *slip_modem) static esp_err_t esp_slip_driver_start(slip_modem_handle slip_modem)
{ {
ESP_LOGD(TAG, "%s: Starting SLIP modem (modem %p)", __func__, slip_modem); ESP_LOGD(TAG, "%s: Starting SLIP modem (modem %p)", __func__, slip_modem);
@ -142,20 +146,22 @@ static esp_err_t esp_slip_driver_start(slip_modem_t *slip_modem)
} }
esp_err_t slip_modem_destroy(slip_modem_t *slip) esp_err_t slip_modem_destroy(slip_modem_handle slip)
{ {
// Stop slip driver if (slip != NULL) {
esp_netif_action_stop(slip->base.netif, 0, 0, 0); // Stop slip driver
ESP_ERROR_CHECK(slip_modem_netif_stop(slip->base.netif)); esp_netif_action_stop(slip->base.netif, 0, 0, 0);
ESP_ERROR_CHECK(slip_modem_netif_stop(slip->base.netif));
// Stop uart rx task // Stop uart rx task
vTaskDelete(slip->uart.uart_rx_task); vTaskDelete(slip->uart.uart_rx_task);
// Delete driver // Delete driver
uart_driver_delete(slip->uart.uart_dev); uart_driver_delete(slip->uart.uart_dev);
// Free slip interface // Free slip interface
free(slip); free(slip);
}
return ESP_OK; return ESP_OK;
} }
@ -165,7 +171,7 @@ static esp_err_t slip_modem_transmit(void *slip_driver, void *buffer, size_t len
{ {
ESP_LOGD(TAG, "%s", __func__); ESP_LOGD(TAG, "%s", __func__);
ESP_LOG_BUFFER_HEXDUMP(TAG, buffer, len, ESP_LOG_DEBUG); ESP_LOG_BUFFER_HEXDUMP(TAG, buffer, len, ESP_LOG_DEBUG);
slip_modem_t *slip_modem = (slip_modem_t *) slip_driver; slip_modem_handle slip_modem = (slip_modem_handle)slip_driver;
int32_t res = uart_write_bytes(slip_modem->uart.uart_dev, (char *)buffer, len); int32_t res = uart_write_bytes(slip_modem->uart.uart_dev, (char *)buffer, len);
if (res < 0) { if (res < 0) {
@ -179,7 +185,7 @@ static esp_err_t slip_modem_transmit(void *slip_driver, void *buffer, size_t len
// Post-attach handler for netif // Post-attach handler for netif
static esp_err_t slip_modem_post_attach(esp_netif_t *esp_netif, void *args) static esp_err_t slip_modem_post_attach(esp_netif_t *esp_netif, void *args)
{ {
slip_modem_t *slip_modem = (slip_modem_t *) args; slip_modem_handle slip_modem = (slip_modem_handle) args;
ESP_LOGD(TAG, "%s (netif: %p args: %p)", __func__, esp_netif, args); ESP_LOGD(TAG, "%s (netif: %p args: %p)", __func__, esp_netif, args);
@ -199,7 +205,11 @@ static esp_err_t slip_modem_post_attach(esp_netif_t *esp_netif, void *args)
static void slip_modem_uart_rx_task(void *arg) static void slip_modem_uart_rx_task(void *arg)
{ {
slip_modem_t *slip_modem = (slip_modem_t *) arg; if (arg == NULL) {
ESP_LOGE(TAG, "Starting a task with invalid parameters, deleting");
vTaskDelete(NULL);
}
slip_modem_handle slip_modem = (slip_modem_handle) arg;
ESP_LOGD(TAG, "Start SLIP modem RX task (slip_modem %p filter: %p)", slip_modem, slip_modem->rx_filter); ESP_LOGD(TAG, "Start SLIP modem RX task (slip_modem %p filter: %p)", slip_modem, slip_modem->rx_filter);
ESP_LOGD(TAG, "Uart: %d, buffer: %p (%d bytes)", slip_modem->uart.uart_dev, slip_modem->buffer, slip_modem->buffer_len); ESP_LOGD(TAG, "Uart: %d, buffer: %p (%d bytes)", slip_modem->uart.uart_dev, slip_modem->buffer, slip_modem->buffer_len);
@ -235,12 +245,12 @@ static void slip_modem_uart_rx_task(void *arg)
/** /**
* @brief Gets the internally configured ipv6 address * @brief Gets the internally configured ipv6 address
*/ */
esp_ip6_addr_t slip_modem_get_ipv6_address(slip_modem_t *slip) esp_ip6_addr_t slip_modem_get_ipv6_address(slip_modem_handle slip)
{ {
return slip->addr; return slip->addr;
} }
void slip_modem_raw_write(slip_modem_t *slip, void *buffer, size_t len) void slip_modem_raw_write(slip_modem_handle slip, void *buffer, size_t len)
{ {
slip_modem_netif_raw_write(slip->base.netif, buffer, len); slip_modem_netif_raw_write(slip->base.netif, buffer, len);
} }

View File

@ -133,8 +133,11 @@ static int get_esp_netif_index(esp_netif_t * esp_netif)
return -1; return -1;
} }
err_t esp_slipif_init(struct netif *netif) static err_t esp_slipif_init(struct netif *netif)
{ {
if (netif == NULL) {
return ERR_IF;
}
esp_netif_t *esp_netif = netif->state; esp_netif_t *esp_netif = netif->state;
int esp_index = get_esp_netif_index(esp_netif); int esp_index = get_esp_netif_index(esp_netif);
if (esp_index < 0) { if (esp_index < 0) {

View File

@ -66,7 +66,7 @@ static void udp_rx_tx_task(void *arg)
vTaskDelete(NULL); vTaskDelete(NULL);
} }
esp_err_t udp_rx_tx_init(void) static esp_err_t udp_rx_tx_start(void)
{ {
// Setup bind address // Setup bind address
struct sockaddr_in6 dest_addr; struct sockaddr_in6 dest_addr;
@ -116,7 +116,7 @@ esp_err_t udp_rx_tx_init(void)
} }
// Write a prefix to the contiki slip device // Write a prefix to the contiki slip device
static void slip_set_prefix(slip_modem_t *slip) static void slip_set_prefix(slip_modem_handle slip)
{ {
uint8_t buff[10] = {0}; uint8_t buff[10] = {0};
const esp_ip6_addr_t addr = slip_modem_get_ipv6_address(slip); const esp_ip6_addr_t addr = slip_modem_get_ipv6_address(slip);
@ -138,7 +138,7 @@ static void slip_set_prefix(slip_modem_t *slip)
// slip_rx_filter filters incoming commands from the slip interface // slip_rx_filter filters incoming commands from the slip interface
// this implementation is designed for use with contiki slip devices // this implementation is designed for use with contiki slip devices
static bool slip_rx_filter(slip_modem_t *slip, uint8_t *data, uint32_t len) static bool slip_rx_filter(slip_modem_handle slip, uint8_t *data, uint32_t len)
{ {
if (data[1] == '?') { if (data[1] == '?') {
switch (data[2]) { switch (data[2]) {
@ -229,8 +229,9 @@ void app_main(void)
ESP_ERROR_CHECK(esp_event_loop_create_default()); ESP_ERROR_CHECK(esp_event_loop_create_default());
// Setup slip interface // Setup slip interface
slip_if_init(); esp_netif_t* esp_netif = slip_if_init();
assert(esp_netif);
// Setup UDP loopback service // Start the UDP user application
udp_rx_tx_init(); udp_rx_tx_start();
} }