示例#1
0
文件: destroy.c 项目: dpt/PrivateEye
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);
}
示例#2
0
/*
 * 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++;
                }
            }
        }
    }
}