Hi everyone! I'm a new user of ns2 and I'm trying to write a simple wireless routing protocol, where nodes can listen packet broadcasting from one to another. But, until now,
when I compile and run tcl file, just node that send broadcast can listen it self. I don't see where're the errors. May someone help me, please ? This is my code: /*************************PACKET TYPES**************/ /* * wtr-packet.h * * Created on: Jul 30, 2012 * Author: adroaldo */ #ifndef WTR_PACKET_H_ #define WTR_PACKET_H_ #include <packet.h> #include"constants.h" #define FC_LEN 1 /*Defining packets format*/ #define DELETED_PCKT 0x00 /*binary representation 00000000*/ #define NORMAL_TOKEN 0x01 /*binary representation 00000001*/ #define ELECTION_TOKEN 0x02 /*binary representation 00000010*/ #define ELECTED_TOKEN 0x03 /*binary representation 00000011*/ #define SOLICIT_SUCCESSOR 0x04 /*binary representation 00000100*/ #define SET_PREDECESSOR 0x05 /*binary representation 00000101*/ #define SET_SUCCESSOR 0x06 /*binary representation 00000110*/ #define DATA_PCKT 0x07 /*binary representation 00000111*/ #define ACK_DATA_PCKT 0x08 /*binary representation 00001000*/ #define VARAL_TOKEN 0x09 /*binary representation 00001001*/ #define VARAL_ELECTION_TOKEN 0x0A /*binary representation 00001010*/ #define VARAL_ELECTED_TOKEN 0x0B /*binary representation 00001011*/ #define VARAL_SOLICIT_SUCCESSOR 0x0C /*binary representation 00001100*/ #define VARAL_SET_PREDECESSOR 0x0D /*binary representation 00001101*/ #define VARAL_SET_SUCCESSOR 0x0E /*binary representation 00001110*/ #define VARAL_DATA_TOKEN 0x0F /*binary representation 00001111*/ #define VARAL_ACK_DATA 0x010 /*binary representation 00010000*/ #define SELF_ADVERTISING 0x011 /*binary representation 00010001*/ /*Acesso direto aos headers de pacotes*/ #define HDR_WTRP_PACKET(p) ((hdr_wtrp_packet *)hdr_wtrp_packet::access(p)) #define HDR_DEL(p) ((hdr_del *)hdr_wtrp_packet::access(p)) #define HDR_TOKEN(p) ((hdr_token *)hdr_wtrp_packet::access(p)) #define HDR_ELECTION(p) ((hdr_election *)hdr_wtrp_packet::access(p)) #define HDR_ELECTED(p) ((hdr_elected *)hdr_wtrp_packet::access(p)) #define HDR_SSUCC(p) ((hdr_ssucc *)hdr_wtrp_packet::access(p)) #define HDR_SPRED(p) ((hdr_spred *)hdr_wtrp_packet::access(p)) #define HDR_SESUC(p) ((hdr_sesuc *)hdr_wtrp_packet::access(p)) #define HDR_VTOKEN(p) ((hdr_vtoken *)hdr_wtrp_packet::access(p)) #define HDR_VELECTION(p) ((hdr_velection *)hdr_wtrp_packet::access(p)) #define HDR_VELECTED(p) ((hdr_velected *)hdr_wtrp_packet::access(p)) #define HDR_VSSUCC(p) ((hdr_vssucc *)hdr_wtrp_packet::access(p)) #define HDR_VSPRED(p) ((hdr_vspred *)hdr_wtrp_packet::access(p)) #define HDR_VSESUC(p) ((hdr_vsesuc *)hdr_wtrp_packet::access(p)) #define HDR_ADVERTISING(p) ((hdr_advertising *)hdr_wtrp_packet::access(p)) /* Pacote default*/ struct hdr_wtrp_packet { u_int8_t FC; inline int size() { int size_var =3D 0; size_var =3D sizeof (struct hdr_wtrp_packet); assert(size_var >=3D 0); return size_var; } // acesso ao header static int offset_; inline static int& offset() { return offset_; } inline static hdr_wtrp_packet* access(const Packet *p) { return (hdr_wtrp_packet*) p->access(offset_); } }; /*Self advertisement*/ struct hdr_advertising { u_int8_t FC; nsaddr_t RA; nsaddr_t DA; /*Broadcast address*/ nsaddr_t SA; static int offset_; /*Teste*/ double send_time; inline int size() { int size_var =3D 0; size_var =3D sizeof (struct hdr_advertising); assert(size_var >=3D 0); /*Declarac=E3o de tipos e prot=F3tipos */ /************************************/ class wtrp; typedef void(wtrp::*firefunction)(void); /*******************************************************/ /* Tipo gen=E9rico de Timer. */ /* Todos os cr=E9ditos devem ser atribuidos ao Ke Liu em */ /* cs.binghamton.edu/~kliu/research/ns2code/index.html */ /*******************************************************/ class WTRP_Timer: public TimerHandler { public: WTRP_Timer(wtrp *agent, firefunction function); private: virtual void expire(Event *e); wtrp *agent_; firefunction firing_; }; /************************/ /* Agent */ /************************/ class wtrp: public Agent { /*friend classes*/ friend class WTRP_Timer; /*node inclui identificador do n=F3*/ node *i_node; /*posic=E3o do n=F3*/ uint32_t pos_x; uint32_t pos_y; /*energia restante*/ double node_energy; /*Func=F5es para lidar com pacotes*/ void forward_data(Packet *p); void recv_packet(Packet *p); void send_packet(); /*TEMP:DUAS FUNC=D5ES PARA TESTAR TIMER*/ void send_wtrp_packet_timer(); void reset_wtrp_packet_timer(); public: /*Para pegar logs*/ Trace *logtarget_; /*Um ponteiro =E0 fila de interface de rede que fica entre "classifier" e "link layer"*/ PriQueue *ifqueue_; /*Port classifier para passar pacotes ao agente*/ PortClassifier *dmux_; /*N=F3*/ MobileNode *iNode; /*Timers*/ /*TEMP:S=D3 TESTANDO TIMER*/ WTRP_Timer send_packet_timer; WTRP_Timer reset_packet_timer; wtrp(nsaddr_t id); void recv(Packet *p, Handler *h); int command(int argc, const char * const *argv); /*Atualizac=E3o de posic=E3o*/ void update_position(); /*Atualizac=E3o de energia*/ void update_energy(); }; #endif /* WTRP_H_ */ /*******WTRP.CC******/ /* * wtrp.cpp * * Created on: Aug 10, 2012 * Author: adroaldo */ #include <my-wtr-proto/wtrp.h> /* Debug definition*/ #define DEBUG /*******************************/ /** Conectando TCL =E0s classes **/ /*******************************/ int hdr_wtrp_packet::offset_; static class WTRPHeaderClass: public PacketHeaderClass { public: WTRPHeaderClass() : PacketHeaderClass("PacketHeader/WTRP", sizeof(hdr_all_packets)) { bind_offset(&hdr_wtrp_packet::offset_); } } class_rtProtoWTRP_hdr; /*************************************/ /* Bind Agent class to tcl interface */ /*************************************/ static class WtrpClass: public TclClass { public: WtrpClass() : TclClass("Agent/WTRP") { } TclObject *create(int argc, const char* const * argv) { assert(argc =3D=3D 5); return (new wtrp((nsaddr_t) Address::instance().str2addr(argv[4]))); } } class_rtWtrp; wtrp::wtrp(nsaddr_t id) : Agent(PT_WTRP), send_packet_timer(this, &wtrp::send_wtrp_packet_timer), reset_packet_timer(this, &wtrp::reset_wtrp_packet_timer) { #ifdef DEBUG printf("N (%.6f): Agente de roteamento inicializado para node %d\n", CURRENT_TIME, id); #endif i_node =3D new node(id); pos_x =3D 0; pos_y =3D 0; node_energy =3D 0.0; logtarget_ =3D 0; ifqueue_ =3D 0; iNode =3D (MobileNode *) (Node::get_node_by_address(id)); } WTRP_Timer::WTRP_Timer(wtrp *agent, firefunction f) : TimerHandler() { agent_ =3D agent; firing_ =3D f; } void WTRP_Timer::expire(Event *e) { (agent_->*firing_)(); } void wtrp::recv_packet(Packet *p) { struct hdr_ip* ih =3D HDR_IP(p); struct hdr_wtrp_packet *wtrph =3D HDR_WTRP_PACKET(p); struct hdr_advertising *hdrA =3D 0; /*All routing messages are sent from and to port RT_PORT,*/ /*so we check it*/ assert(ih->sport =3D=3D RT_PORT); assert(ih->dport =3D=3D RT_PORT); /*switch (wtrph->FC) { case SELF_ADVERTISING: hdrA =3D HDR_ADVERTISING(p); printf(" Recv_packet: =C9 um pacote SELF_ADVERTISING source is %d ou %d\n", hdrA->SA, ih->saddr()); break; default: break; }*/ if ((u_int32_t)(ih->daddr()) =3D=3D IP_BROADCAST) { printf("Recv_packet: =C9 um pacote SELF_ADVERTISING source is %d\n", ih->saddr()); } /*Release resources*/ Packet::free(p); } void wtrp::send_packet() { Packet* p =3D allocpkt(); struct hdr_cmn* ch =3D HDR_CMN(p); struct hdr_ip* ih =3D HDR_IP(p); struct hdr_advertising* ph =3D HDR_ADVERTISING(p); //ph->SA =3D i_node->getNode_address(); ph->FC =3D SELF_ADVERTISING; ph->send_time =3D CURRENT_TIME; ch->ptype() =3D PT_WTRP; ch->direction() =3D hdr_cmn::DOWN; ch->size() =3D IP_HDR_LEN + ph->size(); ch->error() =3D 0; ch->next_hop() =3D IP_BROADCAST; ch->addr_type() =3D NS_AF_INET; /*Escrevendo cabecalho IP*/ //ih->saddr() =3D i_node->getNode_address(); ih->saddr() =3D Agent::addr(); ih->daddr() =3D IP_BROADCAST; ih->sport() =3D RT_PORT; ih->dport() =3D RT_PORT; ih->ttl_ =3D 1; printf("antes de scheduler\n"); Scheduler::instance().schedule(target_, p, 0.0); printf("depois de scheduler\n"); } void wtrp::send_wtrp_packet_timer() { printf("wtrp::send_wtrp_packet_timer Node (%.6d)\n", i_node->getNode_address()); } void wtrp::reset_wtrp_packet_timer() { reset_packet_timer.resched((double) 5.0); } void wtrp::recv(Packet *p, Handler *h) { struct hdr_cmn *ch =3D HDR_CMN(p); struct hdr_ip *ih =3D HDR_IP(p); recv_packet(p); } int wtrp::command(int argc, const char * const *argv) { if (argc =3D=3D 2) { if (strcasecmp(argv[1], "start") =3D=3D 0) { return TCL_OK; } else if (strcasecmp(argv[1], "send") =3D=3D 0) { send_packet(); return TCL_OK; } else if (strcasecmp(argv[1], "start-WL-bcast") =3D=3D 0) { send_packet(); return TCL_OK; } }// Pass the command to the base class else if (argc =3D=3D 3) { /*if(strcmp(argv[1], "index") =3D=3D 0) { index =3D atoi(argv[2]); return TCL_OK; }*/ if (strcmp(argv[1], "log-target") =3D=3D 0 || strcmp(argv[1], "tracetarget") =3D=3D 0) { logtarget_ =3D (Trace*) TclObject::lookup(argv[2]); if (logtarget_ =3D=3D 0) return TCL_ERROR; return TCL_OK; } else if (strcmp(argv[1], "drop-target") =3D=3D 0) { return TCL_OK; } else if (strcmp(argv[1], "if-queue") =3D=3D 0) { ifqueue_ =3D (PriQueue*) TclObject::lookup(argv[2]); if (ifqueue_ =3D=3D 0) return TCL_ERROR; return TCL_OK; } else if (strcmp(argv[1], "port-dmux") =3D=3D 0) { dmux_ =3D (PortClassifier *) TclObject::lookup(argv[2]); if (dmux_ =3D=3D 0) { fprintf(stderr, "%s: %s lookup of %s failed\n", __FILE__, argv[1], argv[2]); return TCL_ERROR; } return TCL_OK; } } return Agent::command(argc, argv); } void wtrp::update_position() { iNode->update_position(); pos_x =3D iNode->X(); pos_y =3D iNode->Y(); printf("U (%.6f): UPDATE POSITION, for Node %d, X: %.6u and Y: %.6u\n", CURRENT_TIME, i_node->getNode_address(), pos_x, pos_y); } void wtrp::update_energy() { node_energy =3D iNode->energy_model()->energy(); printf("U (%.6f): UPDATE ENERGY, for Node %d, Energy: %.4u\n", CURRENT_TIME, i_node->getNode_address(), node_energy); } /********************************TCL FILE*********************************/ if {$argc !=3D 1} { #criando objetos n=F3s for {set i 0} {$i < $val(nn)} {incr i} { set node_($i) [$ns node] $node_($i) random-motion 0 } #Atribuindo cor verde for {set i 0} {$i < $val(nn)} {incr i} { $node_($i) color green $ns at 0.0 "$node_($i) color green" } #positionamento aleat=F3rio for {set i 0} {$i < $val(nn) } { incr i } { $node_($i) set X_ [ expr {$val(x) * rand()} ] $node_($i) set Y_ [ expr {$val(y) * rand()} ] $node_($i) set Z_ 0 } #criando agente wtrp e associando ao n=F3 for {set i 0} {$i < $val(nn)-1 } { incr i } { set wtrpAgente_($i) [new Agent/WTRP [$node_($i) node-addr] ] $ns attach-agent $node_($i) $wtrpAgente_($i) } set null2 [new Agent/Null] $ns attach-agent $node_(2) $null2 #Setup a CBR over wtrp connection set cbr [new Application/Traffic/CBR] $cbr attach-agent $wtrpAgente_(0) $cbr set type_ CBR $cbr set packet_size_ 50 $cbr set rate_ 0.1Mb $cbr set interval_ 2 $ns duplex-link $node_(0) $node_(1) 10Mb 20ms DropTail $ns duplex-link $node_(0) $node_(2) 10Mb 20ms DropTail $ns connect $wtrpAgente_(1) $wtrpAgente_(0) $ns connect $null2 $wtrpAgente_(0) #define uma func=E3o 'recv' para a classe 'Agent/WTRP' Agent/WTRP instproc recv_packet {from rtt} { $self instvar node_ puts "node [$node_ id] received wtrp answer from \ $from with round-trip-time $rtt ms." } #posicao inicial de n=F3 em nam for {set i 0} {$i < $val(nn)} {incr i} { # o tamanho de cada n=F3 ser=E1 30 $ns initial_node_pos $node_($i) 30 } #Programando eventos $ns at 0.5 "$wtrpAgente_(0) start-WL-bcast" $ns at 0.7 "$wtrpAgente_(1) start-WL-bcast" $ns at 3.7 "$wtrpAgente_(1) start-WL-bcast" $ns at 5.7 "$wtrpAgente_(0) start-WL-bcast" $ns at $val(stop) "stop" #Avisando aos n=F3s o final da simulacao #for {set i 0} {$i < $val(nn)} {incr i} { # $ns at $val(stop) "$node_($i) reset"; #} #finalizando nam e a simulacao #$ns at $val(stop) "$ns nam-end-wireless $val(stop)" #$ns at $val(stop) "stop" #$ns at 10.01 "puts \"end simulation\"; $ns halt" proc stop {} { global ns tracefd namtrace $ns flush-trace close $tracefd close $namtrace exec nam advertising_sim.nam & } $ns run I'm using ns-2.35 + ubuntu 10.04 lts. Thks in advance. Adroaldo Borges