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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*-
  2.  *
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * $Header: /cvsroot/nsnam/ns-2/mac/mac-802_11.h,v 1.28 2008/01/24 01:53:19 tom_henderson 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. // Added by Sushmita to support event tracing (singal@nunki.usc.edu)
  42. #include "address.h"
  43. #include "ip.h"
  44. #include "mac-timers.h"
  45. #include "marshall.h"
  46. #include <math.h>
  47. #include <stddef.h>
  48. class EventTrace;
  49. #define GET_ETHER_TYPE(x) GET2BYTE((x))
  50. #define SET_ETHER_TYPE(x,y)            {u_int16_t t = (y); STORE2BYTE(x,&t);}
  51. /* ======================================================================
  52.    Frame Formats
  53.    ====================================================================== */
  54. #define MAC_ProtocolVersion 0x00
  55. #define MAC_Type_Management 0x00
  56. #define MAC_Type_Control 0x01
  57. #define MAC_Type_Data 0x02
  58. #define MAC_Type_Reserved 0x03
  59. #define MAC_Subtype_RTS 0x0B
  60. #define MAC_Subtype_CTS 0x0C
  61. #define MAC_Subtype_ACK 0x0D
  62. #define MAC_Subtype_Data 0x00
  63. #define MAC_Subtype_80211_Beacon 0x08 
  64. #define MAC_Subtype_AssocReq 0x00
  65. #define MAC_Subtype_AssocRep 0x01
  66. #define MAC_Subtype_Auth 0x0C
  67. #define MAC_Subtype_ProbeReq 0x04
  68. #define MAC_Subtype_ProbeRep 0x05
  69. struct frame_control {
  70. u_char fc_subtype : 4;
  71. u_char fc_type : 2;
  72. u_char fc_protocol_version : 2;
  73. u_char fc_order : 1;
  74. u_char fc_wep : 1;
  75. u_char fc_more_data : 1;
  76. u_char fc_pwr_mgt : 1;
  77. u_char fc_retry : 1;
  78. u_char fc_more_frag : 1;
  79. u_char fc_from_ds : 1;
  80. u_char fc_to_ds : 1;
  81. };
  82. struct rts_frame {
  83. struct frame_control rf_fc;
  84. u_int16_t rf_duration;
  85. u_char rf_ra[ETHER_ADDR_LEN];
  86. u_char rf_ta[ETHER_ADDR_LEN];
  87. u_char rf_fcs[ETHER_FCS_LEN];
  88. };
  89. struct cts_frame {
  90. struct frame_control cf_fc;
  91. u_int16_t cf_duration;
  92. u_char cf_ra[ETHER_ADDR_LEN];
  93. u_char cf_fcs[ETHER_FCS_LEN];
  94. };
  95. struct ack_frame {
  96. struct frame_control af_fc;
  97. u_int16_t af_duration;
  98. u_char af_ra[ETHER_ADDR_LEN];
  99. u_char af_fcs[ETHER_FCS_LEN];
  100. };
  101. struct beacon_frame {
  102. struct frame_control bf_fc;
  103. u_int16_t bf_duration;
  104. u_char bf_ra[ETHER_ADDR_LEN];
  105. u_char bf_ta[ETHER_ADDR_LEN];
  106. u_char bf_3a[ETHER_ADDR_LEN];
  107. u_int16_t bf_scontrol;
  108. double bf_timestamp;
  109. double bf_bcninterval;
  110. u_int8_t bf_datarates[1];
  111. u_char bf_fcs[ETHER_FCS_LEN];
  112. };
  113. struct assocreq_frame {
  114. struct frame_control acrqf_fc;
  115. u_int16_t acrqf_duration;
  116. u_char acrqf_ra[ETHER_ADDR_LEN];
  117. u_char acrqf_ta[ETHER_ADDR_LEN];
  118. u_char acrqf_3a[ETHER_ADDR_LEN];
  119. u_int16_t acrqf_scontrol;
  120. u_char acrqf_fcs[ETHER_FCS_LEN];
  121. };
  122. struct assocrep_frame {
  123. struct frame_control acrpf_fc;
  124. u_int16_t acrpf_duration;
  125. u_char acrpf_ra[ETHER_ADDR_LEN];
  126. u_char acrpf_ta[ETHER_ADDR_LEN];
  127. u_char acrpf_3a[ETHER_ADDR_LEN];
  128. u_int16_t acrpf_scontrol;
  129. u_int16_t acrpf_statuscode;
  130. u_char acrpf_fcs[ETHER_FCS_LEN];
  131. };
  132. struct auth_frame {
  133. struct frame_control authf_fc;
  134. u_int16_t authf_duration;
  135. u_char authf_ra[ETHER_ADDR_LEN];
  136. u_char authf_ta[ETHER_ADDR_LEN];
  137. u_char authf_3a[ETHER_ADDR_LEN];
  138. u_int16_t authf_scontrol;
  139. u_int16_t authf_algono;
  140. u_int16_t authf_seqno;
  141. u_int16_t authf_statuscode;
  142. u_char authf_fcs[ETHER_FCS_LEN];
  143. };
  144. struct probereq_frame {
  145. struct frame_control prrqf_fc;
  146. u_int16_t prrqf_duration;
  147. u_char prrqf_ra[ETHER_ADDR_LEN];
  148. u_char prrqf_ta[ETHER_ADDR_LEN];
  149. u_char prrqf_3a[ETHER_ADDR_LEN];
  150. u_int16_t prrqf_scontrol;
  151. u_char prrqf_fcs[ETHER_FCS_LEN];
  152. };
  153. struct proberep_frame {
  154. struct frame_control prrpf_fc;
  155. u_int16_t prrpf_duration;
  156. u_char prrpf_ra[ETHER_ADDR_LEN];
  157. u_char prrpf_ta[ETHER_ADDR_LEN];
  158. u_char prrpf_3a[ETHER_ADDR_LEN];
  159. u_int16_t prrpf_scontrol;
  160. double prrpf_timestamp;
  161. double prrpf_bcninterval;
  162. u_int8_t prrpf_datarates[1];
  163. u_char prrpf_fcs[ETHER_FCS_LEN];
  164. };
  165. // XXX This header does not have its header access function because it shares
  166. // the same header space with hdr_mac.
  167. struct hdr_mac802_11 {
  168. struct frame_control dh_fc;
  169. u_int16_t dh_duration;
  170. u_char                  dh_ra[ETHER_ADDR_LEN];
  171.         u_char                  dh_ta[ETHER_ADDR_LEN];
  172.         u_char                  dh_3a[ETHER_ADDR_LEN];
  173. u_char dh_4a[ETHER_ADDR_LEN];
  174. u_int16_t dh_scontrol;
  175. u_char dh_body[1]; // size of 1 for ANSI compatibility
  176. };
  177. struct client_table {
  178. int client_id;
  179. int auth_status;
  180. int assoc_status;
  181. struct client_table *next;
  182. };
  183. struct ap_table {
  184. int ap_id;
  185. double ap_power;
  186. struct ap_table *next;
  187. };
  188. /* ======================================================================
  189.    Definitions
  190.    ====================================================================== */
  191. /* Must account for propagation delays added by the channel model when
  192.  * calculating tx timeouts (as set in tcl/lan/ns-mac.tcl).
  193.  *   -- Gavin Holland, March 2002
  194.  */
  195. #define DSSS_MaxPropagationDelay        0.000002        // 2us   XXXX
  196. class PHY_MIB {
  197. public:
  198. PHY_MIB(Mac802_11 *parent);
  199. inline u_int32_t getCWMin() { return(CWMin); }
  200.         inline u_int32_t getCWMax() { return(CWMax); }
  201. inline double getSlotTime() { return(SlotTime); }
  202. inline double getBeaconInterval() { return(BeaconInterval); }
  203. inline double getSIFS() { return(SIFSTime); }
  204. inline double getPIFS() { return(SIFSTime + SlotTime); }
  205. inline double getDIFS() { return(SIFSTime + 2 * SlotTime); }
  206. inline double getEIFS() {
  207. // see (802.11-1999, 9.2.10)
  208. return(SIFSTime + getDIFS()
  209.                        + (8 *  getACKlen())/PLCPDataRate);
  210. }
  211. inline u_int32_t getPreambleLength() { return(PreambleLength); }
  212. inline double getPLCPDataRate() { return(PLCPDataRate); }
  213. inline u_int32_t getPLCPhdrLen() {
  214. return((PreambleLength + PLCPHeaderLength) >> 3);
  215. }
  216. inline u_int32_t getHdrLen11() {
  217. return(getPLCPhdrLen() + offsetof(struct hdr_mac802_11, dh_body[0])
  218.                        + ETHER_FCS_LEN);
  219. }
  220. inline u_int32_t getRTSlen() {
  221. return(getPLCPhdrLen() + sizeof(struct rts_frame));
  222. }
  223. inline u_int32_t getCTSlen() {
  224. return(getPLCPhdrLen() + sizeof(struct cts_frame));
  225. }
  226. inline u_int32_t getACKlen() {
  227. return(getPLCPhdrLen() + sizeof(struct ack_frame));
  228. }
  229. inline u_int32_t getBEACONlen() {
  230. return(getPLCPhdrLen() + sizeof(struct beacon_frame)); 
  231. }
  232. inline u_int32_t getASSOCREQlen() {
  233. return(getPLCPhdrLen() + sizeof(struct assocreq_frame));
  234. }
  235. inline u_int32_t getASSOCREPlen() {
  236. return(getPLCPhdrLen() + sizeof(struct assocrep_frame)); 
  237. }
  238. inline u_int32_t getAUTHENTICATElen() {
  239. return(getPLCPhdrLen() + sizeof(struct auth_frame)); 
  240. }
  241. inline u_int32_t getPROBEREQlen() {
  242. return(getPLCPhdrLen() + sizeof(struct probereq_frame)); 
  243. }
  244. inline u_int32_t getPROBEREPlen() {
  245. return(getPLCPhdrLen() + sizeof(struct proberep_frame)); 
  246. }
  247.  private:
  248. u_int32_t CWMin;
  249. u_int32_t CWMax;
  250. double SlotTime;
  251. double SIFSTime;
  252. double BeaconInterval;
  253. u_int32_t PreambleLength;
  254. u_int32_t PLCPHeaderLength;
  255. double PLCPDataRate;
  256. };
  257. /*
  258.  * IEEE 802.11 Spec, section 11.4.4.2
  259.  *      - default values for the MAC Attributes
  260.  */
  261. #define MAC_FragmentationThreshold 2346 // bytes
  262. #define MAC_MaxTransmitMSDULifetime 512 // time units
  263. #define MAC_MaxReceiveLifetime 512 // time units
  264. class MAC_MIB {
  265. public:
  266. MAC_MIB(Mac802_11 *parent);
  267. private:
  268. u_int32_t RTSThreshold;
  269. u_int32_t ShortRetryLimit;
  270. u_int32_t LongRetryLimit;
  271. u_int32_t ScanType;
  272. double ProbeDelay;
  273. double MaxChannelTime;
  274. double MinChannelTime;
  275. double ChannelTime;
  276. public:
  277. u_int32_t FailedCount;
  278. u_int32_t RTSFailureCount;
  279. u_int32_t ACKFailureCount;
  280.  public:
  281.        inline u_int32_t getRTSThreshold() { return(RTSThreshold);}
  282.        inline u_int32_t getShortRetryLimit() { return(ShortRetryLimit);}
  283.        inline u_int32_t getLongRetryLimit() { return(LongRetryLimit);}
  284.        inline u_int32_t getScanType() { return(ScanType);}
  285.        inline double getProbeDelay() { return(ProbeDelay);}
  286.        inline double getMaxChannelTime() { return(MaxChannelTime);}
  287.        inline double getMinChannelTime() { return(MinChannelTime);}
  288.        inline double getChannelTime() { return(ChannelTime);}
  289. };
  290. /* ======================================================================
  291.    The following destination class is used for duplicate detection.
  292.    ====================================================================== */
  293. class Host {
  294. public:
  295. LIST_ENTRY(Host) link;
  296. u_int32_t index;
  297. u_int32_t seqno;
  298. };
  299. /* ======================================================================
  300.    The actual 802.11 MAC class.
  301.    ====================================================================== */
  302. class Mac802_11 : public Mac {
  303. friend class DeferTimer;
  304. friend class BeaconTimer; 
  305. friend class ProbeTimer;
  306. friend class BackoffTimer;
  307. friend class IFTimer;
  308. friend class NavTimer;
  309. friend class RxTimer;
  310. friend class TxTimer;
  311. public:
  312. Mac802_11();
  313. void recv(Packet *p, Handler *h);
  314. inline int hdr_dst(char* hdr, int dst = -2);
  315. inline int hdr_src(char* hdr, int src = -2);
  316. inline int hdr_type(char* hdr, u_int16_t type = 0);
  317. inline int bss_id() { return bss_id_; }
  318. // Added by Sushmita to support event tracing
  319.         void trace_event(char *, Packet *);
  320.         EventTrace *et_;
  321. protected:
  322. void backoffHandler(void);
  323. void deferHandler(void);
  324. void BeaconHandler(void); 
  325. void ProbeHandler(void);
  326. void navHandler(void);
  327. void recvHandler(void);
  328. void sendHandler(void);
  329. void txHandler(void);
  330. private:
  331. void update_client_table(int num, int auth_status, int assoc_status);
  332. void  push(int num, int auth_status, int assoc_status);
  333. int find_client(int num);
  334. void update_ap_table(int num, double power);
  335. void  push_ap(int num, double power);
  336. int  strongest_ap();
  337. int find_ap(int num, double power);
  338. void  deletelist();
  339. void passive_scan();
  340. void active_scan();
  341. int end();
  342. void shift_priority_queue();
  343. void checkAssocAuthStatus();
  344. int command(int argc, const char*const* argv);
  345. /* In support of bug fix described at
  346.  * http://www.dei.unipd.it/wdyn/?IDsezione=2435  
  347.  */
  348. int bugFix_timer_;
  349. int infra_mode_;
  350. double BeaconTxtime_;
  351. int associated;
  352. int authenticated;
  353. int handoff;
  354. double Pr;
  355. int ap_temp;
  356. int ap_addr;
  357. int associating_node_;
  358. int authenticating_node_;
  359. int ScanType_;
  360. int OnMinChannelTime;
  361. int OnMaxChannelTime;
  362. int Recv_Busy_;
  363. /*
  364.  * Called by the timers.
  365.  */
  366. void recv_timer(void);
  367. void send_timer(void);
  368. int check_pktCTRL();
  369. int check_pktRTS();
  370. int check_pktTx();
  371. int check_pktASSOCREQ();  
  372. int check_pktASSOCREP();
  373. int check_pktBEACON();
  374. int check_pktAUTHENTICATE();
  375. int check_pktPROBEREQ();  
  376. int check_pktPROBEREP();
  377. /*
  378.  * Packet Transmission Functions.
  379.  */
  380. void send(Packet *p, Handler *h);
  381. void  sendRTS(int dst);
  382. void sendCTS(int dst, double duration);
  383. void sendACK(int dst);
  384. void sendDATA(Packet *p);
  385. void sendBEACON(int src);
  386. void sendASSOCREQ(int dst);
  387. void sendASSOCREP(int dst);
  388. void sendPROBEREQ(int dst);
  389. void sendPROBEREP(int dst);
  390. void sendAUTHENTICATE(int dst);
  391. void RetransmitRTS();
  392. void RetransmitDATA();
  393. void RetransmitASSOCREP();
  394. void RetransmitPROBEREP();
  395. void RetransmitAUTHENTICATE();
  396. /*
  397.  * Packet Reception Functions.
  398.  */
  399. void recvRTS(Packet *p);
  400. void recvCTS(Packet *p);
  401. void recvACK(Packet *p);
  402. void recvDATA(Packet *p);
  403. void recvBEACON(Packet *p);
  404. void recvASSOCREQ(Packet *p);
  405. void recvASSOCREP(Packet *p);
  406. void recvPROBEREQ(Packet *p);
  407. void recvPROBEREP(Packet *p);
  408. void recvAUTHENTICATE(Packet *p);
  409. void capture(Packet *p);
  410. void collision(Packet *p);
  411. void discard(Packet *p, const char* why);
  412. void rx_resume(void);
  413. void tx_resume(void);
  414. inline int is_idle(void);
  415. /*
  416.  * Debugging Functions.
  417.  */
  418. void trace_pkt(Packet *p);
  419. void dump(char* fname);
  420. inline int initialized() {
  421. return (cache_ && logtarget_
  422.                         && Mac::initialized());
  423. }
  424. inline void mac_log(Packet *p) {
  425.                 logtarget_->recv(p, (Handler*) 0);
  426.         }
  427. double txtime(Packet *p);
  428. double txtime(double psz, double drt);
  429. double txtime(int bytes) { /* clobber inherited txtime() */ abort(); return 0;}
  430. inline void transmit(Packet *p, double timeout);
  431. inline void checkBackoffTimer(void);
  432. inline void postBackoff(int pri);
  433. inline void setRxState(MacState newState);
  434. inline void setTxState(MacState newState);
  435. inline void inc_cw() {
  436. cw_ = (cw_ << 1) + 1;
  437. if(cw_ > phymib_.getCWMax())
  438. cw_ = phymib_.getCWMax();
  439. }
  440. inline void rst_cw() { cw_ = phymib_.getCWMin(); }
  441. inline double sec(double t) { return(t *= 1.0e-6); }
  442. inline u_int16_t usec(double t) {
  443. u_int16_t us = (u_int16_t)floor((t *= 1e6) + 0.5);
  444. return us;
  445. }
  446. inline void set_nav(u_int16_t us) {
  447. double now = Scheduler::instance().clock();
  448. double t = us * 1e-6;
  449. if((now + t) > nav_) {
  450. nav_ = now + t;
  451. if(mhNav_.busy())
  452. mhNav_.stop();
  453. mhNav_.start(t);
  454. }
  455. }
  456. protected:
  457. PHY_MIB         phymib_;
  458.         MAC_MIB         macmib_;
  459.        /* the macaddr of my AP in BSS mode; for IBSS mode
  460.         * this is set to a reserved value IBSS_ID - the
  461.         * MAC_BROADCAST reserved value can be used for this
  462.         * purpose
  463.         */
  464.        int     bss_id_;
  465.        enum    {IBSS_ID=MAC_BROADCAST};
  466.        enum    {
  467. PASSIVE = 0,
  468.         ACTIVE = 1
  469. };
  470. private:
  471. double basicRate_;
  472.   double dataRate_;
  473. struct client_table *client_list;
  474. struct ap_table *ap_list;
  475. int priority_queue[4];
  476. int head;
  477. /*
  478.  * Mac Timers
  479.  */
  480. IFTimer mhIF_; // interface timer
  481. NavTimer mhNav_; // NAV timer
  482. RxTimer mhRecv_; // incoming packets
  483. TxTimer mhSend_; // outgoing packets
  484. DeferTimer mhDefer_; // defer timer
  485. BackoffTimer mhBackoff_; // backoff timer
  486. BeaconTimer mhBeacon_; // Beacon Timer 
  487. ProbeTimer mhProbe_; //Probe timer, 
  488. /* ============================================================
  489.    Internal MAC State
  490.    ============================================================ */
  491. double nav_; // Network Allocation Vector
  492. MacState rx_state_; // incoming state (MAC_RECV or MAC_IDLE)
  493. MacState tx_state_; // outgoint state
  494. int tx_active_; // transmitter is ACTIVE
  495. Packet          *eotPacket_;    // copy for eot callback
  496. Packet *pktRTS_; // outgoing RTS packet
  497. Packet *pktCTRL_; // outgoing non-RTS packet
  498. Packet *pktBEACON_; //outgoing Beacon Packet
  499. Packet *pktASSOCREQ_; //Association request
  500. Packet *pktASSOCREP_; // Association response
  501. Packet *pktAUTHENTICATE_; //Authentication
  502. Packet *pktPROBEREQ_; //Probe Request
  503. Packet *pktPROBEREP_; //Probe Response
  504. u_int32_t cw_; // Contention Window
  505. u_int32_t ssrc_; // STA Short Retry Count
  506. u_int32_t slrc_; // STA Long Retry Count
  507. int min_frame_len_;
  508. NsObject* logtarget_;
  509. NsObject*       EOTtarget_;     // given a copy of packet at TX end
  510. /* ============================================================
  511.    Duplicate Detection state
  512.    ============================================================ */
  513. u_int16_t sta_seqno_; // next seqno that I'll use
  514. int cache_node_count_;
  515. Host *cache_;
  516. };
  517. #endif /* __mac_80211_h__ */