Esempio n. 1
0
/*
 * Create <tlv> for ...
 */
static void
create_tlv_for_index_hello(olsr_pktbuf_t *buf,
    BASE_ADDRESS *base,
    olsr_u32_t index, olsr_u8_t tlv_type, olsr_u8_t tlv_value)
{
  switch (tlv_type)
    {
    case Link_Status:
      if (base->data[index].link_status == tlv_value)
    create_simple_tlv(buf, tlv_type, SINGLE_INDEX, 1, 0, 0, &tlv_value);
      break;
    case Other_Neigh:
      if(base->data[index].other_neigh == tlv_value)
    create_simple_tlv(buf, tlv_type, SINGLE_INDEX, 1, 0, 0, &tlv_value);
      break;
    case Other_If:
      if (base->data[index].other_if== tlv_value)
    create_simple_tlv(buf, tlv_type, (SINGLE_INDEX | NO_VALUE), 1, 0, 0, &tlv_value);
      break;

    case MPR_Selection:
      if (base->data[index].MPR_Selection == tlv_value)
    create_simple_tlv(buf, tlv_type, (SINGLE_INDEX | NO_VALUE), 1, 0, 0, &tlv_value);
      break;


    default:
      olsr_error("%s\n", __FUNCTION__);
    }
}
Esempio n. 2
0
/* change output from stdout to anything */
void set_std_handler(const char *handler){

  if( (std_handler = fopen(handler,"w")) == NULL)
    olsr_error("fopen()");

  return;
}
Esempio n. 3
0
void print_mpr_set_per_interface(struct olsrv2* olsr, OLSR_LIST *MPR_set)
{
  OLSR_LIST_ENTRY *tmp = NULL;
  OLSR_MPR_TUPLE *data = NULL;

  tmp = MPR_set->head;
  if (tmp == NULL){
    olsr_printf( "--- MPR Set per Interface ---\n");
    olsr_printf( "no entry.\n");
    olsr_printf( "-----------------------------\n");

  }else{
    if (olsr->olsr_cnf->ip_version == AF_INET){
      char str1[INET_ADDRSTRLEN], str2[INET_ADDRSTRLEN];

      olsr_printf( "------------ MPR Set per Interface ------------\n");
      olsr_printf( "%-20s %-16s\n", "local_iface_addr", "MPR_if_addr");
      olsr_printf( "-----------------------------------------------\n");
      while (tmp != NULL){
    data = (OLSR_MPR_TUPLE *)tmp->data;
    //inet_ntop(AF_INET, &data->local_iface_addr.v4, str1, sizeof(str1));
    //inet_ntop(AF_INET, &data->MPR_if_addr.v4, str2, sizeof(str2));
    ConvertIpv4AddressToString(data->local_iface_addr.v4, str1);
    ConvertIpv4AddressToString(data->MPR_if_addr.v4, str2);
    olsr_printf( "%-20s %-16s\n", str1, str2);

    tmp = tmp->next;
      }

      olsr_printf( "----------------------------------------------\n");
    }

    else if (olsr->olsr_cnf->ip_version == AF_INET6){
      char str1[INET6_ADDRSTRLEN], str2[INET6_ADDRSTRLEN];

      olsr_printf( "--------------------------- MPR Set per Interface ---------------------------\n");
      olsr_printf( "%-46s %-46s\n", "local_iface_addr", "MPR_if_addr");
      olsr_printf( "-----------------------------------------------------------------------------\n");
      while (tmp != NULL){
    data = (OLSR_MPR_TUPLE *)tmp->data;
    //inet_ntop(AF_INET6,
    //    data->local_iface_addr.v6.s6_addr, str1, sizeof(str1));
    //inet_ntop(AF_INET6,
    //    data->MPR_if_addr.v6.s6_addr, str2, sizeof(str2));
    ConvertIpv6AddressToString(&data->local_iface_addr.v6, str1, (olsr_bool)false);
    ConvertIpv6AddressToString(&data->MPR_if_addr.v6, str2, (olsr_bool)false);
    olsr_printf( "%-46s %-46s\n", str1, str2);
    tmp = tmp->next;
      }

      olsr_printf( "-----------------------------------------------------------------------------\n");
    }

    else{
      olsr_error("Un known ip_version");
      assert(OLSR_FALSE);
    }
  }
}
void print_relay_set(struct olsrv2 *olsr)
{
  OLSR_LIST_ENTRY *tmp = NULL;
  OLSR_RELAY_TUPLE *data = NULL;

  if(olsr->olsr_cnf->debug_level < 2)
    return;
  tmp = olsr->relay_set.head;
  if(tmp == NULL){
    olsr_printf("---  Relay Set ---\n");
    olsr_printf("no entry.\n");
    olsr_printf("----------------------------\n");
  }else{
    if(olsr->olsr_cnf->ip_version == AF_INET){
      char str[INET_ADDRSTRLEN];

      olsr_printf("-------------- Relay Neighbor Set --------------\n");
      olsr_printf("%-16s\n", "RS_if_addr");
      olsr_printf("--------------------------------------------------\n");
      while(tmp != NULL){
    data = (OLSR_RELAY_TUPLE *)tmp->data;
    //WIN FIX: Need to resolve this
    //inet_ntop(AF_INET, &data->RS_if_addr.v4, str, sizeof(str));
    ConvertIpv4AddressToString(data->RS_if_addr.v4, str);

    olsr_printf("%-16s\n", str);
    tmp = tmp->next;
      }

      olsr_printf("--------------------------------------------------\n");
    }

    else if(olsr->olsr_cnf->ip_version == AF_INET6){
      char str[INET6_ADDRSTRLEN];

      olsr_printf("---------------------------- Relay Set ------------------------------\n");
      olsr_printf("%-46s\n", "RS_if_addr");
      olsr_printf("--------------------------------------------------------------------------------\n");
      while(tmp != NULL){
    data = (OLSR_RELAY_TUPLE *)tmp->data;
    //WIN FIX: Need to resolve this
    //inet_ntop(AF_INET6, data->RS_if_addr.v6.s6_addr, str, sizeof(str));
    ConvertIpv6AddressToString(&data->RS_if_addr.v6, str, OLSR_FALSE);

    olsr_printf("%-46s\n", str);
    tmp = tmp->next;
      }

      olsr_printf("--------------------------------------------------------------------------------\n");
    }

    else{
      olsr_error("Un known ip_version");
      assert(OLSR_FALSE);
    }
  }
}
Esempio n. 5
0
void print_mprN2(struct olsrv2* olsr, OLSR_LIST *N2)
{
  OLSR_LIST_ENTRY *tmp = NULL;
  OLSR_MPR_N_TUPLE *data = NULL;

  tmp = N2->head;
  if (tmp == NULL){
    olsr_printf( "--- MPR N2 ---\n");
    olsr_printf( "no entry.\n");
    olsr_printf( "--------------\n");

  }else{
    if (olsr->olsr_cnf->ip_version == AF_INET){
      char str[INET_ADDRSTRLEN];

      olsr_printf( "----- MPR N2 -----\n");
      olsr_printf( "%-16s\n", "MPR_N2_if_addr");
      olsr_printf( "------------------\n");
      while (tmp != NULL){
    data = (OLSR_MPR_N_TUPLE *)tmp->data;
    //inet_ntop(AF_INET, &data->addr.v4, str, sizeof(str));
    ConvertIpv4AddressToString(data->addr.v4, str);
    olsr_printf( "%-16s\n", str);
    tmp = tmp->next;
      }

      olsr_printf( "------------------\n");
    }

    else if (olsr->olsr_cnf->ip_version == AF_INET6){
      char str[INET6_ADDRSTRLEN];

      olsr_printf( "------------------- MPR N2 -------------------\n");
      olsr_printf( "%-46s\n", "MPR_N2_if_addr");
      olsr_printf( "----------------------------------------------\n");
      while (tmp != NULL){
    data = (OLSR_MPR_N_TUPLE *)tmp->data;
    //inet_ntop(AF_INET6, data->addr.v6.s6_addr, str, sizeof(str));
    ConvertIpv6AddressToString(&data->addr.v6, str, (olsr_bool)false);
    olsr_printf( "%-46s\n", str);
    tmp = tmp->next;
      }

      olsr_printf( "----------------------------------------------\n");
    }

    else{
      olsr_error("Un known ip_version");
      assert(OLSR_FALSE);
    }
  }
}
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

}
Esempio n. 7
0
void print_proc_set(struct olsrv2 *olsr)
{
  OLSR_LIST_ENTRY *tmp = NULL;
  OLSR_PROC_TUPLE *data = NULL;
  struct olsrd_config* olsr_cnf = olsr->olsr_cnf;
  int i;

  if (olsr_cnf->debug_level < 2)
    return;

  olsr_printf("--- Processed Set ---\n");
  //struct olsrv2
  for (i=0; i<HASHSIZE; i++)
  {
      tmp = olsr->proc_set[i].list.head;

      if (tmp != NULL){
      if (olsr_cnf->ip_version == AF_INET){
          char str[INET_ADDRSTRLEN];

          olsr_printf("%-16s %-12s %-12s\n", "P_addr", "P_seq_number", "P_time");
          while (tmp != NULL){
          char time[30];

          data = (OLSR_PROC_TUPLE *)tmp->data;
          //WIN FIX: Need to resolve this
          //inet_ntop(AF_INET, &data->P_addr.v4, str, sizeof(str));
          ConvertIpv4AddressToString(data->P_addr.v4, str);

          qualnet_print_clock_in_second(data->P_time, time);
          olsr_printf("%-16s %-12d %s [sec]\n", str, data->P_seq_number, time);

          tmp = tmp->next;
          }

      }

      else if (olsr_cnf->ip_version == AF_INET6){
          char str[INET6_ADDRSTRLEN];

          olsr_printf("%-46s %-12s %-12s\n", "P_addr", "P_seq_number", "P_time");
          while (tmp != NULL){
          char time[30];

          data = (OLSR_PROC_TUPLE *)tmp->data;
          //WIN FIX: Need to resolve this
          //inet_ntop(AF_INET6, data->P_addr.v6.s6_addr, str, sizeof(str));
          ConvertIpv6AddressToString(&data->P_addr.v6, str, OLSR_FALSE);

          qualnet_print_clock_in_second(data->P_time, time);
          olsr_printf("%-46s %-12d %s [sec]\n", str, data->P_seq_number, time);

          tmp = tmp->next;
          }

      }

      else{
          olsr_error("Un known ip_version");
          assert(OLSR_FALSE);
      }
      }
  }
  olsr_printf("-------------------\n");
}
Esempio n. 8
0
void print_mprN(struct olsrv2* olsr, OLSR_LIST *N)
{
  OLSR_LIST_ENTRY *tmp = NULL;
  OLSR_MPR_N_TUPLE *data = NULL;

  tmp = N->head;
  if (tmp == NULL){
    olsr_printf("--- MPR N  ---\n");
    olsr_printf("no entry.\n");
    olsr_printf("--------------\n");

  }else{
    if (olsr->olsr_cnf->ip_version == AF_INET){
      char str[INET_ADDRSTRLEN];

      olsr_printf("------------------------ MPR N -----------------------\n");
      olsr_printf("%-16s %-12s %-12s %-12s\n",
          "MPR_N_if_addr", "D", "reachability", "willingness");
      olsr_printf("------------------------------------------------------\n");
      while (tmp != NULL){
    data = (OLSR_MPR_N_TUPLE *)tmp->data;
    //inet_ntop(AF_INET, &data->addr.v4, str, sizeof(str));
    //yowada
    ConvertIpv4AddressToString(data->addr.v4, str);
    olsr_printf("%-16s %-12u %-12u %-12u\n",
           str,
           data->D,
           data->reachability,
           data->willingness);
    tmp = tmp->next;
      }

      olsr_printf("------------------------------------------------------\n");
    }

    else if (olsr->olsr_cnf->ip_version == AF_INET6){
      char str[INET6_ADDRSTRLEN];

      olsr_printf("--------------------------------------- MPR N --------------------------------------\n");
      olsr_printf("%-46s %-12s %-12s %-12s\n",
          "MPR_N_if_addr", "D", "reachability", "willingness");
      olsr_printf("------------------------------------------------------------------------------------\n");
      while (tmp != NULL){
    data = (OLSR_MPR_N_TUPLE *)tmp->data;
    //inet_ntop(AF_INET6, data->addr.v6.s6_addr, str, sizeof(str));
    ConvertIpv6AddressToString(&data->addr.v6, str, OLSR_FALSE);
    olsr_printf("%-46s %-12u %-12u %-12u\n",
            str,
            data->D,
            data->reachability,
            data->willingness);
    tmp = tmp->next;
      }

      olsr_printf("------------------------------------------------------------------------------------\n");
    }

    else{
      olsr_error("Un known ip_version");
      assert(OLSR_FALSE);
    }
  }
}
Esempio n. 9
0
OLSR_LIST *proc_mpr_set_per_interface(struct olsrv2 *olsr,
                      union olsr_ip_addr *local_iface_addr)
{
  OLSR_LIST *MPR_set = NULL, N, N2;

