NS2无线网络仿真trace文件mac地址不正确的问题

使用长庚大学的NS2的WIMAX模块做仿真,结果trace文件的mac地址总是很奇怪,而且nam的动画显示仿真过程中有问题。

一步步的查啊查,最后发现问题在cmutrace类(trace/cmu-trace.cc)中。一下分析全部是针对老版本的trace格式,请自行修改变通。

hdr_mac802_11(mac/mac-802_11.h)与hdr_mac(mac/mac.h)使用的是同一块内存空间,而我所使用的802.16的头部,是在hdr_mac的基础上再加了一个hdr_mac802_16,也就是说,如果要取mac地址相关信息,应该是从hdr_mac中间取。

看cmutrace的format_mac函数,第一行:struct hdr_mac802_11 *mh = HDR_MAC802_11(p); 也就是说默认无线仿真是802.11的,那么用hdr_mac802_11结构体,当然取不到正确的源和目的MAC地址啦。继续往上看,format_mac_common函数的最后一个分支是对老版本的trace格式进行处理的,有下面几行:

cpp代码
  1. if (strcmp (mactype, "Mac/SMAC") == 0) {  
  2.    format_smac(p, offset);  
  3.   } else {  
  4.    format_mac(p, offset);  
  5.   } 

那么,我们自己添加一个 else if (strcmp (mactype, "Mac/802_16") == 0)的分支就可以了,再自己实现一个类似format_mac的函数,从hdr_mac中取地址,并生成trace,trace文件中MAC地址不对的问题就解决了。

我估计生成nam的类中也有相似问题,不过懒得修改了,直接看trace分析得了。

Tags:

cygwin无法安装gcc和XFree86的问题

一直用debian的VPS运行NS2的,因为我都是看trace。

今天修改了一个支持WIMAX的NS 2.33,想用nam看看动画,所以装了一个cygwin,准备编译NS2。

cygwin的安装镜像可以使用这个,速度很快 http://www.cygwin.cn/pub/

安装所需的一些包:XFree86/xorg, autoconf, make, patch, perl, gcc, gcc-g++, gawk, gnuplot, tar, gzip

然后就开始install了,结果cygcheck -c gcc的时候显示没有安装gcc。仔细查了一下,发现安装的时候选软件包,有gcc,但是体积更大的,是那个gcc-core。看了一下gcc的说明,只是一个update helper,估计实际用还是用gcc-core。

于是到install脚本里面搜索gcc,把“packages_base="gcc gcc-g++ gawk tar gzip make patch perl w32api"”修改成“packages_base="gcc-core gcc-g++ gawk tar gzip make patch perl w32api"”即可。

继续运行install,这会显示没有X,也就是说XFree86和xorg都没有安装。install脚本里面搜对X的检测,发现是先检测xorg,如果没有再检查XFree86。重新运行cygwin的setup,发现XFree86只能搜到一个字体文件,其他的开发包什么的在这个版本里面都去掉了。没法只好装xorg。

搜xorg,发现没有什么东西,因为下面的那个“hide obsolete packages”勾选要去掉,现在可以看到一堆软件列表了吧。根据install脚本里面的检测说明,勾选“xorg-x11-base xorg-x11-bin xorg-x11-bin-dlls xorg-x11-devel xorg-x11-libs-data xorg-x11-etc”,鉴于7.0版本那个体积到太小,怕有问题,选低版本的6.9,几M一个,放心一点。

安装完成后,就可以正式开始install ns2了。

Tags:

NS2中从应用层访问UM-OLSR的路由表

  做一个跨层优化的仿真,在应用层Application里面要访问OLSR的路由表项,结合底层路由信息做P2P的传输策略优化。OLSR使用的是UM-OLSR。

  根据UM-OLSR的说明,如果要对单个节点上的agent进行设置,可以使用如下代码

TCL代码
  1. set ra [$mobilenode agent 255]  
  2. $ra set use_mac_ true 
  3. $ra set tc_ival_ 6 

