From 71ddd3bd6149544daa24f512e2090d57a7288f09 Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Thu, 24 Jun 2021 15:03:17 +0200 Subject: [PATCH 1/2] gnrc_lorawan: fix undefined state when PSDU is NULL --- sys/include/net/gnrc/lorawan.h | 11 +++++++++++ sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sys/include/net/gnrc/lorawan.h b/sys/include/net/gnrc/lorawan.h index 1feaf57485..d6f7ee38f5 100644 --- a/sys/include/net/gnrc/lorawan.h +++ b/sys/include/net/gnrc/lorawan.h @@ -176,6 +176,17 @@ void gnrc_lorawan_radio_rx_timeout_cb(gnrc_lorawan_t *mac); */ void gnrc_lorawan_radio_tx_done_cb(gnrc_lorawan_t *mac); +/** + * @brief Indicate the MAC layer reception of a frame went wrong. + * + * @param[in] mac pointer to the MAC descriptor + */ +static inline void gnrc_lorawan_radio_rx_error_cb(gnrc_lorawan_t *mac) +{ + /* The failed reception is seen by the MAC layer as an RX timeout */ + gnrc_lorawan_radio_rx_timeout_cb(mac); +} + /** * @brief Indicate the MAC layer that the timer was fired * diff --git a/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c b/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c index 51b06f2ac3..34ac42257e 100644 --- a/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c +++ b/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c @@ -180,13 +180,13 @@ static void _rx_done(gnrc_lorawan_t *mac) DEBUG("_recv_lorawan: cannot allocate pktsnip.\n"); /* Discard packet on netdev device */ dev->driver->recv(dev, NULL, bytes_expected, NULL); - gnrc_lorawan_radio_rx_done_cb(mac, NULL, 0); + gnrc_lorawan_radio_rx_error_cb(mac); return; } nread = dev->driver->recv(dev, pkt->data, bytes_expected, &rx_info); if (nread <= 0) { gnrc_pktbuf_release(pkt); - gnrc_lorawan_radio_rx_done_cb(mac, NULL, 0); + gnrc_lorawan_radio_rx_error_cb(mac); return; } From a90e5e6fc484d319cc8bf8a4990e8640ec5934ae Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Thu, 24 Jun 2021 15:56:23 +0200 Subject: [PATCH 2/2] gnrc_lorawan: update gnrc_lorawan_radio_rx_done function --- sys/include/net/gnrc/lorawan.h | 5 +++-- sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sys/include/net/gnrc/lorawan.h b/sys/include/net/gnrc/lorawan.h index d6f7ee38f5..1571b3153c 100644 --- a/sys/include/net/gnrc/lorawan.h +++ b/sys/include/net/gnrc/lorawan.h @@ -237,8 +237,9 @@ void gnrc_lorawan_mcps_request(gnrc_lorawan_t *mac, * To be called on radio RX done event. * * @param[in] mac pointer to the MAC descriptor - * @param[in] data pointer to the psdu. Pass NULL if the packet was wrong (or - * allocation failed) + * @param[in] data pointer to the psdu. Must not be NULL. Use + * @ref gnrc_lorawan_radio_rx_error_cb instead if the reception was + * not successful. * @param[in] size size of the PSDU */ void gnrc_lorawan_radio_rx_done_cb(gnrc_lorawan_t *mac, uint8_t *data, diff --git a/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c b/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c index efeab23dd7..3a3cfa1ff8 100644 --- a/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c +++ b/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c @@ -242,10 +242,8 @@ void gnrc_lorawan_send_pkt(gnrc_lorawan_t *mac, iolist_t *psdu, uint8_t dr) void gnrc_lorawan_radio_rx_done_cb(gnrc_lorawan_t *mac, uint8_t *psdu, size_t size) { + assert(psdu); _sleep_radio(mac); - if (psdu == NULL) { - return; - } mac->state = LORAWAN_STATE_IDLE; gnrc_lorawan_remove_timer(mac);