Example #1
0
void riot_send_nack(uint16_t to)
{
    msg_t m;
    m.type = CCNL_RIOT_NACK;
    DEBUGMSG(1, "sending NACK msg to pid=%" PRIkernel_pid"\n", to);
    msg_try_send(&m, to);
}
Example #2
0
int socket_base_net_msg_send(msg_t *m, kernel_pid_t pid, bool block, uint16_t message)
{
    m->type = message;
    if (block) {
       return  msg_send(m, pid);
    } else {
        return msg_try_send(m, pid);
    }
}
Example #3
0
static inline int _snd_rcv(kernel_pid_t pid, uint16_t type, gnrc_pktsnip_t *pkt)
{
    msg_t msg;
    /* set the outgoing message's fields */
    msg.type = type;
    msg.content.ptr = (void *)pkt;
    /* send message */
    int ret = msg_try_send(&msg, pid);
    if (ret < 1) {
        DEBUG("gnrc_netapi: dropped message to %" PRIkernel_pid " (%s)\n", pid,
              (ret == 0) ? "receiver queue is full" : "invalid receiver");
    }
    return ret;
}
/**
 * @brief local callback to handle incoming content chunks
 *
 * @note  Gets called from CCNL thread context
 *
 * @returns 1   if chunk is handled and no further processing should happen
 * @returns 0   otherwise
 **/
int ccnlriot_consumer(struct ccnl_relay_s *relay, struct ccnl_face_s *from,
                      struct ccnl_pkt_s *pkt)
{
    (void) from;
    (void) relay;

    if (dow_state == DOW_STATE_STOPPED) {
        LOG_DEBUG("ccnl_helper: we're in stopped, do nothing\n");
        free_packet(pkt);
        return 1;
    }

    uint32_t cont_id = (uint32_t) strtol((char*)pkt->pfx->comp[2], NULL, 16);
    if (cont_id > dow_highest_id) {
        dow_highest_id = cont_id;
    }

    LOG_DEBUG("%" PRIu32 " ccnl_helper: local consumer for prefix: %s\n", xtimer_now().ticks32,
              ccnl_prefix_to_path_detailed(_prefix_str, pkt->pfx, 1, 0, 0));
    memset(_prefix_str, 0, CCNLRIOT_PFX_LEN);

#if DOW_DEPUTY
    /* XXX: might be unnecessary du to mutex now */
    /* if we're currently transferring our cache to the new deputy, we do not touch the content store */
    if (dow_state == DOW_STATE_HANDOVER) {
        LOG_DEBUG("ccnl_helper: we're in handover state, cannot touch content store right now\n");
        free_packet(pkt);
        return 1;
    }
#endif

