INET Framework for OMNeT++/OMNEST
Ieee80211MgmtAPBase.cc
Go to the documentation of this file.
00001 //
00002 // Copyright (C) 2006 Andras Varga
00003 //
00004 // This program is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public License
00006 // as published by the Free Software Foundation; either version 2
00007 // of the License, or (at your option) any later version.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU Lesser General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU Lesser General Public License
00015 // along with this program; if not, see <http://www.gnu.org/licenses/>.
00016 //
00017 
00018 
00019 #include "Ieee80211MgmtAPBase.h"
00020 #include "Ieee802Ctrl_m.h"
00021 #include "EtherFrame_m.h"
00022 
00023 
00024 void Ieee80211MgmtAPBase::initialize(int stage)
00025 {
00026     Ieee80211MgmtBase::initialize(stage);
00027 
00028     if (stage==0)
00029     {
00030         hasRelayUnit = gate("uppergateOut")->getPathEndGate()->isConnected();
00031         WATCH(hasRelayUnit);
00032     }
00033 }
00034 
00035 void Ieee80211MgmtAPBase::distributeReceivedDataFrame(Ieee80211DataFrame *frame)
00036 {
00037     // adjust toDS/fromDS bits, and shuffle addresses
00038     frame->setToDS(false);
00039     frame->setFromDS(true);
00040 
00041     // move destination address to address1 (receiver address),
00042     // and fill address3 with original source address;
00043     // sender address (address2) will be filled in by MAC
00044     ASSERT(!frame->getAddress3().isUnspecified());
00045     frame->setReceiverAddress(frame->getAddress3());
00046     frame->setAddress3(frame->getTransmitterAddress());
00047 
00048     sendOrEnqueue(frame);
00049 }
00050 
00051 EtherFrame *Ieee80211MgmtAPBase::convertToEtherFrame(Ieee80211DataFrame *frame)
00052 {
00053     // create a matching ethernet frame
00054     EtherFrame *ethframe = new EthernetIIFrame(frame->getName()); //TODO option to use EtherFrameWithSNAP instead
00055     ethframe->setDest(frame->getAddress3());
00056     ethframe->setSrc(frame->getTransmitterAddress());
00057     //XXX set ethertype
00058 
00059     // encapsulate the payload in there
00060     cPacket *payload = frame->decapsulate();
00061     delete frame;
00062     ASSERT(payload!=NULL);
00063     ethframe->encapsulate(payload);
00064 
00065     // done
00066     return ethframe;
00067 }
00068 
00069 Ieee80211DataFrame *Ieee80211MgmtAPBase::convertFromEtherFrame(EtherFrame *ethframe)
00070 {
00071     // create new frame
00072     Ieee80211DataFrame *frame = new Ieee80211DataFrame(ethframe->getName());
00073     frame->setFromDS(true);
00074 
00075     // copy addresses from ethernet frame (transmitter addr will be set to our addr by MAC)
00076     frame->setReceiverAddress(ethframe->getDest());
00077     frame->setAddress3(ethframe->getSrc());
00078 
00079     // encapsulate payload
00080     cPacket *payload = ethframe->decapsulate();
00081     if (!payload)
00082         error("received empty EtherFrame from upper layer");
00083     frame->encapsulate(payload);
00084     delete ethframe;
00085 
00086     // done
00087     return frame;
00088 }
00089