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; } }
/** 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, ¬_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 { } }
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 }