  OLSR_LIST *retList = NULL;
  OLSR_LIST_ENTRY *tmp = NULL, *retList_tmp = NULL;
  OLSR_LINK_TUPLE *link_data = NULL;
  OLSR_2NEIGH_TUPLE *two_neigh_data = NULL;
  OLSR_MPR_N_TUPLE *mpr_n_data = NULL;
  OLSR_MPR_N2_TUPLE *mpr_n2_data = NULL;

  int hash_index;
  olsr_time_t time;
  get_current_time(olsr, &time);

  if (DEBUG_OLSRV2)
  {
      olsr_printf("\n[Start MPR selection per interface]\n");
  }

  //Init MPR set
  MPR_set = (OLSR_LIST *)olsr_malloc(sizeof(OLSR_LIST), __FUNCTION__);
  OLSR_InitList(MPR_set);

  //Create MPR N
  // N - the set of such neighbor interfaces
  if (DEBUG_OLSRV2)
  {
      olsr_printf("[Create N]\n");
      olsr_printf("[Appendix A.2]\n");
  }
  OLSR_InitList(&N);

  tmp = olsr->link_set.head;
  while (tmp != NULL){
    link_data = (OLSR_LINK_TUPLE *)tmp->data;
    if (link_data->L_willingness > WILL_NEVER &&
       get_link_status(time,
               link_data->L_SYM_time,
               link_data->L_ASYM_time,
               link_data->L_LOST_LINK_time) == SYMMETRIC){
      if (equal_ip_addr(olsr, &link_data->L_local_iface_addr,
               local_iface_addr)){


    if (search_mprN_for_exist(olsr, &N, &link_data->L_neighbor_iface_addr)
       == OLSR_FALSE){


      // Calculate D(y), where y is a member of N, for all interfaces in N.
      int retNum = check_2neigh_set_for_mpr_n_exist_num_entry(olsr, local_iface_addr,
                                &link_data->L_neighbor_iface_addr);
      if (retNum > 0){
        insert_mprN(&N, &link_data->L_neighbor_iface_addr,
            /*retList->numEntry*/retNum, 0,
            link_data->L_willingness);

      }
    }
      }
    }
    tmp = tmp->next;
  }