    /* check if prefix is for ALL and contains an ACK */
    if ((ccnl_prefix_cmp(ccnl_helper_all_pfx, NULL, pkt->pfx, CMP_MATCH) >= 1) &&
        (strncmp((char*) pkt->content, CCNLRIOT_CONT_ACK, strlen(CCNLRIOT_CONT_ACK)) == 0)) {
        dow_content_t *cc = (dow_content_t*) pkt->content;
        LOG_DEBUG("ccnl_helper: content number is %i\n", cc->num);
        if (cc->num >= 0) {
            _remove_pit(relay, cc->num);
        }

        LOG_DEBUG("ccnl_helper: received ACK, flag the content\n");
        msg_t m = { .type = DOW_MSG_RECEIVED_ACK };
        msg_try_send(&m, dow_pid);
        free_packet(pkt);
        return 1;
    }
Example #5
0
int nhdp_register_if(kernel_pid_t if_pid, uint8_t *addr, size_t addr_size, uint8_t addr_type,
                     uint16_t max_pl_size, uint16_t hello_int_ms, uint16_t val_time_ms)
{
    nhdp_if_entry_t *if_entry = NULL;
    nhdp_addr_t *nhdp_addr;
    msg_t signal_msg;

    if (nhdp_rcv_pid != KERNEL_PID_UNDEF) {
        return -2;
    }

    for (int i = 0; i < GNRC_NETIF_NUMOF; i++) {
        if (nhdp_if_table[i].if_pid == KERNEL_PID_UNDEF) {
            if_entry = &nhdp_if_table[i];
            break;
        }
    }

    if (!if_entry) {
        /* Maximum number of registerable interfaces reached */
        return -2;
    }

    uint16_t payload_size = max_pl_size > NHDP_MAX_RFC5444_PACKET_SZ
                            ? NHDP_MAX_RFC5444_PACKET_SZ : max_pl_size;
    if_entry->wr_target.packet_buffer = (uint8_t *) calloc(payload_size, sizeof(uint8_t));

    if (!if_entry->wr_target.packet_buffer) {
        /* Insufficient memory */
        return -1;
    }

    if_entry->wr_target.packet_size = payload_size;
    if_entry->wr_target.sendPacket = write_packet;

    /* Get NHDP address entry for the given address */
    nhdp_addr = nhdp_addr_db_get_address(addr, addr_size, addr_type);

    if (!nhdp_addr) {
        /* Insufficient memory */
        free(if_entry->wr_target.packet_buffer);
        return -1;
    }

    /* Add the interface to the LIB */
    if (lib_add_if_addr(if_pid, nhdp_addr) != 0) {
        free(if_entry->wr_target.packet_buffer);
        nhdp_decrement_addr_usage(nhdp_addr);
        return -1;
    }

    /* Create new IIB for the interface */
    if (iib_register_if(if_pid) != 0) {
        /* TODO: Cleanup lib entry */
        free(if_entry->wr_target.packet_buffer);
        nhdp_decrement_addr_usage(nhdp_addr);
        return -1;
    }

    /* Set Interface's PID */
    if_entry->if_pid = if_pid;
    /* Set HELLO_INTERVAL and H_HOLD_TIME (validity time) */
    if_entry->hello_interval.seconds = 0;
    if_entry->hello_interval.microseconds = MS_IN_USEC * hello_int_ms;
    if_entry->validity_time.seconds = 0;
    if_entry->validity_time.microseconds = MS_IN_USEC * val_time_ms;
    timex_normalize(&if_entry->hello_interval);
    timex_normalize(&if_entry->validity_time);
    /* Reset sequence number */
    if_entry->seq_no = 0;

    /* Everything went well */
    nhdp_decrement_addr_usage(nhdp_addr);
    nhdp_writer_register_if(&if_entry->wr_target);
    helper_pid = if_pid;

    /* Start the receiving thread */
    nhdp_rcv_pid = thread_create(nhdp_rcv_stack, sizeof(nhdp_rcv_stack), THREAD_PRIORITY_MAIN - 1,
                                 THREAD_CREATE_STACKTEST, _nhdp_receiver, NULL, "nhdp_rcv_thread");

    /* Start sending periodic HELLO */
    signal_msg.type = HELLO_TIMER;
    signal_msg.content.ptr = if_entry;
    /* TODO: msg_send or msg_try_send? */
    msg_try_send(&signal_msg, nhdp_pid);

    return 0;
}
Example #6
0
/*
 * @brief Processes a packet received by any transceiver device
 *
 * @param type  The message type to determine which device has received the
 * packet
 * @param pos   The current device driver's buffer position
 */
static void receive_packet(uint16_t type, uint8_t pos)
{
    size_t i = 0;
    transceiver_type_t t;
    rx_buffer_pos = pos;
    msg_t m;

    DEBUG("Packet received\n");

    switch (type) {
        case RCV_PKT_CC1020:
            t = TRANSCEIVER_CC1020;
            break;

        case RCV_PKT_CC1100:
            t = TRANSCEIVER_CC1100;
            break;

        case RCV_PKT_CC2420:
            t = TRANSCEIVER_CC2420;
            break;

        case RCV_PKT_MC1322X:
            t = TRANSCEIVER_MC1322X;
            break;

        case RCV_PKT_NATIVE:
            t = TRANSCEIVER_NATIVE;
            break;

        case RCV_PKT_AT86RF231:
            t = TRANSCEIVER_AT86RF231;
            break;

        default:
            t = TRANSCEIVER_NONE;
            break;
    }

    /* search first free position in transceiver buffer */
    for (i = 0; (i < TRANSCEIVER_BUFFER_SIZE) && (transceiver_buffer[transceiver_buffer_pos].processing); i++) {
        if (++transceiver_buffer_pos == TRANSCEIVER_BUFFER_SIZE) {
            transceiver_buffer_pos = 0;
        }
    }

    /* no buffer left */
    if (i >= TRANSCEIVER_BUFFER_SIZE) {
        /* inform upper layers of lost packet */
        m.type = ENOBUFFER;
        m.content.value = t;
        DEBUG("transceiver: buffer size exceeded, dropping packet\n");
    }
    /* copy packet and handle it */
    else {
        m.type = PKT_PENDING;

        /* pass a null pointer if a packet from a undefined transceiver is
         * received */
        if (type == RCV_PKT_CC1100) {
#if (defined(MODULE_CC110X) || defined(MODULE_CC110X_LEGACY))
            radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]);
            receive_cc110x_packet(trans_p);
#elif MODULE_CC110X_LEGACY_CSMA
            radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]);
            receive_cc1100_packet(trans_p);
