LAN is within Berkeley Architecture, WLAN cannot create with
“newLan”
command
Ethernet could be created as a LAN with common bandwidth and delay.
void
Mac802_11::tx_resume()
{
.....The callback will reactivate the interface queue between mac_ and ll_ objects, see queue/queue.cc
else if(callback_) {
Handler *h = callback_;
callback_ = 0;
h->handle((Event*) 0);
}
// change wrt Mike's code
//SET_TX_STATE(MAC_IDLE);
setTxState(MAC_IDLE);
}
void QueueHandler::handle(Event*)See that the queue is blocked if not "callback", thus, callback is essential to make queue work properly.
{
queue_.resume();
}
void Queue::resume()
{
Packet* p = deque();
if (p != 0) {
target_->recv(p, &qh_);
} else {
if (unblock_on_resume_)
blocked_ = 0;
else
blocked_ = 1;
}
}
Backoff
The backoff implementation in mac-802_11.cc does not comply with the standard. Basically, this is due to the introduction of a defer timer. The defertimer is set in send() and after a packet transmission finishes. The deferred time value is usually (DIFS+rTime) where rTime is as same as the selection of backoff timeslots from CW (Contention Window). However, the defertimer is never paused or resumed.
So, after a packet transmission, according to the IEEE 802.11 standard, the
node should do backoff immediately. here in ns-code, the defertime is first set.
And after timer out, in check_pktTx() function. if the channel is not idle, a
backoff timer is set. Therefore, here exists a double backoff problem. Also,
according to IEEE 802.11 standard, a node should access channel directly if it sense the
channel idle and still idle after at least DIFS time. Here, ns-code also
deviates from the standard and add an additional rTime before sending DATA or
RTS.
Determine the transmission time
txtime is calculated from the "size" variable in common header. Because
all
headers are present in the packet no matter what layer it is. Thus, the
only
way to know the packet size is to add or subtract some bytes in
hdr_cmn->size();
In 802.11 MAC code, in recvDATA(), the 802.11 header size will be
subtracted.
And in SendDATA(), a 80211_hdr_length will be added.
Transmission Failure:
In both RetransmitRTS and RetransmitDATA functions, it is necessary to deal a packet drop :
if(ssrc_ >= macmib_.getShortRetryLimit()) {
discard(pktRTS_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktRTS_ = 0;
/* tell the callback the send operation failed
before discarding the packet */
hdr_cmn *ch = HDR_CMN(pktTx_);
if (ch->xmit_failure_) {
/*
* Need to remove the MAC header so that
* re-cycled packets don't keep getting
* bigger.
*/
// change wrt Mike's code
//ch->size() -= ETHER_HDR_LEN11;
ch->size() -= phymib_.getHdrLen11();
ch->xmit_reason_ = XMIT_REASON_RTS;
ch->xmit_failure_(pktTx_->copy(),
ch->xmit_failure_data_); //callback by upperlayer } //printf("(%d)....discarding RTS:%x\n",index_,pktRTS_); discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktTx_ = 0; ssrc_ = 0; rst_cw(); }
So, it is a way to let upper layer , such as DSR routing to know
there
is a route-error and need to send a route-error message.
Frame Formats in ns-2
The 802.11 header in ns-2 is not conform to the 802.11 standard. It is
a different one. Thus, this overhead cannot be regarded as authentic as
that of
the experiment. And the throughput measurements also seems different.
RTS/CTS is an important part of code. There are functions like sendRTS ( is to form a RTS ctrl packrt) , retransmitRTS...... Basically it has to compare with RTSThreshold first, if the size is small than the threshold, there is no" virtual carrier sense" scheme used.