diff --git a/examples/esp_netif/slip_custom_netif/components/slip_modem/include/slip_modem.h b/examples/esp_netif/slip_custom_netif/components/slip_modem/include/slip_modem.h index 4dd0be4e7..7dcd422de 100644 --- a/examples/esp_netif/slip_custom_netif/components/slip_modem/include/slip_modem.h +++ b/examples/esp_netif/slip_custom_netif/components/slip_modem/include/slip_modem.h @@ -29,10 +29,10 @@ 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 -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 @@ -63,26 +63,26 @@ typedef struct { * @returns * - 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 * - * @param[in] slip modem object for destruction + * @param[in] slip modem handle for destruction * * @return * - 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 * - * @param[in] slip modem object + * @param[in] slip modem handle * * @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 @@ -92,4 +92,4 @@ esp_ip6_addr_t slip_modem_get_ipv6_address(slip_modem_t *slip); * @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); diff --git a/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem.c b/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem.c index d12283531..278f926ae 100644 --- a/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem.c +++ b/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem.c @@ -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); // 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_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) { ESP_LOGE(TAG, "create netif glue failed"); 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_rx_pin = modem_config->uart_rx_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 slip_modem; } // 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); @@ -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 - esp_netif_action_stop(slip->base.netif, 0, 0, 0); - ESP_ERROR_CHECK(slip_modem_netif_stop(slip->base.netif)); + if (slip != NULL) { + // Stop slip driver + esp_netif_action_stop(slip->base.netif, 0, 0, 0); + ESP_ERROR_CHECK(slip_modem_netif_stop(slip->base.netif)); - // Stop uart rx task - vTaskDelete(slip->uart.uart_rx_task); + // Stop uart rx task + vTaskDelete(slip->uart.uart_rx_task); - // Delete driver - uart_driver_delete(slip->uart.uart_dev); + // Delete driver + uart_driver_delete(slip->uart.uart_dev); - // Free slip interface - free(slip); + // Free slip interface + free(slip); + } 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_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); 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 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); @@ -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) { - 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, "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 */ -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; } -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); } diff --git a/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem_netif.c b/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem_netif.c index dd7328faa..d82318096 100644 --- a/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem_netif.c +++ b/examples/esp_netif/slip_custom_netif/components/slip_modem/library/slip_modem_netif.c @@ -133,8 +133,11 @@ static int get_esp_netif_index(esp_netif_t * esp_netif) 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; int esp_index = get_esp_netif_index(esp_netif); if (esp_index < 0) { diff --git a/examples/esp_netif/slip_custom_netif/main/slip_client_main.c b/examples/esp_netif/slip_custom_netif/main/slip_client_main.c index 414d01044..82188556c 100644 --- a/examples/esp_netif/slip_custom_netif/main/slip_client_main.c +++ b/examples/esp_netif/slip_custom_netif/main/slip_client_main.c @@ -66,7 +66,7 @@ static void udp_rx_tx_task(void *arg) vTaskDelete(NULL); } -esp_err_t udp_rx_tx_init(void) +static esp_err_t udp_rx_tx_start(void) { // Setup bind address 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 -static void slip_set_prefix(slip_modem_t *slip) +static void slip_set_prefix(slip_modem_handle slip) { uint8_t buff[10] = {0}; 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 // 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] == '?') { switch (data[2]) { @@ -229,8 +229,9 @@ void app_main(void) ESP_ERROR_CHECK(esp_event_loop_create_default()); // Setup slip interface - slip_if_init(); + esp_netif_t* esp_netif = slip_if_init(); + assert(esp_netif); - // Setup UDP loopback service - udp_rx_tx_init(); + // Start the UDP user application + udp_rx_tx_start(); }