00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
00056
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
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
00090
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
00097 delete cInfo;
00098
00099
00100 pkt->setSrcAddr(myMacAddr);
00101
00102
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
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
00170 Signal* s = new Signal(start, length);
00171
00172
00173 Mapping* txPowerMapping = createRectangleMapping(start, end, power);
00174 s->setTransmissionPower(txPowerMapping);
00175
00176
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
00186 Mapping* m = MappingUtils::createMapping(0.0, DimensionSet::timeDomain, Mapping::LINEAR);
00187
00188
00189 Argument startPos(start);
00190
00191
00192 m->setValue(startPos, value);
00193
00194
00195 Argument endPos(end);
00196
00197
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
00206 Mapping* m = MappingUtils::createMapping(DimensionSet::timeDomain, Mapping::LINEAR);
00207
00208
00209 Argument startPos(start);
00210
00211 MappingUtils::addDiscontinuity(m, startPos, 0.0, MappingUtils::post(start), value);
00212
00213
00214 Argument endPos(end);
00215
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