如何修改 ns2 模拟器中节点的行为?

How to modify the behavior of a node in ns2 simulator?

我想修改 ns2 模拟器中节点的行为。特别是,我必须在 dsr 协议的模拟中修改节点的路由。 我知道dsragent.cc就是管理这个协议路由的class。但是,如果我有一个包含 10 个节点的 tcl 脚本,名为 $node1,$node2...node$10,如何修改 dsr 协议中 $node5 的行为?如何找到该节点的单一行为?

我曾使用过其他路由协议,但我会提到一些要点..可能有用。

为了在 c++ 中访问特定节点 object 你需要知道它在 tcl 中的地址。那么您可能需要在 forward 或 recv 函数中进行修改.. 您可以从 common,IP,DSR headers

中提取您需要的所有信息
DSRAgent::recv(Packet* packet, Handler*)
  /* handle packets with a MAC destination address of this host, or
     the MAC broadcast addr */
{
       hdr_sr *srh =  hdr_sr::access(packet);
      hdr_ip *iph =  hdr_ip::access(packet);
      hdr_cmn *cmh =  hdr_cmn::access(packet);
      p.dest = ID((Address::instance().get_nodeaddr(iph->daddr())),::IP);
      p.src = ID((Address::instance().get_nodeaddr(iph->saddr())),::IP);

下面的意思是..如果当前节点是数据包的生成者

 if (p.src == net_id) {code}

到select特定节点object

 if (net_id==ID("put the node address here", ::IP))     \ notice net_id is a struct 
     {
       your code here
     }

你可以从 tcl 分配节点地址 这个地址将通过命令 function

传递给 c++
DSRAgent::command(int argc, const char*const* argv)
.
.
 if (strcasecmp(argv[1], "addr") == 0) 
    {
      int temp;
      temp = Address::instance().str2addr(argv[2]);
     net_id = ID(temp, ::IP);
     flow_table.setNetAddr(net_id.addr);
.
}

问候