mac-802_11.cc
上传用户:sdhqmy
上传日期:2015-12-07
资源大小:63k
文件大小:72k
源码类别:

3G开发

开发平台:

C/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.  * $Header: /nfs/jade/vint/CVSROOT/ns-2/mac/mac-802_11.cc,v 1.39 2002/03/14 01:12:53 haldar Exp $
  35.  *
  36.  * Ported from CMU/Monarch's code, nov'98 -Padma.
  37.  */
  38. #include "delay.h"
  39. #include "connector.h"
  40. #include "packet.h"
  41. #include "random.h"
  42. #include "mobilenode.h"
  43. // #define DEBUG 99
  44. #include "arp.h"
  45. #include "ll.h"
  46. #include "mac.h"
  47. #include "mac-timers.h"
  48. #include "mac-802_11.h"
  49. #include "cmu-trace.h"
  50. // XXX Can't we make these macros inline methods? Otherwise why should we have
  51. // inline methods at all??
  52. #define BEACON_BACKOFF_WINDOW  32
  53. //#define ATIM_WINDOW 0.02
  54. #define DEFAULT_CHANNEL 0
  55. #define CHECK_BACKOFF_TIMER()
  56. {
  57. if(is_idle() && mhBackoff_.paused())
  58. mhBackoff_.resume(difs_);
  59. if(! is_idle() && mhBackoff_.busy() && ! mhBackoff_.paused())
  60. mhBackoff_.pause();
  61. }
  62. #define TRANSMIT(p, t)                                                  
  63. {                                                                       
  64. tx_active_ = 1;                                                  
  65.                                                                         
  66.         /*                                                              
  67.          * If I'm transmitting without doing CS, such as when           
  68.          * sending an ACK, any incoming packet will be "missed"         
  69.          * and hence, must be discarded.                                
  70.          */                                                             
  71.         if(rx_state_ != MAC_IDLE) {                                      
  72.                 struct hdr_mac802_11 *dh = HDR_MAC802_11(p);                  
  73.                                                                         
  74.                 assert(dh->dh_fc.fc_type == MAC_Type_Control);          
  75.                 assert(dh->dh_fc.fc_subtype == MAC_Subtype_ACK);        
  76.                                                                         
  77.                 assert(pktRx_);                                          
  78.                 struct hdr_cmn *ch = HDR_CMN(pktRx_);                    
  79.                                                                         
  80.                 ch->error() = 1;        /* force packet discard */      
  81.         }                                                               
  82.                                                                         
  83.         /*                                                              
  84.          * pass the packet on the "interface" which will in turn        
  85.          * place the packet on the channel.                             
  86.          *                                                              
  87.          * NOTE: a handler is passed along so that the Network          
  88.          *       Interface can distinguish between incoming and         
  89.          *       outgoing packets.                                      
  90.          */                                                             
  91. downtarget_->recv(p->copy(), this);
  92.         mhSend_.start(t);                                                
  93.                                                                         
  94. mhIF_.start(txtime(p));                                         
  95. }
  96. //It was p->copy(), 8 lines above
  97. #define SET_RX_STATE(x)
  98. {
  99. rx_state_ = (x);
  100. CHECK_BACKOFF_TIMER();
  101. }
  102. #define SET_TX_STATE(x)
  103. {
  104. tx_state_ = (x);
  105. CHECK_BACKOFF_TIMER();
  106. }
  107. #define SET_DX_STATE(x)
  108. {
  109. dx_state_ = (x);
  110. CHECK_BACKOFF_TIMER();
  111. }
  112. /* ======================================================================
  113.    Global Variables
  114.    ====================================================================== */
  115. static PHY_MIB PMIB =
  116. {
  117. DSSS_CWMin, DSSS_CWMax, DSSS_SlotTime, DSSS_CCATime,
  118. DSSS_RxTxTurnaroundTime, DSSS_SIFSTime, DSSS_PreambleLength,
  119. DSSS_PLCPHeaderLength, DSSS_PLCPDataRate
  120. };
  121. static MAC_MIB MMIB =
  122. {
  123. MAC_RTSThreshold, MAC_ShortRetryLimit,
  124. MAC_LongRetryLimit, MAC_FragmentationThreshold,
  125. MAC_MaxTransmitMSDULifetime, MAC_MaxReceiveLifetime,
  126. //JUNGMIN
  127. 100 /* BeaconPeriod */, 20 /* ATIMWindowSize */,
  128. //end of JUNGMIN
  129. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  130. };
  131. /* ======================================================================
  132.    TCL Hooks for the simulator
  133.    ====================================================================== */
  134. static class Mac802_11Class : public TclClass {
  135. public:
  136. Mac802_11Class() : TclClass("Mac/802_11") {}
  137. TclObject* create(int, const char*const*) {
  138. return (new Mac802_11(&PMIB, &MMIB));
  139. }
  140. } class_mac802_11;
  141. /* ======================================================================
  142.    Mac Class Functions
  143.    ====================================================================== */
  144. Mac802_11::Mac802_11(PHY_MIB *p, MAC_MIB *m) : Mac(), mhIF_(this), mhNav_(this), mhRecv_(this), mhRecvDATA_(this), mhSend_(this), mhDefer_(this, p->SlotTime), mhBackoff_(this, p->SlotTime)
  145. //JUNGMIN
  146. ,mhBeacon_(this), mhBeaconBackoff_(this), mhATIMWindow_(this)
  147. ,mhWait_(this) 
  148. //end of JUNGMIN
  149. {
  150. macmib_ = m;
  151. phymib_ = p;
  152. nav_ = 0.0;
  153. //JUNGMIN
  154. mhChannelUsage_ = new ChannelUsageTimer[NUMBER_OF_CHANNELS](this);
  155. //initialize Free Channel List and Channel NAV
  156. for(int i=0; i<NUMBER_OF_CHANNELS; i++) {
  157. fcl_[i] = 0;
  158. dca_cul_[i] = 0.0;
  159. mhChannelUsage_[i].AssignChannel(i);
  160. }
  161. selected_channel_ = -1;
  162. active_channel_ = 0;
  163. ready_for_atim_ = 0;
  164. next_beacon_time_ = 0;
  165. recved_bytes_ = 0;
  166. ResetDestInfo();
  167. //end of JUNGMIN
  168. tx_state_ = rx_state_ = dx_state_ = MAC_IDLE;
  169. tx_active_ = 0;
  170. pktRTS_ = 0;
  171. pktCTRL_ = 0;
  172. pktRSH_ = 0;
  173. //JUNGMIN
  174. pktATIM_ = 0;
  175. pktATIMACK_ = 0;
  176. pktATIMRSH_ = 0;
  177. pktDx_ = 0;
  178. pktPending_ = 0;
  179. //end of JUNGMIN
  180. cw_ = phymib_->CWMin;
  181. ssrc_ = slrc_ = 0;
  182. //JUNGMIN
  183. sarc_ = 0;
  184. //end of JUNGMIN
  185. packet_count_ = 0;
  186. total_delay_ = 0.0;
  187. sifs_ = phymib_->SIFSTime;
  188. pifs_ = sifs_ + phymib_->SlotTime;
  189. difs_ = sifs_ + 2*phymib_->SlotTime;
  190. // see (802.11-1999, 9.2.10) 
  191. eifs_ = sifs_ + (8 * ETHER_ACK_LEN / phymib_->PLCPDataRate) + difs_;
  192. tx_sifs_ = sifs_ - phymib_->RxTxTurnaroundTime;
  193. tx_pifs_ = tx_sifs_ + phymib_->SlotTime;
  194. tx_difs_ = tx_sifs_ + 2 * phymib_->SlotTime;
  195. sta_seqno_ = 1;
  196. cache_ = 0;
  197. cache_node_count_ = 0;
  198. //JUNGMIN
  199. pc_ = 0;
  200. btbs_ = 0;
  201. atim_window_ = 0;
  202. dca_ = 0;
  203. //end of JUNGMIN
  204. // chk if basic/data rates are set
  205. // otherwise use bandwidth_ as default;
  206. Tcl& tcl = Tcl::instance();
  207. tcl.evalf("Mac/802_11 set basicRate_");
  208. if (strcmp(tcl.result(), "0") != 0) 
  209. bind_bw("basicRate_", &basicRate_);
  210. else
  211. basicRate_ = bandwidth_;
  212. tcl.evalf("Mac/802_11 set dataRate_");
  213. if (strcmp(tcl.result(), "0") != 0) 
  214. bind_bw("dataRate_", &dataRate_);
  215. else
  216. dataRate_ = bandwidth_;
  217. }
  218. int
  219. Mac802_11::command(int argc, const char*const* argv)
  220. {
  221. if (argc == 3) {
  222. if (strcmp(argv[1], "log-target") == 0) {
  223. logtarget_ = (NsObject*) TclObject::lookup(argv[2]);
  224. if(logtarget_ == 0)
  225. return TCL_ERROR;
  226. return TCL_OK;
  227. } else if(strcmp(argv[1], "nodes") == 0) {
  228. if(cache_) return TCL_ERROR;
  229. cache_node_count_ = atoi(argv[2]);
  230. cache_ = new Host[cache_node_count_ + 1];
  231. assert(cache_);
  232. bzero(cache_, sizeof(Host) * (cache_node_count_+1 ));
  233. return TCL_OK;
  234. }
  235. //JUNGMIN
  236. //Sets the beacon period
  237.   else if(strcmp(argv[1], "beaconperiod") == 0) {
  238. macmib_->dot11BeaconPeriod = atoi(argv[2]);
  239. return TCL_OK; 
  240. } else if(strcmp(argv[1], "atimwindowsize") == 0) {
  241. macmib_->dot11ATIMWindowSize = atoi(argv[2]);
  242. return TCL_OK;
  243. }
  244. }
  245. else if(argc == 2) {
  246. //Let this node be the Point Coordinator 
  247. if(strcmp(argv[1], "make-pc") == 0) {
  248. pc_ = 1;
  249. mhBeacon_.start(macmib_->dot11BeaconPeriod*0.001000);
  250. next_beacon_time_ = NOW + (macmib_->dot11BeaconPeriod * 0.001000);
  251. return TCL_OK;
  252. } else if(strcmp(argv[1], "recved_bytes") == 0) {
  253. printf("%dn", recved_bytes_);
  254. fflush(stdout);
  255. return TCL_OK;
  256. } else if(strcmp(argv[1], "average_delay") == 0) {
  257. if(packet_count_ != 0) {
  258. printf("%lfn", (total_delay_ / (double)packet_count_));
  259. } else {
  260. printf("");
  261. }
  262. fflush(stdout);
  263. return TCL_OK;
  264. } else if(strcmp(argv[1], "dca") == 0) {
  265. dca_ = 1;
  266. return TCL_OK;
  267. }
  268. //end of JUNGMIN
  269. }
  270. return Mac::command(argc, argv);
  271. }
  272. /* ======================================================================
  273.    Debugging Routines
  274.    ====================================================================== */
  275. void
  276. Mac802_11::trace_pkt(Packet *p) {
  277. struct hdr_cmn *ch = HDR_CMN(p);
  278. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  279. u_int16_t *t = (u_int16_t*) &dh->dh_fc;
  280. fprintf(stderr, "t[ %2x %2x %2x %2x ] %x %s %dn",
  281. *t, dh->dh_duration,
  282. ETHER_ADDR(dh->dh_da), ETHER_ADDR(dh->dh_sa),
  283. index_, packet_info.name(ch->ptype()), ch->size());
  284. }
  285. void
  286. Mac802_11::dump(char *fname)
  287. {
  288. fprintf(stderr,
  289. "n%s --- (INDEX: %d, time: %2.9f)n",
  290. fname, index_, Scheduler::instance().clock());
  291. fprintf(stderr,
  292. "ttx_state_: %x, rx_state_: %x, nav: %2.9f, idle: %dn",
  293. tx_state_, rx_state_, nav_, is_idle());
  294. fprintf(stderr,
  295. "tpktTx_: %x, pktRx_: %x, pktRTS_: %x, pktCTRL_: %x, callback: %xn",
  296. (int) pktTx_, (int) pktRx_, (int) pktRTS_,
  297. (int) pktCTRL_, (int) callback_);
  298. fprintf(stderr,
  299. "tDefer: %d, Backoff: %d (%d), Recv: %d, Timer: %d Nav: %dn",
  300. mhDefer_.busy(), mhBackoff_.busy(), mhBackoff_.paused(),
  301. mhRecv_.busy(), mhSend_.busy(), mhNav_.busy());
  302. fprintf(stderr,
  303. "tBackoff Expire: %fn",
  304. mhBackoff_.expire());
  305. }
  306. /* ======================================================================
  307.    Packet Headers Routines
  308.    ====================================================================== */
  309. inline int
  310. Mac802_11::hdr_dst(char* hdr, int dst )
  311. {
  312. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  313. //dst = (u_int32_t)(dst);
  314. if(dst > -2)
  315. STORE4BYTE(&dst, (dh->dh_da));
  316. return ETHER_ADDR(dh->dh_da);
  317. }
  318. inline int 
  319. Mac802_11::hdr_src(char* hdr, int src )
  320. {
  321. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  322. if(src > -2)
  323. STORE4BYTE(&src, (dh->dh_sa));
  324. return ETHER_ADDR(dh->dh_sa);
  325. }
  326. inline int 
  327. Mac802_11::hdr_type(char* hdr, u_int16_t type)
  328. {
  329. struct hdr_mac802_11 *dh = (struct hdr_mac802_11*) hdr;
  330. if(type)
  331. STORE2BYTE(&type,(dh->dh_body));
  332. return GET2BYTE(dh->dh_body);
  333. }
  334. /* ======================================================================
  335.    Misc Routines
  336.    ====================================================================== */
  337. inline int
  338. Mac802_11::is_idle()
  339. {
  340. if(rx_state_ != MAC_IDLE)
  341. return 0;
  342. if(tx_state_ != MAC_IDLE)
  343. return 0;
  344. if(dx_state_ != MAC_IDLE)
  345. return 0;
  346. if(nav_ > Scheduler::instance().clock())
  347. return 0;
  348. return 1;
  349. }
  350. inline int
  351. Mac802_11::is_channel_idle(int ch)
  352. {
  353. if(rx_state_ != MAC_IDLE)
  354. return 0;
  355. if(tx_state_ != MAC_IDLE)
  356. return 0;
  357. return 1;
  358. }
  359. void
  360. Mac802_11::discard(Packet *p, const char* why)
  361. {
  362. hdr_mac802_11* mh = HDR_MAC802_11(p);
  363. hdr_cmn *ch = HDR_CMN(p);
  364. #if 0
  365. /* old logic 8/8/98 -dam */
  366. /*
  367.  * If received below the RXThreshold, then just free.
  368.  */
  369. if(p->txinfo_.Pr < p->txinfo_.ant.RXThresh) {
  370. Packet::free(p);
  371. //p = 0;
  372. return;
  373. }
  374. #endif // 0
  375. /* if the rcvd pkt contains errors, a real MAC layer couldn't
  376.    necessarily read any data from it, so we just toss it now */
  377. if(ch->error() != 0) {
  378. Packet::free(p);
  379. //p = 0;
  380. return;
  381. }
  382. switch(mh->dh_fc.fc_type) {
  383. case MAC_Type_Management:
  384. //drop(p, why);
  385. break;
  386. case MAC_Type_Control:
  387. switch(mh->dh_fc.fc_subtype) {
  388. case MAC_Subtype_DRTS:
  389. case MAC_Subtype_RTS:
  390. if((u_int32_t)ETHER_ADDR(mh->dh_sa) == 
  391.    (u_int32_t)index_) {
  392. drop(p, why);
  393. return;
  394. }
  395. /* fall through - if necessary */
  396. case MAC_Subtype_DCTS:
  397. case MAC_Subtype_DRSH:
  398. case MAC_Subtype_CTS:
  399. case MAC_Subtype_ACK:
  400. if((u_int32_t)ETHER_ADDR(mh->dh_da) == 
  401.    (u_int32_t)index_) {
  402. drop(p, why);
  403. return;
  404. }
  405. break;
  406. default:
  407. fprintf(stderr, "invalid MAC Control subtypen");
  408. exit(1);
  409. }
  410. break;
  411. case MAC_Type_Data:
  412. switch(mh->dh_fc.fc_subtype) {
  413. case MAC_Subtype_Data:
  414. if((u_int32_t)ETHER_ADDR(mh->dh_da) == 
  415.    (u_int32_t)index_ ||
  416.    (u_int32_t)ETHER_ADDR(mh->dh_sa) == 
  417.    (u_int32_t)index_ ||
  418.    (u_int32_t)ETHER_ADDR(mh->dh_da) == MAC_BROADCAST) {
  419. drop(p);
  420. return;
  421. }
  422. break;
  423. default:
  424. fprintf(stderr, "invalid MAC Data subtypen");
  425. exit(1);
  426. }
  427. break;
  428. default:
  429. fprintf(stderr, "invalid MAC type (%x)n", mh->dh_fc.fc_type);
  430. trace_pkt(p);
  431. exit(1);
  432. }
  433. Packet::free(p);
  434. }
  435. void
  436. Mac802_11::capture(Packet *p)
  437. {
  438. /*
  439.  * Update the NAV so that this does not screw
  440.  * up carrier sense.
  441.  */
  442. set_nav(usec(eifs_ + txtime(p)));
  443. Packet::free(p);
  444. }
  445. void
  446. Mac802_11::collision(Packet *p)
  447. {
  448. switch(rx_state_) {
  449. case MAC_RECV:
  450. SET_RX_STATE(MAC_COLL);
  451. /* fall through */
  452. case MAC_COLL:
  453. assert(pktRx_);
  454. assert(mhRecv_.busy());
  455. /*
  456.  *  Since a collision has occurred, figure out
  457.  *  which packet that caused the collision will
  458.  *  "last" the longest.  Make this packet,
  459.  *  pktRx_ and reset the Recv Timer if necessary.
  460.  */
  461. if(txtime(p) > mhRecv_.expire()) {
  462. mhRecv_.stop();
  463. discard(pktRx_, DROP_MAC_COLLISION);
  464. pktRx_ = p;
  465. mhRecv_.start(txtime(pktRx_));
  466. }
  467. else {
  468. discard(p, DROP_MAC_COLLISION);
  469. }
  470. break;
  471. default:
  472. assert(0);
  473. }
  474. }
  475. //JUNGMIN
  476. //When a node becomes available to transmit a packet, it checks whether
  477. //there is a packet that needs to be sent.
  478. //end of JUNGMIN
  479. void
  480. Mac802_11::tx_resume()
  481. {
  482. assert(mhSend_.busy() == 0);
  483. assert(mhDefer_.busy() == 0);
  484. //JUNGMIN
  485. if(btbs_) {
  486. btbs_ = 0;
  487. send_beacon();
  488. }
  489. //end of JUNGMIN
  490. //Shouldn't we use else if?
  491. if(pktCTRL_) {
  492. //printf("[%d] tx_resume(): Control Packet Ready.n", index_); 
  493. /*
  494.  *  Need to send a CTS or ACK.
  495.  */
  496. mhDefer_.start(sifs_);
  497. //JUNGMIN
  498. else if(pktATIMRSH_) {
  499. mhDefer_.start(sifs_);
  500. }
  501. else if(pktATIMACK_) {
  502. mhDefer_.start(sifs_);
  503. }
  504. else if(pktPCF_) {
  505. if(mhBackoff_.busy()) {
  506. mhBackoff_.stop();
  507. }
  508. mhDefer_.start(sifs_);
  509. }
  510. else if(pktATIM_) {
  511. if(mhBackoff_.busy() == 0) 
  512. mhDefer_.start(difs_);
  513. }
  514. //end of JUNGMIN
  515. else if(pktRTS_) { 
  516. if(mhBackoff_.busy() == 0)
  517. mhDefer_.start(difs_);
  518. } else if(pktTx_) {
  519. if(mhBackoff_.busy() == 0)
  520. {
  521. hdr_cmn *ch = HDR_CMN(pktTx_);
  522. struct hdr_mac802_11 *mh = HDR_MAC802_11(pktTx_);
  523. if ((u_int32_t) ch->size() < macmib_->RTSThreshold ||
  524.     (u_int32_t) ETHER_ADDR(mh->dh_da) == MAC_BROADCAST) {
  525. mhDefer_.start(difs_);
  526. } else {
  527. //JUNGMIN
  528. //this is because there has been RTS/CTS exchange
  529. //end of JUNGMIN
  530. mhDefer_.start(sifs_);
  531. }
  532. }
  533. //JUNGMIN
  534. //because of this callback, send function can just return if it is during
  535. //backoff. Here callback is Interface Queue.
  536. //end of JUNGMIN
  537. } else if(callback_) {
  538. Handler *h = callback_;
  539. callback_ = 0;
  540. if(pktPending_ != 0 && mhWait_.busy() == 0) {
  541. Packet *p = pktPending_;
  542. pktPending_ = 0;
  543. send(p, h);
  544. } else {
  545. h->handle((Event*) 0);
  546. }
  547. }
  548. SET_TX_STATE(MAC_IDLE);
  549. }
  550. void
  551. Mac802_11::rx_resume()
  552. {
  553. assert(pktRx_ == 0);
  554. assert(mhRecv_.busy() == 0);
  555. SET_RX_STATE(MAC_IDLE);
  556. }
  557. void
  558. Mac802_11::dx_resume()
  559. {
  560. assert(pktDx_ == 0);
  561. assert(mhRecvDATA_.busy() == 0);
  562. SET_DX_STATE(MAC_IDLE);
  563. }
  564. /* ======================================================================
  565.    Timer Handler Routines
  566.    ====================================================================== */
  567. void
  568. Mac802_11::backoffHandler()
  569. {
  570. if(pktCTRL_) {
  571. assert(mhSend_.busy() || mhDefer_.busy());
  572. return;
  573. }
  574. if(check_pktPCF() == 0)
  575. return;
  576. if(pktATIMRSH_) {
  577. return;
  578. }
  579. if(pktATIMACK_) {
  580. return;
  581. }
  582. //JUNGMIN
  583. if(check_pktATIM() == 0)
  584. return;
  585. //end of JUNGMIN
  586. if(pktTx_) {
  587. if(atim_window_ == 1 || NearBeacon(pktTx_, 1)) {
  588. ll_->ifq()->ReturnPacket(pktTx_);
  589. if(pktRTS_ != 0) 
  590. Packet::free(pktRTS_); pktRTS_ = 0;
  591. pktTx_ = 0;
  592. }
  593. }
  594. if(check_pktRTS() == 0)
  595. return;
  596. if(check_pktTx() == 0)
  597. return;
  598. }
  599. void
  600. Mac802_11::deferHandler()
  601. {
  602. //JUNGMIN
  603. assert(pktCTRL_ || pktRTS_ || pktTx_ || pktPCF_ || pktATIM_ || pktATIMACK_ || pktATIMRSH_);
  604. //end of JUNGMIN
  605. if(check_pktCTRL() == 0)
  606. return;
  607. if(check_pktPCF() == 0)
  608. return;
  609. //JUNGMIN
  610. if(check_pktATIMRSH() == 0)
  611. return;
  612. if(check_pktATIMACK() == 0)
  613. return;
  614. if(check_pktATIM() == 0)
  615. return;
  616. //end of JUNGMIN
  617. assert(mhBackoff_.busy() == 0);
  618. if(check_pktRTS() == 0)
  619. return;
  620. if(check_pktTx() == 0)
  621. return;
  622. }
  623. void
  624. Mac802_11::navHandler()
  625. {
  626. if(is_idle() && mhBackoff_.paused())
  627. mhBackoff_.resume(difs_);
  628. }
  629. void
  630. Mac802_11::channelusageHandler(int ch)
  631. {
  632. if(ch < NUMBER_OF_CHANNELS) {
  633. dca_cul_[ch] = 0;
  634. } else {
  635. printf("ERROR: Trying to access non-existing channeln");
  636. }
  637. }
  638. void
  639. Mac802_11::waitHandler()
  640. {
  641. }
  642. //JUNGMIN
  643. void
  644. Mac802_11::atimHandler()
  645. {
  646. atim_window_ = 0;
  647. ready_for_atim_ = 0;
  648. if(selected_channel_ == -1) active_channel_ = 0; //Default channel
  649. else active_channel_ = selected_channel_;
  650. if(index_ < 18 && index_ >= 0) {
  651. }
  652. if(btbs_) {
  653. btbs_ = 0;
  654. }
  655. if(callback_ == 0) {
  656. ll_->ifq()->ResetATIMWindow(1);
  657. }
  658. else {
  659. ll_->ifq()->ResetATIMWindow(0);
  660. }
  661. //status parameter 0: not idle 1: idle
  662. // if idle, this function should callback the queue
  663. // explicitly to send packets. 
  664. }
  665. //end of JUNGMIN
  666. void
  667. Mac802_11::recvHandler()
  668. {
  669. recv_timer();
  670. }
  671. void
  672. Mac802_11::recvDATAHandler()
  673. {
  674. recvDATA_timer();
  675. }
  676. void
  677. Mac802_11::sendHandler()
  678. {
  679. send_timer();
  680. }
  681. void
  682. Mac802_11::txHandler()
  683. {
  684. tx_active_ = 0;
  685. }
  686. //JUNGMIN
  687. void
  688. Mac802_11::beaconHandler()
  689. {
  690. //Schedule the next beacon
  691. mhBeacon_.start(macmib_->dot11BeaconPeriod*0.001000);
  692. next_beacon_time_ = NOW + (macmib_->dot11BeaconPeriod * 0.001000);
  693. ResetAtBeacon();
  694. SetATIMWindow();
  695. if(mhATIMWindow_.busy())
  696. mhATIMWindow_.stop();
  697. mhATIMWindow_.start(macmib_->dot11ATIMWindowSize*0.001000);
  698. //Distribute Beacon
  699. //Instead of sending beacon right away, wait for a certain amount of time.
  700. prepare_beacon();
  701. }
  702. void
  703. Mac802_11::beaconBackoffHandler()
  704. {
  705. //printf("[%d] %lf: beaconBackoffHandler Called.n", index_, NOW);
  706. send_beacon();
  707. }
  708. //end of JUNGMIN
  709. /* ======================================================================
  710.    The "real" Timer Handler Routines
  711.    ====================================================================== */
  712. void
  713. Mac802_11::send_timer()
  714. {
  715. switch(tx_state_) {
  716. case MAC_ATIM:
  717. RetransmitATIM();
  718. break;
  719. case MAC_ATIMACK:
  720. assert(pktATIMACK_);
  721. Packet::free(pktATIMACK_); pktATIMACK_ = 0;
  722. break;
  723. case MAC_ATIMRSH:
  724. assert(pktATIMRSH_);
  725. Packet::free(pktATIMRSH_); pktATIMRSH_ = 0;
  726. break;
  727. /*
  728.  * Sent a RTS, but did not receive a CTS.
  729.  */
  730. case MAC_RTS:
  731. RetransmitRTS();
  732. break;
  733. /*
  734.  * Sent a CTS, but did not receive a DATA packet.
  735.  */
  736. case MAC_CTS:
  737. assert(pktCTRL_);
  738. Packet::free(pktCTRL_); pktCTRL_ = 0;
  739. break;
  740. /*
  741.  * Sent DATA, but did not receive an ACK packet.
  742.  */
  743. case MAC_SEND:
  744. if(pktRSH_) {
  745. Packet::free(pktRSH_); pktRSH_ = 0;
  746. //only for now
  747. RetransmitDATA();
  748. } else {
  749. RetransmitDATA();
  750. }
  751. break;
  752. /*
  753.  * Sent an ACK, and now ready to resume transmission.
  754.  */
  755. case MAC_ACK:
  756. assert(pktCTRL_);
  757. Packet::free(pktCTRL_); pktCTRL_ = 0;
  758. break;
  759. //JUNGMIN
  760. case MAC_BEACONING:
  761. if(pktPCF_) {
  762. Packet::free(pktPCF_); pktPCF_ = 0;
  763. }
  764. break;
  765. //end of JUNGMIN
  766. case MAC_IDLE:
  767. break;
  768. default:
  769. assert(0);
  770. }
  771. tx_resume();
  772. }
  773. /* ======================================================================
  774.    Outgoing Packet Routines
  775.    ====================================================================== */
  776. int
  777. Mac802_11::check_pktCTRL()
  778. {
  779. struct hdr_mac802_11 *mh;
  780. double timeout;
  781. if(pktCTRL_ == 0)
  782. return -1;
  783. if(tx_state_ == MAC_CTS || tx_state_ == MAC_ACK)
  784. return -1;
  785. mh = HDR_MAC802_11(pktCTRL_);
  786. struct dca_cts_frame *dcts;
  787.   
  788. switch(mh->dh_fc.fc_subtype) {
  789. /*
  790.  *  If the medium is not IDLE, don't send the CTS.
  791.  */
  792. case MAC_Subtype_CTS:
  793. if(!is_idle()) {
  794. discard(pktCTRL_, DROP_MAC_BUSY); pktCTRL_ = 0;
  795. return 0;
  796. }
  797. SET_TX_STATE(MAC_CTS);
  798. /*
  799.  * timeout:  cts + data tx time calculated by
  800.  *           adding cts tx time to the cts duration
  801.  *           minus ack tx time -- this timeout is
  802.  *           a guess since it is unspecified
  803.  *           (note: mh->dh_duration == cf->cf_duration)
  804.  */
  805. timeout = txtime(ETHER_CTS_LEN, basicRate_)
  806. + DSSS_MaxPropagationDelay // XXX
  807. + sec(mh->dh_duration)
  808. + DSSS_MaxPropagationDelay // XXX
  809. - sifs_
  810. - txtime(ETHER_ACK_LEN, basicRate_);
  811. break;
  812. /*
  813.  * IEEE 802.11 specs, section 9.2.8
  814.  * Acknowledments are sent after an SIFS, without regard to
  815.  * the busy/idle state of the medium.
  816.  */
  817. case MAC_Subtype_DCTS:
  818. if(!is_idle()) {
  819. discard(pktCTRL_, DROP_MAC_BUSY); pktCTRL_ = 0;
  820. return 0;
  821. }
  822. SET_TX_STATE(MAC_CTS);
  823. dcts = (struct dca_cts_frame*)pktCTRL_->access(hdr_mac::offset_);
  824. timeout = txtime(ETHER_DCTS_LEN, basicRate_)
  825. + DSSS_MaxPropagationDelay
  826. + dcts->dcts_usage_time
  827. + sifs_
  828. + DSSS_MaxPropagationDelay
  829. + DSSS_MaxPropagationDelay;
  830. if(dcts->dcts_selected_channel == -1) {
  831. timeout = txtime(ETHER_DCTS_LEN, basicRate_);
  832. }
  833. break;
  834. case MAC_Subtype_ACK:
  835. SET_TX_STATE(MAC_ACK);
  836. timeout = txtime(ETHER_ACK_LEN, basicRate_);
  837. break;
  838. default:
  839. fprintf(stderr, "check_pktCTRL:Invalid MAC Control subtypen");
  840. exit(1);
  841. }
  842. //JUNGMIN
  843. if(mh->dh_fc.fc_subtype == MAC_Subtype_CTS) {
  844. }
  845. else if(mh->dh_fc.fc_subtype == MAC_Subtype_DCTS) {
  846. }
  847. else if(mh->dh_fc.fc_subtype == MAC_Subtype_ACK) {
  848. }
  849. //end of JUNGMIN
  850.         TRANSMIT(pktCTRL_, timeout);
  851. return 0;
  852. }
  853. //JUNGMIN
  854. int
  855. Mac802_11::check_pktATIMACK()
  856. {
  857. struct hdr_mac802_11 *mh;
  858. double timeout;
  859. if(pktATIMACK_ == 0)
  860. return -1;
  861. if(tx_state_ == MAC_ATIMACK)
  862. return -1;
  863. mh = HDR_MAC802_11(pktATIMACK_);
  864. switch(mh->dh_fc.fc_subtype) {
  865. case MAC_Subtype_ATIMACK:
  866. SET_TX_STATE(MAC_ATIMACK);
  867. timeout = txtime(ETHER_ATIMACK_LEN, basicRate_) ;
  868. break;
  869. default:
  870. fprintf(stderr, "check_pktATIMACK: Invalid MAC Management subtypen");
  871. exit(1);
  872. }
  873. TRANSMIT(pktATIMACK_, timeout);
  874. return 0;
  875. }
  876. int
  877. Mac802_11::check_pktATIMRSH()
  878. {
  879. struct hdr_mac802_11 *mh;
  880. double timeout;
  881. if(pktATIMRSH_ == 0)
  882. return -1;
  883. if(tx_state_ == MAC_ATIMRSH)
  884. return -1;
  885. mh = HDR_MAC802_11(pktATIMRSH_);
  886. switch(mh->dh_fc.fc_subtype) {
  887. case MAC_Subtype_ATIMRSH:
  888. SET_TX_STATE(MAC_ATIMRSH);
  889. timeout = txtime(ETHER_ATIMRSH_LEN, basicRate_) ;
  890. break;
  891. default:
  892. fprintf(stderr, "check_pktATIMRSH: Invalid MAC Management subtypen");
  893. exit(1);
  894. }
  895. TRANSMIT(pktATIMRSH_, timeout);
  896. return 0;
  897. }
  898. //end of JUNGMIN
  899. int
  900. Mac802_11::check_pktRTS()
  901. {
  902. struct hdr_mac802_11 *mh;
  903. double timeout;
  904. assert(mhBackoff_.busy() == 0);
  905. if(pktRTS_ == 0)
  906.   return -1;
  907. mh = HDR_MAC802_11(pktRTS_);
  908. struct dca_rts_frame *drts;
  909.   switch(mh->dh_fc.fc_subtype) {
  910. case MAC_Subtype_RTS:
  911. if(! is_idle()) {
  912. inc_cw();
  913. mhBackoff_.start(cw_, is_idle());
  914. return 0;
  915. }
  916. SET_TX_STATE(MAC_RTS);
  917. timeout = txtime(ETHER_RTS_LEN, basicRate_)
  918. + DSSS_MaxPropagationDelay // XXX
  919. + sifs_
  920. + txtime(ETHER_CTS_LEN, basicRate_)
  921. + DSSS_MaxPropagationDelay; // XXX
  922. break;
  923. case MAC_Subtype_DRTS:
  924. if(! is_idle()) {
  925. inc_cw();
  926. mhBackoff_.start(cw_, is_idle());
  927. return 0;
  928. }
  929. SET_TX_STATE(MAC_RTS);
  930. timeout = txtime(ETHER_DRTS_LEN, basicRate_)
  931. + DSSS_MaxPropagationDelay // XXX
  932. + sifs_
  933. + txtime(ETHER_DCTS_LEN, basicRate_)
  934. + DSSS_MaxPropagationDelay; // XXX
  935. drts = (struct dca_rts_frame*)pktRTS_->access(hdr_mac::offset_);
  936. DCABuildFreeChannelList(drts->drts_channel_list);
  937. break;
  938. default:
  939. fprintf(stderr, "check_pktRTS:Invalid MAC Control subtypen");
  940. exit(1);
  941. }
  942.         TRANSMIT(pktRTS_, timeout);
  943. return 0;
  944. }
  945. int
  946. Mac802_11::check_pktATIM()
  947. {
  948. struct hdr_mac802_11 *mh;
  949. double timeout;
  950. assert(mhBackoff_.busy() == 0);
  951. if(pktATIM_ == 0)
  952. return -1;
  953. mh = HDR_MAC802_11(pktATIM_);
  954. struct atim_frame *atf = (struct atim_frame*)pktATIM_->access(hdr_mac::offset_);
  955. switch(mh->dh_fc.fc_subtype) {
  956. case MAC_Subtype_ATIM:
  957. if(!is_idle()) {
  958. inc_cw();
  959. mhBackoff_.start(cw_, is_idle());
  960. return 0;
  961. }
  962. SET_TX_STATE(MAC_ATIM);
  963. timeout = txtime(ETHER_ATIM_LEN, basicRate_)
  964. + DSSS_MaxPropagationDelay
  965. + sifs_
  966. + txtime(ETHER_ATIMACK_LEN, basicRate_)
  967. + DSSS_MaxPropagationDelay;
  968. break;
  969. default:
  970. fprintf(stderr, "check_pktATIM: Invalid MAC Management subtypen");
  971. exit(1);
  972. }
  973. //copying my fcl_ onto the packet (SHOULD BE AS CLOSEST AS POSSIBLE TO ACTUAL SEND)
  974. for(int j=0; j<NUMBER_OF_CHANNELS; j++) {
  975. atf->atf_channel_list[j] = fcl_[j];
  976. }
  977. TRANSMIT(pktATIM_, timeout);
  978. return 0;
  979. }
  980. int
  981. Mac802_11::check_pktTx()
  982. {
  983. struct hdr_mac802_11 *mh;
  984. double timeout;
  985. assert(mhBackoff_.busy() == 0);
  986. if(pktTx_ == 0)
  987. return -1;
  988. //if DCA mode, send DRSH also at the same time in different channel
  989. mh = HDR_MAC802_11(pktTx_);
  990.         int len = HDR_CMN(pktTx_)->size();
  991. struct hdr_cmn *ch = HDR_CMN(pktTx_);
  992. switch(mh->dh_fc.fc_subtype) {
  993. case MAC_Subtype_Data:
  994. if(! is_idle()) {
  995. if(dca_) {
  996. sendDRTS(ETHER_ADDR(mh->dh_da));
  997. } else {
  998. sendRTS(ETHER_ADDR(mh->dh_da));
  999. }
  1000. inc_cw();
  1001. mhBackoff_.start(cw_, is_idle());
  1002. return 0;
  1003. }
  1004. SET_TX_STATE(MAC_SEND);
  1005. if((u_int32_t)ETHER_ADDR(mh->dh_da) != MAC_BROADCAST)
  1006. timeout = txtime(pktTx_)
  1007. + DSSS_MaxPropagationDelay // XXX
  1008. + sifs_
  1009. + txtime(ETHER_ACK_LEN, basicRate_)
  1010. + DSSS_MaxPropagationDelay; // XXX
  1011. else
  1012. timeout = txtime(pktTx_);
  1013. break;
  1014. default:
  1015. fprintf(stderr, "check_pktTx:Invalid MAC Control subtypen");
  1016. exit(1);
  1017. }
  1018. if(dca_) {
  1019. if((u_int32_t)ETHER_ADDR(mh->dh_da) != MAC_BROADCAST) {
  1020. if(active_channel_ == DEFAULT_CHANNEL || active_channel_ < 0) {
  1021. printf("ERROR: Cannot send data on this channel!n");
  1022. exit(1);
  1023. } else {
  1024. mh->dh_fc.fc_channel = active_channel_;
  1025. }
  1026. } else {
  1027. mh->dh_fc.fc_channel = DEFAULT_CHANNEL;
  1028. }
  1029. } else {
  1030. if(active_channel_ != -1)
  1031. mh->dh_fc.fc_channel = active_channel_;
  1032. else
  1033. mh->dh_fc.fc_channel = DEFAULT_CHANNEL;
  1034. }
  1035. if(dca_) {
  1036. if((u_int32_t)ETHER_ADDR(mh->dh_da) != MAC_BROADCAST) {
  1037. //TRANSMIT(pktRSH_, 0.0);
  1038. }
  1039. }
  1040.         TRANSMIT(pktTx_, timeout);
  1041. return 0;
  1042. }
  1043. //JUNGMIN
  1044. int
  1045. Mac802_11::check_pktPCF()
  1046. {
  1047. struct hdr_mac802_11 *mh;
  1048. double timeout;
  1049. //assert(mhBackoff_.busy() == 0);
  1050. if(pktPCF_ == 0)
  1051. return -1;
  1052. mh = HDR_MAC802_11(pktPCF_);
  1053. int len = HDR_CMN(pktPCF_)->size();
  1054. switch(mh->dh_fc.fc_type) {
  1055. case MAC_Type_Management:
  1056. switch(mh->dh_fc.fc_subtype) {
  1057. case MAC_Subtype_Beacon:
  1058. if(!is_idle())
  1059. return -1;
  1060. struct beacon_frame *beacon = (struct beacon_frame *)pktPCF_->access(hdr_mac::offset_);
  1061. timeout = txtime(pktPCF_);
  1062. SET_TX_STATE(MAC_BEACONING);
  1063. }
  1064. break;
  1065. default:
  1066. fprintf(stderr, "check_pktPCF:Invalid MAC (sub)typen");
  1067. exit(1);
  1068. }
  1069. TRANSMIT(pktPCF_, timeout);
  1070. //set a flag saying I sent a beacon
  1071. //It is also set when I receive the beacon
  1072. //This is to start sending ATIMs
  1073. if(ready_for_atim_ == 0) {
  1074. ready_for_atim_ = 1;
  1075. ll_->ifq()->StartSendingATIM();
  1076. }
  1077. return 0;
  1078. }
  1079. //end of JUNGMIN
  1080. /*
  1081.  * Low-level transmit functions that actually place the packet onto
  1082.  * the channel.
  1083.  */
  1084. void
  1085. Mac802_11::sendRTS(int dst)
  1086. {
  1087. Packet *p = Packet::alloc();
  1088. hdr_cmn* ch = HDR_CMN(p);
  1089. struct rts_frame *rf = (struct rts_frame*)p->access(hdr_mac::offset_);
  1090. //just for checking
  1091. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  1092. // sendDATA should be called before sendRTS
  1093. // this is to make sure that RTS be sent only when DATA is ready to be sent.
  1094. assert(pktTx_);
  1095. assert(pktRTS_ == 0);
  1096. /*
  1097.  *  If the size of the packet is larger than the
  1098.  *  RTSThreshold, then perform the RTS/CTS exchange.
  1099.  *
  1100.  *  XXX: also skip if destination is a broadcast
  1101.  */
  1102. if( (u_int32_t) HDR_CMN(pktTx_)->size() < macmib_->RTSThreshold ||
  1103.     (u_int32_t) dst == MAC_BROADCAST) {
  1104. Packet::free(p);
  1105. //p = 0;
  1106. return;
  1107. }
  1108. ch->uid() = 0;
  1109. ch->ptype() = PT_MAC;
  1110. ch->size() = ETHER_RTS_LEN;
  1111. ch->iface() = -2;
  1112. ch->error() = 0;
  1113. bzero(rf, MAC_HDR_LEN);
  1114. rf->rf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1115.   rf->rf_fc.fc_type = MAC_Type_Control;
  1116.   rf->rf_fc.fc_subtype = MAC_Subtype_RTS;
  1117.   rf->rf_fc.fc_to_ds = 0;
  1118.   rf->rf_fc.fc_from_ds = 0;
  1119.   rf->rf_fc.fc_more_frag = 0;
  1120.   rf->rf_fc.fc_retry = 0;
  1121.   rf->rf_fc.fc_pwr_mgt = 0;
  1122.   rf->rf_fc.fc_more_data = 0;
  1123.   rf->rf_fc.fc_wep = 0;
  1124.   rf->rf_fc.fc_order = 0;
  1125. if(active_channel_ != -1) {
  1126. rf->rf_fc.fc_channel = active_channel_;
  1127. }
  1128. else
  1129. rf->rf_fc.fc_channel = DEFAULT_CHANNEL;
  1130. //rf->rf_duration = RTS_DURATION(pktTx_);
  1131. STORE4BYTE(&dst, (rf->rf_ra));
  1132. /* store rts tx time */
  1133.   ch->txtime() = txtime(ch->size(), basicRate_);
  1134. STORE4BYTE(&index_, (rf->rf_ta));
  1135. /* calculate rts duration field */
  1136. rf->rf_duration = usec(sifs_
  1137.        + txtime(ETHER_CTS_LEN, basicRate_)
  1138.        + sifs_
  1139.        + txtime(pktTx_)
  1140.        + sifs_
  1141.        + txtime(ETHER_ACK_LEN, basicRate_));
  1142. pktRTS_ = p;
  1143. }
  1144. void
  1145. Mac802_11::sendDRTS(int dst)
  1146. {
  1147. Packet *p = Packet::alloc();
  1148. hdr_cmn* ch = HDR_CMN(p);
  1149. struct dca_rts_frame *drts = (struct dca_rts_frame*)p->access(hdr_mac::offset_);
  1150. assert(pktTx_);
  1151. assert(pktRTS_);
  1152. if( (u_int32_t) HDR_CMN(pktTx_)->size() < macmib_->RTSThreshold ||
  1153.             (u_int32_t) dst == MAC_BROADCAST) {
  1154. Packet::free(p);
  1155. return;
  1156. }
  1157. ch->uid() = 0;
  1158. ch->ptype() = PT_MAC;
  1159. ch->size() = ETHER_DRTS_LEN;
  1160. ch->iface() = -2;
  1161. ch->error() = 0;
  1162. bzero(drts, MAC_HDR_LEN);
  1163. drts->drts_fc.fc_protocol_version = MAC_ProtocolVersion;
  1164. drts->drts_fc.fc_type  = MAC_Type_Control;
  1165. drts->drts_fc.fc_subtype = MAC_Subtype_DRTS;
  1166. drts->drts_fc.fc_to_ds = 0;
  1167. drts->drts_fc.fc_from_ds = 0;
  1168. drts->drts_fc.fc_more_frag = 0;
  1169. drts->drts_fc.fc_retry = 0;
  1170. drts->drts_fc.fc_pwr_mgt = 0;
  1171. drts->drts_fc.fc_more_data = 0;
  1172. drts->drts_fc.fc_wep = 0;
  1173. drts->drts_fc.fc_order = 0;
  1174. drts->drts_fc.fc_channel = DEFAULT_CHANNEL;
  1175. STORE4BYTE(&dst, (drts->drts_da));
  1176. ch->txtime() = txtime(ch->size(), basicRate_);
  1177. STORE4BYTE(&index_, (drts->drts_sa));
  1178. drts->drts_duration = usec(sifs_
  1179. + txtime(ETHER_DCTS_LEN, basicRate_)
  1180. + sifs_
  1181. + txtime(ETHER_DRSH_LEN, basicRate_));
  1182. drts->drts_data_transfer_time = txtime(pktTx_);
  1183. pktRTS_ = p;
  1184. }
  1185. //JUNGMIN
  1186. void
  1187. Mac802_11::InsertDestState(int dst)
  1188. {
  1189. if(dst < 0 || dst > MAX_NODES) return;
  1190. dest_state_[dst] = 1;
  1191. return;
  1192. }
  1193. void
  1194. Mac802_11::InsertNeighborChannelState(int dst, int channel)
  1195. {
  1196. if(dst < 0 || dst > MAX_NODES) return;
  1197. channel_state_[dst] = channel;
  1198. return;
  1199. }
  1200. int
  1201. Mac802_11::LookupDestState(int dst)
  1202. {
  1203. if(dst < 0) return 0;
  1204. return dest_state_[dst];
  1205. }
  1206. int
  1207. Mac802_11::NearBeacon(Packet* p, int afterbackoff)
  1208. {
  1209. //if it is near beacon, return 1
  1210. if(pc_ == 0) return 0;
  1211. //if afterbackoff is 1, then exclude the first difs
  1212. hdr_cmn* ch = HDR_CMN(p);
  1213. int size = ch->size() + ETHER_HDR_LEN11;
  1214. double left_time = next_beacon_time_ - NOW;
  1215. double estimated_time = txtime(ETHER_RTS_LEN, basicRate_)
  1216. + sifs_
  1217. + txtime(ETHER_CTS_LEN, basicRate_)
  1218. + sifs_
  1219. + txtime(size, basicRate_)
  1220. + sifs_
  1221. + txtime(ETHER_ACK_LEN, basicRate_);
  1222. if(afterbackoff == 0) estimated_time += difs_;
  1223. if(estimated_time > left_time) {
  1224. return 1;
  1225. }
  1226. else return 0;
  1227. }
  1228. void 
  1229. Mac802_11::sendATIM(int dst, Handler* h)
  1230. {
  1231. //see if it has previously sent an ATIM to that particular destination
  1232. int prev = LookupDestState(dst);
  1233. if(prev == 1) return;
  1234. Packet *p = Packet::alloc();
  1235. hdr_cmn* ch = HDR_CMN(p);
  1236. struct atim_frame *atf = (struct atim_frame*)p->access(hdr_mac::offset_);
  1237. assert(pktATIM_ == 0);
  1238. ch->uid() = 0;
  1239. ch->ptype() = PT_MAC;
  1240. ch->size() = ETHER_ATIM_LEN;
  1241. ch->iface() = -2;
  1242. ch->error() = 0;
  1243. bzero(atf, MAC_HDR_LEN);
  1244. atf->atf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1245. atf->atf_fc.fc_type = MAC_Type_Management;
  1246. atf->atf_fc.fc_subtype = MAC_Subtype_ATIM;
  1247. atf->atf_fc.fc_to_ds = 0;
  1248. atf->atf_fc.fc_from_ds = 0;
  1249. atf->atf_fc.fc_more_frag = 0;
  1250. atf->atf_fc.fc_retry = 0;
  1251. atf->atf_fc.fc_pwr_mgt = 0;
  1252. atf->atf_fc.fc_more_data = 0;
  1253. atf->atf_fc.fc_wep = 0;
  1254. atf->atf_fc.fc_order = 0;
  1255. atf->atf_fc.fc_channel = DEFAULT_CHANNEL;
  1256. STORE4BYTE(&dst, (atf->atf_da));
  1257. ch->txtime() = txtime(ch->size(), basicRate_);
  1258. STORE4BYTE(&index_, (atf->atf_sa));
  1259. atf->atf_duration = usec(sifs_
  1260. + txtime(ETHER_ATIMACK_LEN, basicRate_)
  1261. + sifs_
  1262. + txtime(ETHER_ATIMRSH_LEN, basicRate_));
  1263. //set callback to get back to the queue
  1264. callback_ = h;
  1265. pktATIM_ = p;
  1266. EnergyModel *em = netif_->node()->energy_model();
  1267. if(em && em->sleep()) {
  1268. em->set_node_sleep(0);
  1269. em->set_node_state(EnergyModel::INROUTE);
  1270. }
  1271. if(mhBackoff_.busy() == 0) {
  1272. if(is_idle()) {
  1273. if(mhDefer_.busy() == 0)
  1274. mhDefer_.start(difs_);
  1275. }
  1276. else {
  1277. mhBackoff_.start(cw_, is_idle());
  1278. }
  1279. }
  1280. }
  1281. //end of JUNGMIN
  1282. void
  1283. Mac802_11::sendCTS(int dst, double rts_duration)
  1284. {
  1285. Packet *p = Packet::alloc();
  1286. hdr_cmn* ch = HDR_CMN(p);
  1287. struct cts_frame *cf = (struct cts_frame*)p->access(hdr_mac::offset_);
  1288. assert(pktCTRL_ == 0);
  1289. ch->uid() = 0;
  1290. ch->ptype() = PT_MAC;
  1291. ch->size() = ETHER_CTS_LEN;
  1292. ch->iface() = -2;
  1293. ch->error() = 0;
  1294. //ch->direction() = hdr_cmn::DOWN;
  1295. bzero(cf, MAC_HDR_LEN);
  1296. cf->cf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1297. cf->cf_fc.fc_type = MAC_Type_Control;
  1298. cf->cf_fc.fc_subtype = MAC_Subtype_CTS;
  1299.   cf->cf_fc.fc_to_ds = 0;
  1300.   cf->cf_fc.fc_from_ds = 0;
  1301.   cf->cf_fc.fc_more_frag = 0;
  1302.   cf->cf_fc.fc_retry = 0;
  1303.   cf->cf_fc.fc_pwr_mgt = 0;
  1304.   cf->cf_fc.fc_more_data = 0;
  1305.   cf->cf_fc.fc_wep = 0;
  1306.   cf->cf_fc.fc_order = 0;
  1307. if(active_channel_ != -1)
  1308. cf->cf_fc.fc_channel = active_channel_;
  1309. else
  1310. cf->cf_fc.fc_channel = DEFAULT_CHANNEL;
  1311. //cf->cf_duration = CTS_DURATION(rts_duration);
  1312. STORE4BYTE(&dst, (cf->cf_ra));
  1313. /* store cts tx time */
  1314. ch->txtime() = txtime(ch->size(), basicRate_);
  1315. /* calculate cts duration */
  1316. cf->cf_duration = usec(sec(rts_duration)
  1317.        - sifs_
  1318.        - txtime(ETHER_CTS_LEN, basicRate_));
  1319. pktCTRL_ = p;
  1320. }
  1321. //JUNGMIN
  1322. void
  1323. Mac802_11::sendDRSH(int dst, double dcts_usage_time)
  1324. {
  1325. Packet *p = Packet::alloc();
  1326. hdr_cmn* ch = HDR_CMN(p);
  1327. struct dca_rsh_frame *drsh = (struct dca_rsh_frame*)p->access(hdr_mac::offset_);
  1328. ch->uid() = 0;
  1329. ch->ptype() = PT_MAC;
  1330. ch->size() = ETHER_DRSH_LEN;
  1331. ch->iface() = -2;
  1332. ch->error() = 0;
  1333. bzero(drsh, MAC_HDR_LEN);
  1334. drsh->drsh_fc.fc_protocol_version = MAC_ProtocolVersion;
  1335.   drsh->drsh_fc.fc_type = MAC_Type_Management;
  1336.   drsh->drsh_fc.fc_subtype = MAC_Subtype_DRSH;
  1337.   drsh->drsh_fc.fc_to_ds = 0;
  1338.   drsh->drsh_fc.fc_from_ds = 0;
  1339.   drsh->drsh_fc.fc_more_frag = 0;
  1340.   drsh->drsh_fc.fc_retry = 0;
  1341.   drsh->drsh_fc.fc_pwr_mgt = 0;
  1342.   drsh->drsh_fc.fc_more_data = 0;
  1343.   drsh->drsh_fc.fc_wep = 0;
  1344. drsh->drsh_fc.fc_order = 0;
  1345. drsh->drsh_fc.fc_channel = DEFAULT_CHANNEL;
  1346. STORE4BYTE(&dst, (drsh->drsh_ra));
  1347. ch->txtime() = txtime(ch->size(), basicRate_);
  1348. drsh->drsh_duration = 0;
  1349. drsh->drsh_confirmed_channel = active_channel_;
  1350. drsh->drsh_usage_time = dcts_usage_time
  1351. - sifs_
  1352. - txtime(ETHER_DRSH_LEN, basicRate_);
  1353. //update dca_cul_
  1354. DCAUpdateCUL(active_channel_, dcts_usage_time);
  1355. pktRSH_ = p;
  1356. }
  1357. void
  1358. Mac802_11::sendDCTS(int dst, double data_transfer_time)
  1359. {
  1360. Packet *p = Packet::alloc();
  1361. hdr_cmn* ch = HDR_CMN(p);
  1362. struct dca_cts_frame *dcts = (struct dca_cts_frame*)p->access(hdr_mac::offset_);
  1363. assert(pktCTRL_ == 0);
  1364. ch->uid() = 0;
  1365. ch->ptype() = PT_MAC;
  1366. ch->size() = ETHER_DCTS_LEN;
  1367. ch->iface() = -2;
  1368. ch->error() = 0;
  1369. //ch->direction() = hdr_cmn::DOWN;
  1370. bzero(dcts, MAC_HDR_LEN);
  1371. dcts->dcts_fc.fc_protocol_version = MAC_ProtocolVersion;
  1372. dcts->dcts_fc.fc_type = MAC_Type_Control;
  1373. dcts->dcts_fc.fc_subtype = MAC_Subtype_DCTS;
  1374.   dcts->dcts_fc.fc_to_ds = 0;
  1375.   dcts->dcts_fc.fc_from_ds = 0;
  1376.   dcts->dcts_fc.fc_more_frag = 0;
  1377.   dcts->dcts_fc.fc_retry = 0;
  1378.   dcts->dcts_fc.fc_pwr_mgt = 0;
  1379.   dcts->dcts_fc.fc_more_data = 0;
  1380.   dcts->dcts_fc.fc_wep = 0;
  1381.   dcts->dcts_fc.fc_order = 0;
  1382. dcts->dcts_fc.fc_channel = DEFAULT_CHANNEL;
  1383. //cf->cf_duration = CTS_DURATION(rts_duration);
  1384. STORE4BYTE(&dst, (dcts->dcts_ra));
  1385. /* store cts tx time */
  1386. ch->txtime() = txtime(ch->size(), basicRate_);
  1387. /* calculate cts duration */
  1388. dcts->dcts_duration = usec(sifs_ 
  1389.        + txtime(ETHER_DRSH_LEN, basicRate_));
  1390. dcts->dcts_usage_time = sifs_
  1391. + data_transfer_time
  1392. + sifs_
  1393. + txtime(ETHER_ACK_LEN, basicRate_);
  1394. active_channel_ = DCASelectChannel(dca_recved_fcl_);
  1395. dcts->dcts_selected_channel = active_channel_;
  1396. if(dcts->dcts_selected_channel != -1) {
  1397. dcts->dcts_wait_time = 0.0;
  1398. //update dca_cul_
  1399. DCAUpdateCUL(active_channel_, dcts->dcts_usage_time + txtime(ETHER_DCTS_LEN, basicRate_) + sifs_);
  1400. } else {
  1401. dcts->dcts_wait_time = FindNearestChannelFreeTime();
  1402. }
  1403. pktCTRL_ = p;
  1404. }
  1405. //end of JUNGMIN
  1406. void
  1407. Mac802_11::sendACK(int dst)
  1408. {
  1409. Packet *p = Packet::alloc();
  1410. hdr_cmn* ch = HDR_CMN(p);
  1411. struct ack_frame *af = (struct ack_frame*)p->access(hdr_mac::offset_);
  1412. assert(pktCTRL_ == 0);
  1413. ch->uid() = 0;
  1414. ch->ptype() = PT_MAC;
  1415. ch->size() = ETHER_ACK_LEN;
  1416. ch->iface() = -2;
  1417. ch->error() = 0;
  1418. bzero(af, MAC_HDR_LEN);
  1419. af->af_fc.fc_protocol_version = MAC_ProtocolVersion;
  1420.   af->af_fc.fc_type = MAC_Type_Control;
  1421.   af->af_fc.fc_subtype = MAC_Subtype_ACK;
  1422.   af->af_fc.fc_to_ds = 0;
  1423.   af->af_fc.fc_from_ds = 0;
  1424.   af->af_fc.fc_more_frag = 0;
  1425.   af->af_fc.fc_retry = 0;
  1426.   af->af_fc.fc_pwr_mgt = 0;
  1427.   af->af_fc.fc_more_data = 0;
  1428.   af->af_fc.fc_wep = 0;
  1429.   af->af_fc.fc_order = 0;
  1430. if(dca_ == 0) {
  1431. if(active_channel_ != -1)
  1432. af->af_fc.fc_channel = active_channel_;
  1433. else
  1434. af->af_fc.fc_channel = DEFAULT_CHANNEL;
  1435. } else {
  1436. if(active_channel_ == -1 || active_channel_ == DEFAULT_CHANNEL) {
  1437. printf("ERROR: cannot send packet on this channel!n");
  1438. exit(1);
  1439. }
  1440. else {
  1441. af->af_fc.fc_channel = active_channel_;
  1442. }
  1443. }
  1444. //af->af_duration = ACK_DURATION();
  1445. STORE4BYTE(&dst, (af->af_ra));
  1446. /* store ack tx time */
  1447.   ch->txtime() = txtime(ch->size(), basicRate_);
  1448. /* calculate ack duration */
  1449.   af->af_duration = 0;
  1450. pktCTRL_ = p;
  1451. }
  1452. //JUNGMIN
  1453. void
  1454. Mac802_11::sendATIMACK(int dst)
  1455. {
  1456. Packet *p = Packet::alloc();
  1457. hdr_cmn* ch = HDR_CMN(p);
  1458. struct atimack_frame *aaf = (struct atimack_frame*)p->access(hdr_mac::offset_);
  1459. assert(pktATIMACK_ == 0);
  1460. ch->uid() = 0;
  1461. ch->ptype() = PT_MAC;
  1462. ch->size() = ETHER_ATIMACK_LEN;
  1463. ch->iface() = -2;
  1464. ch->error() = 0;
  1465. bzero(aaf, MAC_HDR_LEN);
  1466. aaf->aaf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1467.   aaf->aaf_fc.fc_type = MAC_Type_Management;
  1468.   aaf->aaf_fc.fc_subtype = MAC_Subtype_ATIMACK;
  1469.   aaf->aaf_fc.fc_to_ds = 0;
  1470.   aaf->aaf_fc.fc_from_ds = 0;
  1471.   aaf->aaf_fc.fc_more_frag = 0;
  1472.   aaf->aaf_fc.fc_retry = 0;
  1473.   aaf->aaf_fc.fc_pwr_mgt = 0;
  1474.   aaf->aaf_fc.fc_more_data = 0;
  1475.   aaf->aaf_fc.fc_wep = 0;
  1476. aaf->aaf_fc.fc_order = 0;
  1477. aaf->aaf_fc.fc_channel = DEFAULT_CHANNEL;
  1478. STORE4BYTE(&dst, (aaf->aaf_ra));
  1479. STORE4BYTE(&index_, (aaf->aaf_sa));
  1480. ch->txtime() = txtime(ch->size(), basicRate_);
  1481. aaf->aaf_duration = usec(sifs_
  1482. + txtime(ETHER_ATIMRSH_LEN, basicRate_));
  1483. aaf->aaf_selected_channel = selected_channel_;
  1484. pktATIMACK_ = p;
  1485. }
  1486. void
  1487. Mac802_11::sendATIMRSH(int dst)
  1488. {
  1489. Packet *p = Packet::alloc();
  1490. hdr_cmn* ch = HDR_CMN(p);
  1491. struct atimrsh_frame *ahf = (struct atimrsh_frame*)p->access(hdr_mac::offset_);
  1492. assert(pktATIMRSH_ == 0);
  1493. ch->uid() = 0;
  1494. ch->ptype() = PT_MAC;
  1495. ch->size() = ETHER_ATIMRSH_LEN;
  1496. ch->iface() = -2;
  1497. ch->error() = 0;
  1498. bzero(ahf, MAC_HDR_LEN);
  1499. ahf->ahf_fc.fc_protocol_version = MAC_ProtocolVersion;
  1500.   ahf->ahf_fc.fc_type = MAC_Type_Management;
  1501.   ahf->ahf_fc.fc_subtype = MAC_Subtype_ATIMRSH;
  1502.   ahf->ahf_fc.fc_to_ds = 0;
  1503.   ahf->ahf_fc.fc_from_ds = 0;
  1504.   ahf->ahf_fc.fc_more_frag = 0;
  1505.   ahf->ahf_fc.fc_retry = 0;
  1506.   ahf->ahf_fc.fc_pwr_mgt = 0;
  1507.   ahf->ahf_fc.fc_more_data = 0;
  1508.   ahf->ahf_fc.fc_wep = 0;
  1509. ahf->ahf_fc.fc_order = 0;
  1510. ahf->ahf_fc.fc_channel = DEFAULT_CHANNEL;
  1511. STORE4BYTE(&dst, (ahf->ahf_ra));
  1512. ch->txtime() = txtime(ch->size(), basicRate_);
  1513. ahf->ahf_duration = 0;
  1514. ahf->ahf_confirmed_channel = selected_channel_;
  1515. pktATIMRSH_ = p;
  1516. }
  1517. //end of JUNGMIN
  1518. void
  1519. Mac802_11::sendDATA(Packet *p)
  1520. {
  1521. hdr_cmn* ch = HDR_CMN(p);
  1522. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  1523. assert(pktTx_ == 0);
  1524. /*
  1525.  * Update the MAC header
  1526.  */
  1527. ch->size() += ETHER_HDR_LEN11;
  1528. dh->dh_fc.fc_protocol_version = MAC_ProtocolVersion;
  1529. dh->dh_fc.fc_type       = MAC_Type_Data;
  1530. dh->dh_fc.fc_subtype    = MAC_Subtype_Data;
  1531. //printf(".....p = %x, mac-subtype-%dn",p,dh->dh_fc.fc_subtype);
  1532. dh->dh_fc.fc_to_ds      = 0;
  1533. dh->dh_fc.fc_from_ds    = 0;
  1534. dh->dh_fc.fc_more_frag  = 0;
  1535. dh->dh_fc.fc_retry      = 0;
  1536. dh->dh_fc.fc_pwr_mgt    = 0;
  1537. dh->dh_fc.fc_more_data  = 0;
  1538. dh->dh_fc.fc_wep        = 0;
  1539. dh->dh_fc.fc_order      = 0;
  1540. if(active_channel_ != -1)
  1541. dh->dh_fc.fc_channel = active_channel_;
  1542. else
  1543. dh->dh_fc.fc_channel = DEFAULT_CHANNEL;
  1544. /* store data tx time */
  1545.   ch->txtime() = txtime(ch->size(), dataRate_);
  1546. if((u_int32_t)ETHER_ADDR(dh->dh_da) != MAC_BROADCAST) {
  1547. /* store data tx time for unicast packets */
  1548. ch->txtime() = txtime(ch->size(), dataRate_);
  1549. //dh->dh_duration = DATA_DURATION();
  1550. dh->dh_duration = usec(txtime(ETHER_ACK_LEN, basicRate_)
  1551.          + sifs_);
  1552. } else {
  1553. /* store data tx time for broadcast packets (see 9.6) */
  1554. ch->txtime() = txtime(ch->size(), basicRate_);
  1555. dh->dh_duration = 0;
  1556. }
  1557. pktTx_ = p;
  1558. }
  1559. /* ======================================================================
  1560.    Retransmission Routines
  1561.    ====================================================================== */
  1562. void
  1563. Mac802_11::RetransmitRTS()
  1564. {
  1565. //printf("[%d] %lf: Retransmitting RTSn", index_, NOW);
  1566. assert(pktTx_);
  1567. assert(pktRTS_);
  1568. assert(mhBackoff_.busy() == 0);
  1569. macmib_->RTSFailureCount++;
  1570. ssrc_ += 1; // STA Short Retry Count
  1571. if(ssrc_ >= macmib_->ShortRetryLimit) {
  1572. discard(pktRTS_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktRTS_ = 0;
  1573. /* tell the callback the send operation failed 
  1574.    before discarding the packet */
  1575. hdr_cmn *ch = HDR_CMN(pktTx_);
  1576. if (ch->xmit_failure_) {
  1577.                         /*
  1578.                          *  Need to remove the MAC header so that 
  1579.                          *  re-cycled packets don't keep getting
  1580.                          *  bigger.
  1581.                          */
  1582.                         ch->size() -= ETHER_HDR_LEN11;
  1583.                         ch->xmit_reason_ = XMIT_REASON_RTS;
  1584.                         ch->xmit_failure_(pktTx_->copy(),
  1585.                                           ch->xmit_failure_data_);
  1586.                 }
  1587. //printf("(%d)....discarding RTS:%xn",index_,pktRTS_);
  1588. discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktTx_ = 0;
  1589. ssrc_ = 0;
  1590. rst_cw();
  1591. } else if (atim_window_ == 1) {
  1592. discard(pktRTS_, DROP_END_OF_BEACON_INTERVAL); pktRTS_ = 0;
  1593. hdr_cmn *ch = HDR_CMN(pktTx_);
  1594. if(ch->xmit_failure_) {
  1595. ch->size() -= ETHER_HDR_LEN11;
  1596. ch->xmit_reason_ = XMIT_REASON_RTS;
  1597. ch->xmit_failure_(pktTx_->copy(), 
  1598.   ch->xmit_failure_data_);
  1599. }
  1600. discard(pktTx_, DROP_END_OF_BEACON_INTERVAL); pktTx_ = 0;
  1601. ssrc_ = 0;
  1602. rst_cw();
  1603. } else {
  1604. //printf("(%d)...retxing RTS:%xn",index_,pktRTS_);
  1605. struct rts_frame *rf;
  1606. struct dca_rts_frame* drts;
  1607. if(dca_ == 0) {
  1608. rf = (struct rts_frame*)pktRTS_->access(hdr_mac::offset_);
  1609. rf->rf_fc.fc_retry = 1;
  1610. if(active_channel_ != -1)
  1611. rf->rf_fc.fc_channel = active_channel_;
  1612. else
  1613. rf->rf_fc.fc_channel = DEFAULT_CHANNEL;
  1614. } else {
  1615. drts = (struct dca_rts_frame*)pktRTS_->access(hdr_mac::offset_);
  1616. drts->drts_fc.fc_retry = 1;
  1617. drts->drts_fc.fc_channel = DEFAULT_CHANNEL;
  1618. }
  1619. inc_cw();
  1620. mhBackoff_.start(cw_, is_idle());
  1621. }
  1622. }
  1623. //JUNGMIN
  1624. void
  1625. Mac802_11::RetransmitATIM()
  1626. {
  1627. assert(pktATIM_);
  1628. assert(mhBackoff_.busy() == 0);
  1629. sarc_ += 1;
  1630. //Hardcoding Retry Limit to 3
  1631. if(sarc_ >= 3) {
  1632. discard(pktATIM_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktATIM_ = 0;
  1633. sarc_ = 0;
  1634. rst_cw();
  1635. } else if(atim_window_ == 0) {
  1636. discard(pktATIM_, DROP_END_OF_ATIM_WINDOW); pktATIM_ = 0;
  1637. sarc_ = 0;
  1638. rst_cw();
  1639. } else {
  1640. struct atim_frame *atf;
  1641. atf = (struct atim_frame*)pktATIM_->access(hdr_mac::offset_);
  1642. atf->atf_fc.fc_retry = 1;
  1643. if(active_channel_ != -1)
  1644. atf->atf_fc.fc_channel = active_channel_;
  1645. else
  1646. atf->atf_fc.fc_channel = DEFAULT_CHANNEL;
  1647. inc_cw();
  1648. mhBackoff_.start(cw_, is_idle());
  1649. }
  1650. }
  1651. //end of JUNGMIN
  1652. void
  1653. Mac802_11::RetransmitDATA()
  1654. {
  1655. //printf("[%d] %lf: Retransmit DATAn", index_, NOW);
  1656. struct hdr_cmn *ch;
  1657. struct hdr_mac802_11 *mh;
  1658. u_int32_t *rcount, *thresh;
  1659. assert(mhBackoff_.busy() == 0);
  1660. assert(pktTx_);
  1661. assert(pktRTS_ == 0);
  1662. ch = HDR_CMN(pktTx_);
  1663. mh = HDR_MAC802_11(pktTx_);
  1664. /*
  1665.  *  Broadcast packets don't get ACKed and therefore
  1666.  *  are never retransmitted.
  1667.  */
  1668. if((u_int32_t)ETHER_ADDR(mh->dh_da) == MAC_BROADCAST) {
  1669. Packet::free(pktTx_); pktTx_ = 0;
  1670. /*
  1671.  * Backoff at end of TX.
  1672.  */
  1673. rst_cw();
  1674. mhBackoff_.start(cw_, is_idle());
  1675. return;
  1676. }
  1677. macmib_->ACKFailureCount++;
  1678. if((u_int32_t) ch->size() <= macmib_->RTSThreshold) {
  1679. rcount = &ssrc_;
  1680. thresh = &macmib_->ShortRetryLimit;
  1681. }
  1682. else {
  1683. rcount = &slrc_;
  1684. thresh = &macmib_->LongRetryLimit;
  1685. }
  1686. (*rcount)++;
  1687. if(*rcount > *thresh) {
  1688. macmib_->FailedCount++;
  1689. /* tell the callback the send operation failed 
  1690.    before discarding the packet */
  1691. hdr_cmn *ch = HDR_CMN(pktTx_);
  1692. if (ch->xmit_failure_) {
  1693.                         ch->size() -= ETHER_HDR_LEN11;
  1694.                         ch->xmit_reason_ = XMIT_REASON_ACK;
  1695.                         ch->xmit_failure_(pktTx_->copy(),
  1696.                                           ch->xmit_failure_data_);
  1697.                 }
  1698. discard(pktTx_, DROP_MAC_RETRY_COUNT_EXCEEDED); pktTx_ = 0;
  1699. *rcount = 0;
  1700. rst_cw();
  1701. } else if( atim_window_ == 1 ) {
  1702. macmib_->FailedCount++;
  1703. hdr_cmn *ch = HDR_CMN(pktTx_);
  1704. if(ch->xmit_failure_) {
  1705. ch->size() -= ETHER_HDR_LEN11;
  1706. ch->xmit_reason_ = XMIT_REASON_ACK;
  1707. ch->xmit_failure_(pktTx_->copy(),
  1708.   ch->xmit_failure_data_);
  1709. }
  1710. discard(pktTx_, DROP_END_OF_BEACON_INTERVAL); pktTx_ = 0;
  1711. *rcount = 0;
  1712. rst_cw();
  1713. }
  1714. else {
  1715. struct hdr_mac802_11 *dh;
  1716. dh = HDR_MAC802_11(pktTx_);
  1717. dh->dh_fc.fc_retry = 1;
  1718. if(active_channel_ != -1)
  1719. dh->dh_fc.fc_channel = active_channel_;
  1720. else
  1721. dh->dh_fc.fc_channel = DEFAULT_CHANNEL;
  1722. if(dca_) {
  1723. sendDRTS(ETHER_ADDR(mh->dh_da));
  1724. } else {
  1725. sendRTS(ETHER_ADDR(mh->dh_da));
  1726. }
  1727. //printf("(%d)retxing data:%x..sendRTS..n",index_,pktTx_);
  1728. inc_cw();
  1729. mhBackoff_.start(cw_, is_idle());
  1730. }
  1731. }
  1732. /* ======================================================================
  1733.    Incoming Packet Routines
  1734.    ====================================================================== */
  1735. void
  1736. Mac802_11::send(Packet *p, Handler *h)
  1737. {
  1738.         struct hdr_cmn *ch = HDR_CMN(p);                    
  1739. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  1740. /* 
  1741.  * drop the packet if the node is in sleep mode
  1742.  XXX sleep mode can't stop node from sending packets
  1743.  */
  1744. EnergyModel *em = netif_->node()->energy_model();
  1745. if (em && em->sleep()) {
  1746. em->set_node_sleep(0);
  1747. em->set_node_state(EnergyModel::INROUTE);
  1748. }
  1749. callback_ = h;
  1750. sendDATA(p);
  1751. if(dca_ == 0) {
  1752. sendRTS(ETHER_ADDR(dh->dh_da));
  1753. } else {
  1754. sendDRTS(ETHER_ADDR(dh->dh_da));
  1755. }
  1756. /*
  1757.  * Assign the data packet a sequence number.
  1758.  */
  1759. dh->dh_scontrol = sta_seqno_++;
  1760. /*
  1761.  *  If the medium is IDLE, we must wait for a DIFS
  1762.  *  Space before transmitting.
  1763.  */
  1764. if(mhBackoff_.busy() == 0) {
  1765. if(is_idle()) {
  1766. /*
  1767.  * If we are already deferring, there is no
  1768.  * need to reset the Defer timer.
  1769.  */
  1770. if(mhDefer_.busy() == 0)
  1771. mhDefer_.start(difs_);
  1772. }
  1773. /*
  1774.  * If the medium is NOT IDLE, then we start
  1775.  * the backoff timer.
  1776.  */
  1777. else {
  1778. mhBackoff_.start(cw_, is_idle());
  1779. }
  1780. }
  1781. }
  1782. void
  1783. Mac802_11::recv(Packet *p, Handler *h)
  1784. {
  1785. struct hdr_cmn *hdr = HDR_CMN(p);
  1786. /*
  1787.  * Sanity Check
  1788.  */
  1789. assert(initialized());
  1790. /*
  1791.  *  Handle outgoing packets.
  1792.  */
  1793. if(hdr->direction() == hdr_cmn::DOWN) {
  1794.                 send(p, h);
  1795.                 return;
  1796.         }
  1797. /*
  1798.  *  Handle incoming packets.
  1799.  *
  1800.  *  We just received the 1st bit of a packet on the network
  1801.  *  interface.
  1802.  *
  1803.  */
  1804. /*
  1805.  *  If the interface is currently in transmit mode, then
  1806.  *  it probably won't even see this packet.  However, the
  1807.  *  "air" around me is BUSY so I need to let the packet
  1808.  *  proceed.  Just set the error flag in the common header
  1809.  *  to that the packet gets thrown away.
  1810.  */
  1811. if(tx_active_ && hdr->error() == 0) {
  1812. hdr->error() = 1;
  1813. }
  1814. //JUNGMIN
  1815. //silently discard packets sent on another channel
  1816. struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  1817. int ch = dh->dh_fc.fc_channel;
  1818. int dest = ETHER_ADDR(dh->dh_da);
  1819. int i=0;
  1820. if(dca_) {
  1821. if((dh->dh_fc.fc_type == MAC_Type_Data || dh->dh_fc.fc_subtype == MAC_Subtype_ACK) && (u_int32_t)ETHER_ADDR(dh->dh_da) != MAC_BROADCAST) {
  1822. if(active_channel_ == -1 && ch == 0) {
  1823. i=1;
  1824. } else if(ch == active_channel_) {
  1825. i=2;
  1826. } else {
  1827. //if the channel is different, this packet has never received that packet
  1828. Packet::free(p);
  1829. return;
  1830. }
  1831. if((u_int32_t)ETHER_ADDR(dh->dh_da) != index_) {
  1832. Packet::free(p);
  1833. return;
  1834. }
  1835. }
  1836. } else {
  1837. if(active_channel_ == -1 && ch == 0) {
  1838. i=1;
  1839. } else if(ch == active_channel_) {
  1840. i=2;
  1841. } else {
  1842. //if the channel is different, this packet has never received that packet
  1843. Packet::free(p);
  1844. return;
  1845. }
  1846. }
  1847. //end of JUNGMIN
  1848. if(dca_ == 0) {
  1849. if(rx_state_ == MAC_IDLE) {
  1850. SET_RX_STATE(MAC_RECV);
  1851. pktRx_ = p;
  1852. /*
  1853.  * Schedule the reception of this packet, in
  1854.  * txtime seconds.
  1855.  */
  1856. mhRecv_.start(txtime(p));
  1857. } else {
  1858. /*
  1859.  *  If the power of the incoming packet is smaller than the
  1860.  *  power of the packet currently being received by at least
  1861.                  *  the capture threshold, then we ignore the new packet.
  1862.  */
  1863. if(pktRx_->txinfo_.RxPr / p->txinfo_.RxPr >= p->txinfo_.CPThresh) {
  1864. capture(p);
  1865. } else {
  1866. collision(p);
  1867. }
  1868. }
  1869. } else {
  1870. if((dh->dh_fc.fc_type == MAC_Type_Data || dh->dh_fc.fc_subtype == MAC_Subtype_ACK) && (u_int32_t)ETHER_ADDR(dh->dh_da) != MAC_BROADCAST) {
  1871. if(dx_state_ == MAC_IDLE) {
  1872. SET_DX_STATE(MAC_RECV);
  1873. pktDx_ = p;
  1874. mhRecvDATA_.start(txtime(p));
  1875. } else {
  1876. Packet::free(p);
  1877. }
  1878. } else {
  1879. if(rx_state_ == MAC_IDLE) {
  1880. SET_RX_STATE(MAC_RECV);
  1881. pktRx_ = p;
  1882. mhRecv_.start(txtime(p));
  1883. } else {
  1884. if(pktRx_->txinfo_.RxPr / p->txinfo_.RxPr >= p->txinfo_.CPThresh) {
  1885. capture(p);
  1886. } else {
  1887. collision(p);
  1888. }
  1889. }
  1890. }
  1891. }
  1892. }
  1893. void
  1894. Mac802_11::recvDATA_timer()
  1895. {
  1896. u_int32_t src; 
  1897. hdr_cmn *ch = HDR_CMN(pktDx_);
  1898. hdr_mac802_11 *mh = HDR_MAC802_11(pktDx_);
  1899. u_int32_t dst = ETHER_ADDR(mh->dh_da);
  1900. // XXX debug
  1901. //struct cts_frame *cf = (struct cts_frame*)pktRx_->access(hdr_mac::offset_);
  1902. //u_int32_t src = ETHER_ADDR(mh->dh_sa);
  1903. u_int8_t  type = mh->dh_fc.fc_type;
  1904. u_int8_t  subtype = mh->dh_fc.fc_subtype;
  1905. assert(pktDx_);
  1906. assert(dx_state_ == MAC_RECV || dx_state_ == MAC_COLL);
  1907.         /*
  1908.          *  If the interface is in TRANSMIT mode when this packet
  1909.          *  "arrives", then I would never have seen it and should
  1910.          *  do a silent discard without adjusting the NAV.
  1911.          */
  1912.         if(tx_active_) {
  1913.                 Packet::free(pktDx_);
  1914.                 goto done;
  1915.         }
  1916. /*
  1917.  * Handle collisions.
  1918.  */
  1919. if(!(type == MAC_Type_Management && subtype == MAC_Subtype_Beacon)) {
  1920. if(rx_state_ == MAC_COLL) {
  1921. discard(pktDx_, DROP_MAC_COLLISION);
  1922. set_nav(usec(eifs_));
  1923. goto done;
  1924. }
  1925. }
  1926. /*
  1927.  * Check to see if this packet was received with enough
  1928.  * bit errors that the current level of FEC still could not
  1929.  * fix all of the problems - ie; after FEC, the checksum still
  1930.  * failed.
  1931.  */
  1932. if( ch->error() ) {
  1933. Packet::free(pktDx_);
  1934. set_nav(usec(eifs_));
  1935. goto done;
  1936. }
  1937. /*
  1938.  * IEEE 802.11 specs, section 9.2.5.6
  1939.  * - update the NAV (Network Allocation Vector)
  1940.  */
  1941. //Must modify this to make intelligent channel selection
  1942. if(dst != (u_int32_t)index_) {
  1943. set_nav(mh->dh_duration);
  1944. if(type == MAC_Type_Management) {
  1945. if(subtype == MAC_Subtype_ATIMRSH) {
  1946. recvOtherATIMRSH(pktDx_);
  1947. }
  1948. else if(subtype == MAC_Subtype_ATIMACK) {
  1949. recvOtherATIMACK(pktDx_);
  1950. }
  1951. } else if(type == MAC_Type_Control) {
  1952. if(subtype == MAC_Subtype_DCTS) {
  1953. recvOtherDCTS(pktDx_);
  1954. }
  1955. else if(subtype == MAC_Subtype_DRSH) {
  1956. recvOtherDRSH(pktDx_);
  1957. }
  1958. }
  1959. }
  1960.         /* tap out - */
  1961.         if (tap_ && type == MAC_Type_Data &&
  1962.             MAC_Subtype_Data == subtype ) 
  1963. tap_->tap(pktDx_);
  1964. /*
  1965.  * Adaptive Fidelity Algorithm Support - neighborhood infomation 
  1966.  * collection
  1967.  *
  1968.  * Hacking: Before filter the packet, log the neighbor node
  1969.  * I can hear the packet, the src is my neighbor
  1970.  */
  1971. if (netif_->node()->energy_model() && 
  1972.     netif_->node()->energy_model()->adaptivefidelity()) {
  1973. src = ETHER_ADDR(mh->dh_sa);
  1974. netif_->node()->energy_model()->add_neighbor(src);
  1975. }
  1976. /*
  1977.  * Address Filtering
  1978.  */
  1979. //printf("STEP 6n");
  1980. if(dst != (u_int32_t)index_ && dst != MAC_BROADCAST) {
  1981. /*
  1982.  *  We don't want to log this event, so we just free
  1983.  *  the packet instead of calling the drop routine.
  1984.  */
  1985. discard(pktDx_, "---");
  1986. goto done;
  1987. }
  1988. //printf("STEP FINALn");
  1989. switch(type) {
  1990. case MAC_Type_Control:
  1991. switch(subtype) {
  1992. case MAC_Subtype_ACK:
  1993. recvACK(pktDx_);
  1994. break;
  1995. default:
  1996. fprintf(stderr,"recvTimer1:Invalid MAC Control Subtype %xn",
  1997. subtype);
  1998. exit(1);
  1999. }
  2000. break;
  2001. case MAC_Type_Data:
  2002. //printf("DATA RECEIVEDn");
  2003. switch(subtype) {
  2004. case MAC_Subtype_Data:
  2005. recvDATA(pktDx_);
  2006. break;
  2007. default:
  2008. fprintf(stderr, "recv_timer2:Invalid MAC Data Subtype %xn",
  2009. subtype);
  2010. exit(1);
  2011. }
  2012. break;
  2013. default:
  2014. fprintf(stderr, "recv_timer3:Invalid MAC Type %xn", subtype);
  2015. exit(1);
  2016. }
  2017.  done:
  2018. pktDx_ = 0;
  2019. dx_resume();
  2020. }
  2021. void
  2022. Mac802_11::recv_timer()
  2023. {
  2024. u_int32_t src; 
  2025. hdr_cmn *ch = HDR_CMN(pktRx_);
  2026. hdr_mac802_11 *mh = HDR_MAC802_11(pktRx_);
  2027. //JUNGMIN
  2028. struct beacon_frame *beacon;
  2029. //end of JUNGMIN
  2030. u_int32_t dst = ETHER_ADDR(mh->dh_da);
  2031. // XXX debug
  2032. //struct cts_frame *cf = (struct cts_frame*)pktRx_->access(hdr_mac::offset_);
  2033. //u_int32_t src = ETHER_ADDR(mh->dh_sa);
  2034. u_int8_t  type = mh->dh_fc.fc_type;
  2035. u_int8_t  subtype = mh->dh_fc.fc_subtype;
  2036. assert(pktRx_);
  2037. assert(rx_state_ == MAC_RECV || rx_state_ == MAC_COLL);
  2038.         /*
  2039.          *  If the interface is in TRANSMIT mode when this packet
  2040.          *  "arrives", then I would never have seen it and should
  2041.          *  do a silent discard without adjusting the NAV.
  2042.          */
  2043.         if(tx_active_) {
  2044.                 Packet::free(pktRx_);
  2045.                 goto done;
  2046.         }
  2047. /*
  2048.  * Handle collisions.
  2049.  */
  2050. if(!(type == MAC_Type_Management && subtype == MAC_Subtype_Beacon)) {
  2051. if(rx_state_ == MAC_COLL) {
  2052. discard(pktRx_, DROP_MAC_COLLISION);
  2053. set_nav(usec(eifs_));
  2054. goto done;
  2055. }
  2056. }
  2057. /*
  2058.  * Check to see if this packet was received with enough
  2059.  * bit errors that the current level of FEC still could not
  2060.  * fix all of the problems - ie; after FEC, the checksum still
  2061.  * failed.
  2062.  */
  2063. if( ch->error() ) {
  2064. Packet::free(pktRx_);
  2065. set_nav(usec(eifs_));
  2066. goto done;
  2067. }
  2068. /*
  2069.  * IEEE 802.11 specs, section 9.2.5.6
  2070.  * - update the NAV (Network Allocation Vector)
  2071.  */
  2072. //Must modify this to make intelligent channel selection
  2073. if(dst != (u_int32_t)index_) {
  2074. set_nav(mh->dh_duration);
  2075. if(type == MAC_Type_Management) {
  2076. if(subtype == MAC_Subtype_ATIMRSH) {
  2077. recvOtherATIMRSH(pktRx_);
  2078. }
  2079. else if(subtype == MAC_Subtype_ATIMACK) {
  2080. recvOtherATIMACK(pktRx_);
  2081. }
  2082. } else if(type == MAC_Type_Control) {
  2083. if(subtype == MAC_Subtype_DCTS) {
  2084. recvOtherDCTS(pktRx_);
  2085. }
  2086. else if(subtype == MAC_Subtype_DRSH) {
  2087. recvOtherDRSH(pktRx_);
  2088. }
  2089. }
  2090. }
  2091.         /* tap out - */
  2092.         if (tap_ && type == MAC_Type_Data &&
  2093.             MAC_Subtype_Data == subtype ) 
  2094. tap_->tap(pktRx_);
  2095. /*
  2096.  * Adaptive Fidelity Algorithm Support - neighborhood infomation 
  2097.  * collection
  2098.  *
  2099.  * Hacking: Before filter the packet, log the neighbor node
  2100.  * I can hear the packet, the src is my neighbor
  2101.  */
  2102. if (netif_->node()->energy_model() && 
  2103.     netif_->node()->energy_model()->adaptivefidelity()) {
  2104. src = ETHER_ADDR(mh->dh_sa);
  2105. netif_->node()->energy_model()->add_neighbor(src);
  2106. }
  2107. /*
  2108.  * Address Filtering
  2109.  */
  2110. if(dst != (u_int32_t)index_ && dst != MAC_BROADCAST) {
  2111. /*
  2112.  *  We don't want to log this event, so we just free
  2113.  *  the packet instead of calling the drop routine.
  2114.  */
  2115. discard(pktRx_, "---");
  2116. goto done;
  2117. }
  2118. switch(type) {
  2119. case MAC_Type_Management:
  2120. //JUNGMIN
  2121. switch(subtype) {
  2122. case MAC_Subtype_Beacon:
  2123. beacon = (struct beacon_frame *)pktRx_->access(hdr_mac::offset_);
  2124. macmib_->dot11BeaconPeriod = beacon->bf_binterval;
  2125. //if waiting to send beacon, stop it.
  2126. beacon_received();
  2127. mac_log(pktRx_);
  2128. break;
  2129. case MAC_Subtype_ATIM:
  2130. recvATIM(pktRx_);
  2131. break;
  2132. case MAC_Subtype_ATIMACK:
  2133. recvATIMACK(pktRx_);
  2134. break;
  2135. case MAC_Subtype_ATIMRSH:
  2136. recvATIMRSH(pktRx_);
  2137. break;
  2138. default:
  2139. discard(pktRx_, DROP_MAC_PACKET_ERROR);
  2140. }
  2141. //end of JUNGMIN
  2142. goto done;
  2143. break;
  2144. case MAC_Type_Control:
  2145. switch(subtype) {
  2146. case MAC_Subtype_RTS:
  2147. recvRTS(pktRx_);
  2148. break;
  2149. case MAC_Subtype_CTS:
  2150. recvCTS(pktRx_);
  2151. break;
  2152. case MAC_Subtype_DRTS:
  2153. recvDRTS(pktRx_);
  2154. break;
  2155. case MAC_Subtype_DCTS:
  2156. recvDCTS(pktRx_);
  2157. break;
  2158. case MAC_Subtype_DRSH:
  2159. recvDRSH(pktRx_);
  2160. break;
  2161. case MAC_Subtype_ACK:
  2162. recvACK(pktRx_);
  2163. break;
  2164. default:
  2165. fprintf(stderr,"recvTimer1:Invalid MAC Control Subtype %xn",
  2166. subtype);
  2167. exit(1);
  2168. }
  2169. break;
  2170. //JUNGMIN
  2171. case MAC_Type_Data:
  2172. switch(subtype) {
  2173. case MAC_Subtype_Data:
  2174. recvDATA(pktRx_);
  2175. break;
  2176. //end of JUNGMIN
  2177. default:
  2178. fprintf(stderr, "recv_timer2:Invalid MAC Data Subtype %xn",
  2179. subtype);
  2180. exit(1);
  2181. }
  2182. break;
  2183. default:
  2184. fprintf(stderr, "recv_timer3:Invalid MAC Type %xn", subtype);
  2185. exit(1);
  2186. }
  2187.  done:
  2188. pktRx_ = 0;
  2189. rx_resume();
  2190. }
  2191. void
  2192. Mac802_11::recvRTS(Packet *p)
  2193. {
  2194. struct rts_frame *rf = (struct rts_frame*)p->access(hdr_mac::offset_);
  2195. if(tx_state_ != MAC_IDLE) {
  2196. discard(p, DROP_MAC_BUSY);
  2197. return;
  2198. }
  2199. /*
  2200.  *  If I'm responding to someone else, discard this RTS.
  2201.  */
  2202. if(pktCTRL_) {
  2203. discard(p, DROP_MAC_BUSY);
  2204. return;
  2205. }
  2206. sendCTS(ETHER_ADDR(rf->rf_ta), rf->rf_duration);
  2207. /*
  2208.  *  Stop deferring - will be reset in tx_resume().
  2209.  */
  2210. if(mhDefer_.busy()) mhDefer_.stop();
  2211. tx_resume();
  2212. mac_log(p);
  2213. }
  2214. void
  2215. Mac802_11::recvDRTS(Packet *p)
  2216. {
  2217. struct dca_rts_frame *drts = (struct dca_rts_frame*)p->access(hdr_mac::offset_);
  2218. if(tx_state_ != MAC_IDLE) {
  2219. discard(p, DROP_MAC_BUSY);
  2220. return;
  2221. }
  2222. /*
  2223.  *  If I'm responding to someone else, discard this RTS.
  2224.  */
  2225. if(pktCTRL_) {
  2226. discard(p, DROP_MAC_BUSY);
  2227. return;
  2228. }
  2229. for(int i=0; i<NUMBER_OF_CHANNELS; i++) {
  2230. dca_recved_fcl_[i] = drts->drts_channel_list[i];
  2231. }
  2232. sendDCTS(ETHER_ADDR(drts->drts_sa), drts->drts_data_transfer_time);
  2233. /*
  2234.  *  Stop deferring - will be reset in tx_resume().
  2235.  */
  2236. if(mhDefer_.busy()) mhDefer_.stop();
  2237. tx_resume();
  2238. mac_log(p);
  2239. }
  2240. //JUNGMIN
  2241. void
  2242. Mac802_11::recvATIM(Packet *p)
  2243. {
  2244. struct atim_frame *atf = (struct atim_frame*)p->access(hdr_mac::offset_);
  2245. if(tx_state_ != MAC_IDLE) {
  2246. discard(p, DROP_MAC_BUSY);
  2247. return;
  2248. }
  2249. //if I'm responding to someone else, discard this ATIM.
  2250. if(pktATIMACK_) {
  2251. discard(p, DROP_MAC_BUSY);
  2252. return;
  2253. }
  2254. SelectChannel(atf);
  2255. sendATIMACK(ETHER_ADDR(atf->atf_sa));
  2256. if(mhDefer_.busy()) mhDefer_.stop();
  2257. tx_resume();
  2258. mac_log(p);
  2259. }
  2260. void
  2261. Mac802_11::DCABuildFreeChannelList(int* fcl)
  2262. {
  2263. fcl[0] = 0;
  2264. for(int i=1; i<NUMBER_OF_CHANNELS; i++) {
  2265. if(dca_cul_[i] == 0) 
  2266. fcl[i] = 1;
  2267. else
  2268. fcl[i] = 0;
  2269. }
  2270. }
  2271. void 
  2272. Mac802_11::ConfirmChannel(struct atimack_frame* aaf)
  2273. {
  2274. if(selected_channel_ == -1) {
  2275. selected_channel_ = aaf->aaf_selected_channel;
  2276. }
  2277. }
  2278. void
  2279. Mac802_11::SelectChannel(struct atim_frame* atf)
  2280. {
  2281. //Channel Selection Algorithm
  2282. int* cl = atf->atf_channel_list;
  2283. int j, potentia, p_index, dye;
  2284. //1. Receiver Selected
  2285. if(selected_channel_ != -1)
  2286. return;
  2287. //2. Sender preferable
  2288. for(j=0; j<NUMBER_OF_CHANNELS; j++) {
  2289. if(cl[j] == -1)  {
  2290. fcl_[j] = -1;
  2291. selected_channel_ = j; //update mine
  2292. return;
  2293. }
  2294. }
  2295. p_index = 0;
  2296. potentia = fcl_[p_index];
  2297. //3. Receiver Free
  2298. for(j=0; j<NUMBER_OF_CHANNELS; j++) {
  2299. if(fcl_[j] <= potentia) {
  2300. if(fcl_[j] == potentia) {
  2301. p_index = j;
  2302. }
  2303. else {
  2304. potentia = fcl_[j];
  2305. p_index = j;
  2306. }
  2307. }
  2308. //4. Sender Free
  2309. for(j=0; j<NUMBER_OF_CHANNELS; j++) {
  2310. if(cl[j] < potentia) {
  2311. potentia = cl[j];
  2312. p_index = j;
  2313. }
  2314. }
  2315. fcl_[p_index] = -1;
  2316. selected_channel_ = p_index;
  2317. return;
  2318. }
  2319. int
  2320. Mac802_11::DCASelectChannel(int* fcl)
  2321. {
  2322. for(int i=1; i<NUMBER_OF_CHANNELS; i++) {
  2323. if(dca_cul_[i] == 0) return i;
  2324. }
  2325. return -1;
  2326. }
  2327. double
  2328. Mac802_11::FindNearestChannelFreeTime()
  2329. {
  2330. double nearest = dca_cul_[1];
  2331. int i;
  2332. for(i=2; i<NUMBER_OF_CHANNELS; i++) {
  2333. if(dca_cul_[i] < nearest) {
  2334. nearest = dca_cul_[i];
  2335. }
  2336. }
  2337. return nearest;
  2338. }
  2339. void
  2340. Mac802_11::ResetChannelInfo()
  2341. {
  2342. for(int j=0; j<NUMBER_OF_CHANNELS; j++) {
  2343. fcl_[j] = 0;
  2344. }
  2345. selected_channel_ = -1;
  2346. active_channel_ = 0;
  2347. }
  2348. void
  2349. Mac802_11::ResetNeighborChannelStateInfo()
  2350. {
  2351. for(int j=0; j<MAX_NODES; j++) {
  2352. channel_state_[j] = -1;
  2353. }
  2354. }
  2355. void
  2356. Mac802_11::ResetDestInfo()
  2357. {
  2358. for(int i=0; i<MAX_NODES; i++) {
  2359. dest_state_[i] = 0;  //Did I send ATIM packet to dest i?
  2360. }
  2361. }
  2362. void
  2363. Mac802_11::ResetAtBeacon()
  2364. {
  2365. ResetChannelInfo();
  2366. ResetDestInfo();
  2367. ResetNeighborChannelStateInfo();
  2368. }
  2369. //end of JUNGMIN
  2370. /*
  2371.  * txtime() - pluck the precomputed tx time from the packet header
  2372.  */
  2373. double
  2374. Mac802_11::txtime(Packet *p)
  2375.  {
  2376.  struct hdr_cmn *ch = HDR_CMN(p);
  2377.  double t = ch->txtime();
  2378.  if (t < 0.0) {
  2379.  drop(p, "XXX");
  2380.   exit(1);
  2381.  }
  2382.  return t;
  2383.  }
  2384.  
  2385. /*
  2386.  * txtime() - calculate tx time for packet of size "psz" bytes 
  2387.  *   at rate "drt" bps
  2388.  */
  2389. double
  2390. Mac802_11::txtime(double psz, double drt)
  2391. {
  2392. double dsz = psz - PLCP_HDR_LEN;
  2393. int plcp_hdr = PLCP_HDR_LEN << 3;
  2394. int datalen = (int)dsz << 3;
  2395. double t = (((double)plcp_hdr)/phymib_->PLCPDataRate) + (((double)datalen)/drt);
  2396. return(t);
  2397. }
  2398. //JUNGMIN
  2399. void
  2400. Mac802_11::recvDCTS(Packet *p)
  2401. {
  2402. if(tx_state_ != MAC_RTS) {
  2403. discard(p, DROP_MAC_INVALID_STATE);
  2404. return;
  2405. }
  2406. assert(pktRTS_);
  2407. Packet::free(pktRTS_); pktRTS_ = 0;
  2408. assert(pktTx_);
  2409. mhSend_.stop();
  2410. ssrc_ = 0;
  2411. rst_cw();
  2412. struct dca_cts_frame *dcts = (struct dca_cts_frame*)p->access(hdr_mac::offset_);
  2413. if(dcts->dcts_selected_channel != -1) {
  2414. active_channel_ = dcts->dcts_selected_channel;
  2415. sendDRSH(ETHER_ADDR(dcts->dcts_ra), dcts->dcts_usage_time);
  2416. tx_resume();
  2417. } else {
  2418. //postpone the transmission and start waitTimer
  2419. pktTx_ = 0;
  2420. if(NOW - dcts->dcts_wait_time > 0) {
  2421. if(mhWait_.busy())
  2422. mhWait_.stop();
  2423. mhWait_.start(difs_);
  2424. } else {
  2425. if(mhWait_.busy())
  2426. mhWait_.stop();
  2427. mhWait_.start(dcts->dcts_wait_time - NOW);
  2428. }
  2429. tx_resume();
  2430. }
  2431. mac_log(p);
  2432. }
  2433. //end of JUNGMIN
  2434. void
  2435. Mac802_11::recvCTS(Packet *p)
  2436. {
  2437. if(tx_state_ != MAC_RTS) {
  2438. discard(p, DROP_MAC_INVALID_STATE);
  2439. return;
  2440. }
  2441. assert(pktRTS_);
  2442. Packet::free(pktRTS_); pktRTS_ = 0;
  2443. assert(pktTx_);
  2444. mhSend_.stop();
  2445. /*
  2446.  * The successful reception of this CTS packet implies
  2447.  * that our RTS was successful.  Hence, we can reset
  2448.  * the Short Retry Count and the CW.
  2449.  */
  2450. ssrc_ = 0;
  2451. rst_cw();
  2452. tx_resume();
  2453. mac_log(p);
  2454. }
  2455. //JUNGMIN
  2456. void
  2457. Mac802_11::recvDATA(Packet *p)
  2458. {
  2459. struct hdr_mac802_11 *dh = HDR_MAC802_11(p);
  2460. u_int32_t dst, src, size;
  2461. struct hdr_cmn *ch = HDR_CMN(p);
  2462. {
  2463. dst = ETHER_ADDR(dh->dh_da);
  2464. src = ETHER_ADDR(dh->dh_sa);
  2465. size = ch->size();
  2466. /*
  2467.  * Adjust the MAC packet size - ie; strip
  2468.  * off the mac header
  2469.  */
  2470. ch->size() -= ETHER_HDR_LEN11;
  2471. ch->num_forwards() += 1;
  2472. }
  2473. /*
  2474.  *  If we sent a CTS, clean up...
  2475.  */
  2476. if(dst != MAC_BROADCAST) {
  2477. if(size >= macmib_->RTSThreshold) {
  2478. if(dca_ == 0) {
  2479. if (tx_state_ == MAC_CTS) {
  2480. assert(pktCTRL_);
  2481. Packet::free(pktCTRL_); pktCTRL_ = 0;
  2482. mhSend_.stop();
  2483. /*
  2484.  * Our CTS got through.
  2485.  */
  2486. ssrc_ = 0;
  2487. rst_cw();
  2488. }
  2489. else {
  2490. discard(p, DROP_MAC_BUSY);
  2491. return;
  2492. }
  2493. } else {
  2494. assert(pktCTRL_);
  2495. Packet::free(pktCTRL_); pktCTRL_ = 0;
  2496. mhSend_.stop();
  2497. ssrc_ = 0;
  2498. rst_cw();
  2499. }
  2500. sendACK(src);
  2501. tx_resume();
  2502. }
  2503. /*
  2504.  *  We did not send a CTS and there's no
  2505.  *  room to buffer an ACK.
  2506.  */
  2507. else {
  2508. if(pktCTRL_) {
  2509. discard(p, DROP_MAC_BUSY);
  2510. return;
  2511. }
  2512. sendACK(src);
  2513. if(mhSend_.busy() == 0)
  2514. tx_resume();
  2515. }
  2516. }
  2517. /* ============================================================
  2518.     Make/update an entry in our sequence number cache.
  2519.    ============================================================ */
  2520. /* Changed by Debojyoti Dutta. This upper loop of if{}else was 
  2521.    suggested by Joerg Diederich <dieder@ibr.cs.tu-bs.de>. 
  2522.    Changed on 19th Oct'2000 */
  2523.         if(dst != MAC_BROADCAST) {
  2524.                 if (src < (u_int32_t) cache_node_count_) {
  2525.                         Host *h = &cache_[src];
  2526.                         if(h->seqno && h->seqno == dh->dh_scontrol) {
  2527.                                 discard(p, DROP_MAC_DUPLICATE);
  2528.                                 return;
  2529.                         }
  2530.                         h->seqno = dh->dh_scontrol;
  2531.                 } else {
  2532. static int count = 0;
  2533. if (++count <= 10) {
  2534. printf ("MAC_802_11: accessing MAC cache_ array out of range (src %u, dst %u, size %d)!n", src, dst, cache_node_count_);
  2535. if (count == 10)
  2536. printf ("[suppressing additional MAC cache_ warnings]n");
  2537. };
  2538. };
  2539. }
  2540. /*
  2541.  *  Pass the packet up to the link-layer.
  2542.  *  XXX - we could schedule an event to account
  2543.  *  for this processing delay.
  2544.  */
  2545. //p->incoming = 1;
  2546. // XXXXX NOTE: use of incoming flag has been depracated; In order to track direction of pkt flow, direction_ in hdr_cmn is used instead. see packet.h for details. 
  2547. //record recved bytes
  2548. if((ch->ptype() != PT_MESSAGE) && (ch->ptype() != PT_ARP)) {
  2549. recved_bytes_ += size - ETHER_HDR_LEN11;
  2550. }
  2551. uptarget_->recv(p, (Handler*) 0);
  2552. }
  2553. //end of JUNGMIN
  2554. void
  2555. Mac802_11::recvACK(Packet *p)
  2556. {
  2557. struct hdr_cmn *ch = HDR_CMN(p);
  2558. if(tx_state_ != MAC_SEND) {
  2559. discard(p, DROP_MAC_INVALID_STATE);
  2560. return;
  2561. }
  2562. //printf("(%d)...................recving ACK:%xn",index_,p);
  2563. assert(pktTx_);
  2564. //printf("[%d] Free DATA because it's ACKed.nn", index_);
  2565. Packet::free(pktTx_); pktTx_ = 0;
  2566. mhSend_.stop();
  2567. /*
  2568.  * The successful reception of this ACK packet implies
  2569.  * that our DATA transmission was successful.  Hence,
  2570.  * we can reset the Short/Long Retry Count and the CW.
  2571.  */
  2572. if((u_int32_t) ch->size() <= macmib_->RTSThreshold)
  2573. ssrc_ = 0;
  2574. else
  2575. slrc_ = 0;
  2576. /*
  2577.  * Backoff before sending again.
  2578.  */
  2579. rst_cw();
  2580. assert(mhBackoff_.busy() == 0);
  2581. mhBackoff_.start(cw_, is_idle());
  2582. tx_resume();
  2583. mac_log(p);
  2584. }
  2585. //JUNGMIN
  2586. void
  2587. Mac802_11::recvATIMACK(Packet *p)
  2588. {
  2589. struct atimack_frame *aaf = (struct atimack_frame*)p->access(hdr_mac::offset_);
  2590. struct hdr_cmn *ch = HDR_CMN(p);
  2591. if(tx_state_ != MAC_ATIM) {
  2592. discard(p, DROP_MAC_INVALID_STATE);
  2593. return;
  2594. }
  2595. assert(pktATIM_);
  2596. Packet::free(pktATIM_); pktATIM_ = 0;
  2597. mhSend_.stop();
  2598. ConfirmChannel(aaf);
  2599. sendATIMRSH(ETHER_ADDR(aaf->aaf_sa));
  2600. InsertDestState(ETHER_ADDR(aaf->aaf_sa));
  2601. InsertNeighborChannelState(ETHER_ADDR(aaf->aaf_sa), aaf->aaf_selected_channel);
  2602. sarc_ = 0;
  2603. rst_cw();
  2604. assert(mhBackoff_.busy() == 0);
  2605. mhBackoff_.start(cw_, is_idle());
  2606. tx_resume();
  2607. mac_log(p);
  2608. }
  2609. void
  2610. Mac802_11::recvDRSH(Packet *p)
  2611. {
  2612. mac_log(p);
  2613. }
  2614. void
  2615. Mac802_11::recvATIMRSH(Packet *p)
  2616. {
  2617. struct hdr_cmn *ch = HDR_CMN(p);
  2618. tx_resume();
  2619. mac_log(p);
  2620. }
  2621. void
  2622. Mac802_11::DCAUpdateCUL(int s_channel, double usage_time)
  2623. {
  2624. //update dca_cul_ and timer
  2625. if(dca_cul_[s_channel] < NOW + usage_time) {
  2626. //update
  2627. dca_cul_[s_channel] = NOW + usage_time;
  2628. if(mhChannelUsage_[s_channel].busy())
  2629. mhChannelUsage_[s_channel].stop();
  2630. mhChannelUsage_[s_channel].start(usage_time);
  2631. }
  2632. }
  2633. void 
  2634. Mac802_11::recvOtherDRSH(Packet *p)
  2635. {
  2636. struct dca_rsh_frame *drsh = (struct dca_rsh_frame*)p->access(hdr_mac::offset_);
  2637. int s_channel = drsh->drsh_confirmed_channel;
  2638. if(s_channel > 0) {
  2639. DCAUpdateCUL(s_channel, drsh->drsh_usage_time);
  2640. }
  2641. }
  2642. void
  2643. Mac802_11::recvOtherATIMRSH(Packet *p)
  2644. {
  2645. struct atimrsh_frame *ahf = (struct atimrsh_frame*)p->access(hdr_mac::offset_);
  2646. int s_channel = ahf->ahf_confirmed_channel;
  2647. if(fcl_[s_channel] != -1) fcl_[s_channel]++;
  2648. return;
  2649. }
  2650. void
  2651. Mac802_11::recvOtherDCTS(Packet *p)
  2652. {
  2653. struct dca_cts_frame *dcts = (struct dca_cts_frame*)p->access(hdr_mac::offset_);
  2654. int s_channel = dcts->dcts_selected_channel;
  2655. if(s_channel > 0) {
  2656. DCAUpdateCUL(s_channel, dcts->dcts_usage_time);
  2657. }
  2658. }
  2659. void
  2660. Mac802_11::recvOtherATIMACK(Packet *p)
  2661. {
  2662. struct atimack_frame *aaf = (struct atimack_frame*)p->access(hdr_mac::offset_);
  2663. int s_channel = aaf->aaf_selected_channel;
  2664. if(fcl_[s_channel] != -1) fcl_[s_channel]++;
  2665. return;
  2666. }
  2667. int
  2668. Mac802_11::CheckDest(Packet *p)
  2669. {
  2670. hdr_mac802_11* dh = HDR_MAC802_11(p);
  2671. return (u_int32_t)ETHER_ADDR(dh->dh_da);
  2672. }
  2673. void 
  2674. Mac802_11::prepare_beacon()
  2675. {
  2676. mhBeaconBackoff_.start(BEACON_BACKOFF_WINDOW);
  2677. }
  2678. void
  2679. Mac802_11::beacon_received()
  2680. {
  2681. if(mhBeaconBackoff_.busy()) 
  2682. mhBeaconBackoff_.stop();
  2683. if(btbs_ == 1) {
  2684. btbs_ = 0;
  2685. }
  2686. if(pktPCF_) {
  2687. Packet::free(pktPCF_);
  2688. pktPCF_ = 0;
  2689. }
  2690. if(ready_for_atim_ == 0) {
  2691. SetATIMWindow(); //it automatically tells queue to set ATIM window
  2692. if(mhATIMWindow_.busy())
  2693. mhATIMWindow_.stop();
  2694. mhATIMWindow_.start(macmib_->dot11ATIMWindowSize*0.001000);
  2695. ready_for_atim_ = 1;
  2696. ll_->ifq()->StartSendingATIM();
  2697. }
  2698. }
  2699. void
  2700. Mac802_11::SetATIMWindow()
  2701. {
  2702. atim_window_ = 1;
  2703. ll_->ifq()->SetATIMWindow();
  2704. }
  2705. void
  2706. Mac802_11::send_beacon()
  2707. {
  2708. if(tx_state_!=MAC_SEND&&tx_state_!=MAC_CTS && rx_state_==MAC_IDLE) {
  2709. //We can send the beacon now
  2710. pcfSend(MAC_Type_Management, MAC_Subtype_Beacon);
  2711. } else {
  2712. btbs_ = 1;
  2713. }
  2714. }
  2715. void Mac802_11::pcfSend(int type, int subtype)
  2716. {
  2717. //Packet Generation
  2718. Packet* p = Packet::alloc();
  2719. struct hdr_mac802_11 *mh = (struct hdr_mac802_11 *)p->access(hdr_mac::offset_);
  2720. hdr_cmn* ch = HDR_CMN(p);
  2721. ch->ptype() = PT_MAC;
  2722. int dst = MAC_BROADCAST;
  2723. double defertime = pifs_;
  2724. Scheduler &s = Scheduler::instance();
  2725. bzero(&mh->dh_fc, sizeof(struct frame_control));
  2726. mh->dh_fc.fc_protocol_version = MAC_ProtocolVersion;
  2727. mh->dh_fc.fc_type = type;
  2728. mh->dh_fc.fc_subtype = subtype;
  2729. if(active_channel_ != -1) {
  2730. mh->dh_fc.fc_channel = active_channel_;
  2731. }
  2732. else
  2733. mh->dh_fc.fc_channel = DEFAULT_CHANNEL;
  2734. mh->dh_scontrol = sta_seqno_++;
  2735. ch->size() += ETHER_HDR_LEN11;
  2736. switch(type) {
  2737. case MAC_Type_Management:
  2738. switch(subtype) {
  2739. case MAC_Subtype_Beacon:
  2740. struct beacon_frame *beacon = (struct beacon_frame *)p->access(hdr_mac::offset_);
  2741. beacon->bf_timestamp = (unsigned long long)((Scheduler::instance()).clock()*1000);
  2742. beacon->bf_binterval = macmib_->dot11BeaconPeriod;
  2743. beacon->bf_duration = 0;
  2744. break;
  2745. }
  2746. break;
  2747. }
  2748. pktPCF_ = p;
  2749. STORE4BYTE(&dst, (mh->dh_da));
  2750. STORE4BYTE(&index_, (mh->dh_sa));
  2751. EnergyModel *em = netif_->node()->energy_model();
  2752. if(em && em->sleep()) {
  2753. em->set_node_sleep(0);
  2754. em->set_node_state(EnergyModel::INROUTE);
  2755. }
  2756. if(mhBackoff_.busy() == 0) {
  2757. if(is_idle()) {
  2758. if(mhDefer_.busy() == 0)
  2759. mhDefer_.start(defertime);
  2760. }
  2761. else {
  2762. mhBackoff_.start(cw_, is_idle());
  2763. }
  2764. }
  2765. }
  2766. double
  2767. Mac802_11::NextBeaconTime()
  2768. {
  2769. return next_beacon_time_;
  2770. }
  2771. //end of JUNGMIN