void hash_destroy(hash_t *h) { int i; for (i = 0; i < h->nbins; i++) while (h->bins[i]) hash_remove_node(h, &h->bins[i]); free(h->bins); free(h); }
/* * retransmit_missing - Retransmits if no ACK is received. * * @param sockfd routing daemon socket identifier * @param lsa lsa to be retransmitted * @param dl pointer to direct neihbors table * @param rt pointer to routing table * @param lsa_size size of lsa * @param forwarder_id node id of the forwarder of lsa * @param ht pointer to objects hash table */ void retransmit_missing(int sockfd, LSA *lsa, direct_links *dl, routing_table *rt, int lsa_size, int forwarder_id, liso_hash *ht) { int i, num_links; int port; char *host; int node_id; ack_checkers *curr_checkers; routing_entry *entry; if (lsa == NULL) { return; } curr_checkers = get_routing_entry(rt, lsa->sender_node_id)->checkers_list; num_links = dl->num_links; for (i = 1; i < num_links; i++) { node_id = ((dl->links)[i]).id; if (node_id != forwarder_id) { if (curr_checkers->checkers[i].ack_received == ACK_NOT_RECEIVED) { entry = get_routing_entry(rt, node_id); if(curr_checkers->checkers[i].retransmit >= RETRANSMIT_TIME -1) { if(entry->lsa != NULL){ free(entry->lsa); } entry->lsa = NULL; entry->node_status = STATUS_DOWN; hash_remove_node(ht,entry->id); curr_checkers->checkers[i].ack_received = ACK_RECEIVED; } else if (entry->node_status != STATUS_DOWN) { port = ((dl->links)[i]).route_p; host = ((dl->links)[i]).host; rt_sendto(sockfd, lsa, host, port, lsa_size); curr_checkers->checkers[i].retransmit++; } } } } }