Как изменить поведение узла в симуляторе 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);
.
}
С уважением