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

通讯编程

开发平台:

Visual C++

  1. #ifndef __mac_802_3_h__
  2. #define __mac_802_3_h__
  3. #include <assert.h>
  4. #include "mac.h"
  5. #define min(x, y) ((x) < (y) ? (x) : (y))
  6. #define ETHER_HDR_LEN ((ETHER_ADDR_LEN << 1) + ETHER_TYPE_LEN)
  7. /*
  8.  10Mbps:
  9. #define IEEE_8023_SLOT 0.000051200 // 512 bit times
  10. #define IEEE_8023_IFS 0.000009600 // 9.6us interframe spacing
  11.  100Mbps:
  12. #define IEEE_8023_SLOT                0.0000051200    //512 bit time
  13. #define IEEE_8023_IFS                 0.0000009600    //0.96us interframe spacing
  14. */
  15. #define IEEE_8023_SLOT_BITS             512.0 //when we divide these by the bandwidth
  16. #define IEEE_8023_IFS_BITS               96.0 //we'll have what we want
  17. #define IEEE_8023_ALIMIT 16 // attempt limit
  18. #define IEEE_8023_BLIMIT 10 // backoff limit
  19. #define IEEE_8023_JAMSIZE 32 // bits
  20. #define IEEE_8023_MAXFRAME 1518 // bytes
  21. #define IEEE_8023_MINFRAME 64 // bytes
  22. #define INVALID_UID             -1              // Used for mac level traces
  23. #define INVALID_TIME            -1
  24. /* ======================================================================
  25.    Handler Functions
  26.    ====================================================================== */
  27. class Mac802_3;
  28. class MacHandler : public Handler {
  29. public:
  30. MacHandler(Mac802_3* m) :  callback(0), mac(m), busy_(false) {}
  31. virtual void handle(Event *e) = 0;
  32. virtual inline void cancel();
  33. bool busy(void) { return busy_; }
  34. double expire(void) { return intr.time_; }
  35. protected:
  36. Handler *callback;
  37. Mac802_3 *mac;
  38. Event intr;
  39. bool busy_;
  40. };
  41. class Mac8023HandlerSend : public MacHandler {
  42.  public:
  43. Mac8023HandlerSend(Mac802_3* m) : MacHandler(m), p_(0) {}
  44. void handle(Event*);
  45. void schedule(const Packet *p, double t);
  46. void cancel();
  47. const Packet *packet() const { return p_; }
  48.  protected:
  49. const Packet *p_;
  50. };
  51. class MacHandlerRecv : public MacHandler {
  52. public:
  53. MacHandlerRecv(Mac802_3* m) : MacHandler(m), p_(0) {}
  54. void handle(Event*);
  55. void schedule(Packet *p, double t);
  56. virtual void cancel();
  57. private:
  58. Packet *p_;
  59. };
  60. class MacHandlerRetx : public MacHandler {
  61.  public:
  62. MacHandlerRetx(Mac802_3* m) : MacHandler(m), p_(0), try_(1) {}
  63. void reset() {
  64. // before calling reset, you MUST free or drop p_
  65. if (busy_) cancel();
  66. try_= 1;
  67. p_= 0;
  68. }
  69. void handle(Event*);
  70. bool schedule(double delta=0.0);
  71. void cancel();
  72. void free() { 
  73. if (p_) {
  74. Packet::free(p_);
  75. p_= 0;
  76. }
  77. }
  78. Packet* packet() const { return p_; }
  79. void packet(Packet *p) { p_= p; }
  80. private:
  81. Packet *p_;
  82. int try_;
  83. };
  84. class MacHandlerIFS : public MacHandler {
  85.  public:
  86. MacHandlerIFS(Mac802_3* m) : MacHandler(m) {}
  87. void handle (Event*); 
  88. void schedule(double t);
  89. void cancel();
  90. };
  91. /* ======================================================================
  92.    MAC data structure
  93.    ====================================================================== */
  94. class Mac802_3 : public Mac {
  95. friend class MacHandler;
  96. friend class MacHandlerRecv;
  97. friend class Mac8023HandlerSend;
  98. friend class MacHandlerRetx;
  99. friend class MacHandlerIFS;
  100.  public:
  101. Mac802_3();
  102. void recv(Packet* p, Handler* h) {
  103. BiConnector::recv(p, h);
  104. }
  105.  protected:
  106. void sendDown(Packet* p, Handler* h);
  107. void sendUp(Packet* p, Handler* h);
  108. /*
  109. inline int hdr_dst(char* hdr, u_int32_t dst = -2);
  110. inline int hdr_src(char* hdr, u_int32_t src = -2);
  111. inline int hdr_type(char* hdr, u_int16_t type = 0);
  112. */
  113. void recv_complete(Packet *p);
  114. virtual void resume();
  115. //protected:
  116. virtual void transmit(Packet* p);
  117. int trace_;      // To turn on MAC level collision traces 
  118. private:
  119. //void send(Packet *p, Handler *h);
  120. void collision(Packet *p);
  121. //int pktTxcnt;
  122. MacHandlerRecv mhRecv_;
  123. MacHandlerRetx  mhRetx_;
  124. MacHandlerIFS   mhIFS_;
  125. Mac8023HandlerSend mhSend_;
  126. };
  127. #endif /* __mac_802_3_h__ */