void
build_tlv_block_for_index_attached_network(olsr_pktbuf_t *buf,
                 BASE_ADDRESS *base,
                 olsr_u32_t index)
{
//Static Fix
  //static olsr_pktbuf_t *tlv_buf = NULL;
  olsr_pktbuf_t *tlv_buf = NULL;

  tlv_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(tlv_buf);

  create_simple_tlv(tlv_buf,
            PREFIX_LENGTH,
            SINGLE_INDEX,
            1,
            0,
            0,
            &base->data[index].Prefix_Length);

  // <tlv-block>
  olsr_pktbuf_append_u16(buf, (olsr_u16_t)tlv_buf->len);    // <tlv-length>
  olsr_pktbuf_append_pktbuf(buf, tlv_buf);  // <tlv

  olsr_pktbuf_free(&tlv_buf);

  //free(tlv_buf->data);
  //free(tlv_buf);
}
void
build_tlv_block_for_index_hello(olsr_pktbuf_t *buf,
    BASE_ADDRESS *base, olsr_u32_t index)
{
//Static Fix
  //static olsr_pktbuf_t *tlv_buf = NULL;
  olsr_pktbuf_t *tlv_buf = NULL;

  tlv_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(tlv_buf);

  //Create TLV "Link Status"
  create_tlv_for_index_hello(tlv_buf, base, index, Link_Status, SYMMETRIC);
  create_tlv_for_index_hello(tlv_buf, base, index, Link_Status, ASYMMETRIC);
  //  create_tlv_for_index_hello(tlv_buf, base, index, Link_Status, HEARD);
  create_tlv_for_index_hello(tlv_buf, base, index, Link_Status, LOST);

  //create TLV OtherNeigh
  create_tlv_for_index_hello(tlv_buf, base, index, Other_Neigh, SYMMETRIC);
  create_tlv_for_index_hello(tlv_buf, base, index, Other_Neigh, LOST);

  //Create TLV "MPR Selection"
  create_tlv_for_index_hello(tlv_buf, base, index, MPR_Selection, OLSR_TRUE);

  // <tlv-block>
  olsr_pktbuf_append_u16(buf, (olsr_u16_t)tlv_buf->len);    // <tlv-length>
  olsr_pktbuf_append_pktbuf(buf, tlv_buf);  // <tlv>*

  olsr_pktbuf_free(&tlv_buf);

  //free(tlv_buf->data);
  //free(tlv_buf);
}
/**
 * <tlv-block>
 * = <tlv-length> <tlv>*
 * <tlv>
 * = <type> <tlv-semantics> <length>? <index-start>? <index-stop>? <value>?
 */
