src/dsr/model/dsr-maintain-buff.h
changeset 8751 efad81f3cb47
child 8752 2da1fab73114
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dsr/model/dsr-maintain-buff.h	Fri Jan 27 15:15:48 2012 -0800
@@ -0,0 +1,258 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Yufei Cheng
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Yufei Cheng   <yfcheng@ittc.ku.edu>
+ *
+ * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
+ * ResiliNets Research Group  http://wiki.ittc.ku.edu/resilinets
+ * Information and Telecommunication Technology Center (ITTC)
+ * and Department of Electrical Engineering and Computer Science
+ * The University of Kansas Lawrence, KS USA.
+ *
+ * Work supported in part by NSF FIND (Future Internet Design) Program
+ * under grant CNS-0626918 (Postmodern Internet Architecture),
+ * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
+ * US Department of Defense (DoD), and ITTC at The University of Kansas.
+ */
+
+#ifndef DSR_MAINTAIN_BUFF_H
+#define DSR_MAINTAIN_BUFF_H
+
+#include <vector>
+#include "ns3/ipv4-routing-protocol.h"
+#include "ns3/simulator.h"
+#include "ns3/ipv4-header.h"
+#include "dsr-option-header.h"
+
+
+namespace ns3 {
+namespace dsr {
+/*
+ * The maintenance buffer is responsible for maintaining packet next hop delivery
+ * The data packet is saved in maintenance buffer whenever the data packet is sent out of send buffer
+ */
+
+/*
+ * The packet timer key for controlling data packet retransmission
+ */
+struct PacketKey
+{
+  uint16_t m_ackId;
+  Ipv4Address m_ourAdd;
+  Ipv4Address m_nextHop;
+  Ipv4Address m_source;
+  Ipv4Address m_destination;
+  uint8_t m_segsLeft;
+
+  /**
+   * Compare maintain Buffer entries
+   * \return true if equal
+   */
+  bool operator < (PacketKey const & o) const
+  {
+    return ((m_ackId < o.m_ackId) && (m_ourAdd < o.m_ourAdd) && (m_nextHop < o.m_nextHop) && (m_source < o.m_source)
+            && (m_destination < o.m_destination) && (m_segsLeft < o.m_segsLeft)
+            );
+  }
+};
+/**
+ * \ingroup dsr
+ * \brief DSR Maintain Buffer Entry
+ */
+class MaintainBuffEntry
+{
+public:
+  // / c-tor
+  MaintainBuffEntry (Ptr<const Packet> pa = 0, Ipv4Address us = Ipv4Address (),
+                     Ipv4Address n = Ipv4Address (), Ipv4Address s = Ipv4Address (), Ipv4Address dst = Ipv4Address (),
+                     uint16_t ackId = 0, uint8_t segs = 0, Time exp = Simulator::Now ())
+    : m_packet (pa),
+      m_ourAdd (us),
+      m_nextHop (n),
+      m_src (s),
+      m_dst (dst),
+      m_ackId (ackId),
+      m_segsLeft (segs),
+      m_isPassive (true),
+      m_expire (exp + Simulator::Now ())
+  {
+  }
+
+  // /\name Fields
+  // \{
+  Ptr<const Packet> GetPacket () const
+  {
+    return m_packet;
+  }
+  void SetPacket (Ptr<const Packet> p)
+  {
+    m_packet = p;
+  }
+  Ipv4Address GetOurAdd () const
+  {
+    return m_ourAdd;
+  }
+  void SetOurAdd (Ipv4Address us)
+  {
+    m_ourAdd = us;
+  }
+  Ipv4Address GetNextHop () const
+  {
+    return m_nextHop;
+  }
+  void SetNextHop (Ipv4Address n)
+  {
+    m_nextHop = n;
+  }
+  Ipv4Address GetDst () const
+  {
+    return m_dst;
+  }
+  void SetDst (Ipv4Address n)
+  {
+    m_dst = n;
+  }
+  Ipv4Address GetSrc () const
+  {
+    return m_src;
+  }
+  void SetSrc (Ipv4Address s)
+  {
+    m_src = s;
+  }
+  uint16_t GetAckId () const
+  {
+    return m_ackId;
+  }
+  void SetAckId (uint16_t ackId)
+  {
+    m_ackId = ackId;
+  }
+  uint8_t GetSegsLeft () const
+  {
+    return m_segsLeft;
+  }
+  void SetSegsLeft (uint8_t segs)
+  {
+    m_segsLeft = segs;
+  }
+  bool GetPassive () const
+  {
+    return m_isPassive;
+  }
+  void SetPassive (bool pa)
+  {
+    m_isPassive = pa;
+  }
+  void SetExpireTime (Time exp)
+  {
+    m_expire = exp + Simulator::Now ();
+  }
+  Time GetExpireTime () const
+  {
+    return m_expire - Simulator::Now ();
+  }
+  // \}
+private:
+  // / Data packet
+  Ptr<const Packet> m_packet;
+  // / our own ip address
+  Ipv4Address m_ourAdd;
+  // / Next hop Ip address
+  Ipv4Address m_nextHop;
+  // / The source address
+  Ipv4Address m_src;
+  // / The destination address
+  Ipv4Address m_dst;
+  // / The data ack id
+  uint16_t m_ackId;
+  // / The ipv4 id
+  uint16_t m_id;
+  // / The segments left field
+  uint8_t m_segsLeft;
+  // / The fragment offset of ipv4 header
+  uint16_t m_fragment;
+  // / if the ack metric is passive ack or not
+  bool m_isPassive;
+  // / Expire time for queue entry
+  Time m_expire;
+};
+/**
+ * \ingroup dsr
+ * \brief DSR maintain buffer
+ */
+/************************************************************************************************************************/
+class MaintainBuffer
+{
+public:
+  // / Default c-tor
+  MaintainBuffer ()
+  {
+  }
+  // / Push entry in queue, if there is no entry with the same packet and destination address in queue.
+  bool Enqueue (MaintainBuffEntry & entry);
+  // / Return first found (the earliest) entry for given destination
+  bool Dequeue (Ipv4Address dst, MaintainBuffEntry & entry);
+  // / Remove all packets with destination IP address dst
+  void DropPacketWithNextHop (Ipv4Address nextHop);
+  // / Finds whether a packet with destination dst exists in the queue
+  bool Find (Ipv4Address nextHop);
+  // / Number of entries
+  uint32_t GetSize ();
+  // /\name Fields
+  // \{
+  uint32_t GetMaxQueueLen () const
+  {
+    return m_maxLen;
+  }
+  void SetMaxQueueLen (uint32_t len)
+  {
+    m_maxLen = len;
+  }
+  Time GetMaintainBufferTimeout () const
+  {
+    return m_maintainBufferTimeout;
+  }
+  void SetMaintainBufferTimeout (Time t)
+  {
+    m_maintainBufferTimeout = t;
+  }
+  // / Verify if the maintain buffer entry is the same in every field for network ack
+  bool AllEqual (MaintainBuffEntry & entry);
+  // / Verify if the maintain buffer entry is the same in every field for promiscuous ack
+  bool PromiscEqual (MaintainBuffEntry & entry);
+  // \}
+
+private:
+  // / The vector of maintain buffer entries
+  std::vector<MaintainBuffEntry> m_maintainBuffer;
+  // / Remove all expired entries
+  void Purge ();
+  // / The maximum number of packets that we allow a routing protocol to buffer.
+  uint32_t m_maxLen;
+  // / The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
+  Time m_maintainBufferTimeout;
+  // / Verify if the maintain buffer is equal or not
+  static bool IsEqual (MaintainBuffEntry en, const Ipv4Address nextHop)
+  {
+    return (en.GetNextHop () == nextHop);
+  }
+};
+/*******************************************************************************************************************************/
+} // namespace dsr
+} // namespace ns3
+#endif /* DSR_MAINTAIN_BUFF_H */