Exemplo n.º 1
0
/*
 * @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;
    }
}
Exemplo n.º 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 {