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

通讯编程

开发平台:

Visual C++

  1. /* -*- c++ -*-
  2.    dsr-priqueue.h
  3.    
  4.    A simple priority queue with a remove packet function
  5.    exported from cmu
  6.    The differentce between this and the ns version is that the ns priority 
  7.    queue maintains one physical queue while giving priority to higher 
  8.    priority packets.
  9.    This priqueue on the other hand maintains separate physical queues
  10.    for different priority levels.
  11.    $Id: dsr-priqueue.h,v 1.1 2002/07/19 02:34:10 haldar Exp $
  12.    */
  13. #ifndef __dsrpriqueue_h__
  14. #define __dsrpriqueue_h__
  15. #include <object.h>
  16. #include <queue.h>
  17. #include <drop-tail.h>
  18. #include <packet.h>
  19. #include "lib/bsd-list.h"
  20. #include <cmu-trace.h>
  21. /* ======================================================================
  22.    The BSD Interface Queues
  23.    ====================================================================== */
  24. struct  ifqueue {
  25.         Packet *ifq_head;
  26.         Packet *ifq_tail;
  27.         int     ifq_len;
  28.         int     ifq_maxlen;
  29.         int     ifq_drops;
  30. };
  31. #define IFQ_MAXLEN 50
  32. #define IF_QFULL(ifq)           ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
  33. #define IF_DROP(ifq)            ((ifq)->ifq_drops++)
  34. #define IF_ENQUEUE(ifq, p) {                 
  35.         (p)->next_ = 0;                 
  36.         if ((ifq)->ifq_tail == 0)                 
  37.                 (ifq)->ifq_head = p;                 
  38.         else                 
  39.                 (ifq)->ifq_tail->next_ = (p);                 
  40.         (ifq)->ifq_tail = (p);                 
  41.         (ifq)->ifq_len++;                 
  42. }
  43. #define IF_DEQUEUE(ifq, p) {
  44.         (p) = (ifq)->ifq_head;
  45.         if (p) {
  46.                 if (((ifq)->ifq_head = (p)->next_) == 0)
  47.                         (ifq)->ifq_tail = 0;
  48.                 (p)->next_ = 0;
  49.                 (ifq)->ifq_len--;
  50.         }
  51. }
  52. /*
  53.  * Control type and number of queues in PriQueue structure.
  54.  */
  55. #define IFQ_RTPROTO 0 /* Routing Protocol Traffic */
  56. #define IFQ_REALTIME 1
  57. #define IFQ_LOWDELAY 2
  58. #define IFQ_NORMAL 3
  59. #define IFQ_MAX 4
  60. typedef int (*PacketFilter)(Packet *, void *);
  61. class CMUPriQueue;
  62. /* ======================================================================
  63.    Handles callbacks for Priority Queues
  64.    ====================================================================== */
  65. class CMUPriQueueHandler : public Handler {
  66. public:
  67.   inline CMUPriQueueHandler(CMUPriQueue *ifq) : qh_ifq(ifq) {}
  68.   void handle(Event*);
  69. private: 
  70.   CMUPriQueue *qh_ifq;
  71. };
  72. /* ======================================================================
  73.    Priority Queues
  74.    ====================================================================== */
  75. class CMUPriQueue : public Connector {
  76.   //friend class CMUPriQueueManager;
  77. public:
  78.   CMUPriQueue();
  79.   int     command(int argc, const char*const* argv);
  80.   /* called by upper layers to enque the packet */
  81.   void    recv(Packet *p, Handler*);
  82.   
  83.   /* called by lower layers to get the next packet */
  84.   void prq_resume(void);
  85.   
  86.   void Terminate(void); /* called at end of simulation */
  87.   
  88.   Packet* prq_get_nexthop(nsaddr_t id);
  89.   int prq_isfull(Packet *p);
  90.   int prq_length(void);
  91.   
  92. private:
  93.   int prq_assign_queue(Packet *p);
  94.   void prq_enqueue(Packet *p);
  95.   Packet* prq_dequeue(void);
  96.   void prq_validate(void);
  97.   
  98.   struct ifqueue prq_snd_[IFQ_MAX];
  99.   nsaddr_t prq_ipaddr_; /* IP Address of this machine */
  100.   Trace* prq_logtarget_; /* Used for logging */
  101.   int prq_blocked_;
  102.   CMUPriQueueHandler prq_qh_;
  103. protected:
  104.   void trace(char* fmt, ...);
  105.   void log_stats(void);
  106.   //TAILQ_ENTRY(CMUPriQueue) prq_list_;
  107.   int qlen_logthresh_; /* see run.tcl */
  108.   int fw_logthresh_; /* see run.tcl */
  109.   
  110.   int last_ifqlen_[IFQ_MAX];
  111.   int stat_send_; /* packets sent to lower layers */
  112.   int stat_recv_; /* packets received from upper layer */
  113.   int stat_blocked_; /* blocked on received */
  114. };
  115. #endif /* __priqueue_h__ */