static void
build_tlv_msg(olsr_pktbuf_t *pktbuf, OLSR_LIST *tlv_block)
{
//Static Fix
  //static olsr_pktbuf_t *tlv_buf = NULL;
  olsr_pktbuf_t *tlv_buf = NULL;
  OLSR_LIST_ENTRY *p = NULL;

  olsr_u16_t extend_length;
	//wiss: initialisation du buffer temporaire qu'on va s'en servir
  tlv_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(tlv_buf);

  for (p = tlv_block->head; p != NULL; p = p->next)
    {
      BASE_TLV *const tlv = (BASE_TLV *)p->data;
      olsr_pktbuf_append_u8(tlv_buf, tlv->tlv_type);
      olsr_pktbuf_append_u8(tlv_buf, tlv->tlv_semantics);

      //index start and stop
      if((tlv->tlv_semantics & NO_INDEX) == 0)
    { //wiss: hon bifout kell chi ella el NO_INDEX
      olsr_pktbuf_append_u8(tlv_buf, tlv->index_start);
      if((tlv->tlv_semantics & SINGLE_INDEX) == 0)// wiss: hon bifout kell chi ella el single index
        olsr_pktbuf_append_u8(tlv_buf, tlv->index_stop); // wiss: hon byetaba2 kell chi ella el no index wel single index ya3ni el tabi3i
    }

      //no value bit  unset
      if((tlv->tlv_semantics & NO_VALUE) == 0)
    { // wiss: hon bifout kell chi ella NO_VALUE ya3ni bifout kell chi bass akid mech MPRSELECTOR
      //extended bit
      if((tlv->tlv_semantics & EXTENDED) == 0)  // wiss: chou extended ma fhemet ma mar2et wala marra !!
        olsr_pktbuf_append_u8(tlv_buf, tlv->tlv_length);
      else
        {
          extend_length = tlv->tlv_length;
          olsr_pktbuf_append_u16(tlv_buf, htons(extend_length));
        }
    }
      // value
      if((tlv->tlv_semantics & NO_VALUE) == 0)
    olsr_pktbuf_append_byte_ary(tlv_buf, tlv->value, tlv->tlv_length);
      //multi value bit unsupported
    }
  olsr_pktbuf_append_u16(pktbuf, (olsr_u16_t)tlv_buf->len);
  olsr_pktbuf_append_pktbuf(pktbuf, tlv_buf);

  //XXX:debug_code(print_tlv_msg(msg_head));
  olsr_pktbuf_free(&tlv_buf);

  //free(tlv_buf->data);
  //free(tlv_buf);
}
Beispiel #4
0
void
forward_message(struct olsrv2 *olsr)
{
  const struct message_header* m_header = &olsr->message_header;
  olsr_pktbuf_t* msg = NULL;

  msg = olsr_pktbuf_alloc();
  olsr_pktbuf_clear(msg);

  /* TC should be forwarded all interface.
     but now, we forward only one interface.
     I'll correct later...  */
  build_message_header(olsr, msg, (olsr_u16_t)olsr->message_body_size,
      m_header->message_type,
      &m_header->orig_addr, m_header->ttl - 1, m_header->hop_count + 1,
      m_header->message_seq_num);


  if (m_header->message_type == TC_MESSAGE){
      olsr->stat.numTcRelayed++;
      if (DEBUG_OLSRV2){
        olsr_printf("Increment TC relayed to %d.\n",olsr->stat.numTcRelayed);
      }
  }

  olsr_pktbuf_append_byte_ary(msg, (olsr_u8_t* )olsr->message_body, olsr->message_body_size);


  if (DEBUG_OLSRV2){
      olsr_printf("TTL:%d\nhopcount:%d\nmsg_size:%d\n",m_header->ttl - 1,
                                    m_header->hop_count + 1, (int)msg->len);
  }

  if (m_header->message_type == TC_MESSAGE)
  {
      int ifNum;

      for(ifNum=0; ifNum<olsr->iface_num; ifNum++)
      {
      set_forward_infomation(olsr, msg->data, (unsigned int)msg->len,
          (unsigned char)ifNum);
      }
  }
  else
  {
      set_forward_infomation(olsr, msg->data, (unsigned int)msg->len,
          olsr->parsingIfNum);
  }

  olsr_pktbuf_free(&msg);
}
/*
 * Create <tlv-block> for ...
 * XXX
 */
