【NS2】NS2修改MAC协议(转载)

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

时间: 2024-10-26 06:24:46

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

【NS2】常用资源(转载)

(一). NS常用基本网站 1. 寻求问题答案最好的地方.    http://mailman.isi.edu/pipermail/ns-users/ 2. 柯老师的网站,包含很多非常实用资源:安装,trace文件分析,源代码分析,添加新协议的途径等    http://140.116.72.80/~smallko/ns2/ns2.htm 3. NS本身的一些bug等信息,如果你的问题怎么都解决不了,可以来这里看看,或许会使你豁然开朗:)    http://www.isi.edu/nsnam/

如何用NTFS For Mac修改Mac上ntfs参数

日常生活中,很多的mac电脑的用户在使用mac的时候需要读取一些NTFS格式的外置硬盘,但是有时往往读取不了,这个一些用户朋友带来了很大的困扰.NTFS For Mac这款软件就是来给大家解决这方面困扰的.下面我们就来给大家介绍介绍如何用NTFS For Mac修改Mac上ntfs参数? 图一: 图标         我们提到过NTFS For Mac提供Mac上NTFS档案系统的高级支援,它对我们还有以下作用:        在所需的NTFS分区上启动所有新创建档/档夹的访问权限,设定哪些用户

Linux下永久修改MAC地址和ifconfig命令总结

1. 固定一个MAC地址,特别是在使用多个虚拟机的时候 linux环境下: 用root身份登录,在/etc/rc.d/rc.local里加上这三句 ifconfig eth0 down ifconfig eth0 hw ether 00:0C:18:EF:FF:ED ifconfig eth0 up 这样重新reboot后就不怕MAC复原了. 2. ifconfig命令(转载http://www.cnblogs.com/taobataoma/archive/2007/12/27/1016689.

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

dSploitzANTI渗透教程之修改MAC地址与Wifi监听器 dSploitzANTI基本配置 渗透测试是一种安全性较大的工作.所以,在实施渗透测试之前进行一些简单设置.如修改MAC地址.了解网络等.通过进行简单的配置,不仅可以保护自己的身份被暴漏,而且还可以提高渗透效率.因此,本章将介绍一些基本配置. 修改MAC地址 由于zANTI是一款渗透测试工具,所以在扫描时可能会被一些安全软件拦截,如360.因此,为了不暴漏自己的真实身份,用户可以在渗透之前修改自己的MAC地址.下面将介绍修改MAC

用派克斯出现651 查看&修改mac地址的方法

1.winxp查看mac地址的方法 2.winxp修改mac地址的方法 电脑MAC地址是网卡适配器在出厂时就已经被固定了的,也叫物理地址,每块网卡适配器有全球唯一的MAC地址,一般情况是不需要修改MAC地址的,但有些特殊情况需要更改MAC地址来实现一些特殊的要求,修改之前大家先知道如何查看 第一种方法 1.在开始菜单栏选择"运行" 2.在运行中输入"cmd" 3.我们会看到有一个黑色窗口弹出,在里边输入"ipconfig /all"然后按回车键

联想A820T 修改MAC

实测机为联想A820T安卓4.1.2 一·准备工作 1·R.E管理器 (安卓) 2·获取root权限 3·十六进制编辑器(UltraEdit_SC17_PC版或者直接安卓版的编辑器也行) 二·步骤 1·用R.E管理器按路径data/nvram/APCFG/APRDEB/WIFI找到WiFi这个文件(路径可能各种手机不相同) 2·复制WiFi文件到/sdcard/下面的任意地方,或者复制到到电脑上 修改还方便点, 3·用十六进制编辑器打开你复制出来的WiFi文件,如图可以直接看得到MAC,测试机M

修改Mac系统的文件权限

修改Mac系统的文件权限 有时候,因为各种各样的需求Mac OS系统使用者需要修改某个系统文件,但是很多时候Mac OS系统会提示你"没有足够的权限".所以往往会无法保侟.编辑甚至打开它们.但是,通过使用"显示简介"面板可以容易地对文件权限进行修改. 当我们要去修改一个包含成千上万个文件的文件夹权限时,问题来了,逐个文件修改权限是很耗时间的,而最好的解决办法是递归地修改权限. 操作方法: 打开文件夹的"显示简介"面板. 找到共享与权限. 解除锁定

linux下修改MAC地址的问题解决

在linux中,修改MAC地址 # ifdown eth0 # ifconfig eth0 hw ether 12:34:56:78:90:12 (修改的MAC地址跟原来的地址不同) # ifup eth0 (修改成功) 后,用# ifconfig 查看,MAC地址改变了,但之后输入#service network restart 或ifdown eth0命令时,会出现如下错语信息: Device eth0 has MAC address 12:34:56:78:90:12, instead o

手动修改MAC地址可以突破IP-MAC绑定吗?

这个世界有矛就有盾,既然有IP-MAC绑定的技术,总归就有人会尝试去突破这个绑定.一般来说,无非是通过"修改IP地址"和"修改MAC地址"两种方式. 1. IP地址的修改很简单,在"本地连接"里面,修改TCP/IP的属性就可以,如图: 2. 大多数人不知道,其实电脑还可以修改"MAC地址".如下图: 3. 所以,要防止客户机通过修改IP地址和mac地址来突破IP-MAC绑定策略,不但要对绑定列表外的IP地址禁止其上网,而且要屏