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

通讯编程

开发平台:

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 Computer Systems
  17.  *      Engineering Group at Lawrence Berkeley Laboratory.
  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. /* Ported from CMU/Monarch's code*/
  35. /* -*- c++ -*-
  36.    rexmit_queue.h
  37.    $Id: dest_queue.h,v 1.3 2000/08/17 00:03:38 haoboy Exp $
  38.    */
  39. #ifndef __dest_queue_h__
  40. #define __dest_queue_h__
  41. #include <packet.h>
  42. #include "lib/bsd-list.h"
  43. #define ILLEGAL_SEQ 257
  44. typedef double Time;
  45. class txent;
  46. class dstent;
  47. class imepAgent;
  48. //////////////////////////////////////////////////////////////////////
  49. // Transmit Queue Entry
  50. class txent {
  51. friend class dstent;
  52. friend class dstQueue;
  53. protected:
  54. txent(double e, u_int32_t s, Packet *p);
  55. LIST_ENTRY(txent) link;
  56. // public so that I can use the list macros
  57. double expire() { return expire_; }
  58. u_int32_t seqno() { return seqno_; }
  59. Packet *pkt() { return pkt_; }
  60. private:
  61. double expire_; // time "p" expires and must be sent
  62. u_int32_t seqno_; // sequence number of the packet "p".
  63. Packet *pkt_;
  64. };
  65. LIST_HEAD(txent_head, txent);
  66. //////////////////////////////////////////////////////////////////////
  67. // Destination Queue Entry
  68. class dstent {
  69. friend class dstQueue;
  70. protected:
  71. dstent(nsaddr_t index);
  72. LIST_ENTRY(dstent) link;
  73. void addEntry(double e, u_int32_t s, Packet *p);
  74. // add's a packet to the txentHead list.
  75. void delEntry(txent *t);
  76. // remove's a packet (transmit entry) from the txentHead list.
  77. txent* findEntry(u_int32_t s);
  78. // locates a packet with sequence "s" in the txentHead list.
  79. txent* findFirstEntry(void);
  80. nsaddr_t ipaddr() { return ipaddr_; }
  81. u_int32_t& seqno() { return seqno_; }
  82. inline double expire() {
  83. txent *t;
  84. double min = 0.0;
  85. for(t = txentHead.lh_first; t; t = t->link.le_next) {
  86. if(min == 0.0 || (t->expire() && t->expire() < min))
  87. min = t->expire();
  88. }
  89. return min;
  90. }
  91. private:
  92. nsaddr_t ipaddr_; // ip address of this destination
  93. txent_head txentHead; // sorted by sequence number
  94. u_int32_t seqno_; // last sequence number sent up the stack
  95. };
  96. LIST_HEAD(dstend_head, dstent);
  97. //////////////////////////////////////////////////////////////////////
  98. // Destination Queue
  99. class dstQueue {
  100. public:
  101. dstQueue(imepAgent *a, nsaddr_t index);
  102. void addEntry(nsaddr_t dst, double e, u_int32_t s, Packet *p);
  103. // add's a packet to the list.
  104. Packet* getPacket(nsaddr_t dst, u_int32_t seqno);
  105. // returns the packet with the following sequence nubmer "seqno".`
  106.         // removes packet from queue
  107. Time getNextExpire();
  108. // returns the time that the next packet will expire.
  109. Packet* getNextPacket(u_int32_t& seqno);
  110. // returns "expired" packets (in sequence order, if any).
  111.         void deleteDst(nsaddr_t dst);
  112.         // remove and free all packets from dst
  113. void dumpAll(void);
  114. private:
  115. dstent* findEntry(nsaddr_t dst);
  116. dstend_head dstentHead; // head of the destination list
  117. imepAgent *agent_;
  118. nsaddr_t ipaddr_;
  119. };
  120. #endif // __dest_queue_h__