免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4036 | 回复: 0
打印 上一主题 下一主题

NS2 802.11Ext数据发送 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-03 03:26 |只看该作者 |倒序浏览
摘自我的博客:http://xizhizhu.blogspot.com/2008/10/ns2-80211ext_02.html\r\n\r\n我的前一篇博客对NS2中新添加的802.11Ext协议做了简单介绍,并记录了其数据接收部分,本文记录其数据发送部分的基本流程。\r\n\r\n当mac接收到来自上层协议的数据时ac802_11Ext::recv()函数被调用,其直接调用TXC::handleMsgFromUp()函数进行处理:\r\n(1)该函数首先调用TXC::prepareMPDU()函数创建数据帧,并存放到pDATA。\r\n(2)如果需要进行单播传输,且长度大于RTS门限值,则调用TXC::generateRTSFrame()函数创建RTS帧,并存放到pRTS。\r\n(3)判断回退计数器的状态,若处于noBackoff状态,则转到4,否则转到5。\r\n(4)当前回退计数器处于noBackoff状态\r\n若信道处于noCSnoNAV状态,则:\r\na. 若需要发送RTS,则调用Mac802_11Ext::transmit()函数发送RTS帧,进入TXC_wait_RTSsent状态,结束。\r\nb. 若不需发送RTS,则调用Mac802_11Ext::transmit()函数发送数据,进入TXC_wait_PDUsent状态,结束。\r\n若信道未处于noCSnoNAV状态,则等待信道空闲,并根据是否需要发送RTS帧而进入TXC_RTS_pending或TXC_DATA_pending状态,结束。\r\n(5)当前回退计数器未处于noBackoff状态,根据是否需要发送RTS帧而进入TXC_RTS_pending或TXC_DATA_pending状态,结束。\r\n\r\n下面,我们略过等待信道和回退计数器的部分,直接进入发送RTS帧的部分。对于不需发送RTS帧的情况,情况类似,不再单独讨论。\r\n\r\n如上所述,当需要发送RTS帧时,Mac802_11Ext::transmit()函数被调用,该函数通过调用物理层的recv()函数进行处理,该函数将调用WirelessPhyExt::sendDown()函数发送数据。\r\n\r\n如果当前物理层正在接收数据,即处于RXing或PreRXing状态,则取消相应定时器,并丢弃正在接收的分组(注意,由于MAC层会根据当前信道状况进行监听等待和回退算法,应当不会出现这种情况,但此情况是根据802.11协议而来)。物理层进入TXing状态,设置TX_Timer定时器,记录当前能量状况,将分组交给底层信道的recv()函数进行处理。\r\n\r\n此时,数据已经从节点的无线网卡发出,对于其在信道上的传输,本文不做记录。而当节点接收到帧时,其在物理层的处理过程已在上一篇文章中做过介绍,就不再赘述,直接进入MAC层的RXC::handleMsgFromBelow()函数。\r\n\r\n对于接收到的控制帧\r\n(1)如果是RTS,若信道为状态CSNAV或noCSNAV,则进入RXC_Idle状态,结束,否则调用RXC::generateCTSFrame()函数创建CTS帧,并放到pCTRL中,设置定时器RXC_SIFSTimer超时时间为Short IFS,进入RXC_wait_SIFS状态,结束。\r\n当RXC_SIFSTimer计时器到时后,会调用RXC::handleSIFStimeout()函数发送CTS帧,并进入RXC_wait_sent状态。\r\n(2)如果是CTS,则调用TXC::handleCTSIndication()函数进行处理,进入RXC_Idle状态,结束。\r\n进入TXC::handleCTSIndication()函数后,若处于TXC_wait_CTS状态,则进入TXC_wait_SIFS状态,取消TXC_CTSTimer定时器,设置TXC_SIFSTimer定时器超时时间为Short IFS,结束。\r\n当TXC_CTSTimer计时器到时后,会调用TXC::handleSIFStimeout()函数发送数据,并进入TXC_wait_PDUsent状态。\r\n(3)如果是ACK,则调用TXC::handleACKIndication()函数进行相应后续处理,进入RXC_Idle状态,结束。\r\n进入TXC::handleACKIndication()函数后,当前必为TXC_wait_ACK状态。取消TXC_ACKTimer定时器,调用BackoffMgr::handleBKStart()函数初始化回退计数器,调用TXC::checkQueue()函数进入TXC_Idle状态并通告传输完成。\r\n\r\n此外,本文还省略了其他一些相对简单的操作,如节点等待CTS时若TXC_CTSTimer超时,则会尝试重新发送RTS等。\r\n\r\n继续研究,一点一点的来,下周还要考信号处理,晕菜啊~~~~考完就得好好看看软件工程和网络课的作业了,哈,研究不止,上课不停啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP