NS2中80211代码深入理解PACKET传输的流程

上传人:公**** 文档编号:459782411 上传时间:2024-01-18 格式:DOC 页数:5 大小:36.50KB
返回 下载 相关 举报
NS2中80211代码深入理解PACKET传输的流程_第1页
第1页 / 共5页
NS2中80211代码深入理解PACKET传输的流程_第2页
第2页 / 共5页
NS2中80211代码深入理解PACKET传输的流程_第3页
第3页 / 共5页
NS2中80211代码深入理解PACKET传输的流程_第4页
第4页 / 共5页
NS2中80211代码深入理解PACKET传输的流程_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《NS2中80211代码深入理解PACKET传输的流程》由会员分享,可在线阅读,更多相关《NS2中80211代码深入理解PACKET传输的流程(5页珍藏版)》请在金锄头文库上搜索。

1、NS2中802 11代码深入理解packet传输的流程如何传送一个封包(How to transmit a packet?)首先,我们要看的第一个function是在mac-802_11.cc内的recv( ),程式会先判断目前呼叫recv( )这个packet的传输方向,若是DOWN,则表示此packet是要送出去的,因此就会再呼叫send(p, h).所以接着,我们跳到send( ),此send( )首先会去检查energy model,若是目前这个node是在睡眠状态(sleep mode),则把此packet给丢弃.然后会把handler h设定给callback_.下一步,就是去呼叫

2、sendDATA(p)和sendRTS(ETHER_ADDR(dh-dh_ra).底下是sendDATA的程式码. (部份英文说明和程式码,会因为长度的关系而拿掉,所以读者最好还是拿原本的程式码做对照)void Mac802_11:sendDATA(Packet *p)hdr_cmn* ch = HDR_CMN(p);struct hdr_mac802_11* dh = HDR_MAC802_11(p);/* 更新packet的长度,把packet的长度加上PreambleLength (内定值为144 bits), PLCPHeaderLength(内定值为48bits), Mac Head

3、er Length和ETHER_FCS_LEN */ch-size() += phymib_.getHdrLen11();/* 填入Mac Header中frame control内的子栏位值 */dh-dh_fc.fc_protocol_version = MAC_ProtocolVersion;dh-dh_fc.fc_type = MAC_Type_Data;dh-dh_fc.fc_subtype = MAC_Subtype_Data;/printf(.p = %x, mac-subtype-%dn,p,dh-dh_fc.fc_subtype);dh-dh_fc.fc_to_ds = 0;

4、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;/* 记录传送所需要花的时间,计算的方式(PreambleLength +PLCPHeaderLength) * 8 / PLCPDataRate + 剩于的封包长度(单位为bytes) * 8 / dataRate_ */* 事实上,底下的这一行程式码是个浪费,因为底下

5、又会针对是否为broadcast或unicast的封包,再计算一次 */ch-txtime() = txtime(ch-size(), dataRate_);/* 若是这是一个unicast的封包 */if(u_int32_t)ETHER_ADDR(dh-dh_ra) != MAC_BROADCAST) /* 再一次计算传送所需要花的时间 */ch-txtime() = txtime(ch-size(), dataRate_);/* duration的意思是送出去此data packet之后,此次的通讯还需要占用channel所需要的时间,这个时间的长度为传送一个ACK和一个SIF的时间 */

