00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __dsrpriqueue_h__
00014 #define __dsrpriqueue_h__
00015
00016 #include <object.h>
00017 #include <queue.h>
00018 #include <drop-tail.h>
00019 #include <packet.h>
00020 #include "lib/bsd-list.h"
00021 #include <cmu-trace.h>
00022
00023
00024
00025
00026 struct ifqueue {
00027 Packet *ifq_head;
00028 Packet *ifq_tail;
00029 int ifq_len;
00030 int ifq_maxlen;
00031 int ifq_drops;
00032 };
00033 #define IFQ_MAXLEN 50
00034
00035 #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
00036 #define IF_DROP(ifq) ((ifq)->ifq_drops++)
00037 #define IF_ENQUEUE(ifq, p) { \
00038 (p)->next_ = 0; \
00039 if ((ifq)->ifq_tail == 0) \
00040 (ifq)->ifq_head = p; \
00041 else \
00042 (ifq)->ifq_tail->next_ = (p); \
00043 (ifq)->ifq_tail = (p); \
00044 (ifq)->ifq_len++; \
00045 }
00046 #define IF_DEQUEUE(ifq, p) { \
00047 (p) = (ifq)->ifq_head; \
00048 if (p) { \
00049 if (((ifq)->ifq_head = (p)->next_) == 0) \
00050 (ifq)->ifq_tail = 0; \
00051 (p)->next_ = 0; \
00052 (ifq)->ifq_len--; \
00053 } \
00054 }
00055
00056
00057
00058
00059
00060 #define IFQ_RTPROTO 0
00061 #define IFQ_REALTIME 1
00062 #define IFQ_LOWDELAY 2
00063 #define IFQ_NORMAL 3
00064 #define IFQ_MAX 4
00065
00066 typedef int (*PacketFilter)(Packet *, void *);
00067
00068 class CMUPriQueue;
00069
00070
00071
00072
00073 class CMUPriQueueHandler : public Handler {
00074 public:
00075 inline CMUPriQueueHandler(CMUPriQueue *ifq) : qh_ifq(ifq) {}
00076 void handle(Event*);
00077 private:
00078 CMUPriQueue *qh_ifq;
00079 };
00080
00081
00082
00083
00084 class CMUPriQueue : public Connector {
00085
00086 public:
00087 CMUPriQueue();
00088
00089 int command(int argc, const char*const* argv);
00090
00091
00092 void recv(Packet *p, Handler*);
00093
00094
00095 void prq_resume(void);
00096
00097 void Terminate(void);
00098
00099 Packet* prq_get_nexthop(nsaddr_t id);
00100 int prq_isfull(Packet *p);
00101 int prq_length(void);
00102
00103 private:
00104 int prq_assign_queue(Packet *p);
00105 void prq_enqueue(Packet *p);
00106 Packet* prq_dequeue(void);
00107 void prq_validate(void);
00108
00109 struct ifqueue prq_snd_[IFQ_MAX];
00110 nsaddr_t prq_ipaddr_;
00111 Trace* prq_logtarget_;
00112 int prq_blocked_;
00113 CMUPriQueueHandler prq_qh_;
00114
00115 protected:
00116 void trace(char* fmt, ...);
00117 void log_stats(void);
00118
00119
00120 int qlen_logthresh_;
00121 int fw_logthresh_;
00122
00123 int last_ifqlen_[IFQ_MAX];
00124 int stat_send_;
00125 int stat_recv_;
00126 int stat_blocked_;
00127 };
00128
00129 #endif