void build_tlv_block_for_index_local(olsr_pktbuf_t *buf, BASE_ADDRESS *base,
                     olsr_u32_t index) {
//Static Fix
  //static olsr_pktbuf_t *tlv_buf = NULL;
  olsr_pktbuf_t *tlv_buf = NULL;

  tlv_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(tlv_buf);

  //Create TLV "Interface"
  create_tlv_for_index_hello(tlv_buf, base, index, Other_If, OLSR_TRUE);

  // <tlv-block>
  olsr_pktbuf_append_u16(buf, (olsr_u16_t)tlv_buf->len);    // <tlv-length>
  olsr_pktbuf_append_pktbuf(buf, tlv_buf);  // <tlv>*

  olsr_pktbuf_free(&tlv_buf);

  //free(tlv_buf->data);
  //free(tlv_buf);
}
//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);
}
void
build_hello_msg(struct olsrv2 *olsr, olsr_pktbuf_t *pktbuf,
        union olsr_ip_addr *local_iface_addr
        )
{
  //olsr_u8_t *msg, *msg_head;
  //struct packet_header *p_header;
  //static olsr_pktbuf_t *msg_tlv_buf = NULL;
  //static olsr_pktbuf_t *addr_block_buf = NULL;
  //static olsr_pktbuf_t *local_addr_block_buf = NULL;
   olsr_pktbuf_t *msg_tlv_buf = NULL;
   olsr_pktbuf_t *addr_block_buf = NULL;
   olsr_pktbuf_t *local_addr_block_buf = NULL;

  // initialize buffers
  if (!msg_tlv_buf)
    msg_tlv_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(msg_tlv_buf);

  if (!addr_block_buf)
    addr_block_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(addr_block_buf);

  if(!local_addr_block_buf)
    local_addr_block_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(local_addr_block_buf);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building TLV for Validity Time.\n");
  }
  // build message TLVs
  build_message_tlv_validity_time(msg_tlv_buf,
                   double_to_me((double)olsr->qual_cnf->neighbor_hold_time));

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building TLV for Interval Time.\n");
  }
  build_message_tlv_interval_time(msg_tlv_buf,
                       double_to_me((double)olsr->qual_cnf->hello_interval));

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building TLV for Willingness.\n");
  }
  build_message_tlv_willingness(msg_tlv_buf, WILL_DEFAULT);