这说明,ra取到的是对应agent的引用,可以直接操作这个路由agent了。

  那么自己的application要怎么做就简单多了,把上面的mobilenode换成自己的node对象,然后运行上面的第一句TCL即可。如下所示:

cpp代码
  1. nsaddr_t node_addr_ = agent_->addr();  
  2. int node_id_ = OLSR::node_id(node_addr_);  
  3. char command[256];  
  4. sprintf(command, "set ra [$node_(%d) agent 255]", node_id_); //id与node_数组是对应的  
  5. tcl.eval(command);  
  6. const char* ref = tcl.result();  
  7. OLSR* olsr_agent_ = (OLSR*)tcl.lookup(ref); 

  取到application所在node的OLSR Agent了,剩下的就是访问OLSR_rtable以及其中的OLSR_rt_entry了,自己改造一下OLSR_rtable吧,o(∩_∩)o

Tags:

多拉口NS2代码报错的问题

在这里提供了一个修改的NS2的多接口代码,有朋友反应在运行多接口示例的代码时报错,错误发生在调用change-numifs函数的时候。之前我回复说无法复现这个问题,估计是因为我的代码确实没问题。今天师弟叫我帮忙看看,我发现报的错跟那两位朋友是一样的。然后我去ns-2.33/tcl/lib/ns-lib.tcl里面调试,发现他的这个文件里面根本没有change-numifs函数,这个函数应该是在2277行。后来师弟发现解压没搞正确,没有覆盖掉原来的ns-lib.tcl,所以没有增加修改后的那部分代码。遇到这个错误的朋友可以打开这个文件确认一下是不是修改过的版本。

Tags:

Error about multiple interface support in NS-2.33

I have provided NS2 files which add multiple interface support in NS-2.33 in this page. Comments show that there are runtime error when executing the multi-interface sample. I came across this problem today, the reason is that modified files have not been unpacked correctly.

So, if you meet this runtime error, please check whether there is a change-numifs funtion in ns-2.33/tcl/lib/ns-lib.tcl at line 2277 

Tags:

Add multiple interface support in NS-2.33

Introduction:

Codes in this archive add multiple interface support in NS-2.33. I accomplished this work, thanks to Ramon's notes (http://personales.unican.es/aguerocr/). There are many places need to be modified, and there is one line need to be deleted form the legacy tcl code not be pointed out in Ramon's notes, I spent a lot of time to get it worked successfully. Therefor, I decided to share these codes with others who have the same requirement for NS

How to use:

Copy dirs in ns-2.33 to your own ns-2.33, then "make clean", "make"
Use "ns multi/single-interface.tcl" in example dir to run the simulation

Notice:

1. Single-interface scenario could be demonstrated correctly by nam, while multi-interface's nam file has some errors. However, the trace file of the multi-interface scenario shows that the multi-interface module works correctly. From the trace file we could find out that node 1 received data from mac address 0, and then forwarded to node 2. Node 2 received tcp packets from source MAC address 2, while in single-interface scenario the source MAC address would be 1.
Node 0                        Node 1                     Node 2
channel 0            channel 0    channel 2     channel 2
MAC 0                    MAC 1        MAC 2         MAC 3

2. For the single-interface scenario, code generated by NSG2 or NSBench works well. However, for the multi-interface scenario, there would be some constraints for the variabe names in the scenario script.
    1. set ns_ [new Simulator] ;# The simulator instance's variabe name must be ns_
    2. set tracefd [open multi-interface.tr w] ;# The trace file handle's variabe name must be tracefd

Download: Add multiple interface support in NS-2.33

Tags: NS2,Ramon

为NS2添加多接口支持的代码,Ramon版本

