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

通讯编程

开发平台:

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 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: /cvsroot/nsnam/ns-2/mac/mac.h,v 1.37 2008/01/24 01:53:19 tom_henderson 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_BCN = 0x0300,
  74. MAC_CTS = 0x0400,
  75. MAC_ACK = 0x0800,
  76. MAC_COLL = 0x1000,
  77. MAC_MGMT = 0x1001
  78. };
  79. enum MacFrameType {
  80. MF_BEACON = 0x0008, // beaconing
  81. MF_CONTROL = 0x0010, // used as mask for control frame
  82. MF_SLOTS = 0x001a, // announce slots open for contention
  83. MF_RTS = 0x001b, // request to send
  84. MF_CTS = 0x001c, // clear to send, grant
  85. MF_ACK = 0x001d, // acknowledgement
  86. MF_CF_END = 0x001e, // contention free period end
  87. MF_POLL = 0x001f, // polling
  88. MF_DATA = 0x0020, // also used as mask for data frame
  89. MF_DATA_ACK = 0x0021  // ack for data frames
  90. };
  91. struct hdr_mac {
  92. MacFrameType ftype_; // frame type
  93. int macSA_; // source MAC address
  94. int macDA_; // destination MAC address
  95. u_int16_t hdr_type_;     // mac_hdr type
  96. double txtime_; // transmission time
  97. double sstime_; // slot start time
  98. int padding_;
  99. inline void set(MacFrameType ft, int sa, int da=-1) {
  100. ftype_ = ft;
  101. macSA_ = sa;
  102. if (da != -1)  macDA_ = da;
  103. }
  104. inline MacFrameType& ftype() { return ftype_; }
  105. inline int& macSA() { return macSA_; }
  106. inline int& macDA() { return macDA_; }
  107. inline u_int16_t& hdr_type() {return hdr_type_; }
  108. inline double& txtime() { return txtime_; }
  109. inline double& sstime() { return sstime_; }
  110. // Header access methods
  111. static int offset_;
  112. inline static int& offset() { return offset_; }
  113. inline static hdr_mac* access(const Packet* p) {
  114. return (hdr_mac*) p->access(offset_);
  115. }
  116. };
  117. /* ===================================================================
  118.    Objects that want to promiscously listen to the packets before
  119.    address filtering must inherit from class Tap in order to plug into
  120.    the tap
  121.    =================================================================*/
  122. class Tap {
  123. public:
  124. virtual ~Tap () {}
  125. virtual void tap(const Packet *p) = 0;
  126. // tap is given all packets received by the host.
  127. // it must not alter or free the pkt.  If you want to frob it, copy it.
  128. };
  129. class MacHandlerResume : public Handler {
  130. public:
  131. MacHandlerResume(Mac* m) : mac_(m) {}
  132. void handle(Event*);
  133. protected:
  134. Mac* mac_;
  135. };
  136. class MacHandlerSend : public Handler {
  137. public:
  138. MacHandlerSend(Mac* m) : mac_(m) {}
  139. void handle(Event*);
  140. protected:
  141. Mac* mac_;
  142. };
  143. /* ==================================================================
  144.    MAC data structure
  145.    ================================================================*/
  146. class Mac : public BiConnector {
  147. public:
  148. Mac();
  149. virtual void recv(Packet* p, Handler* h);
  150. virtual void sendDown(Packet* p);
  151. virtual void sendUp(Packet *p);
  152. virtual void resume(Packet* p = 0);
  153. virtual void installTap(Tap *t) { tap_ = t; }
  154. inline double txtime(int bytes) {
  155. return (8. * bytes / bandwidth_);
  156. }
  157.   inline double txtime(Packet* p) {
  158. return 8. * (MAC_HDR_LEN + 
  159.      (HDR_CMN(p))->size()) / bandwidth_;
  160. }
  161. inline double bandwidth() const { return bandwidth_; }
  162. inline int addr() { return index_; }
  163. inline MacState state() { return state_; }
  164. inline MacState state(int m) { return state_ = (MacState) m; }
  165.         //mac methods to set dst, src and hdt_type in pkt hdrs.
  166. // note: -1 is the broadcast mac addr.
  167. virtual inline int hdr_dst(char* hdr, int dst = -2) {
  168. struct hdr_mac *dh = (struct hdr_mac*) hdr;
  169. if(dst > -2)
  170. dh->macDA_ = dst;
  171. return dh->macDA();
  172. }
  173. virtual inline int hdr_src(char* hdr, int src = -2) {
  174. struct hdr_mac *dh = (struct hdr_mac*) hdr;
  175. if(src > -2)
  176. dh->macSA_ = src;
  177. return dh->macSA();
  178. }
  179. virtual inline int hdr_type(char *hdr, u_int16_t type = 0) {
  180. struct hdr_mac *dh = (struct hdr_mac*) hdr;
  181. if (type)
  182. dh->hdr_type_ = type;
  183. return dh->hdr_type();
  184. }
  185. private:
  186.         void mac_log(Packet *p) {
  187.                 logtarget_->recv(p, (Handler*) 0);
  188.         }
  189.         NsObject*       logtarget_;
  190. protected:
  191. int command(int argc, const char*const* argv);
  192. virtual int initialized() { 
  193. return (netif_ && uptarget_ && downtarget_); 
  194. }
  195. int index_; // MAC address
  196. double bandwidth_;      // channel bitrate
  197. double delay_; // MAC overhead
  198. int abstract_;         //   MAC support for abstract LAN 
  199.         
  200. Phy *netif_;            // network interface
  201.         Tap *tap_;              // tap agent
  202. LL *ll_;              // LL this MAC is connected to
  203. Channel *channel_; // channel this MAC is connected to
  204. Handler* callback_; // callback for end-of-transmission
  205. MacHandlerResume hRes_; // resume handler
  206. MacHandlerSend hSend_; // handle delay send due to busy channel
  207. Event intr_;
  208. /*
  209.  * Internal MAC State
  210.  */
  211. MacState state_; // MAC's current state
  212. Packet *pktRx_;
  213. Packet *pktTx_;
  214. };
  215. #endif