?? 原創(chuàng)-----如何往ns2中添加新的mac協(xié)議.txt
字號:
原創(chuàng)-----如何往NS2中添加新的MAC協(xié)議
網(wǎng)上有關(guān)于往NS2中添加新的路由協(xié)議的文章,卻沒有關(guān)于往NS2中添加新的MAC協(xié)議的文章。下面我給大家講一下如何往NS2中添加新的MAC協(xié)議。
往NS2.29中添加了一個新的MAC協(xié)議,暫時命名為LMAC.其實它的代碼內(nèi)容和SMAC一樣,我只是想驗證一下如何在NS2.29中添加新的協(xié)議。
1.在~/ns-allinone-2.29/ns-2.29/mac目錄下copy原來的smac.cc和smac.h
cp smac.cc lmac.cc
cp smac.h lmac.h
2.打開lmac.cc和lmac.h,把所有的SMAC替換成LMAC,把所有的smac替換成lmac,把所有的Smac替換成Lmac.
3.修改packet.h
打開packet.h,找到匹配字符串SMAC,然后照著樣子修改就可以了。
packet.h在~/ns-allinone-2.29/ns-2.29/common目錄下
添加定義訪問協(xié)議報頭的指針
#define HDR_SMAC(p) ((hdr_smac *)hdr_mac::access(p))
#define HDR_LMAC(p) ((hdr_lmac *)hdr_mac::access(p)) // add lmac here
增加LMAC包類型(協(xié)議標(biāo)志),所有的包類型都是PT_開頭,如PT_TCP,PT_UDP等,在枚舉類型enum packet_t{}中找到 PT_SMAC,
添加LMAC
// SMAC packet
PT_SMAC,
// LMAC packet
PT_LMAC,
注意新添加的協(xié)議要在PT_NTYPE之前。
然后在類class p_info{}的構(gòu)造函數(shù)中找到
name_[PT_SMAC]="smac";
添加 name_[PT_LMAC]="lmac";這樣就可以通過協(xié)議標(biāo)識尋找協(xié)議對應(yīng)的字符串
同樣注意要在 name_[PT_NTYPE]= "undefined";之前定義
4.修改ns-default.tcl文件,在~/ns-allinone-2.29/ns-2.29/tcl/lib目錄下
找到
# Turning on/off sleep-wakeup cycles for SMAC
Mac/SMAC set syncFlag_ 1
# Nodes synchronize their schedules in SMAC
Mac/SMAC set selfConfigFlag_ 1
# Default duty cycle in SMAC
Mac/SMAC set dutyCycle_ 10
這里定義了otcl對象的缺省值,我們在這里添加LMAC的缺省值
#add LMAC here
# Turning on/off sleep-wakeup cycles for LMAC
Mac/LMAC set syncFlag_ 1
# Nodes synchronize their schedules in LMAC
Mac/LMAC set selfConfigFlag_ 1
# Default duty cycle in LMAC
Mac/LMAC set dutyCycle_ 10
繼續(xù)尋找SMAC,找到
# Turning on/off sleep-wakeup cycles for SMAC
Mac/SMAC set syncFlag_ 0
添加相應(yīng)的LMAC
# Turning on/off sleep-wakeup cycles for LMAC
Mac/LMAC set syncFlag_ 0
5.修改ns-packet.tcl文件,在~/ns-allinone-2.29/ns-2.29/tcl/lib目錄下
在foreach prot{}這個函數(shù)中找到Smac,
Smac # Sensor-MAC
添加一行: Lmac # A new Sensor-MAC
6.修改Makefile文件,在~/ns-allinone-2.29/ns-2.29/目錄下
找到smac.o
mac/mac-802_3.o mac/mac-tdma.o mac/smac.o \
添加lmac.o到ns的目標(biāo)文件列表:
mac/mac-802_3.o mac/mac-tdma.o mac/smac.o mac/lmac.o\
7.經(jīng)過以上幾步,一個新的協(xié)議就一經(jīng)添加成功了,但是這個新的LMAC協(xié)議產(chǎn)生的trace文件格式不正確,
還要修改cmu-trace.cc和cmu-trace.h文件,在~/ns-allinone-2.29/ns-2.29/trace目錄下
修改cmu-trace.h文件,找到這一行:
void format_smac(Packet *p, int offset);
增加一行:
void format_lmac(Packet *p, int offset);
然后修改cmu-trace.cc文件,這個文件是修改的關(guān)鍵!!
在void
CMUTrace::format_mac_common(Packet *p, const char *why, int offset)
這個函數(shù)中修改,添加進去LMAC
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);
struct hdr_mac802_11 *mh;
struct hdr_smac *sh;
struct hdr_lmac *ph; // 新添加一個指向lamc包的指針
char mactype[SMALL_LEN];
strcpy(mactype, Simulator::instance().macType());
if (strcmp (mactype, "Mac/SMAC") == 0)
sh = HDR_SMAC(p);
else if (strcmp (mactype,"Mac/LMAC") == 0) // 判斷是不是LMAC包,新添加的語句
ph = HDR_LMAC(p);
else
mh = HDR_MAC802_11(p);
繼續(xù)往下找SMAC,添加LMAC
if (strcmp (mactype, "Mac/SMAC") == 0) {
format_smac(p, offset);
}
else if (strcmp (mactype, "Mac/LMAC") == 0) { //新添加的語句
format_lmac(p, offset);
}
else {
format_mac(p, offset);
}
return;
在if(newtrace){}的判斷語句中找到SMAC
// mac layer extension
offset = strlen(pt_->buffer());
if (strcmp(mactype, "Mac/SMAC") == 0) {
format_smac(p, offset);
}
else if (strcmp(mactype, "Mac/LMAC") == 0) { //新添加的語句
format_lmac(p, offset);
}
else {
format_mac(p, offset);
}
繼續(xù)找SMAC,找到:
(ch->ptype() == PT_SMAC) ? (
(sh->type == RTS_PKT) ? "RTS" :
(sh->type == CTS_PKT) ? "CTS" :
(sh->type == ACK_PKT) ? "ACK" :
(sh->type == SYNC_PKT) ? "SYNC" :
"UNKN") :
packet_info.name(ch->ptype())),
ch->size());
添加LMAC的判斷
(ch->ptype() == PT_SMAC) ? (
(sh->type == RTS_PKT) ? "RTS" :
(sh->type == CTS_PKT) ? "CTS" :
(sh->type == ACK_PKT) ? "ACK" :
(sh->type == SYNC_PKT) ? "SYNC" :
"UNKN") :
(ch->ptype() == PT_LMAC) ? ( //這一塊代碼是新添加的
(ph->type == RTS_PKT) ? "RTS" :
(ph->type == CTS_PKT) ? "CTS" :
(ph->type == ACK_PKT) ? "ACK" :
(ph->type == SYNC_PKT) ? "SYNC" :
"UNKN") :
packet_info.name(ch->ptype())),
ch->size());
這里要好好看看源代碼,看清楚程序的結(jié)構(gòu),不要添加錯了
再繼續(xù)找,添加LMAC
if (strncmp (mactype, "Mac/SMAC", 8) == 0) {
format_smac(p, offset);
}
else if (strncmp (mactype, "Mac/LMAC", 8) == 0) { //新添加的代碼
format_lmac(p, offset);
}
else {
format_mac(p, offset);
}
再往下找,找到這個函數(shù):
void
CMUTrace::format_smac(Packet *p, int offset)
{
struct hdr_smac *sh = HDR_SMAC(p);
sprintf(pt_->buffer() + offset,
" [%.2f %d %d] ",
sh->duration,
sh->dstAddr,
sh->srcAddr);
}
照著樣子給LMAC寫一個相同功能的函數(shù):
void
CMUTrace::format_lmac(Packet *p, int offset)
{
struct hdr_lmac *ph = HDR_LMAC(p);
sprintf(pt_->buffer() + offset,
" [%.2f %d %d] ",
ph->duration,
ph->dstAddr,
ph->srcAddr);
}
然后找到void CMUTrace::format(Packet* p, const char *why)這個函數(shù)
添加
switch(ch->ptype()) {
case PT_MAC:
case PT_SMAC:
case PT_LMAC: //這是新添加的LMAC協(xié)議
break;
case PT_ARP:
format_arp(p, offset);
break;
最后在文件的開頭找到#include <smac.h>
添加#include <lmac.h>
到此為止,協(xié)議添加完成
8.回到目錄~/ns-allinone-2.29/ns-2.29下,執(zhí)行命令:
make clean
make depend
make
make結(jié)束后運行,發(fā)現(xiàn)報錯,說smac.h和lmac.h有函數(shù)重定義了,這是因為cmu-trace.cc文件同時include了smac.h和lmac.h,
所以當(dāng)smac.h和lmac.h有相同名字的定義時,就會報錯,解決方法是把lmac.h中與smac.h重名的類改成其它名字,當(dāng)然在lmac.cc中要做相應(yīng)的修改。
9.如何評價新的協(xié)議是否添加成功?
在添加新的協(xié)議之前,我一經(jīng)運行了ns smac.tcl,把smac.tr文件備份為smac.tr.bak。添加了新的協(xié)議后,我重新運行ns smac.tcl,得到新的smac.tr文件,然后我執(zhí)行命令
diff -b smac.tr smac.tr.bak
發(fā)現(xiàn)這兩個文件內(nèi)容一模一樣,說明原來的協(xié)議SMAC運行正常。
然后我修改了smac.tcl,命名為lmac.tcl,調(diào)用LMAC協(xié)議,然后執(zhí)行命令ns lmac.tcl,產(chǎn)生trace文件lmac.tr
執(zhí)行命令
diff -b smac.tr lmac.tr
發(fā)現(xiàn)這兩個trace文件的內(nèi)容是一樣的,這說明LMAC協(xié)議添加成功了,耶~~~~~~~~~~~~~~~~~~~~
10.在添加新的協(xié)議中注意的一些問題和相關(guān)技巧:
添加一個新的協(xié)議,要照著原來協(xié)議的方法寫。其實最簡單的方法是把含有SMAC,smac,Smac字符串的文件都找出來,然后照樣子添加LMAC協(xié)議就可以了。
~/ns-allinone-2.29/ns-2.29/gen下的文件是make的時候自動生成的,不用修改
在~/ns-allinone-2.29/ns-2.29/tcl/lib下,文件ns-lib.tcl也含有SMAC的內(nèi)容,主要是在tcl調(diào)用smac時大印出警告語句,告訴用戶SMAC要40秒后才能同步。這個文件可以修改,也可以不修改,對運行結(jié)果(trace文件)沒有影響。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -