NS2版本:2.34
 
涉及NS2代码文件:
ns-2.34/mac/channel.h
ns-2.34/mac/channel.cc
ns-2.34/mac/wireless-phyExt.h
ns-2.34/mac/wireless-phyExt.cc
ns-2.34/mac/mac-802_11Ext.h
ns-2.34/mac/mac-802_11Ext.cc
ns-2.34/mac/mac-802_11.h
ns-2.34/mac/mac-802_11.cc
ns-2.34/common/packet.h
ns-2.34/tcl/lib/ns-default.tcl
ns-2.34/Makefile
 
 
准备工作:
1.复制mac-802_11Ext.{h,cc},wireless-phyExt.{h,cc}命名为mymac-802_11.{h,cc},mywireless-phy{h,cc}
2.将mymac-802_11.{h,cc},mywireless-phy{h,cc}的代码置于自定义的命名空间MYMAC里
 
代码修改:
 
1.打开mymac-802_11.h找到
 
 

// XXX This header does not have its header access function because it shares

// the same header space with hdr_mac.

struct hdr_mac802_11 {
    struct frame_control dh_fc;
    u_int16_t dh_duration;
    u_char dh_ra[ETHER_ADDR_LEN];
    u_char dh_ta[ETHER_ADDR_LEN];
    u_char dh_3a[ETHER_ADDR_LEN];
    u_int16_t dh_scontrol;
    u_char dh_body[0]; // size of 1 for ANSI compatibility

};

这是NS2中对802.11mac头部的实现,按照NS2文档如果要定义一个新的协议头必须定义static int offset_以及inline static {some mac sturct}* access(const Packet* p)函数,以使NS2能在class Packet中定位到你的头部,这种方法不是很理想,有时候我们只是对已有的头部做一些修改,并不需要重新定义一个头部,按文档的做法会增加不必要的内存 开销,这里我们看上面的注释,翻译过来就是“头部并没有定义自己的头部访问函数,因为它和hdr_mac(定义在mac.h中)使用同样的空间”,这就给 我们提供了另一中添加自定义报头的方法,我们可以在上面的机构中加入我们的数据段,不需要考虑数据对齐的问题,因为上面的头部结构定义在NS2中只是用在 传输头部信息,而真实的数据长度在hdr_cmn.size_中,但是有一点要注意确保 sizeof(hdr_mac802_11)==sizeof(hdr_mac)。那怎么访问自定义头部呢?我们看到packet.h中,找 到#define HDR_MAC802_11(p) ((hdr_mac802_11 *)hdr_mac::access(p)),使用该宏就能定位到自己的头部了。

    头部数据已经定义好了,我们得告诉NS2头部数据的真正长度,以便NS2计算传输时间,打开mymac-802_11.cc找到

void TXC::prepareMPDU(Packet *p) {
    hdr_cmn* ch = HDR_CMN(p);
    struct hdr_mymac802_11* dh = HDR_MYMAC802_11(p);
    ch->size() += mac_->phymib_.getHdrLen11();

dh->dh_fc.fc_protocol_version = MAC_ProtocolVersion;
    dh->dh_fc.fc_type = MAC_Type_Data;
    dh->dh_fc.fc_subtype = MAC_Subtype_Data;
    dh->dh_fc.fc_to_ds = 0;
    dh->dh_fc.fc_from_ds = 0;
    dh->dh_fc.fc_more_frag = 0;
    dh->dh_fc.fc_retry = 0;
    dh->dh_fc.fc_pwr_mgt = 0;
    dh->dh_fc.fc_more_data = 0;
    dh->dh_fc.fc_wep = 0;
    dh->dh_fc.fc_order = 0;
    dh->dh_scontrol = mac_->sta_seqno_++;

ch->txtime() = mac_->txtime(ch->size(), ch->mod_scheme_);

if ((u_int32_t)ETHER_ADDR(dh->dh_ra) != MAC_BROADCAST) {
        dh->dh_duration = mac_->usec(mac_->txtime(mac_->phymib_.getACKlen(),
                mac_->phymib_.getBasicModulationScheme())
                + mac_->macmib_.getSIFS());
    } else {
        dh->dh_duration = 0;
    }
}

看到ch->size() += mac_->phymib_.getHdrLen11(),getHdrLen11定义如下

getHdrLen11() {
return(HDR_MYMAC_LEN
+ ETHER_FCS_LEN);
}
 