  //print_mprN(olsr, &N);

  //Create MPR N2
  // N2 - the set of such 2-hop neighbor interfaces
  if (DEBUG_OLSRV2)
  {
      olsr_printf("[Create N2]\n");
  }

  OLSR_InitList(&N2);
  for (hash_index = 0; hash_index < HASHSIZE; hash_index++)
    {
      tmp = olsr->two_neigh_set[hash_index].list.head;
      while (tmp != NULL){
    two_neigh_data = (OLSR_2NEIGH_TUPLE *)tmp->data;

    if (search_mprN_for_exist(olsr, &N, &two_neigh_data->N2_neighbor_iface_addr)
       == OLSR_TRUE &&
       search_association_set_for_addr_exist(olsr, &two_neigh_data->N2_2hop_iface_addr)
       == OLSR_FALSE){

      if (equal_ip_addr(olsr, &two_neigh_data->N2_local_iface_addr,
               local_iface_addr)){
        if (search_mprN_for_exist(olsr, &N, &two_neigh_data->N2_2hop_iface_addr)
           == OLSR_TRUE){
          tmp = tmp->next;
          continue;
        }


        if (search_mprN2_for_exist(olsr, &N2, &two_neigh_data->N2_2hop_iface_addr) == OLSR_FALSE)
        {
          insert_mprN2(&N2, &two_neigh_data->N2_2hop_iface_addr);
        }
      }

    }
    tmp = tmp->next;
      }
    }
  //print_mprN2(olsr, &N2);


  //Appendix A.1
  // Start with an MPR set made of all members of N with N_willingness
  // equal to WILL_ALWAYS
  if (DEBUG_OLSRV2)
  {
      olsr_printf("[Appendix A.1]\n");
  }

  tmp = N.head;
  while (tmp != NULL){
    mpr_n_data = (OLSR_MPR_N_TUPLE *)tmp->data;
    if (mpr_n_data->willingness == WILL_ALWAYS)
      insert_mpr_set_per_interface(MPR_set, local_iface_addr, &mpr_n_data->addr);
    tmp = tmp->next;
  }

  update_mprN2(olsr,
           &N2, MPR_set, local_iface_addr);

  //print_mprN2(olsr, &N2);

  //Appendix A.3
  // Add to the MPR set those interfaces in N, which are the *only*
  // nodes to provide reachability to an interface in N2.  For
  // example, if interface B in N2 can be reached only through a
  // symmetric link to interface A in N, then add interface B to the
  // MPR set.  Remove the interfaces from N2 which are now covered by
  // a interface in the MPR set.
  if (DEBUG_OLSRV2)
  {
      olsr_printf("[Appendix A.3]\n");
  }

  tmp = N2.head;
  while (tmp != NULL){
    mpr_n2_data = (OLSR_MPR_N2_TUPLE *)tmp->data;
    retList =
      search_2neigh_set_for_mpr_n2(olsr,
                   local_iface_addr,
                   &mpr_n2_data->addr);
    if (retList != NULL){
      if (retList->numEntry == 1){

    two_neigh_data = (OLSR_2NEIGH_TUPLE *)retList->head->data;
    insert_mpr_set_per_interface(MPR_set,
                     local_iface_addr,
                     &two_neigh_data->N2_neighbor_iface_addr);
    update_mprN2_locally(olsr,
                 &N2,
                 local_iface_addr,
                 &two_neigh_data->N2_neighbor_iface_addr);
    tmp = N2.head;
    OLSR_DeleteList_Search(retList);
    continue;
      }
      OLSR_DeleteList_Search(retList);
    }

    tmp = tmp->next;
  }

  //print_mprN2(olsr, &N2);

  //Appendix A.4
  // While there exist interfaces in N2 which are not covered by at
  // least one interface in the MPR set:
  if (DEBUG_OLSRV2)
  {
      olsr_printf("[Appendix A.4]\n");
  }

  while (N2.head != NULL){
    //Appendix A.4.1
    // For each interface in N, calculate the reachability, i.e.,
    // the number of interfaces in N2 which are not yet covered by
    // at least one node in the MPR set, and which are reachable
    // through this neighbor interface;
    //OLSR_LIST *ret;

    olsr_u32_t max_willingness, max_reachability, max_D;
    olsr_u32_t i;
    union olsr_ip_addr mpr_addr;
    union olsr_ip_addr random_mpr[OLSR_MAX_DUPLICATE_MPR];

    memset(&mpr_addr, 0, sizeof(olsr_ip_addr));

    if (DEBUG_OLSRV2)
    {
    olsr_printf("[Appendix A.4.1]\n");
    }


    tmp = N.head;
    while (tmp != NULL){
      mpr_n_data = (OLSR_MPR_N_TUPLE *)tmp->data;
      mpr_n_data->reachability = 0;

      retList =
    search_2neigh_set_for_mpr_n(olsr,
                    local_iface_addr,
                    &mpr_n_data->addr);

      if (retList != NULL){
    retList_tmp = retList->head;
    while (retList_tmp != NULL){
      two_neigh_data = (OLSR_2NEIGH_TUPLE *)retList_tmp->data;

      if (search_mprN2_for_exist(olsr, &N2, &two_neigh_data->N2_2hop_iface_addr)
         == OLSR_TRUE){
        mpr_n_data->reachability++;
      }

      retList_tmp = retList_tmp->next;
    }
    OLSR_DeleteList_Search(retList);
      }

      tmp = tmp->next;
    }

    //print_mprN(olsr, &N);


    //Appendix A.4.2(XXX)
    // Select as a MPR the interface with highest N_willingness
    // among the interfaces in N with non-zero reachability.
    // In case of multiple choice select the interface which provides
    // reachability to the maximum number of interfaces in N2.
    // In case of multiple interfaces providing the same amount of
    // reachability, select the interface as MPR whose D(y) is
    // greater.
    // Remove the interfaces from N2 which are now covered by an interface in the MPR set.

    tmp = N.head;
    max_willingness = WILL_NEVER; //0
    max_reachability = 0;
    max_D = 0;
    i = 0;

    while (tmp != NULL){
      mpr_n_data = (OLSR_MPR_N_TUPLE *)tmp->data;

      if (mpr_n_data->reachability == 0){
    tmp = tmp->next;
    continue;
      }

      //check willingness
      if (mpr_n_data->willingness > max_willingness){
    max_willingness = mpr_n_data->willingness;
    max_reachability = mpr_n_data->reachability;
    max_D = mpr_n_data->D;
    i = 0;
    mpr_addr = mpr_n_data->addr;
      }
      else if (mpr_n_data->willingness == max_willingness){

    //check reachability
    if (mpr_n_data->reachability > max_reachability){
      max_reachability = mpr_n_data->reachability;
      max_D = mpr_n_data->D;
      i = 0;
      mpr_addr = mpr_n_data->addr;
    }
    else if (mpr_n_data->reachability == max_reachability){

      //check D(y)
      if (mpr_n_data->D > max_D){
        max_D = mpr_n_data->D;
        i = 0;
        mpr_addr = mpr_n_data->addr;
      }
      else if (mpr_n_data->D == max_D){

        if (i == 0){
          random_mpr[i++] = mpr_addr;
        }
        if (i < OLSR_MAX_DUPLICATE_MPR){
          random_mpr[i++] = mpr_n_data->addr;
        }

      }
    }
      }
      tmp = tmp->next;

    }// ....now checked duplication

    if (max_willingness == WILL_NEVER){
      olsr_error("MPR selection is wrong "
         "there is no MPR which have available willingness, "
         "or non-zero-reachability");
    }

    if (i != 0){
      i = (olsr_u32_t)(random(olsr)%i);
      mpr_addr = random_mpr[i];
    }

    insert_mpr_set_per_interface(MPR_set,
                 local_iface_addr,
                 &mpr_addr);

    update_mprN2_locally(olsr,
             &N2,
             local_iface_addr,
             &mpr_addr);

    //print_mpr_set_per_interface(olsr, MPR_set);
  }

  //print_mpr_set_per_interface(olsr, MPR_set);

  if (DEBUG_OLSRV2)
  {
      olsr_printf("[Complete MPR selection per interface]\n\n");
  }

  OLSR_DeleteList_Static(&N);
  OLSR_DeleteList_Static(&N2);

  return MPR_set;
}
Esempio n. 10
0
void print_routing_set(struct olsrv2 *olsr)
{
  OLSR_LIST_ENTRY *tmp = NULL;
  OLSR_ROUTING_TUPLE *data = NULL;
  int i;

  if (olsr->olsr_cnf->debug_level < 2)
    return;

  olsr_printf("--- Routing Set ---\n");
  olsr_printf("%-17s %-17s %-12s %-16s %-10s\n",
     "R_dest_iface_addr", "R_next_iface_addr", "R_dist", "R_iface_addr", "R_prefix");
  for (i=0; i<HASHSIZE; i++)
  {
      tmp = olsr->routing_set[i].list.head;
      if (tmp == NULL){

      }else{
      if (olsr->olsr_cnf->ip_version == AF_INET){
          char str1[INET_ADDRSTRLEN], str2[INET_ADDRSTRLEN], str3[INET_ADDRSTRLEN];

          while (tmp){
          data = (OLSR_ROUTING_TUPLE *)tmp->data;
          //WIN FIX: Need to resolve this
          //inet_ntop(AF_INET, &data->R_dest_iface_addr.v4, str1, sizeof(str1));
          //inet_ntop(AF_INET, &data->R_next_iface_addr.v4, str2, sizeof(str2));
          //inet_ntop(AF_INET, &data->R_iface_addr.v4, str3, sizeof(str3));
          ConvertIpv4AddressToString(data->R_dest_iface_addr.v4, str1);
          ConvertIpv4AddressToString(data->R_next_iface_addr.v4, str2);
          ConvertIpv4AddressToString(data->R_iface_addr.v4, str3);


          olsr_printf("%-17s %-17s %-12d %-16s %-10d\n",
             str1,
             str2,
             data->R_dist,
             str3,
             data->R_prefix_length);
          tmp = tmp->next;
          }

      }

      else if (olsr->olsr_cnf->ip_version == AF_INET6){
          char str1[INET6_ADDRSTRLEN], str2[INET6_ADDRSTRLEN], str3[INET6_ADDRSTRLEN];

          olsr_printf("%-46s %-46s %-12s %-46s %-10s\n",
             "R_dest_iface_addr", "R_next_iface_addr", "R_dist", "R_iface_addr", "R_prefix");
          while (tmp){
          data = (OLSR_ROUTING_TUPLE *)tmp->data;
          //WIN FIX: Need to resolve this
          //inet_ntop(AF_INET6, data->R_dest_iface_addr.v6.s6_addr, str1, sizeof(str1));
          //inet_ntop(AF_INET6, data->R_next_iface_addr.v6.s6_addr, str2, sizeof(str2));
          //inet_ntop(AF_INET6, data->R_iface_addr.v6.s6_addr, str3, sizeof(str3));
          ConvertIpv6AddressToString(&data->R_dest_iface_addr.v6, str1, OLSR_FALSE);
          ConvertIpv6AddressToString(&data->R_next_iface_addr.v6, str2, OLSR_FALSE);
          ConvertIpv6AddressToString(&data->R_iface_addr.v6, str3, OLSR_FALSE);


          olsr_printf("%-46s %-46s %-12d %-46s %-10d\n",
             str1,
             str2,
             data->R_dist,
             str3,
             data->R_prefix_length);
          tmp = tmp->next;
          }

      }

      else{
          olsr_error("Un known ip_version");
          assert(OLSR_FALSE);
      }
      }


  }
  olsr_printf("-------------------\n");
}
Esempio n. 11
0
static void create_tlv_by_list(void *olsr, OLSR_LIST *tlv_block,
                   OLSR_LIST *block,
                   olsr_u8_t tlv_type,
                   olsr_u8_t tlv_value)
{
  BASE_TLV base_tlv;

  OLSR_LIST_ENTRY *tmp = NULL;
  BLOCK_DATA *data = NULL, *next_data = NULL;

  olsr_u8_t index_start, index_stop;
  olsr_u32_t index = 0;
  olsr_bool flag_A;

  index_start = index_stop = 0;
  flag_A = OLSR_FALSE;

  tmp = block->head;
  while (tmp)
    {
      data = (BLOCK_DATA *)tmp->data;

      switch (tlv_type)
    {
    case Link_Status:
      {
        if (data->link_status == tlv_value)
          {
        if (!flag_A)
          {
            index_start = (olsr_u8_t)index;
            flag_A = OLSR_TRUE;
          }
        index_stop = (olsr_u8_t)index;

        if (flag_A)
          {
            if (index == block->numEntry - 1)
              {
            base_tlv.tlv_type = tlv_type;
            base_tlv.tlv_semantics = ALL_ZERO;
            base_tlv.tlv_length = sizeof(olsr_u8_t);
            base_tlv.index_start = index_start;
            base_tlv.index_stop = index_stop;
            base_tlv.value =
              (olsr_u8_t *)olsr_malloc(base_tlv.tlv_length, __FUNCTION__);
            memcpy(base_tlv.value, &tlv_value,
                   base_tlv.tlv_length);

            if(index_start == 0)
              base_tlv.tlv_semantics |= NO_INDEX;
            else if(index_start == index_stop)
              base_tlv.tlv_semantics |= SINGLE_INDEX;

            OLSR_InsertList( tlv_block, &base_tlv,
                    sizeof(BASE_TLV));

            flag_A = OLSR_FALSE;
              }
            else if (index < block->numEntry - 1)
              {
            next_data = (BLOCK_DATA *)tmp->next->data;

            if (next_data->link_status != tlv_value)
              {
                base_tlv.tlv_type = tlv_type;
                base_tlv.tlv_semantics = ALL_ZERO;
                base_tlv.tlv_length = sizeof(olsr_u8_t);
                base_tlv.index_start = index_start;
                base_tlv.index_stop = index_stop;
                base_tlv.value =
                  (olsr_u8_t *)olsr_malloc(base_tlv.tlv_length, __FUNCTION__);
                memcpy(base_tlv.value, &tlv_value,
                   base_tlv.tlv_length);

                if(index_start == index_stop)
                  base_tlv.tlv_semantics |= SINGLE_INDEX;

                OLSR_InsertList( tlv_block, &base_tlv,
                    sizeof(BASE_TLV));

                flag_A = OLSR_FALSE;
              }
              }
          }
          }
        break;
      }

    case Other_If:
      {
        if (data->other_if == tlv_value)
          {
        if (!flag_A)
          {
            index_start = (olsr_u8_t)index;
            flag_A = OLSR_TRUE;
          }
        index_stop = (olsr_u8_t)index;

        if (flag_A)
          {
            if (index == block->numEntry - 1)
              {
            base_tlv.tlv_type = tlv_type;

            base_tlv.tlv_semantics = NO_VALUE;
            base_tlv.tlv_length = 0;

            base_tlv.index_start = index_start;
            base_tlv.index_stop = index_stop;

            base_tlv.value = NULL;

            if(index_start == index_stop)
              base_tlv.tlv_semantics |= SINGLE_INDEX;
            else if(index_start == 0)
              base_tlv.tlv_semantics |= NO_INDEX;

            OLSR_InsertList( tlv_block, &base_tlv,
                    sizeof(BASE_TLV));

            flag_A = OLSR_FALSE;
              }
            else if (index < block->numEntry - 1)
              {
            next_data = (BLOCK_DATA *)tmp->next->data;

            if (next_data->other_if != tlv_value)
              {
                base_tlv.tlv_type = tlv_type;

                base_tlv.tlv_semantics = NO_VALUE;
                base_tlv.tlv_length = 0;

                base_tlv.index_start = index_start;
                base_tlv.index_stop = index_stop;

                base_tlv.value = NULL;

                if(index_start == index_stop)
                  base_tlv.tlv_semantics |= SINGLE_INDEX;

                OLSR_InsertList( tlv_block, &base_tlv,
                        sizeof(BASE_TLV));

                flag_A = OLSR_FALSE;
              }
              }
          }
          }
        break;
      }

    case MPR_Selection:
      {
        if (data->MPR_Selection == tlv_value)
          {
        if (!flag_A)
          {
            index_start = (olsr_u8_t)index;
            flag_A = OLSR_TRUE;
          }
        index_stop = (olsr_u8_t)index;

        if (flag_A)
          {
            if (index == block->numEntry - 1)
              {
            base_tlv.tlv_type = tlv_type;

            base_tlv.tlv_semantics = NO_VALUE;
            base_tlv.tlv_length = 0;

            base_tlv.index_start = index_start;
            base_tlv.index_stop = index_stop;

            base_tlv.value = NULL;

            if(index_start == index_stop)
              base_tlv.tlv_semantics |= SINGLE_INDEX;
            else if(index_start == 0)
              base_tlv.tlv_semantics |= NO_INDEX;

            OLSR_InsertList( tlv_block, &base_tlv,
                sizeof(BASE_TLV));

            flag_A = OLSR_FALSE;
              }
            else if (index < block->numEntry - 1)
              {
            next_data = (BLOCK_DATA *)tmp->next->data;

            if (next_data->MPR_Selection != tlv_value)
              {
                base_tlv.tlv_type = tlv_type;

                base_tlv.tlv_semantics = NO_VALUE;
                base_tlv.tlv_length = 0;

                base_tlv.index_start = index_start;
                base_tlv.index_stop = index_stop;

                base_tlv.value = NULL;

                if(index_start == index_stop)
                  base_tlv.tlv_semantics |= SINGLE_INDEX;

                OLSR_InsertList( tlv_block, &base_tlv,
                        sizeof(BASE_TLV));

                flag_A = OLSR_FALSE;
              }
              }
          }
          }
        break;
      }
    case PREFIX_LENGTH:
      {
        if (data->Prefix_Length == tlv_value)
          {
        if (!flag_A)
          {
            index_start = (olsr_u8_t)index;
            flag_A = OLSR_TRUE;
          }
        index_stop = (olsr_u8_t)index;

        if (flag_A)
          {
            if (index == block->numEntry - 1)
              {
            base_tlv.tlv_type = tlv_type;
            base_tlv.tlv_semantics = ALL_ZERO;
            base_tlv.tlv_length = sizeof(olsr_u8_t);
            base_tlv.index_start = index_start;
            base_tlv.index_stop = index_stop;
            base_tlv.value =
              (olsr_u8_t *)olsr_malloc(base_tlv.tlv_length, __FUNCTION__);
            memcpy(base_tlv.value, &tlv_value,
                   base_tlv.tlv_length);
            if(index_start == index_stop)
              base_tlv.tlv_semantics |= SINGLE_INDEX;
            else if(index_start == 0)
              base_tlv.tlv_semantics |= NO_INDEX;

            OLSR_InsertList( tlv_block, &base_tlv,
                    sizeof(BASE_TLV));

            flag_A = OLSR_FALSE;
              }
            else if (index < block->numEntry - 1)
              {
            next_data = (BLOCK_DATA *)tmp->next->data;

            if (next_data->Prefix_Length != tlv_value)
              {
                base_tlv.tlv_type = tlv_type;
                base_tlv.tlv_semantics = ALL_ZERO;
                base_tlv.tlv_length = sizeof(olsr_u8_t);
                base_tlv.index_start = index_start;
                base_tlv.index_stop = index_stop;
                base_tlv.value =
                  (olsr_u8_t *)olsr_malloc(base_tlv.tlv_length, __FUNCTION__);
                memcpy(base_tlv.value, &tlv_value,
                   base_tlv.tlv_length);
                if(index_start == index_stop)
                  base_tlv.tlv_semantics |= SINGLE_INDEX;


                OLSR_InsertList( tlv_block, &base_tlv,
                        sizeof(BASE_TLV));

                flag_A = OLSR_FALSE;
              }
              }
          }
          }
        break;
      }


    default:
      olsr_error("%s\n", __FUNCTION__);
    }

      index++;
      tmp = tmp->next;
    }
}
Esempio n. 12
0
//create multivalue tlv
void
create_hello_addr_tlv_by_multivalue(void *olsr, OLSR_LIST *tlv_block,
                    OLSR_LIST *block,
                    olsr_u8_t tlv_type)
{
  BASE_TLV base_tlv;
  OLSR_LIST_ENTRY *entry;
  BLOCK_DATA *data, *next_data;

  olsr_u8_t index_start, index_stop;
  olsr_u32_t index, tlv_length;
  olsr_bool set_index_start;
//Static Fix
  //static olsr_pktbuf_t *buf = NULL;
  olsr_pktbuf_t *buf = NULL;

  index_start = index_stop = index =0;

  tlv_length = 0;
  set_index_start = OLSR_FALSE;

  buf = olsr_pktbuf_alloc_with_capa(255 * sizeof(olsr_u8_t));
  olsr_pktbuf_clear(buf);

  entry = block->head;
  while(entry){
    data = (BLOCK_DATA *)entry->data;
    switch(tlv_type){
    case Link_Status:
      {
    if(data->link_status != 255){

      //check index_start set or not
      if(set_index_start == OLSR_FALSE){
        index_start = index;
        set_index_start = OLSR_TRUE;
      }

      index_stop = index;
      tlv_length += sizeof(olsr_u8_t);
      olsr_pktbuf_append_u8(buf, data->link_status);

      //last addr
      if(index == block->numEntry -1){
        base_tlv.tlv_type = tlv_type;
        base_tlv.tlv_semantics = MULTI_VALUE;
        base_tlv.tlv_length = tlv_length;
        base_tlv.index_start = index_start;
        base_tlv.index_stop = index_stop;

        //check semantics
        if(index_start == 0){
          base_tlv.tlv_semantics |= NO_INDEX;
        }else if(index_start == index_stop){
          base_tlv.tlv_semantics |= SINGLE_INDEX;
        }

        //set value
        base_tlv.value = (olsr_u8_t *)olsr_malloc(tlv_length, __FUNCTION__);
        memcpy(base_tlv.value, buf->data, tlv_length);

        //insert list
        OLSR_InsertList( tlv_block, &base_tlv, sizeof(BASE_TLV));
        set_index_start = OLSR_FALSE;
        olsr_pktbuf_clear(buf);
        tlv_length =0;

      }else if (index < block->numEntry -1){
        next_data = (BLOCK_DATA *)entry->next->data;
        if(next_data->link_status == 255){
          base_tlv.tlv_type = tlv_type;
          base_tlv.tlv_semantics = MULTI_VALUE;
          base_tlv.tlv_length = tlv_length;
          base_tlv.index_start = index_start;
          base_tlv.index_stop = index_stop;

          //check semantics
          if(index_start == index_stop){
        base_tlv.tlv_semantics |= SINGLE_INDEX;
          }

          //set value
          base_tlv.value = (olsr_u8_t *)olsr_malloc(tlv_length, __FUNCTION__);
          memcpy(base_tlv.value, buf->data, tlv_length);

          //insert list
          OLSR_InsertList( tlv_block, &base_tlv, sizeof(BASE_TLV));
          set_index_start = OLSR_FALSE;
          olsr_pktbuf_clear(buf);
          tlv_length = 0;
        }
      }//if else if
    }//link_status != 255
      }//case
      break;

    case PREFIX_LENGTH:
      {
    if(data->Prefix_Length != 255){

      //check index_start set or not
      if(set_index_start == OLSR_FALSE){
        index_start = index;
        set_index_start = OLSR_TRUE;
      }

      index_stop = index;
      tlv_length += sizeof(olsr_u8_t);
      olsr_pktbuf_append_u8(buf, data->Prefix_Length);

      //last addr
      if(index == block->numEntry -1){
        base_tlv.tlv_type = tlv_type;
        base_tlv.tlv_semantics = MULTI_VALUE;
        base_tlv.tlv_length = tlv_length;
        base_tlv.index_start = index_start;
        base_tlv.index_stop = index_stop;

        //check semantics
        if(index_start == 0){
          base_tlv.tlv_semantics |= NO_INDEX;
        }else if(index_start == index_stop){
          base_tlv.tlv_semantics |= SINGLE_INDEX;
        }

        //set value
        base_tlv.value = (olsr_u8_t *)olsr_malloc(tlv_length, __FUNCTION__);
        memcpy(base_tlv.value, buf->data, tlv_length);

        //insert list
        OLSR_InsertList( tlv_block, &base_tlv, sizeof(BASE_TLV));
        set_index_start = OLSR_FALSE;
        olsr_pktbuf_clear(buf);
        tlv_length =0;

      }else if (index < block->numEntry -1){
        next_data = (BLOCK_DATA *)entry->next->data;
        if(next_data->Prefix_Length == 255){
          base_tlv.tlv_type = tlv_type;
          base_tlv.tlv_semantics = MULTI_VALUE;
          base_tlv.tlv_length = tlv_length;
          base_tlv.index_start = index_start;
          base_tlv.index_stop = index_stop;

          //check semantics
          if(index_start == index_stop){
        base_tlv.tlv_semantics |= SINGLE_INDEX;
          }

          //set value
          base_tlv.value = (olsr_u8_t *)olsr_malloc(tlv_length, __FUNCTION__);
          memcpy(base_tlv.value, buf->data, tlv_length);

          //insert list
          OLSR_InsertList( tlv_block, &base_tlv, sizeof(BASE_TLV));
          set_index_start = OLSR_FALSE;
          olsr_pktbuf_clear(buf);
          tlv_length = 0;
        }
      }//if else if
    }//Prefix_LENGTH != 255
      }//case
      break;

    default:
      olsr_error("%s\n", __FUNCTION__);

    }//switch

    index++;
    entry = entry->next;
  }
  olsr_pktbuf_free(&buf);

  //free(buf->data);
  //free(buf);
}
static olsr_bool
process_hello(struct olsrv2 *olsr, struct hello_message *hello,
          union olsr_ip_addr *in_if,
          union olsr_ip_addr *from_addr)
{
  struct hello_neighbor *hello_neigh = NULL;
  OLSR_LIST* retList = NULL;
  OLSR_LIST_ENTRY *entry = NULL;
  OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *local_entry = NULL;
  OLSR_SYMMETRIC_NEIGHBOR_TUPLE *sym_data = NULL;
  olsr_time_t time;
  olsr_bool change_assn = OLSR_FALSE, selected_mpr = OLSR_FALSE;


