Exemplo n.º 1
0
Arquivo: mac.c Projeto: manoja328/RIOT
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 = ieee802154_frame_read(p->data, &frame, p->length);
            length = p->length - hdrlen - IEEE_802154_FCS_LEN;

            /* 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");
        }
    }
}
Exemplo n.º 2
0
void at86rf231_rx_handler(void)
{
    uint8_t lqi, fcs_rssi;
    // read packet length
    at86rf231_read_fifo(&at86rf231_rx_buffer[rx_buffer_next].length, 1);

    // read psdu, read packet with length as first byte and lqi as last byte.
    uint8_t *buf = buffer[rx_buffer_next];
    at86rf231_read_fifo(buf, at86rf231_rx_buffer[rx_buffer_next].length);

    // read lqi which is appended after the psdu
    lqi = buf[at86rf231_rx_buffer[rx_buffer_next].length - 1];

    // read fcs and rssi, from a register
    fcs_rssi = at86rf231_reg_read(AT86RF231_REG__PHY_RSSI);

    // build package
    at86rf231_rx_buffer[rx_buffer_next].lqi = lqi;
    // RSSI has no meaning here, it should be read during packet reception.
    at86rf231_rx_buffer[rx_buffer_next].rssi = fcs_rssi & 0x0F;  // bit[4:0]
    // bit7, boolean, 1 FCS valid, 0 FCS not valid
    at86rf231_rx_buffer[rx_buffer_next].crc = (fcs_rssi >> 7) & 0x01;

    if (at86rf231_rx_buffer[rx_buffer_next].crc == 0) {
        DEBUG("Got packet with invalid crc.\n");
        return;
    }

    ieee802154_frame_read(&buf[1], &at86rf231_rx_buffer[rx_buffer_next].frame,
                          at86rf231_rx_buffer[rx_buffer_next].length);

    if (at86rf231_rx_buffer[rx_buffer_next].frame.fcf.frame_type != 2) {
#if DEBUG_ENABLED
        ieee802154_frame_print_fcf_frame(&at86rf231_rx_buffer[rx_buffer_next].frame);
#endif

        /* notify transceiver thread if any */
        if (transceiver_pid) {
            msg_t m;
            m.type = (uint16_t) RCV_PKT_AT86RF231;
            m.content.value = rx_buffer_next;
            msg_send_int(&m, transceiver_pid);
        }
    }
    else {
#if DEBUG_ENABLED
        DEBUG("GOT ACK for SEQ %u\n", at86rf231_rx_buffer[rx_buffer_next].frame.seq_nr);
        ieee802154_frame_print_fcf_frame(&at86rf231_rx_buffer[rx_buffer_next].frame);
#endif
    }

    // shift to next buffer element
    if (++rx_buffer_next == AT86RF231_RX_BUF_SIZE) {
        rx_buffer_next = 0;
    }

    // Read IRQ to clear it
    at86rf231_reg_read(AT86RF231_REG__IRQ_STATUS);
}
Exemplo n.º 3
0
static void *etx_radio(void *arg)
{
    (void) arg;

    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_addr_set_link_local_prefix(&ll_address);
    ipv6_net_if_get_best_src_addr(&candidate_addr, &ll_address);

    while (1) {
        msg_receive(&m);

        if (m.type == PKT_PENDING) {
            p = (radio_packet_t *) m.content.ptr;

            ieee802154_frame_read(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);
            }

            p->processing--;
        }
        else if (m.type == ENOBUFFER) {
            DEBUGF("Transceiver buffer full\n");
        }
        else {
            //packet is not for me, whatever
        }
    }

    return NULL;
}
Exemplo n.º 4
0
void at86rf231_rx_handler(void)
{
    uint8_t lqi, fcs_rssi;
    /* read packet length */
    at86rf231_read_fifo(&at86rf231_rx_buffer[rx_buffer_next].length, 1);

    /* read psdu, read packet with length as first byte and lqi as last byte. */
    uint8_t *buf = buffer[rx_buffer_next];
    at86rf231_read_fifo(buf, at86rf231_rx_buffer[rx_buffer_next].length);

    /* read lqi which is appended after the psdu */
    lqi = buf[at86rf231_rx_buffer[rx_buffer_next].length - 1];

    /* read fcs and rssi, from a register */
    fcs_rssi = at86rf231_reg_read(AT86RF231_REG__PHY_RSSI);

    /* build package */
    at86rf231_rx_buffer[rx_buffer_next].lqi = lqi;
    /* RSSI has no meaning here, it should be read during packet reception. */
    at86rf231_rx_buffer[rx_buffer_next].rssi = fcs_rssi & 0x0F;  // bit[4:0]
    /* bit7, boolean, 1 FCS valid, 0 FCS not valid */
    at86rf231_rx_buffer[rx_buffer_next].crc = (fcs_rssi >> 7) & 0x01;

    if (at86rf231_rx_buffer[rx_buffer_next].crc == 0) {
        DEBUG("at86rf231: Got packet with invalid crc.\n");
        return;
    }

#ifdef DEBUG_ENABLED
    DEBUG("pkg: ");
    for (int i = 1; i < at86rf231_rx_buffer[rx_buffer_next].length; i++) {
        DEBUG("%x ", buf[i]);
    }
    DEBUG("\n");
#endif

    /* read buffer into ieee802154_frame */
    ieee802154_frame_read(&buf[1], &at86rf231_rx_buffer[rx_buffer_next].frame,
                          at86rf231_rx_buffer[rx_buffer_next].length);

    /* if packet is no ACK */
    if (at86rf231_rx_buffer[rx_buffer_next].frame.fcf.frame_type != IEEE_802154_ACK_FRAME) {
#ifdef DEBUG_ENABLED
        ieee802154_frame_print_fcf_frame(&at86rf231_rx_buffer[rx_buffer_next].frame);
#endif
        if (at86rf231_raw_packet_cb != NULL) {
            at86rf231_raw_packet_cb(&at86rf231_netdev, (void*)buf,
                                    at86rf231_rx_buffer[rx_buffer_next].length,
                                    fcs_rssi, lqi, (fcs_rssi >> 7));
        }
Exemplo n.º 5
0
static void *recv_ieee802154_frame(void *arg)
{
    (void) arg;

    msg_t m;
#if (defined(MODULE_AT86RF231) | \
     defined(MODULE_CC2420) | \
     defined(MODULE_MC1322X))
    ieee802154_packet_t *p;
#else
    radio_packet_t *p;
    uint8_t hdrlen;
#endif
    uint8_t length;
    ieee802154_frame_t frame;
    net_if_eui64_t src, dst;

    msg_init_queue(msg_q, RADIO_RCV_BUF_SIZE);

    while (1) {
        msg_receive(&m);

        if (m.type == PKT_PENDING) {
#if (defined(MODULE_AT86RF231) | \
     defined(MODULE_CC2420) | \
     defined(MODULE_MC1322X))
            p = (ieee802154_packet_t *) m.content.ptr;
            memcpy(&frame, &p->frame, sizeof(ieee802154_frame_t));
            length = p->frame.payload_len;
#else
            p = (radio_packet_t *) m.content.ptr;
            hdrlen = ieee802154_frame_read(p->data, &frame, p->length);
            length = p->length - hdrlen - IEEE_802154_FCS_LEN;
#endif

#ifdef DEBUG_ENABLED
            DEBUG("INFO: Received IEEE 802.15.4. packet (length = %d):\n", length);
            DEBUG("INFO: FCF:\n");
            ieee802154_frame_print_fcf_frame(&frame);

            DEBUG("Sender:");

            for (uint8_t i = 0; i < 8; i++) {
                printf("%02x ", frame.src_addr[i]);
            }

            DEBUG("\n");

            DEBUG("Receiver:");

            for (size_t i = 0; i < 8; i++) {
                printf("%02x ", frame.dest_addr[i]);
            }

            DEBUG("\n");

            DEBUG("Payload:\n");

            for (uint8_t i = 0; i < frame.payload_len; i++) {
                printf("%02x ", frame.payload[i]);

                if (!((i + 1) % 16) || i == frame.payload_len - 1) {
                    printf("\n");
                }
            }

#endif

            if (frame.fcf.src_addr_m == IEEE_802154_SHORT_ADDR_M) {
                mac_frame_short_to_eui64(&src, frame.src_addr);
            }
            else if (frame.fcf.src_addr_m == IEEE_802154_LONG_ADDR_M) {
                memcpy(&src, frame.src_addr, 8);
            }
            else {
                DEBUG("Unknown IEEE 802.15.4 source address mode.\n");
                continue;
            }

            if (frame.fcf.dest_addr_m == IEEE_802154_SHORT_ADDR_M) {
                mac_frame_short_to_eui64(&dst, frame.dest_addr);
            }
            else if (frame.fcf.dest_addr_m == IEEE_802154_LONG_ADDR_M) {
                memcpy(&dst, frame.dest_addr, 8);
            }
            else {
                DEBUG("Unknown IEEE 802.15.4 destination address mode.\n");
                continue;
            }

            /* deliver packet to network(6lowpan)-layer */
            lowpan_read(frame.payload, length, &src, &dst);
            /* TODO: get interface ID somehow */

            p->processing--;
        }
        else if (m.type == ENOBUFFER) {
            DEBUG("Transceiver buffer full");
        }
        else {
            DEBUG("Unknown packet received");
        }
    }

    return NULL;
}