|
INET Framework for OMNeT++/OMNEST
|
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