Example #1
0
/*
 * @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;
    }
}
Example #2
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 {
Example #3
0
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;
    }
}