hi ns users,
                    I am trying to implement a modified DVMRP protocol
(wired networks).  I want to access distance vector routing table  from my
C++ code  so that i can embed my info
in to my own packet. Can I use aleady implemented dvr in ns-2.32 to use in
my own code? (by using rtPeer objects or
               should  i write my own dvr starting from scratch??

                I started my C++ part initially by creating an agent and
packet header  to start  sending a single packet  from one node to another
by using tcl script.
But i couldn't send my own packet to a node. I used IP_BROADCAST (does wired
networks support it??)

                 I am trying hard to find where I am goin wrong .I looked in
to FAQS  and ns2 archives but couldn't  find a solution..
                  Can anybody help me regarding how to figure out my
problem??

I am submitting by trial code for sending a packet here (both C++ and tcl)


*******packet header**********

#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_*/


#include <tcl.h>
#include <tclcl.h>

#include "bcast_pkt.h"
#include <packet.h>
#include <config.h>
#include <address.h>
#include <agent.h>
#include  <classifier-port.h>
#include  <classifier.h>
#include <iostream>
int hdr_bcast_pkt::offset_ ;
class MyAgent : public Agent{
public :
    MyAgent();
protected :
    int command(int argc,const char*const* argv);
    MyAgent *agent;
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
            agent->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 +
sizeof(hdr_bcast_pkt);//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->iface() = -2;
//hdrcmn->error() = 0;

//hdrcmn ->ptype_                   = PT_bcast;           // ********my
packet type**********   i defined it in common/packet.h  and
tcl/lib/ns-packet.tcl..........
// 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;
Tcl& tcl = Tcl::instance();
tcl.eval("puts \"Message from my_bcast()\"");
Scheduler::instance().schedule(target_, p, 0.0);    //   ************* To
send a packet   but i couldn't receive in recv function  or should i define
any time handler  for this to work?? ***************
//send(p,0);
///////***********I used in substitute for  the above  function but getting
error "no slot default handler..."

}


void MyAgent::recv(Packet* pkt, Handler*)
{
    struct hdr_cmn *ch = HDR_CMN(pkt);
    struct hdr_ip *ih = HDR_IP(pkt);
    struct hdr_bcast_pkt *bh = HDR_BCAST_PKT(pkt);
    Tcl& tcl = Tcl::instance();
    tcl.eval("puts \"1Message from recv()\"");
    if(ch->ptype() == PT_bcast)
    {
        cout << "node " << this->addr() << "received from node " <<
ch->prev_hop_;
    }
//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 " << ch->prev_hop_;

    tcl.eval("puts \"2Message from recv()\"");
}


tcl part..........###################
################################################


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    ######*******            for wired nodes i should
connect every agent right????

#set  myagent [new Agent/MyAgentOtcl]
$a0 set my_var1_otcl 2
$a0 set my_var2_otcl 3.14

$a0 callmyfunc

$a0 sendpkt        #command to send a packet...


Thanks
Rupesh

Reply via email to