mac-802_11mr.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:68k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*-
  2.  *
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  *
  35.  * Ported from CMU/Monarch's code, nov'98 -Padma.
  36.  * Contributions by:
  37.  *   - Mike Holland
  38.  *   - Sushmita
  39.  *
  40.  * Ported 2006 from ns-2.29 
  41.  * by Federico Maguolo, Nicola Baldo and Simone Merlin 
  42.  * (SIGNET lab, University of Padova, Department of Information Engineering)
  43.  *
  44.  */
  45. #include <delay.h>
  46. #include <connector.h>
  47. #include <packet.h>
  48. #include <random.h>
  49. #include <mobilenode.h>
  50. // // #define DEBUG 99
  51. #include <arp.h>
  52. #include <ll.h>
  53. #include <mac.h>
  54. #include <cmu-trace.h>
  55. // Added by Sushmita to support event tracing
  56. #include <agent.h>
  57. #include <basetrace.h>
  58.  
  59. #include "mac-802_11mr.h"
  60. #include "mac-timersmr.h"
  61. PhyMode str2PhyMode(const char* str)
  62. {
  63. if (strcmp(str, "Mode1Mb") == 0) {
  64.   return Mode1Mb;
  65. } else if (strcmp(str, "Mode2Mb") == 0) {
  66.   return Mode2Mb;
  67. } else if (strcmp(str, "Mode5_5Mb") == 0) {
  68.   return Mode5_5Mb;
  69. } else if (strcmp(str, "Mode11Mb") == 0) {
  70.   return Mode11Mb;
  71. } else if (strcmp(str, "Mode6Mb") == 0) {
  72.   return Mode6Mb;
  73. } else if (strcmp(str, "Mode9Mb") == 0) {
  74.   return Mode9Mb;
  75. } else if (strcmp(str, "Mode12Mb") == 0) {
  76.   return Mode12Mb;
  77. } else if (strcmp(str, "Mode18Mb") == 0) {
  78.   return Mode18Mb;
  79. } else if (strcmp(str, "Mode24Mb") == 0) {
  80.   return Mode24Mb;
  81. } else if (strcmp(str, "Mode36Mb") == 0) {
  82.   return Mode36Mb;
  83. } else if (strcmp(str, "Mode48Mb") == 0) {
  84.   return Mode48Mb;
  85. } else if (strcmp(str, "Mode54Mb") == 0) {
  86.   return Mode54Mb;
  87. } else  return ModeUnknown;
  88. }
  89. static char* PhyModeStr[NumPhyModes]={"Mode1Mb",
  90.       "Mode2Mb",
  91.       "Mode5_5Mb",
  92.       "Mode11Mb",
  93.       "Mode6Mb",
  94.       "Mode9Mb",
  95.       "Mode12Mb",
  96.       "Mode18Mb",
  97.       "Mode24Mb",
  98.       "Mode36Mb",
  99.       "Mode48Mb",
  100.       "Mode54Mb"};
  101. const char* PhyMode2str(PhyMode pm)
  102. {
  103. if (pm == ModeUnknown)
  104. return "ModeUnknown";
  105. else
  106. return PhyModeStr[pm];
  107. }
  108. /* ======================================================================
  109.    Mac  and Phy MIB Class Functions
  110.    ====================================================================== */
  111. MR_PHY_MIB::MR_PHY_MIB(Mac802_11mr *parent) 
  112. : snr_AP(1000),
  113.   AckMode_AP(Mode1Mb)
  114. {
  115. /*
  116.  * Bind the phy mib objects.  Note that these will be bound
  117.  * to Mac/802_11 variables
  118.  */
  119. parent->bind("CWMin_", &CWMin);
  120. parent->bind("CWMax_", &CWMax);
  121. parent->bind("SlotTime_", &SlotTime);
  122. parent->bind("SIFS_", &SIFSTime);
  123. parent->bind_bool("useShortPreamble_",&useShortPreamble);
  124. parent->bind("bSyncInterval_",&bSyncInterval);
  125. parent->bind("gSyncInterval_",&gSyncInterval);
  126. }
  127. void MR_PHY_MIB::setAPSnr(double snr)
  128. {
  129. snr_AP =  snr;
  130. }
  131. double MR_PHY_MIB::getAPSnr()
  132. {
  133. return snr_AP;
  134. }
  135. MR_MAC_MIB::MR_MAC_MIB() :
  136. MPDUTxSuccessful(0),MPDUTxOneRetry(0),MPDUTxMultipleRetries(0),
  137. MPDUTxFailed(0), RTSFailed(0), ACKFailed(0), 
  138. MPDURxSuccessful(0), FrameReceives(0),  DataFrameReceives(0), CtrlFrameReceives(0), MgmtFrameReceives(0),
  139. FrameErrors(0), DataFrameErrors(0), CtrlFrameErrors(0), MgmtFrameErrors(0),
  140. FrameErrorsNoise(0), DataFrameErrorsNoise(0), CtrlFrameErrorsNoise(0), MgmtFrameErrorsNoise(0),
  141. FrameDropSyn(0), DataFrameDropSyn(0), CtrlFrameDropSyn(0), MgmtFrameDropSyn(0),
  142. FrameDropTxa(0), DataFrameDropTxa(0), CtrlFrameDropTxa(0), MgmtFrameDropTxa(0),
  143. idleSlots(0), idle2Slots(0),
  144. VerboseCounters_(0)
  145. {
  146. }
  147. /* !!!WARNING!!!  remember that MR_MAC_MIB has TWO constructors when changing base initializers */
  148. MR_MAC_MIB::MR_MAC_MIB(Mac802_11mr *parent) :
  149. MPDUTxSuccessful(0),MPDUTxOneRetry(0),MPDUTxMultipleRetries(0),
  150. MPDUTxFailed(0), RTSFailed(0), ACKFailed(0), 
  151. MPDURxSuccessful(0), FrameReceives(0),  DataFrameReceives(0), CtrlFrameReceives(0), MgmtFrameReceives(0),
  152. FrameErrors(0), DataFrameErrors(0), CtrlFrameErrors(0), MgmtFrameErrors(0),
  153. FrameErrorsNoise(0), DataFrameErrorsNoise(0), CtrlFrameErrorsNoise(0), MgmtFrameErrorsNoise(0),
  154. FrameDropSyn(0), DataFrameDropSyn(0), CtrlFrameDropSyn(0), MgmtFrameDropSyn(0),
  155. FrameDropTxa(0), DataFrameDropTxa(0), CtrlFrameDropTxa(0), MgmtFrameDropTxa(0),
  156. idleSlots(0), idle2Slots(0),
  157. VerboseCounters_(0)
  158. {
  159. /*
  160.  * Bind the phy mib objects.  Note that these will be bound
  161.  * to Mac/802_11 variables
  162.  */
  163. parent->bind("RTSThreshold_", &RTSThreshold);
  164. parent->bind("ShortRetryLimit_", &ShortRetryLimit);
  165. parent->bind("LongRetryLimit_", &LongRetryLimit);
  166. parent->bind("VerboseCounters_", &VerboseCounters_);
  167. }
  168. void MR_MAC_MIB::printCounters(int index)
  169. {
  170. fflush(stdout);
  171. char str[300];
  172. counters2string(str,300);
  173. fprintf(stdout,
  174. "nMAC counters node %d at %2.9f t%s",
  175. index, Scheduler::instance().clock(),str);
  176. fflush(stdout);
  177. }
  178. char* MR_MAC_MIB::counters2string(char* str, int size) 
  179. {
  180. // Output conforming to plotlog.m 
  181. //  snprintf(str,size,"t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d t%d",
  182. //  MPDUTxSuccessful,MPDUTxOneRetry,MPDUTxMultipleRetries,MPDUTxFailed,
  183. //  MPDURxSuccessful, 0, 0, RTSFailed, ACKFailed, 
  184. //  FrameReceives, FrameErrors, 0, 0, idleSlots, 0, 0, 0, idle2Slots);
  185. char* formatstr;
  186. if (VerboseCounters_)
  187. formatstr=" TxSucc %5d %5d %5d  TxFail %5d %5d %5d  RXSucc %5d %5d %5d %5d %5d  RXFail %5d %5d %5d %5d  RXFailNoise %5d %5d %5d %5d  SYN %5d %5d %5d %5d  TXA %5d %5d %5d %5d  IdleSlost %8d %8d";
  188. else
  189. formatstr="%5d %5d %5d   %5d %5d %5d   %5d %5d %5d %5d %5d   %5d %5d %5d %5d   %5d %5d %5d %5d   %5d %5d %5d %5d   %5d %5d %5d %5d   %8d %8d";
  190.        
  191. snprintf(str,size,formatstr,
  192.  /* TX Succ */    MPDUTxSuccessful,MPDUTxOneRetry,MPDUTxMultipleRetries,  
  193.  /* TX Fail */    MPDUTxFailed, RTSFailed, ACKFailed, 
  194.  /* RX Succ */     MPDURxSuccessful, FrameReceives, DataFrameReceives, CtrlFrameReceives, MgmtFrameReceives,
  195. /* RX Fail Tot */  FrameErrors, DataFrameErrors, CtrlFrameErrors, MgmtFrameErrors,
  196. /* RX Fail Noise*/ FrameErrorsNoise, DataFrameErrorsNoise, CtrlFrameErrorsNoise, MgmtFrameErrorsNoise,
  197. /* NRX SYN */    FrameDropSyn, DataFrameDropSyn, CtrlFrameDropSyn, MgmtFrameDropSyn,  
  198. /* NRX TXA */    FrameDropTxa, DataFrameDropTxa, CtrlFrameDropTxa, MgmtFrameDropTxa,  
  199. /* old, wrong  */  idleSlots, 
  200. /* new, correct */ idle2Slots);
  201. str[size-1]='';
  202. return str;
  203. }
  204. double MR_MAC_MIB::getPerr()
  205. {
  206. if (DataFrameErrors == 0)
  207. return 0;
  208. else
  209. return ((double)DataFrameErrorsNoise/(double)DataFrameErrors);
  210. }
  211. double MR_MAC_MIB::getPcoll()
  212. {
  213. if (DataFrameErrors == 0)
  214. return 0;
  215. else
  216. return ((double)(DataFrameErrors - DataFrameErrorsNoise)
  217. / (double) DataFrameErrors);
  218. }
  219. void
  220. Mac802_11mr::checkBackoffTimer()
  221. {
  222. if(is_idle() && mhBackoff_.paused())
  223. mhBackoff_.resume(phymib_.getDIFS());
  224. if(! is_idle() && mhBackoff_.busy() && ! mhBackoff_.paused())
  225. mhBackoff_.pause();
  226. }
  227. void
  228. Mac802_11mr::transmit(Packet *p, double timeout)
  229. {
  230. tx_active_ = 1;
  231. if (EOTtarget_) {
  232. assert (eotPacket_ == NULL);
  233. eotPacket_ = p->copy();
  234. }
  235. /*
  236.  * If I'm transmitting without doing CS, such as when
  237.  * sending an ACK, any incoming packet will be "missed"
  238.  * and hence, must be discarded.
  239.  */
  240. if(rx_state_ != MAC_IDLE) {
  241. //assert(dh->dh_fc.fc_type == MAC_Type_Control);
  242. //assert(dh->dh_fc.fc_subtype == MAC_Subtype_ACK);
  243. assert(pktRx_);
  244. struct hdr_cmn *ch = HDR_CMN(pktRx_);
  245. ch->error() = 1;        /* force packet discard */
  246. }
  247. // This is the minimum time we must wait before attempting another TX
  248. updateIdleTime(txtime(p) + phymib_.getDIFS() + phymib_.getSlotTime());
  249. /*
  250.  * If this is not a broadcast packet, we expect an ACK,
  251.  * so we cannot TX before an EIFS. We do a weak update since 
  252.  * we don't know the actual rate that the receiver will use 
  253.  * for the ACK, but eventually we want to be able to reduce 
  254.  * this waiting time if we actually receive a shorter ACK.
  255.  * See 802.11-1999, sec. 9.2.3.4
  256.  */
  257. hdr_mac802_11 *mh = HDR_MAC802_11(p);
  258. u_int32_t dst = ETHER_ADDR(mh->dh_ra);
  259. if(dst != (u_int32_t)MAC_BROADCAST) {
  260. updateIdleTime(txtime(p) + phymib_.getEIFS() + phymib_.getSlotTime(), UIT_WEAK);
  261. }
  262. /*
  263.  * pass the packet on the "interface" which will in turn
  264.  * place the packet on the channel.
  265.  *
  266.  * NOTE: a handler is passed along so that the Network
  267.  *       Interface can distinguish between incoming and
  268.  *       outgoing packets.
  269.  */
  270. downtarget_->recv(p->copy(), this);
  271. mhSend_.start(timeout); 
  272. mhIF_.start(txtime(p));
  273. }
  274. void
  275. Mac802_11mr::setRxState(DEI_MacState newState)
  276. {
  277. if (!is_idle() && newState==MAC_IDLE){
  278. macmib_.startIdleTime=Scheduler::instance().clock();
  279. // printf("start idle %f n", startIdleTime);
  280. }
  281. if (is_idle() && newState!=MAC_IDLE){
  282. //macmib_.idleSlots+=int ((Scheduler::instance().clock()-macmib_.startIdleTime)/phymib_.getSlotTime());
  283. incidleSlots(int ((Scheduler::instance().clock()-macmib_.startIdleTime)/phymib_.getSlotTime())); 
  284. // printf("end idle %f n", Scheduler::instance().clock()-startIdleTime);
  285. }
  286. rx_state_ = newState;
  287. if(debug_) printf("%f - %i --- setRxState - change RX state to %i (MAC_IDLE=%i MAC_RECV=%i MAC_COLL=%i)n",Scheduler::instance().clock(), index_, newState,MAC_IDLE,MAC_RECV,MAC_COLL);
  288. checkBackoffTimer();
  289. }
  290. void
  291. Mac802_11mr::setTxState(DEI_MacState newState)
  292. {
  293. if (!is_idle() && newState==MAC_IDLE){
  294. macmib_.startIdleTime=Scheduler::instance().clock();
  295. // printf("start idle %f n", startIdleTime);
  296. }
  297. if (is_idle() && newState!=MAC_IDLE){
  298. //macmib_.idleSlots+=int ((Scheduler::instance().clock()-macmib_.startIdleTime)/phymib_.getSlotTime());
  299. incidleSlots( int ((Scheduler::instance().clock()-macmib_.startIdleTime)/phymib_.getSlotTime()));
  300. //printf("end idle %f n", Scheduler::instance().clock()-startIdleTime);
  301. //printf("slot time %fn", phymib_.getSlotTime());
  302. //fprintf(stdout, "slots %d",idleSlots );
  303. }
  304. tx_state_ = newState;
  305. if(debug_) printf("%f - %i --- setTxState - change TX state to %i (MAC_IDLE=%i MAC_SEND=%i)n",Scheduler::instance().clock(), index_, newState,MAC_IDLE,MAC_SEND);
  306. checkBackoffTimer();
  307. }
  308. /* ======================================================================
  309.    TCL Hooks for the simulator
  310.    ====================================================================== */
  311. static class Mac802_11mrClass : public TclClass {
  312. public:
  313. Mac802_11mrClass() : TclClass("Mac/802_11/Multirate") {}
  314. TclObject* create(int, const char*const*) {
  315. return (new Mac802_11mr());
  316. }
  317. } class_mac802_11mr;
  318. // void Mac802_11mr::bindPhyMode(const char* var, PhyMode* val)
  319. // {
  320. //  create_instvar(var);
  321. //  init(new InstVarPhyMode(var, val), var);
  322. // }
  323. Mac802_11mr::Mac802_11mr() : 
  324. Mac(), phymib_(this), macmib_(this), mhIF_(this), mhNav_(this), 
  325. mhRecv_(this), mhSend_(this), 
  326. mhDefer_(this), mhBackoff_(this),
  327. profile_(0), per_(0), mehlist_(0), peerstatsdb_(0)
  328. {
  329. nav_ = 0.0;
  330. tx_state_ = rx_state_ = MAC_IDLE;
  331. macmib_.startIdleTime=Scheduler::instance().clock();
  332. tx_active_ = 0;
  333. eotPacket_ = NULL;
  334. pktRTS_ = 0;
  335. pktCTRL_ = 0;
  336. cw_ = phymib_.getCWMin();
  337. ssrc_ = slrc_ = 0;
  338. // Added by Sushmita
  339.         et_ = new EventTrace();
  340. sta_seqno_ = 1;
  341. cache_ = 0;
  342. cache_node_count_ = 0;
  343. // chk if basic/data rates are set
  344. // otherwise use bandwidth_ as default;
  345. /* bindPhyMode("basicMode_", &basicMode_);
  346. bindPhyMode("dataMode_", &dataMode_);*/
  347. //  Tcl& tcl = Tcl::instance();
  348. //  tcl.evalf("Mac/802_11/Multirate set basicRate_");
  349. //  if (strcmp(tcl.result(), "0") != 0) 
  350. //  bind_bw("basicRate_", &basicRate_);
  351. //  else
  352. //  basicRate_ = bandwidth_;
  353. // 
  354. //  tcl.evalf("Mac/802_11/Multirate set dataRate_");
  355. //  if (strcmp(tcl.result(), "0") != 0) 
  356. //  bind_bw("dataRate_", &dataRate_);
  357. //  else
  358. //  dataRate_ = bandwidth_;
  359.         EOTtarget_ = 0;
  360.         bss_id_ = IBSS_ID;
  361. //printf("bssid in constructor %dn",bss_id_);
  362. }
  363. int
  364. Mac802_11mr::command(int argc, const char*const* argv)
  365. {
  366.   Tcl& tcl = Tcl::instance();
  367. if (argc == 2) {
  368. if(strcasecmp(argv[1], "printMacCounters") == 0) {
  369. printMacCounters();
  370. return (TCL_OK);
  371.                 }else 
  372. if(strcasecmp(argv[1], "getMacCounters") == 0) {
  373. char str[300];
  374. tcl.resultf("%s",macmib_.counters2string(str,300));
  375. return (TCL_OK);
  376.                 }else 
  377. if(strcasecmp(argv[1], "printOPTCounters") == 0) {
  378. // Not supported any more!!!
  379. // nse_->print();
  380. // return (TCL_OK);
  381. return (TCL_ERROR);
  382.                 }else 
  383. if(strcasecmp(argv[1], "resetIdleSlots") == 0) {
  384. macmib_.idleSlots=0;
  385. macmib_.idle2Slots=0;
  386. return (TCL_OK);
  387.                 }else 
  388. if (strcasecmp(argv[1], "getAPSnr") == 0) {
  389. tcl.resultf("%6.3f", phymib_.getAPSnr());
  390. return TCL_OK;
  391. }
  392.  
  393. }else if (argc == 3) {
  394. if (strcasecmp(argv[1], "eot-target") == 0) {
  395. EOTtarget_ = dynamic_cast<NsObject*> (TclObject::lookup(argv[2]));
  396. if (EOTtarget_ == 0)
  397. return TCL_ERROR;
  398. return TCL_OK;
  399. } else  if (strcasecmp(argv[1], "powerProfile") == 0) {
  400. profile_ = dynamic_cast<PowerProfile*> (TclObject::lookup(argv[2]));
  401. if (profile_ == 0)
  402. return TCL_ERROR;
  403. return TCL_OK;
  404. } else  if (strcasecmp(argv[1], "per") == 0) {
  405.            per_ = dynamic_cast<PER *> (TclObject::lookup(argv[2]));
  406. if (per_ == 0)
  407. return TCL_ERROR;
  408. return TCL_OK;
  409. } else  if (strcasecmp(argv[1], "PeerStatsDB") == 0) {
  410. peerstatsdb_ = dynamic_cast<PeerStatsDB *> (TclObject::lookup(argv[2]));
  411. if (peerstatsdb_ == 0)
  412. return TCL_ERROR;
  413. return TCL_OK;
  414. } else if (strcasecmp(argv[1], "bss_id") == 0) {
  415. bss_id_ = atoi(argv[2]);
  416. return TCL_OK;
  417. } else if (strcasecmp(argv[1], "log-target") == 0) { 
  418. logtarget_ = dynamic_cast<NsObject*> (TclObject::lookup(argv[2]));
  419. if(logtarget_ == 0)
  420. return TCL_ERROR;
  421. return TCL_OK;
  422. } else if(strcasecmp(argv[1], "nodes") == 0) {
  423. if(cache_) return TCL_ERROR;
  424. cache_node_count_ = atoi(argv[2]);
  425. cache_ = new Host[cache_node_count_ + 1];
  426. assert(cache_);
  427. bzero(cache_, sizeof(Host) * (cache_node_count_+1 ));
  428. return TCL_OK;
  429. } else if(strcasecmp(argv[1], "eventtrace") == 0) {
  430. // command added to support event tracing by Sushmita
  431.                         et_ = (EventTrace *)TclObject::lookup(argv[2]);
  432.                         return (TCL_OK);
  433. } else if(strcasecmp(argv[1], "dataMode_") == 0) {
  434. dataMode_ = str2PhyMode(argv[2]);
  435. if (dataMode_ == ModeUnknown)
  436. return(TCL_ERROR);
  437. return (TCL_OK);
  438.                 } else if(strcasecmp(argv[1], "basicMode_") == 0) {
  439. basicMode_ = str2PhyMode(argv[2]);
  440. if (basicMode_ == ModeUnknown)
  441. return(TCL_ERROR);
  442. return (TCL_OK);
  443.                 } else if (strcasecmp(argv[1], "eventhandler") == 0) {
  444. addMEH(TclObject::lookup(argv[2]));
  445. return TCL_OK;
  446. } else if (strcasecmp(argv[1], "getSnr") == 0) {
  447. u_int32_t addr = atoi(argv[2]);
  448. tcl.resultf("%6.3f", getSnr(addr));
  449. return TCL_OK;
  450. }
  451. }
  452. return Mac::command(argc, argv);
  453. }
  454. void Mac802_11mr::addMEH(TclObject* tclobjptr) 
  455. {
  456. Mac80211EventHandler* mehptr;
  457. mehptr = dynamic_cast<Mac80211EventHandler*> (tclobjptr);
  458. if (mehptr == 0)  {
  459. cerr << "Mac802_11mr::addMEH() ERROR: dynamic cast failed!!!" << endl;
  460. exit(1);
  461. }       
  462. addMEH(mehptr);
  463. }
  464. void Mac802_11mr::addMEH(Mac80211EventHandler* mehptr) 
  465. {
  466. if (mehlist_ == 0) {
  467. mehlist_ = mehptr;
  468. } else {
  469. Mac80211EventHandler* curr = mehlist_;
  470. while (curr->next)
  471. curr = curr->next;
  472. curr->next = mehptr;
  473. }
  474. }
  475. // Added by Sushmita to support event tracing
  476. void Mac802_11mr::trace_event(char *eventtype, Packet *p) 
  477. {
  478.         if (et_ == NULL) return;
  479.         char *wrk = et_->buffer();
  480.         char *nwrk = et_->nbuffer();
  481.         //char *src_nodeaddr =
  482. //       Address::instance().print_nodeaddr(iph->saddr());
  483.         //char *dst_nodeaddr =
  484.         //      Address::instance().print_nodeaddr(iph->daddr());
  485.         struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  486.         //struct hdr_cmn *ch = HDR_CMN(p);
  487. if(wrk != 0) {
  488. sprintf(wrk, "E -t "TIME_FORMAT" %s %2x ",
  489. et_->round(Scheduler::instance().clock()),
  490.                         eventtype,
  491.                         //ETHER_ADDR(dh->dh_sa)
  492.                         ETHER_ADDR(dh->dh_ta)
  493.                         );
  494.         }
  495.         if(nwrk != 0) {
  496.                 sprintf(nwrk, "E -t "TIME_FORMAT" %s %2x ",
  497.                         et_->round(Scheduler::instance().clock()),
  498.                         eventtype,
  499.                         //ETHER_ADDR(dh->dh_sa)
  500.                         ETHER_ADDR(dh->dh_ta)
  501.                         );
  502.         }
  503.         et_->dump();
  504. }
  505. void Mac802_11mr::printMacCounters(void) 
  506. {
  507. if (is_idle()){
  508. //macmib_.idleSlots+=int ((Scheduler::instance().clock()-macmib_.startIdleTime)/phymib_.getSlotTime());
  509. incidleSlots( int ((Scheduler::instance().clock()-macmib_.startIdleTime)/phymib_.getSlotTime()));
  510. macmib_.startIdleTime=Scheduler::instance().clock();
  511. }
  512. macmib_.printCounters(index_);
  513. printf("%d n", dataMode_);
  514. }
  515. /* ======================================================================
  516.    Debugging Routines
  517.    ====================================================================== */
  518. void
  519. Mac802_11mr::trace_pkt(Packet *p) 
  520. {
  521. struct hdr_cmn *ch = HDR_CMN(p);
  522. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  523. u_int16_t *t = (u_int16_t*) &dh->dh_fc;
  524. fprintf(stderr, "t[ %2x %2x %2x %2x ] %x %s %dn",
  525. *t, dh->dh_duration,
  526.  ETHER_ADDR(dh->dh_ra), ETHER_ADDR(dh->dh_ta),
  527. index_, packet_info.name(ch->ptype()), ch->size());
  528. }
  529. void
  530. Mac802_11mr::dump(char *fname)
  531. {
  532. fprintf(stderr,
  533. "n%s --- (INDEX: %d, time: %2.9f)n",
  534. fname, index_, Scheduler::instance().clock());
  535. fprintf(stderr,
  536. "ttx_state_: %x, rx_state_: %x, nav: %2.9f, idle: %dn",
  537. tx_state_, rx_state_, nav_, is_idle());
  538. fprintf(stderr,
  539. "tpktTx_: %lx, pktRx_: %lx, pktRTS_: %lx, pktCTRL_: %lx, callback: %lxn",
  540. (long) pktTx_, (long) pktRx_, (long) pktRTS_,
  541. (long) pktCTRL_, (long) callback_);
  542. fprintf(stderr,
  543. "tDefer: %d, Backoff: %d (%d), Recv: %d, Timer: %d Nav: %dn",
  544. mhDefer_.busy(), mhBackoff_.busy(), mhBackoff_.paused(),
  545. mhRecv_.busy(), mhSend_.busy(), mhNav_.busy());
  546. fprintf(stderr,
  547. "tBackoff Expire: %fn",
  548. mhBackoff_.expire());
  549. }
  550. /* ======================================================================
  551.    Packet Headers Routines
  552.    ====================================================================== */
  553. int
  554. Mac802_11mr::hdr_dst(char* hdr, int dst )
  555. {
  556. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  557. if(debug_ > 2) printf("%f - %i --- hdr_dst - mark the destination address to %in",Scheduler::instance().clock(), index_, dst);
  558.        if (dst > -2) {
  559.                if ((bss_id() == ((int)IBSS_ID)) || (addr() == bss_id()) || dst == MAC_BROADCAST) {
  560.                        /* if I'm AP (2nd condition above!), the dh_3a
  561.                         * is already set by the MAC whilst fwding; if
  562.                         * locally originated pkt, it might make sense
  563.                         * to set the dh_3a to myself here! don't know
  564.                         * how to distinguish between the two here - and
  565.                         * the info is not critical to the dst station
  566.                         * anyway!
  567.                         */
  568.                        STORE4BYTE(&dst, (dh->dh_ra));
  569.                } else {
  570.                        /* in BSS mode, the AP forwards everything;
  571.                         * therefore, the real dest goes in the 3rd
  572.                         * address, and the AP address goes in the
  573.                         * destination address
  574.                         */
  575.                        STORE4BYTE(&bss_id_, (dh->dh_ra));
  576.                        STORE4BYTE(&dst, (dh->dh_3a));
  577.                }
  578.        }
  579.        return (u_int32_t)ETHER_ADDR(dh->dh_ra);
  580. }
  581. int 
  582. Mac802_11mr::hdr_src(char* hdr, int src )
  583. {
  584. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  585. if(debug_ > 2) printf("%f - %i --- hdr_dst - mark the source address to %in",Scheduler::instance().clock(), index_, src);
  586.         if(src > -2)
  587.                STORE4BYTE(&src, (dh->dh_ta));
  588.         return ETHER_ADDR(dh->dh_ta);
  589. }
  590. int 
  591. Mac802_11mr::hdr_type(char* hdr, u_int16_t type)
  592. {
  593. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  594. if(type)
  595. STORE2BYTE(&type,(dh->dh_body));
  596. return GET2BYTE(dh->dh_body);
  597. }
  598. /* ======================================================================
  599.    Misc Routines
  600.    ====================================================================== */
  601. int
  602. Mac802_11mr::is_idle()
  603. {
  604. if(rx_state_ != MAC_IDLE)
  605. return 0;
  606. if(tx_state_ != MAC_IDLE)
  607. return 0;
  608. if(nav_ > Scheduler::instance().clock())
  609. return 0;
  610. return 1;
  611. }
  612. void
  613. Mac802_11mr::discard(Packet *p, const char* why)
  614. {
  615. hdr_mac802_11* mh = HDR_MAC802_11(p);
  616. hdr_cmn *ch = HDR_CMN(p);
  617. /* if the rcvd pkt contains errors, a real MAC layer couldn't
  618.    necessarily read any data from it, so we just toss it now */
  619. if(ch->error() != 0) {
  620. Packet::free(p);
  621. return;
  622. }
  623. switch(mh->dh_fc.fc_type) {
  624. case MAC_Type_Management:
  625. drop(p, why);
  626. return;
  627. case MAC_Type_Control:
  628. switch(mh->dh_fc.fc_subtype) {
  629. case MAC_Subtype_RTS:
  630.  if((u_int32_t)ETHER_ADDR(mh->dh_ta) ==  (u_int32_t)index_) {
  631. drop(p, why);
  632. return;
  633. }
  634. /* fall through - if necessary */
  635. case MAC_Subtype_CTS:
  636. case MAC_Subtype_ACK:
  637. if((u_int32_t)ETHER_ADDR(mh->dh_ra) == (u_int32_t)index_) {
  638. drop(p, why);
  639. return;
  640. }
  641. break;
  642. default:
  643. fprintf(stderr, "invalid MAC Control subtypen");
  644. exit(1);
  645. }
  646. break;
  647. case MAC_Type_Data:
  648. switch(mh->dh_fc.fc_subtype) {
  649. case MAC_Subtype_Data:
  650. if((u_int32_t)ETHER_ADDR(mh->dh_ra) == 
  651.                            (u_int32_t)index_ ||
  652.                           (u_int32_t)ETHER_ADDR(mh->dh_ta) == 
  653.                            (u_int32_t)index_ ||
  654.                           (u_int32_t)ETHER_ADDR(mh->dh_ra) == MAC_BROADCAST) {
  655.                                 drop(p,why);
  656.                                 return;
  657. }
  658. break;
  659. default:
  660. fprintf(stderr, "invalid MAC Data subtypen");
  661. exit(1);
  662. }
  663. break;
  664. default:
  665. fprintf(stderr, "invalid MAC type (%x)n", mh->dh_fc.fc_type);
  666. trace_pkt(p);
  667. exit(1);
  668. }
  669. Packet::free(p);
  670. }
  671. // void
  672. // Mac802_11mr::capture(Packet *p)
  673. // {
  674. //  /*
  675. //   * Update the NAV so that this does not screw
  676. //   * up carrier sense.
  677. //   */
  678. //  set_nav(phymib_.getEIFS() + txtime(p));
  679. //  Packet::free(p);
  680. // }
  681. // void
  682. // Mac802_11mr::collision(Packet *p)
  683. // {
  684. //  switch(rx_state_) {
  685. //  case MAC_RECV:
  686. //  setRxState(MAC_COLL);
  687. //  /* fall through */
  688. //  case MAC_COLL:
  689. //  assert(pktRx_);
  690. //  assert(mhRecv_.busy());
  691. //  /*
  692. //   *  Since a collision has occurred, figure out
  693. //   *  which packet that caused the collision will
  694. //   *  "last" the longest.  Make this packet,
  695. //   *  pktRx_ and reset the Recv Timer if necessary.
  696. //   */
  697. //  if(txtime(p) > mhRecv_.expire()) {
  698. //  mhRecv_.stop();
  699. //  discard(pktRx_, DROP_MAC_COLLISION);
  700. //  pktRx_ = p;
  701. //  mhRecv_.start(txtime(pktRx_));
  702. //  }
  703. //  else {
  704. //  discard(p, DROP_MAC_COLLISION);
  705. //  }
  706. //  break;
  707. //  default:
  708. //  assert(0);
  709. //  }
  710. // }
  711. void
  712. Mac802_11mr::tx_resume()
  713. {
  714. double rTime;
  715. assert(mhSend_.busy() == 0);
  716. assert(mhDefer_.busy() == 0);
  717. if(pktCTRL_) {
  718. /*
  719.  *  Need to send a CTS or ACK.
  720.  */
  721. mhDefer_.start(phymib_.getSIFS());
  722. } else if(pktRTS_) {
  723. if (mhBackoff_.busy() == 0) {
  724. /* Modifica Federico 9/12/2004 */
  725. /*rTime = (Random::random() % cw_) * phymib_.getSlotTime();
  726. mhDefer_.start( phymib_.getDIFS() + rTime);*/
  727.        
  728. mhBackoff_.start(cw_, is_idle(), phymib_.getDIFS());
  729. /*
  730. Fine modifica Federico 9/12/2004
  731. */
  732. }
  733. } else if(pktTx_) {
  734. if (mhBackoff_.busy() == 0) {
  735. hdr_cmn *ch = HDR_CMN(pktTx_);
  736. struct hdr_mac802_11 *mh = HDR_MAC802_11(pktTx_);
  737. if ((u_int32_t) ch->size() < macmib_.getRTSThreshold()
  738.     || (u_int32_t) ETHER_ADDR(mh->dh_ra) == MAC_BROADCAST) {
  739. /* Modifica Federico 9/12/2004 */
  740. /*rTime = (Random::random() % cw_)
  741. * phymib_.getSlotTime();
  742. mhDefer_.start(phymib_.getDIFS() + rTime);*/
  743.        
  744.        
  745. mhBackoff_.start(cw_, is_idle(), phymib_.getDIFS());
  746.        
  747.        //Fine modifica Federico 9/12/2004
  748.                         } else {
  749. mhDefer_.start(phymib_.getSIFS());
  750.                         }
  751. }
  752. } else if(callback_) {
  753. Handler *h = callback_;
  754. callback_ = 0;
  755. h->handle((Event*) 0);
  756. }
  757. setTxState(MAC_IDLE);
  758. }
  759. void
  760. Mac802_11mr::rx_resume()
  761. {
  762. assert(pktRx_ == 0);
  763. assert(mhRecv_.busy() == 0);
  764. setRxState(MAC_IDLE);
  765. }
  766. /* ======================================================================
  767.    Timer Handler Routines
  768.    ====================================================================== */
  769. void
  770. Mac802_11mr::backoffHandler()
  771. {
  772. if(pktCTRL_) {
  773. assert(mhSend_.busy() || mhDefer_.busy());
  774. return;
  775. }
  776. if(check_pktRTS() == 0)
  777. return;
  778. if(check_pktTx() == 0)
  779. return;
  780. }
  781. void
  782. Mac802_11mr::deferHandler()
  783. {
  784. assert(pktCTRL_ || pktRTS_ || pktTx_);
  785. if(check_pktCTRL() == 0)
  786. return;
  787. assert(mhBackoff_.busy() == 0);
  788. if(check_pktRTS() == 0)
  789. return;
  790. if(check_pktTx() == 0)
  791. return;
  792. }
  793. void
  794. Mac802_11mr::navHandler()
  795. {
  796. if(is_idle() && mhBackoff_.paused())
  797. mhBackoff_.resume(phymib_.getDIFS());
  798. if (!is_idle() && tx_state_==MAC_IDLE && rx_state_==MAC_IDLE )
  799. macmib_.startIdleTime=Scheduler::instance().clock();
  800. }
  801. void
  802. Mac802_11mr::recvHandler()
  803. {
  804. recv_timer();
  805. }
  806. void
  807. Mac802_11mr::sendHandler()
  808. {
  809. send_timer();
  810. }
  811. void
  812. Mac802_11mr::txHandler()
  813. {
  814. if (EOTtarget_) {
  815. assert(eotPacket_);
  816. EOTtarget_->recv(eotPacket_, (Handler *) 0);
  817. eotPacket_ = NULL;
  818. }
  819. if(debug_) printf("%f - %i --- txHandler - end transmission of packetn",Scheduler::instance().clock(), index_);
  820. tx_active_ = 0;
  821. }
  822. /* ======================================================================
  823.    The "real" Timer Handler Routines
  824.    ====================================================================== */
  825. void
  826. Mac802_11mr::send_timer()
  827. {
  828. switch(tx_state_) {
  829. /*
  830.  * Sent a RTS, but did not receive a CTS.
  831.  */
  832. case MAC_RTS:
  833. RetransmitRTS();
  834. break;
  835. /*
  836.  * Sent a CTS, but did not receive a DATA packet.
  837.  */
  838. case MAC_CTS:
  839. assert(pktCTRL_);
  840. Packet::free(pktCTRL_); 
  841. pktCTRL_ = 0;
  842. break;
  843. /*
  844.  * Sent DATA, but did not receive an ACK packet.
  845.  */
  846. case MAC_SEND:
  847. if(debug_) printf("%f - %i --- send_timer - retransmit datan",Scheduler::instance().clock(), index_);
  848. RetransmitDATA();
  849. break;
  850. /*
  851.  * Sent an ACK, and now ready to resume transmission.
  852.  */
  853. case MAC_ACK:
  854. assert(pktCTRL_);
  855. Packet::free(pktCTRL_); 
  856. pktCTRL_ = 0;
  857. break;
  858. case MAC_IDLE:
  859. break;
  860. default:
  861. assert(0);
  862. }
  863. if(debug_) printf("%f - %i --- send_timer - call tx_resumen",Scheduler::instance().clock(), index_);
  864. tx_resume();
  865. }
  866. /* ======================================================================
  867.    Outgoing Packet Routines
  868.    ====================================================================== */
  869. int
  870. Mac802_11mr::check_pktCTRL()
  871. {
  872. struct hdr_mac802_11 *mh;
  873. double timeout;
  874. if(pktCTRL_ == 0)
  875. return -1;
  876. if(tx_state_ == MAC_CTS || tx_state_ == MAC_ACK)
  877. return -1;
  878. mh = HDR_MAC802_11(pktCTRL_);
  879.   
  880. switch(mh->dh_fc.fc_subtype) {
  881. /*
  882.  *  If the medium is not IDLE, don't send the CTS.
  883.  */
  884. case MAC_Subtype_CTS:
  885. if(!is_idle()) {
  886. discard(pktCTRL_, DROP_MAC_BUSY); pktCTRL_ = 0;
  887. return 0;
  888. }
  889. setTxState(MAC_CTS);
  890. /*
  891.  * timeout:  cts + data tx time calculated by
  892.  *           adding cts tx time to the cts duration
  893.  *           minus ack tx time -- this timeout is
  894.  *           a guess since it is unspecified
  895.  *           (note: mh->dh_duration == cf->cf_duration)
  896.  */
  897.  timeout = txtime(phymib_.getCTSlen(), basicMode_)
  898.                         + DSSS_MaxPropagationDelay                      // XXX
  899.                         + sec(mh->dh_duration)
  900.                         + DSSS_MaxPropagationDelay                      // XXX
  901.                        - phymib_.getSIFS()
  902.                        - txtime(phymib_.getACKlen(), basicMode_);
  903. break;
  904. /*
  905.  * IEEE 802.11 specs, section 9.2.8
  906.  * Acknowledments are sent after an SIFS, without regard to
  907.  * the busy/idle state of the medium.
  908.  */
  909. case MAC_Subtype_ACK:
  910. if(debug_) printf("%f - %i --- check_pktCTRL - transmit ackn",Scheduler::instance().clock(), index_);
  911. setTxState(MAC_ACK);
  912. timeout = txtime(phymib_.getACKlen(), basicMode_);
  913. break;
  914. default:
  915. fprintf(stderr, "check_pktCTRL:Invalid MAC Control subtypen");
  916. exit(1);
  917. }
  918. transmit(pktCTRL_, timeout);
  919. return 0;
  920. }
  921. int
  922. Mac802_11mr::check_pktRTS()
  923. {
  924. struct hdr_mac802_11 *mh;
  925. double timeout;
  926. assert(mhBackoff_.busy() == 0);
  927. if(pktRTS_ == 0)
  928.   return -1;
  929. mh = HDR_MAC802_11(pktRTS_);
  930. /*
  931. During the backoff stage the basicMode_ could be changed by the rate adaptation algorithm
  932. */
  933. hdr_cmn* ch = HDR_CMN(pktRTS_);
  934. ch->txtime() = txtime(ch->size(), basicMode_);
  935. MultiRateHdr *mrh = HDR_MULTIRATE(pktRTS_);
  936. mrh->mode() = basicMode_;
  937. struct rts_frame *rf = (struct rts_frame*)pktRTS_->access(hdr_mac::offset_);
  938. rf->rf_duration = usec(phymib_.getSIFS()
  939.        + txtime(phymib_.getCTSlen(), basicMode_)
  940.        + phymib_.getSIFS()
  941.                                + txtime(pktTx_)
  942.        + phymib_.getSIFS()
  943.        + txtime(phymib_.getACKlen(), basicMode_));
  944.   switch(mh->dh_fc.fc_subtype) {
  945. case MAC_Subtype_RTS:
  946. if(! is_idle()) {
  947. /*
  948. This happens when we have a simultaneous packet tx and rx and the rx event is dispatched first!!!
  949. */
  950. inc_cw();
  951. mhBackoff_.start(cw_, is_idle());
  952. if (debug_) printf("MOOOOOOLTO STRANO!!! C'e' qualcosa che non quadra!!n");
  953. return 0;
  954. }
  955. setTxState(MAC_RTS);
  956. timeout = txtime(phymib_.getRTSlen(), basicMode_)
  957. + DSSS_MaxPropagationDelay                      // XXX
  958. + phymib_.getSIFS()
  959. + txtime(phymib_.getCTSlen(), basicMode_)
  960. + DSSS_MaxPropagationDelay; /* Should we add a DIFS here??? */
  961. break;
  962. default:
  963. fprintf(stderr, "check_pktRTS:Invalid MAC Control subtypen");
  964. exit(1);
  965. }
  966. Mac80211EventHandler* mehptr = mehlist_;
  967. while(mehptr) {
  968. mehptr->chBusy(ch->txtime() + rf->rf_duration * 1e-6);
  969. mehptr = mehptr->next;
  970. }
  971. transmit(pktRTS_, timeout);
  972.   
  973. return 0;
  974. }
  975. int
  976. Mac802_11mr::check_pktTx()
  977. {
  978. struct hdr_mac802_11 *mh;
  979. double timeout;
  980. assert(mhBackoff_.busy() == 0);
  981. if(pktTx_ == 0)
  982. return -1;
  983. mh = HDR_MAC802_11(pktTx_);
  984. /*
  985. During the backoff stage the basicMode_ could be changed by the rate adaptation algorithm
  986. */
  987. hdr_cmn* ch = HDR_CMN(pktTx_);
  988. ch->txtime() = txtime(ch->size(), dataMode_);
  989. MultiRateHdr *mrh = HDR_MULTIRATE(pktTx_);
  990. if((u_int32_t)ETHER_ADDR(mh->dh_ra) != MAC_BROADCAST) {
  991. /* store data tx time for unicast packets */
  992. mrh->mode() = dataMode_;
  993. ch->txtime() = txtime(ch->size(), dataMode_);
  994. mh->dh_duration = usec(txtime(phymib_.getACKlen(), basicMode_)
  995.        + phymib_.getSIFS());
  996. } else {
  997. /* store data tx time for broadcast packets (see 9.6) */
  998. mrh->mode() = basicMode_;
  999. ch->txtime() = txtime(ch->size(), basicMode_);
  1000. mh->dh_duration = 0;
  1001. }
  1002. switch(mh->dh_fc.fc_subtype) {
  1003. case MAC_Subtype_Data:
  1004. if(! is_idle()) {
  1005. /*
  1006. This happens when we have a simultaneous packet tx and rx and the rx event is dispatched first!!!
  1007. */
  1008. sendRTS(ETHER_ADDR(mh->dh_ra));
  1009. inc_cw();
  1010. mhBackoff_.start(cw_, is_idle());
  1011. if(debug_) printf("(check_pktTx) MOOOOOOLTO STRANO!!! C'e' qualcosa che non quadra!!n");
  1012. return 0;
  1013. }
  1014. setTxState(MAC_SEND);
  1015. if((u_int32_t)ETHER_ADDR(mh->dh_ra) != MAC_BROADCAST)
  1016.                         timeout = txtime(pktTx_)
  1017.                                 + DSSS_MaxPropagationDelay              // XXX
  1018.                                + phymib_.getSIFS()
  1019.                                + txtime(phymib_.getACKlen(), basicMode_)
  1020.                                + DSSS_MaxPropagationDelay;             // XXX
  1021. else
  1022. timeout = txtime(pktTx_);
  1023. if(debug_) printf("%f - %i --- check_pktTx - Begin transmission of data (timeout=%f, mh->dh_ra=%i,MAC_BROADCAST=%i, pkttime=%f ack=%f)n",Scheduler::instance().clock(), index_,timeout, (u_int32_t)ETHER_ADDR(mh->dh_ra), MAC_BROADCAST, txtime(pktTx_), txtime(phymib_.getACKlen(), basicMode_));
  1024. break;
  1025. default:
  1026. fprintf(stderr, "check_pktTx:Invalid MAC Control subtypen");
  1027. exit(1);
  1028. }
  1029. // Why do we need this test?
  1030. if((u_int32_t) ch->size() < macmib_.getRTSThreshold()) {
  1031. Mac80211EventHandler* mehptr = mehlist_;
  1032. while(mehptr) {
  1033. mehptr->chBusy(ch->txtime() + mh->dh_duration * 1e-6);
  1034. mehptr = mehptr->next;
  1035. }
  1036. }
  1037. transmit(pktTx_, timeout);
  1038. return 0;
  1039. }
  1040. /*
  1041.  * Low-level transmit functions that actually place the packet onto
  1042.  * the channel.
  1043.  */
  1044. void
  1045. Mac802_11mr::sendRTS(int dst)
  1046. {
  1047. Packet *p = Packet::alloc();
  1048. hdr_cmn* ch = HDR_CMN(p);
  1049. MultiRateHdr *mrh = HDR_MULTIRATE(p);
  1050. struct rts_frame *rf = (struct rts_frame*)p->access(hdr_mac::offset_);
  1051. assert(pktTx_);
  1052. assert(pktRTS_ == 0);
  1053. /*
  1054.  *  If the size of the packet is larger than the
  1055.  *  RTSThreshold, then perform the RTS/CTS exchange.
  1056.  */
  1057. if( (u_int32_t) HDR_CMN(pktTx_)->size() < macmib_.getRTSThreshold() ||
  1058.             (u_int32_t) dst == MAC_BROADCAST) {
  1059. Packet::free(p);
  1060. return;
  1061. }
  1062. ch->uid() = 0;
  1063. ch->ptype() = PT_MAC;
  1064. ch->size() = phymib_.getRTSlen();
  1065. ch->iface() = -2;
  1066. ch->error() = 0;
  1067. bzero(rf, MAC_HDR_LEN);
  1068. rf->rf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1069.   rf->rf_fc.fc_type = MAC_Type_Control;
  1070.   rf->rf_fc.fc_subtype = MAC_Subtype_RTS;
  1071.   rf->rf_fc.fc_to_ds = 0;
  1072.   rf->rf_fc.fc_from_ds = 0;
  1073.   rf->rf_fc.fc_more_frag = 0;
  1074.   rf->rf_fc.fc_retry = 0;
  1075.   rf->rf_fc.fc_pwr_mgt = 0;
  1076.   rf->rf_fc.fc_more_data = 0;
  1077.   rf->rf_fc.fc_wep = 0;
  1078.   rf->rf_fc.fc_order = 0;
  1079. //rf->rf_duration = RTS_DURATION(pktTx_);
  1080. STORE4BYTE(&dst, (rf->rf_ra));
  1081. /* store rts tx time */
  1082. mrh->mode() = basicMode_;
  1083.   ch->txtime() = txtime(ch->size(), basicMode_);
  1084. STORE4BYTE(&index_, (rf->rf_ta));
  1085. /* calculate rts duration field */
  1086. rf->rf_duration = usec(phymib_.getSIFS()
  1087.        + txtime(phymib_.getCTSlen(), basicMode_)
  1088.        + phymib_.getSIFS()
  1089.                                + txtime(pktTx_)
  1090.        + phymib_.getSIFS()
  1091.        + txtime(phymib_.getACKlen(), basicMode_));
  1092. pktRTS_ = p;
  1093. }
  1094. void
  1095. Mac802_11mr::sendCTS(int dst, double rts_duration)
  1096. {
  1097. Packet *p = Packet::alloc();
  1098. hdr_cmn* ch = HDR_CMN(p);
  1099. MultiRateHdr *mrh = HDR_MULTIRATE(p);
  1100. struct cts_frame *cf = (struct cts_frame*)p->access(hdr_mac::offset_);
  1101. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) p->access(hdr_mac::offset_);
  1102. assert(pktCTRL_ == 0);
  1103. ch->uid() = 0;
  1104. ch->ptype() = PT_MAC;
  1105. ch->size() = phymib_.getCTSlen();
  1106. ch->iface() = -2;
  1107. ch->error() = 0;
  1108. //ch->direction() = hdr_cmn::DOWN;
  1109. bzero(cf, MAC_HDR_LEN);
  1110. cf->cf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1111. cf->cf_fc.fc_type = MAC_Type_Control;
  1112. cf->cf_fc.fc_subtype = MAC_Subtype_CTS;
  1113.   cf->cf_fc.fc_to_ds = 0;
  1114.   cf->cf_fc.fc_from_ds = 0;
  1115.   cf->cf_fc.fc_more_frag = 0;
  1116.   cf->cf_fc.fc_retry = 0;
  1117.   cf->cf_fc.fc_pwr_mgt = 0;
  1118.   cf->cf_fc.fc_more_data = 0;
  1119.   cf->cf_fc.fc_wep = 0;
  1120.   cf->cf_fc.fc_order = 0;
  1121. //cf->cf_duration = CTS_DURATION(rts_duration);
  1122. STORE4BYTE(&dst, (cf->cf_ra));
  1123. // store transmitter address. 
  1124. // Not part of the standard, included for tracing and statistical purposes.
  1125. // This procedure overwrites the cf_fcs field, which is anyway unused.
  1126. STORE4BYTE(&index_, (dh->dh_ta));
  1127. /* store cts tx time */
  1128. mrh->mode() = basicMode_;
  1129. ch->txtime() = txtime(ch->size(), basicMode_);
  1130. /* calculate cts duration */
  1131. cf->cf_duration = usec(sec(rts_duration)
  1132.                               - phymib_.getSIFS()
  1133.                               - txtime(phymib_.getCTSlen(), basicMode_));
  1134. pktCTRL_ = p;
  1135. }
  1136. void
  1137. Mac802_11mr::sendACK(int dst)
  1138. {
  1139. Packet *p = Packet::alloc();
  1140. hdr_cmn* ch = HDR_CMN(p);
  1141. MultiRateHdr *mrh = HDR_MULTIRATE(p);
  1142. struct ack_frame *af = (struct ack_frame*)p->access(hdr_mac::offset_);
  1143. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) p->access(hdr_mac::offset_);
  1144. assert(pktCTRL_ == 0);
  1145. ch->uid() = 0;
  1146. ch->ptype() = PT_MAC;
  1147. // CHANGE WRT Mike's code
  1148. ch->size() = phymib_.getACKlen();
  1149. ch->iface() = -2;
  1150. ch->error() = 0;
  1151. bzero(af, MAC_HDR_LEN);
  1152. af->af_fc.fc_protocol_version = MAC_ProtocolVersion;
  1153.   af->af_fc.fc_type = MAC_Type_Control;
  1154.   af->af_fc.fc_subtype = MAC_Subtype_ACK;
  1155.   af->af_fc.fc_to_ds = 0;
  1156.   af->af_fc.fc_from_ds = 0;
  1157.   af->af_fc.fc_more_frag = 0;
  1158.   af->af_fc.fc_retry = 0;
  1159.   af->af_fc.fc_pwr_mgt = 0;
  1160.   af->af_fc.fc_more_data = 0;
  1161.   af->af_fc.fc_wep = 0;
  1162.   af->af_fc.fc_order = 0;
  1163. //af->af_duration = ACK_DURATION();
  1164. STORE4BYTE(&dst, (af->af_ra));
  1165. // store transmitter address. 
  1166. // Not part of the standard, included for tracing and statistical purposes.
  1167. // This procedure overwrites the af_fcs field, which is anyway unused.
  1168. STORE4BYTE(&index_, (dh->dh_ta));
  1169. /* store ack tx time */
  1170. mrh->mode() = basicMode_;
  1171.   ch->txtime() = txtime(ch->size(), basicMode_);
  1172. /* calculate ack duration */
  1173.   af->af_duration = 0;
  1174. pktCTRL_ = p;
  1175. }
  1176. void
  1177. Mac802_11mr::sendDATA(Packet *p)
  1178. {
  1179. hdr_cmn* ch = HDR_CMN(p);
  1180. MultiRateHdr *mrh = HDR_MULTIRATE(p);
  1181. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  1182. assert(pktTx_ == 0);
  1183. Mac80211EventHandler* mehptr = mehlist_;
  1184. while(mehptr) {
  1185. mehptr->sendDATA(p);
  1186. mehptr = mehptr->next;
  1187. }
  1188. /*
  1189.  * Update the MAC header
  1190.  */
  1191. ch->size() += phymib_.getHdrLen11();
  1192. dh->dh_fc.fc_protocol_version = MAC_ProtocolVersion;
  1193. dh->dh_fc.fc_type       = MAC_Type_Data;
  1194. dh->dh_fc.fc_subtype    = MAC_Subtype_Data;
  1195. dh->dh_fc.fc_to_ds      = 0;
  1196. dh->dh_fc.fc_from_ds    = 0;
  1197. dh->dh_fc.fc_more_frag  = 0;
  1198. dh->dh_fc.fc_retry      = 0;
  1199. dh->dh_fc.fc_pwr_mgt    = 0;
  1200. dh->dh_fc.fc_more_data  = 0;
  1201. dh->dh_fc.fc_wep        = 0;
  1202. dh->dh_fc.fc_order      = 0;
  1203. /* store data tx time */
  1204.   //ch->txtime() = txtime(ch->size(), dataMode_);
  1205. if((u_int32_t)ETHER_ADDR(dh->dh_ra) != MAC_BROADCAST) {
  1206. /* store data tx time for unicast packets */
  1207. mrh->mode() = dataMode_;
  1208. ch->txtime() = txtime(ch->size(), dataMode_);
  1209. dh->dh_duration = usec(txtime(phymib_.getACKlen(), basicMode_)
  1210.        + phymib_.getSIFS());
  1211. } else {
  1212. /* store data tx time for broadcast packets (see 9.6) */
  1213. mrh->mode() = basicMode_;
  1214. ch->txtime() = txtime(ch->size(), basicMode_);
  1215. dh->dh_duration = 0;
  1216. }
  1217. pktTx_ = p;
  1218. }
  1219. /* ======================================================================
  1220.    Retransmission Routines
  1221.    ====================================================================== */
  1222. void
  1223. Mac802_11mr::RetransmitRTS()
  1224. {
  1225. assert(pktTx_);
  1226. assert(pktRTS_);
  1227. assert(mhBackoff_.busy() == 0);
  1228. struct hdr_mac802_11 *mh = HDR_MAC802_11(pktTx_);
  1229. u_int32_t dst = (u_int32_t)ETHER_ADDR(mh->dh_ra);
  1230. incRTSFailed(dst);
  1231. ssrc_ += 1; // STA Short Retry Count
  1232. if(ssrc_ >= macmib_.getShortRetryLimit()) {
  1233. discard(pktRTS_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktRTS_ = 0;
  1234. /* tell the callback the send operation failed 
  1235.    before discarding the packet */
  1236. hdr_cmn *ch = HDR_CMN(pktTx_);
  1237. if (ch->xmit_failure_) {
  1238.                         /*
  1239.                          *  Need to remove the MAC header so that 
  1240.                          *  re-cycled packets don't keep getting
  1241.                          *  bigger.
  1242.                          */
  1243. ch->size() -= phymib_.getHdrLen11();
  1244.                         ch->xmit_reason_ = XMIT_REASON_RTS;
  1245.                         ch->xmit_failure_(pktTx_->copy(),
  1246.                                           ch->xmit_failure_data_);
  1247.                 }
  1248. discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); 
  1249. pktTx_ = 0;
  1250. ssrc_ = 0;
  1251. incMPDUTxFailed(dst);
  1252. rst_cw();
  1253. } else {
  1254. struct rts_frame *rf;
  1255. rf = (struct rts_frame*)pktRTS_->access(hdr_mac::offset_);
  1256. rf->rf_fc.fc_retry = 1;
  1257. inc_cw();
  1258. //mhBackoff_.start(cw_, is_idle());
  1259. mhBackoff_.start(cw_, 0);
  1260. if(is_idle())
  1261. mhBackoff_.resume(0.0);
  1262. }
  1263. }
  1264. void
  1265. Mac802_11mr::RetransmitDATA()
  1266. {
  1267. struct hdr_cmn *ch;
  1268. struct hdr_mac802_11 *mh;
  1269. u_int32_t *rcount, thresh;
  1270. assert(mhBackoff_.busy() == 0);
  1271. assert(pktTx_);
  1272. assert(pktRTS_ == 0);
  1273. ch = HDR_CMN(pktTx_);
  1274. mh = HDR_MAC802_11(pktTx_);
  1275. u_int32_t dst = (u_int32_t)ETHER_ADDR(mh->dh_ra);
  1276. /*
  1277.  *  Broadcast packets don't get ACKed and therefore
  1278.  *  are never retransmitted.
  1279.  */
  1280. if(dst == MAC_BROADCAST) {
  1281. Packet::free(pktTx_); 
  1282. pktTx_ = 0;
  1283. /*
  1284.  * Backoff at end of TX.
  1285.  */
  1286. rst_cw();
  1287. //  mhBackoff_.start(cw_, is_idle());
  1288. mhBackoff_.start(cw_, 0);
  1289. if(is_idle())
  1290. mhBackoff_.resume(0.0);
  1291. return;
  1292. }
  1293. //macmib_.ACKFailed++;
  1294. incACKFailed(dst);
  1295. if((u_int32_t) ch->size() <= macmib_.getRTSThreshold()) {
  1296.                 rcount = &ssrc_;
  1297.                thresh = macmib_.getShortRetryLimit();
  1298.         } else {
  1299.                 rcount = &slrc_;
  1300.                thresh = macmib_.getLongRetryLimit();
  1301.         }
  1302. (*rcount)++;
  1303. if(*rcount >= thresh) {
  1304. /* IEEE Spec section 9.2.3.5 says this should be greater than
  1305.    or equal */
  1306. //macmib_.MPDUTxFailed++;
  1307. incMPDUTxFailed(dst);
  1308. /* tell the callback the send operation failed 
  1309.    before discarding the packet */
  1310. hdr_cmn *ch = HDR_CMN(pktTx_);
  1311. if (ch->xmit_failure_) {
  1312.                         ch->size() -= phymib_.getHdrLen11();
  1313. ch->xmit_reason_ = XMIT_REASON_ACK;
  1314.                         ch->xmit_failure_(pktTx_->copy(),
  1315.                                           ch->xmit_failure_data_);
  1316.                 }
  1317. discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); 
  1318. pktTx_ = 0;
  1319. *rcount = 0;
  1320. rst_cw();
  1321. }
  1322. else {
  1323. mh->dh_fc.fc_retry = 1;
  1324. sendRTS(dst);
  1325. inc_cw();
  1326. //mhBackoff_.start(cw_, is_idle());
  1327. mhBackoff_.start(cw_, 0);
  1328. if(is_idle())
  1329. mhBackoff_.resume(0.0);
  1330. }
  1331. }
  1332. /* ======================================================================
  1333.    Incoming Packet Routines
  1334.    ====================================================================== */
  1335. void
  1336. Mac802_11mr::send(Packet *p, Handler *h)
  1337. {
  1338. double rTime;
  1339. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  1340. /* EnergyModel *em = netif_->node()->energy_model();
  1341. if (em && em->sleep()) {
  1342. em->set_node_sleep(0);
  1343. em->set_node_state(EnergyModel::INROUTE);
  1344. }*/
  1345. callback_ = h;
  1346. sendDATA(p);
  1347. sendRTS(ETHER_ADDR(dh->dh_ra));
  1348. /*
  1349.  * Assign the data packet a sequence number.
  1350.  */
  1351. dh->dh_scontrol = sta_seqno_++;
  1352. /*
  1353.  *  If the medium is IDLE, we must wait for a DIFS
  1354.  *  Space before transmitting.
  1355.  */
  1356. if(mhBackoff_.busy() == 0) {
  1357. mhBackoff_.start(cw_, is_idle(), phymib_.getDIFS());
  1358. }
  1359. }
  1360. void
  1361. Mac802_11mr::recv(Packet *p, Handler *h)
  1362. {
  1363. struct hdr_cmn *hdr = HDR_CMN(p);
  1364. /*
  1365.  * Sanity Check
  1366.  */
  1367. assert(initialized());
  1368. /*
  1369.  *  Handle outgoing packets.
  1370.  */
  1371. if(hdr->direction() == hdr_cmn::DOWN) {
  1372.                 send(p, h);
  1373.                 return;
  1374.         }
  1375. /*
  1376.  *  Handle incoming packets.
  1377.  *
  1378.  *  We just received the 1st bit of a packet on the network
  1379.  *  interface.
  1380.  *
  1381.  */
  1382. // we don't know which type of packet it is 
  1383. // and if it will be received correctly,
  1384. // so we account only for its duration + DIFS
  1385. updateIdleTime(txtime(p) + phymib_.getDIFS() + phymib_.getSlotTime());
  1386. /*
  1387.  *  If the interface is currently in transmit mode, then
  1388.  *  it probably won't even see this packet.  However, the
  1389.  *  "air" around me is BUSY so I need to let the packet
  1390.  *  proceed.  Just set the error flag in the common header
  1391.  *  to that the packet gets thrown away.
  1392.  */
  1393. //  if(tx_active_ && hdr->error() == 0) {
  1394. //  hdr->error() = 1;
  1395. //  }
  1396. /**
  1397.  * If the interface is currently in transmit mode, then
  1398.  * it probably won't even see this packet, and we can discard it.
  1399.  * We have to set the NAV accordingly because the air will possibly
  1400.  * be busy even when transmission by current node ends.
  1401.  */
  1402. if(tx_active_) {
  1403. set_nav(txtime(p));
  1404. hdr_mac802_11 *mh = HDR_MAC802_11(p);
  1405. u_int32_t src = ETHER_ADDR(mh->dh_ta); 
  1406. u_int8_t  type = mh->dh_fc.fc_type;
  1407. incFrameDropTxa(src, type);
  1408. discard(p, DROP_MAC_TX_ACTIVE);
  1409. return;
  1410. }
  1411. if(debug_) printf("%f - %i --- recv - received a packet(error=%i,rx_state=%i MAC_IDLE=%i, id=%i)n",
  1412.   Scheduler::instance().clock(), index_, hdr->error(), rx_state_,MAC_IDLE,hdr->uid());
  1413. if(rx_state_ == MAC_IDLE) {
  1414. rx_time = Scheduler::instance().clock();
  1415. setRxState(MAC_RECV);
  1416. pktRx_ = p;
  1417. /*
  1418.  * Schedule the reception of this packet, in
  1419.  * txtime seconds.
  1420.  */
  1421. mhRecv_.start(txtime(p));
  1422. assert(profile_);
  1423. profile_->startNewRecording();
  1424. } else {
  1425. double si = phymib_.getSyncInterval(HDR_MULTIRATE(pktRx_)->mode_);
  1426. /* this sanity check has almost no sense, 
  1427.    since 802.11b and g packets can coexist */
  1428. //  if (si != phymib_.getSyncInterval(HDR_MULTIRATE(p->mode_))
  1429. //  printf("WARNING: two colliding packets have different SyncIntervaln" );
  1430.        
  1431. /* 
  1432.  * if the starting time of the new packet is within a SyncInterval 
  1433.  * of the first packet we synchronized onto, it is possible to 
  1434.  * re-sync on the newer packet, if it's stronger.
  1435.  */
  1436. if ((Scheduler::instance().clock() - rx_time) < si ) {
  1437. if(p->txinfo_.RxPr > pktRx_->txinfo_.RxPr ) {
  1438. /* make p the new pktRx 
  1439.  * and reschedule the recv_timer accordigly  */ 
  1440. Packet* old;
  1441. old = pktRx_;
  1442. pktRx_ = p;
  1443. p = old;
  1444. mhRecv_.stop();
  1445. mhRecv_.start(txtime(pktRx_));
  1446. if(debug_) printf("%f - %i --- recv_timer - Synchronizing on a stronger packetn",
  1447.   Scheduler::instance().clock(), index_);
  1448. }
  1449.        /* The receiver stays syncronized on pktRx,
  1450. * and packet p is discarded.
  1451. */
  1452. if(debug_) printf("%f - %i --- recv_timer - dropping packet because synchronized on another packetn",
  1453.   Scheduler::instance().clock(), index_);
  1454. set_nav(txtime(p));
  1455. hdr_mac802_11 *mh = HDR_MAC802_11(p);
  1456. u_int32_t src = ETHER_ADDR(mh->dh_ta); 
  1457. u_int8_t  type = mh->dh_fc.fc_type;
  1458. incFrameDropSyn(src, type);
  1459. discard(p, DROP_MAC_SYNC_FAILED);
  1460. }
  1461. }
  1462. void
  1463. Mac802_11mr::recv_timer()
  1464. {
  1465. hdr_cmn *ch = HDR_CMN(pktRx_);
  1466. hdr_mac802_11 *mh = HDR_MAC802_11(pktRx_);
  1467. u_int32_t src = ETHER_ADDR(mh->dh_ta); 
  1468. u_int32_t dst = ETHER_ADDR(mh->dh_ra);
  1469. u_int8_t  type = mh->dh_fc.fc_type;
  1470. u_int8_t  subtype = mh->dh_fc.fc_subtype;
  1471. assert(pktRx_);
  1472. assert(rx_state_ == MAC_RECV || rx_state_ == MAC_COLL);
  1473. profile_->stopRecording();
  1474. if(debug_) printf("%f - %i --- recv_timer - tx_active=%i error=%i per_=%pn",Scheduler::instance().clock(), index_, tx_active_, ch->error(), per_);
  1475. /*
  1476.  * This block appears to be useless.
  1477.  * 1) if tx_active was true upon recv() then packet had been discarded at that time 
  1478.  *    and no recv_timer should have been scheduled.
  1479.  * 2) if tx_active was false upon recv(), it means that a transmit() had occurred afterwards
  1480.  *    (this happens when sending a packet without CS, e.g., when sending an ACK)
  1481.  *    but in that case ch->error is set by Mac802_11mr::transmit() 
  1482.          */
  1483.         if(tx_active_ && !ch->error()) {
  1484. if (debug_) {
  1485. fprintf(stderr,"%f - STRANGE!!! (node %d) tx_active==true && ch->error == 0 in mac-802_11mr::recv_timer()n",Scheduler::instance().clock(),index_);
  1486. dump("Mac802_11mr::recv_timer()");
  1487. fprintf(stderr,"pktTx_:");
  1488. trace_pkt(pktTx_);
  1489. fprintf(stderr,"pktRx_:");
  1490. trace_pkt(pktRx_);
  1491. }
  1492. Packet::free(pktRx_);
  1493. assert(0);
  1494.                 goto done;
  1495.         }
  1496. /*
  1497.          * If the interface enters TRANSMIT mode between recv() and recv_timer()
  1498.  * of this packet (this happens when sending a packet without CS, e.g., when sending an ACK)
  1499.  * ch->error is set by Mac802_11mr::transmit() since this packet cannot be received.
  1500.  * We do a silent discard without adjusting the NAV.  
  1501.  */
  1502. if( ch->error() ) {
  1503. Packet::free(pktRx_);
  1504. //set_nav(phymib_.getEIFS(BasicMode_));
  1505. updateIdleTime(phymib_.getEIFS() + phymib_.getSlotTime(), UIT_WEAK);
  1506. goto done;
  1507. }
  1508. if (per_) {
  1509. /* 
  1510. * Check for packet errors
  1511. */
  1512. double snr;
  1513. double snir;
  1514. double interf;
  1515. switch(per_->get_err(profile_, pktRx_, &snr, &snir, &interf)) 
  1516. {
  1517. case PKT_ERROR_INTERFERENCE:
  1518. if(debug_) printf("%f - %i --- recv_timer - drop for interference (COLLISION)n",Scheduler::instance().clock(), index_);
  1519. discard(pktRx_, DROP_MAC_COLLISION);
  1520. //set_nav(phymib_.getEIFS(BasicMode_));
  1521. updateIdleTime(phymib_.getEIFS() + phymib_.getSlotTime(), UIT_WEAK);
  1522. incFrameErrors(src, type, PKT_ERROR_INTERFERENCE);
  1523. goto done;
  1524. break;
  1525. case PKT_ERROR_NOISE:
  1526. if(debug_) printf("%f - %i --- recv_timer - drop for noise (ERR)n",Scheduler::instance().clock(), index_);
  1527. discard(pktRx_, DROP_MAC_PACKET_ERROR);
  1528. //set_nav(phymib_.getEIFS(BasicMode_));
  1529. updateIdleTime(phymib_.getEIFS() + phymib_.getSlotTime(), UIT_WEAK);
  1530. incFrameErrors(src, type, PKT_ERROR_NOISE);
  1531. goto done;
  1532. break;
  1533. case PKT_OK:
  1534. incFrameReceives(src, type);
  1535. break;
  1536. default:
  1537. assert(0);
  1538. break;
  1539. }
  1540. updateSnr(src, dst, snr);
  1541. updateSnir(src, dst, snir);
  1542. updateInterf(src, dst, interf);
  1543. }     
  1544. /*
  1545.  * IEEE 802.11 specs, section 9.2.5.6
  1546.  * - update the NAV (Network Allocation Vector)
  1547.  */
  1548. if(dst != (u_int32_t)index_) {
  1549. set_nav(mh->dh_duration);
  1550. // here NAV can be shrunk. See 802.11-1999, sec. 9.2.3.4
  1551. updateIdleTime(sec(mh->dh_duration) + phymib_.getDIFS() + phymib_.getSlotTime(), UIT_FORCED);
  1552. }
  1553.         /* tap out - */
  1554.         if (tap_ && type == MAC_Type_Data &&
  1555.             MAC_Subtype_Data == subtype ) 
  1556. tap_->tap(pktRx_);
  1557. /*
  1558.  * Adaptive Fidelity Algorithm Support - neighborhood infomation 
  1559.  * collection
  1560.  *
  1561.  * Hacking: Before filter the packet, log the neighbor node
  1562.  * I can hear the packet, the src is my neighbor
  1563.  */
  1564. /* Beyond sanity checking, 
  1565.  * this will enable execution in standard NS 
  1566.  * and prevent it in NS-Miracle 
  1567.  */
  1568. if (netif_ 
  1569.     && netif_->node()
  1570.     && netif_->node()->energy_model()  
  1571.     && netif_->node()->energy_model()->adaptivefidelity()) {
  1572. netif_->node()->energy_model()->add_neighbor(src);
  1573. }
  1574. /*
  1575.  * Address Filtering
  1576.  */
  1577. if(dst != (u_int32_t)index_ && dst != MAC_BROADCAST) {
  1578. /*
  1579.  *  We don't want to log this event, so we just free
  1580.  *  the packet instead of calling the drop routine.
  1581.  */
  1582. if(debug_) printf("%f - %i --- recv_timer - the packet is not for me!!n",Scheduler::instance().clock(), index_);
  1583. //discard(pktRx_, "---");
  1584. Packet::free(pktRx_);
  1585. goto done;
  1586. }
  1587. if(debug_) printf("%f - %i --- recv_timer - the packet is for me (ra=%i, pktid=%i)!!n",Scheduler::instance().clock(), index_, dst, ch->uid());
  1588. switch(type) {
  1589. case MAC_Type_Management:
  1590. discard(pktRx_, DROP_MAC_UNKNOWN_TYPE);
  1591. goto done;
  1592. case MAC_Type_Control:
  1593. switch(subtype) {
  1594. case MAC_Subtype_RTS:
  1595. recvRTS(pktRx_);
  1596. break;
  1597. case MAC_Subtype_CTS:
  1598. recvCTS(pktRx_);
  1599. break;
  1600. case MAC_Subtype_ACK:
  1601. if(debug_) printf("%f - %i --- recv_timer - received an ACK!!n",Scheduler::instance().clock(), index_);
  1602. recvACK(pktRx_);
  1603. break;
  1604. default:
  1605. fprintf(stderr,"recvTimer1:Invalid MAC Control Subtype %xn",
  1606. subtype);
  1607. exit(1);
  1608. }
  1609. break;
  1610. case MAC_Type_Data:
  1611. switch(subtype) {
  1612. case MAC_Subtype_Data:
  1613. incMPDURxSuccessful(src);
  1614. if(debug_) printf("%f - %i --- recv_timer - received a data packet!!n",Scheduler::instance().clock(), index_);
  1615. recvDATA(pktRx_);
  1616. break;
  1617. default:
  1618. fprintf(stderr, "recv_timer2:Invalid MAC Data Subtype %xn",
  1619. subtype);
  1620. exit(1);
  1621. }
  1622. break;
  1623. default:
  1624. fprintf(stderr, "recv_timer3:Invalid MAC Type %xn", subtype);
  1625. exit(1);
  1626. }
  1627.  done:
  1628. pktRx_ = 0;
  1629. if(debug_) printf("%f - %i --- recv_timer - call rx_resumen",Scheduler::instance().clock(), index_);
  1630. rx_resume();
  1631. }
  1632. void
  1633. Mac802_11mr::recvRTS(Packet *p)
  1634. {
  1635. struct rts_frame *rf = (struct rts_frame*)p->access(hdr_mac::offset_);
  1636. if(tx_state_ != MAC_IDLE) {
  1637. discard(p, DROP_MAC_BUSY);
  1638. return;
  1639. }
  1640. /*
  1641.  *  If I'm responding to someone else, discard this RTS.
  1642.  */
  1643. if(pktCTRL_) {
  1644. discard(p, DROP_MAC_BUSY);
  1645. return;
  1646. }
  1647. sendCTS(ETHER_ADDR(rf->rf_ta), rf->rf_duration);
  1648. /*
  1649.  *  Stop deferring - will be reset in tx_resume().
  1650.  */
  1651. if(mhDefer_.busy()) mhDefer_.stop();
  1652. tx_resume();
  1653. mac_log(p);
  1654. }
  1655. /*
  1656.  * txtime() - pluck the precomputed tx time from the packet header
  1657.  */
  1658. double
  1659. Mac802_11mr::txtime(Packet *p)
  1660. {
  1661. struct hdr_cmn *ch = HDR_CMN(p);
  1662. double t = ch->txtime();
  1663. if (t < 0.0) {
  1664. drop(p, "XXX");
  1665.   exit(1);
  1666. }
  1667. return t;
  1668. }
  1669.  
  1670. /*
  1671.  * txtime() - calculate tx time for packet of size "psz" bytes 
  1672.  *   at rate "drt" bps
  1673.  */
  1674. double
  1675. Mac802_11mr::txtime(int psz, PhyMode mode)
  1676. {
  1677. /* double dsz = psz - phymib_.getPLCPhdrLen();
  1678.         int plcp_hdr = phymib_.getPLCPhdrLen() << 3;
  1679. int datalen = (int)dsz << 3;
  1680. double t = (((double)plcp_hdr)/phymib_.getPLCPDataRate())
  1681.                                        + (((double)datalen)/drt);*/
  1682. switch(mode)
  1683. {
  1684. case Mode1Mb:
  1685. case Mode2Mb:
  1686. case Mode5_5Mb:
  1687. case Mode11Mb:
  1688. return(phymib_.getPHYhdrDuration(mode) + (8 *  (double)psz)/phymib_.getRate(mode));
  1689. case Mode6Mb:
  1690. case Mode9Mb:
  1691. case Mode12Mb:
  1692. case Mode18Mb:
  1693. case Mode24Mb:
  1694. case Mode36Mb:
  1695. case Mode48Mb:
  1696. case Mode54Mb:
  1697. return(phymib_.getPHYhdrDuration(mode) + ceil((OFDMServiceTail+(double)psz*8)/phymib_.getNBits(mode))*OFDMSYMBDURATION);
  1698. default:
  1699. fprintf(stderr,"Unknown PHY mode (%i)!!!n", mode);
  1700. exit(1);
  1701. }
  1702. }
  1703. void
  1704. Mac802_11mr::recvCTS(Packet *p)
  1705. {
  1706. if(tx_state_ != MAC_RTS) {
  1707. discard(p, DROP_MAC_INVALID_STATE);
  1708. return;
  1709. }
  1710. assert(pktRTS_);
  1711. Packet::free(pktRTS_); pktRTS_ = 0;
  1712. assert(pktTx_);
  1713. mhSend_.stop();
  1714. /*
  1715.  * The successful reception of this CTS packet implies
  1716.  * that our RTS was successful. 
  1717.  * According to the IEEE spec 9.2.5.3, you must 
  1718.  * reset the ssrc_, but not the congestion window.
  1719.  */
  1720. ssrc_ = 0;
  1721. tx_resume();
  1722. mac_log(p);
  1723. }
  1724. void
  1725. Mac802_11mr::recvDATA(Packet *p)
  1726. {
  1727. struct hdr_mac802_11 *dh = HDR_MAC802_11(p);
  1728. u_int32_t dst, src, size;
  1729. struct hdr_cmn *ch = HDR_CMN(p);
  1730. dst = ETHER_ADDR(dh->dh_ra);
  1731. src = ETHER_ADDR(dh->dh_ta);
  1732. size = ch->size();
  1733. /*
  1734.  * Adjust the MAC packet size - ie; strip
  1735.  * off the mac header
  1736.  */
  1737. ch->size() -= phymib_.getHdrLen11();
  1738. ch->num_forwards() += 1;
  1739. /*
  1740.  *  If we sent a CTS, clean up...
  1741.  */
  1742. if(dst != MAC_BROADCAST) {
  1743. if(size >= macmib_.getRTSThreshold()) {
  1744. if (tx_state_ == MAC_CTS) {
  1745. assert(pktCTRL_);
  1746. Packet::free(pktCTRL_); pktCTRL_ = 0;
  1747. mhSend_.stop();
  1748. /*
  1749.  * Our CTS got through.
  1750.  */
  1751. } else {
  1752. discard(p, DROP_MAC_BUSY);
  1753. return;
  1754. }
  1755. sendACK(src);
  1756. tx_resume();
  1757. } else {
  1758. /*
  1759.  *  We did not send a CTS and there's no
  1760.  *  room to buffer an ACK.
  1761.  */
  1762. if(pktCTRL_) {
  1763. discard(p, DROP_MAC_BUSY);
  1764. return;
  1765. }
  1766. sendACK(src);
  1767. if(mhSend_.busy() == 0)
  1768. tx_resume();
  1769. }
  1770. }
  1771. /* ============================================================
  1772.    Make/update an entry in our sequence number cache.
  1773.    ============================================================ */
  1774. /* Changed by Debojyoti Dutta. This upper loop of if{}else was 
  1775.    suggested by Joerg Diederich <dieder@ibr.cs.tu-bs.de>. 
  1776.    Changed on 19th Oct'2000 */
  1777.         if(dst != MAC_BROADCAST) {
  1778.                 if (src < (u_int32_t) cache_node_count_) {
  1779.                         Host *h = &cache_[src];
  1780.                         if(h->seqno && h->seqno == dh->dh_scontrol) {
  1781.                                 discard(p, DROP_MAC_DUPLICATE);
  1782.                                 return;
  1783.                         }
  1784.                         h->seqno = dh->dh_scontrol;
  1785.                 } else {
  1786. static int count = 0;
  1787. if (++count <= 10) {
  1788. printf ("MAC_802_11: accessing MAC cache_ array out of range (src %u, dst %u, size %d)!n", src, dst, cache_node_count_);
  1789. if (count == 10)
  1790. printf ("[suppressing additional MAC cache_ warnings]n");
  1791. };
  1792. };
  1793. }
  1794. /*
  1795.  *  Pass the packet up to the link-layer.
  1796.  *  XXX - we could schedule an event to account
  1797.  *  for this processing delay.
  1798.  */
  1799. /* in BSS mode, if a station receives a packet via
  1800.  * the AP, and higher layers are interested in looking
  1801.  * at the src address, we might need to put it at
  1802.  * the right place - lest the higher layers end up
  1803.  * believing the AP address to be the src addr! a quick
  1804.  * grep didn't turn up any higher layers interested in
  1805.  * the src addr though!
  1806.  * anyway, here if I'm the AP and the destination
  1807.  * address (in dh_3a) isn't me, then we have to fwd
  1808.  * the packet; we pick the real destination and set
  1809.  * set it up for the LL; we save the real src into
  1810.  * the dh_3a field for the 'interested in the info'
  1811.  * receiver; we finally push the packet towards the
  1812.  * LL to be added back to my queue - accomplish this
  1813.  * by reversing the direction!*/
  1814. if ((bss_id() == addr()) && ((u_int32_t)ETHER_ADDR(dh->dh_ra)!= MAC_BROADCAST)&& ((u_int32_t)ETHER_ADDR(dh->dh_3a) != ((u_int32_t)addr()))) {
  1815. struct hdr_cmn *ch = HDR_CMN(p);
  1816. u_int32_t dst = ETHER_ADDR(dh->dh_3a);
  1817. u_int32_t src = ETHER_ADDR(dh->dh_ta);
  1818. /* if it is a broadcast pkt then send a copy up
  1819.  * my stack also
  1820.  */
  1821. if (dst == MAC_BROADCAST) {
  1822. uptarget_->recv(p->copy(), (Handler*) 0);
  1823. }
  1824. ch->next_hop() = dst;
  1825. STORE4BYTE(&src, (dh->dh_3a));
  1826. ch->addr_type() = NS_AF_ILINK;
  1827. ch->direction() = hdr_cmn::DOWN;
  1828. }
  1829. uptarget_->recv(p, (Handler*) 0);
  1830. }
  1831. void
  1832. Mac802_11mr::recvACK(Packet *p)
  1833. {
  1834. if(tx_state_ != MAC_SEND) {
  1835. discard(p, DROP_MAC_INVALID_STATE);
  1836. return;
  1837. }
  1838. assert(pktTx_);
  1839. struct MultiRateHdr *hdm = HDR_MULTIRATE(p);
  1840. struct hdr_mac802_11 *pmh = HDR_MAC802_11(p);
  1841. PhyMode pm = hdm->mode();
  1842. u_int32_t ack_src = (u_int32_t)ETHER_ADDR(pmh->dh_ta);
  1843. struct hdr_mac802_11 *mh = HDR_MAC802_11(pktTx_);
  1844. u_int32_t dst = (u_int32_t)ETHER_ADDR(mh->dh_ra);
  1845. assert(ack_src == dst);
  1846. if (ack_src == bss_id())
  1847. phymib_.setAPAckMode(pm);
  1848. mhSend_.stop();
  1849. incMPDUTxSuccessful(dst);
  1850. /*
  1851.  * The successful reception of this ACK packet implies
  1852.  * that our DATA transmission was successful.  Hence,
  1853.  * we can reset the Short/Long Retry Count and the CW.
  1854.  *
  1855.  * need to check the size of the packet we sent that's being
  1856.  * ACK'd, not the size of the ACK packet.
  1857.  */
  1858. if((u_int32_t) HDR_CMN(pktTx_)->size() <= macmib_.getRTSThreshold()) {
  1859. if (ssrc_ > 1)  { 
  1860. incMPDUTxMultipleRetries(dst);
  1861. } else if (ssrc_ == 1){
  1862. incMPDUTxOneRetry(dst);
  1863. }
  1864. ssrc_ = 0;
  1865. } else {
  1866. if (slrc_ > 1)  { 
  1867. macmib_.MPDUTxMultipleRetries++; 
  1868. incMPDUTxMultipleRetries(dst);
  1869. } else if (slrc_ == 1){
  1870. incMPDUTxOneRetry(dst);
  1871. }
  1872. slrc_ = 0;
  1873. }
  1874. rst_cw();
  1875. Packet::free(pktTx_); 
  1876. pktTx_ = 0;
  1877. /*
  1878.  * Backoff before sending again.
  1879.  */
  1880. assert(mhBackoff_.busy() == 0);
  1881. mhBackoff_.start(cw_, 0);
  1882. if(is_idle())
  1883. mhBackoff_.resume(phymib_.getDIFS());
  1884. tx_resume();
  1885. mac_log(p);
  1886. }
  1887. void Mac802_11mr::incFrameErrors(u_int32_t src, u_int8_t  type, int reason)
  1888. {
  1889. macmib_.FrameErrors++;
  1890. if (reason == PKT_ERROR_NOISE)
  1891. macmib_.FrameErrorsNoise++;
  1892. MR_MAC_MIB* peermacmib = 0;
  1893. if (peerstatsdb_) 
  1894. peermacmib = peerstatsdb_->getPeerStats(src, (u_int32_t)index_)->macmib;
  1895. if (peermacmib) {
  1896. peermacmib->FrameErrors++;
  1897. if (reason == PKT_ERROR_NOISE)
  1898. peermacmib->FrameErrorsNoise++;
  1899. }
  1900. switch (type)  {
  1901. case MAC_Type_Management:
  1902. macmib_.MgmtFrameErrors++;
  1903. if (peermacmib)
  1904. peermacmib->MgmtFrameErrors++;
  1905. if (reason == PKT_ERROR_NOISE) {
  1906. macmib_.MgmtFrameErrorsNoise++;
  1907. if (peermacmib)
  1908. peermacmib->MgmtFrameErrorsNoise++;
  1909. }
  1910. break;
  1911. case MAC_Type_Control:
  1912. macmib_.CtrlFrameErrors++;
  1913. if (peermacmib)
  1914. peermacmib->CtrlFrameErrors++;
  1915. if (reason == PKT_ERROR_NOISE) {
  1916. macmib_.CtrlFrameErrorsNoise++;
  1917. if (peermacmib)
  1918. peermacmib->CtrlFrameErrorsNoise++;
  1919. }
  1920. break;
  1921. case MAC_Type_Data:
  1922. macmib_.DataFrameErrors++;
  1923. if (peermacmib)
  1924. peermacmib->DataFrameErrors++;
  1925. if (reason == PKT_ERROR_NOISE) {
  1926. macmib_.DataFrameErrorsNoise++;
  1927. if (peermacmib)
  1928. peermacmib->DataFrameErrorsNoise++;
  1929. }
  1930. break;
  1931. default:
  1932. fprintf(stderr,"Mac802_11mr::incFrameErrors() unknown MAC_typen");
  1933. assert(0);
  1934. break;
  1935. }
  1936. Mac80211EventHandler* mehptr = mehlist_;
  1937. while(mehptr) {
  1938. mehptr->counterHandle(ID_FrameErrors);
  1939. mehptr = mehptr->next;
  1940. }
  1941. }
  1942. void Mac802_11mr::incFrameReceives(u_int32_t src, u_int8_t  type)
  1943. {
  1944. macmib_.FrameReceives++;
  1945. MR_MAC_MIB* peermacmib = 0;
  1946. if (peerstatsdb_) 
  1947. peermacmib = peerstatsdb_->getPeerStats(src, (u_int32_t)index_)->macmib;
  1948. if (peermacmib)
  1949. peermacmib->FrameReceives++;
  1950. switch (type)  {
  1951. case MAC_Type_Management:
  1952. macmib_.MgmtFrameReceives++;
  1953. if (peermacmib)
  1954. peermacmib->MgmtFrameReceives++;
  1955. break;
  1956. case MAC_Type_Control:
  1957. macmib_.CtrlFrameReceives++;
  1958. if (peermacmib)
  1959. peermacmib->CtrlFrameReceives++;
  1960. break;
  1961. case MAC_Type_Data:
  1962. macmib_.DataFrameReceives++;
  1963. if (peermacmib)
  1964. peermacmib->DataFrameReceives++;
  1965. break;
  1966. default:
  1967. fprintf(stderr,"Mac802_11mr::incFrameReceives() unknown MAC_typen");
  1968. assert(0);
  1969. break;
  1970. }
  1971. Mac80211EventHandler* mehptr = mehlist_;
  1972. while(mehptr) {
  1973. mehptr->counterHandle(ID_FrameReceives);
  1974. mehptr = mehptr->next;
  1975. }
  1976. }
  1977. void Mac802_11mr::incFrameDropSyn(u_int32_t src, u_int8_t  type)
  1978. {
  1979. macmib_.FrameDropSyn++;
  1980. MR_MAC_MIB* peermacmib = 0;
  1981. if (peerstatsdb_) 
  1982. peermacmib = peerstatsdb_->getPeerStats(src, (u_int32_t)index_)->macmib;
  1983. if (peermacmib)
  1984. peermacmib->FrameDropSyn++;
  1985. switch (type)  {
  1986. case MAC_Type_Management:
  1987. macmib_.MgmtFrameDropSyn++;
  1988. if (peermacmib)
  1989. peermacmib->MgmtFrameDropSyn++;
  1990. break;
  1991. case MAC_Type_Control:
  1992. macmib_.CtrlFrameDropSyn++;
  1993. if (peermacmib)
  1994. peermacmib->CtrlFrameDropSyn++;
  1995. break;
  1996. case MAC_Type_Data:
  1997. macmib_.DataFrameDropSyn++;
  1998. if (peermacmib)
  1999. peermacmib->DataFrameDropSyn++;
  2000. break;
  2001. default:
  2002. fprintf(stderr,"Mac802_11mr::incFrameReceives() unknown MAC_typen");
  2003. assert(0);
  2004. break;
  2005. }
  2006. Mac80211EventHandler* mehptr = mehlist_;
  2007. while(mehptr) {
  2008. mehptr->counterHandle(ID_FrameDropSyn);
  2009. mehptr = mehptr->next;
  2010. }
  2011. }
  2012. void Mac802_11mr::incFrameDropTxa(u_int32_t src, u_int8_t  type)
  2013. {
  2014. macmib_.FrameDropTxa++;
  2015. MR_MAC_MIB* peermacmib = 0;
  2016. if (peerstatsdb_) 
  2017. peermacmib = peerstatsdb_->getPeerStats(src, (u_int32_t)index_)->macmib;
  2018. if (peermacmib)
  2019. peermacmib->FrameDropTxa++;
  2020. switch (type)  {
  2021. case MAC_Type_Management:
  2022. macmib_.MgmtFrameDropTxa++;
  2023. if (peermacmib)
  2024. peermacmib->MgmtFrameDropTxa++;
  2025. break;
  2026. case MAC_Type_Control:
  2027. macmib_.CtrlFrameDropTxa++;
  2028. if (peermacmib)
  2029. peermacmib->CtrlFrameDropTxa++;
  2030. break;
  2031. case MAC_Type_Data:
  2032. macmib_.DataFrameDropTxa++;
  2033. if (peermacmib)
  2034. peermacmib->DataFrameDropTxa++;
  2035. break;
  2036. default:
  2037. fprintf(stderr,"Mac802_11mr::incFrameReceives() unknown MAC_typen");
  2038. assert(0);
  2039. break;
  2040. }
  2041. Mac80211EventHandler* mehptr = mehlist_;
  2042. while(mehptr) {
  2043. mehptr->counterHandle(ID_FrameDropTxa);
  2044. mehptr = mehptr->next;
  2045. }
  2046. }
  2047. void Mac802_11mr::incACKFailed(u_int32_t dst)
  2048. {
  2049. macmib_.ACKFailed++;
  2050. MR_MAC_MIB* peermacmib = 0;
  2051. if (peerstatsdb_) 
  2052. peermacmib = peerstatsdb_->getPeerStats((u_int32_t)index_, dst)->macmib;
  2053. if (peermacmib)
  2054. peermacmib->ACKFailed++;       
  2055. Mac80211EventHandler* mehptr = mehlist_;
  2056. while(mehptr) {
  2057. mehptr->counterHandle(ID_ACKFailed);
  2058. mehptr = mehptr->next;
  2059. }
  2060. }
  2061. void Mac802_11mr::incRTSFailed(u_int32_t dst)
  2062. {
  2063. macmib_.RTSFailed++;
  2064. MR_MAC_MIB* peermacmib = 0;
  2065. if (peerstatsdb_) 
  2066. peermacmib = peerstatsdb_->getPeerStats((u_int32_t)index_, dst)->macmib;
  2067. if (peermacmib)
  2068. peermacmib->RTSFailed++;       
  2069. Mac80211EventHandler* mehptr = mehlist_;
  2070. while(mehptr) {
  2071. mehptr->counterHandle(ID_RTSFailed);
  2072. mehptr = mehptr->next;
  2073. }
  2074. }
  2075. void Mac802_11mr::incMPDURxSuccessful(u_int32_t src)
  2076. {
  2077. macmib_.MPDURxSuccessful++;
  2078. MR_MAC_MIB* peermacmib = 0;
  2079. if (peerstatsdb_) 
  2080. peermacmib = peerstatsdb_->getPeerStats(src, (u_int32_t)index_)->macmib;
  2081. if (peermacmib)
  2082. peermacmib->MPDURxSuccessful++;       
  2083. Mac80211EventHandler* mehptr = mehlist_;
  2084. while(mehptr) {
  2085. mehptr->counterHandle(ID_MPDURxSuccessful);
  2086. mehptr = mehptr->next;
  2087. }
  2088. }
  2089. void Mac802_11mr::incMPDUTxSuccessful(u_int32_t dst)
  2090. {
  2091. macmib_.MPDUTxSuccessful++;
  2092. MR_MAC_MIB* peermacmib = 0;
  2093. if (peerstatsdb_) 
  2094. peermacmib = peerstatsdb_->getPeerStats((u_int32_t)index_, dst)->macmib;
  2095. if (peermacmib)
  2096. peermacmib->MPDUTxSuccessful++;       
  2097. Mac80211EventHandler* mehptr = mehlist_;
  2098. while(mehptr) {
  2099. mehptr->counterHandle(ID_MPDUTxSuccessful);
  2100. mehptr = mehptr->next;
  2101. }
  2102. }
  2103. void Mac802_11mr::incMPDUTxOneRetry(u_int32_t dst)
  2104. {
  2105. macmib_.MPDUTxOneRetry++;
  2106. MR_MAC_MIB* peermacmib = 0;
  2107. if (peerstatsdb_) 
  2108. peermacmib = peerstatsdb_->getPeerStats((u_int32_t)index_, dst)->macmib;
  2109. if (peermacmib)
  2110. peermacmib->MPDUTxOneRetry++;       
  2111. Mac80211EventHandler* mehptr = mehlist_;
  2112. while(mehptr) {
  2113. mehptr->counterHandle(ID_MPDUTxOneRetry);
  2114. mehptr = mehptr->next;
  2115. }
  2116. }
  2117. void Mac802_11mr::incMPDUTxMultipleRetries(u_int32_t dst)
  2118. {
  2119. macmib_.MPDUTxMultipleRetries++;
  2120. MR_MAC_MIB* peermacmib = 0;
  2121. if (peerstatsdb_) 
  2122. peermacmib = peerstatsdb_->getPeerStats((u_int32_t)index_, dst)->macmib;
  2123. if (peermacmib)
  2124. peermacmib->MPDUTxMultipleRetries++;       
  2125. Mac80211EventHandler* mehptr = mehlist_;
  2126. while(mehptr) {
  2127. mehptr->counterHandle(ID_MPDUTxMultipleRetries);
  2128. mehptr = mehptr->next;
  2129. }
  2130. }
  2131. void Mac802_11mr::incMPDUTxFailed(u_int32_t dst)
  2132. {
  2133. macmib_.MPDUTxFailed++;
  2134. MR_MAC_MIB* peermacmib = 0;
  2135. if (peerstatsdb_) 
  2136. peermacmib = peerstatsdb_->getPeerStats((u_int32_t)index_, dst)->macmib;
  2137. if (peermacmib)
  2138. peermacmib->MPDUTxFailed++;       
  2139. Mac80211EventHandler* mehptr = mehlist_;
  2140. while(mehptr) {
  2141. mehptr->counterHandle(ID_MPDUTxFailed);
  2142. mehptr = mehptr->next;
  2143. }
  2144. }
  2145. void Mac802_11mr::incidleSlots(int step)
  2146. {
  2147. assert(step>=0);
  2148. macmib_.idleSlots += step;
  2149. Mac80211EventHandler* mehptr = mehlist_;
  2150. while(mehptr) {
  2151. mehptr->counterHandle(ID_idleSlots);
  2152. mehptr = mehptr->next;
  2153. }
  2154. }
  2155. void Mac802_11mr::incidle2Slots(int step)
  2156. {
  2157. assert(step>=0);
  2158. //  cout << NOW
  2159. //       << " node " << index_ 
  2160. //       << " idle2Slots " << macmib_.idle2Slots 
  2161. //       << " step " << step
  2162. //       << endl;
  2163. macmib_.idle2Slots += step;
  2164. Mac80211EventHandler* mehptr = mehlist_;
  2165. while(mehptr) {
  2166. mehptr->counterHandle(ID_idle2Slots);
  2167. mehptr = mehptr->next;
  2168. }
  2169. }
  2170. void Mac802_11mr::updateIdleTime(double nextIdleTime, int mode)
  2171. {
  2172. assert(nextIdleTime > 0);
  2173. double now = Scheduler::instance().clock();
  2174. nextIdleTime += now;
  2175. if (macmib_.startIdle2Time < now) {
  2176. // channel has been idle up to now
  2177. incidle2Slots(int ((now - macmib_.startIdle2Time)/phymib_.getSlotTime()));
  2178. macmib_.startIdle2Time_min = now;
  2179. }
  2180. switch (mode) {
  2181. case UIT_FORCED:
  2182. macmib_.startIdle2Time_min = std::max(nextIdleTime, macmib_.startIdle2Time_min);
  2183. macmib_.startIdle2Time = macmib_.startIdle2Time_min;
  2184. break;
  2185. case UIT_NORMAL:
  2186. if (nextIdleTime > macmib_.startIdle2Time) {
  2187. macmib_.startIdle2Time_min   = nextIdleTime;
  2188. macmib_.startIdle2Time       = nextIdleTime;
  2189. }
  2190. break;
  2191. case UIT_WEAK:
  2192. macmib_.startIdle2Time = nextIdleTime;
  2193. break;
  2194. default:
  2195. assert(0);
  2196. break;
  2197. }
  2198. }
  2199. void Mac802_11mr::updateSnr(u_int32_t src, u_int32_t dst, double snr)
  2200. {
  2201. if (dst == (u_int32_t)index_) {
  2202. if (peerstatsdb_) {
  2203. PeerStats* ps = peerstatsdb_->getPeerStats(src, (u_int32_t)index_);
  2204. assert(ps);
  2205. ps->updateSnr(snr);
  2206. }
  2207. }
  2208. if (src == bss_id()) {
  2209. phymib_.setAPSnr(snr);
  2210. }
  2211. }
  2212. void Mac802_11mr::updateSnir(u_int32_t src, u_int32_t dst, double snir)
  2213. {
  2214. if (dst == (u_int32_t)index_) {
  2215. if (peerstatsdb_) {
  2216. PeerStats* ps = peerstatsdb_->getPeerStats(src, (u_int32_t)index_);
  2217. assert(ps);
  2218. ps->updateSnir(snir);
  2219. }
  2220. }
  2221. }
  2222. void Mac802_11mr::updateInterf(u_int32_t src, u_int32_t dst, double interf)
  2223. {
  2224. if (dst == (u_int32_t)index_) {
  2225. if (peerstatsdb_) {
  2226. PeerStats* ps = peerstatsdb_->getPeerStats(src, (u_int32_t)index_);
  2227. assert(ps);
  2228. ps->updateInterf(interf);
  2229. }
  2230. }
  2231. }
  2232. double Mac802_11mr::getSnr(u_int32_t addr)
  2233. {
  2234. /* we assume it is better to exit if the requested stats
  2235.    are not available, since returning a bogus value might
  2236.    corrupt some algorithm */
  2237. assert(peerstatsdb_);
  2238. PeerStats* ps = peerstatsdb_->getPeerStats(addr, (u_int32_t)index_);
  2239. assert(ps);
  2240. return ps->getSnr();
  2241. }
  2242. double Mac802_11mr::getSnir(u_int32_t addr)
  2243. {
  2244. /* we assume it is better to exit if the requested stats
  2245.    are not available, since returning a bogus value might
  2246.    corrupt some algorithm */
  2247. assert(peerstatsdb_);
  2248. PeerStats* ps = peerstatsdb_->getPeerStats(addr, (u_int32_t)index_);
  2249. assert(ps);
  2250. return ps->getSnir();
  2251. }
  2252. double Mac802_11mr::getInterf(u_int32_t addr)
  2253. {
  2254. /* we assume it is better to exit if the requested stats
  2255.    are not available, since returning a bogus value might
  2256.    corrupt some algorithm */
  2257. assert(peerstatsdb_);
  2258. PeerStats* ps = peerstatsdb_->getPeerStats(addr, (u_int32_t)index_);
  2259. assert(ps);
  2260. return ps->getInterf();
  2261. }