关于如何在NS2的基础上添加多接口支持,大家可以google一下,有相关的网页说明。其中比较有名的是Ramon版本(http://personales.unican.es/aguerocr/)。他有一个PDF文件,详细说明了需要修改哪些文件。但是关是这个工作也是挺烦人的。我花了一下午时间来修改所有需要修改的文件。结果死活运行不起来。花了一整个晚上来找错误,把生成节点到AODV收发请求与应答,到Channel的sendUp,全调试了个遍。死活没搞定,今天再详细看一遍,发现是在ns-mobilenode.tcl里有一句需要删除的语句,在Ramon的文档里没有说明这一点,在代码里也没有用黑体标出来,把这里改好,终于可以看到多接口收发的效果了。

之前我是想找现成的代码下载的,有人改好运行成功了但就是不共享。只能自己按着Ramon的PDF上一处处的修改,深知这种痛苦,改得不好就跟我上面样出错。因此决定把我改好的代码共享出来,代码修改是基于NS 2.33的。

下载压缩包把ns-2.33下面的文件夹复制到自己的ns目录然后重编译NS就行了。example目录下的是多接口和单接口的两个例子。下面说明几点需要注意的地方

1、单接口例子出来的nam文件是可以正常演示的,多接口的没法用动画演示。但是看trace文件可以发现多接口是正常工作的。因为数据转发的MAC地址是变化的。节点2收到数据的源MAC来自于节点1的第二个接口

Node 0                           Node 1                              Node 2
channel 0             channel 0    channel 2               channel 2
mac 0                       mac 1           mac 2                  mac 3

2、单接口例子里的变量名是可以随便取的,我这个例子是直接用NSG2生成的代码,AODV可以正常工作。多接口的例子里,在场景文件里有两个变量的命名受到约束,如果不这么命名会报TCL脚本错误

             1. set ns_ [new Simulator] ;# 仿真器变量的名字必须是 ns_
             2. set tracefd [open multi-interface.tr w] ;# trace文件句柄对应的变量必须是 tracefd

其他还有什么问题的话可以在这里发表评论,大家一起探讨一下

Tags: NS2,Ramon,多接口

tcl学习笔记(2)

if else 跟C里面一样,只不过if条件的括号变成了大括号。至于双引号的,暂时不管它吧。捡熟悉的记。

#求绝对值

if{ $x>=0 } {
     puts "abs(x)=$x"
} else {
     puts "abs(x)=[expr -$x]"
}

switch就比C的复杂多啦。可以用三种模式判断(因为tcl里面所有的值都是字符串,所以用多种类型匹配可以从分发挥字符串的优势)。-exact:精巧匹配 -glob:使用通配符匹配 -regexp:正则表达式匹配。关键的一点,在value前加--是一个好习惯。至于为啥看书上的解释吧。然后一个区别就是每种分支情况都不需要用case关键字。直接写分支。用花括号括起来。

swith -exact -- $day {
    1 { puts "Monday" }
    2 { puts "Tuesday" }
    default { puts "Other days" }
}

while也跟C的一样。跟if else一样,条件也要用大括号括起来。

set i 0; while { $i<5 } { incr i }

foreach。C#、PHP啥的都有foreach,每个都记都记混了。这可好,tcl又出一个foreach,还跟它们都不一样。又多了个要记的。先记一个简单的,有个啥带list命令的,后面再说。

foreach value {1 3 5 7 9} {
    puts "now value is $value"
}

for循环跟C也是一样的,不过不要分号了,不要小括号了。每个语句用个大括号括起来。直接上代码。

for { set i 0} { $i<10 } { incr i } {
    puts $i
}

tcl的catch很强大,估计一点点比较写不全。书上33页。

过程。其实就是函数啦。跟PHP类似,不过function改成了proc,小括号改成了大括号。而如果变量有默认值的话,不用等号,而是把变量与默认值用一个大括号框起来。调用的时候,用语句调用。变量的作用域:跟PHP一样,引用全局变量需要在函数中用global声明。

proc p { a b {c 1} } {
        set x [ expr ($a+$b)*$c ]; puts "x=$x"
        return x
}

p 1 2;#结果是3

OTCL的就不记录了,太灵活,不是笔记两行字能写清楚的。只能需要的时候翻翻书了,呵呵。

Tags: