コード例 #1
0
ファイル: listener.c プロジェクト: swhatelse/URB_Final
void handle_normal(message_t* msg, node_t* sender) {
    if(!is_already_in(delivered, msg)) {
        // Message have not received yet
        if(!is_already_in(already_received, msg)) {
            GList* element = get_msg_from_list(not_received_yet, msg);
            // Check is the message is already referenced in the not_received yet
            if(element) {
                message_element_t* msg_elmnt = (message_element_t*)element->data;
                not_received_yet = g_list_remove(not_received_yet, msg_elmnt);
                already_received = g_list_append(already_received, msg_elmnt);
                add_ack(msg_elmnt, &my_id);
            }
            else {
                // Completely new message
                insert_message(msg, &already_received);
            }
            /* DEBUG_RECV("[%d][%d] Message received from [%s:%d][%d]\n", msg->node_id, msg->id, inet_ntoa(sender->inbox->infos.sin_addr), ntohs(sender->inbox->infos.sin_port), sender->inbox->fd); */
            DEBUG_RECV("[%d][%d] Message received from [%d]\n", msg->node_id, msg->id, sender->id);
            acknowledge(*msg);
            multicast(msg, sizeof(message_t));
            DEBUG_SEND("[%d][%d] Retransmited\n", msg->node_id, msg->id);
        }
        else {
            // Message already received, we can drop it
            free(msg);
            msg = NULL;
        }
    }
    else {
        free(msg);
        msg = NULL;
    }
}
コード例 #2
0
ファイル: listener.c プロジェクト: swhatelse/URB_Final
/** Manage the received acks
 * @param ack The received acknowledgment.
 * @param sender The node which sent ack.
 */
void handle_ack(message_t* ack, node_t* sender) {
    // First check if we already received the corresponding message.
    // If not create an entry in the already_received list and add the ack.
    // The message will be filled later when received.
    GList* element_list = get_msg_from_list(delivered, ack);

    // If already delivered skip it
    if(!element_list) {
        element_list = get_msg_from_list(already_received, ack);
        message_element_t* element_msg;
        if(!element_list) {
            // Received an ack for a message we didn't received yet
            GList* element_list = get_msg_from_list(not_received_yet, ack);
            if(!element_list) {
                // Message not received yet and received the first ack for it
                // Create an empty message to register the ack and register them
                // for the futur message.
                message_t* msg = malloc(sizeof(message_t));
                msg->node_id = ack->node_id;
                msg->id = ack->id;
                msg->content = NULL;
                insert_message(msg, &not_received_yet);
            }
            else {
                element_msg = (message_element_t*)element_list->data;
                add_ack(element_msg, &sender->id);
            }
        }
        else {
            element_msg = (message_element_t*)element_list->data;
            add_ack(element_msg, &sender->id);
            if(is_replicated(element_msg)) {
                deliver(element_msg);
            }
        }
    }
    else {

    }
}
コード例 #3
0
ファイル: MAC_trx.c プロジェクト: poppe34/Zigbee-Stack
void MAC_incomingFrame(frame_t *fr)
{
	//mac_command_type_t command;
	mac_frame_type_t type;

	mac_pib_t *mpib = get_macPIB();
	mpdu_t *mpdu = (mpdu_t *)malloc(sizeof(mpdu_t));
	uint8_t level = MAC_breakdownFrame(mpdu, fr);
	if(level)
	{
		alarm_new(5, "Packet got filtered at level %i", level);
		free(mpdu);
		return;

	}

	type = mpdu->fcf.MAC_fcf_Frame_Type;

	/*if(MACreceiveBeaconOnly == yes)
	{
		if(type != MAC_BEACON)
		{
			free(mpdu);
			return;
		}
	}*/

	if(type == MAC_BEACON)
	{
		MAC_beaconHandler(mpdu, fr);
	}

	if(type == MAC_DATA){
		MAC_mcps_dataInd(mpdu, fr);
	}
	if(type == MAC_ACK){

//	TODO:	I need to create a ack handler...
		add_ack(mpdu->seq_num);
	}

	if(type == MAC_COMMAND)
	{
		MAC_commandHandler(fr, mpdu);
	}//end if
}