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"); } } }
void etx_radio(void) { msg_t m; radio_packet_t *p; ieee802154_frame_t frame; msg_init_queue(msg_que, ETX_RCV_QUEUE_SIZE); ipv6_addr_t ll_address; ipv6_addr_t candidate_addr; ipv6_set_ll_prefix(&ll_address); ipv6_get_saddr(&candidate_addr, &ll_address); while (1) { msg_receive(&m); if (m.type == PKT_PENDING) { p = (radio_packet_t*) m.content.ptr; read_802154_frame(p->data, &frame, p->length); if (frame.payload[0] == ETX_PKT_OPTVAL) { //copy to receive buffer memcpy(etx_rec_buf, &frame.payload[0], frame.payload_len); //create IPv6 address from radio packet //we can do the cast here since rpl nodes can only have addr //up to 8 bits candidate_addr.uint8[ETX_IPV6_LAST_BYTE] = (uint8_t) p->src; //handle the beacon mutex_lock(&etx_mutex); etx_handle_beacon(&candidate_addr); mutex_unlock(&etx_mutex,1); } p->processing--; } else if (m.type == ENOBUFFER) { puts("Transceiver buffer full"); } else { //packet is not for me, whatever } } }