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

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 Daedalus Research
  17.  * Group at the University of California Berkeley.
  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.  * Contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen
  35.  *
  36.  * @(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/mac/mac.h,v 1.35 2000/12/20 10:11:36 alefiyah Exp $ (UCB)
  37.  */
  38. #ifndef ns_mac_h
  39. #define ns_mac_h
  40. #include <assert.h>
  41. #include "bi-connector.h"
  42. #include "packet.h"
  43. #include "ip.h"
  44. #include "route.h"
  45. #include "ll.h"
  46. #include "phy.h"
  47. #include "marshall.h"
  48. #include "channel.h"
  49. class Channel;
  50. #define ZERO 0.00000
  51. /*
  52.  * Medium Access Control (MAC)
  53.  */
  54. #define EF_COLLISION 2 // collision error flag
  55. /* ======================================================================
  56.    Defines / Macros used by all MACs.
  57.    ====================================================================== */
  58. #define ETHER_ADDR(x) (GET4BYTE(x))
  59. #define MAC_HDR_LEN 64
  60. #define MAC_BROADCAST ((u_int32_t) 0xffffffff)
  61. #define BCAST_ADDR -1
  62. #define ETHER_ADDR_LEN 6
  63. #define ETHER_TYPE_LEN 2
  64. #define ETHER_FCS_LEN 4
  65. #define ETHERTYPE_IP 0x0800
  66. #define ETHERTYPE_ARP 0x0806
  67. enum MacState {
  68. MAC_IDLE = 0x0000,
  69. MAC_POLLING = 0x0001,
  70. MAC_RECV  = 0x0010,
  71. MAC_SEND  = 0x0100,
  72. MAC_RTS = 0x0200,
  73. MAC_CTS = 0x0400,
  74. MAC_ACK = 0x0800,
  75. MAC_COLL = 0x1000
  76. //JUNGMIN
  77. ,MAC_BEACONING = 0x2000
  78. ,MAC_ATIM = 0x4000
  79. ,MAC_ATIMACK = 0x8000
  80. ,MAC_ATIMRSH = 0x8001
  81. //end of JUNGMIN
  82. };
  83. enum MacFrameType {
  84. MF_BEACON = 0x0008, // beaconing
  85. MF_CONTROL = 0x0010, // used as mask for control frame
  86. MF_SLOTS = 0x001a, // announce slots open for contention
  87. MF_RTS = 0x001b, // request to send
  88. MF_CTS = 0x001c, // clear to send, grant
  89. MF_ACK = 0x001d, // acknowledgement
  90. MF_CF_END = 0x001e, // contention free period end
  91. MF_POLL = 0x001f, // polling
  92. MF_DATA = 0x0020, // also used as mask for data frame
  93. MF_DATA_ACK = 0x0021  // ack for data frames
  94. };
  95. struct hdr_mac {
  96. MacFrameType ftype_; // frame type
  97. int macSA_; // source MAC address
  98. int macDA_; // destination MAC address
  99. u_int16_t hdr_type_;     // mac_hdr type
  100. double txtime_; // transmission time
  101. double sstime_; // slot start time
  102. int padding_;
  103. inline void set(MacFrameType ft, int sa, int da=-1) {
  104. ftype_ = ft;
  105. macSA_ = sa;
  106. if (da != -1)  macDA_ = da;
  107. }
  108. inline MacFrameType& ftype() { return ftype_; }
  109. inline int& macSA() { return macSA_; }
  110. inline int& macDA() { return macDA_; }
  111. inline u_int16_t& hdr_type() {return hdr_type_; }
  112. inline double& txtime() { return txtime_; }
  113. inline double& sstime() { return sstime_; }
  114. // Header access methods
  115. static int offset_;
  116. inline static int& offset() { return offset_; }
  117. inline static hdr_mac* access(const Packet* p) {
  118. return (hdr_mac*) p->access(offset_);
  119. }
  120. };
  121. /* ===================================================================
  122.    Objects that want to promiscously listen to the packets before
  123.    address filtering must inherit from class Tap in order to plug into
  124.    the tap
  125.    =================================================================*/
  126. class Tap {
  127. public:
  128. virtual void tap(const Packet *p) = 0;
  129. // tap is given all packets received by the host.
  130. // it must not alter or free the pkt.  If you want to frob it, copy it.
  131. };
  132. class MacHandlerResume : public Handler {
  133. public:
  134. MacHandlerResume(Mac* m) : mac_(m) {}
  135. void handle(Event*);
  136. protected:
  137. Mac* mac_;
  138. };
  139. class MacHandlerSend : public Handler {
  140. public:
  141. MacHandlerSend(Mac* m) : mac_(m) {}
  142. void handle(Event*);
  143. protected:
  144. Mac* mac_;
  145. };
  146. /* ==================================================================
  147.    MAC data structure
  148.    ================================================================*/
  149. class Mac : public BiConnector {
  150. public:
  151. Mac();
  152. virtual void recv(Packet* p, Handler* h);
  153. virtual void sendDown(Packet* p);
  154. virtual void sendUp(Packet *p);
  155. virtual void resume(Packet* p = 0);
  156. virtual void installTap(Tap *t) { tap_ = t; }
  157. inline double txtime(int bytes) {
  158. return (8. * bytes / bandwidth_);
  159. }
  160.   inline double txtime(Packet* p) {
  161. return 8. * (MAC_HDR_LEN + 
  162.      (HDR_CMN(p))->size()) / bandwidth_;
  163. }
  164. inline double bandwidth() const { return bandwidth_; }
  165. inline int addr() { return index_; }
  166. inline MacState state() { return state_; }
  167. inline MacState state(int m) { return state_ = (MacState) m; }
  168.         //mac methods to set dst, src and hdt_type in pkt hdrs.
  169. // note: -1 is the broadcast mac addr.
  170. virtual inline int hdr_dst(char* hdr, int dst = -2) {
  171. struct hdr_mac *dh = (struct hdr_mac*) hdr;
  172. if(dst > -2)
  173. dh->macDA_ = dst;
  174. return dh->macDA();
  175. }
  176. virtual inline int hdr_src(char* hdr, int src = -2) {
  177. struct hdr_mac *dh = (struct hdr_mac*) hdr;
  178. if(src > -2)
  179. dh->macSA_ = src;
  180. return dh->macSA();
  181. }
  182. virtual inline int hdr_type(char *hdr, u_int16_t type = 0) {
  183. struct hdr_mac *dh = (struct hdr_mac*) hdr;
  184. if (type)
  185. dh->hdr_type_ = type;
  186. return dh->hdr_type();
  187. }
  188. //JUNGMIN
  189. inline void setll(LL *ll) {ll_ = ll;}
  190. inline void set_queue(Queue* q) {
  191. if(q == 0) printf("ERROR: Queue is nil!n");
  192. else queue_ = q;
  193. }
  194. virtual int CheckDest(Packet *p);
  195. //end of JUNGMIN
  196. private:
  197.         void mac_log(Packet *p) {
  198.                 logtarget_->recv(p, (Handler*) 0);
  199.         }
  200.         NsObject*       logtarget_;
  201. protected:
  202. int command(int argc, const char*const* argv);
  203. virtual int initialized() { 
  204. return (netif_ && uptarget_ && downtarget_); 
  205. }
  206. int index_; // MAC address
  207. double bandwidth_;      // channel bitrate
  208. double delay_; // MAC overhead
  209. int abstract_;         //   MAC support for abstract LAN 
  210.         
  211. Phy *netif_;            // network interface
  212.         Tap *tap_;              // tap agent
  213. LL *ll_;              // LL this MAC is connected to
  214. //JUNGMIN
  215. Queue* queue_;
  216. //end of JUNGMIN
  217. Channel *channel_; // channel this MAC is connected to
  218. Handler* callback_; // callback for end-of-transmission
  219. MacHandlerResume hRes_; // resume handler
  220. MacHandlerSend hSend_; // handle delay send due to busy channel
  221. Event intr_;
  222. /*
  223.  * Internal MAC State
  224.  */
  225. MacState state_; // MAC's current state
  226. Packet *pktRx_;
  227. Packet *pktTx_;
  228. };
  229. #endif