/* Process pending input packet(s) */ static void tsch_rx_process_pending() { int16_t input_index; /* Loop on accessing (without removing) a pending input packet */ while((input_index = ringbufindex_peek_get(&input_ringbuf)) != -1) { struct input_packet *current_input = &input_array[input_index]; frame802154_t frame; uint8_t ret = frame802154_parse(current_input->payload, current_input->len, &frame); int is_data = ret && frame.fcf.frame_type == FRAME802154_DATAFRAME; int is_eb = ret && frame.fcf.frame_version == FRAME802154_IEEE802154E_2012 && frame.fcf.frame_type == FRAME802154_BEACONFRAME; if(is_data) { /* Skip EBs and other control messages */ /* Copy to packetbuf for processing */ packetbuf_copyfrom(current_input->payload, current_input->len); packetbuf_set_attr(PACKETBUF_ATTR_RSSI, current_input->rssi); } /* Remove input from ringbuf */ ringbufindex_get(&input_ringbuf); if(is_data) { /* Pass to upper layers */ packet_input(); } else if(is_eb) { eb_input(current_input); } } }
/* Process pending input packet(s) */ static void tsch_rx_process_pending() { int16_t input_index; /* Loop on accessing (without removing) a pending input packet */ while((input_index = ringbufindex_peek_get(&input_ringbuf)) != -1) { struct input_packet *current_input = &input_array[input_index]; uint8_t ret; uint8_t frame_type; int is_data = 0; int is_eb = 0; /* Copy to packetbuf for processing */ packetbuf_copyfrom(current_input->payload, current_input->len); ret = NETSTACK_FRAMER.parse(); if(ret == FRAMER_FAILED) { PRINTF("TSCH:! failed to parse %u\n", packetbuf_datalen()); } else { frame_type = packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE); is_data = frame_type == FRAME802154_DATAFRAME; is_eb = frame_type == FRAME802154_BEACONFRAME; } if(is_data) { /* Skip EBs and other control messages */ packetbuf_set_attr(PACKETBUF_ATTR_RSSI, current_input->rssi); packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, current_input->channel); } /* Remove input from ringbuf */ ringbufindex_get(&input_ringbuf); if(is_data) { /* Pass to upper layers */ packet_input(); } else if(is_eb) { eb_input(current_input); } } }