int Mac802_11::check_pktRTS() //check_pktRTS():check if we have RTS packet to send
{ //if we have,send it then return 0; otherwise return -1
struct hdr_mac802_11 *mh;
double timeout;
assert(mhBackoff_.busy() == 0);
if(pktRTS_ == 0) // 1. have RTS packet to send?
return -1; //NO: return -1
mh = HDR_MAC802_11(pktRTS_);
switch(mh->dh_fc.fc_subtype) { //yes:
case MAC_Subtype_RTS:
if(! is_idle()) { // 2. channel is idle?
inc_cw(); //NO: increase contention window
mhBackoff_.start(cw_, is_idle()); //start backoff timer, time out=CW
return 0;
}
setTxState(MAC_RTS); //yes: 将状态设置为MAC_RTS,后面send_timer()函数根据这个状态判断是否需要重传
timeout = txtime(phymib_.getRTSlen(), basicRate_) //timeout: the time that send the RTS out
+ DSSS_MaxPropagationDelay // 0.000002:2us
+ phymib_.getSIFS()
+ txtime(phymib_.getCTSlen(), basicRate_)
+ DSSS_MaxPropagationDelay;
break;
default:
fprintf(stderr, "check_pktRTS:Invalid MAC Control subtype\n");
exit(1);
}
transmit(pktRTS_, timeout); // 3.call transmit() ,send the RTS packet
return 0;
}
inline void Mac802_11::transmit(Packet *p, double timeout) { tx_active_ = 1; .... downtarget_->recv(p->copy(), this); mhSend_.start(timeout); //在timeout时间之后,调用send_time()函数,在send_time()中判断是否需要重传 // 4.start TxTimer(TxTimer::handle:mac->sendHandler(), call send_timer()): judge whether need for re-transmission. mhIF_.start(txtime(p)); // 5.start interface timer, timerout=transmit time (call txHandler() ) }
timeout时间的意义:
在802.11的握手机制中,发送节点在发送时利用TxTimer定时器给后续响应帧的预定截止到达时刻进行定时。当定时时间timeout结束而发送节点没有接收到响应帧,表示发送失败,发送节点的sendHandler()被调用进行重传操作。
在上面的check_pktRTS()函数中,timeout = txtime(phymib_.getRTSlen(), basicRate_)
+ DSSS_MaxPropagationDela
+ phymib_.getSIFS()
+ txtime(phymib_.getCTSlen(), basicRate_)+ DSSS_MaxPropagationDelay;
timeout = RTS包的传输时间 + 最大传播时延 + SIFS + CTS包的传输时间 + 最大传播时延
表示后续的CTS响应帧预定截止的到达时刻,如果timeout结束之后,发送节点还没有收到CTS包,则表示RTS发送失败,请求重传RTS包。
即在 transmit(pktRTS_, timeout)之后,发送节点返回rece()函数等待CTS包的接收,接收到CTS包之后,会将状态设置为setTxState(MAC_IDLE),(在recvCTS()->tx_resume()函数中设置),在send_timer()函数中通过这个状态判断发送节点已经成功收到CTS包,不需要重传RTS。如果状态仍然为发送RTS后的状态(setTxState:MAC_RTS),则表示发送节点没有成功收到CTS包,此时重传RTS(RetransmitRTS())。