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); }
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); }