80211e源程序.docx
- 文档编号:24368896
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:64
- 大小:29.42KB
80211e源程序.docx
《80211e源程序.docx》由会员分享,可在线阅读,更多相关《80211e源程序.docx(64页珍藏版)》请在冰豆网上搜索。
80211e源程序
#undefNDEBUG
#include
#include"delay.h"
#include"connector.h"
#include"packet.h"
#include"random.h"
#include"mobilenode.h"
#include"stream.h"
#include"arp.h"
#include"ll.h"
#include"mac.h"
#include"mac-timers_802_11e.h"
#include"mac-802_11e.h"
#include"cmu-trace.h"
#include"priq.h"
//includethefollowinglinewhenusingAkaroa
//#include"akaroa.H"
#defineAKAROA0
#defineINTERVAL0.01
//XXXCan'twemakethesemacrosinlinemethods?
Otherwisewhyshouldwehave
//inlinemethodsatall?
?
#defineCHECK_BACKOFF_TIMER()\
{\
if(is_idle()&&mhBackoff_.paused()){\
mhBackoff_.resume();\
}\
if(!
is_idle()&&mhBackoff_.busy()&&!
mhBackoff_.paused()){\
mhBackoff_.pause();\
}\
if(!
is_idle()&&mhDefer_.busy())mhDefer_.stop();\
}
inlinevoid
Mac802_11e:
:
transmit(Packet*p,doublet)
{
/*
*IfI'mtransmittingwithoutdoingCS,suchaswhen
*sendinganACK,anyincomingpacketwillbe"missed"
*andhence,mustbediscarded.
*/
if(rx_state_!
=MAC_IDLE){
structhdr_mac802_11*dh=HDR_MAC802_11(p);
assert(dh->dh_fc.fc_type==MAC_Type_Control);
assert(dh->dh_fc.fc_subtype==MAC_Subtype_ACK);
assert(pktRx_);
structhdr_cmn*ch=HDR_CMN(pktRx_);
ch->error()=1;/*forcepacketdiscard*/
}
/*
*passthepacketonthe"interface"whichwillinturn
*placethepacketonthechannel.
*
*NOTE:
ahandlerispassedalongsothattheNetwork
*Interfacecandistinguishbetweenincomingand
*outgoingpackets.
*/
structhdr_cmn*sd=HDR_CMN(p);
intprio=LEVEL(p);
tx_active_=1;
sending=1;
CHECK_BACKOFF_TIMER();
downtarget_->recv(p->copy(),this);
if(sd->ptype()==PT_CBR||sd->ptype()==PT_EXP){
if(!
rtx_[prio]){
numbytes_[prio]+=sd->size()-ETHER_HDR_LEN11;
}
}
mhIF_.start(txtime(p));
mhSend_.start(t);
}
#defineSET_RX_STATE(x)\
{\
rx_state_=x;\
CHECK_BACKOFF_TIMER();\
}
#defineSET_TX_STATE(pri,x)\
{\
tx_state_[pri]=x;\
}
/*======================================================================
GlobalVariables
======================================================================*/
staticEDCF_PHY_MIBEDCF_PMIB=
{
DSSS_EDCF_SlotTime,DSSS_EDCF_CCATime,
DSSS_EDCF_RxTxTurnaroundTime,DSSS_EDCF_SIFSTime,DSSS_EDCF_PreambleLength,
DSSS_EDCF_PLCPHeaderLength,DSSS_EDCF_PLCPDataRate
};
staticMAC_MIBEDCF_MMIB=
{
MAC_EDCF_RTSThreshold,MAC_EDCF_ShortRetryLimit,
MAC_EDCF_LongRetryLimit,MAC_EDCF_FragmentationThreshold,
MAC_EDCF_MaxTransmitMSDULifetime,MAC_EDCF_MaxReceiveLifetime,
0,0,0,0,0,0,0,0,0,0,0
};
/*======================================================================
TCLHooksforthesimulator
======================================================================*/
staticclassMac802_11eClass:
publicTclClass{
public:
Mac802_11eClass():
TclClass("Mac/802_11e"){}
TclObject*create(int,constchar*const*){
return(newMac802_11e(&EDCF_PMIB,&EDCF_MMIB));
}
}class_mac802_11e;
/*======================================================================
MacClassFunctions
======================================================================*/
Mac802_11e:
:
Mac802_11e(EDCF_PHY_MIB*p,MAC_MIB*m):
Mac(),mhIF_(this),mhNav_(this),mhRecv_(this),mhSend_(this),mhDefer_(this,p->SlotTime),mhSifs_(this,p->SlotTime),mhBackoff_(this,p->SlotTime),AK(this)
{
//PointertoPriQ,Castinpriq.cc
queue_=0;
//flagstocontrolifPriQParametershavealreadybeenadopted
AIFSset=0;
CWset=0;
for(inti=0;i packets_[i]=0; pktRTS_[i]=0; pktCTRL_[i]=0; pktTx_[i]=0; tx_state_[i]=MAC_IDLE; ssrc_[i]=slrc_[i]=0; callback_[i]=0; numbytes_[i]=0; rtx_[i]=0; cw_[i]=0; cwmin_[i]=0; cwmax_[i]=0; aifs_[i]=0; txop_limit_[i]=0; } jitter=1000; //jitter=0; throughput=0; interval_=INTERVAL; if(AKAROA)AK.start(); macmib_=m; phymib_=p; nav_=0.0; rx_state_=MAC_IDLE; tx_active_=0; idle_time=0; sending=0; cfb_dur=0; cfb_active=0; cfb_broadcast=0; levels=0; slotnum=0; pf=0; cw_old=0; sifs_=phymib_->SIFSTime; pifs_=sifs_+phymib_->SlotTime; difs_=sifs_+2*phymib_->SlotTime; //see(802.11-1999,9.2.10) eifs_=sifs_+(8*ETHER_ACK_LEN/phymib_->PLCPDataRate); //eifs_=sifs_+(8*ETHER_ACK_LEN/phymib_->PLCPDataRate)+difs_; eifs_nav_=0; //tx_sifs_=sifs_-phymib_->RxTxTurnaroundTime; //tx_pifs_=tx_sifs_+phymib_->SlotTime; //tx_difs_=tx_sifs_+2*phymib_->SlotTime; sta_seqno_=1; cache_=0; cache_node_count_=0; //chkifbasic/dataratesareset //otherwiseusebandwidth_asdefault; Tcl&tcl=Tcl: : instance(); tcl.evalf("Mac/802_11esetbasicRate_"); if(strcmp(tcl.result(),"0")! =0) bind_bw("basicRate_",&basicRate_); else basicRate_=bandwidth_; tcl.evalf("Mac/802_11esetdataRate_"); if(strcmp(tcl.result(),"0")! =0) bind_bw("dataRate_",&dataRate_); else dataRate_=bandwidth_; //tcl.evalf("Mac/802_11esetrst_cw_mode_"); //if(strcmp(tcl.result(),"0")! =0) //bind("rst_cw_mode_",&rst_cw_mode_); //else //rst_cw_mode_=0; bind("cfb_",&cfb_); } int Mac802_11e: : command(intargc,constchar*const*argv) { if(argc==3){ if(strcmp(argv[1],"log-target")==0){ logtarget_=(NsObject*)TclObject: : lookup(argv[2]); if(logtarget_==0) returnTCL_ERROR; returnTCL_OK; }elseif(strcmp(argv[1],"nodes")==0){ if(cache_)returnTCL_ERROR; cache_node_count_=atoi(argv[2]); cache_=newHost[cache_node_count_+1]; assert(cache_); bzero(cache_,sizeof(Host)*(cache_node_count_+1)); returnTCL_OK; } } //wiethoelter,28.07.03 //VOIP-Projekt //ZugriffaufdasRetryLimitdesMAC-LayersvomRTPData-Agentaus Tcl&tcl=Tcl: : instance(); if(argc==2){ if(strcmp(argv[1],"set_RetryLimit")==0){ tcl.resultf("%d",macmib_->ShortRetryLimit); returnTCL_OK; } } if(argc==3){ if(strcmp(argv[1],"set_RetryLimit")==0){ macmib_->ShortRetryLimit=atoi(argv[2]);; returnTCL_OK; } } returnMac: : command(argc,argv); } /*====================================================================== DebuggingRoutines ======================================================================*/ /* *dumpandpackettracearenotadoptedto802.11eyet! */ void Mac802_11e: : trace_pkt(Packet*p){ structhdr_cmn*ch=HDR_CMN(p); structhdr_mac802_11*dh=HDR_MAC802_11(p); u_int16_t*t=(u_int16_t*)&dh->dh_fc; fprintf(stderr,"\t[%2x%2x%2x%2x]%x%s%d\n", *t,dh->dh_duration, ETHER_ADDR(dh->dh_da),ETHER_ADDR(dh->dh_sa), index_,packet_info.name(ch->ptype()),ch->size()); } void Mac802_11e: : dump(char*fname) { fprintf(stderr, "\n%s---(INDEX: %d,time: %2.9f)\n", fname,index_,Scheduler: : instance().clock()); fprintf(stderr, "\ttx_state_: %x,rx_state_: %x,nav: %2.9f,idle: %d\n", tx_state_,rx_state_,nav_,is_idle()); fprintf(stderr, "\tpktTx_: %x,pktRx_: %x,pktRTS_: %x,pktCTRL_: %x,callback: %x\n", (int)pktTx_,(int)pktRx_,(int)pktRTS_, (int)pktCTRL_,(int)callback_); fprintf(stderr, "\tDefer: %d,Backoff: %d(%d),Recv: %d,Timer: %dNav: %d\n", mhDefer_.busy(),mhBackoff_.busy(),mhBackoff_.paused(), mhRecv_.busy(),mhSend_.busy(),mhNav_.busy()); fprintf(stderr, "\tBackoffExpire: %f\n", mhBackoff_.expire()); } /*====================================================================== PacketHeadersRoutines ======================================================================*/ inlineint Mac802_11e: : hdr_dst(char*hdr,intdst) { structhdr_mac802_11*dh=(structhdr_mac802_11*)hdr; //dst=(u_int32_t)(dst); if(dst>-2) STORE4BYTE(&dst,(dh->dh_da)); returnETHER_ADDR(dh->dh_da); } inlineint Mac802_11e: : hdr_src(char*hdr,intsrc) { structhdr_mac802_11*dh=(structhdr_mac802_11*)hdr; if(src>-2) STORE4BYTE(&src,(dh->dh_sa)); returnETHER_ADDR(dh->dh_sa); } inlineint Mac802_11e: : hdr_type(char*hdr,u_int16_ttype) { structhdr_mac802_11*dh=(structhdr_mac802_11*)hdr; if(type) STORE2BYTE(&type,(dh->dh_body)); returnGET2BYTE(dh->dh_body); } /*====================================================================== MiscRoutines ======================================================================*/ inlineint Mac802_11e: : is_idle() { if(rx_state_! =MAC_IDLE){ idle_time=0; return0; } if(sending){ idle_time=0; return0; } if(nav_>Scheduler: : instance().clock()){ idle_time=0; return0; } idle_time=Scheduler: : instance().clock(); return1; } void Mac802_11e: : discard(Packet*p,constchar*why) { hdr_mac802_11*mh=HDR_MAC802_11(p); hdr_cmn*ch=HDR_CMN(p); #if0 /*oldlogic8/8/98-dam*/ /* *IfreceivedbelowtheRXThreshold,thenjustfree. */ if(p->txinfo_.Pr Packet: : free(p); //p=0; return; } #endif//0 /*ifthercvdpktcontainserrors,arealMAClayercouldn't necessarilyreadanydatafromit,sowejusttossitnow*/ if(ch->error()! =0){ Packet: : free(p); //p=0; return; } switch(mh->dh_fc.fc_type){ caseMAC_Type_Management: drop(p,why); return; caseMAC_Type_Control: switch(mh->dh_fc.fc_subtype){ caseMAC_Subtype_RTS: if((u_int32_t)ETHER_ADDR(mh->dh_sa)==\ (u_int32_t)index_){ drop(p,why); return; } /*fallthrough-ifnecessary*/ caseMAC_Subtype_CTS: caseMAC_Subtype_ACK: if((u_int32_t)ETHER_ADDR(mh->dh_da)==\ (u_int32_t)index_){ drop(p,w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 80211 源程序