00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #include "Mac80211.h"
00022 #include "MacToPhyControlInfo.h"
00023 #include <MacToNetwControlInfo.h>
00024 #include <PhyToMacControlInfo.h>
00025 #include <NetwToMacControlInfo.h>
00026 #include "SimpleAddress.h"
00027 #include <FWMath.h>
00028 #include <Decider80211.h>
00029 #include <DeciderResult80211.h>
00030 #include <BaseConnectionManager.h>
00031 
00032 Define_Module(Mac80211);
00033 
00034 
00035 void Mac80211::initialize(int stage)
00036 {
00037     BaseMacLayer::initialize(stage);
00038 
00039     if (stage == 0)
00040     {
00041         debugEV << "Initializing stage 0\n";
00042 
00043         switching = false;
00044         fsc = intrand(0x7FFFFFFF);
00045         if(fsc == 0) fsc = 1;
00046         debugEV << " fsc: " << fsc << "\n";
00047 
00048         queueLength = hasPar("queueLength") ? par("queueLength").longValue() : 10;
00049 
00050         
00051         timeout = new cMessage("timeout", TIMEOUT);
00052         nav = new cMessage("NAV", NAV);
00053         contention = new ChannelSenseRequest("contention", MacToPhyInterface::CHANNEL_SENSE_REQUEST);
00054         contention->setSenseMode(UNTIL_BUSY);
00055         endSifs = new ChannelSenseRequest("end SIFS", MacToPhyInterface::CHANNEL_SENSE_REQUEST);
00056         endSifs->setSenseMode(UNTIL_BUSY);
00057         endSifs->setSenseTimeout(SIFS);
00058 
00059         state = IDLE;
00060         longRetryCounter = 0;
00061         shortRetryCounter = 0;
00062         rtsCtsThreshold = hasPar("rtsCtsThreshold") ? par("rtsCtsThreshold").longValue() : 1;
00063         currentIFS = EIFS;
00064 
00065         autoBitrate = hasPar("autoBitrate") ? par("autoBitrate").boolValue() : false;
00066 
00067         txPower = hasPar("txPower") ? par("txPower").doubleValue() : 110.11;
00068 
00069 
00070         delta = 1E-9;
00071 
00072         debugEV << "SIFS: " << SIFS << " DIFS: " << DIFS << " EIFS: " << EIFS << endl;
00073     }
00074     else if(stage == 1) {
00075       BaseConnectionManager* cc = getConnectionManager();
00076 
00077       if(cc->hasPar("pMax") && txPower > cc->par("pMax").doubleValue())
00078             opp_error("TranmitterPower can't be bigger than pMax in ConnectionManager! "
00079                     "Please adjust your omnetpp.ini file accordingly.");
00080 
00081       int channel = phy->getCurrentRadioChannel();
00082       if(!(1<=channel && channel<=14)) {
00083         opp_error("Radio set to invalid channel %d. Please make sure the"
00084               " phy modules parameter \"initialRadioChannel\" is set to"
00085               " a valid 802.11 channel (1 to 14)!", channel);
00086       }
00087       centerFreq = CENTER_FREQUENCIES[channel];
00088 
00089         bool found = false;
00090         bitrate = hasPar("bitrate") ? par("bitrate").doubleValue() : BITRATES_80211[0];
00091         for(int i = 0; i < 4; i++) {
00092             if(bitrate == BITRATES_80211[i]) {
00093                 found = true;
00094                 break;
00095             }
00096         }
00097         if(!found) bitrate = BITRATES_80211[0];
00098         defaultBitrate = bitrate;
00099 
00100         snrThresholds.push_back(hasPar("snr2Mbit") ? par("snr2Mbit").doubleValue() : 100);
00101         snrThresholds.push_back(hasPar("snr5Mbit") ? par("snr5Mbit").doubleValue() : 100);
00102         snrThresholds.push_back(hasPar("snr11Mbit") ? par("snr11Mbit").doubleValue() : 100);
00103         snrThresholds.push_back(111111111); 
00104 
00105         neighborhoodCacheSize = hasPar("neighborhoodCacheSize") ? par("neighborhoodCacheSize").longValue() : 0;
00106         neighborhoodCacheMaxAge = hasPar("neighborhoodCacheMaxAge") ? par("neighborhoodCacheMaxAge").longValue() : 10000;
00107 
00108         debugEV << " MAC Address: " << myMacAddr
00109            << " rtsCtsThreshold: " << rtsCtsThreshold
00110            << " bitrate: " << bitrate
00111            << " channel: " << channel
00112            << " autoBitrate: " << autoBitrate
00113            << " 2MBit: " << snrThresholds[0]
00114            << " 5.5MBit: " <<snrThresholds[1]
00115            << " 11MBit: " << snrThresholds[2]
00116            << " neighborhoodCacheSize " << neighborhoodCacheSize
00117            << " neighborhoodCacheMaxAge " << neighborhoodCacheMaxAge
00118            << endl;
00119 
00120         for(int i = 0; i < 3; i++) {
00121             snrThresholds[i] = FWMath::dBm2mW(snrThresholds[i]);
00122         }
00123 
00124         remainingBackoff = backoff();
00125         senseChannelWhileIdle(remainingBackoff + currentIFS);
00126     }
00127 }
00128 
00129 void Mac80211::senseChannelWhileIdle(simtime_t duration) {
00130   if(contention->isScheduled()) {
00131     error("Cannot start a new channel sense request because already sensing the channel!");
00132   }
00133 
00134   chSenseStart = simTime();
00135   contention->setSenseTimeout(duration);
00136 
00137   sendControlDown(contention);
00138 }
00139 
00144 void Mac80211::handleUpperMsg(cMessage *msg)
00145 {
00146   cPacket* pkt = static_cast<cPacket*>(msg);
00147 
00148   debugEV << "Mac80211::handleUpperMsg " << msg->getName() << "\n";
00149     if (pkt->getBitLength() > 18496){
00150         error("packet from higher layer (%s)%s is too long for 802.11b, %d bytes (fragmentation is not supported yet)",
00151               pkt->getClassName(), pkt->getName(), pkt->getByteLength());
00152     }
00153 
00154     if(fromUpperLayer.size() == queueLength) {
00155     
00156         msg->setName("MAC ERROR");
00157         msg->setKind(PACKET_DROPPED);
00158         sendControlUp(msg);
00159         debugEV << "packet " << msg << " received from higher layer but MAC queue is full, signalling error\n";
00160         return;
00161     }
00162 
00163     Mac80211Pkt *mac = encapsMsg(pkt);
00164     debugEV << "packet " << pkt << " received from higher layer, dest=" << mac->getDestAddr() << ", encapsulated\n";
00165 
00166     fromUpperLayer.push_back(mac);
00167     
00168     if (state == IDLE && !endSifs->isScheduled()) {
00169         beginNewCycle();
00170     }
00171     else
00172     {
00173       debugEV << "enqueued, will be transmitted later\n";
00174     }
00175 }
00176 
00181 Mac80211Pkt *Mac80211::encapsMsg(cPacket * netw)
00182 {
00183 
00184     Mac80211Pkt *pkt = new Mac80211Pkt(netw->getName());
00185     
00186     pkt->setBitLength(MAC80211_HEADER_LENGTH);
00187     pkt->setRetry(false);                 
00188     pkt->setSequenceControl(fsc++);       
00189     if(fsc <= 0) fsc = 1;
00190 
00191     
00192     
00193     NetwToMacControlInfo* cInfo = static_cast<NetwToMacControlInfo*>(netw->removeControlInfo());
00194 
00195     debugEV <<"CInfo removed, mac addr="<< cInfo->getNextHopMac()<<endl;
00196     pkt->setDestAddr(cInfo->getNextHopMac());
00197 
00198     
00199     delete cInfo;
00200 
00201     
00202     pkt->setSrcAddr(myMacAddr);
00203 
00204     
00205     pkt->encapsulate(netw);
00206     debugEV <<"pkt encapsulated, length: " << pkt->getBitLength() << "\n";
00207 
00208     return pkt;
00209 }
00210 
00211 
00212 cMessage *Mac80211::decapsMsg(Mac80211Pkt *frame) {
00213     cMessage *m = frame->decapsulate();
00214     m->setControlInfo(new MacToNetwControlInfo(frame->getSrcAddr(), 0));
00215     debugEV << " message decapsulated " << endl;
00216     return m;
00217 }
00218 
00225 void Mac80211::handleLowerMsg(cMessage *msg)
00226 {
00227     Mac80211Pkt *af = static_cast<Mac80211Pkt *>(msg);
00228     int radioState = phy->getRadioState();
00229     if(radioState == Radio::RX) {
00230         
00231       debugEV << " handleLowerMsg frame " << af << " received\n";
00232         addNeighbor(af);
00233         if (contention->isScheduled()) {
00234             error("Gaack! I am changing the IFS on an ongoing contention");
00235         }
00236         currentIFS = DIFS;
00237         if(af->getDestAddr() == myMacAddr) {
00238             handleMsgForMe(af);
00239         }
00240         else if(af->getDestAddr() == L2BROADCAST) {
00241             handleBroadcastMsg(af);
00242         }
00243         else {
00244             handleMsgNotForMe(af, af->getDuration());
00245         }
00246     }
00247     else {
00248       debugEV << " handleLowerMsg frame " << af << " deleted, strange race condition\n";
00249         delete af;
00250     }
00251 }
00252 
00253 void Mac80211::handleLowerControl(cMessage *msg)
00254 {
00255   debugEV << simTime() << " handleLowerControl " << msg->getName() << "\n";
00256     switch(msg->getKind()) {
00257     case MacToPhyInterface::CHANNEL_SENSE_REQUEST:
00258       if(msg == contention) {
00259         handleEndContentionTimer();
00260       } else if(msg == endSifs) {
00261         handleEndSifsTimer();   
00262       } else {
00263         error("Unknown ChannelSenseRequest returned!");
00264       }
00265         break;
00266 
00267     case Decider80211::COLLISION:
00268     case Decider80211::BITERROR:
00269     {
00270       int radioState = phy->getRadioState();
00271         if(radioState == Radio::RX) {
00272             if (contention->isScheduled()) {
00273                 error("Gaack! I am changing the IFS on an ongoing contention");
00274             }
00275             currentIFS = EIFS;
00276             handleMsgNotForMe(msg, 0);
00277         }
00278         else {
00279           debugEV << " frame " << msg->getName() << " deleted, strange race condition\n";
00280             delete msg;
00281         }
00282         break;
00283     }
00284     case MacToPhyInterface::TX_OVER:
00285       debugEV << "PHY indicated transmission over" << endl;
00286         phy->setRadioState(Radio::RX);
00287         handleEndTransmission();
00288         delete msg;
00289         break;
00290 
00291     case MacToPhyInterface::RADIO_SWITCHING_OVER:
00292       
00293       delete msg;
00294       break;
00295 
00296     default:
00297       ev << "Unhandled control message from physical layer: " << msg << endl;
00298       delete msg;
00299     }
00300 }
00301 
00302 
00306 void Mac80211::handleSelfMsg(cMessage * msg)
00307 {
00308   debugEV << simTime() << " handleSelfMsg " << msg->getName() << "\n";
00309     switch (msg->getKind())
00310     {
00311         
00312     case TIMEOUT:
00313         handleTimeoutTimer();   
00314         break;
00315 
00316         
00317     case NAV:
00318         handleNavTimer();       
00319         break;
00320 
00321     default:
00322         error("unknown timer type");
00323     }
00324 }
00325 
00326 
00336 void Mac80211::handleMsgNotForMe(cMessage *af, simtime_t duration)
00337 {
00338   debugEV << "handle msg not for me " << af->getName() << "\n";
00339 
00340     
00341     
00342     if(duration != 0) {
00343         
00344         if (state == QUIET)
00345         {
00346             
00347             if (nav->getArrivalTime() < simTime() + duration)
00348             {
00349                 cancelEvent(nav);
00350                 scheduleAt(simTime() + duration, nav);
00351                 debugEV << "NAV timer started for: " << duration << " State QUIET\n";
00352             }
00353         }
00354         
00355         else
00356         {
00357             
00358             
00359             if (timeout->isScheduled()) {
00360                 cancelEvent(timeout);
00361                 if(state == WFACK) {
00362                     fromUpperLayer.front()->setRetry(true);
00363                 }
00364                 if((state == WFACK) || (state == WFCTS)) {
00365                     if(rtsCts(fromUpperLayer.front())) {
00366                         longRetryCounter++;
00367                     }
00368                     else {
00369                         shortRetryCounter++;
00370                     }
00371                 }
00372             }
00373             
00374             scheduleAt(simTime() + duration, nav);
00375             debugEV << "NAV timer started, not QUIET: " << duration << endl;
00376 
00377             assert(!contention->isScheduled());
00378             
00379 
00380             setState(QUIET);
00381         }
00382     }
00383 
00384     if((af->getKind() == Decider80211::BITERROR) || (af->getKind() == Decider80211::COLLISION)) {
00385 
00386       assert(!contention->isScheduled());
00387         
00388         
00389         
00390         
00391 
00392       
00393       if(state == WFCTS) {
00394         assert(timeout->isScheduled());
00395         cancelEvent(timeout);
00396         rtsTransmissionFailed();
00397       }
00398       else if(state == WFACK) {
00399         assert(timeout->isScheduled());
00400       cancelEvent(timeout);
00401         dataTransmissionFailed();
00402       }
00403 
00404         currentIFS = EIFS;
00405     }
00406 
00407     beginNewCycle();
00408     delete af;
00409 }
00410 
00411 
00418 void Mac80211::handleMsgForMe(Mac80211Pkt *af)
00419 {
00420   debugEV << "handle msg for me " << af->getName() << " in " <<  stateName(state) << "\n";
00421 
00422     switch (state)
00423     {
00424     case IDLE:     
00425     case CONTEND:  
00426 
00427         
00428         if (af->getKind() == RTS) {
00429           assert(!contention->isScheduled());
00430       
00431 
00432             handleRTSframe(af);
00433         }
00434         else if (af->getKind() == DATA) {
00435           assert(!contention->isScheduled());
00436           
00437 
00438             handleDATAframe(af);
00439         }
00440         else {
00441             error("in handleMsgForMe() IDLE/CONTEND, strange message %s", af->getName());
00442         }
00443         break;
00444 
00445     case WFDATA:  
00446         if (af->getKind() == DATA) {
00447             handleDATAframe(af);
00448         }
00449         else {
00450           EV << "unexpected message -- probably a collision of RTSs\n";
00451             delete af;
00452         }
00453         break;
00454 
00455     case WFACK:  
00456         if (af->getKind() == ACK) {
00457             handleACKframe(af);
00458         }
00459         else {
00460             error("in handleMsgForMe() WFACK, strange message %s", af->getName());
00461         }
00462         delete af;
00463         break;
00464 
00465     case WFCTS:  
00466         if (af->getKind() == CTS) {
00467             handleCTSframe(af);
00468         }
00469         else {
00470             EV << "unexpected msg -- deleted \n";
00471             delete af;
00472         }
00473         break;
00474     case QUIET: 
00475 
00476         
00477         delete af;
00478         break;
00479 
00480     case BUSY: 
00481         if(switching) {
00482             EV << "message received during radio state switchover\n";
00483             delete af;
00484         }
00485         else {
00486             error("logic error: node is currently transmitting, can not receive "
00487                   "(does the physical layer do its job correctly?)");
00488         }
00489         break;
00490     default:
00491         error("unknown state %d", state);
00492     }
00493 }
00494 
00499 void Mac80211::handleRTSframe(Mac80211Pkt * af)
00500 {
00501     if(endSifs->isScheduled()) error("Mac80211::handleRTSframe when SIFS scheduled");
00502     
00503     endSifs->setContextPointer(af);
00504 
00505     sendControlDown(endSifs);
00506     
00507 }
00508 
00509 
00514 void Mac80211::handleDATAframe(Mac80211Pkt * af)
00515 {
00516     NeighborList::iterator it;
00517     if (rtsCts(af)) cancelEvent(timeout);  
00518     it = findNeighbor(af->getSrcAddr());
00519     if(it == neighbors.end()) error("Mac80211::handleDATAframe: neighbor not registered");
00520     if(af->getRetry() && (it->fsc == af->getSequenceControl())) {
00521       debugEV << "Mac80211::handleDATAframe suppressed duplicate message " << af
00522            << " fsc: " << it->fsc << "\n";
00523     }
00524     else {
00525         it->fsc = af->getSequenceControl();
00526         
00527         sendUp(decapsMsg(af));
00528     }
00529     
00530     if(endSifs->isScheduled()) error("Mac80211::handleDATAframe when SIFS scheduled");
00531     endSifs->setContextPointer(af);
00532 
00533     sendControlDown(endSifs);
00534     
00535 }
00536 
00537 
00541 void Mac80211::handleACKframe(Mac80211Pkt * af)
00542 {
00543     
00544     cancelEvent(timeout);
00545 
00546     
00547     longRetryCounter = 0;
00548     shortRetryCounter = 0;
00549     
00550     remainingBackoff = backoff();
00551     
00552     Mac80211Pkt *temp = fromUpperLayer.front();
00553     fromUpperLayer.pop_front();
00554     delete temp;
00555 
00556     
00557     beginNewCycle();
00558 }
00559 
00560 
00564 void Mac80211::handleCTSframe(Mac80211Pkt * af)
00565 {
00566     
00567     cancelEvent(timeout);
00568     shortRetryCounter = 0;
00569     
00570     if(endSifs->isScheduled()) error("Mac80211::handleCTSframe when SIFS scheduled");
00571     endSifs->setContextPointer(af);
00572 
00573     sendControlDown(endSifs);
00574     
00575 }
00576 
00577 
00583 void Mac80211::handleBroadcastMsg(Mac80211Pkt *af)
00584 {
00585   debugEV << "handle broadcast\n";
00586     if((state == BUSY) && (!switching)) {
00587         error("logic error: node is currently transmitting, can not receive "
00588               "(does the physical layer do its job correctly?)");
00589     }
00590     sendUp(decapsMsg(af));
00591     delete af;
00592     if (state == CONTEND) {
00593       assert(!contention->isScheduled());
00594     
00595 
00596         beginNewCycle();
00597     }
00598 }
00599 
00600 
00606 void Mac80211::handleEndContentionTimer()
00607 {
00608   if(!contention->getResult().isIdle()) {
00609     suspendContention();
00610     return;
00611   }
00612 
00613     if(state == IDLE) {
00614         remainingBackoff = 0;
00615     }
00616     else if(state == CONTEND) {
00617         
00618         
00619         remainingBackoff = 0;
00620         
00621         phy->setRadioState(Radio::TX);
00622         if (!nextIsBroadcast)
00623         {
00624             if(rtsCts(fromUpperLayer.front())) {
00625                 
00626                 sendRTSframe();
00627             }
00628             else {
00629                 sendDATAframe(0);
00630             }
00631         }
00632         else {
00633             sendBROADCASTframe();
00634             
00635             Mac80211Pkt *temp = fromUpperLayer.front();
00636             fromUpperLayer.pop_front();
00637             delete(temp);
00638         }
00639     }
00640     else {
00641         error("logic error: expiration of the contention timer outside of CONTEND/IDLE state, should not happen");
00642     }
00643 }
00644 
00649 void Mac80211::handleNavTimer()
00650 {
00651     if (state != QUIET)
00652         error("logic error: expiration of the NAV timer outside of the state QUIET, should not happen");
00653 
00654     
00655 
00656     
00657     
00658     
00659     
00660     
00661     
00662     
00663     
00664 
00665     beginNewCycle();
00666 }
00667 
00668 
00669 
00670 void Mac80211::dataTransmissionFailed()
00671 {
00672   bool rtscts = rtsCts(fromUpperLayer.front());
00673     if(rtscts){
00674         longRetryCounter++;
00675     }else{
00676         shortRetryCounter++;
00677     }
00678     fromUpperLayer.front()->setRetry(true);
00679     remainingBackoff = backoff(rtscts);
00680 }
00681 
00682 
00683 void Mac80211::rtsTransmissionFailed()
00684 {
00685     longRetryCounter++;
00686     remainingBackoff = backoff();
00687 }
00688 
00692 void Mac80211::handleTimeoutTimer()
00693 {
00694     debugEV << simTime() << " handleTimeoutTimer " << stateName(state) << "\n";
00695     if(state == WFCTS) {
00696       rtsTransmissionFailed();
00697     }
00698     else if(state == WFACK) {
00699       dataTransmissionFailed();
00700     }
00701 
00702     
00703     
00704     if (state != QUIET)
00705         beginNewCycle();
00706 }
00707 
00708 
00713 void Mac80211::handleEndSifsTimer()
00714 {
00715   if(!endSifs->getResult().isIdle()){
00716     
00717     delete static_cast<Mac80211Pkt *>(endSifs->getContextPointer());
00718 
00719     
00720     if (fromUpperLayer.empty())
00721       setState(IDLE);
00722     else
00723       setState(CONTEND);
00724 
00725     return;
00726   }
00727 
00728     Mac80211Pkt *frame = static_cast<Mac80211Pkt *>(endSifs->getContextPointer());
00729     phy->setRadioState(Radio::TX);
00730     switch (frame->getKind())
00731     {
00732     case RTS:
00733         sendCTSframe(frame);
00734         break;
00735     case CTS:
00736         sendDATAframe(frame);
00737         break;
00738     case DATA:
00739         sendACKframe(frame);
00740         break;
00741     default:
00742         error("logic error: end sifs timer when previously received packet is not RTS/CTS/DATA");
00743     }
00744 
00745     
00746     delete frame;
00747 }
00748 
00754 void Mac80211::handleEndTransmission()
00755 {
00756   debugEV << "transmission of packet is over\n";
00757     if(state == BUSY) {
00758         if(nextIsBroadcast) {
00759             shortRetryCounter = 0;
00760             longRetryCounter = 0;
00761             remainingBackoff = backoff();
00762         }
00763         beginNewCycle();
00764     }
00765     else if(state == WFDATA) {
00766       beginNewCycle();
00767     }
00768 }
00769 
00774 void Mac80211::sendDATAframe(Mac80211Pkt *af)
00775 {
00776     Mac80211Pkt *frame = static_cast<Mac80211Pkt *>(fromUpperLayer.front()->dup());
00777     double br;
00778 
00779     if(af) {
00780       PhyToMacControlInfo* tmp = static_cast<PhyToMacControlInfo*>(af->removeControlInfo());
00781 
00782         br = static_cast<const DeciderResult80211*>(tmp->getDeciderResult())->getBitrate();
00783 
00784         delete tmp;
00785     }
00786     else {
00787        br  = retrieveBitrate(frame->getDestAddr());
00788 
00789        if(shortRetryCounter) frame->setRetry(true);
00790     }
00791     simtime_t duration = packetDuration(frame->getBitLength(), br);
00792     Signal* signal = createSignal(simTime(), duration, txPower, br);
00793     MacToPhyControlInfo *pco = new MacToPhyControlInfo(signal);
00794     
00795     frame->setControlInfo(pco);
00796     frame->setSrcAddr(myMacAddr);
00797     frame->setKind(DATA);
00798     frame->setDuration(SIFS + packetDuration(LENGTH_ACK, br));
00799 
00800     
00801     scheduleAt(simTime() + timeOut(DATA, br), timeout);
00802     debugEV << "sending DATA  to " << frame->getDestAddr() << " with bitrate " << br << endl;
00803     
00804     sendDown(frame);
00805 
00806     
00807     setState(WFACK);
00808 }
00809 
00810 
00814 void Mac80211::sendACKframe(Mac80211Pkt * af)
00815 {
00816     Mac80211Pkt *frame = new Mac80211Pkt("wlan-ack");
00817 
00818     PhyToMacControlInfo* phyCtrlInfo = static_cast<PhyToMacControlInfo*>(af->removeControlInfo());
00819     double br = static_cast<const DeciderResult80211*>(phyCtrlInfo->getDeciderResult())->getBitrate();
00820     delete phyCtrlInfo;
00821     phyCtrlInfo = 0;
00822 
00823     Signal* signal = createSignal(simTime(),
00824                   packetDuration(LENGTH_ACK, br),
00825                   txPower, br);
00826 
00827     MacToPhyControlInfo *pco = new MacToPhyControlInfo(signal);
00828 
00829     frame->setControlInfo(pco);
00830     frame->setKind(ACK);
00831     frame->setBitLength((int)LENGTH_ACK);
00832 
00833     
00834     
00835     frame->setSrcAddr(myMacAddr);
00836     frame->setDestAddr(af->getSrcAddr());
00837     frame->setDuration(0);
00838 
00839     sendDown(frame);
00840     debugEV << "sent ACK frame!\n";
00841 
00842     
00843     setState(BUSY);
00844 }
00845 
00846 
00850 void Mac80211::sendRTSframe()
00851 {
00852     Mac80211Pkt *frame = new Mac80211Pkt("wlan-rts");
00853 
00854     const Mac80211Pkt* frameToSend = fromUpperLayer.front();
00855     double br = retrieveBitrate(frameToSend->getDestAddr());
00856 
00857     Signal* signal = createSignal(simTime(),
00858                   packetDuration(LENGTH_RTS, br),
00859                   txPower, br);
00860 
00861     MacToPhyControlInfo *pco = new MacToPhyControlInfo(signal);
00862 
00863     frame->setControlInfo(pco);
00864     frame->setKind(RTS);
00865     frame->setBitLength((int)LENGTH_RTS);
00866 
00867     
00868     frame->setSrcAddr(frameToSend->getSrcAddr());
00869     frame->setDestAddr(frameToSend->getDestAddr());
00870 
00871     double packetSize = frameToSend->getBitLength();
00872     frame->setDuration(3 * SIFS + packetDuration(LENGTH_CTS, br) +
00873                        packetDuration(packetSize, br) +
00874                        packetDuration(LENGTH_ACK, br));
00875 
00876     debugEV << " Mac80211::sendRTSframe duration: " <<  packetDuration(LENGTH_RTS, br) << " br: " << br << "\n";
00877 
00878     
00879     scheduleAt(simTime() + timeOut(RTS, br), timeout);
00880 
00881     
00882     sendDown(frame);
00883 
00884     
00885     setState(WFCTS);
00886 }
00887 
00888 
00892 void Mac80211::sendCTSframe(Mac80211Pkt * af)
00893 {
00894     Mac80211Pkt *frame = new Mac80211Pkt("wlan-cts");
00895 
00896     PhyToMacControlInfo* phyCtrlInfo = static_cast<PhyToMacControlInfo*>(af->removeControlInfo());
00897   double br = static_cast<const DeciderResult80211*>(phyCtrlInfo->getDeciderResult())->getBitrate();
00898   delete phyCtrlInfo;
00899   phyCtrlInfo = 0;
00900 
00901   Signal* signal = createSignal(simTime(),
00902                   packetDuration(LENGTH_CTS, br),
00903                   txPower, br);
00904 
00905     MacToPhyControlInfo *pco = new MacToPhyControlInfo(signal);
00906     frame->setControlInfo(pco);
00907     frame->setKind(CTS);
00908     frame->setBitLength((int)LENGTH_CTS);
00909 
00910     
00911     
00912     frame->setSrcAddr(myMacAddr);
00913     frame->setDestAddr(af->getSrcAddr());
00914 
00915     frame->setDuration(af->getDuration() - SIFS - packetDuration(LENGTH_CTS, br));
00916 
00917     
00918     debugEV << " Mac80211::sendCTSframe duration: " <<  packetDuration(LENGTH_CTS, br) << " br: " << br << "\n";
00919     
00920     sendDown(frame);
00921 
00922     
00923     setState(WFDATA);
00924 }
00925 
00929 void Mac80211::sendBROADCASTframe()
00930 {
00931     
00932     Mac80211Pkt *frame = static_cast<Mac80211Pkt *>(fromUpperLayer.front()->dup());
00933 
00934     double br = retrieveBitrate(frame->getDestAddr());
00935 
00936     simtime_t duration = packetDuration(frame->getBitLength(), br);
00937     Signal* signal = createSignal(simTime(), duration, txPower, br);
00938 
00939     MacToPhyControlInfo *pco = new MacToPhyControlInfo(signal);
00940 
00941     frame->setControlInfo(pco);
00942     frame->setKind(BROADCAST);
00943 
00944     sendDown(frame);
00945     
00946     setState(BUSY);
00947 }
00948 
00956 void Mac80211::beginNewCycle()
00957 {
00958     
00959     
00960     
00961     testMaxAttempts();
00962 
00963     if (nav->isScheduled()) {
00964       debugEV << "cannot beginNewCycle until NAV expires at t " << nav->getArrivalTime() << endl;
00965         return;
00966     }
00967 
00968     
00969 
00970 
00971 
00972 
00973 
00974     if (!fromUpperLayer.empty()) {
00975 
00976         
00977         nextIsBroadcast = (fromUpperLayer.front()->getDestAddr() == L2BROADCAST);
00978 
00979         setState(CONTEND);
00980         if(!contention->isScheduled()) {
00981           ChannelState channel = phy->getChannelState();
00982           debugEV << simTime() << " do contention: medium = " << channel.info() << ", backoff = "
00983                <<  remainingBackoff << endl;
00984 
00985             if(channel.isIdle()) {
00986               senseChannelWhileIdle(currentIFS + remainingBackoff);
00987                 
00988             }
00989         }
00990     }
00991     else {
00992         
00993 
00994         if(remainingBackoff > 0 && !contention->isScheduled()) {
00995           ChannelState channel = phy->getChannelState();
00996           debugEV << simTime() << " do contention: medium = " << channel.info() << ", backoff = "
00997                <<  remainingBackoff << endl;
00998 
00999             if(channel.isIdle()) {
01000               senseChannelWhileIdle(currentIFS + remainingBackoff);
01001                 
01002             }
01003         }
01004         setState(IDLE);
01005     }
01006 }
01007 
01011 simtime_t Mac80211::backoff(bool rtscts) {
01012     unsigned rc = (rtscts) ?  longRetryCounter : shortRetryCounter;
01013     unsigned cw = ((CW_MIN + 1) << rc) - 1;
01014     if(cw > CW_MAX) cw = CW_MAX;
01015 
01016     simtime_t value = ((double) intrand(cw + 1)) * ST;
01017     debugEV << simTime() << " random backoff = " << value << endl;
01018 
01019     return value;
01020 }
01021 
01026 void Mac80211::testMaxAttempts()
01027 {
01028     if ((longRetryCounter >= LONG_RETRY_LIMIT) || (shortRetryCounter >= SHORT_RETRY_LIMIT)) {
01029       debugEV << "retry limit reached src: "<< shortRetryCounter << " lrc: " << longRetryCounter << endl;
01030         
01031         longRetryCounter = 0;
01032         shortRetryCounter = 0;
01033         
01034         Mac80211Pkt *temp = fromUpperLayer.front();
01035         fromUpperLayer.pop_front();
01036         temp->setName("MAC ERROR");
01037         temp->setKind(PACKET_DROPPED);
01038         sendControlUp(temp);
01039     }
01040 }
01041 
01042 Signal* Mac80211::createSignal( simtime_t start, simtime_t length,
01043                 double power, double bitrate)
01044 {
01045   simtime_t end = start + length;
01046   
01047   Signal* s = new Signal(start, length);
01048 
01049   
01050   ConstMapping* txPowerMapping
01051       = createSingleFrequencyMapping( start, end,
01052                       centerFreq, 11.0e6,
01053                       power);
01054   s->setTransmissionPower(txPowerMapping);
01055 
01056   
01057 
01058   
01059   Mapping* bitrateMapping
01060       = MappingUtils::createMapping(DimensionSet::timeDomain,
01061                       Mapping::STEPS);
01062 
01063   Argument pos(start);
01064   bitrateMapping->setValue(pos, BITRATE_HEADER);
01065 
01066   pos.setTime(PHY_HEADER_LENGTH / BITRATE_HEADER);
01067   bitrateMapping->setValue(pos, bitrate);
01068 
01069   s->setBitrate(bitrateMapping);
01070 
01071   return s;
01072 }
01073 
01078 
01079 
01080 
01081 
01082 
01083 
01084 
01085 
01086 
01087 
01088 
01089 
01090 
01091 
01092 
01093 
01094 
01095 
01096 
01097 
01098 
01099 
01100 
01101 
01102 
01103 
01104 
01105 
01106 
01107 
01108 
01113 simtime_t Mac80211::timeOut(Mac80211MessageKinds type, double br)
01114 {
01115     simtime_t time_out = 0;
01116 
01117     switch (type)
01118     {
01119     case RTS:
01120         time_out = SIFS + packetDuration(LENGTH_RTS, br) + ST + packetDuration(LENGTH_CTS, br) + delta;
01121         debugEV << " Mac80211::timeOut RTS " << time_out << "\n";
01122         break;
01123     case DATA:
01124         time_out = SIFS + packetDuration(fromUpperLayer.front()->getBitLength(), br) + ST + packetDuration(LENGTH_ACK, br) + delta;
01125         debugEV << " Mac80211::timeOut DATA " << time_out << "\n";
01126         break;
01127     default:
01128         EV << "Unused frame type was given when calling timeOut(), this should not happen!\n";
01129     }
01130     return time_out;
01131 }
01132 
01138 simtime_t Mac80211::packetDuration(double bits, double br)
01139 {
01140     return bits / br + phyHeaderLength / BITRATE_HEADER;
01141 }
01142 
01143 const char *Mac80211::stateName(State state)
01144 {
01145 #define CASE(x) case x: s=#x; break
01146     const char *s = "???";
01147     switch (state)
01148     {
01149         CASE(WFDATA);
01150         CASE(QUIET);
01151         CASE(IDLE);
01152         CASE(CONTEND);
01153         CASE(WFCTS);
01154         CASE(WFACK);
01155         CASE(BUSY);
01156     }
01157     return s;
01158 #undef CASE
01159 }
01160 
01161 void Mac80211::setState(State newState)
01162 {
01163     if (state==newState)
01164       debugEV << "staying in state " << stateName(state) << "\n";
01165     else
01166       debugEV << "state " << stateName(state) << " --> " << stateName(newState) << "\n";
01167     state = newState;
01168 }
01169 
01170 void Mac80211::suspendContention()  {
01171   assert(!contention->isScheduled());
01172     
01173 
01174     
01175         
01176         
01177 
01178       simtime_t quietTime = simTime() - chSenseStart;
01179 
01180       debugEV << simTime() << " suspend contention: "
01181        << "began " << chSenseStart
01182        << ", ends " << chSenseStart + contention->getSenseTimeout()
01183        << ", ifs " << currentIFS
01184        << ", quiet time " << quietTime
01185        << endl;
01186 
01187         if(quietTime < currentIFS) {
01188           debugEV << "suspended during D/EIFS (no backoff)" << endl;
01189         }
01190         else {
01191             double remainingSlots;
01192             remainingSlots = (contention->getSenseTimeout() - quietTime).dbl()/ST;
01193 
01194             
01195             
01196             
01197             
01198             
01199             
01200             
01201             
01202 
01203             if (fabs(ceil(remainingSlots) - remainingSlots) < 0.0001 * ST ||
01204                 fabs(floor(remainingSlots) - remainingSlots) < 0.0001 * ST) {
01205                 remainingBackoff = floor(remainingSlots + 0.5) * ST;
01206             }
01207             else {
01208                 remainingBackoff = ceil(remainingSlots) * ST;
01209             }
01210 
01211             debugEV << "backoff was " << ((contention->getSenseTimeout() - currentIFS))/ST
01212                << " slots, now " << remainingSlots << " slots remain" << endl;
01213         }
01214 
01215         debugEV << "suspended backoff timer, remaining backoff time: "
01216            << remainingBackoff << endl;
01217 
01218     
01219 }
01220 
01221 double Mac80211::retrieveBitrate(int destAddress) {
01222     double bitrate = defaultBitrate;
01223     NeighborList::iterator it;
01224     if(autoBitrate && (destAddress != L2BROADCAST) &&
01225        (longRetryCounter == 0) && (shortRetryCounter == 0)) {
01226         it = findNeighbor(destAddress);
01227         if((it != neighbors.end()) && (it->age > (simTime() - neighborhoodCacheMaxAge))) {
01228             bitrate = it->bitrate;
01229         }
01230     }
01231     return bitrate;
01232 }
01233 
01234 void Mac80211::addNeighbor(Mac80211Pkt *af) {
01235     int srcAddress = af->getSrcAddr();
01236     NeighborList::iterator it = findNeighbor(srcAddress);
01237     const DeciderResult80211* result = static_cast<const DeciderResult80211*>(
01238                       static_cast<PhyToMacControlInfo *>(
01239                         af->getControlInfo())->getDeciderResult());
01240     double snr = result->getSnr();
01241 
01242     double bitrate = BITRATES_80211[0];
01243     NeighborEntry entry;
01244 
01245     if(snr > snrThresholds[0]) bitrate = BITRATES_80211[1];
01246     if(snr > snrThresholds[1]) bitrate = BITRATES_80211[2];
01247     if(snr > snrThresholds[2]) bitrate = BITRATES_80211[3];
01248 
01249     if(it != neighbors.end()) {
01250         it->age = simTime();
01251         it->bitrate = bitrate;
01252     }
01253     else {
01254         if(neighbors.size() < neighborhoodCacheSize) {
01255             entry.address = srcAddress;
01256             entry.age = simTime();
01257             entry.bitrate = bitrate;
01258             entry.fsc = 0;
01259             neighbors.push_back(entry);
01260         }
01261         else {
01262             it = findOldestNeighbor();
01263             if(it != neighbors.end()) {
01264                 it->age = simTime();
01265                 it->bitrate = bitrate;
01266                 it->address = srcAddress;
01267                 it->fsc = 0;
01268             }
01269         }
01270     }
01271     debugEV << "updated information for neighbor: " << srcAddress
01272        << " snr: " << snr << " bitrate: " << bitrate << endl;
01273 }
01274 
01275 Mac80211::~Mac80211() {
01276   cancelAndDelete(timeout);
01277   cancelAndDelete(nav);
01278   if(!contention->isScheduled())
01279     delete contention;
01280   if(!endSifs->isScheduled())
01281     delete endSifs;
01282 
01283   MacPktList::iterator it;
01284   for(it = fromUpperLayer.begin(); it != fromUpperLayer.end(); ++it) {
01285         delete (*it);
01286     }
01287     fromUpperLayer.clear();
01288 }
01289 
01290 void Mac80211::finish() {
01291     BaseMacLayer::finish();
01292 }
01293