6、dh-dh_duration = usec(txtime(phymib_.getACKlen(), basicRate_)+ phymib_.getSIFS(); else /* 若这是一个multicast的封包 */ch-txtime() = txtime(ch-size(), basicRate_);/* 若是multicast packet,送出去此data packet之后,就算传送完成,不需要再等待ACK,因此duration为0 */dh-dh_duration = 0;/*当Mac Header中的资讯都填完后,我们先把此packet暂时地存放在Mac Layer中的local

7、 buffer,等待适当的时机再传送出去 */pktTx_ = p;底下是sendRTS的程式码. (部份英文说明和程式码,会因为长度的关系而拿掉,所以读者最好还是拿原本的程式码做对照)void Mac802_11:sendRTS(int dst)Packet *p = Packet:alloc();hdr_cmn* ch = HDR_CMN(p);struct rts_frame *rf = (struct rts_frame*)p-access(hdr_mac:ffset_);/* 检查要传送的封包大小是否是小于RTSThreshold或是不是一个broadcast的封包,若是的话,就不需

8、要传送RTS.若是在使用者所写的 tcl中没有指定RTSThreshold,则ns2会去读取ns-default.tcl的值,内定为0,因此若是使用unicast,则一定会送出去 RTS */if( (u_int32_t) HDR_CMN(pktTx_)-size() uid() = 0;ch-ptype() = PT_MAC;ch-size() = phymib_.getRTSlen();ch-iface() = -2;ch-error() = 0;bzero(rf, MAC_HDR_LEN);/* 设定RTS packet中Mac Header的栏位 */rf-rf_fc.fc_proto

9、col_version = MAC_ProtocolVersion;rf-rf_fc.fc_type = MAC_Type_Control;rf-rf_fc.fc_subtype = MAC_Subtype_RTS;rf-rf_fc.fc_to_ds = 0;rf-rf_fc.fc_from_ds = 0;rf-rf_fc.fc_more_frag = 0;rf-rf_fc.fc_retry = 0;rf-rf_fc.fc_pwr_mgt = 0;rf-rf_fc.fc_more_data = 0;rf-rf_fc.fc_wep = 0;rf-rf_fc.fc_order = 0;/* 把要传

10、送的目的位址存放到RA */STORE4BYTE(&dst, (rf-rf_ra);/* 存放传送RTS所需要花的时间, RTS Frame是用basicRate_传送 */ch-txtime() = txtime(ch-size(), basicRate_);/* 把传送端的位址放到TA */STORE4BYTE(&index_, (rf-rf_ta);/* 计算duration,计算的公式为: SIF + T(CTS) + SIF + T(Pkt) + SIF + T(ACK) */rf-rf_duration = usec(phymib_.getSIFS()+ txtime(phymib

11、_.getCTSlen(), basicRate_)+ phymib_.getSIFS()+ txtime(pktTx_)+ phymib_.getSIFS()+ txtime(phymib_.getACKlen(), basicRate_);/* 把建立好的RTS packet先暂时存放到pktRTS_ */pktRTS_ = p;看完sendDATA( )和sendRTS( )之后,我们再回到send( ).接着,就指定一个unique sequence number给这个data packet.为了更清处的说明,底下把剩余的程式码贴在底下./ * 这是在send( )内的程式码 */*

12、若是目前backoff timer并没有在 count down */if(mhBackoff_.busy() = 0) /* 此时channel又是idle */if(is_idle() /* 若是节点已经再等待defer timer,则让defer timer继续,因此不做任何的设定.但是若没有defer timer,就要根据802.11的规定,需要再等待一个DIFS和一个random time才能做资料的传送,而这个random time是由0, cw_所决定的 */if (mhDefer_.busy() = 0) rTime = (Random:random() % cw_)*(phy

13、mib_.getSlotTime();mhDefer_.start(phymib_.getDIFS() + rTime);/* 此时channel若是busy */else mhBackoff_.start(cw_, is_idle();做完以上的事情后, send()已经完成了.然后,当Defer timer expires的时候,程式就会去呼叫deferHandler(),在deferHandler()中会先去呼叫check_pktCTRL(),但因为目前pktCTRL没有资料(回传-1),所以会继续去执行check_pktRTS().若是目前channel是idle的状态,check_p

14、ktRTS()内的程式码就会去设定传输状态为MAC_RTC,并且计算送出RTS timeout的时间,算法为:timeout = txtime(phymib_.getRTSlen(), basicRate_)+ DSSS_MaxPropagationDelay / 设定为2 us,可以参考mac-802_11.h+ phymib_.getSIFS()+ txtime(phymib_.getCTSlen(), basicRate_)+ DSSS_MaxPropagationDelay; / 设定为2 us,可以参考mac-802_11.h设定完后,就会去执行transmit(pktRTS_, t

15、imeout),把RTS的packet送出去.送完RTS后,我们必需等待CTS,所以我们再回到recv()中的mhRecv_.start(txtime(p),这个程式码主要是等待整个 packet完全接收后就会去呼叫recvHandler(),而recvHandler()就会再去呼叫recv_timer(),若是判断所收到的 packet是CTS,则再呼叫recvCTS(pktRx_).在recvCTS()中,因为已收到CTS,则代表RTS已传送成功,因此把 pktRTS_ = 0和ssrc_=0,然后再呼叫tx_resume().在tx_resume()中,由于已成功的做完RTS/CTS,现在要准备送出data.这部份的程式如下所示/ * 若是pktTx_有资料要传送 */else if(pktTx_) if (mhBackoff_.busy() = 0)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号