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

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.h,v 1.20 2002/03/14 01:12:53 haldar Exp $
  35.  *
  36.  * Ported from CMU/Monarch's code, nov'98 -Padma.
  37.  * wireless-mac-802_11.h
  38.  */
  39. #ifndef ns_mac_80211_h
  40. #define ns_mac_80211_h
  41. #include "mac.h"
  42. #include "mac-timers.h"
  43. #include "marshall.h"
  44. #define GET_ETHER_TYPE(x) GET2BYTE((x))
  45. #define SET_ETHER_TYPE(x,y)            {u_int16_t t = (y); STORE2BYTE(x,&t);}
  46. /* ======================================================================
  47.    Frame Formats
  48.    ====================================================================== */
  49. //JUNGMIN
  50. #define NUMBER_OF_CHANNELS 3
  51. //end of JUNGMIN
  52. #define MAC_ProtocolVersion 0x00
  53. #define MAC_Type_Management 0x00
  54. #define MAC_Type_Control 0x01
  55. #define MAC_Type_Data 0x02
  56. #define MAC_Type_Reserved 0x03
  57. #define MAC_Subtype_RTS 0x0B
  58. #define MAC_Subtype_CTS 0x0C
  59. #define MAC_Subtype_ACK 0x0D
  60. #define MAC_Subtype_Data 0x00
  61. #define MAC_Subtype_DRTS 0x05
  62. #define MAC_Subtype_DCTS 0x06
  63. #define MAC_Subtype_DRSH 0x07
  64. //JUNGMIN
  65. #define MAC_Subtype_Beacon 0x08
  66. #define MAC_Subtype_ATIM 0x09
  67. #define MAC_Subtype_ATIMACK 0x0A
  68. #define MAC_Subtype_ATIMRSH 0x0E
  69. //end of JUNGMIN
  70. struct frame_control {
  71. u_char fc_subtype : 4;
  72. u_char fc_type : 2;
  73. u_char fc_protocol_version : 2;
  74. u_char fc_order : 1;
  75. u_char fc_wep : 1;
  76. u_char fc_more_data : 1;
  77. u_char fc_pwr_mgt : 1;
  78. u_char fc_retry : 1;
  79. u_char fc_more_frag : 1;
  80. u_char fc_from_ds : 1;
  81. u_char fc_to_ds : 1;
  82. u_char fc_channel : 4;
  83. //double fc_delay_measure;
  84. };
  85. struct rts_frame {
  86. struct frame_control rf_fc;
  87. u_int16_t rf_duration;  //duration field to set nav
  88. u_char rf_ra[ETHER_ADDR_LEN];
  89. u_char rf_ta[ETHER_ADDR_LEN];
  90. u_char rf_fcs[ETHER_FCS_LEN];
  91. };
  92. struct cts_frame {
  93. struct frame_control cf_fc;
  94. u_int16_t cf_duration;
  95. u_char cf_ra[ETHER_ADDR_LEN];
  96. u_char cf_fcs[ETHER_FCS_LEN];
  97. };
  98. struct ack_frame {
  99. struct frame_control af_fc;
  100. u_int16_t af_duration;
  101. u_char af_ra[ETHER_ADDR_LEN]; //return address
  102. u_char af_fcs[ETHER_FCS_LEN];
  103. };
  104. //JUNGMIN
  105. struct beacon_frame {
  106. struct frame_control bf_fc;
  107. u_int16_t bf_duration;
  108. u_char bf_da[ETHER_ADDR_LEN]; //destination address
  109. u_char bf_sa[ETHER_ADDR_LEN]; //sender address
  110. u_char bf_bssid[ETHER_ADDR_LEN];
  111. u_int16_t bf_scontrol;
  112. unsigned long long bf_timestamp;
  113. u_int16_t bf_binterval;
  114. u_int16_t bf_capability;
  115. u_char bf_fcs[ETHER_FCS_LEN];
  116. };
  117. struct dca_rts_frame {
  118. struct frame_control drts_fc;
  119. u_int16_t drts_duration;
  120. u_char drts_da[ETHER_ADDR_LEN];
  121. u_char drts_sa[ETHER_ADDR_LEN];
  122. int drts_channel_list[NUMBER_OF_CHANNELS];
  123. double drts_data_transfer_time;
  124. u_char drts_fcs[ETHER_FCS_LEN];
  125. };
  126. struct dca_cts_frame {
  127. struct frame_control dcts_fc;
  128. u_int16_t dcts_duration;
  129. u_char dcts_ra[ETHER_ADDR_LEN];
  130. u_char dcts_sa[ETHER_ADDR_LEN];
  131. int dcts_selected_channel;
  132. double dcts_usage_time;
  133. double dcts_wait_time;
  134. u_char dcts_fcs[ETHER_FCS_LEN];
  135. };
  136. struct dca_rsh_frame {
  137. struct frame_control drsh_fc;
  138. u_int16_t drsh_duration;
  139. u_char drsh_ra[ETHER_ADDR_LEN];
  140. int drsh_confirmed_channel;
  141. double drsh_usage_time;
  142. u_char ahf_fcs[ETHER_FCS_LEN];
  143. };
  144. struct atim_frame {
  145. struct frame_control atf_fc; //frame control
  146. u_int16_t atf_duration; //duration for nav
  147. u_char atf_da[ETHER_ADDR_LEN]; //destination
  148. u_char atf_sa[ETHER_ADDR_LEN]; //sender
  149. int atf_channel_list[NUMBER_OF_CHANNELS];
  150. u_char atf_fcs[ETHER_FCS_LEN];
  151. };
  152. struct atimack_frame {
  153. struct frame_control aaf_fc;
  154. u_int16_t aaf_duration;
  155. u_char aaf_ra[ETHER_ADDR_LEN];
  156. u_char aaf_sa[ETHER_ADDR_LEN];
  157. int aaf_selected_channel;
  158. u_char aaf_fcs[ETHER_FCS_LEN];
  159. };
  160. struct atimrsh_frame {
  161. struct frame_control ahf_fc;
  162. u_int16_t ahf_duration;
  163. u_char ahf_ra[ETHER_ADDR_LEN];
  164. int ahf_confirmed_channel;
  165. u_char ahf_fcs[ETHER_FCS_LEN];
  166. };
  167. //end of JUNGMIN
  168. // XXX This header does not have its header access function because it shares
  169. // the same header space with hdr_mac.
  170. struct hdr_mac802_11 {
  171. struct frame_control dh_fc;
  172. u_int16_t dh_duration;
  173. u_char dh_da[ETHER_ADDR_LEN];
  174. u_char dh_sa[ETHER_ADDR_LEN];
  175. u_char dh_bssid[ETHER_ADDR_LEN];
  176. u_int16_t dh_scontrol;
  177. u_char dh_body[0]; // XXX Non-ANSI
  178. };
  179. /* ======================================================================
  180.    Definitions
  181.    ====================================================================== */
  182. #define PLCP_HDR_LEN                            
  183.    ((phymib_->PreambleLength >> 3) +        
  184.    (phymib_->PLCPHeaderLength >> 3))
  185. #define ETHER_HDR_LEN11
  186. (PLCP_HDR_LEN +
  187.  sizeof(struct hdr_mac802_11) +
  188.  ETHER_FCS_LEN)
  189. #define ETHER_RTS_LEN
  190.         (PLCP_HDR_LEN +
  191.  sizeof(struct rts_frame))
  192. #define ETHER_CTS_LEN
  193.          (PLCP_HDR_LEN +
  194.          sizeof(struct cts_frame))
  195. #define ETHER_DRTS_LEN
  196.         (PLCP_HDR_LEN +
  197.  sizeof(struct dca_rts_frame))
  198. #define ETHER_DCTS_LEN
  199.          (PLCP_HDR_LEN +
  200.          sizeof(struct dca_cts_frame))
  201. #define ETHER_DRSH_LEN
  202.          (PLCP_HDR_LEN +
  203.          sizeof(struct dca_rsh_frame))
  204. #define ETHER_ACK_LEN
  205.          (PLCP_HDR_LEN +
  206.  sizeof(struct ack_frame))
  207. #define ETHER_ATIM_LEN
  208. (PLCP_HDR_LEN + 
  209. sizeof(struct atim_frame))
  210. #define ETHER_ATIMACK_LEN
  211. (PLCP_HDR_LEN +
  212. sizeof(struct atimack_frame))
  213. #define ETHER_ATIMRSH_LEN
  214. (PLCP_HDR_LEN +
  215. sizeof(struct atimrsh_frame)) 
  216. /*
  217.  * IEEE 802.11 Spec, section 15.3.2
  218.  * - default values for the DSSS PHY MIB
  219.  */
  220. #define DSSS_CWMin 31
  221. #define DSSS_CWMax 1023
  222. #define DSSS_SlotTime 0.000020 // 20us
  223. #define DSSS_CCATime 0.000015 // 15us
  224. #define DSSS_RxTxTurnaroundTime 0.000005 // 5us
  225. #define DSSS_SIFSTime 0.000010 // 10us
  226. #define DSSS_PreambleLength 144 // 144 bits
  227. #define DSSS_PLCPHeaderLength 48 // 48 bits
  228. #define DSSS_PLCPDataRate 1.0e6 // 1Mbps
  229. /* Must account for propagation delays added by the channel model when
  230.  * calculating tx timeouts (as set in tcl/lan/ns-mac.tcl).
  231.  *   -- Gavin Holland, March 2002
  232.  */
  233. #define DSSS_MaxPropagationDelay        0.000002        // 2us   XXXX
  234. class PHY_MIB {
  235. public:
  236. u_int32_t CWMin;
  237. u_int32_t CWMax;
  238. double SlotTime;
  239. double CCATime;
  240. double RxTxTurnaroundTime;
  241. double SIFSTime;
  242. u_int32_t PreambleLength;
  243. u_int32_t PLCPHeaderLength;
  244. double PLCPDataRate;
  245. };
  246. /*
  247.  * IEEE 802.11 Spec, section 11.4.4.2
  248.  *      - default values for the MAC Attributes
  249.  */
  250. //#define MAC_RTSThreshold 3000 // bytes
  251. #define MAC_RTSThreshold 0 // bytes
  252. #define MAC_ShortRetryLimit 7 // retransmittions
  253. #define MAC_LongRetryLimit 4 // retransmissions
  254. #define MAC_FragmentationThreshold 2346 // bytes
  255. #define MAC_MaxTransmitMSDULifetime 512 // time units
  256. #define MAC_MaxReceiveLifetime 512 // time units
  257. class MAC_MIB {
  258. public:
  259. // MACAddress;
  260. // GroupAddresses;
  261. u_int32_t RTSThreshold;
  262. u_int32_t ShortRetryLimit;
  263. u_int32_t LongRetryLimit;
  264. u_int32_t FragmentationThreshold;
  265. u_int32_t MaxTransmitMSDULifetime;
  266. u_int32_t MaxReceiveLifetime;
  267. // ManufacturerID;
  268. // ProductID;
  269. //JUNGMIN
  270. u_int32_t dot11BeaconPeriod; //(ms)
  271. u_int32_t dot11ATIMWindowSize; //(ms)
  272. //end of JUNGMIN
  273. u_int32_t TransmittedFragmentCount;
  274. u_int32_t MulticastTransmittedFrameCount;
  275. u_int32_t FailedCount;
  276. u_int32_t RetryCount;
  277. u_int32_t MultipleRetryCount;
  278. u_int32_t FrameDuplicateCount;
  279. u_int32_t RTSSuccessCount;
  280. u_int32_t RTSFailureCount;
  281. u_int32_t ACKFailureCount;
  282. u_int32_t ReceivedFragmentCount;
  283. u_int32_t MulticastReceivedFrameCount;
  284. u_int32_t FCSErrorCount;
  285. };
  286. /* ======================================================================
  287.    The following destination class is used for duplicate detection.
  288.    ====================================================================== */
  289. class Host {
  290. public:
  291. LIST_ENTRY(Host) link;
  292. u_int32_t index;
  293. u_int32_t seqno;
  294. };
  295. /* ======================================================================
  296.    The actual 802.11 MAC class.
  297.    ====================================================================== */
  298. class Mac802_11 : public Mac {
  299. friend class DeferTimer;
  300. friend class BackoffTimer;
  301. friend class IFTimer;
  302. friend class NavTimer;
  303. friend class RxTimer;
  304. friend class RxDATATimer;
  305. friend class TxTimer;
  306. //JUNGMIN
  307. friend class BeaconTimer;
  308. friend class BeaconBackoffTimer;
  309. friend class ATIMWindowTimer;
  310. friend class ChannelUsageTimer;
  311. friend class WaitTimer;
  312. //end of JUNGMIN
  313. public:
  314. Mac802_11(PHY_MIB* p, MAC_MIB *m);
  315. void recv(Packet *p, Handler *h);
  316. inline int hdr_dst(char* hdr, int dst = -2);
  317. inline int hdr_src(char* hdr, int src = -2);
  318. inline int hdr_type(char* hdr, u_int16_t type = 0);
  319. int CheckDest(Packet* p);
  320. void  sendATIM(int dst, Handler* h);
  321. double NextBeaconTime();
  322. int  NearBeacon(Packet* p, int);
  323. protected:
  324. void backoffHandler(void);
  325. void deferHandler(void);
  326. void navHandler(void);
  327. //JUNGMIN
  328. void channelusageHandler(int);
  329. void waitHandler(void);
  330. void recvHandler(void);
  331. void recvDATAHandler(void);
  332. void sendHandler(void);
  333. void txHandler(void);
  334. void beaconHandler(void);
  335. void beaconBackoffHandler(void);
  336. void atimHandler(void);
  337. //end of JUNGMIN
  338. private:
  339. int command(int argc, const char*const* argv);
  340. /*
  341.  * Called by the timers.
  342.  */
  343. //JUNGMIN
  344. void recv_timer(void);
  345. void recvDATA_timer(void);
  346. void send_timer(void);
  347. int check_pktCTRL();
  348. int check_pktRTS();
  349. int check_pktTx();
  350. int check_pktPCF();
  351. int check_pktATIMRSH();
  352. int check_pktATIMACK();
  353. int check_pktATIM();
  354. //end of JUNGMIN
  355. /*
  356.  * Packet Transmission Functions.
  357.  */
  358. void send(Packet *p, Handler *h);
  359. void  sendRTS(int dst);
  360. void sendCTS(int dst, double duration);
  361. //JUNGMIN
  362. void  sendDRTS(int dst);
  363. void sendDCTS(int dst, double duration);
  364. void sendDRSH(int dst, double duration);
  365. //end of JUNGMIN
  366. void sendACK(int dst);
  367. void sendDATA(Packet *p);
  368. void RetransmitRTS();
  369. void RetransmitDATA();
  370. //JUNGMIN
  371. void prepare_beacon();
  372. void  send_beacon();
  373. void  beacon_received();
  374. void pcfSend(int type, int subtype);
  375. void sendATIMACK(int dst);
  376. void sendATIMRSH(int dst);
  377. void RetransmitATIM();
  378. //end of JUNGMIN
  379. /*
  380.  * Packet Reception Functions.
  381.  */
  382. void recvRTS(Packet *p);
  383. void recvCTS(Packet *p);
  384. void recvDRTS(Packet *p);
  385. void recvDCTS(Packet *p);
  386. void recvDRSH(Packet *p);
  387. void recvACK(Packet *p);
  388. void recvDATA(Packet *p);
  389. //JUNGMIN
  390. void recvATIM(Packet *p);
  391. void recvATIMACK(Packet *p);
  392. void recvATIMRSH(Packet *p);
  393. void recvOtherATIMACK(Packet *p);
  394. void recvOtherATIMRSH(Packet *p);
  395. void DCAUpdateCUL(int, double);
  396. void DCABuildFreeChannelList(int *);
  397. void recvOtherDRSH(Packet *p);
  398. void recvOtherDCTS(Packet *p);
  399. //end of JUNGMIN
  400. void capture(Packet *p);
  401. void collision(Packet *p);
  402. void discard(Packet *p, const char* why);
  403. void rx_resume(void);
  404. void dx_resume(void);
  405. void tx_resume(void);
  406. inline int is_idle(void);
  407. inline int is_channel_idle(int ch);
  408. /*
  409.  * Debugging Functions.
  410.  */
  411. void trace_pkt(Packet *p);
  412. void dump(char* fname);
  413. inline int initialized() {
  414. return (phymib_ && macmib_ && cache_ && logtarget_ && 
  415. Mac::initialized());
  416. }
  417. void mac_log(Packet *p) {
  418. logtarget_->recv(p, (Handler*) 0);
  419. }
  420. double txtime(Packet *p);
  421. double txtime(double psz, double drt);
  422. double txtime(int bytes) { /* clobber inherited txtime() */ abort(); }
  423. inline void inc_cw() {
  424. cw_ = (cw_ << 1) + 1;
  425. if(cw_ > phymib_->CWMax)
  426. cw_ = phymib_->CWMax;
  427. }
  428. inline void rst_cw() { cw_ = phymib_->CWMin; }
  429. inline double sec(double t) { return(t *= 1.0e-6); }
  430. inline u_int16_t usec(double t) {
  431. u_int16_t us = (u_int16_t)floor((t *= 1e6) + 0.5);
  432. /* u_int16_t us = (u_int16_t)rint(t *= 1e6); */
  433. return us;
  434. }
  435. inline void set_nav(u_int16_t us) {
  436. double now = Scheduler::instance().clock();
  437. double t = us * 1e-6;
  438. if((now + t) > nav_) {
  439. nav_ = now + t;
  440. if(mhNav_.busy())
  441. mhNav_.stop();
  442. mhNav_.start(t);
  443. }
  444. }
  445. //JUNGMIN
  446. void SetATIMWindow();
  447. void SelectChannel(struct atim_frame *);
  448. void ConfirmChannel(struct atimack_frame *);
  449. int DCASelectChannel(int*);
  450. double FindNearestChannelFreeTime();
  451. void ResetChannelInfo();
  452. void ResetDestInfo();
  453. void ResetNeighborChannelStateInfo();
  454. void ResetAtBeacon(); //combination of above 3
  455. int LookupDestState(int dst);
  456. void InsertDestState(int dst);
  457. void InsertNeighborChannelState(int dst, int channel);
  458. //end of JUNGMIN
  459. protected:
  460. PHY_MIB *phymib_;
  461. MAC_MIB *macmib_;
  462. private:
  463. double basicRate_;
  464.   double dataRate_;
  465. /*
  466.  * Mac Timers
  467.  */
  468. IFTimer mhIF_; // interface timer
  469. NavTimer mhNav_; // NAV timer
  470. RxTimer mhRecv_; // incoming packets
  471. RxDATATimer mhRecvDATA_;
  472. TxTimer mhSend_; // outgoing packets
  473. //JUNGMIN
  474. BeaconTimer mhBeacon_;
  475. BeaconBackoffTimer mhBeaconBackoff_;
  476. ATIMWindowTimer mhATIMWindow_;
  477. ChannelUsageTimer *mhChannelUsage_;
  478. WaitTimer mhWait_;
  479. //end of JUNGMIN
  480. DeferTimer mhDefer_; // defer timer
  481. BackoffTimer mhBackoff_; // backoff timer
  482. /* ============================================================
  483.    Internal MAC State
  484.    ============================================================ */
  485. //JUNGMIN
  486. int fcl_[NUMBER_OF_CHANNELS];
  487. int dca_recved_fcl_[NUMBER_OF_CHANNELS];
  488. double dca_cul_[NUMBER_OF_CHANNELS];
  489. int selected_channel_;
  490. int active_channel_;
  491. int dest_state_[MAX_NODES];
  492. //int q_state_[MAX_NODES];  //moved to queue
  493. int channel_state_[MAX_NODES];
  494. int ready_for_atim_;
  495. double next_beacon_time_;
  496. int recved_bytes_;
  497. //end of JUNGMIN
  498. double nav_; // Network Allocation Vector
  499. MacState rx_state_; // incoming state (MAC_RECV or MAC_IDLE)
  500. MacState tx_state_; // outgoint state
  501. MacState dx_state_; // for dca
  502. int tx_active_; // transmitter is ACTIVE
  503. Packet *pktRTS_; // outgoing RTS packet
  504. Packet *pktCTRL_; // outgoing non-RTS packet
  505. Packet *pktRSH_;
  506. //JUNGMIN
  507. Packet *pktPCF_; // outgoing PCF stuff
  508. Packet *pktATIM_;
  509. Packet *pktATIMACK_;
  510. Packet *pktATIMRSH_;
  511. Packet *pktDx_;
  512. Packet *pktPending_;
  513. //end of JUNGMIN
  514. u_int32_t cw_; // Contention Window
  515. u_int32_t ssrc_; // STA Short Retry Count
  516. //JUNGMIN
  517. u_int32_t sarc_; // STA ATIM Retry Count
  518. //end of JUNGMIN
  519. u_int32_t slrc_; // STA Long Retry Count
  520. double sifs_; // Short Interface Space
  521. double pifs_; // PCF Interframe Space
  522. double difs_; // DCF Interframe Space
  523. double eifs_; // Extended Interframe Space
  524. double tx_sifs_;
  525. double tx_pifs_;
  526. double tx_difs_;
  527. int min_frame_len_;
  528. NsObject* logtarget_;
  529. //JUNGMIN
  530. int pc_;
  531. int btbs_; //beacon
  532. int atim_window_; //whether atim window is on or off
  533. int dca_;
  534. double total_delay_;
  535. int packet_count_;
  536. //end of JUNGMIN
  537. /* ============================================================
  538.    Duplicate Detection state
  539.    ============================================================ */
  540. u_int16_t sta_seqno_; // next seqno that I'll use
  541. int cache_node_count_;
  542. Host *cache_;
  543. };
  544. #endif /* __mac_80211_h__ */