Как изменить поведение узла в симуляторе ns2?

Я хочу изменить поведение узла в симуляторе ns2. В частности, мне нужно изменить маршрутизацию узла внутри симуляции протокола dsr. Я знаю, что dsragent.cc - это класс, который управляет маршрутизацией этого протокола. Но если у меня есть tcl-скрипт с 10 узлами, который называется $node1,$node2...node$10, как изменить поведение $node5 в протоколе dsr? Как найти единственное поведение этого узла?

1 ответ

Решение

Я работал с другим протоколом маршрутизации, но я упомяну некоторые моменты... это может быть полезно.

чтобы получить доступ к конкретному объекту узла в C++, вам нужно знать его адрес в tcl. тогда вам может потребоваться внести изменения в функции forward или recv. вы можете извлечь всю необходимую информацию из общих заголовков,IP,DSR.

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}

выбрать конкретный объект узла

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

Вы можете назначить адрес узла из tcl, и этот адрес будет передан в 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);
.
}

С уважением

Другие вопросы по тегам