/* * @brief Get the current long address of transceiver device * * @param t The transceiver device * * @return The configured long address of the device, 0 on error */ static transceiver_eui64_t get_long_addr(transceiver_type_t t) { switch (t) { #ifdef MODULE_CC2420 case TRANSCEIVER_CC2420: return cc2420_get_address_long(); #endif #ifdef MODULE_AT86RF231 case TRANSCEIVER_AT86RF231: return at86rf231_get_address_long(); #endif default: return 0; } }
radio_tx_status_t cc2420_load_tx_buf(ieee802154_packet_kind_t kind, ieee802154_node_addr_t dest, bool use_long_addr, bool wants_ack, void *buf, unsigned int len) { uint8_t hdr[24]; /* FCS : frame version 0, we don't manage security, nor batchs of packets */ switch (kind) { case PACKET_KIND_BEACON: hdr[0] = 0x00; break; case PACKET_KIND_DATA: hdr[0] = 0x01; break; case PACKET_KIND_ACK: hdr[0] = 0x02; break; default: return RADIO_TX_INVALID_PARAM; } if (wants_ack) { hdr[0] |= 0x20; } wait_for_ack = wants_ack; uint16_t src_pan = cc2420_get_pan(); bool compress_pan = false; if (use_long_addr) { hdr[1] = 0xcc; } else { hdr[1] = 0x88; /* short address mode, use PAN ID compression for intra-PAN communication */ if (dest.pan.id == src_pan) { compress_pan = true; hdr[0] |= 0x40; } } /* sequence number */ hdr[2] = sequenz_nr++; /* variable-length fields */ int idx = 3; if (use_long_addr) { /* dest long addr */ hdr[idx++] = (uint8_t)(dest.long_addr & 0xFF); hdr[idx++] = (uint8_t)(dest.long_addr >> 8); hdr[idx++] = (uint8_t)(dest.long_addr >> 16); hdr[idx++] = (uint8_t)(dest.long_addr >> 24); hdr[idx++] = (uint8_t)(dest.long_addr >> 32); hdr[idx++] = (uint8_t)(dest.long_addr >> 40); hdr[idx++] = (uint8_t)(dest.long_addr >> 48); hdr[idx++] = (uint8_t)(dest.long_addr >> 56); /* src long addr */ uint64_t src_long_addr = cc2420_get_address_long(); hdr[idx++] = (uint8_t)(src_long_addr & 0xFF); hdr[idx++] = (uint8_t)(src_long_addr >> 8); hdr[idx++] = (uint8_t)(src_long_addr >> 16); hdr[idx++] = (uint8_t)(src_long_addr >> 24); hdr[idx++] = (uint8_t)(src_long_addr >> 32); hdr[idx++] = (uint8_t)(src_long_addr >> 40); hdr[idx++] = (uint8_t)(src_long_addr >> 48); hdr[idx++] = (uint8_t)(src_long_addr >> 56); } else {