diff --git a/sys/include/net/gnrc/lorawan.h b/sys/include/net/gnrc/lorawan.h index 4371ea4a78..dd4cc5fc44 100644 --- a/sys/include/net/gnrc/lorawan.h +++ b/sys/include/net/gnrc/lorawan.h @@ -230,8 +230,9 @@ void gnrc_lorawan_mcps_request(gnrc_lorawan_t *mac, const mcps_request_t *mcps_r * To be called on radio RX done event. * * @param[in] mac pointer to the MAC descriptor + * @param[in] pkt pointer to the packet */ -void gnrc_lorawan_radio_rx_done_cb(gnrc_lorawan_t *mac); +void gnrc_lorawan_radio_rx_done_cb(gnrc_lorawan_t *mac, gnrc_pktsnip_t *pkt); /** * @brief MCPS indication callback diff --git a/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c b/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c index b11a9f604b..059d7ca6bc 100644 --- a/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c +++ b/sys/net/gnrc/link_layer/lorawan/gnrc_lorawan.c @@ -249,8 +249,12 @@ void gnrc_lorawan_send_pkt(gnrc_lorawan_t *mac, gnrc_pktsnip_t *pkt, uint8_t dr) } -void gnrc_lorawan_process_pkt(gnrc_lorawan_t *mac, gnrc_pktsnip_t *pkt) +void gnrc_lorawan_radio_rx_done_cb(gnrc_lorawan_t *mac, gnrc_pktsnip_t *pkt) { + _sleep_radio(mac); + if (pkt == NULL) { + return; + } mac->state = LORAWAN_STATE_IDLE; xtimer_remove(&mac->rx); @@ -272,26 +276,3 @@ void gnrc_lorawan_process_pkt(gnrc_lorawan_t *mac, gnrc_pktsnip_t *pkt) gnrc_lorawan_mac_release(mac); } - -void gnrc_lorawan_radio_rx_done_cb(gnrc_lorawan_t *mac) -{ - netdev_t *dev = gnrc_lorawan_get_netdev(mac); - int bytes_expected = dev->driver->recv(dev, NULL, 0, 0); - int nread; - struct netdev_radio_rx_info rx_info; - gnrc_pktsnip_t *pkt = gnrc_pktbuf_add(NULL, NULL, bytes_expected, GNRC_NETTYPE_UNDEF); - if (pkt == NULL) { - DEBUG("_recv_ieee802154: cannot allocate pktsnip.\n"); - /* Discard packet on netdev device */ - dev->driver->recv(dev, NULL, bytes_expected, NULL); - return; - } - nread = dev->driver->recv(dev, pkt->data, bytes_expected, &rx_info); - _sleep_radio(mac); - if (nread <= 0) { - gnrc_pktbuf_release(pkt); - return; - } - - gnrc_lorawan_process_pkt(mac, pkt); -} diff --git a/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c b/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c index 6eff506302..43e213282a 100644 --- a/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c +++ b/sys/net/gnrc/netif/lorawan/gnrc_netif_lorawan.c @@ -108,6 +108,30 @@ void gnrc_lorawan_mcps_confirm(gnrc_lorawan_t *mac, mcps_confirm_t *confirm) mac->mcps.outgoing_pkt = NULL; } +static void _rx_done(gnrc_lorawan_t *mac) +{ + netdev_t *dev = gnrc_lorawan_get_netdev(mac); + int bytes_expected = dev->driver->recv(dev, NULL, 0, 0); + int nread; + struct netdev_radio_rx_info rx_info; + gnrc_pktsnip_t *pkt = gnrc_pktbuf_add(NULL, NULL, bytes_expected, GNRC_NETTYPE_UNDEF); + if (pkt == NULL) { + DEBUG("_recv_ieee802154: 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); + 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); + return; + } + + gnrc_lorawan_radio_rx_done_cb(mac, pkt); +} + static void _driver_cb(netdev_t *dev, netdev_event_t event) { gnrc_netif_t *netif = dev->context; @@ -125,7 +149,7 @@ static void _driver_cb(netdev_t *dev, netdev_event_t event) DEBUG("gnrc_netif: event triggered -> %i\n", event); switch (event) { case NETDEV_EVENT_RX_COMPLETE: - gnrc_lorawan_radio_rx_done_cb(mac); + _rx_done(mac); break; case NETDEV_EVENT_TX_COMPLETE: gnrc_lorawan_radio_tx_done_cb(mac);