NS2.35中添加MAC协议

来源:互联网 发布:如何评价日本人知乎 编辑:程序博客网 时间:2024/05/17 04:01
1.在~/ns-allinone-2.35/ns-2.35/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.35/ns-2.35/common目录下
  添加定义访问协议报头的指针
  #define HDR_SMAC(p)     ((hdr_smac *)hdr_mac::access(p))
  #define HDR_LMAC(p)     ((hdr_lmac *)hdr_mac::access(p))       // add lmac here
  增加LMAC包类型(协议标志),所有的包类型都是PT_开头,如PT_TCP,PT_UDP等。 packet.h是定义分组类型头文件,这里要修改packet_t的类型。2.35不同,自从ns-2.33就修改了,加入了对动态库的支持。packet_t从enum枚举类型改成了unsigned int类型,为了使得新加动态库中可以动态定义新的分组。预定义的分组类型通过static const来实现.
static const packet_t PT_TCP = 0;
……
……
static packet_t PT_NTYPE = 73; // This MUST be the LAST one
这些都是分组类型,最后一行的PT_NTYPE必须是最后一个,那么在这行之前加入PT_LMAC类型。
static const packet_t PT_TCP = 0;
……
……
static const packet_t PT_LMAC = 73;
static packet_t PT_NTYPE = 74; // This MUST be the LAST one
然后在类class p_info{}的构造函数中找到
      name_[PT_SMAC]="smac";
添加 name_[PT_LMAC]="lmac";这样就可以通过协议标识寻找协议对应的字符串
    同样注意要在 name_[PT_NTYPE]= "undefined";之前定义

4.修改ns-default.tcl文件,在~/ns-allinone-2.35/ns-2.35/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 
    
    继续寻找SMAC,找到
    # Turning on/off sleep-wakeup cycles for SMAC
   Mac/SMAC set syncFlag_ 0
    添加相应的LMAC
    # Turning on/off sleep-wakeup cycles for LMAC
    Mac/LMAC set syncFlag_ 0

  5.修改ns-packet.tcl文件,在~/ns-allinone-2.35/ns-2.35/tcl/lib目录下
    在set protolist()这个函数中找到Smac,
      Smac    # Sensor-MAC
    添加一行: Lmac    # A new Sensor-MAC

  6.修改Makefile文件,在~/ns-allinone-2.35/ns-2.35/目录下
    找到smac.o
   mac/mac-802_3.o mac/mac-tdma.o mac/smac.o \
    添加lmac.o到ns的目标文件列表:
   mac/mac-802_3.o mac/mac-tdma.o mac/smac.o mac/lmac.o \
7.经过以上几步,一个新的协议就一经添加成功了,但是这个新的LMAC协议产生的trace文件格式不正确,
   还要修改cmu-trace.cc和cmu-trace.h文件,在~/ns-allinone-2.35/ns-2.35/trace目录下
   修改cmu-trace.h文件,找到这一行:
   void    format_smac(Packet *p, int offset);
   增加一行:
  void    format_lmac(Packet *p, int offset);
   然后修改cmu-trace.cc文件,这个文件是修改的关键!!
   在void
  CMUTrace::format_mac_common(Packet *p, const char *why, int offset)
  这个函数中修改,添加进去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);
  继续往下找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);
            }
  继续找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());
  这里要好好看看源代码,看清楚程序的结构,不要添加错了
  再继续找,添加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);
        }
  再往下找,找到这个函数:
  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写一个相同功能的函数:
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)这个函数
添加 
  switch(ch->ptype()) {
        case PT_MAC:
        case PT_SMAC:
        case PT_LMAC:                    //这是新添加的LMAC协议
                break;
        case PT_ARP:
                format_arp(p, offset);
                break;
最后在文件的开头找到#include <smac.h>
添加#include <lmac.h>
到此为止,协议添加完成

8.回到目录~/ns-allinone-2.35/ns-2.35下,执行命令:
  make clean
  make depend
  make 
make结束后运行,发现报错,说smac.h和lmac.h有函数重定义了,这是因为cmu-trace.cc文件同时include了smac.h和lmac.h,
所以当smac.h和lmac.h有相同名字的定义时,就会报错,解决方法是把lmac.h中与smac.h重名的类改成其它名字,当然在lmac.cc中要做相应的修改。按照提示修改类名即可。
* 重新编译NS
我也每次都遇到了协议未添加成功的错误。找了很多问题,试着添加过其他协议均未成功。
make clean 
make depend
执行完make ,再执行 sudo make install
如果不install ,NS默认执行的是位于/usr/bin目录下的ns 而不是位于ns-2.35目录下刚编译过的ns。
0 0
原创粉丝点击