gnrc_lorawan: refactor rx_done callback

This commit is contained in:
Jose Alamos 2020-05-08 13:40:34 +02:00
parent 5146261f03
commit 2e6ba90435
3 changed files with 32 additions and 26 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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);