OLSR_LIST *search_routing_set_for_dest(struct olsrv2 *olsr, union olsr_ip_addr *addr) { return OLSR_SearchList((void*)olsr,&olsr->routing_set[olsr_hashing(olsr,addr)].list, (void* )addr, &search_routing_set_for_dest_handler); }
olsr_bool search_routing_set_for_dest_exist(struct olsrv2 *olsr, union olsr_ip_addr *addr) { return OLSR_CheckMatchExist((void*)olsr,&olsr->routing_set[olsr_hashing(olsr,addr)].list, (void* )addr, &search_routing_set_for_dest_handler); }
OLSR_LIST * search_proc_set(struct olsrv2 *olsr, union olsr_ip_addr orig_addr, olsr_u16_t seq_number, olsr_u8_t type) { OLSR_LIST *result = NULL; //WIN FIX: explicit typecast required char *search = (char *)olsr_malloc(sizeof(union olsr_ip_addr)+sizeof(olsr_u16_t)+sizeof(olsr_u8_t), __FUNCTION__); memcpy(search, &orig_addr, sizeof(union olsr_ip_addr)); search += sizeof(union olsr_ip_addr); memcpy(search, &seq_number, sizeof(olsr_u16_t)); search += sizeof(olsr_u16_t); memcpy(search, &type, sizeof(olsr_u8_t)); search -= sizeof(olsr_u16_t); search -= sizeof(union olsr_ip_addr); //struct olsrv2 result = OLSR_SearchList((void*)olsr,&olsr->proc_set[olsr_hashing(olsr,&orig_addr)].list, (void* )&search, &search_proc_set_handler); free(search); return result; }
olsr_bool search_association_set_for_addr_exist(struct olsrv2 *olsr, union olsr_ip_addr *addr){ OLSR_ASSOCIATION_TUPLE search; olsr_ip_copy(olsr, &search.NA_iface_addr, addr); return OLSR_CheckMatchExist((void*)olsr, &olsr->associ_set[olsr_hashing(olsr,addr)].list, (void* )&search, &search_association_set_for_addr_handler); }
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 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 }
void insert_routing_set(struct olsrv2 *olsr, union olsr_ip_addr *dest_iface_addr, const union olsr_ip_addr *next_iface_addr, olsr_u8_t prefix_length, olsr_u16_t dist, const union olsr_ip_addr *iface_addr) { OLSR_ROUTING_TUPLE data; //Multi path check if (OLSR_TRUE) { if (search_routing_set_for_dest_exist(olsr, dest_iface_addr) == OLSR_TRUE ||//yowada add match_local_iface_addr(olsr, dest_iface_addr) == OLSR_TRUE) { if (DEBUG_OLSRV2) { char* paddr = olsr_niigata_ip_to_string(olsr, dest_iface_addr); olsr_printf("Route %s has already exist! hopcount = %d\n",paddr,dist); free(paddr); } return; //olsr_error("Multi path!!\n"); } } //Fix for Solaris //data.R_dest_iface_addr = *dest_iface_addr; //data.R_next_iface_addr = *next_iface_addr; olsr_ip_copy(olsr, &data.R_dest_iface_addr, dest_iface_addr); olsr_ip_copy(olsr, &data.R_next_iface_addr, next_iface_addr); data.R_prefix_length = prefix_length; data.R_dist = dist; //data.R_iface_addr = *iface_addr; olsr_ip_copy(olsr, &data.R_iface_addr, iface_addr); /* assert(equal_ip_addr(olsr_cnf->ip_version, data.R_dest_iface_addr, data.R_iface_addr) == OLSR_FALSE); */ if (equal_ip_addr(olsr, &data.R_dest_iface_addr, &data.R_iface_addr)) { return; } OLSR_InsertList(&olsr->routing_set[olsr_hashing(olsr,&data.R_dest_iface_addr)].list, &data, sizeof(OLSR_ROUTING_TUPLE)); /* OLSR_InsertList_Sort(&olsr->routing_set, */ /* &data, */ /* sizeof(OLSR_ROUTING_TUPLE), */ /* sort_routing_set_handler); */ }
OLSR_LIST *lookup_topology_set(struct olsrv2 *olsr, union olsr_ip_addr *T_last_addr ) { OLSR_LIST *result = NULL; result = OLSR_SearchList((void*)olsr,&olsr->topology_set[olsr_hashing(olsr,T_last_addr)].list, &T_last_addr, &lookup_topology_set_handler); return result; }
void insert_association_set(struct olsrv2 *olsr, OLSR_LIST *iface_list, double validity_time){ OLSR_LIST_ENTRY **entry = NULL, *iface_entry = NULL; OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *local_iface_data = NULL; int i,j, seq, listNum; OLSR_ASSOCIATION_TUPLE *data = NULL; listNum = iface_list->numEntry; entry = (OLSR_LIST_ENTRY **)olsr_malloc(listNum * sizeof(OLSR_LIST_ENTRY *), __FUNCTION__); for(i = 0; i < listNum; i++) { entry[i] = (OLSR_LIST_ENTRY *)olsr_malloc(sizeof(OLSR_LIST_ENTRY), __FUNCTION__); entry[i]->data = (OLSR_ASSOCIATION_TUPLE *)olsr_malloc(sizeof(OLSR_ASSOCIATION_TUPLE), __FUNCTION__); entry[i]->size = sizeof(OLSR_ASSOCIATION_TUPLE); } iface_entry = iface_list->head; i = 0; while(iface_entry) { local_iface_data = (OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *)iface_entry->data; data = (OLSR_ASSOCIATION_TUPLE *)entry[i]->data; get_current_time(olsr, &data->NA_time); update_time(&data->NA_time, (olsr_32_t)validity_time); olsr_ip_copy(olsr, &data->NA_iface_addr, &local_iface_data->iface_addr); data->num_NAlist = listNum -1; data->NA_list = (OLSR_LIST_ENTRY **)olsr_malloc(sizeof(OLSR_LIST_ENTRY*) * (listNum-1), __FUNCTION__); seq = 0; for(j = 0; j < listNum; j++) { if(i == j) continue; data->NA_list[seq++] = entry[j]; } OLSR_InsertListEntry(&olsr->associ_set[olsr_hashing(olsr,&data->NA_iface_addr)].list, entry[i]); iface_entry = iface_entry->next; i++; } free(entry); }
OLSR_LIST * search_topology_set_for_last(struct olsrv2 *olsr, union olsr_ip_addr *last_addr) { OLSR_LIST *result = NULL; result = OLSR_SearchList((void*)olsr,&olsr->topology_set[olsr_hashing(olsr,last_addr)].list, (void* )last_addr, &search_topology_set_handler_for_last); return result; }
void delete_routing_set_old(struct olsrv2 *olsr, union olsr_ip_addr *dest_iface_addr, const union olsr_ip_addr *next_iface_addr) { OLSR_ROUTING_TUPLE todelete; olsr_ip_copy(olsr, &todelete.R_dest_iface_addr, dest_iface_addr); olsr_ip_copy(olsr, &todelete.R_next_iface_addr, next_iface_addr); OLSR_DeleteListHandler((void*)olsr, &olsr->routing_set_old[olsr_hashing(olsr,dest_iface_addr)].list, (void* )&todelete, &delete_routing_set_old_handler); }
void delete_topology_set_for_same_entry(struct olsrv2 *olsr, const union olsr_ip_addr *orig_addr, olsr_u16_t ASSN) { OLSR_TOPOLOGY_TUPLE todelete; olsr_ip_copy(olsr, &todelete.T_last_iface_addr, orig_addr); todelete.T_seq = ASSN; olsr->change_topology_set = OLSR_DeleteListHandler((void*)olsr,&olsr->topology_set[olsr_hashing(olsr,orig_addr)].list, (void* )&todelete, &delete_topology_set_for_same_entry_handler); }
OLSR_LIST * search_topology_set(struct olsrv2 *olsr, const union olsr_ip_addr *adv_neighbor_addr, union olsr_ip_addr *orig_addr) { OLSR_LIST *result = NULL; OLSR_TOPOLOGY_TUPLE search; olsr_ip_copy(olsr, &search.T_dest_iface_addr, adv_neighbor_addr); olsr_ip_copy(olsr, &search.T_last_iface_addr, orig_addr); result = OLSR_SearchList((void*)olsr,&olsr->topology_set[olsr_hashing(olsr,orig_addr)].list, (void* )&search, &search_topology_set_handler); return result; }
void insert_proc_set(struct olsrv2 *olsr, union olsr_ip_addr orig_addr, olsr_u16_t seq_number, olsr_u8_t type) { OLSR_PROC_TUPLE data; data.P_type = type; data.P_addr = orig_addr; data.P_seq_number = seq_number; get_current_time(olsr, &data.P_time); update_time(&data.P_time,(olsr_32_t)olsr->qual_cnf->duplicate_hold_time); //struct olsrv2 OLSR_InsertList(&olsr->proc_set[olsr_hashing(olsr,&orig_addr)].list, &data, sizeof(OLSR_PROC_TUPLE)); }
OLSR_LIST *search_routing_set_old_for_next_and_dest( struct olsrv2* olsr, union olsr_ip_addr *dest_iface_addr, const union olsr_ip_addr *next_iface_addr) { OLSR_LIST *result = NULL; OLSR_ROUTING_TUPLE search; olsr_ip_copy(olsr, &search.R_dest_iface_addr, dest_iface_addr); olsr_ip_copy(olsr, &search.R_next_iface_addr, next_iface_addr); result = OLSR_SearchList((void*)olsr,&olsr->routing_set_old[olsr_hashing(olsr,dest_iface_addr)].list, (void* )&search, &search_routing_set_for_next_and_dest_handler); return result; }
void insert_topology_set(struct olsrv2 *olsr, const union olsr_ip_addr *adv_neighbor_addr, union olsr_ip_addr *orig_addr, olsr_u16_t ASSN) { OLSR_TOPOLOGY_TUPLE data; //Fix for Solaris //data.T_dest_iface_addr = *adv_neighbor_addr; //data.T_last_iface_addr = *orig_addr; olsr_ip_copy(olsr, &data.T_dest_iface_addr, adv_neighbor_addr); olsr_ip_copy(olsr, &data.T_last_iface_addr, orig_addr); data.T_seq = ASSN; get_current_time(olsr, &data.T_time); update_time(&data.T_time,(olsr_32_t)olsr->qual_cnf->topology_hold_time); OLSR_InsertList(&olsr->topology_set[olsr_hashing(olsr,orig_addr)].list, &data, sizeof(OLSR_TOPOLOGY_TUPLE)); }
void insert_routing_set_old(struct olsrv2 *olsr, const union olsr_ip_addr *dest_iface_addr, const union olsr_ip_addr *next_iface_addr, olsr_u8_t prefix_length, olsr_u16_t dist, const union olsr_ip_addr *iface_addr) { OLSR_ROUTING_TUPLE data; //Fix for Solaris //data.R_dest_iface_addr = *dest_iface_addr; //data.R_next_iface_addr = *next_iface_addr; olsr_ip_copy(olsr, &data.R_dest_iface_addr, dest_iface_addr); olsr_ip_copy(olsr, &data.R_next_iface_addr, next_iface_addr); data.R_prefix_length = prefix_length; data.R_dist = dist; //data.R_iface_addr = *iface_addr; olsr_ip_copy(olsr, &data.R_iface_addr, iface_addr); OLSR_InsertList(&olsr->routing_set_old[olsr_hashing(olsr,&data.R_dest_iface_addr)].list, &data, sizeof(OLSR_ROUTING_TUPLE)); }