Exemplo n.º 1
0
/**
 * <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);
}
Exemplo n.º 2
0
Arquivo: olsr.cpp Projeto: LXiong/ccn
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);
}
Exemplo n.º 3
0
/*
 * Create <tlv>
 */
static void
create_simple_tlv(olsr_pktbuf_t *buf,
          const olsr_u8_t type,
          const olsr_u8_t tlv_semantics,
          const olsr_u8_t length,
          const olsr_u8_t index_start,
          const olsr_u8_t index_stop,
          const olsr_u8_t *value)
{
  olsr_u16_t extend_length;

  olsr_pktbuf_append_u8(buf, type);
  olsr_pktbuf_append_u8(buf, tlv_semantics);

  //index start and stop
  if((tlv_semantics & NO_INDEX) == 0)
    {
      olsr_pktbuf_append_u8(buf, index_start);
      if((tlv_semantics & SINGLE_INDEX) == 0)
    olsr_pktbuf_append_u8(buf, index_stop);
    }

  //no value bit unset
  if((tlv_semantics & NO_VALUE) == 0)
    {
      //extend bit
      if((tlv_semantics & EXTENDED) == 0)
    olsr_pktbuf_append_u8(buf, length);
      else
    {
      extend_length = length;
      olsr_pktbuf_append_u16(buf, htons(extend_length));
    }
    }


  // value
  if((tlv_semantics & NO_VALUE) == 0)
    //olsr_pktbuf_append_u8(buf, value);
    olsr_pktbuf_append_byte_ary(buf, value, length);
  //multi value bit unsupported
}
Exemplo n.º 4
0
olsr_bool
olsr_pktbuf_append_pktbuf(olsr_pktbuf_t *self, const olsr_pktbuf_t *src)
{
  return olsr_pktbuf_append_byte_ary(self, src->data, src->len);
}
Exemplo n.º 5
0
olsr_bool
olsr_pktbuf_append_ip(struct olsrv2* olsr, olsr_pktbuf_t *self, const union olsr_ip_addr *ip)
{
    struct olsrd_config* olsr_cnf = ((struct olsrv2*)olsr)->olsr_cnf;
  return olsr_pktbuf_append_byte_ary(self, (const olsr_u8_t*)ip, IP_LEN);
}