现在的位置: 首页 > 综合 > 正文

在ns2中实现一种新的报文头部(转帖)

2013年07月15日 ⁄ 综合 ⁄ 共 1552字 ⁄ 字号 评论关闭

在ns2中实现一种新的报文头部

在ns2中实现一种新的报文头部需要以下几步:

1 用一个结构体定义这个协议,注意必须提供另外的几个方法,例如下面这个协议结构体:

struct hdr_brcast {
int hop;

static int offset_;
inline static int& offset() { return offset_; } 
inline static hdr_brcast* access(const Packet* p) {
return (hdr_brcast*) p->access(offset_);
}
};
其中 变量 hop是 这个协议的具体内容 ,而另外的变量和方法都是ns2中为了实现一种协议所另外需要的.
offset_:在ns2开始执行的时候会初始化这个offset_,通过offset_才能在整个报文头部中访问到brast这个报文

2 向otcl语言(c++类在tcl中的映象)注册这个结构体,形成tcl映像类

int hdr_brcast::offset_; //对于静态变量必须这么写一下

static class BrcastHeaderClass:public PacketHeaderClass {
public :
BrcastHeaderClass():PacketHeaderClass("PacketHeader/BRCAST",sizeof(hdr_brcast)){

bind_offset(&hdr_brcast::offset_); 
}
}class_brcastHeader;

当然注册一个tcl映像类都是通过tcl这个类来实现的 , 通过查看PacketHeaderClass发现,它确实是这么作的.
它作了两件事情,一个是注册一个新的tcl类 ,一个是设置了这个类的大小,也就是将结构体的大小通知给tcl.

3 让新的包头起作用

让新的包头起作用,就是要在packet这个类中放置新的包头.所以在ns启动的时候,它会根据一个函数向packet中放置需要的包头,所以需要修改这个函数,这个函数在ns-packet.tcl文件中 ,严格讲它不是一个函数,就是几条语句,在ns执行的时候,它会被执行:

foreach prot {

.......

BRCAST ###added by your self

} {

add-packet-header $prot

}

另外注意在ns的Simulator的init这个函数中调用了 :$self create_packetformat ,这个函数正是来设置需要的协议的.

总结一下ns启动的时候设置协议应该有两步,一个是把协议放置到ns的packet类中,另外一个是设置每个协议在packet中的offset,细致分析在ns中这两步都实现了.通过这两步就把这个新协议注册上了.这样就可以通过下面的函数来任意访问一个packet中我门的新协议了 :

hdr_brcast* brh=hdr_brcast::access(pkt);

另外在c++中为了访问这个协议的名称,在packet.h中需要对新的协议作一下记录.修改两个地方就可以,向枚举表中添加名称,并在构造函数中给出具体的名字.

在添加完新的协议之后,为了让协议起作用,由于部分静态变量的存在,需要make clean 一下,让后再make。

不过还是不太理解。“根据一个函数向packet中放置需要的包头,所以需要修改这个函数”,这样做不是把所有激活了的分组头都加入到分组中?但是在某个具体协议产生的分组中没有必要用到所有的分组头吧?

是不是这里所说的“分组”和在网络中传输的数据“分组”概念不同?

是啊 , 默认的ns2报文是包含所有的定义的报文头部的, 在ns2中你可以把不需要去掉,这样可以节约空间. 你看看ns-lib.tcl这个文件就明白怎么去掉了.

报文格式是差不多的 , 有些地方不是完全一致.

【上篇】
【下篇】

抱歉!评论已关闭.