  //codexxx
	// before processing hello message add the queue length of the corresponding originator to the OLSR_LIST "queue_set"
  olsr_bool IPfound = OLSR_FALSE;
  struct queue_info *queueInf = NULL, *tempo= NULL ;
  OLSR_LIST_ENTRY *queueEntry = NULL; 
  
  queueInf = (queue_info *)olsr_malloc(sizeof(queue_info), __FUNCTION__);
  
  queueInf->orig_IP = hello->orig_addr ;
  queueInf->Qlength = hello->queuelength;
 
  if(olsr->queue_set.numEntry == 0) 
  	{ // insert to the list directly
  	  OLSR_InsertList(&olsr->queue_set,queueInf,sizeof(queue_info));
	  
  }else{ // liste deja contient des element ...donc trouver si deja existe
		
		queueEntry = olsr->queue_set.head ;
		while(queueEntry != NULL)  /////
			{ 
			tempo = (queue_info *)queueEntry->data ;
			if(!cmp_ip_addr(olsr,&tempo->orig_IP,&queueInf->orig_IP)) ////
			{  // on a trouver cet originator IP ds la liste alors update le queue et sortir de la boucle
			   tempo->Qlength = queueInf->Qlength;
			   IPfound = OLSR_TRUE;
			   break;

			}
		queueEntry = queueEntry->next ;
	  }
		
			if(IPfound == OLSR_FALSE)
				{ // cet IP n'existe pas deja dans la liste => l'introduire
				
					 OLSR_InsertList(&olsr->queue_set,queueInf,sizeof(queue_info));
			}
			

	  }
  

  
  //end codexxx


  if (own_ip_addr(olsr, &hello->source_addr))
    { // wiss: ma3neta el source address byetaba2 ma3 wa7ed men el intrface address taba3 node
        if(DEBUG_OLSRV2){
            char* paddr = olsr_niigata_ip_to_string(olsr, &olsr->main_addr);
            olsr_printf("Received Hello, but this Hello is sent from ME!!\n[%s]",paddr);
            free(paddr);
        }
      return OLSR_FALSE; // wiss: betla3 men process_hello
    }

  if(search_link_set_local_for_exist(olsr,
                     in_if,
                     &hello->source_addr) == OLSR_FALSE){ // wiss:ma  la2a bel  olsr linkset entry 3enda local_if= "in_if" w neigbor_if=&hello->source_addr 
                     // wiss: ma la2a jar 3endou ip hello->source_addr ma3neta el link da3
    proc_link_set(olsr,
          in_if,
          &hello->source_addr,
          LOST,
          hello->willingness,
          hello->vtime,
          hello->htime);
  }

  // neighbor address
  hello_neigh = hello->neighbors;
  while (hello_neigh){


    if(equal_ip_addr(olsr,
             &hello_neigh->address,
             in_if
             ))
      { // wiss: hello_neigh->address, byetaba2 ma3 in_if
    proc_link_set(olsr,
              in_if,
              &hello->source_addr,
              hello_neigh->status,
              hello->willingness,
              hello->vtime,
              hello->htime);

    //update symmetric neighbor set
    proc_symmetric_neighbor_set(olsr,
                    in_if,
                    hello_neigh->status,
                    hello);
    break; // wiss : so iza fet hon ya3ni la2a el neighbor so break... so iza ma la2an byente2el 3al neigh->next
      }

    hello_neigh = hello_neigh->next;
  }


  //update neighbor address association set
  proc_association_set(olsr, &hello->local_iface_list, hello->vtime);


  hello_neigh = hello->neighbors;
  while (hello_neigh){

    //process 2hop Neighbor set
    proc_2neigh_set(olsr,
            in_if,
            &hello->source_addr,
            &hello_neigh->address,
            hello_neigh->status,
            hello_neigh->other_neigh,
            hello->vtime);

    //check: own interfaces is selected MPR by source nodes.
    if(selected_mpr == OLSR_FALSE &&
       own_ip_addr(olsr, &hello_neigh->address) == OLSR_TRUE &&
       hello_neigh->is_mpr == OLSR_TRUE) {
      selected_mpr = OLSR_TRUE;
    }

    //next pointer
    hello_neigh = hello_neigh->next;
  }