#endif
        }
        else if (type == RCV_PKT_MC1322X) {
#ifdef MODULE_MC1322X
            ieee802154_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]);
            receive_mc1322x_packet(trans_p);
#endif
        }
        else if (type == RCV_PKT_CC2420) {
#ifdef MODULE_CC2420
            ieee802154_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]);
            receive_cc2420_packet(trans_p);
#endif
        }
        else if (type == RCV_PKT_AT86RF231) {
#ifdef MODULE_AT86RF231
            ieee802154_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]);
            receive_at86rf231_packet(trans_p);
#endif
        }
        else if (type == RCV_PKT_NATIVE) {
#ifdef MODULE_NATIVENET
            radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]);
            receive_nativenet_packet(trans_p);
#endif
        }
        else {
            puts("Invalid transceiver type");
            return;
        }

#ifdef DBG_IGNORE

#if MODULE_AT86RF231 || MODULE_CC2420 || MODULE_MC1322X
        radio_address_t short_addr;
        short_addr = (transceiver_buffer[transceiver_buffer_pos].frame.src_addr[1] << 8)
            | transceiver_buffer[transceiver_buffer_pos].frame.src_addr[0];
        for (size_t j = 0; (j < TRANSCEIVER_MAX_IGNORED_ADDR) && (transceiver_ignored_addr[j]); j++) {
            DEBUG("check if source (%u) is ignored -> %u\n", short_addr, transceiver_ignored_addr[j]);

            if (short_addr == transceiver_ignored_addr[j]) {
                DEBUG("ignored packet from %" PRIu16 "\n", short_addr);
                return;
            }
        }
#else
        for (size_t j = 0; (j < TRANSCEIVER_MAX_IGNORED_ADDR) && (transceiver_ignored_addr[j]); j++) {
            DEBUG("check if source (%u) is ignored -> %u\n", transceiver_buffer[transceiver_buffer_pos].src, transceiver_ignored_addr[j]);

            if (transceiver_buffer[transceiver_buffer_pos].src == transceiver_ignored_addr[j]) {
                DEBUG("ignored packet from %" PRIu16 "\n", transceiver_buffer[transceiver_buffer_pos].src);
                return;
            }
        }
#endif
#endif
    }

    /* finally notify waiting upper layers
     * this is done non-blocking, so packets can get lost */
    i = 0;

    while (reg[i].transceivers != TRANSCEIVER_NONE) {
        if (reg[i].transceivers & t) {
            m.content.ptr = (char *) &(transceiver_buffer[transceiver_buffer_pos]);
            DEBUG("transceiver: Notify thread %" PRIkernel_pid "\n", reg[i].pid);

            if (msg_try_send(&m, reg[i].pid) && (m.type != ENOBUFFER)) {
                transceiver_buffer[transceiver_buffer_pos].processing++;
            }
            else {
                DEBUG("transceiver: failed to notify upper layer.\n");
            }
        }

        i++;
    }
}