src/dsr/model/dsr-gratuitous-reply-table.h
changeset 8751 efad81f3cb47
child 10521 81a6f41319cc
equal deleted inserted replaced
8750:b3db7d51f260 8751:efad81f3cb47
       
     1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
       
     2 /*
       
     3  * Copyright (c) 2011 Yufei Cheng
       
     4  *
       
     5  * This program is free software; you can redistribute it and/or modify
       
     6  * it under the terms of the GNU General Public License version 2 as
       
     7  * published by the Free Software Foundation;
       
     8  *
       
     9  * This program is distributed in the hope that it will be useful,
       
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    12  * GNU General Public License for more details.
       
    13  *
       
    14  * You should have received a copy of the GNU General Public License
       
    15  * along with this program; if not, write to the Free Software
       
    16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    17  *
       
    18  * Author: Yufei Cheng   <yfcheng@ittc.ku.edu>
       
    19  *
       
    20  * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
       
    21  * ResiliNets Research Group  http://wiki.ittc.ku.edu/resilinets
       
    22  * Information and Telecommunication Technology Center (ITTC)
       
    23  * and Department of Electrical Engineering and Computer Science
       
    24  * The University of Kansas Lawrence, KS USA.
       
    25  *
       
    26  * Work supported in part by NSF FIND (Future Internet Design) Program
       
    27  * under grant CNS-0626918 (Postmodern Internet Architecture),
       
    28  * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
       
    29  * US Department of Defense (DoD), and ITTC at The University of Kansas.
       
    30  */
       
    31 
       
    32 #ifndef DSR_GRATUITOUS_REPLY_TABLE_H
       
    33 #define DSR_GRATUITOUS_REPLY_TABLE_H
       
    34 
       
    35 #include "ns3/simulator.h"
       
    36 #include "ns3/timer.h"
       
    37 #include "ns3/ipv4-address.h"
       
    38 #include "ns3/callback.h"
       
    39 #include <vector>
       
    40 
       
    41 namespace ns3 {
       
    42 namespace dsr {
       
    43 /*
       
    44  * The gratuitous table entries, it maintains the already sent gratuitous route reply entries.
       
    45  * When the node "promiscuously" received a packet destined for other nodes, and inferred a shorter
       
    46  * route for the data packet, it will construct a route reply and send back to the source
       
    47  */
       
    48 struct GraReplyEntry
       
    49 {
       
    50   Ipv4Address m_replyTo;
       
    51   Ipv4Address m_hearFrom;
       
    52   Time m_gratReplyHoldoff;
       
    53 
       
    54   GraReplyEntry (Ipv4Address t, Ipv4Address f, Time h)
       
    55     : m_replyTo (t),
       
    56       m_hearFrom (f),
       
    57       m_gratReplyHoldoff (h)
       
    58   {
       
    59   }
       
    60 };
       
    61 /**
       
    62  * \ingroup dsr
       
    63  * \brief maintain the gratuitous reply
       
    64  */
       
    65 class GraReply  : public Object
       
    66 {
       
    67 public:
       
    68   // / c-tor
       
    69   /**
       
    70    * \brief Get the type identificator.
       
    71    * \return type identificator
       
    72    */
       
    73   static TypeId GetTypeId ();
       
    74   /**
       
    75    * \brief Constructor.
       
    76    */
       
    77   GraReply ();
       
    78   /**
       
    79    * \brief Destructor.
       
    80    */
       
    81   virtual ~GraReply ();
       
    82   // / Set the gratuitous reply table size
       
    83   void SetGraTableSize (uint32_t g)
       
    84   {
       
    85     GraReplyTableSize = g;
       
    86   }
       
    87   // / Get the gratuitous reply table size
       
    88   uint32_t GetGraTableSize () const
       
    89   {
       
    90     return GraReplyTableSize;
       
    91   }
       
    92   // / Add a new gratuitous reply entry
       
    93   bool AddEntry (GraReplyEntry & graTableEntry);
       
    94   // / Update the route entry if found, create a new one if not
       
    95   bool FindAndUpdate (Ipv4Address replyTo, Ipv4Address replyFrom, Time gratReplyHoldoff);
       
    96   // / Remove all expired entries
       
    97   void Purge ();
       
    98   // / Remove all entries
       
    99   void Clear ()
       
   100   {
       
   101     m_graReply.clear ();
       
   102   }
       
   103 
       
   104 private:
       
   105   // / Vector of entries
       
   106   std::vector<GraReplyEntry> m_graReply;
       
   107   // / The max # of gratuitous reply entries to hold
       
   108   uint32_t GraReplyTableSize;
       
   109 
       
   110   // / Check if the entry is expired or not
       
   111   struct IsExpired
       
   112   {
       
   113     bool operator() (const struct GraReplyEntry & b) const
       
   114     {
       
   115       return (b.m_gratReplyHoldoff < Simulator::Now ());
       
   116     }
       
   117   };
       
   118 };
       
   119 }  // namespace dsr
       
   120 }  // namespace ns3
       
   121 
       
   122 #endif /* DSR_GRATUITOUS_REPLY_TABLE_H */