void recv_ieee802154_frame(void) { msg_t m; radio_packet_t *p; uint8_t hdrlen, length; ieee802154_frame_t frame; msg_init_queue(msg_q, RADIO_RCV_BUF_SIZE); while (1) { msg_receive(&m); if (m.type == PKT_PENDING) { p = (radio_packet_t *) m.content.ptr; hdrlen = read_802154_frame(p->data, &frame, p->length); length = p->length - hdrlen; /* deliver packet to network(6lowpan)-layer */ lowpan_read(frame.payload, length, (ieee_802154_long_t *)&frame.src_addr, (ieee_802154_long_t *)&frame.dest_addr); p->processing--; } else if (m.type == ENOBUFFER) { puts("Transceiver buffer full"); } else { puts("Unknown packet received"); } } }
static void *recv_ieee802154_frame(void *arg) { (void) arg; msg_t m; #if (defined(MODULE_AT86RF231) | \ defined(MODULE_CC2420) | \ defined(MODULE_MC1322X)) ieee802154_packet_t *p; #else radio_packet_t *p; uint8_t hdrlen; #endif uint8_t length; ieee802154_frame_t frame; net_if_eui64_t src, dst; msg_init_queue(msg_q, RADIO_RCV_BUF_SIZE); while (1) { msg_receive(&m); if (m.type == PKT_PENDING) { #if (defined(MODULE_AT86RF231) | \ defined(MODULE_CC2420) | \ defined(MODULE_MC1322X)) p = (ieee802154_packet_t *) m.content.ptr; memcpy(&frame, &p->frame, sizeof(ieee802154_frame_t)); length = p->frame.payload_len; #else p = (radio_packet_t *) m.content.ptr; hdrlen = ieee802154_frame_read(p->data, &frame, p->length); length = p->length - hdrlen - IEEE_802154_FCS_LEN; #endif #ifdef DEBUG_ENABLED DEBUG("INFO: Received IEEE 802.15.4. packet (length = %d):\n", length); DEBUG("INFO: FCF:\n"); ieee802154_frame_print_fcf_frame(&frame); DEBUG("Sender:"); for (uint8_t i = 0; i < 8; i++) { printf("%02x ", frame.src_addr[i]); } DEBUG("\n"); DEBUG("Receiver:"); for (size_t i = 0; i < 8; i++) { printf("%02x ", frame.dest_addr[i]); } DEBUG("\n"); DEBUG("Payload:\n"); for (uint8_t i = 0; i < frame.payload_len; i++) { printf("%02x ", frame.payload[i]); if (!((i + 1) % 16) || i == frame.payload_len - 1) { printf("\n"); } } #endif if (frame.fcf.src_addr_m == IEEE_802154_SHORT_ADDR_M) { mac_frame_short_to_eui64(&src, frame.src_addr); } else if (frame.fcf.src_addr_m == IEEE_802154_LONG_ADDR_M) { memcpy(&src, frame.src_addr, 8); } else { DEBUG("Unknown IEEE 802.15.4 source address mode.\n"); continue; } if (frame.fcf.dest_addr_m == IEEE_802154_SHORT_ADDR_M) { mac_frame_short_to_eui64(&dst, frame.dest_addr); } else if (frame.fcf.dest_addr_m == IEEE_802154_LONG_ADDR_M) { memcpy(&dst, frame.dest_addr, 8); } else { DEBUG("Unknown IEEE 802.15.4 destination address mode.\n"); continue; } /* deliver packet to network(6lowpan)-layer */ lowpan_read(frame.payload, length, &src, &dst); /* TODO: get interface ID somehow */ p->processing--; } else if (m.type == ENOBUFFER) { DEBUG("Transceiver buffer full"); } else { DEBUG("Unknown packet received"); } } return NULL; }