PageRenderTime 57ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/linklayer/ieee80211/mac/Ieee80211aMac.cc

https://github.com/Sorouri/inetmanet
C++ | 1651 lines | 1297 code | 206 blank | 148 comment | 274 complexity | 6806f3a8e7855c51538c68a06befca7e MD5 | raw file
Possible License(s): GPL-2.0
  1. //
  2. // Copyright (C) 2006 Andras Varga, Levente M�z�os and Ahmed Ayadi
  3. //
  4. // This program is free software; you can redistribute it and/or
  5. // modify it under the terms of the GNU General Public License
  6. // as published by the Free Software Foundation; either version 2
  7. // of the License, or (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. //
  18. #include <algorithm>
  19. #include "Ieee80211aMac.h"
  20. #include "RadioState.h"
  21. #include "IInterfaceTable.h"
  22. #include "InterfaceTableAccess.h"
  23. #include "PhyControlInfo_m.h"
  24. #include "AirFrame_m.h"
  25. #include "Radio80211aControlInfo_m.h"
  26. //#define LWMPLS
  27. Define_Module(Ieee80211aMac);
  28. // don't forget to keep synchronized the C++ enum and the runtime enum definition
  29. Register_Enum(Ieee80211aMac,
  30. (Ieee80211aMac::IDLE,
  31. Ieee80211aMac::DEFER,
  32. Ieee80211aMac::WAITDIFS,
  33. Ieee80211aMac::BACKOFF,
  34. Ieee80211aMac::WAITACK,
  35. Ieee80211aMac::WAITBROADCAST,
  36. Ieee80211aMac::WAITCTS,
  37. Ieee80211aMac::WAITSIFS,
  38. Ieee80211aMac::RECEIVE));
  39. // don't forget to keep synchronized the C++ enum and the runtime enum definition
  40. Register_Enum(RadioState,
  41. (RadioState::IDLE,
  42. RadioState::RECV,
  43. RadioState::TRANSMIT,
  44. RadioState::SLEEP));
  45. /****************************************************************
  46. * Construction functions.
  47. */
  48. Ieee80211aMac::Ieee80211aMac()
  49. {
  50. endSIFS = NULL;
  51. endDIFS = NULL;
  52. endBackoff = NULL;
  53. endTimeout = NULL;
  54. endReserve = NULL;
  55. mediumStateChange = NULL;
  56. pendingRadioConfigMsg = NULL;
  57. }
  58. Ieee80211aMac::~Ieee80211aMac()
  59. {
  60. cancelAndDelete(endSIFS);
  61. cancelAndDelete(endDIFS);
  62. cancelAndDelete(endBackoff);
  63. cancelAndDelete(endTimeout);
  64. cancelAndDelete(endReserve);
  65. cancelAndDelete(mediumStateChange);
  66. if (pendingRadioConfigMsg)
  67. delete pendingRadioConfigMsg;
  68. while (!transmissionQueue.empty())
  69. {
  70. Ieee80211Frame *temp = transmissionQueue.front();
  71. transmissionQueue.pop_front();
  72. delete temp;
  73. }
  74. }
  75. /****************************************************************
  76. * Initialization functions.
  77. */
  78. void Ieee80211aMac::initialize(int stage)
  79. {
  80. WirelessMacBase::initialize(stage);
  81. if (stage == 0)
  82. {
  83. EV << "Initializing stage 0\n";
  84. // initialize parameters
  85. // Variable to apply the fsm fix
  86. fixFSM = par("fixFSM");
  87. opMode = hasPar("opMode") ? par("opMode") : 'b';
  88. if (opMode==1)
  89. opMode='b';
  90. else if (opMode==2)
  91. opMode='g';
  92. else if (opMode==3)
  93. opMode='a';
  94. else
  95. opMode='b';
  96. EV<<"Operating mode: 802.11 "<<opMode;
  97. maxQueueSize = par("maxQueueSize");
  98. bitrate = par("bitrate");
  99. bool found = false;
  100. if (opMode == 'b')
  101. {
  102. rateIndex = 0;
  103. for(int i = 0; i < 4; i++)
  104. {
  105. if(bitrate == BITRATES_80211b[i])
  106. {
  107. found = true;
  108. rateIndex = i;
  109. break;
  110. }
  111. }
  112. if(!found)
  113. {
  114. bitrate = BITRATES_80211b[3];
  115. rateIndex = 3;
  116. }
  117. }
  118. else
  119. {
  120. rateIndex = 0;
  121. for(int i = 0; i < 8; i++)
  122. {
  123. if(bitrate == BITRATES_80211a[i])
  124. {
  125. found = true;
  126. rateIndex = i;
  127. break;
  128. }
  129. }
  130. if(!found)
  131. {
  132. bitrate = BITRATES_80211a[7];
  133. rateIndex = 7;
  134. }
  135. }
  136. EV<<" bitrate="<<bitrate/1e6<<"M IDLE="<<IDLE<<" RECEIVE="<<RECEIVE<<endl;
  137. //basicBitrate = 2e6; //FIXME make it parameter
  138. basicBitrate = par("basicBitrate");
  139. if(basicBitrate==-1)
  140. {
  141. if (opMode == 'b')
  142. basicBitrate = 1e6;//1Mbps
  143. //else basicBitrate = 6e6;//6Mbps
  144. else basicBitrate = 2e6;//6Mbps
  145. }
  146. EV<<" basicBitrate="<<basicBitrate/1e6<<"M"<<endl;
  147. rtsThreshold = par("rtsThresholdBytes");
  148. retryLimit = par("retryLimit");
  149. if (retryLimit == -1) retryLimit = 7;
  150. ASSERT(retryLimit >= 0);
  151. cwMinData = par("cwMinData");
  152. if (cwMinData == -1) cwMinData = CW_MIN;
  153. ASSERT(cwMinData >= 0);
  154. cwMinBroadcast = par("cwMinBroadcast");
  155. if (cwMinBroadcast == -1) cwMinBroadcast = 31;
  156. ASSERT(cwMinBroadcast >= 0);
  157. AIFSN=par("AIFSN");
  158. if(AIFSN==-1)
  159. AIFSN=2;
  160. EV<<" AIFSN="<<AIFSN;
  161. const char *addressString = par("address");
  162. if (!strcmp(addressString, "auto")) {
  163. // assign automatic address
  164. address = MACAddress::generateAutoAddress();
  165. // change module parameter from "auto" to concrete address
  166. par("address").setStringValue(address.str().c_str());
  167. }
  168. else
  169. address.setAddress(addressString);
  170. std::cout<<getParentModule()->getFullPath()<<"."<<getClassName()<<":"<<"MAC ADDRESS = "<<address<<endl;
  171. minSuccessThreshold = hasPar("minSuccessThreshold") ? par("minSuccessThreshold") : 10;
  172. minTimerTimeout = hasPar("minTimerTimeout") ? par("minTimerTimeout") : 15;
  173. timerTimeout = hasPar("timerTimeout") ? par("timerTimeout") : minTimerTimeout;
  174. successThreshold = hasPar("successThreshold") ? par("successThreshold") : minSuccessThreshold;
  175. autoBitrate = hasPar("autoBitrate") ? par("autoBitrate") : 0;
  176. switch (autoBitrate)
  177. {
  178. case 0:
  179. {
  180. rateControlMode = RATE_CR;
  181. EV<<"MAC Transmossion algorithm : Constant Rate" <<endl;
  182. break;
  183. }
  184. case 1:
  185. {
  186. rateControlMode = RATE_ARF;
  187. EV<<"MAC Transmossion algorithm : ARF Rate" <<endl;
  188. break;
  189. }
  190. case 2:
  191. {
  192. rateControlMode = RATE_AARF;
  193. successCoeff = hasPar("successCoeff") ? par("successCoeff") : 2.0;
  194. timerCoeff = hasPar("timerCoeff") ? par("timerCoeff") : 2.0;
  195. maxSuccessThreshold = hasPar("maxSuccessThreshold") ? par("maxSuccessThreshold") : 60;
  196. EV<<"MAC Transmossion algorithm : AARF Rate" <<endl;
  197. }
  198. break;
  199. default:
  200. rateControlMode = RATE_CR;
  201. }
  202. // subscribe for the information of the carrier sense
  203. nb->subscribe(this, NF_RADIOSTATE_CHANGED);
  204. // initalize self messages
  205. endSIFS = new cMessage("SIFS");
  206. endDIFS = new cMessage("DIFS");
  207. endBackoff = new cMessage("Backoff");
  208. endTimeout = new cMessage("Timeout");
  209. endReserve = new cMessage("Reserve");
  210. mediumStateChange = new cMessage("MediumStateChange");
  211. fsm.setState(WAITBROADCAST,"WAITBROADCAST");
  212. scheduleAt(0, endTimeout);
  213. // interface
  214. registerInterface();
  215. // obtain pointer to external queue
  216. initializeQueueModule();
  217. // state variables
  218. fsm.setName("Ieee80211aMac State Machine");
  219. mode = DCF;
  220. sequenceNumber = 0;
  221. radioState = RadioState::IDLE;
  222. retryCounter = 0;
  223. backoffPeriod=-1;
  224. backoff = false;
  225. lastReceiveFailed = false;
  226. noFrame=true;
  227. nav = false;
  228. i=0;
  229. j=0;
  230. recvdThroughput=0;
  231. _snr=0;
  232. samplingCoeff = 50;
  233. // statistics
  234. numRetry = 0;
  235. numSentWithoutRetry = 0;
  236. numGivenUp = 0;
  237. numCollision = 0;
  238. numSent = 0;
  239. numReceived = 0;
  240. numSentBroadcast = 0;
  241. numReceivedBroadcast = 0;
  242. numReceivedOther = 0;
  243. numAckSend = 0;
  244. successCounter = 0;
  245. failedCounter = 0;
  246. recovery = 0;
  247. timer = 0;
  248. timeStampLastMessageReceived = 0;
  249. stateVector.setName("State");
  250. stateVector.setEnum("Ieee80211aMac");
  251. radioStateVector.setName("RadioState");
  252. radioStateVector.setEnum("RadioState");
  253. receiveBroadcastVector.setName("ReceiveBcastVector");
  254. cwVector.setName("Contention Window");
  255. cwStats.setName("Contetion Window");
  256. receivedThroughput.setName("Received Throughput");
  257. sendThroughput.setName("Send Throughput");
  258. PHYRateVector.setName("PHY bit rate");
  259. // initialize watches
  260. WATCH(fsm);
  261. WATCH(radioState);
  262. WATCH(retryCounter);
  263. WATCH(backoff);
  264. WATCH(nav);
  265. WATCH(numRetry);
  266. WATCH(numSentWithoutRetry);
  267. WATCH(numGivenUp);
  268. WATCH(numCollision);
  269. WATCH(numSent);
  270. WATCH(numReceived);
  271. WATCH(numSentBroadcast);
  272. WATCH(numReceivedBroadcast);
  273. radioModule = gate("lowergateOut")->getNextGate()->getOwnerModule()->getId();
  274. }
  275. }
  276. void Ieee80211aMac::registerInterface()
  277. {
  278. IInterfaceTable *ift = InterfaceTableAccess().getIfExists();
  279. if (!ift)
  280. return;
  281. InterfaceEntry *e = new InterfaceEntry();
  282. // interface name: NetworkInterface module's name without special characters ([])
  283. char *interfaceName = new char[strlen(getParentModule()->getFullName()) + 1];
  284. char *d = interfaceName;
  285. for (const char *s = getParentModule()->getFullName(); *s; s++)
  286. if (isalnum(*s))
  287. *d++ = *s;
  288. *d = '\0';
  289. e->setName(interfaceName);
  290. delete [] interfaceName;
  291. // address
  292. e->setMACAddress(address);
  293. e->setInterfaceToken(address.formInterfaceIdentifier());
  294. // FIXME: MTU on 802.11 = ?
  295. e->setMtu(par("mtu"));
  296. // capabilities
  297. e->setBroadcast(true);
  298. e->setMulticast(true);
  299. e->setPointToPoint(false);
  300. // add
  301. ift->addInterface(e, this);
  302. }
  303. void Ieee80211aMac::initializeQueueModule()
  304. {
  305. // use of external queue module is optional -- find it if there's one specified
  306. if (par("queueModule").stringValue()[0])
  307. {
  308. cModule *module = getParentModule()->getSubmodule(par("queueModule").stringValue());
  309. queueModule = check_and_cast<IPassiveQueue *>(module);
  310. EV << "Requesting first two frames from queue module\n";
  311. queueModule->requestPacket();
  312. // needed for backoff: mandatory if next message is already present
  313. queueModule->requestPacket();
  314. }
  315. }
  316. /****************************************************************
  317. * Message handling functions.
  318. */
  319. void Ieee80211aMac::handleSelfMsg(cMessage *msg)
  320. {
  321. EV << "received self message: " << msg << endl;
  322. if (msg == endReserve)
  323. nav = false;
  324. handleWithFSM(msg);
  325. }
  326. void Ieee80211aMac::handleUpperMsg(cPacket *msg)
  327. {
  328. EV<<"Ieee80211aMac handle message from upper layer"<<endl;
  329. // check for queue overflow
  330. if (maxQueueSize && (int) transmissionQueue.size() == maxQueueSize)
  331. {
  332. EV << "message " << msg << " received from higher layer but MAC queue is full, dropping message\n";
  333. delete msg;
  334. return;
  335. }
  336. // must be a Ieee80211DataOrMgmtFrame, within the max size because we don't support fragmentation
  337. Ieee80211DataOrMgmtFrame *frame = check_and_cast<Ieee80211DataOrMgmtFrame *>(msg);
  338. if (frame->getByteLength() > fragmentationThreshold)
  339. error("message from higher layer (%s)%s is too long for 802.11b, %d bytes (fragmentation is not supported yet)",
  340. msg->getClassName(), msg->getName(), msg->getByteLength());
  341. EV << "frame " << frame << " received from higher layer, receiver = " << frame->getReceiverAddress() << endl;
  342. ASSERT(!frame->getReceiverAddress().isUnspecified());
  343. // fill in missing fields (receiver address, seq number), and insert into the queue
  344. frame->setTransmitterAddress(address);
  345. frame->setSequenceNumber(sequenceNumber);
  346. sequenceNumber = (sequenceNumber+1) % 4096; //XXX seqNum must be checked upon reception of frames!
  347. transmissionQueue.push_back(frame);
  348. handleWithFSM(frame);
  349. }
  350. void Ieee80211aMac::handleCommand(cMessage *msg)
  351. {
  352. if (msg->getKind()==PHY_C_CONFIGURERADIO)
  353. {
  354. EV << "Passing on command " << msg->getName() << " to physical layer\n";
  355. if (pendingRadioConfigMsg != NULL)
  356. {
  357. // merge contents of the old command into the new one, then delete it
  358. PhyControlInfo *pOld = check_and_cast<PhyControlInfo *>(pendingRadioConfigMsg->getControlInfo());
  359. PhyControlInfo *pNew = check_and_cast<PhyControlInfo *>(msg->getControlInfo());
  360. if (pNew->getChannelNumber()==-1 && pOld->getChannelNumber()!=-1)
  361. pNew->setChannelNumber(pOld->getChannelNumber());
  362. if (pNew->getBitrate()==-1 && pOld->getBitrate()!=-1)
  363. pNew->setBitrate(pOld->getBitrate());
  364. delete pendingRadioConfigMsg;
  365. pendingRadioConfigMsg = NULL;
  366. }
  367. if (fsm.getState() == IDLE || fsm.getState() == DEFER || fsm.getState() == BACKOFF)
  368. {
  369. EV << "Sending it down immediately\n";
  370. PhyControlInfo *phyControlInfo = dynamic_cast<PhyControlInfo *>(msg->getControlInfo());
  371. if(phyControlInfo)
  372. phyControlInfo->setAdativeSensitivity(true);
  373. sendDown(msg);
  374. }
  375. else
  376. {
  377. EV << "Delaying " << msg->getName() << " until next IDLE or DEFER state\n";
  378. pendingRadioConfigMsg = msg;
  379. }
  380. }
  381. else
  382. {
  383. error("Unrecognized command from mgmt layer: (%s)%s msgkind=%d", msg->getClassName(), msg->getName(), msg->getKind());
  384. }
  385. }
  386. void Ieee80211aMac::handleLowerMsg(cPacket *msg)
  387. {
  388. EV << "received message from lower layer: " << msg << endl;
  389. Ieee80211Frame *frame;
  390. nb->fireChangeNotification(NF_LINK_FULL_PROMISCUOUS, msg);
  391. if (msg->getControlInfo() && dynamic_cast<Radio80211aControlInfo *>(msg->getControlInfo()))
  392. {
  393. Radio80211aControlInfo *cinfo = (Radio80211aControlInfo*) msg->removeControlInfo();
  394. if(j%10==0){
  395. snr = _snr;
  396. j=0;
  397. _snr=0;
  398. }
  399. j++;
  400. _snr+=cinfo->getSnr()/10;
  401. lossRate = cinfo->getLossRate();
  402. delete cinfo;
  403. }
  404. if(i%samplingCoeff==0)
  405. {
  406. receivedThroughput.record(recvdThroughput);
  407. i=0;
  408. recvdThroughput=0;
  409. }
  410. i++;
  411. if (timeStampLastMessageReceived == 0)
  412. timeStampLastMessageReceived = simTime();
  413. else
  414. {
  415. recvdThroughput+=((frame->getBitLength()/(simTime()-timeStampLastMessageReceived))/1000000)/samplingCoeff;
  416. timeStampLastMessageReceived = simTime();
  417. }
  418. frame = dynamic_cast<Ieee80211Frame *>(msg);
  419. if (!frame)
  420. {
  421. #ifdef FRAMETYPESTOP
  422. error("message from physical layer (%s)%s is not a subclass of Ieee80211Frame",msg->getClassName(), msg->getName());
  423. #endif
  424. EV << "message from physical layer (%s)%s is not a subclass of Ieee80211Frame" << msg->getClassName() << " " << msg->getName() << endl;
  425. delete msg;
  426. return;
  427. // error("message from physical layer (%s)%s is not a subclass of Ieee80211Frame",msg->getClassName(), msg->getName());
  428. }
  429. EV << "Self address: " << address
  430. << ", receiver address: " << frame->getReceiverAddress()
  431. << ", received frame is for us: " << isForUs(frame) << endl;
  432. Ieee80211TwoAddressFrame *twoAddressFrame = dynamic_cast<Ieee80211TwoAddressFrame *>(msg);
  433. ASSERT(!twoAddressFrame || twoAddressFrame->getTransmitterAddress() != address);
  434. #ifdef LWMPLS
  435. int msgKind = msg->getKind();
  436. if (msgKind != COLLISION && msgKind != BITERROR && twoAddressFrame!=NULL)
  437. nb->fireChangeNotification(NF_LINK_REFRESH, twoAddressFrame);
  438. #endif
  439. handleWithFSM(msg);
  440. // if we are the owner then we did not send this message up
  441. if (msg->getOwner() == this)
  442. delete msg;
  443. }
  444. void Ieee80211aMac::receiveChangeNotification(int category, const cPolymorphic *details)
  445. {
  446. Enter_Method_Silent();
  447. printNotificationBanner(category, details);
  448. if (category == NF_RADIOSTATE_CHANGED)
  449. {
  450. RadioState * rstate = check_and_cast<RadioState *>(details);
  451. if (rstate->getRadioId()!=getRadioModuleId())
  452. return;
  453. RadioState::State newRadioState = rstate->getState();
  454. // FIXME: double recording, because there's no sample hold in the gui
  455. radioStateVector.record(radioState);
  456. radioStateVector.record(newRadioState);
  457. radioState = newRadioState;
  458. handleWithFSM(mediumStateChange);
  459. }
  460. }
  461. /**
  462. * Msg can be upper, lower, self or NULL (when radio state changes)
  463. */
  464. void Ieee80211aMac::handleWithFSM(cMessage *msg)
  465. {
  466. // skip those cases where there's nothing to do, so the switch looks simpler
  467. // if (isUpperMsg(msg) && fsm.getState() != IDLE)
  468. // {
  469. // EV << "deferring upper message transmission in " << fsm.getStateName() << " state\n";
  470. // return;
  471. // }
  472. // skip those cases where there's nothing to do, so the switch looks simpler
  473. if(noFrame==true && isUpperMsg(msg))
  474. {
  475. noFrame=false;
  476. EV<<"New frame arrived while backing-off with noFrame\n";
  477. }
  478. else if (isUpperMsg(msg) && fsm.getState() != IDLE)
  479. {
  480. EV << "deferring upper message transmission in " << fsm.getStateName() << " state\n";
  481. return;
  482. }
  483. Ieee80211Frame *frame = dynamic_cast<Ieee80211Frame*>(msg);
  484. int frameType = frame ? frame->getType() : -1;
  485. int msgKind = msg->getKind();
  486. logState();
  487. // stateVector.record(fsm.getState());
  488. if (frame && isLowerMsg(frame))
  489. {
  490. lastReceiveFailed =(msgKind == COLLISION || msgKind == BITERROR);
  491. scheduleReservePeriod(frame);
  492. }
  493. // TODO: fixed bug according to the message: [omnetpp] A possible bug in the Ieee80211's FSM. It's necessary to check
  494. FSMA_Switch(fsm)
  495. {
  496. FSMA_State(IDLE)
  497. {
  498. FSMA_Enter(sendDownPendingRadioConfigMsg());
  499. if (fixFSM)
  500. {
  501. FSMA_Event_Transition(Data-Ready,
  502. // isUpperMsg(msg),
  503. isUpperMsg(msg) && backoffPeriod > 0,
  504. DEFER,
  505. //ASSERT(isInvalidBackoffPeriod() || backoffPeriod == 0);
  506. //invalidateBackoffPeriod();
  507. ASSERT(false);
  508. );
  509. FSMA_No_Event_Transition(Immediate-Data-Ready,
  510. //!transmissionQueue.empty(),
  511. !transmissionQueue.empty() && backoffPeriod > 0,
  512. DEFER,
  513. // invalidateBackoffPeriod();
  514. ASSERT(backoff);
  515. );
  516. }
  517. FSMA_Event_Transition(Data-Ready,
  518. isUpperMsg(msg),
  519. DEFER,
  520. ASSERT(isInvalidBackoffPeriod() || backoffPeriod == 0);
  521. invalidateBackoffPeriod();
  522. );
  523. FSMA_No_Event_Transition(Immediate-Data-Ready,
  524. !transmissionQueue.empty(),
  525. DEFER,
  526. invalidateBackoffPeriod();
  527. );
  528. FSMA_Event_Transition(Receive,
  529. isLowerMsg(msg),
  530. RECEIVE,
  531. );
  532. }
  533. FSMA_State(DEFER)
  534. {
  535. FSMA_Enter(sendDownPendingRadioConfigMsg());
  536. FSMA_Event_Transition(Wait-DIFS,
  537. (isMediumStateChange(msg) && isMediumFree()),
  538. WAITDIFS,
  539. ;);
  540. FSMA_No_Event_Transition(Immediate-Wait-DIFS,
  541. (isMediumFree() || (!backoff)),
  542. WAITDIFS,
  543. ;);
  544. FSMA_Event_Transition(Receive,
  545. isLowerMsg(msg),
  546. RECEIVE,
  547. ;);
  548. }
  549. FSMA_State(WAITDIFS)
  550. {
  551. FSMA_Enter(scheduleDIFSPeriod());
  552. if(!transmissionQueue.empty())
  553. {
  554. FSMA_Event_Transition(Immediate-Transmit-RTS,
  555. msg == endDIFS && !isBroadcast(getCurrentTransmission()) && !isMulticast(getCurrentTransmission())
  556. && getCurrentTransmission()->getByteLength() >= rtsThreshold && !backoff,
  557. WAITCTS,
  558. sendRTSFrame(getCurrentTransmission());
  559. cancelDIFSPeriod();
  560. );//ahmed
  561. FSMA_Event_Transition(Immediate-Transmit-Broadcast,
  562. msg == endDIFS && isBroadcast(getCurrentTransmission()) && !backoff,
  563. WAITBROADCAST,
  564. sendBroadcastFrame(getCurrentTransmission());
  565. cancelDIFSPeriod();
  566. );
  567. FSMA_Event_Transition(Immediate-Transmit-Multicast,
  568. msg == endDIFS && isMulticast(getCurrentTransmission()) && !backoff,
  569. WAITMULTICAST,
  570. sendMulticastFrame(getCurrentTransmission());
  571. cancelDIFSPeriod();
  572. );
  573. FSMA_Event_Transition(Immediate-Transmit-Data,
  574. msg == endDIFS && !isBroadcast(getCurrentTransmission()) && !isMulticast(getCurrentTransmission()) && !backoff,
  575. WAITACK,
  576. sendDataFrame(getCurrentTransmission());//ahmed
  577. cancelDIFSPeriod();
  578. );
  579. }
  580. FSMA_Event_Transition(DIFS-Over,
  581. msg == endDIFS,
  582. BACKOFF,
  583. ASSERT(backoff);
  584. if (isInvalidBackoffPeriod())
  585. generateBackoffPeriod();
  586. );
  587. FSMA_Event_Transition(Busy,
  588. isMediumStateChange(msg) && !isMediumFree(),
  589. DEFER,
  590. backoff = true;
  591. cancelDIFSPeriod();
  592. );
  593. FSMA_No_Event_Transition(Immediate-Busy,
  594. !isMediumFree(),
  595. DEFER,
  596. backoff = true;
  597. cancelDIFSPeriod();
  598. );
  599. // radio state changes before we actually get the message, so this must be here
  600. FSMA_Event_Transition(Receive,
  601. isLowerMsg(msg),
  602. RECEIVE,
  603. cancelDIFSPeriod();
  604. ;);
  605. }
  606. FSMA_State(BACKOFF)
  607. {
  608. FSMA_Enter(scheduleBackoffPeriod());
  609. if(!transmissionQueue.empty())
  610. {
  611. FSMA_Event_Transition(Transmit-RTS,
  612. msg == endBackoff && !isBroadcast(getCurrentTransmission()) && !isMulticast(getCurrentTransmission())
  613. && getCurrentTransmission()->getByteLength() >= rtsThreshold,
  614. WAITCTS,
  615. sendRTSFrame(getCurrentTransmission());
  616. );//ahmed
  617. FSMA_Event_Transition(Transmit-Broadcast,
  618. msg == endBackoff && isBroadcast(getCurrentTransmission()),
  619. WAITBROADCAST,
  620. sendBroadcastFrame(getCurrentTransmission());
  621. );
  622. FSMA_Event_Transition(Transmit-Multicast,
  623. msg == endBackoff && isMulticast(getCurrentTransmission()),
  624. WAITMULTICAST,
  625. sendMulticastFrame(getCurrentTransmission());
  626. );//ahmed
  627. FSMA_Event_Transition(Transmit-Data,
  628. msg == endBackoff && !isBroadcast(getCurrentTransmission()) && !isMulticast(getCurrentTransmission()),
  629. WAITACK,
  630. sendDataFrame(getCurrentTransmission());
  631. );//ahmed
  632. }
  633. FSMA_Event_Transition(Backoff-Idle,
  634. msg==endBackoff && transmissionQueue.empty(),
  635. IDLE,
  636. resetStateVariables();
  637. );
  638. FSMA_Event_Transition(Backoff-Busy,
  639. isMediumStateChange(msg) && !isMediumFree(),
  640. DEFER,
  641. cancelBackoffPeriod();
  642. decreaseBackoffPeriod();
  643. );
  644. }
  645. FSMA_State(WAITACK)
  646. {
  647. FSMA_Enter(scheduleDataTimeoutPeriod(getCurrentTransmission()));
  648. FSMA_Event_Transition(Receive-ACK,
  649. isLowerMsg(msg) && isForUs(frame) && frameType == ST_ACK,
  650. IDLE,
  651. if (retryCounter == 0) numSentWithoutRetry++;
  652. numSent++;
  653. cancelTimeoutPeriod();
  654. finishCurrentTransmission();
  655. );
  656. FSMA_Event_Transition(Transmit-Data-Failed,
  657. msg == endTimeout && retryCounter == retryLimit-1,
  658. IDLE,
  659. giveUpCurrentTransmission();
  660. );
  661. FSMA_Event_Transition(Receive-ACK-Timeout,
  662. msg == endTimeout,
  663. DEFER,
  664. retryCurrentTransmission();
  665. );
  666. }
  667. // wait until broadcast is sent
  668. FSMA_State(WAITBROADCAST)
  669. {
  670. // if(!transmissionQueue.empty())
  671. FSMA_Enter(scheduleBroadcastTimeoutPeriod(getCurrentTransmission()));
  672. /*
  673. FSMA_Event_Transition(Transmit-Broadcast,
  674. msg == endTimeout,
  675. IDLE,
  676. finishCurrentTransmission();
  677. numSentBroadcast++;
  678. );
  679. *///changed
  680. FSMA_Event_Transition(Transmit-Broadcast,
  681. msg == endTimeout,
  682. DEFER,
  683. finishCurrentTransmission();
  684. numSentBroadcast++;
  685. backoff=true;
  686. invalidateBackoffPeriod();
  687. );
  688. }
  689. FSMA_State(WAITMULTICAST)
  690. {
  691. FSMA_Enter(scheduleMulticastTimeoutPeriod(getCurrentTransmission()));
  692. FSMA_Event_Transition(Transmit-Multicast,
  693. msg == endTimeout,
  694. IDLE,
  695. finishCurrentTransmission();
  696. );
  697. }//ahmed
  698. // accoriding to 9.2.5.7 CTS procedure
  699. FSMA_State(WAITCTS)
  700. {
  701. FSMA_Enter(scheduleCTSTimeoutPeriod());
  702. FSMA_Event_Transition(Receive-CTS,
  703. isLowerMsg(msg) && isForUs(frame) && frameType == ST_CTS,
  704. WAITSIFS,
  705. cancelTimeoutPeriod();
  706. );
  707. FSMA_Event_Transition(Transmit-RTS-Failed,
  708. msg == endTimeout && retryCounter == retryLimit - 1,
  709. IDLE,
  710. giveUpCurrentTransmission();
  711. );
  712. FSMA_Event_Transition(Receive-CTS-Timeout,
  713. msg == endTimeout,
  714. DEFER,
  715. retryCurrentTransmission();
  716. );
  717. }
  718. FSMA_State(WAITSIFS)
  719. {
  720. FSMA_Enter(scheduleSIFSPeriod(frame));
  721. FSMA_Event_Transition(Transmit-CTS,
  722. msg == endSIFS && getFrameReceivedBeforeSIFS()->getType() == ST_RTS,
  723. IDLE,
  724. sendCTSFrameOnEndSIFS();
  725. if (fixFSM)
  726. finishReception();
  727. else
  728. resetStateVariables();
  729. );
  730. FSMA_Event_Transition(Transmit-DATA,
  731. msg == endSIFS && getFrameReceivedBeforeSIFS()->getType() == ST_CTS,
  732. WAITACK,
  733. sendDataFrameOnEndSIFS(getCurrentTransmission());
  734. );
  735. FSMA_Event_Transition(Transmit-ACK,
  736. msg == endSIFS && isDataOrMgmtFrame(getFrameReceivedBeforeSIFS()),
  737. IDLE,
  738. sendACKFrameOnEndSIFS();
  739. if (fixFSM)
  740. finishReception();
  741. else
  742. resetStateVariables();
  743. );
  744. }
  745. // this is not a real state
  746. FSMA_State(RECEIVE)
  747. {
  748. FSMA_No_Event_Transition(Immediate-Receive-Error,
  749. isLowerMsg(msg) && (msgKind == COLLISION || msgKind == BITERROR),
  750. IDLE,
  751. EV << "received frame contains bit errors or collision, next wait period is EIFS\n";
  752. numCollision++;
  753. if (fixFSM)
  754. finishReception();
  755. else
  756. resetStateVariables();
  757. );
  758. /*
  759. FSMA_No_Event_Transition(Immediate-Receive-Broadcast,
  760. isLowerMsg(msg) && isBroadcast(frame) && isDataOrMgmtFrame(frame),
  761. IDLE,
  762. sendUp(frame);
  763. numReceivedBroadcast++;
  764. if (fixFSM)
  765. finishReception();
  766. else
  767. resetStateVariables();
  768. );
  769. *///added && !isSentByUs(frame)
  770. FSMA_No_Event_Transition(Immediate-Receive-Broadcast,
  771. isLowerMsg(msg) && isBroadcast(frame) && !isSentByUs(frame) && isDataOrMgmtFrame(frame),
  772. IDLE,
  773. sendUp(frame);
  774. numReceivedBroadcast++;
  775. /*
  776. tCycle+=simTime()-oldT;
  777. oldT=simTime();
  778. if(tCycle>=1000.0E-3){
  779. receiveBroadcastVector.record(numReceivedBroadcast*(msg->getBitLength()-62*8)/tCycle/1e6);
  780. thStats.collect(numReceivedBroadcast*(msg->getBitLength()-62*8)/tCycle/1e6);
  781. tCycle=0.0;
  782. numReceivedBroadcast=0;
  783. }
  784. */
  785. if (fixFSM)
  786. finishReception();
  787. else
  788. resetStateVariables();
  789. );
  790. FSMA_No_Event_Transition(Immediate-Receive-Multicast,
  791. isLowerMsg(msg) && isMulticast(frame) && isDataOrMgmtFrame(frame),
  792. IDLE,
  793. sendUp(frame);
  794. );
  795. FSMA_No_Event_Transition(Immediate-Receive-Data,
  796. isLowerMsg(msg) && isForUs(frame) && isDataOrMgmtFrame(frame),
  797. WAITSIFS,
  798. sendUp(frame);
  799. numReceived++;
  800. );
  801. FSMA_No_Event_Transition(Immediate-Receive-RTS,
  802. isLowerMsg(msg) && isForUs(frame) && frameType == ST_RTS,
  803. WAITSIFS,
  804. );
  805. FSMA_No_Event_Transition(Immediate-Promiscuous-Data,
  806. isLowerMsg(msg) && !isForUs(frame) && isDataOrMgmtFrame(frame),
  807. IDLE,
  808. nb->fireChangeNotification(NF_LINK_PROMISCUOUS, frame);
  809. if (fixFSM)
  810. finishReception();
  811. else
  812. resetStateVariables();
  813. numReceivedOther++;
  814. );
  815. FSMA_No_Event_Transition(Immediate-Receive-Other,
  816. isLowerMsg(msg),
  817. IDLE,
  818. if (fixFSM)
  819. finishReception();
  820. else
  821. resetStateVariables();
  822. numReceivedOther++;
  823. );
  824. }
  825. }
  826. logState();
  827. // stateVector.record(fsm.getState());
  828. }
  829. void Ieee80211aMac::finishReception()
  830. {
  831. if (!transmissionQueue.empty()) {
  832. backoff = true;
  833. }
  834. else {
  835. backoffPeriod = 0;
  836. retryCounter = 0;
  837. backoff = false;
  838. noFrame=false;//sorin
  839. }
  840. }
  841. /****************************************************************
  842. * Timing functions.
  843. */
  844. simtime_t Ieee80211aMac::getSIFS()
  845. {
  846. // TODO: return aRxRFDelay() + aRxPLCPDelay() + aMACProcessingDelay() + aRxTxTurnaroundTime();
  847. return SIFS;
  848. }
  849. simtime_t Ieee80211aMac::getSlotTime()
  850. {
  851. // TODO: return aCCATime() + aRxTxTurnaroundTime + aAirPropagationTime() + aMACProcessingDelay();
  852. return ST;
  853. }
  854. simtime_t Ieee80211aMac::getPIFS()
  855. {
  856. return getSIFS() + getSlotTime();
  857. }
  858. simtime_t Ieee80211aMac::getDIFS()
  859. {
  860. return getSIFS() + ((double)AIFSN) * getSlotTime();
  861. }
  862. simtime_t Ieee80211aMac::getEIFS()
  863. {
  864. // FIXME: return getSIFS() + getDIFS() + (8 * ACKSize + aPreambleLength + aPLCPHeaderLength) / lowestDatarate;
  865. return getSIFS() + getDIFS() + (8 * LENGTH_ACK + PHY_HEADER_LENGTH_A) / 1E+6;
  866. }
  867. simtime_t Ieee80211aMac::computeBackoffPeriod(Ieee80211Frame *msg, int r)
  868. {
  869. int cw;
  870. if (msg && isBroadcast(msg))
  871. cw = cwMinBroadcast;
  872. else
  873. {
  874. ASSERT(0 <= r && r < retryLimit);
  875. cw = (cwMinData + 1) * (1 << r) - 1;
  876. if (cw > CW_MAX)
  877. cw = CW_MAX;
  878. }
  879. int c = intrand(cw + 1);
  880. EV << "generated backoff slot number: " << c << " , cw: " << cw << endl;
  881. cwVector.record(((double)c) );
  882. cwStats.collect(((double)c) );
  883. return ((double)c) * getSlotTime();
  884. }
  885. /****************************************************************
  886. * Timer functions.
  887. */
  888. void Ieee80211aMac::scheduleSIFSPeriod(Ieee80211Frame *frame)
  889. {
  890. EV << "scheduling SIFS period\n";
  891. endSIFS->setContextPointer(frame->dup());
  892. scheduleAt(simTime() + getSIFS(), endSIFS);
  893. }
  894. void Ieee80211aMac::scheduleDIFSPeriod()
  895. {
  896. if (lastReceiveFailed)
  897. {
  898. EV << "receiption of last frame failed, scheduling EIFS period\n";
  899. scheduleAt(simTime() + getEIFS(), endDIFS);
  900. }
  901. else
  902. {
  903. EV << "scheduling DIFS period\n";
  904. scheduleAt(simTime() + getDIFS(), endDIFS);
  905. }
  906. }
  907. void Ieee80211aMac::cancelDIFSPeriod()
  908. {
  909. EV << "cancelling DIFS period\n";
  910. cancelEvent(endDIFS);
  911. }
  912. void Ieee80211aMac::scheduleDataTimeoutPeriod(Ieee80211DataOrMgmtFrame *frameToSend)
  913. {
  914. EV << "scheduling data timeout period\n";
  915. simtime_t prop_delay = MAX_PROPAGATION_DELAY;
  916. double delay;
  917. delay = computeFrameDuration(frameToSend) + SIMTIME_DBL(getSIFS()) + computeFrameDuration(LENGTH_ACK, basicBitrate) + SIMTIME_DBL(prop_delay) * 2;
  918. scheduleAt(simTime() +delay , endTimeout);
  919. }
  920. void Ieee80211aMac::scheduleBroadcastTimeoutPeriod(Ieee80211DataOrMgmtFrame *frameToSend)
  921. {
  922. EV << "scheduling broadcast timeout period\n";
  923. scheduleAt(simTime() + computeFrameDuration(frameToSend), endTimeout);
  924. }
  925. void Ieee80211aMac::scheduleMulticastTimeoutPeriod(Ieee80211DataOrMgmtFrame *frameToSend)
  926. {
  927. EV << "scheduling multicast timeout period\n";
  928. scheduleAt(simTime() + computeFrameDuration(frameToSend), endTimeout);
  929. }//ahmed
  930. void Ieee80211aMac::cancelTimeoutPeriod()
  931. {
  932. EV << "cancelling timeout period\n";
  933. cancelEvent(endTimeout);
  934. }
  935. void Ieee80211aMac::scheduleCTSTimeoutPeriod()
  936. {
  937. scheduleAt(simTime() + computeFrameDuration(LENGTH_RTS, basicBitrate) + getSIFS() + computeFrameDuration(LENGTH_CTS, basicBitrate) + MAX_PROPAGATION_DELAY * 2, endTimeout);
  938. }
  939. void Ieee80211aMac::scheduleReservePeriod(Ieee80211Frame *frame)
  940. {
  941. simtime_t reserve = frame->getDuration();
  942. // see spec. 7.1.3.2
  943. if (!isForUs(frame) && reserve != 0 && reserve < 32768)
  944. {
  945. if (endReserve->isScheduled()) {
  946. simtime_t oldReserve = endReserve->getArrivalTime() - simTime();
  947. if (oldReserve > reserve)
  948. return;
  949. reserve = std::max(reserve, oldReserve);
  950. cancelEvent(endReserve);
  951. }
  952. else if (radioState == RadioState::IDLE)
  953. {
  954. // NAV: the channel just became virtually busy according to the spec
  955. scheduleAt(simTime(), mediumStateChange);
  956. }
  957. EV << "scheduling reserve period for: " << reserve << endl;
  958. ASSERT(reserve > 0);
  959. nav = true;
  960. scheduleAt(simTime() + reserve, endReserve);
  961. }
  962. }
  963. void Ieee80211aMac::invalidateBackoffPeriod()
  964. {
  965. backoffPeriod = -1;
  966. }
  967. bool Ieee80211aMac::isInvalidBackoffPeriod()
  968. {
  969. return backoffPeriod == -1;
  970. }
  971. void Ieee80211aMac::generateBackoffPeriod()
  972. {
  973. backoffPeriod = computeBackoffPeriod(getCurrentTransmission(), retryCounter);
  974. ASSERT(backoffPeriod >= 0);
  975. EV << "backoff period set to " << backoffPeriod << endl;
  976. }
  977. void Ieee80211aMac::decreaseBackoffPeriod()
  978. {
  979. // see spec 9.2.5.2
  980. simtime_t elapsedBackoffTime = simTime() - endBackoff->getSendingTime();
  981. backoffPeriod -= ((int)(elapsedBackoffTime / getSlotTime())) * getSlotTime();
  982. ASSERT(backoffPeriod >= 0);
  983. EV << "backoff period decreased to " << backoffPeriod << endl;
  984. }
  985. void Ieee80211aMac::scheduleBackoffPeriod()
  986. {
  987. EV << "scheduling backoff period\n";
  988. scheduleAt(simTime() + backoffPeriod, endBackoff);
  989. }
  990. void Ieee80211aMac::cancelBackoffPeriod()
  991. {
  992. EV << "cancelling Backoff period\n";
  993. cancelEvent(endBackoff);
  994. }
  995. /****************************************************************
  996. * Frame sender functions.
  997. */
  998. void Ieee80211aMac::sendACKFrameOnEndSIFS()
  999. {
  1000. Ieee80211Frame *frameToACK = (Ieee80211Frame *)endSIFS->getContextPointer();
  1001. endSIFS->setContextPointer(NULL);
  1002. sendACKFrame(check_and_cast<Ieee80211DataOrMgmtFrame*>(frameToACK));
  1003. delete frameToACK;
  1004. }
  1005. void Ieee80211aMac::sendACKFrame(Ieee80211DataOrMgmtFrame *frameToACK)
  1006. {
  1007. EV << "sending ACK frame\n";
  1008. numAckSend++;
  1009. sendDown(setBasicBitrate(buildACKFrame(frameToACK)));
  1010. }
  1011. void Ieee80211aMac::sendDataFrameOnEndSIFS(Ieee80211DataOrMgmtFrame *frameToSend)
  1012. {
  1013. Ieee80211Frame *ctsFrame = (Ieee80211Frame *)endSIFS->getContextPointer();
  1014. endSIFS->setContextPointer(NULL);
  1015. sendDataFrame(frameToSend);
  1016. delete ctsFrame;
  1017. }
  1018. void Ieee80211aMac::sendDataFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1019. {
  1020. EV << "sending Data frame\n";
  1021. PhyControlInfo *phyControlInfo = dynamic_cast<PhyControlInfo *>(frameToSend->getControlInfo() );
  1022. if(phyControlInfo)
  1023. phyControlInfo->setAdativeSensitivity(true);
  1024. sendDown(buildDataFrame(frameToSend));
  1025. }
  1026. void Ieee80211aMac::sendBroadcastFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1027. {
  1028. EV << "sending Broadcast frame\n";
  1029. PhyControlInfo *phyControlInfo = dynamic_cast<PhyControlInfo *>(frameToSend->getControlInfo() );
  1030. if(phyControlInfo)
  1031. phyControlInfo->setAdativeSensitivity(true);
  1032. sendDown(buildBroadcastFrame(frameToSend));
  1033. }
  1034. void Ieee80211aMac::sendRTSFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1035. {
  1036. EV << "sending RTS frame\n";
  1037. PhyControlInfo *phyControlInfo = dynamic_cast<PhyControlInfo *>(frameToSend->getControlInfo() );
  1038. if(phyControlInfo)
  1039. phyControlInfo->setAdativeSensitivity(true);
  1040. sendDown(setBasicBitrate(buildRTSFrame(frameToSend)));
  1041. }
  1042. void Ieee80211aMac::sendCTSFrameOnEndSIFS()
  1043. {
  1044. Ieee80211Frame *rtsFrame = (Ieee80211Frame *)endSIFS->getContextPointer();
  1045. endSIFS->setContextPointer(NULL);
  1046. sendCTSFrame(check_and_cast<Ieee80211RTSFrame*>(rtsFrame));
  1047. delete rtsFrame;
  1048. }
  1049. void Ieee80211aMac::sendCTSFrame(Ieee80211RTSFrame *rtsFrame)
  1050. {
  1051. EV << "sending CTS frame\n";
  1052. PhyControlInfo *phyControlInfo = dynamic_cast<PhyControlInfo *>(rtsFrame->getControlInfo() );
  1053. if(phyControlInfo)
  1054. phyControlInfo->setAdativeSensitivity(true);
  1055. sendDown(setBasicBitrate(buildCTSFrame(rtsFrame)));
  1056. }
  1057. void Ieee80211aMac::sendMulticastFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1058. {
  1059. EV << "sending Multicast frame\n";
  1060. PhyControlInfo *phyControlInfo = dynamic_cast<PhyControlInfo *>(frameToSend->getControlInfo() );
  1061. if(phyControlInfo)
  1062. phyControlInfo->setAdativeSensitivity(true);
  1063. sendDown(buildMulticastFrame(frameToSend));
  1064. }//ahmed
  1065. /****************************************************************
  1066. * Frame builder functions.
  1067. */
  1068. Ieee80211DataOrMgmtFrame *Ieee80211aMac::buildDataFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1069. {
  1070. Ieee80211DataOrMgmtFrame *frame = (Ieee80211DataOrMgmtFrame *)frameToSend->dup();
  1071. if (isBroadcast(frameToSend))
  1072. frame->setDuration(0);
  1073. else if (!frameToSend->getMoreFragments())
  1074. frame->setDuration(getSIFS() + computeFrameDuration(LENGTH_ACK, basicBitrate));
  1075. else
  1076. // FIXME: shouldn't we use the next frame to be sent?
  1077. frame->setDuration(3 * getSIFS() + 2 * computeFrameDuration(LENGTH_ACK, basicBitrate) + computeFrameDuration(frameToSend));
  1078. return frame;
  1079. }
  1080. Ieee80211ACKFrame *Ieee80211aMac::buildACKFrame(Ieee80211DataOrMgmtFrame *frameToACK)
  1081. {
  1082. Ieee80211ACKFrame *frame = new Ieee80211ACKFrame("wlan-ack");
  1083. frame->setReceiverAddress(frameToACK->getTransmitterAddress());
  1084. if (!frameToACK->getMoreFragments())
  1085. frame->setDuration(0);
  1086. else
  1087. frame->setDuration(frameToACK->getDuration() - getSIFS() - computeFrameDuration(LENGTH_ACK, basicBitrate));
  1088. return frame;
  1089. }
  1090. Ieee80211RTSFrame *Ieee80211aMac::buildRTSFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1091. {
  1092. Ieee80211RTSFrame *frame = new Ieee80211RTSFrame("wlan-rts");
  1093. frame->setTransmitterAddress(address);
  1094. frame->setReceiverAddress(frameToSend->getReceiverAddress());
  1095. frame->setDuration(3 * getSIFS() + computeFrameDuration(LENGTH_CTS, basicBitrate) +
  1096. computeFrameDuration(frameToSend) +
  1097. computeFrameDuration(LENGTH_ACK, basicBitrate));
  1098. return frame;
  1099. }
  1100. Ieee80211CTSFrame *Ieee80211aMac::buildCTSFrame(Ieee80211RTSFrame *rtsFrame)
  1101. {
  1102. Ieee80211CTSFrame *frame = new Ieee80211CTSFrame("wlan-cts");
  1103. frame->setReceiverAddress(rtsFrame->getTransmitterAddress());
  1104. frame->setDuration(rtsFrame->getDuration() - getSIFS() - computeFrameDuration(LENGTH_CTS, basicBitrate));
  1105. return frame;
  1106. }
  1107. Ieee80211DataOrMgmtFrame *Ieee80211aMac::buildBroadcastFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1108. {
  1109. Ieee80211DataOrMgmtFrame *frame = (Ieee80211DataOrMgmtFrame *)frameToSend->dup();
  1110. frame->setDuration(0);
  1111. PhyControlInfo *phyControlInfo_old = dynamic_cast<PhyControlInfo *>( frameToSend->getControlInfo() );
  1112. if(phyControlInfo_old){
  1113. ev<<"Per frame1 params"<<endl;
  1114. PhyControlInfo *phyControlInfo_new=new PhyControlInfo;
  1115. *phyControlInfo_new=*phyControlInfo_old;
  1116. //EV<<"PhyControlInfo bitrate "<<phyControlInfo->getBitrate()/1e6<<"Mbps txpower "<<phyControlInfo->txpower()<<"mW"<<endl;
  1117. frame->setControlInfo( phyControlInfo_new );
  1118. }
  1119. return frame;
  1120. }
  1121. Ieee80211DataOrMgmtFrame *Ieee80211aMac::buildMulticastFrame(Ieee80211DataOrMgmtFrame *frameToSend)
  1122. {
  1123. Ieee80211DataOrMgmtFrame *frame = (Ieee80211DataOrMgmtFrame *)frameToSend->dup();
  1124. frame->setDuration(getSIFS() + computeFrameDuration(LENGTH_ACK, basicBitrate));
  1125. return frame;
  1126. }//ahmed
  1127. Ieee80211Frame *Ieee80211aMac::setBasicBitrate(Ieee80211Frame *frame)
  1128. {
  1129. ASSERT(frame->getControlInfo()==NULL);
  1130. PhyControlInfo *ctrl = new PhyControlInfo();
  1131. ctrl->setBitrate(basicBitrate);
  1132. frame->setControlInfo(ctrl);
  1133. return frame;
  1134. }
  1135. /****************************************************************
  1136. * Helper functions.
  1137. */
  1138. void Ieee80211aMac::finishCurrentTransmission()
  1139. {
  1140. popTransmissionQueue();
  1141. resetStateVariables();
  1142. }
  1143. void Ieee80211aMac::giveUpCurrentTransmission()
  1144. {
  1145. Ieee80211DataOrMgmtFrame *temp = (Ieee80211DataOrMgmtFrame*) transmissionQueue.front();
  1146. nb->fireChangeNotification(NF_LINK_BREAK, temp);
  1147. popTransmissionQueue();
  1148. resetStateVariables();
  1149. numGivenUp++;
  1150. }
  1151. void Ieee80211aMac::retryCurrentTransmission()
  1152. {
  1153. ASSERT(retryCounter < retryLimit-1);
  1154. getCurrentTransmission()->setRetry(true);
  1155. if (rateControlMode == RATE_AARF || rateControlMode == RATE_ARF) reportDataFailed();
  1156. else retryCounter ++;
  1157. numRetry++;
  1158. backoff = true;
  1159. generateBackoffPeriod();
  1160. }
  1161. Ieee80211DataOrMgmtFrame *Ieee80211aMac::getCurrentTransmission()
  1162. {
  1163. if (transmissionQueue.empty())
  1164. return NULL;
  1165. return (Ieee80211DataOrMgmtFrame *)transmissionQueue.front();
  1166. }
  1167. void Ieee80211aMac::sendDownPendingRadioConfigMsg()
  1168. {
  1169. if (pendingRadioConfigMsg != NULL)
  1170. {
  1171. sendDown(pendingRadioConfigMsg);
  1172. pendingRadioConfigMsg = NULL;
  1173. }
  1174. }
  1175. void Ieee80211aMac::setMode(Mode mode)
  1176. {
  1177. if (mode == PCF)
  1178. error("PCF mode not yet supported");
  1179. this->mode = mode;
  1180. }
  1181. void Ieee80211aMac::resetStateVariables()
  1182. {
  1183. backoffPeriod = 0;
  1184. if (rateControlMode == RATE_AARF || rateControlMode == RATE_ARF) reportDataOk ();
  1185. else retryCounter = 0;
  1186. if (!transmissionQueue.empty()) {
  1187. backoff = true;
  1188. getCurrentTransmission()->setRetry(false);
  1189. }
  1190. else {
  1191. backoff = false;
  1192. noFrame=false;//sorin
  1193. }
  1194. }
  1195. bool Ieee80211aMac::isMediumStateChange(cMessage *msg)
  1196. {
  1197. return msg == mediumStateChange || (msg == endReserve && radioState == RadioState::IDLE);
  1198. }
  1199. bool Ieee80211aMac::isMediumFree()
  1200. {
  1201. return radioState == RadioState::IDLE && !endReserve->isScheduled();
  1202. }
  1203. bool Ieee80211aMac::isBroadcast(Ieee80211Frame *frame)
  1204. {
  1205. return frame && frame->getReceiverAddress().isBroadcast();
  1206. }
  1207. bool Ieee80211aMac::isMulticast(Ieee80211Frame *frame) //ahmed
  1208. {
  1209. return frame && frame->getReceiverAddress().isMulticast();
  1210. }//ahmed
  1211. bool Ieee80211aMac::isForUs(Ieee80211Frame *frame)
  1212. {
  1213. //int msgKind = frame->getKind();
  1214. //bool lastReceiveFailed =(msgKind == COLLISION || msgKind == BITERROR);
  1215. //if (frame && frame->getReceiverAddress() != address && !lastReceiveFailed)
  1216. // nb->fireChangeNotification(NF_LINK_PROMISCUOUS, frame);
  1217. return frame && frame->getReceiverAddress() == address;
  1218. }
  1219. bool Ieee80211aMac::isSentByUs(Ieee80211Frame *frame)
  1220. {
  1221. if(dynamic_cast<Ieee80211DataOrMgmtFrame *>(frame)){
  1222. //EV<<"ad3 "<<((Ieee80211DataOrMgmtFrame *)frame)->getAddress3();
  1223. //EV<<"myad "<<address<<endl;
  1224. if ( ((Ieee80211DataOrMgmtFrame *)frame)->getAddress3() == address)//received frame sent by us
  1225. return 1;
  1226. }
  1227. else
  1228. EV<<"Cast failed"<<endl;
  1229. return 0;
  1230. }
  1231. bool Ieee80211aMac::isDataOrMgmtFrame(Ieee80211Frame *frame)
  1232. {
  1233. return dynamic_cast<Ieee80211DataOrMgmtFrame*>(frame);
  1234. }
  1235. Ieee80211Frame *Ieee80211aMac::getFrameReceivedBeforeSIFS()
  1236. {
  1237. return (Ieee80211Frame *)endSIFS->getContextPointer();
  1238. }
  1239. void Ieee80211aMac::popTransmissionQueue()
  1240. {
  1241. // Sorin changes
  1242. if(!transmissionQueue.empty())
  1243. {
  1244. EV << "dropping frame from transmission queue\n";
  1245. Ieee80211Frame *temp = transmissionQueue.front();
  1246. transmissionQueue.pop_front();
  1247. delete temp;
  1248. }
  1249. if (queueModule)
  1250. {
  1251. // tell queue module that we've become idle
  1252. EV << "requesting another frame from queue module\n";
  1253. queueModule->requestPacket();
  1254. if(transmissionQueue.empty())
  1255. {
  1256. EV<<"\t but queue is empty\n";
  1257. noFrame=true;
  1258. }
  1259. }
  1260. }
  1261. double Ieee80211aMac::computeFrameDuration(Ieee80211Frame *msg)
  1262. {
  1263. return computeFrameDuration(msg->getBitLength(), bitrate);
  1264. }
  1265. double Ieee80211aMac::computeFrameDuration(int bits, double bitrate)
  1266. {
  1267. double duration;
  1268. if (opMode=='a')
  1269. duration= (16+bits*8+6)/bitrate+PLCP_PREAMBLE_DELAY+PLCP_SIGNAL_DELAY+T_SYM/2;
  1270. else if (opMode=='g')
  1271. duration=4*ceil((16+bits+6)/(bitrate/1e6*4))*1e-6 + PHY_HEADER_LENGTH_G;
  1272. else
  1273. duration=bits / bitrate + PHY_HEADER_LENGTH_B / BITRATE_HEADER;
  1274. if (bitrate>11e6)
  1275. EV << "cuidado "<<endl;
  1276. EV<<"MAC:frameDuration="<<duration*1e6<<"us("<<bits<<"bits "<< bitrate << "bitrate)"<<endl;
  1277. return duration;
  1278. }
  1279. void Ieee80211aMac::reportDataOk ()
  1280. {
  1281. retryCounter = 0;
  1282. successCounter ++;
  1283. failedCounter = 0;
  1284. recovery = false;
  1285. PHYRateVector.record(getBitrate()/1000000);
  1286. if ((successCounter == getSuccessThreshold() || timer == getTimerTimeout ())
  1287. && (rateIndex < (getMaxBitrate ())))
  1288. {
  1289. // rateIndex++;
  1290. // if (opMode=='b') setBitrate(BITRATES_80211b[rateIndex]);
  1291. // else setBitrate(BITRATES_80211a[rateIndex]);
  1292. timer = 0;
  1293. successCounter = 0;
  1294. recovery = true;
  1295. }
  1296. }
  1297. void Ieee80211aMac::reportDataFailed (void)
  1298. {
  1299. timer++;
  1300. failedCounter++;
  1301. retryCounter++;
  1302. successCounter = 0;
  1303. PHYRateVector.record(getBitrate()/1000000);
  1304. if (recovery)
  1305. {
  1306. if (retryCounter == 1) {
  1307. reportRecoveryFailure ();
  1308. if (rateIndex != getMinBitrate ()) {
  1309. rateIndex--;
  1310. if (opMode=='b') setBitrate(BITRATES_80211b[rateIndex]);
  1311. else setBitrate(BITRATES_80211a[rateIndex]);
  1312. }
  1313. }
  1314. timer = 0;
  1315. } else
  1316. {
  1317. if (needNormalFallback ()) {
  1318. reportFailure ();
  1319. if (rateIndex != getMinBitrate ()) {
  1320. rateIndex--;
  1321. if (opMode=='b') setBitrate(BITRATES_80211b[rateIndex]);
  1322. else setBitrate(BITRATES_80211a[rateIndex]);
  1323. }
  1324. }
  1325. if (retryCounter >= 2) {
  1326. timer = 0;
  1327. }
  1328. }
  1329. }
  1330. int Ieee80211aMac::getMinTimerTimeout (void)
  1331. {
  1332. return minTimerTimeout;
  1333. }
  1334. int Ieee80211aMac::getMinSuccessThreshold (void)
  1335. {
  1336. return minSuccessThreshold;
  1337. }
  1338. int Ieee80211aMac::getTimerTimeout (void)
  1339. {
  1340. return timerTimeout;
  1341. }
  1342. int Ieee80211aMac::getSuccessThreshold (void)
  1343. {
  1344. return successThreshold;
  1345. }
  1346. void Ieee80211aMac::setTimerTimeout (int timer_timeout)
  1347. {
  1348. if (timer_timeout >= minTimerTimeout)
  1349. timerTimeout = timer_timeout;
  1350. else error("timer_timeout is less than minTimerTimeout");
  1351. }
  1352. void Ieee80211aMac::setSuccessThreshold (int success_threshold)
  1353. {
  1354. if (success_threshold >= minSuccessThreshold)
  1355. successThreshold = success_threshold;
  1356. else error("success_threshold is less than minSuccessThreshold");
  1357. }
  1358. void Ieee80211aMac::reportRecoveryFailure (void)
  1359. {
  1360. if (rateControlMode == RATE_AARF)
  1361. {
  1362. setSuccessThreshold ((int)(std::min ((double)getSuccessThreshold () * successCoeff,(double) maxSuccessThreshold)));
  1363. setTimerTimeout ((int)(std::max ((double)getMinTimerTimeout (),(double)(getSuccessThreshold () * timerCoeff))));
  1364. }
  1365. }
  1366. void Ieee80211aMac::reportFailure (void)
  1367. {
  1368. if (rateControlMode == RATE_AARF)
  1369. {
  1370. setTimerTimeout (getMinTimerTimeout ());
  1371. setSuccessThreshold (getMinSuccessThreshold ());
  1372. }
  1373. }
  1374. bool Ieee80211aMac::needRecoveryFallback (void)
  1375. {
  1376. if (retryCounter == 1) {
  1377. return true;
  1378. } else {
  1379. return false;
  1380. }
  1381. }
  1382. bool Ieee80211aMac::needNormalFallback (void)
  1383. {
  1384. int retryMod = (retryCounter - 1) % 2;
  1385. if (retryMod == 1) {
  1386. return true;
  1387. } else {
  1388. return false;
  1389. }
  1390. }
  1391. double Ieee80211aMac::getBitrate()
  1392. {
  1393. return bitrate;
  1394. }
  1395. void Ieee80211aMac::setBitrate(double rate)
  1396. {
  1397. bitrate = rate;
  1398. }
  1399. int Ieee80211aMac::getMaxBitrate(void)
  1400. {
  1401. if (opMode=='b')
  1402. return 3;
  1403. else return 7;
  1404. }
  1405. int Ieee80211aMac::getMinBitrate(void)
  1406. {
  1407. return 0;
  1408. }
  1409. void Ieee80211aMac::logState()
  1410. {
  1411. // stateVector.record(fsm.getState());
  1412. EV << "state information: mode = " << modeName(mode) << ", state = " << fsm.getStateName()
  1413. << ", backoff = " << backoff << ", backoffPeriod = " << backoffPeriod
  1414. << ", retryCounter = " << retryCounter << ", radioState = " << radioState
  1415. << ", nav = " << nav << endl;
  1416. }
  1417. const char *Ieee80211aMac::modeName(int mode)
  1418. {
  1419. #define CASE(x) case x: s=#x; break
  1420. const char *s = "???";
  1421. switch (mode)
  1422. {
  1423. CASE(DCF);
  1424. CASE(PCF);
  1425. }
  1426. return s;
  1427. #undef CASE
  1428. }
  1429. void Ieee80211aMac::finish()
  1430. {
  1431. // thStats.record();
  1432. // cwStats.record();
  1433. // recordScalar("Received Throughput", ((double)numReceivedBroadcast)*800.0/simTime()/1.0e6);
  1434. // recordScalar("Sent Throughput", ((double)numSentBroadcast*800.0)/simTime()/1.0e6);
  1435. recordScalar("numSent", numSent);
  1436. recordScalar("numSentWithoutRetry",numSentWithoutRetry);
  1437. recordScalar("numReceived", numReceived);
  1438. recordScalar("numSentBroadcast", numSentBroadcast);
  1439. recordScalar("numReceivedBroadcast", numReceivedBroadcast);
  1440. recordScalar("numReceivedOther", numReceivedOther);
  1441. recordScalar("numCollision", numCollision);
  1442. recordScalar("numGivenUp",numGivenUp);
  1443. recordScalar("numAckSend", numAckSend);
  1444. recordScalar("numRetry",numRetry);
  1445. }