semantic-packetqueue.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) 1996-1997 The 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 
  17.  *      Research Group at the University of California, Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group 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.  * @(#) $Header: /cvsroot/nsnam/ns-2/queue/semantic-packetqueue.h,v 1.9 2002/05/07 18:28:28 haldar Exp $ (UCB)
  35.  */
  36. #ifndef ns_semantic_packetqueue_h
  37. #define ns_semantic_packetqueue_h
  38. #include "object.h"
  39. #include "connector.h"
  40. #include "packet.h"
  41. #include "queue.h"
  42. #include "flags.h"
  43. #include "random.h"
  44. #include "tcp.h"
  45. class AckReconsController;
  46. /*
  47.  * This flavor of PacketQueue includes several buffer management and
  48.  * scheduling policies that are based on higher-layer semantics (e.g.,
  49.  * TCP semantics) of packets.
  50.  */
  51. class SemanticPacketQueue : public PacketQueue {
  52.   public:
  53. SemanticPacketQueue();
  54. int command(int argc, const char*const* argv);
  55. /* deque TCP acks before any other type of packet */
  56. Packet* deque_acksfirst();
  57. /* determine whether two packets belong to the same connection */
  58. inline int compareFlows(hdr_ip *ip1, hdr_ip *ip2) {
  59. return ((ip1->saddr() == ip2->saddr()) &&
  60. (ip1->sport() == ip2->sport()) &&
  61. (ip1->daddr() == ip2->daddr()) && 
  62. (ip1->dport() == ip2->dport())); 
  63. }
  64. /*
  65.  * When a new ack is enqued, purge older acks (as determined by the 
  66.  * sequence number of the ack field) from the queue. The enqued ack
  67.  * remains at the tail of the queue, unless replace_head is true, in 
  68.  * which case the new ack takes the place of the old ack closest to
  69.  * the head of the queue.
  70.  */
  71. void filterAcks(Packet *pkt, int replace_head); 
  72. /* check whether packet is marked */
  73. int isMarked(Packet *p);
  74. /* pick out the index'th packet of the right kind (marked/unmarked) */
  75. Packet *lookup(int index, int markedFlag);
  76. /* pick packet for ECN notification (either marking or dropping) */
  77. Packet *pickPacketForECN(Packet *pkt);
  78. /* pick a packet to drop when the queue is full */
  79. Packet *pickPacketToDrop();
  80. /* 
  81.  * Remove a specific packet given pointers to it and its predecessor
  82.  * in the queue. p and/or pp may be NULL.
  83.  */
  84. void remove(Packet* p, Packet* pp);
  85. inline Packet* head() { return head_; }
  86. /* count of packets of various types */
  87. int ack_count; /* number of TCP acks in the queue */
  88. int data_count; /* number of non-ack packets in the queue */
  89. int acks_to_send; /* number of ack to send in current schedule */
  90. int marked_count_; /* number of marked packets */
  91. int unmarked_count_; /* number of unmarked packets */
  92. /* 
  93.  * These indicator variables are bound in derived objects and
  94.  * define queueing/scheduling polcies.
  95.  */
  96. int acksfirst_; /* deque TCP acks before any other data */
  97. int filteracks_; /* purge old acks when new one arrives */
  98. int reconsAcks_; /* set up queue as an ack recontructor */
  99. int replace_head_; /* new ack should take the place of old ack
  100.    closest to the head */
  101. int priority_drop_; /* drop marked (low priority) packets first */
  102. int random_drop_; /* pick packet to drop at random */
  103. int random_ecn_; /* pick packet for ECN at random */
  104. virtual Packet* deque();
  105. Packet* enque(Packet *); // Returns prev tail
  106. virtual inline void enque_head(Packet *p) {
  107. if (len_ == 0)
  108. PacketQueue::enque(p);
  109. else {
  110. p->next_ = head_;
  111. head_ = p;
  112. ++len_;
  113. }
  114. }
  115. virtual void remove(Packet *);
  116. AckReconsController *reconsCtrl_;
  117. };
  118. #endif