在mac-802_11Ext中原来实现如下
getHdrLen11() {
return(offsetof(struct hdr_mac802_11, dh_body[0])
+ ETHER_FCS_LEN);
}
使用求偏移得到hdr_mac802_11结构大小,由于我自己添加了3个字节数据在使用偏移会由于对齐问题得到的大小比我实际的大,所以这里不采用偏移
    接下来找到

static class Mac802_11ExtClass : public TclClass {
public:
    Mac802_11ExtClass() :
        TclClass("Mac/Mac802_11Ext") {
    }
    TclObject* create(int, const char*const*) {
        return (new Mac802_11Ext());
    }
} class_mymac802_11;

将TclClass("Mac/Mac802_11Ext")改为TclClass("Mac/MyMac802_11"),以在tcl中将Mac/MyMac802_11和自定义的mac协议绑定

2.打开mywireless-phy.cc,将#include "wireless-phyExt.h",#include "mac-802_11Ext.h"改为#include "mywireless-phy.h",#include "mymac-802_11.h"

找到

static class WirelessPhyExtClass : public TclClass {
public:
    WirelessPhyExtClass() :
        TclClass("Phy/WirelessPhyExt") {
    }
    TclObject* create(int, const char*const*) {
        return (new WirelessPhyExt);
    }
} class_WirelessPhyExt;

将TclClass("Phy/WirelessPhyExt")改为TclClass("Phy/MyWirelessPhy"),已以在tcl中将Phy/MyWirelessPhy与自定义的物理层协议绑定

 
3.打开channel.cc,添加#include "mywireless-phy.h",找到

void
WirelessChannel::calcHighestAntennaZ(Phy *tifp)
{
       double highestZ = 0;
       Phy *n;
 
       // HACK: the dynamic_cast is a workaround only!

for(n = ifhead_.lh_first; n; n = n->nextchnl()) {
         if(dynamic_cast<MYMAC::WirelessPhyExt*>(n)) {
             if(((MYMAC::WirelessPhyExt *)n)->getAntennaZ() > highestZ)
                 highestZ = ((MYMAC::WirelessPhyExt *)n)->getAntennaZ();
         } else if(dynamic_cast<WirelessPhyExt*>(n)) {
             if(((WirelessPhyExt *)n)->getAntennaZ() > highestZ)
                 highestZ = ((WirelessPhyExt *)n)->getAntennaZ();
         } else if (dynamic_cast<WirelessPhy*>(n)) {
             if(((WirelessPhy *)n)->getAntennaZ() > highestZ)
                 highestZ = ((WirelessPhy *)n)->getAntennaZ();
         } else highestZ = 0;
       }

highestAntennaZ_ = highestZ;

if (dynamic_cast<MYMAC::WirelessPhyExt*>(tifp)) {
         MYMAC::WirelessPhyExt *wifp = (MYMAC::WirelessPhyExt *)tifp;
         distCST_ = wifp->getDist(wifp->getPowerMonitorThresh(), wifp->getPt(),wifp->getAntennaRxGain(), wifp->getAntennaTxGain(),
             highestZ , highestZ, wifp->getL(),
             wifp->getLambda());
       } else if (dynamic_cast<WirelessPhyExt*>(tifp)) {
             WirelessPhyExt *wifp = (WirelessPhyExt *)tifp;
             distCST_ = wifp->getDist(wifp->getPowerMonitorThresh(), wifp->getPt(),wifp->getAntennaRxGain(), wifp->getAntennaTxGain(),
                 highestZ , highestZ, wifp->getL(),
                 wifp->getLambda());
           } else if (dynamic_cast<WirelessPhy*>(tifp)) {
         WirelessPhy *wifp = (WirelessPhy *)tifp;
         distCST_ = wifp->getDist(wifp->getCSThresh(), wifp->getPt(), 1.0, 1.0,
                 highestZ , highestZ, wifp->getL(),
                 wifp->getLambda());
       } else distCST_ = DBL_MAX;
}

这是用来计算天线高度的,上面的有MYMAC名空间的代码都是我添加的

 
4.打开ns-default.tcl,在里面添加一些默认参数
 
5.打开Makefile,在OBJ_CC后添加中mymac-802_11.o mywireless-phy.o
 

最后重新编译自定义的mac协议就添加完成了。

源地址:http://blog.myspace.cn/e/407621022.htm

【NS2】NS2修改MAC协议(转载)的更多相关文章

  1. 【NS2】常用资源(转载)

    (一). NS常用基本网站 1. 寻求问题答案最好的地方.    http://mailman.isi.edu/pipermail/ns-users/ 2. 柯老师的网站,包含很多非常实用资源:安装, ...

  2. dSploitzANTI渗透教程之修改MAC地址与Wifi监听器

    dSploitzANTI渗透教程之修改MAC地址与Wifi监听器 dSploitzANTI基本配置 渗透测试是一种安全性较大的工作.所以,在实施渗透测试之前进行一些简单设置.如修改MAC地址.了解网络 ...

  3. Linux/CentOS下修改MAC地址

    Linux/CentOS下修改MAC地址 摘自:https://blog.csdn.net/qq_33233768/article/details/64906265 2017年03月22日 11:06 ...

  4. ZZ : Ubuntu:永久修改MAC地址

    方法一: 1)编辑“/etc/init.d/rc.local”文件(sudo gedit /etc/init.d/rc.local) 2)在此配置文件的最后面加上如(Ubuntu:修改网卡的MAC地址 ...

  5. iOS开发之如何修改Mac截屏保存路径

    如何修改Mac截屏保存路径   MAC OS X系统默认的截图路径是桌面文件夹,默认的截图格式是 PNG 图片格式,如何自定义设置呢? 截图保存路径 打开终端(Terminal)并输入如下命令: de ...

  6. 修改Mac]Bringing interface etch0:Device

    OS版本:Red Hat Enterprise Linux AS4/5 网上有很多关于linux下修改MAC地址的方法,大多依葫芦画瓢,似乎都没验证过,达不到修改的目的. 经过我的详细测试,最终成功解 ...

  7. 嵌入式 Linux下修改MAC地址

    Linux下修改MAC地址 方法一: 1.关闭网卡设备ifconfig eth0 down2.修改MAC地址ifconfig eth0 hw ether MAC地址3.重启网卡ifconfig eth ...

  8. macOS 自动修改mac地址脚本

    介于 某公众号提供了通过修改mac地址来链接BUPT_mobile 的推送,上网上查了一下咋写脚本,实现一键修改mac地址的功能 网上有自动修改mac地址的程序,但是很坑爹的要收费,所以不如自力更生写 ...

  9. linux下修改MAC地址方法

    一.修改MAC地址方法linux环境下:需要用 #ifconfig eth0 down 先把网卡禁用 再用ifconfig eth0 hw ether 1234567890ab 这样就可以改成功了要想 ...

随机推荐

  1. HDU3374 字符串最大最小表示法模板

    一开始没太看懂什么意思,拿笔反复推了一遍才大概知道最大最小表示法是怎么求的,感觉太神奇了... #include <iostream> #include <cstdio> #i ...

  2. Leetcode137. Single Number II只出现一次的数字2

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: ...

  3. c# 调用7za.exe执行压缩命令

    string path7z = $"7zsource\\{project.name}"; string path7zip = $"7z\\{project.name}.7 ...

  4. NYoj536 矩阵链乘

    经典问题没啥说的 #include<stdio.h> #include<string.h> #define max 100+1 #define min(a,b) (a<b ...

  5. 从零开始Android逆向教程(二)——什么是Xposed

    前言在阅读本文之前,假设你的手机已经root,并且已经成功安装好了 XposedInstaller. Xposed是什么?       Xposed 是一个 Android 平台上的动态劫持框架,通过 ...

  6. 如何获取Expression Design 4工具与Expression Blend 4工具

    在VS2010+C#+WPF 开发项目过程中涉及到界面的布局与设计,网上有人讲采用Expression Design 4与Expression Blend 4工具相当方便, 于是决定试看看,下面将这个 ...

  7. JavaScript如何实现字符串拼接操作

    实际应用中,目标字符串的生成可能需要多个数据的拼接. 由于应用频繁,几乎是所有编程语言都必须掌握的操作,当然每种语言具有各自特点. 本文将通过代码实例详细介绍一下JavaScript如何实现字符串拼接 ...

  8. 在centos 6.3系统下安装java、tomcat环境的方法与步骤(方法经过验证,可安装成功)

    一.安装java1. 下载java二进制安装包 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http ...

  9. MyBatis中动态加载where条件

    1.trim 2.where 1 = 1 where 1=1 <if test="beginDate !=null and beginDate !='' "> and ...

  10. CPU 和内存 $ free -m$ uptime$ top$ htop

    注意以下问题: 还有空余的内存吗? 服务器是否正在内存和硬盘之间进行swap? 还有剩余的CPU吗? 服务器是几核的? 是否有某些CPU核负载过多了? 服务器最大的负载来自什么地方? 平均负载是多少?