//codexxx
  if(DEBUG_OLSRV2)
	{
		olsr_printf("Building TLV for queue length info.\n");
	}
	build_message_tlv_queue(msg_tlv_buf, olsr->localqueuelen);

  // end codexxx

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building local interface address block.\n");
  }
  //build local interface address block
  build_local_addr_block(olsr, local_addr_block_buf,
             local_iface_addr);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building {<addr-block> <tlv-block>}*.\n");
  }
  // build {<addr-block> <tlv-block>}*
  address_compress(olsr, addr_block_buf, HELLO_MESSAGE, SIMPLE_COMPRESS,
      local_iface_addr);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Append <msg-header> and <msg-header-info>.\n");
  }
  // append <msg-header> and <msg-header-info>
  build_message_header(olsr,
               pktbuf,
               (olsr_u16_t)(2 + msg_tlv_buf->len +
               local_addr_block_buf->len +
               addr_block_buf->len),// 2 is <tlv-length>
               HELLO_MESSAGE,
               local_iface_addr,
               1, 0, get_msg_seqno(olsr)); // wiss: TTL=1 hopcount=0 

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Append <tlv-block>.\n");
  }
  // append msg <tlv-block>  wiss: to pkt buf ( to header and header info ya3ni) 
  olsr_pktbuf_append_u16(pktbuf, (olsr_u16_t)msg_tlv_buf->len);
  olsr_pktbuf_append_pktbuf(pktbuf, msg_tlv_buf);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Append local interface address block.\n");
  }
  // append local interface address block
  olsr_pktbuf_append_pktbuf(pktbuf, local_addr_block_buf);

  if(DEBUG_OLSRV2)
  {
    olsr_printf("Append {<addr-block> <tlv-block>}*.\n");
  }
  // append {<addr-block> <tlv-block>}*
  if(addr_block_buf != NULL)
    olsr_pktbuf_append_pktbuf(pktbuf, addr_block_buf);

  free(msg_tlv_buf->data);
  free(msg_tlv_buf);
  free(addr_block_buf->data);
  free(addr_block_buf);
  free(local_addr_block_buf->data);
  free(local_addr_block_buf);
}
void
build_tc_msg(struct olsrv2 *olsr, olsr_pktbuf_t *pktbuf,
    union olsr_ip_addr *local_iface_addr
    )
{
  //olsr_u8_t *msg, *msg_head;
  //struct packet_header *p_header;
  //static olsr_pktbuf_t *msg_tlv_buf = NULL;
  //static olsr_pktbuf_t *addr_block_buf = NULL;
  //static olsr_pktbuf_t *local_addr_block_buf = NULL;
  olsr_pktbuf_t *msg_tlv_buf = NULL;
  olsr_pktbuf_t *addr_block_buf = NULL;
  olsr_pktbuf_t *local_addr_block_buf = NULL;

  // initialize buffers
  if (!msg_tlv_buf)
    msg_tlv_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(msg_tlv_buf);

  if (!addr_block_buf)
    addr_block_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(addr_block_buf);

  if(!local_addr_block_buf)
    local_addr_block_buf = olsr_pktbuf_alloc_with_capa(64);
  olsr_pktbuf_clear(local_addr_block_buf);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building TLV for Validity Time.\n");
  }
  // build message TLVs
  build_message_tlv_validity_time(msg_tlv_buf,
                   double_to_me((double)olsr->qual_cnf->topology_hold_time));

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building TLV for Interval Time.\n");
  }
  build_message_tlv_interval_time(msg_tlv_buf,
                          double_to_me((double)olsr->qual_cnf->tc_interval));

  if(DEBUG_OLSRV2)
  {
    olsr_printf("Building TLV for Content Sequence Number.\n");
  }
  build_message_tlv_content_seq_num(msg_tlv_buf, get_local_assn(olsr));


  /*//codexxx'
  if(DEBUG_OLSRV2)
	{
		olsr_printf("Building TLV for queue length info.\n");
	}
	build_message_tlv_queue(msg_tlv_buf, olsr->localqueuelen);

  // end codexxx'
  */

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building local interface address block.\n");
  }
  //build local interface address block
  build_local_addr_block(olsr, local_addr_block_buf,
             NULL);


  if(DEBUG_OLSRV2)
  {
      olsr_printf("Advertize attached network address.\n");
  }
  //advertize attached network address //wiss: bass haydi el partie jdide bel TC
  create_attached_network_address_block(olsr, addr_block_buf, TC_MESSAGE,
                    SIMPLE_COMPRESS,
                    local_iface_addr
                    );

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Building {<addr-block> <tlv-block>}*.\n");
  }
  // build {<addr-block> <tlv-block>}*
  address_compress(olsr, addr_block_buf, TC_MESSAGE, SIMPLE_COMPRESS,
      local_iface_addr
      );

  /* build message header */  //wiss: append <msg-header> and <msg-header-info>
  build_message_header(olsr,
               pktbuf,
               (olsr_u16_t)(2 + msg_tlv_buf->len +
               local_addr_block_buf->len +
               addr_block_buf->len),    // 2 is <tlv-length>
               TC_MESSAGE,
               local_iface_addr,
               MAX_TTL, 0, get_msg_seqno(olsr));  //wiss: TTL bten2as kell ma yente2el men hop lal teni

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Append <tlv-block>.\n");
  }
  // append <tlv-block>
  olsr_pktbuf_append_u16(pktbuf, (olsr_u16_t)msg_tlv_buf->len);
  olsr_pktbuf_append_pktbuf(pktbuf, msg_tlv_buf);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Append local interface address block.\n");
  }
  // append local interface address block
  olsr_pktbuf_append_pktbuf(pktbuf, local_addr_block_buf);

  if(DEBUG_OLSRV2)
  {
      olsr_printf("Append {<addr-block> <tlv-block>}*.\n");
  }
  // append {<addr-block> <tlv-block>}*
  olsr_pktbuf_append_pktbuf(pktbuf, addr_block_buf);

  free(msg_tlv_buf->data);
  free(msg_tlv_buf);
  free(addr_block_buf->data);
  free(addr_block_buf);
  free(local_addr_block_buf->data);
  free(local_addr_block_buf);
}