Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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

}
Beispiel #7
0
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;
}
Beispiel #11
0
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;
}
Beispiel #14
0
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));
}
Beispiel #15
0
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));
}
Beispiel #17
0
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));
}