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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2007 
  3.  * Mercedes-Benz Research & Development North America, Inc. and 
  4.  * University of Karlsruhe (TH)
  5.  * All rights reserved.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License,
  9.  * version 2, as published by the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License along
  17.  * with this program; if not, write to the Free Software Foundation, Inc.,
  18.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  *
  21.  * The copyright of this module includes the following
  22.  * linking-with-specific-other-licenses addition:
  23.  *
  24.  * In addition, as a special exception, the copyright holders of
  25.  * this module give you permission to combine (via static or
  26.  * dynamic linking) this module with free software programs or
  27.  * libraries that are released under the GNU LGPL and with code
  28.  * included in the standard release of ns-2 under the Apache 2.0
  29.  * license or under otherwise-compatible licenses with advertising
  30.  * requirements (or modified versions of such code, with unchanged
  31.  * license).  You may copy and distribute such a system following the
  32.  * terms of the GNU GPL for this module and the licenses of the
  33.  * other code concerned, provided that you include the source code of
  34.  * that other code when and as the GNU GPL requires distribution of
  35.  * source code.
  36.  *
  37.  * Note that people who make modified versions of this module
  38.  * are not obligated to grant this special exception for their
  39.  * modified versions; it is their choice whether to do so.  The GNU
  40.  * General Public License gives permission to release a modified
  41.  * version without this exception; this exception also makes it
  42.  * possible to release a modified version which carries forward this
  43.  * exception.
  44.  *
  45.  */
  46.  
  47. /*
  48.  * This code was designed and developed by:
  49.  * 
  50.  * Qi Chen                 : qi.chen@daimler.com
  51.  * Felix Schmidt-Eisenlohr : felix.schmidt-eisenlohr@kit.edu
  52.  * Daniel Jiang            : daniel.jiang@daimler.com
  53.  * 
  54.  * For further information see: 
  55.  * http://dsn.tm.uni-karlsruhe.de/english/Overhaul_NS-2.php
  56.  */
  57. #include "delay.h"
  58. #include "connector.h"
  59. #include "packet.h"
  60. #include "random.h"
  61. #include "mobilenode.h"
  62. #include "arp.h"
  63. #include "ll.h"
  64. #include "mac.h"
  65. #include "mac-802_11Ext.h"
  66. #include "cmu-trace.h"
  67. #include <iostream>
  68. #include "common/agent.h"
  69. PHY_MIBExt::PHY_MIBExt(Mac802_11Ext *parent) {
  70. parent->bind("SlotTime_", &SlotTime);
  71. parent->bind("HeaderDuration_", &HeaderDuration);
  72. parent->bind("SymbolDuration_", &SymbolDuration);
  73. parent->bind("BasicModulationScheme_", &BasicModulationScheme);
  74. parent->bind_bool("use_802_11a_flag_", &use_802_11a_flag_);
  75. }
  76. MAC_MIBExt::MAC_MIBExt(Mac802_11Ext *parent) {
  77. parent->bind("CWMin_", &CWMin);
  78. parent->bind("CWMax_", &CWMax);
  79. parent->bind("SIFS_", &SIFSTime);
  80. parent->bind("RTSThreshold_", &RTSThreshold);
  81. parent->bind("ShortRetryLimit_", &ShortRetryLimit);
  82. parent->bind("LongRetryLimit_", &LongRetryLimit);
  83. }
  84. /* ======================================================================
  85.  TCL Hooks for the simulator
  86.  ====================================================================== */
  87. static class Mac802_11ExtClass : public TclClass {
  88. public:
  89. Mac802_11ExtClass() :
  90. TclClass("Mac/802_11Ext") {
  91. }
  92. TclObject* create(int, const char*const*) {
  93. return (new Mac802_11Ext());
  94. }
  95. } class_mac802_11;
  96. /* ======================================================================
  97.  Mac Class Functions
  98.  ====================================================================== */
  99. Mac802_11Ext::Mac802_11Ext() :
  100. Mac(), bkmgr(this), csmgr(this), txc(this), rxc(this), phymib_(this),
  101. macmib_(this) {
  102. bind("MAC_DBG", &MAC_DBG);
  103. ssrc_ = slrc_ = 0;
  104. sifs_ = macmib_.getSIFS();
  105. difs_ = macmib_.getSIFS() + 2*phymib_.getSlotTime();
  106. eifs_ = macmib_.getSIFS() + difs_ + txtime(phymib_.getACKlen(),
  107. phymib_.getBasicModulationScheme());
  108. pifs_ = sifs_ + phymib_.getSlotTime();
  109. cw_ = macmib_.getCWMin();
  110. bkmgr.setSlotTime(phymib_.getSlotTime());
  111. csmgr.setIFS(eifs_);
  112. txConfirmCallback_=Callback_TXC;
  113. }
  114. int Mac802_11Ext::command(int argc, const char*const* argv) {
  115. if (argc == 3) {
  116. if (strcmp(argv[1], "log-target") == 0) {
  117. logtarget_ = (NsObject*) TclObject::lookup(argv[2]);
  118. if (logtarget_ == 0)
  119. return TCL_ERROR;
  120. return TCL_OK;
  121. }
  122. }
  123. return Mac::command(argc, argv);
  124. }
  125. /* ======================================================================
  126.  Debugging Routines
  127.  ====================================================================== */
  128. void Mac802_11Ext::trace_pkt(Packet *p) {
  129. struct hdr_cmn *ch = HDR_CMN(p);
  130. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  131. u_int16_t *t = (u_int16_t*) &dh->dh_fc;
  132. fprintf(stderr, "t[ %2x %2x %2x %2x ] %x %s %dn",
  133. *t, dh->dh_duration,
  134. ETHER_ADDR(dh->dh_ra), ETHER_ADDR(dh->dh_ta),
  135. index_, packet_info.name(ch->ptype()), ch->size());
  136. }
  137. void Mac802_11Ext::dump(char *fname) {
  138. }
  139. void Mac802_11Ext::log(char* event, char* additional) {
  140. if (MAC_DBG)
  141. cout<<"L "<<Scheduler::instance().clock()<<" "<<index_<<" "<<"MAC"<<" "<<event<<" "<<additional
  142. <<endl;
  143. }
  144. /* ======================================================================
  145.  Packet Headers Routines
  146.  ====================================================================== */
  147. inline int Mac802_11Ext::hdr_dst(char* hdr, int dst) {
  148. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  149. if (dst > -2)
  150. STORE4BYTE(&dst, (dh->dh_ra));
  151. return ETHER_ADDR(dh->dh_ra);
  152. }
  153. inline int Mac802_11Ext::hdr_src(char* hdr, int src) {
  154. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  155. if (src > -2)
  156. STORE4BYTE(&src, (dh->dh_ta));
  157. return ETHER_ADDR(dh->dh_ta);
  158. }
  159. inline int Mac802_11Ext::hdr_type(char* hdr, u_int16_t type) {
  160. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  161. if (type)
  162. STORE2BYTE(&type,(dh->dh_body));
  163. return GET2BYTE(dh->dh_body);
  164. }
  165. /* ======================================================================
  166.  Misc Routines
  167.  ====================================================================== */
  168. void Mac802_11Ext::discard(Packet *p, const char* why) {
  169. hdr_mac802_11* mh = HDR_MAC802_11(p);
  170. hdr_cmn *ch = HDR_CMN(p);
  171. /* if the rcvd pkt contains errors, a real MAC layer couldn't
  172.  necessarily read any data from it, so we just toss it now */
  173. if (ch->error() != 0) {
  174. Packet::free(p);
  175. //p = 0;
  176. return;
  177. }
  178. switch (mh->dh_fc.fc_type) {
  179. case MAC_Type_Management:
  180. drop(p, why);
  181. return;
  182. case MAC_Type_Control:
  183. switch (mh->dh_fc.fc_subtype) {
  184. case MAC_Subtype_RTS:
  185. if ((u_int32_t)ETHER_ADDR(mh->dh_ta) ==(u_int32_t)index_) {
  186. drop(p, why);
  187. return;
  188. }
  189. /* fall through - if necessary */
  190. case MAC_Subtype_CTS:
  191. case MAC_Subtype_ACK:
  192. if ((u_int32_t)ETHER_ADDR(mh->dh_ra) ==(u_int32_t)index_) {
  193. drop(p, why);
  194. return;
  195. }
  196. break;
  197. default:
  198. fprintf(stderr, "invalid MAC Control subtypen");
  199. exit(1);
  200. }
  201. break;
  202. case MAC_Type_Data:
  203. switch (mh->dh_fc.fc_subtype) {
  204. case MAC_Subtype_Data:
  205. if ((u_int32_t)ETHER_ADDR(mh->dh_ra) ==(u_int32_t)index_ ||(u_int32_t)ETHER_ADDR(mh->dh_ta) ==(u_int32_t)index_ ||(u_int32_t)ETHER_ADDR(mh->dh_ra) == MAC_BROADCAST) {
  206. drop(p, why); //check! drop does not work
  207. // Packet::free(p);
  208. return;
  209. }
  210. break;
  211. default:
  212. fprintf(stderr, "invalid MAC Data subtypen");
  213. exit(1);
  214. }
  215. break;
  216. default:
  217. fprintf(stderr, "invalid MAC type (%x)n", mh->dh_fc.fc_type);
  218. trace_pkt(p);
  219. exit(1);
  220. }
  221. Packet::free(p);
  222. }
  223. /*new code starts here*/
  224. /*--------------1.0 Channel State module-------------------------------*/
  225. /*----------------IFSTimer NAVTimer and ChannelStateMgr----------------*/
  226. /*---------------------------------------------------------------------*/
  227. //IFSTimer
  228. void IFSTimer::expire(Event *e) {
  229. csmgr->handleIFSTimer();
  230. }
  231. //NAVTimer
  232. void NAVTimer::expire(Event *e) {
  233. csmgr->handleNAVTimer();
  234. }
  235. //ChannelStateMgr
  236. ChannelStateMgr::ChannelStateMgr(Mac802_11Ext * m) {
  237. mac_ = m;
  238. channel_state_ = noCSnoNAV;
  239. ifs_value_ = -1.0;
  240. ifs_value_ = mac_->eifs_;
  241. ifsTimer_ = new IFSTimer(this);
  242. navTimer_ = new NAVTimer(this);
  243. }
  244. void ChannelStateMgr::setChannelState(ChannelState newState) {
  245. if (mac_->MAC_DBG) {
  246. char msg[1000];
  247. sprintf(msg, "%d -> %d", channel_state_, newState);
  248. mac_->log("ChState", msg);
  249. }
  250. channel_state_ = newState;
  251. }
  252. void ChannelStateMgr::setIFS(double tifs) {
  253. if (mac_->MAC_DBG) {
  254. char msg[1000];
  255. sprintf(msg, "%f", tifs);
  256. mac_->log("ChSetIFS", msg);
  257. }
  258. ifs_value_=tifs;
  259. //the following line of codes is used to solved the race conditon of event scheduling
  260. //IDleIndication is handled before RXEndIndication
  261. //therefore the IFSTimer is started before the new ifs_value_ is set in RXEndIndication
  262. if (ifsTimer_->status()==TIMER_PENDING) // ifsTimer has been scheduled
  263. {
  264. ifsTimer_->cancel();
  265. ifsTimer_->sched(ifs_value_);
  266. }
  267. //end of this change
  268. }
  269. void ChannelStateMgr::handlePHYBusyIndication() {
  270. switch (channel_state_) {
  271. case noCSnoNAV:
  272. mac_->bkmgr.handleCSBUSY();
  273. setChannelState(CSnoNAV);
  274. break;
  275. case noCSNAV:
  276. setChannelState(CSNAV);
  277. break;
  278. case WIFS:
  279. if (ifsTimer_->status()==TIMER_PENDING)
  280. ifsTimer_->cancel();
  281. setChannelState(CSnoNAV);
  282. break;
  283. default:
  284. //  the busy indication from phy will be ignored if the channel statemgr is already in CS_BUSY
  285. break;
  286. }
  287. }
  288. void ChannelStateMgr::handlePHYIdleIndication() {
  289. switch (channel_state_) {
  290. case CSnoNAV:
  291. ifsTimer_->sched(ifs_value_);
  292. setChannelState(WIFS);
  293. break;
  294. case CSNAV:
  295. setChannelState(noCSNAV);
  296. break;
  297. default:
  298. // the idle indication from phy will be ignored if the channel statemgr is already CS free
  299. break;
  300. }
  301. }
  302. void ChannelStateMgr::handleSetNAV(double t) {
  303. if (mac_->MAC_DBG) {
  304. char msg [1000];
  305. sprintf(msg, "%f", t);
  306. mac_->log("ChSetNAV", msg);
  307. }
  308. switch (channel_state_) {
  309. case noCSnoNAV:
  310. navTimer_->sched(t);
  311. mac_->bkmgr.handleCSBUSY();
  312. setChannelState(noCSNAV);
  313. break;
  314. case CSnoNAV:
  315. navTimer_->sched(t);
  316. setChannelState(CSNAV);
  317. break;
  318. case noCSNAV:
  319. navTimer_->cancel();
  320. navTimer_->sched(t);
  321. break;
  322. case CSNAV:
  323. navTimer_->cancel();
  324. navTimer_->sched(t);
  325. break;
  326. case WIFS:
  327. navTimer_->sched(t);
  328. if (ifsTimer_->status()==TIMER_PENDING)
  329. ifsTimer_->cancel();
  330. setChannelState(noCSNAV);
  331. //needs further attention
  332. //cout<<"logic error at ChannelStateMgr, event handleSetNAV"<<endl;
  333. //exit(-1);
  334. break;
  335. default:
  336. cout<<"logic error at ChannelStateMgr, event handleSetNAV"<<endl;
  337. exit(-1);
  338. }
  339. }
  340. void ChannelStateMgr::handleIFSTimer() {
  341. if (channel_state_ == WIFS) {
  342. //chi changed the order 
  343. setChannelState(noCSnoNAV);
  344. mac_->bkmgr.handleCSIDLE();
  345. } else {
  346. cout<<"logic error at ChannelStateMgr, event handleIFSTimer"<<endl;
  347. exit(-1);
  348. }
  349. }
  350. void ChannelStateMgr::handleNAVTimer() {
  351. switch (channel_state_) {
  352. case noCSNAV:
  353. ifsTimer_->sched(ifs_value_);
  354. setChannelState(WIFS);
  355. break;
  356. case CSNAV:
  357. setChannelState(CSnoNAV);
  358. break;
  359. default:
  360. cout<<"logic error at ChannelStateMgr, event handleNAVTimer"<<endl;
  361. exit(-1);
  362. }
  363. }
  364. /*---------------2.0 Backoff Module----------------*/
  365. /*--- BackoffTimer_t and BackoffMgr -----------*/
  366. /*---------------------------------------------*/
  367. /* BackoffTimer_t */
  368. BackoffTimer_t::BackoffTimer_t(BackoffMgr *b) {
  369. bkmgr_ =b;
  370. tSlot = -1.0; // the real initialization is in int()
  371. startTime=-1.0;
  372. remainingSlots_=-1;
  373. }
  374. void BackoffTimer_t::setSlotTime(double t) {
  375. tSlot = t;
  376. }
  377. int BackoffTimer_t::init(int CW) {
  378. remainingSlots_ = Random::integer(CW+1); //choose a number within [0,CW]
  379. startTime = -1.0;
  380. return remainingSlots_;
  381. }
  382. void BackoffTimer_t::pause() {
  383. if (startTime ==-1.0) {
  384. cout<<"logic error at BackoffTimer_t, event pause"<<endl;
  385. exit(-1);
  386. }
  387. remainingSlots_-=(int)(floor((Scheduler::instance().clock()-startTime)/tSlot));
  388. if (status()==TIMER_PENDING)
  389. cancel();
  390. startTime = -1.0;
  391. }
  392. void BackoffTimer_t::run() {
  393. //chi added for testing remainging slots
  394. if (remainingSlots_ ==0) {
  395. remainingSlots_=-1;
  396. bkmgr_->handleBackoffTimer();
  397. } else {
  398. startTime = Scheduler::instance().clock();
  399. sched(remainingSlots_*tSlot);
  400. }
  401. }
  402. void BackoffTimer_t::expire(Event *e) {
  403. remainingSlots_=-1;
  404. bkmgr_->handleBackoffTimer();
  405. return;
  406. }
  407. BackoffMgr::BackoffMgr(Mac802_11Ext *m) {
  408. mac_ = m;
  409. bk_state_ = noBackoff; //needs further attention
  410. bkTimer_ = new BackoffTimer_t(this);
  411. }
  412. void BackoffMgr::setSlotTime(double t) {
  413. bkTimer_->setSlotTime(t);
  414. }
  415. void BackoffMgr::setBackoffMgrState(BackoffMgrState newState) {
  416. if (mac_->MAC_DBG) {
  417. char msg [1000];
  418. sprintf(msg, "%d -> %d, rslots: %d", bk_state_, newState,
  419. bkTimer_->remainingSlots_);
  420. mac_->log("BkState", msg);
  421. }
  422. bk_state_ = newState;
  423. }
  424. void BackoffMgr::handleCSIDLE() {
  425. switch (bk_state_) {
  426. case BackoffPause:
  427. setBackoffMgrState(BackoffRunning);
  428. bkTimer_->run();
  429. break;
  430. case noBackoff:
  431. //ignore this signal
  432. break;
  433. default:
  434. cout<<"logic error at BackoffMgr, event handleCSIDLE"<<endl;
  435. exit(-1);
  436. }
  437. }
  438. void BackoffMgr::handleCSBUSY() {
  439. switch (bk_state_) {
  440. case noBackoff:
  441. //ignore this signal
  442. break;
  443. case BackoffPause:
  444. //ignore this signal
  445. break;
  446. case BackoffRunning:
  447. setBackoffMgrState(BackoffPause);
  448. bkTimer_->pause();
  449. break;
  450. default:
  451. cout<<"logic error at BackoffMgr, event handleCSBUSY"<<endl;
  452. exit(-1);
  453. }
  454. }
  455. void BackoffMgr::handleBKStart(int CW) {
  456. switch (bk_state_) {
  457. case noBackoff:
  458. //Chi changed
  459. if (mac_->csmgr.getChannelState()==noCSnoNAV) {
  460. if (bkTimer_->init(CW) == 0) {
  461. setBackoffMgrState(noBackoff);
  462. BKDone();
  463. } else {
  464. setBackoffMgrState(BackoffRunning);
  465. bkTimer_->run();
  466. }
  467. } else {
  468. bkTimer_->init(CW);
  469. setBackoffMgrState(BackoffPause);
  470. }
  471. break;
  472. case BackoffRunning:
  473. //ignore this signal
  474. break;
  475. case BackoffPause:
  476. //ignore this signal
  477. break;
  478. default:
  479. cout<<"logic error at BackoffMgr, event handleBKStart"<<endl;
  480. exit(-1);
  481. }
  482. }
  483. void BackoffMgr::handleBackoffTimer() {
  484. switch (bk_state_) {
  485. case BackoffRunning:
  486. setBackoffMgrState(noBackoff);
  487. BKDone();
  488. break;
  489. default:
  490. cout<<"logic error at BackoffMgr, event handleBackoffTimer"<<endl;
  491. exit(-1);
  492. }
  493. }
  494. void BackoffMgr::BKDone() {
  495. mac_->handleBKDone();
  496. }
  497. /*----------------------------------------------------*/
  498. /*-------------3.0 reception module-------------------*/
  499. /*---------------PHYBusyIndication PHYIdleIndication--*/
  500. /*---------------RXStartIndication RXEndIndication----*/
  501. void Mac802_11Ext::handlePHYBusyIndication() {
  502. if (MAC_DBG)
  503. log("PHYBusyInd", "");
  504. csmgr.handlePHYBusyIndication();
  505. }
  506. void Mac802_11Ext::handlePHYIdleIndication() {
  507. if (MAC_DBG)
  508. log("PHYIdleInd", "");
  509. csmgr.handlePHYIdleIndication();
  510. }
  511. void Mac802_11Ext::handleRXStartIndication() {
  512. if (MAC_DBG)
  513. log("RxStartInd", "");
  514. }
  515. void Mac802_11Ext::handleRXEndIndication(Packet * pktRx_) {
  516. if (!pktRx_) {
  517. if (MAC_DBG)
  518. log("RxEndInd", "FAIL");
  519. csmgr.setIFS(eifs_);
  520. return;
  521. }
  522. if (MAC_DBG)
  523. log("RxEndInd", "SUCC");
  524. hdr_mac802_11 *mh = HDR_MAC802_11(pktRx_);
  525. u_int32_t dst= ETHER_ADDR(mh->dh_ra);
  526. u_int8_t type = mh->dh_fc.fc_type;
  527. u_int8_t subtype = mh->dh_fc.fc_subtype;
  528. csmgr.setIFS(difs_);
  529. if (tap_ && type == MAC_Type_Data&& MAC_Subtype_Data == subtype)
  530. tap_->tap(pktRx_);
  531. /*
  532.  * Address Filtering
  533.  */
  534. if (dst == (u_int32_t)index_ || dst == MAC_BROADCAST) {
  535. rxc.handleMsgFromBelow(pktRx_);
  536. } else {
  537. /*
  538.  *  We don't want to log this event, so we just free
  539.  *  the packet instead of calling the drop routine.
  540.  */
  541. if (MAC_DBG)
  542. log("RxEndInd", "NAV");
  543. csmgr.handleSetNAV(sec(mh->dh_duration));
  544. discard(pktRx_, "---");
  545. return;
  546. }
  547. }
  548. //-------------------4.0 transmission module----------------//
  549. //---------------------TxTimer and MAC handlers-------------//
  550. // this function is used by transmission module
  551. void Mac802_11Ext::transmit(Packet *p, TXConfirmCallback callback) {
  552. txConfirmCallback_=callback;
  553. // check memory leak? 
  554. if (MAC_DBG)
  555. log("Tx", "Start");
  556. downtarget_->recv(p->copy(), this);
  557. }
  558. void Mac802_11Ext::handleTXEndIndication() {
  559. if (MAC_DBG)
  560. log("Tx", "Fin");
  561. switch (txConfirmCallback_) {
  562. case Callback_TXC:
  563. txc.handleTXConfirm();
  564. break;
  565. case Callback_RXC:
  566. rxc.handleTXConfirm();
  567. break;
  568. default:
  569. cout<<"logic error at handleTXTimer"<<endl;
  570. }
  571. }
  572. /*-------------------5.0 protocol coodination module----------
  573.  ---------------------5.1 tx coordination----------------------
  574.  ---------------------TxTimeout and MAC handlers-------------*/
  575. // this function is used by tx coordination to prepare the MAC frame in detail
  576. void Mac802_11Ext::handleBKDone() {
  577. txc.handleBKDone();
  578. }
  579. // this function is used to handle the packets from the upper layer
  580. void Mac802_11Ext::recv(Packet *p, Handler *h) {
  581. struct hdr_cmn *hdr = HDR_CMN(p);
  582. /*
  583.  * Sanity Check
  584.  */
  585. assert(initialized());
  586. if (hdr->direction() == hdr_cmn::DOWN) {
  587. if (MAC_DBG)
  588. log("FROM_IFQ", "");
  589. // send(p, h); replaced by txc
  590. callback_=h;
  591. txc.handleMsgFromUp(p);
  592. return;
  593. } else {
  594. //the reception of a packet is moved to handleRXStart/EndIndication
  595. cout<<"logic error at recv, event sendUP"<<endl;
  596. }
  597. }
  598. //-------------------5.2 rx coordination----------------------------------//
  599. //------------------------------------------------------------------------//
  600. void Mac802_11Ext::recvDATA(Packet *p) {
  601. struct hdr_mac802_11 *dh = HDR_MAC802_11(p);
  602. u_int32_t dst, src, size;
  603. struct hdr_cmn *ch = HDR_CMN(p);
  604. dst = ETHER_ADDR(dh->dh_ra);
  605. src = ETHER_ADDR(dh->dh_ta);
  606. size = ch->size();
  607. ch->size() -= phymib_.getHdrLen11();
  608. ch->num_forwards() += 1;
  609. if (MAC_DBG)
  610. log("SEND_UP", "");
  611. uptarget_->recv(p, (Handler*) 0);
  612. }
  613. //-------------------6.0 txtime----------------------------------//
  614. //------------------------------------------------------------------------//
  615. /*
  616.  * txtime() - pluck the precomputed tx time from the packet header
  617.  */
  618. double Mac802_11Ext::txtime(Packet *p) {
  619. struct hdr_cmn *ch = HDR_CMN(p);
  620. double t = ch->txtime();
  621. if (t < 0.0) {
  622. drop(p, "XXX");
  623. exit(1);
  624. }
  625. return t;
  626. }
  627. /*
  628.  * txtime() - calculate tx time for packet of size "psz" bytes 
  629.  *   at rate "drt" bps
  630.  */
  631. double Mac802_11Ext::txtime(double psz, double drt) {
  632. int datalen = (int) psz << 3;
  633. double t = phymib_.getHeaderDuration() + (double)datalen/drt;
  634. return (t);
  635. }
  636. /*
  637.  * txtime() - calculate tx time for packet of size "psz" bytes 
  638.  *   with modulation scheme mod_scheme
  639.  *                this is the function used in reality
  640.  */
  641. double Mac802_11Ext::txtime(double psz, int mod_scheme) {
  642. int datalen = (int) psz << 3;
  643. int DBPS = modulation_table[mod_scheme].NDBPS;
  644. // 802.11p
  645. if (phymib_.use_802_11a()) {
  646. datalen = datalen + 16 + 6; // 16 SYMBOL BITS, 6 TAIL BITS
  647. }
  648. int symbols = (int)(ceil((double)datalen/DBPS)); // PADDING BITS, FILL SYMBOl
  649. double t = phymib_.getHeaderDuration() + (double) symbols
  650. * phymib_.getSymbolDuration();
  651. return (t);
  652. }
  653. /*new code ends here*/
  654. //-------tx coordination function-------//
  655. void TXC_CTSTimer::expire(Event *e) {
  656. txc_->handleTCTStimeout();
  657. }
  658. void TXC_SIFSTimer::expire(Event *e) {
  659. txc_->handleSIFStimeout();
  660. }
  661. void TXC_ACKTimer::expire(Event *e) {
  662. txc_->handleTACKtimeout();
  663. }
  664. TXC::TXC(Mac802_11Ext *m) :
  665. txcCTSTimer(this), txcSIFSTimer(this), txcACKTimer(this) {
  666. mac_=m;
  667. pRTS=0;
  668. pDATA=0;
  669. txc_state_=TXC_Idle;
  670. shortretrycounter = 0;
  671. longretrycounter = 0;
  672. // rtsretrycounter=0;
  673. // dataretrycounter=0;
  674. }
  675. void TXC::handleMsgFromUp(Packet *p) {
  676. if (mac_->MAC_DBG)
  677. mac_->log("TXC", "msgFromUp");
  678. pDATA=p;
  679. prepareMPDU(pDATA);
  680. hdr_mac802_11* mh = HDR_MAC802_11(pDATA);
  681. struct hdr_cmn *ch = HDR_CMN(pDATA);
  682. if ((u_int32_t)ETHER_ADDR(mh->dh_ra) != MAC_BROADCAST&& (unsigned int)(ch->size())
  683. >mac_->macmib_.getRTSThreshold()) //should get the right size //check type
  684. {
  685. if (mac_->MAC_DBG)
  686. mac_->log("TXC", "msgFromUp, RTS/CTS");
  687. generateRTSFrame(pDATA);
  688. }
  689. if (mac_->bkmgr.getBackoffMgrState()==noBackoff) {
  690. if (mac_->csmgr.getChannelState()==noCSnoNAV) {
  691. if (mac_->MAC_DBG)
  692. mac_->log("TXC", "msgFromUp, noBackoff, noCSnoNAV");
  693. if (pRTS!=0) {
  694. mac_->transmit(pRTS, Callback_TXC);
  695. setTXCState(TXC_wait_RTSsent);
  696. } else {
  697. mac_->transmit(pDATA, Callback_TXC);
  698. setTXCState(TXC_wait_PDUsent);
  699. }
  700. } else {
  701. if (mac_->MAC_DBG)
  702. mac_->log("TXC", "msgFromUp, Backoff started");
  703. mac_->bkmgr.handleBKStart(mac_->cw_);
  704. if (pRTS!=0) {
  705. setTXCState(TXC_RTS_pending);
  706. } else {
  707. setTXCState(TXC_DATA_pending);
  708. }
  709. }
  710. } else {
  711. if (mac_->MAC_DBG)
  712. mac_->log("TXC", "msgFromUp, Backoff pending");
  713. if (pRTS!=0) {
  714. setTXCState(TXC_RTS_pending);
  715. } else {
  716. setTXCState(TXC_DATA_pending);
  717. }
  718. }
  719. }
  720. void TXC::prepareMPDU(Packet *p) {
  721. hdr_cmn* ch = HDR_CMN(p);
  722. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  723. ch->size() += mac_->phymib_.getHdrLen11();
  724. dh->dh_fc.fc_protocol_version = MAC_ProtocolVersion;
  725. dh->dh_fc.fc_type = MAC_Type_Data;
  726. dh->dh_fc.fc_subtype = MAC_Subtype_Data;
  727. dh->dh_fc.fc_to_ds = 0;
  728. dh->dh_fc.fc_from_ds = 0;
  729. dh->dh_fc.fc_more_frag = 0;
  730. dh->dh_fc.fc_retry = 0;
  731. dh->dh_fc.fc_pwr_mgt = 0;
  732. dh->dh_fc.fc_more_data = 0;
  733. dh->dh_fc.fc_wep = 0;
  734. dh->dh_fc.fc_order = 0;
  735. ch->txtime() = mac_->txtime(ch->size(), ch->mod_scheme_);
  736. if ((u_int32_t)ETHER_ADDR(dh->dh_ra) != MAC_BROADCAST) {
  737. dh->dh_duration = mac_->usec(mac_->txtime(mac_->phymib_.getACKlen(),
  738. mac_->phymib_.getBasicModulationScheme())
  739. + mac_->macmib_.getSIFS());
  740. } else {
  741. dh->dh_duration = 0;
  742. }
  743. }
  744. void TXC::handleBKDone() {
  745. if (mac_->MAC_DBG)
  746. mac_->log("TXC", "BK Done");
  747. switch (txc_state_) {
  748. case TXC_RTS_pending:
  749. mac_->transmit(pRTS, Callback_TXC);
  750. setTXCState(TXC_wait_RTSsent);
  751. break;
  752. case TXC_DATA_pending:
  753. mac_->transmit(pDATA, Callback_TXC);
  754. setTXCState(TXC_wait_PDUsent);
  755. break;
  756. case TXC_Idle: //check : not in the SDL
  757. case TXC_wait_CTS:
  758. case TXC_wait_ACK:
  759. break;
  760. default:
  761. cout<<txc_state_<<endl;
  762. cout<<"logic error at TXC handling BKDone"<<endl;
  763. }
  764. }
  765. void TXC::handleTXConfirm() {
  766. if (mac_->MAC_DBG)
  767. mac_->log("TXC", "TX Confirm");
  768. hdr_mac802_11* mh = HDR_MAC802_11(pDATA);
  769. switch (txc_state_) {
  770. case TXC_wait_PDUsent:
  771. if ((u_int32_t)ETHER_ADDR(mh->dh_ra) != MAC_BROADCAST) {
  772. txcACKTimer.sched(mac_->macmib_.getSIFS()+ mac_->txtime(
  773. mac_->phymib_.getACKlen(),
  774. mac_->phymib_.getBasicModulationScheme())
  775. + DSSS_MaxPropagationDelay);
  776. setTXCState(TXC_wait_ACK);
  777. } else {
  778. mac_->bkmgr.handleBKStart(mac_->cw_);
  779. checkQueue();
  780. }
  781. break;
  782. case TXC_wait_RTSsent:
  783. txcCTSTimer.sched(mac_->macmib_.getSIFS()+ mac_->txtime(
  784. mac_->phymib_.getCTSlen(),
  785. mac_->phymib_.getBasicModulationScheme())
  786. + DSSS_MaxPropagationDelay);
  787. setTXCState(TXC_wait_CTS);
  788. break;
  789. default:
  790. cout<<"logic error at TXC handling txconfirm"<<endl;
  791. }
  792. }
  793. void TXC::checkQueue() {
  794. setTXCState(TXC_Idle);
  795. if (mac_->callback_) {
  796. if (mac_->MAC_DBG)
  797. mac_->log("TXC", "checkQueue, empty");
  798. Handler *h = mac_->callback_;
  799. mac_->callback_=0;
  800. h->handle((Event*) 0);
  801. } else {
  802. if (mac_->MAC_DBG)
  803. mac_->log("TXC", "checkQueue, pending");
  804. }
  805. }
  806. void TXC::handleCTSIndication() {
  807. if (mac_->MAC_DBG)
  808. mac_->log("TXC", "CTS indication");
  809. if (txc_state_==TXC_wait_CTS) {
  810. Packet::free(pRTS);
  811. pRTS = 0;
  812. txcCTSTimer.cancel();
  813. shortretrycounter = 0;
  814. setTXCState(TXC_wait_SIFS);
  815. txcSIFSTimer.sched(mac_->macmib_.getSIFS());
  816. } else {
  817. cout<<"txc_state_"<<txc_state_<<endl;
  818. cout<<"logic error at TXC handling CTS indication"<<endl;
  819. }
  820. }
  821. void TXC::handleTCTStimeout() {
  822. if (txc_state_==TXC_wait_CTS) {
  823. shortretrycounter++;
  824. mac_->inc_cw();
  825. if (shortretrycounter >= mac_->macmib_.getShortRetryLimit()) {
  826. if (mac_->MAC_DBG)
  827. mac_->log("TXC", "CTS timeout, limit reached");
  828. mac_->discard(pRTS, DROP_MAC_RETRY_COUNT_EXCEEDED);
  829. pRTS = 0;
  830. mac_->discard(pDATA, DROP_MAC_RETRY_COUNT_EXCEEDED);
  831. pDATA = 0;
  832. shortretrycounter = 0;
  833. longretrycounter = 0;
  834. mac_->cw_=mac_->macmib_.getCWMin();
  835. mac_->bkmgr.handleBKStart(mac_->cw_);
  836. checkQueue();
  837. } else {
  838. if (mac_->MAC_DBG)
  839. mac_->log("TXC", "CTS timeout, retry");
  840. setTXCState(TXC_RTS_pending);
  841. mac_->bkmgr.handleBKStart(mac_->cw_);
  842. }
  843. } else
  844. cout<<"logic error at TXC handleTCTS timeout"<<endl;
  845. }
  846. void TXC::handleSIFStimeout() {
  847. if (mac_->MAC_DBG)
  848. mac_->log("TXC", "SIFS finished");
  849. if (txc_state_==TXC_wait_SIFS) {
  850. mac_->transmit(pDATA, Callback_TXC);
  851. setTXCState(TXC_wait_PDUsent);
  852. } else
  853. cout<<"logic error at TXC handling SIFS timeout"<<endl;
  854. }
  855. void TXC::handleTACKtimeout() {
  856. if (txc_state_==TXC_wait_ACK) {
  857. hdr_mac802_11* mh = HDR_MAC802_11(pDATA);
  858. struct hdr_cmn *ch = HDR_CMN(pDATA);
  859. unsigned int limit = 0;
  860. unsigned int * counter;
  861. if ((unsigned int)ch->size() <= mac_->macmib_.getRTSThreshold()) {
  862. limit = mac_->macmib_.getShortRetryLimit();
  863. counter = &shortretrycounter;
  864. } else {
  865. limit = mac_->macmib_.getLongRetryLimit();
  866. counter = &longretrycounter;
  867. }
  868. (*counter)++;
  869. mac_->inc_cw();
  870. if (*counter >= limit) {
  871. if (mac_->MAC_DBG)
  872. mac_->log("TXC", "ACK timeout, limit reached");
  873. mac_->discard(pDATA, DROP_MAC_RETRY_COUNT_EXCEEDED);
  874. pDATA = 0;
  875. shortretrycounter = 0;
  876. longretrycounter = 0;
  877. mac_->cw_=mac_->macmib_.getCWMin();
  878. mac_->bkmgr.handleBKStart(mac_->cw_);
  879. checkQueue();
  880. } else {
  881. if (mac_->MAC_DBG)
  882. mac_->log("TXC", "ACK timeout, retry");
  883. if ((u_int32_t)ETHER_ADDR(mh->dh_ra) != MAC_BROADCAST&&(unsigned int)(ch->size())
  884. > mac_->macmib_.getRTSThreshold()) {
  885. generateRTSFrame(pDATA);
  886. setTXCState(TXC_RTS_pending);
  887. } else {
  888. setTXCState(TXC_DATA_pending);
  889. }
  890. mac_->bkmgr.handleBKStart(mac_->cw_);
  891. }
  892. } else
  893. cout<<"logic error at TXC handling TACK timeout"<<endl;
  894. }
  895. void TXC::generateRTSFrame(Packet * p) {
  896. Packet *rts = Packet::alloc();
  897. hdr_cmn* ch = HDR_CMN(rts);
  898. struct rts_frame *rf = (struct rts_frame*)rts->access(hdr_mac::offset_);
  899. ch->uid() = 0;
  900. ch->ptype() = PT_MAC;
  901. ch->size() = mac_->phymib_.getRTSlen();
  902. ch->iface() = -2;
  903. ch->error() = 0;
  904. ch->mod_scheme_= (ModulationScheme)mac_->phymib_.getBasicModulationScheme();
  905. bzero(rf, MAC_HDR_LEN);
  906. rf->rf_fc.fc_protocol_version = MAC_ProtocolVersion;
  907. rf->rf_fc.fc_type = MAC_Type_Control;
  908. rf->rf_fc.fc_subtype = MAC_Subtype_RTS;
  909. rf->rf_fc.fc_to_ds = 0;
  910. rf->rf_fc.fc_from_ds = 0;
  911. rf->rf_fc.fc_more_frag = 0;
  912. rf->rf_fc.fc_retry = 0;
  913. rf->rf_fc.fc_pwr_mgt = 0;
  914. rf->rf_fc.fc_more_data = 0;
  915. rf->rf_fc.fc_wep = 0;
  916. rf->rf_fc.fc_order = 0;
  917. struct hdr_mac802_11 *mh = HDR_MAC802_11(p);
  918. u_int32_t dst= ETHER_ADDR(mh->dh_ra);
  919. STORE4BYTE(&dst, (rf->rf_ra));
  920. STORE4BYTE(&(mac_->index_), (rf->rf_ta));
  921. ch->txtime() = mac_->txtime(ch->size(), ch->mod_scheme_);
  922. rf->rf_duration = mac_->usec(mac_->macmib_.getSIFS()
  923. + mac_->txtime(mac_->phymib_.getCTSlen(),
  924. mac_->phymib_.getBasicModulationScheme())
  925. + mac_->macmib_.getSIFS()+ mac_->txtime(p)+ mac_->macmib_.getSIFS()
  926. + mac_->txtime(mac_->phymib_.getACKlen(),
  927. mac_->phymib_.getBasicModulationScheme()));
  928. pRTS = rts;
  929. }
  930. void TXC::handleACKIndication() {
  931. if (mac_->MAC_DBG)
  932. mac_->log("TXC", "ACK indication");
  933. if (txc_state_==TXC_wait_ACK ) {
  934. txcACKTimer.cancel();
  935. shortretrycounter = 0;
  936. longretrycounter = 0;
  937. Packet::free(pDATA);
  938. pDATA=0;
  939. mac_->cw_=mac_->macmib_.getCWMin();
  940. mac_->bkmgr.handleBKStart(mac_->cw_);
  941. checkQueue();
  942. } else {
  943. cout<<"logic error at TXC handling ACKIndication"<<endl;
  944. cout<<txc_state_<<endl;
  945. }
  946. }
  947. void TXC::setTXCState(TXCState newstate) {
  948. if (mac_->MAC_DBG) {
  949. char msg [1000];
  950. sprintf(msg, "%d -> %d", txc_state_, newstate);
  951. if (mac_->MAC_DBG)
  952. mac_->log("TXCState", msg);
  953. }
  954. txc_state_=newstate;
  955. }
  956. //-------tx coordination-------//
  957. //-------rx coordination-------//
  958. void RXC_SIFSTimer::expire(Event *e) {
  959. rxc_->handleSIFStimeout();
  960. }
  961. RXC::RXC(Mac802_11Ext *m) :
  962. rxcSIFSTimer_(this) {
  963. mac_=m;
  964. pCTRL=0;
  965. rxc_state_=RXC_Idle;
  966. }
  967. void RXC::handleMsgFromBelow(Packet *p) {
  968. hdr_mac802_11* mh = HDR_MAC802_11(p);
  969. switch (mh->dh_fc.fc_type) {
  970. case MAC_Type_Control:
  971. switch (mh->dh_fc.fc_subtype) {
  972. case MAC_Subtype_ACK:
  973. if (mac_->MAC_DBG)
  974. mac_->log("RXC", "msgFromBelow: ACK");
  975. mac_->txc.handleACKIndication();
  976. mac_->mac_log(p);
  977. setRXCState(RXC_Idle);
  978. break;
  979. case MAC_Subtype_RTS:
  980. if (mac_->MAC_DBG)
  981. mac_->log("RXC", "msgFromBelow: RTS");
  982. if (mac_->csmgr.getChannelState()==CSNAV
  983. || mac_->csmgr.getChannelState()==noCSNAV) {
  984. setRXCState(RXC_Idle);
  985. mac_->mac_log(p);
  986. } else {
  987. generateCTSFrame(p);
  988. mac_->mac_log(p);
  989. rxcSIFSTimer_.sched(mac_->macmib_.getSIFS());
  990. setRXCState(RXC_wait_SIFS);
  991. }
  992. break;
  993. case MAC_Subtype_CTS:
  994. if (mac_->MAC_DBG)
  995. mac_->log("RXC", "msgFromBelow: CTS");
  996. mac_->txc.handleCTSIndication();
  997. mac_->mac_log(p);
  998. setRXCState(RXC_Idle);
  999. break;
  1000. default:
  1001. //
  1002. ;
  1003. }
  1004. break;
  1005. case MAC_Type_Data:
  1006. if (mac_->MAC_DBG)
  1007. mac_->log("RXC", "msgFromBelow: DATA");
  1008. switch (mh->dh_fc.fc_subtype) {
  1009. case MAC_Subtype_Data:
  1010. if ((u_int32_t)ETHER_ADDR(mh->dh_ra) == (u_int32_t)(mac_->index_)) {
  1011. generateACKFrame(p);
  1012. rxcSIFSTimer_.sched(mac_->macmib_.getSIFS());
  1013. mac_->recvDATA(p);
  1014. setRXCState(RXC_wait_SIFS);
  1015. } else {
  1016. mac_->recvDATA(p);
  1017. setRXCState(RXC_Idle);
  1018. }
  1019. break;
  1020. default:
  1021. cout<<"unkown mac data type"<<endl;
  1022. }
  1023. break;
  1024. default:
  1025. cout<<"logic error at handleincomingframe"<<endl;
  1026. }
  1027. }
  1028. void RXC::handleSIFStimeout() {
  1029. if (mac_->MAC_DBG)
  1030. mac_->log("RXC", "SIFS finished");
  1031. if (pCTRL != 0) {
  1032. mac_->transmit(pCTRL, Callback_RXC);
  1033. }
  1034. setRXCState(RXC_wait_sent);
  1035. }
  1036. void RXC::handleTXConfirm() {
  1037. Packet::free(pCTRL);
  1038. pCTRL = 0;
  1039. setRXCState(RXC_Idle);
  1040. }
  1041. void RXC::generateACKFrame(Packet *p) {
  1042. Packet *ack = Packet::alloc();
  1043. hdr_cmn* ch = HDR_CMN(ack);
  1044. struct ack_frame *af = (struct ack_frame*)ack->access(hdr_mac::offset_);
  1045. struct hdr_mac802_11 *dh = HDR_MAC802_11(p);
  1046. ch->uid() = 0;
  1047. ch->ptype() = PT_MAC;
  1048. ch->size() = mac_->phymib_.getACKlen();
  1049. ch->iface() = -2;
  1050. ch->error() = 0;
  1051. bzero(af, MAC_HDR_LEN);
  1052. af->af_fc.fc_protocol_version = MAC_ProtocolVersion;
  1053. af->af_fc.fc_type = MAC_Type_Control;
  1054. af->af_fc.fc_subtype = MAC_Subtype_ACK;
  1055. af->af_fc.fc_to_ds = 0;
  1056. af->af_fc.fc_from_ds = 0;
  1057. af->af_fc.fc_more_frag = 0;
  1058. af->af_fc.fc_retry = 0;
  1059. af->af_fc.fc_pwr_mgt = 0;
  1060. af->af_fc.fc_more_data = 0;
  1061. af->af_fc.fc_wep = 0;
  1062. af->af_fc.fc_order = 0;
  1063. u_int32_t dst = ETHER_ADDR(dh->dh_ta);
  1064. STORE4BYTE(&dst, (af->af_ra));
  1065. ch->txtime() = mac_->txtime(ch->size(),
  1066. mac_->phymib_.getBasicModulationScheme());
  1067. af->af_duration = 0;
  1068. pCTRL = ack;
  1069. }
  1070. void RXC::generateCTSFrame(Packet *p) {
  1071. Packet *cts = Packet::alloc();
  1072. hdr_cmn* ch = HDR_CMN(cts);
  1073. struct rts_frame *rf = (struct rts_frame*)p->access(hdr_mac::offset_);
  1074. struct cts_frame *cf = (struct cts_frame*)cts->access(hdr_mac::offset_);
  1075. ch->uid() = 0;
  1076. ch->ptype() = PT_MAC;
  1077. ch->size() = mac_->phymib_.getCTSlen();
  1078. ch->iface() = -2;
  1079. ch->error() = 0;
  1080. ch->mod_scheme_= (ModulationScheme)mac_->phymib_.getBasicModulationScheme();
  1081. bzero(cf, MAC_HDR_LEN);
  1082. cf->cf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1083. cf->cf_fc.fc_type = MAC_Type_Control;
  1084. cf->cf_fc.fc_subtype = MAC_Subtype_CTS;
  1085. cf->cf_fc.fc_to_ds = 0;
  1086. cf->cf_fc.fc_from_ds = 0;
  1087. cf->cf_fc.fc_more_frag = 0;
  1088. cf->cf_fc.fc_retry = 0;
  1089. cf->cf_fc.fc_pwr_mgt = 0;
  1090. cf->cf_fc.fc_more_data = 0;
  1091. cf->cf_fc.fc_wep = 0;
  1092. cf->cf_fc.fc_order = 0;
  1093. u_int32_t dst = ETHER_ADDR(rf->rf_ta);
  1094. STORE4BYTE(&dst, (cf->cf_ra));
  1095. ch->txtime() = mac_->txtime(ch->size(),
  1096. mac_->phymib_.getBasicModulationScheme());
  1097. cf->cf_duration = mac_->usec(mac_->sec(rf->rf_duration)
  1098. - mac_->macmib_.getSIFS()- mac_->txtime(mac_->phymib_.getCTSlen(),
  1099. mac_->phymib_.getBasicModulationScheme()));
  1100. pCTRL = cts;
  1101. }
  1102. void RXC::setRXCState(RXCState newstate) {
  1103. if (mac_->MAC_DBG) {
  1104. char msg [1000];
  1105. sprintf(msg, "%d -> %d", rxc_state_, newstate);
  1106. mac_->log("RXCState", msg);
  1107. }
  1108. rxc_state_=newstate;
  1109. }
  1110. //-------rx coordination-------//