void delete_association_set_for_timeout(struct olsrv2 *olsr){ OLSR_LIST_ENTRY *entry = NULL, *list_entry = NULL, *del = NULL; OLSR_ASSOCIATION_TUPLE *data = NULL, *list_data = NULL; int hash_index, i; olsr_time_t time; //return; // olsr_cnf->debug_level = 9; //print_association_set(olsr); //olsr_cnf->debug_level = 0; get_current_time(olsr, &time); for(hash_index = 0; hash_index < HASHSIZE; hash_index++) { entry = olsr->associ_set[hash_index].list.head; while(entry) { data = (OLSR_ASSOCIATION_TUPLE *)entry->data; del = entry; entry = entry->next; if(olsr_cmp_time(data->NA_time, time) < 0) { for(i = 0; i < data->num_NAlist; i++) { list_entry = data->NA_list[i]; list_data = (OLSR_ASSOCIATION_TUPLE *)list_entry->data; if(list_entry == entry) { entry = entry->next; } free(list_data->NA_list); OLSR_DeleteListEntry(&olsr->associ_set[olsr_hashing(olsr, &list_data->NA_iface_addr)].list, list_entry); } free(data->NA_list); OLSR_DeleteListEntry(&olsr->associ_set[olsr_hashing(olsr, &data->NA_iface_addr)].list, del); olsr->change_associ_set = OLSR_TRUE; } } } }
void build_tlv_attached_network_by_list(void *olsr, olsr_pktbuf_t *buf, OLSR_LIST *addr_list) { OLSR_LIST tlv_block; OLSR_InitList(&tlv_block); OLSR_LIST_ENTRY* tmp = NULL, *tmp1 = NULL, * next = NULL; BLOCK_DATA* data = NULL, *tmpData = NULL; tmp = addr_list->head; while(tmp) { data = (BLOCK_DATA* )tmp->data; create_tlv_by_list(olsr, &tlv_block, addr_list, PREFIX_LENGTH, data->Prefix_Length); tmp1 = tmp->next; while(tmp1){ tmpData = (BLOCK_DATA* )tmp1->data; next = tmp1->next; if(data->Prefix_Length == tmpData->Prefix_Length){ OLSR_DeleteListEntry(addr_list, tmp1); } tmp1 = next; } //delete current entry also tmp1 = tmp->next; OLSR_DeleteListEntry(addr_list, tmp); tmp = tmp1; } build_tlv_msg(buf, &tlv_block); free_tlv_block(&tlv_block); }
void delete_association_set_for_addr(struct olsrv2 *olsr, OLSR_LIST *iface_list){ OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *local_iface_data = NULL; OLSR_ASSOCIATION_TUPLE *associ_data = NULL, *associ_list_data = NULL; OLSR_LIST *retList = NULL; OLSR_LIST_ENTRY *entry = NULL,*list_entry = NULL; int i, tmp_index; entry = iface_list->head; while(entry){ local_iface_data = (OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *)entry->data; retList = search_association_set_for_addr(olsr, &local_iface_data->iface_addr); if(retList){ if(retList->numEntry != 1){ olsr_error("delete_association_set_for_addr"); } associ_data = (OLSR_ASSOCIATION_TUPLE *)retList->head->data; OLSR_DeleteList_Search(retList); for(i = 0; i < associ_data->num_NAlist; i++) { list_entry = (OLSR_LIST_ENTRY *)associ_data->NA_list[i]; associ_list_data = (OLSR_ASSOCIATION_TUPLE *)list_entry->data; tmp_index = olsr_hashing(olsr,&associ_list_data->NA_iface_addr); free(associ_list_data->NA_list); OLSR_DeleteListEntry(&olsr->associ_set[tmp_index].list, list_entry); } free(associ_data->NA_list); if(OLSR_DeleteListHandler((void* )olsr, &olsr->associ_set[olsr_hashing(olsr,&associ_data->NA_iface_addr)].list, (void* )&local_iface_data->iface_addr, &delete_association_set_for_addr_handler)){ olsr->change_associ_set = OLSR_TRUE; } }//if entry = entry->next; }//while }