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. * To be called on radio RX done event.
* *
* @param[in] mac pointer to the MAC descriptor * @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 * @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; mac->state = LORAWAN_STATE_IDLE;
xtimer_remove(&mac->rx); 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); 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; 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) static void _driver_cb(netdev_t *dev, netdev_event_t event)
{ {
gnrc_netif_t *netif = dev->context; 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); DEBUG("gnrc_netif: event triggered -> %i\n", event);
switch (event) { switch (event) {
case NETDEV_EVENT_RX_COMPLETE: case NETDEV_EVENT_RX_COMPLETE:
gnrc_lorawan_radio_rx_done_cb(mac); _rx_done(mac);
break; break;
case NETDEV_EVENT_TX_COMPLETE: case NETDEV_EVENT_TX_COMPLETE:
gnrc_lorawan_radio_tx_done_cb(mac); gnrc_lorawan_radio_tx_done_cb(mac);