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:

tcl学习笔记(1)

赋值用set,而不是等号,第一次使用变量时,tcl会自动创建变量。对于数组的赋值也是直接使用set语句。不过比较奇怪的是,tcl的数组居然不用[]把索引框起来,用的是(),这个要牢记。数组的索引可以使用字符串(事实上,tcl中数字也是字符串-___-!!)

set a 3; set a 100;#创建a变量初值为3,将a的值赋值成100

set arr(1) 1;#把arr数组索引为1的变量赋值为1

变量引用跟PHP一样,用$引用变量。

set b $a ;# 将a的值赋给b

替换。变量替换跟PHP一样,只是没有引号将字符串框起来。命令替换象js里面的eval,只是eval()变成了[]。反斜杠的替换跟其他语言一样,就是转义符。

set a 100; puts $a.00;#打印结果是100.00

set b [expr $a*2];#b的值为200,跟eval一样,[]框起来的东西直接执行。expr表示里面是一个数学表达式

set b \$a;#b的值为$a,是一个字符串。\就是转义符

组合。因为tcl使用空格来表示不同的字符串,那么如果一个字符串有多个单词,需要将它们组合成一个字符串。组合是将多个字符串连起来。可以用双引号和大括号。双引号跟PHP里面的双引号一个作用,里面的变量可以替换。大括号跟PHP里面的单引号一个作用,里面的全部作常规字符串处理。tcl的执行规则,先组合,后替代,组合只管字符串的组成,内部变量和表达式由替代处理,那么从左到右,从里到外的规则还是要执行的,见第三个实验

set a “Hello World”; set b "length of a is [string length $a]";#b的值为length of a is 11

set a “Hello World”; set b {length of a is [string length $a]};#b的值为length of a is [string length $a]

set a 3; set b 5; puts "[set a [expr $a+$b]]=$a+$b";#8=8+5,从左到右,从里到外

数学运算。运算符跟C一模一样,连三元表达式都有,呵呵。

Tags:

NS2仿真

      终究还是逃不过这一劫啊。搞网络的,大家都用NS2做仿真,似乎NS2就是一块招牌,表示我的仿真数据是可靠的。

      大三就买了书,到现在翻了不超过20页。-______-!!

      现在要一鼓作气的把NS2学会,虽然可能完成复杂的仿真还需要假以时日,但是最基本的怎么用要先学会吧。

      工欲善其事,必先利其器。找了几个TCL的IDE,发现都不咋地,最后选择用Komodo Edit,可以完成关键字的自动补全,但是居然没有自动补全的快捷键,只能用鼠标点菜单,¥#@¥¥……%,然后似乎没有变量的自动提示,那叫一个域名啊。不知道是不是我没有配置好的原因。

       又找了个图形化生成TCL的工具,nsBench,貌似挺不错的样子,不过好像是个大众化的软件,估计我的仿真还得自己写TCL。

       第一篇就这么多,下面开始学习TCL

Tags: