/* * @brief Get the pan of any transceiver device * * @param t The transceiver device * * @return The current pan of the transceiver, -1 on error */ static int32_t get_pan(transceiver_type_t t) { switch (t) { #ifdef MODULE_CC2420 case TRANSCEIVER_CC2420: return cc2420_get_pan(); #endif #ifdef MODULE_NATIVENET case TRANSCEIVER_NATIVE: return nativenet_get_pan(); #endif #ifdef MODULE_AT86RF231 case TRANSCEIVER_AT86RF231: return at86rf231_get_pan(); #endif #ifdef MODULE_MC1322X case TRANSCEIVER_MC1322X: return maca_get_pan(); #endif default: return -1; } }
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 {
static int _get(netdev_t *netdev, netopt_t opt, void *val, size_t max_len) { if (netdev == NULL) { return -ENODEV; } cc2420_t *dev = (cc2420_t *)netdev; int ext = netdev_ieee802154_get(&dev->netdev, opt, val, max_len); if (ext > 0) { return ext; } switch (opt) { case NETOPT_ADDRESS: assert(max_len >= sizeof(uint16_t)); cc2420_get_addr_short(dev, val); return sizeof(uint16_t); case NETOPT_ADDRESS_LONG: assert(max_len >= 8); cc2420_get_addr_long(dev, val); return 8; case NETOPT_NID: assert(max_len >= sizeof(uint16_t)); return w_u16(val, cc2420_get_pan(dev)); case NETOPT_CHANNEL: assert(max_len >= sizeof(uint16_t)); return w_u16(val, cc2420_get_chan(dev)); case NETOPT_TX_POWER: assert(max_len >= sizeof(int16_t)); return w_i16(val, cc2420_get_txpower(dev)); case NETOPT_STATE: assert(max_len >= sizeof(netopt_state_t)); *((netopt_state_t *)val) = cc2420_get_state(dev); return sizeof(netopt_state_t); case NETOPT_IS_CHANNEL_CLR: return opt_state(val, cc2420_cca(dev)); case NETOPT_AUTOACK: return opt_state(val, (dev->options & CC2420_OPT_AUTOACK)); case NETOPT_CSMA: return opt_state(val, (dev->options & CC2420_OPT_CSMA)); case NETOPT_PRELOADING: return opt_state(val, (dev->options & CC2420_OPT_PRELOADING)); case NETOPT_PROMISCUOUSMODE: return opt_state(val, (dev->options & CC2420_OPT_PROMISCUOUS)); case NETOPT_RX_START_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_RX_START)); case NETOPT_RX_END_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_TX_END)); case NETOPT_TX_START_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_RX_START)); case NETOPT_TX_END_IRQ: return opt_state(val, (dev->options & CC2420_OPT_TELL_RX_END)); default: return -ENOTSUP; } }