BaseMacLayer.cc

00001 /***************************************************************************
00002  * file:        BaseMacLayer.cc
00003  *
00004  * author:      Daniel Willkomm
00005  *
00006  * copyright:   (C) 2004 Telecommunication Networks Group (TKN) at
00007  *              Technische Universitaet Berlin, Germany.
00008  *
00009  *              This program is free software; you can redistribute it
00010  *              and/or modify it under the terms of the GNU General Public
00011  *              License as published by the Free Software Foundation; either
00012  *              version 2 of the License, or (at your option) any later
00013  *              version.
00014  *              For further information see file COPYING
00015  *              in the top level directory
00016  ***************************************************************************
00017  * part of:     framework implementation developed by tkn
00018  * description: basic MAC layer class
00019  *              subclass to create your own MAC layer
00020  **************************************************************************/
00021 
00022 
00023 #include "BaseMacLayer.h"
00024 #include "MacToNetwControlInfo.h"
00025 #include "NetwToMacControlInfo.h"
00026 #include "SimpleAddress.h"
00027 #include "AddressingInterface.h"
00028 #include <ChannelAccess.h>
00029 
00030 #include <cassert>
00031 
00032 Define_Module(BaseMacLayer);
00033 
00039 void BaseMacLayer::initialize(int stage)
00040 {
00041     BaseLayer::initialize(stage);
00042 
00043     if(stage==0)
00044     {
00045       // get handle to phy layer
00046         phy = FindModule<MacToPhyInterface*>::findSubModule(getParentModule());
00047 
00048         headerLength= par("headerLength");
00049         phyHeaderLength = phy->getPhyHeaderLength();
00050 
00051         hasPar("coreDebug") ? coreDebug = par("coreDebug").boolValue() : coreDebug = false;
00052     }
00053     else if (stage==1)
00054     {
00055       // see if there is an addressing module available
00056     // otherwise use NIC modules id as MAC address
00057     AddressingInterface* addrScheme = FindModule<AddressingInterface*>::findSubModule(findHost());
00058     if(addrScheme) {
00059       myMacAddr = addrScheme->myMacAddr(this);
00060     } else {
00061       myMacAddr = getParentModule()->getId();
00062     }
00063     }
00064 }
00065 
00069 cPacket* BaseMacLayer::decapsMsg(MacPkt* msg)
00070 {
00071     cPacket *m = msg->decapsulate();
00072     m->setControlInfo(new MacToNetwControlInfo(msg->getSrcAddr(), 0));
00073     // delete the macPkt
00074     delete msg;
00075     coreEV << " message decapsulated " << endl;
00076     return m;
00077 }
00078 
00079 
00084 MacPkt* BaseMacLayer::encapsMsg(cPacket *netwPkt)
00085 {
00086     MacPkt *pkt = new MacPkt(netwPkt->getName(), netwPkt->getKind());
00087     pkt->setBitLength(headerLength);
00088 
00089     // copy dest address from the Control Info attached to the network
00090     // message by the network layer
00091     NetwToMacControlInfo* cInfo = static_cast<NetwToMacControlInfo*>(netwPkt->removeControlInfo());
00092 
00093     coreEV <<"CInfo removed, mac addr="<< cInfo->getNextHopMac()<<endl;
00094     pkt->setDestAddr(cInfo->getNextHopMac());
00095 
00096     //delete the control info
00097     delete cInfo;
00098 
00099     //set the src address to own mac address (nic module getId())
00100     pkt->setSrcAddr(myMacAddr);
00101 
00102     //encapsulate the network packet
00103     pkt->encapsulate(netwPkt);
00104     coreEV <<"pkt encapsulated\n";
00105 
00106     return pkt;
00107 }
00108 
00116 void BaseMacLayer::handleUpperMsg(cMessage *mac)
00117 {
00118   assert(dynamic_cast<cPacket*>(mac));
00119     sendDown(encapsMsg(static_cast<cPacket*>(mac)));
00120 }
00121 
00130 void BaseMacLayer::handleLowerMsg(cMessage *msg)
00131 {
00132     MacPkt *mac = static_cast<MacPkt *>(msg);
00133     int dest = mac->getDestAddr();
00134     int src = mac->getSrcAddr();
00135 
00136     //only foward to upper layer if message is for me or broadcast
00137     if((dest == myMacAddr) || (dest == L2BROADCAST)) {
00138     coreEV << "message with mac addr " << src
00139          << " for me (dest=" << dest
00140          << ") -> forward packet to upper layer\n";
00141     sendUp(decapsMsg(mac));
00142     }
00143     else{
00144     coreEV << "message with mac addr " << src
00145          << " not for me (dest=" << dest
00146          << ") -> delete (my MAC="<<myMacAddr<<")\n";
00147     delete mac;
00148     }
00149 }
00150 
00151 void BaseMacLayer::handleLowerControl(cMessage* msg)
00152 {
00153   switch (msg->getKind())
00154   {
00155     case MacToPhyInterface::TX_OVER:
00156       msg->setKind(TX_OVER);
00157       sendControlUp(msg);
00158       break;
00159     default:
00160       EV << "BaseMacLayer does not handle control messages of this type (name was "<<msg->getName()<<")\n";
00161       delete msg;
00162       break;
00163   }
00164 }
00165 
00166 Signal* BaseMacLayer::createSignal(simtime_t start, simtime_t length, double power, double bitrate)
00167 {
00168   simtime_t end = start + length;
00169   //create signal with start at current simtime and passed length
00170   Signal* s = new Signal(start, length);
00171 
00172   //create and set tx power mapping
00173   Mapping* txPowerMapping = createRectangleMapping(start, end, power);
00174   s->setTransmissionPower(txPowerMapping);
00175 
00176   //create and set bitrate mapping
00177   Mapping* bitrateMapping = createConstantMapping(start, end, bitrate);
00178   s->setBitrate(bitrateMapping);
00179 
00180   return s;
00181 }
00182 
00183 Mapping* BaseMacLayer::createConstantMapping(simtime_t start, simtime_t end, double value)
00184 {
00185   //create mapping over time
00186   Mapping* m = MappingUtils::createMapping(0.0, DimensionSet::timeDomain, Mapping::LINEAR);
00187 
00188   //set position Argument
00189   Argument startPos(start);
00190 
00191   //set mapping at position
00192   m->setValue(startPos, value);
00193 
00194   //set position Argument
00195   Argument endPos(end);
00196 
00197   //set mapping at position
00198   m->setValue(endPos, value);
00199 
00200   return m;
00201 }
00202 
00203 Mapping* BaseMacLayer::createRectangleMapping(simtime_t start, simtime_t end, double value)
00204 {
00205   //create mapping over time
00206   Mapping* m = MappingUtils::createMapping(DimensionSet::timeDomain, Mapping::LINEAR);
00207 
00208   //set position Argument
00209   Argument startPos(start);
00210   //set discontinuity at position
00211   MappingUtils::addDiscontinuity(m, startPos, 0.0, MappingUtils::post(start), value);
00212 
00213   //set position Argument
00214   Argument endPos(end);
00215   //set discontinuity at position
00216   MappingUtils::addDiscontinuity(m, endPos, 0.0, MappingUtils::pre(end), value);
00217 
00218   return m;
00219 }
00220 
00221 ConstMapping* BaseMacLayer::createSingleFrequencyMapping(simtime_t start,
00222                              simtime_t end,
00223                              double centerFreq,
00224                              double halfBandwidth,
00225                              double value)
00226 {
00227   Mapping* res = MappingUtils::createMapping(0.0, DimensionSet::timeFreqDomain, Mapping::LINEAR);
00228 
00229   Argument pos(DimensionSet::timeFreqDomain);
00230 
00231   pos.setArgValue(Dimension::frequency_static(), centerFreq - halfBandwidth);
00232   pos.setTime(start);
00233   res->setValue(pos, value);
00234 
00235   pos.setTime(end);
00236   res->setValue(pos, value);
00237 
00238   pos.setArgValue(Dimension::frequency_static(), centerFreq + halfBandwidth);
00239   res->setValue(pos, value);
00240 
00241   pos.setTime(start);
00242   res->setValue(pos, value);
00243 
00244   return res;
00245 }
00246 
00247 BaseConnectionManager* BaseMacLayer::getConnectionManager() {
00248   cModule* nic = getParentModule();
00249   return ChannelAccess::getConnectionManager(nic);
00250 }
00251 
00252 
00253