there is an example script: /ns-allinone-2.32/ns-2.32/tcl/ex/flooding.tcl
On Sun, Apr 6, 2008 at 12:00 AM, srupesh <[EMAIL PROTECTED]> wrote:
>
>
> Hi,
>
> I am a beginner for ns2. I want to test flooding in wired nodes. I
> went through the posts related to it but couldn't find the solution.
> There is a link related to this issue but there is no solution--->
>
> http://mailman.isi.edu/pipermail/ns-users/2006-January/053762.html
>
> is it possible to invoke user defined recv() method implicitly after calling
> Connector::send()??
>
> anybody please give the information for this problem??
>
> I am posting both C++ code and tcl code here..
>
> I defined a new packet header here......
>
> #ifndef BCAST_PKT_H_
> #define BCAST_PKT_H_
>
> #include <packet.h>
> #include <config.h>
>
> #define HDR_BCAST_PKT(p) hdr_bcast_pkt::access(p)
> struct hdr_bcast_pkt {
>
> nsaddr_t pkt_src_; // Node which originated this packet
> u_int16_t pkt_len_; // Packet length (in bytes)
> u_int8_t pkt_seq_num_; // Packet sequence number
>
> inline nsaddr_t& pkt_src() { return pkt_src_; }
> inline u_int16_t& pkt_len() { return pkt_len_; }
> inline u_int8_t& pkt_seq_num() { return pkt_seq_num_; }
>
> static int offset_;
> inline static int& offset() { return offset_; }
> inline static hdr_bcast_pkt* access(const Packet* p) {
> return (hdr_bcast_pkt*)p->access(offset_);
> }
>
> };
>
>
>
> #endif /*BCAST_PKT_H_*/
>
> implementation of IP_BROADCAST----
>
> int hdr_bcast_pkt::offset_ ;
> class MyAgent : public Agent{
> public :
> MyAgent();
> protected :
> int command(int argc,const char*const* argv);
> private:
> //int my_var1;
> //double my_var2;
> nsaddr_t ra_addr_;
> void my_func(void);
> void my_bcast(Packet *p);
> void recv(Packet* pkt, Handler*);
> };
> static class bcastHeaderClass : public PacketHeaderClass {
> public:
> bcastHeaderClass() : PacketHeaderClass("PacketHeader/bcast",
> sizeof(hdr_bcast_pkt)) {
> bind_offset(&hdr_bcast_pkt::offset_);
> }
> } class_bcast_hdr;
>
> static class MyAgentClass : public TclClass {
> public :
> MyAgentClass() : TclClass("Agent/MyAgentOtcl") {}
> TclObject* create(int argc,const char*const* argv) {
> return (new MyAgent());
> //(nsaddr_t)Address::instance().str2addr(argv[4])
> }
> } class_my_agent;
>
> MyAgent::MyAgent() : Agent(PT_bcast) { //nsaddr_t id
> //bind("my_var1_otcl",&my_var1);
> //bind("my_var2_otcl",&my_var2);
> //ra_addr_ = id;
>
> }
>
> int MyAgent::command(int argc,const char*const* argv) {
>
> if(argc == 2) {
> if(strcmp(argv[1],"callmyfunc") == 0) {
> my_func();
> return (TCL_OK);
>
> }
> if(strcmp(argv[1],"sendpkt") == 0) {
> Packet* newpkt = allocpkt();
> //some packet configuration
> my_bcast(newpkt);
> //recv(newpkt,0);
> return (TCL_OK);
> }
> }
>
> return (Agent::command(argc,argv));
> }
>
> void MyAgent::my_func(void) {
> Tcl& tcl = Tcl::instance();
> tcl.eval("puts \"Message from my_func\"");
> //tcl.evalf("puts \" my_var1= %d\"",my_var1);
> //tcl.evalf("puts \" my_var2 = %f\"",my_var2);
>
> }
>
>
>
> void MyAgent::my_bcast(Packet *p)
> {
> hdr_cmn* hdrcmn = HDR_CMN(p);
> hdr_ip* iphdr = HDR_IP(p);
> hdr_bcast_pkt* ph = HDR_BCAST_PKT(p);
>
> //ph ->pkt_src_ = ra_addr_;
> ph ->pkt_len_ = 64;
> // set all the necessary things for the common header
> hdrcmn ->size_ = IP_HDR_LEN + ph->pkt_len();
> hdrcmn ->ptype_ = PT_bcast;
> hdrcmn->next_hop_ = IP_BROADCAST;
> hdrcmn->prev_hop_ = this->addr();
> hdrcmn->direction() = hdr_cmn::DOWN;
> hdrcmn ->size_ = IP_HDR_LEN + ph->pkt_len();
> hdrcmn ->ptype_ = PT_bcast;
> // setting the ip header
> iphdr->saddr() = this->addr();
> iphdr->sport() = 254; // 1-254
> iphdr->daddr() = IP_BROADCAST;
> iphdr->dport() = 254; // 1-254
> iphdr->ttl() = 32;
> //Scheduler::instance().schedule(target_, p, 0.0);
> send(p,0);
> Tcl& tcl = Tcl::instance();
> tcl.eval("puts \"Message from my_bcast()\"");
> }
>
>
> void MyAgent::recv(Packet* pkt, Handler*)
> {
> Tcl& tcl = Tcl::instance();
> tcl.eval("puts \"1Message from recv()\"");
> hdr_cmn* hdrcmn = HDR_CMN(pkt); //Access the common header for the received
> packet:
> hdr_ip* hdrip = HDR_IP(pkt); // Access the IP header for the received
> packet:
> cout << "node " << this->addr() << "received from node " <<
> hdrcmn->prev_hop_;
>
> tcl.eval("puts \"2Message from recv()\"");
> }
>
>
> Front end Tcl code :
>
> set ns [new Simulator]
>
> set n0 [$ns node]
> set n1 [$ns node]
> $ns duplex-link $n0 $n1 1Mb 10ms DropTail
>
> set a0 [new Agent/MyAgentOtcl]
> $ns attach-agent $n0 $a0
> set a1 [new Agent/MyAgentOtcl]
> $ns attach-agent $n1 $a1
>
> #$ns connect $a0 $a1
>
> #set myagent [new Agent/MyAgentOtcl]
> $a0 set my_var1_otcl 2
> $a0 set my_var2_otcl 3.14
>
> $a0 callmyfunc
>
> $a0 sendpkt
>
> I am getting the error:
>
> Message from my_func
> --- Classfier::no-slot{} default handler (tcl/lib/ns-lib.tcl) ---
> _o12: no target for slot -1
> _o12 type: Classifier/Hash/Dest
> content dump:
> classifier _o12
> 0 offset
> 0 shift
> 2147483647 mask
> 1 slots
> slot 0: _o29 (Classifier/Port)
> -1 default
> ---------- Finished standard no-slot{} default handler ----------
>
>
> Regards
> Siva Rupesh
> --
> View this message in context:
> http://www.nabble.com/How-to-implement-flooding-for-wired-nodes-%28IP_BROADCAST-usage%29--tp16519096p16519096.html
> Sent from the ns-users mailing list archive at Nabble.com.
>
>