  //update mpr selector set , relay set, advertise neighbor set
  if(selected_mpr == OLSR_TRUE) {
    entry = hello->local_iface_list.head;
    while(entry) {
      local_entry = (OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *)entry->data;
      retList = search_symmetric_neighbor_set(olsr,
                          in_if,
                          &local_entry->iface_addr);

      if(retList) {
    if(retList->numEntry != 1) {
      olsr_error("process_hello():5");
    }
    get_current_time(olsr, &time);
    sym_data = (OLSR_SYMMETRIC_NEIGHBOR_TUPLE *)retList->head->data;
    OLSR_DeleteList_Search(retList);

    if(get_neighbor_status(&time, &sym_data->N_time) == SYMMETRIC) {
        proc_mpr_selector_set(olsr, &local_entry->iface_addr);

        if(olsr->change_mpr_selector_set) {
        if(proc_adv_neigh_set(olsr, &local_entry->iface_addr)){
            proc_relay_set(olsr, &local_entry->iface_addr);
          change_assn = OLSR_TRUE;
          }
      }
    }//if(get_neigh...)
      }

      //next entry
      entry = entry->next;
    }//while
  }
  else{  // wiss: ici selected_mpr==false
    entry = hello->local_iface_list.head;
    while(entry) {
      local_entry = (OLSR_LOCAL_INTERFACE_BLOCK_ENTRY *)entry->data;
      delete_mpr_selector_set(olsr, &local_entry->iface_addr);
      if(olsr->change_mpr_selector_set) {
    delete_adv_neigh_set(olsr, &local_entry->iface_addr);
    if(olsr->change_adv_neigh_set) {
      change_assn = OLSR_TRUE;
      delete_relay_set(olsr, &local_entry->iface_addr);
    }
      }
      //next entry
      entry = entry->next;
    }//while
  }

  /* if I am selecetd as MPR by someone,
     I_am_MPR_flag turns ON and send TC message every TC_INTERVAL */
  if (olsr->I_am_MPR_flag == OLSR_FALSE &&
      olsr->adv_neigh_set.head != NULL){
    olsr->I_am_MPR_flag = OLSR_TRUE;
  }

  if(DEBUG_OLSRV2)
  {
      olsr_printf("\tassn[%d]\n", get_local_assn(olsr));
  }

  if (change_assn == OLSR_TRUE)
    increment_local_assn(olsr);

  return OLSR_TRUE;
}
static olsr_bool
tc_change_structure(struct olsrv2 *olsr, struct tc_message *tc_msg,
            struct message_header *m, union olsr_ip_addr *source)
{
  struct address_tuple *tmp_addr_entry = NULL;
  struct tlv_tuple *tlv_entry = NULL;

  struct tc_mpr_addr *mpr_entry = NULL;
  int i;
  ATTACHED_NETWORK *attached_net_entry = NULL;

  OLSR_LOCAL_INTERFACE_BLOCK_ENTRY local_iface_entry;

  // initialize
  memset(tc_msg, 0, sizeof(struct tc_message));

  // fill ipv4 header informations
  tlv_entry = get_msg_tlv(olsr, Validity_Time);
  if(tlv_entry->length == 1)
    tc_msg->vtime = me_to_double((olsr_u8_t)tlv_entry->value);
  else// greater than 3 byte
    tc_msg->vtime = get_validity_time_from_hop(tlv_entry, m->hop_count);

  olsr_ip_copy(olsr, &tc_msg->source_addr, source);
  olsr_ip_copy(olsr, &tc_msg->originator, &m->orig_addr);
  tc_msg->message_seq_number = m->message_seq_num;
  tc_msg->hop_count = m->hop_count;
  tc_msg->ttl = m->ttl;

  if ((tlv_entry = get_msg_tlv(olsr, Content_Sequence_Number)) == NULL){
    olsr_error("This Message include no ASSN\n");
  }else{//assume that assn is less equal than 4byte
    tc_msg->assn = (olsr_u16_t)tlv_entry->value;
  }
/*
//codexxx'
  tlv_entry = get_msg_tlv(olsr, queuelen);
   tc_msg->queuelength = (olsr_u8_t)tlv_entry->value;
  
  //end codexxx'  
*/
  if(proc_assn_history_set(olsr, &tc_msg->originator, tc_msg->assn)){
    free_all_address_entries(olsr);
    free_message_tlv(olsr);
    olsr_free_tc_packet(tc_msg);

    return OLSR_FALSE;
  }

  //local interface block
  OLSR_InitList(&tc_msg->local_iface_list);
  tmp_addr_entry = olsr->local_interface_block_entry;
  while(tmp_addr_entry) {
    olsr_ip_copy(olsr, &local_iface_entry.iface_addr, &tmp_addr_entry->ip_addr);
    local_iface_entry.other_if = OLSR_FALSE;

    tlv_entry = tmp_addr_entry->addr_tlv;
    while(tlv_entry) {
      switch(tlv_entry->type){
      case Other_If:
    if(tlv_entry->value == OLSR_TRUE)
      local_iface_entry.other_if = OLSR_TRUE;
    break;
      default:
    break;
      }
      tlv_entry = tlv_entry->next;
    }
    OLSR_InsertList(&tc_msg->local_iface_list, &local_iface_entry,
            sizeof(OLSR_LOCAL_INTERFACE_BLOCK_ENTRY));

    tmp_addr_entry= tmp_addr_entry->next;
  }

  // all mpr selector : advertized by tc
  tc_msg->mpr_selector_address = NULL;
  tc_msg->attached_net_addr = NULL;
  for (i = 0; i < olsr->num_of_addr_tlv_block_entries; ++i){
    tmp_addr_entry = olsr->addr_tlv_block_entries[i];
    tlv_entry = NULL;
    while (tmp_addr_entry){
      //attached network address
      if((tlv_entry = have_attached_network_tlv(tmp_addr_entry->addr_tlv)) != NULL)
    {
      attached_net_entry = (ATTACHED_NETWORK *)olsr_malloc( sizeof(ATTACHED_NETWORK), __FUNCTION__);
      memset(attached_net_entry, 0 , sizeof(ATTACHED_NETWORK));
      attached_net_entry->next = NULL;
      olsr_ip_copy(olsr, &attached_net_entry->network_addr, &tmp_addr_entry->ip_addr);
      attached_net_entry->prefix_length = (olsr_u8_t)tlv_entry->value;

      //queue
      if(tc_msg->attached_net_addr == NULL)
        tc_msg->attached_net_addr = attached_net_entry;
      else{
        attached_net_entry->next = tc_msg->attached_net_addr;
        tc_msg->attached_net_addr = attached_net_entry;
      }
      tmp_addr_entry = tmp_addr_entry->next;
      continue;
    }

      mpr_entry = (struct tc_mpr_addr *)olsr_malloc(sizeof(struct tc_mpr_addr), __FUNCTION__);
      memset(mpr_entry, 0, sizeof(struct tc_mpr_addr));

      olsr_ip_copy(olsr, &mpr_entry->address, &tmp_addr_entry->ip_addr);


      if (tc_msg->mpr_selector_address == NULL){//first
    tc_msg->mpr_selector_address = mpr_entry;
    mpr_entry->next = NULL;
      }else{
    mpr_entry->next = tc_msg->mpr_selector_address;
    tc_msg->mpr_selector_address = mpr_entry;
      }
      tmp_addr_entry = tmp_addr_entry->next;
    }

  }//for

  debug_code(print_tc_message(olsr, tc_msg));
  //free address tlv & message tlv
  free_all_address_entries(olsr);
  free_message_tlv(olsr);

  return OLSR_TRUE;
}