blob: 8bb746e0effc9b70f3d29608bba17997670e17ec [file] [log] [blame]
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2011 University of California, Los Angeles
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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
21#ifndef _CCNX_PIT_H_
22#define _CCNX_PIT_H_
23
Alexander Afanasyevcf133f02011-09-06 12:13:48 -070024#include "ns3/object.h"
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070025#include "ns3/nstime.h"
26#include "ns3/event-id.h"
27
Alexander Afanasyev161a5c42012-04-17 15:14:04 -070028#include "ccnx-name-components-hash-helper.h"
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070029#include "ccnx-pit-entry.h"
30
31#include <boost/multi_index_container.hpp>
32#include <boost/multi_index/tag.hpp>
33#include <boost/multi_index/ordered_index.hpp>
34#include <boost/multi_index/composite_key.hpp>
35#include <boost/multi_index/hashed_index.hpp>
36#include <boost/multi_index/member.hpp>
37#include <boost/multi_index/mem_fun.hpp>
Ilya Moiseenko1c73cb52011-10-28 13:13:11 -070038#include <map>
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070039#include <iostream>
Ilya Moiseenko1c73cb52011-10-28 13:13:11 -070040#include <algorithm>
Alexander Afanasyeva46844b2011-11-21 19:13:26 -080041#include <boost/tuple/tuple.hpp>
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070042
43namespace ns3 {
44
45class Ccnx;
46class CcnxFace;
47class CcnxContentObjectHeader;
48class CcnxInterestHeader;
49
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070050/// @cond include_hidden
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070051/**
52 * \ingroup ccnx
53 * \private
54 * \brief Private namespace for CCNx PIT implementation
55 */
56namespace __ccnx_private
57{
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -070058// class i_prefix{}; ///< tag for prefix hash
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070059class i_timestamp {}; ///< tag for timestamp-ordered records (for cleanup optimization)
60};
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070061/// @endcond
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070062
63/**
64 * \ingroup ccnx
65 * \brief Typedef for RIT container implemented as a Boost.MultiIndex container
66 *
67 * - First index (tag<i_prefix>) is a unique hash index based on
68 * prefixes
69 * - Second index (tag<i_timestamp>) is a sequenced index based on
70 * arrival order (for clean-up optimizations)
71 *
72 * \see http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/ for more information on Boost.MultiIndex library
73 */
74struct CcnxPitEntryContainer
75{
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -070076 /// @cond include_hidden
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070077 typedef
78 boost::multi_index::multi_index_container<
79 CcnxPitEntry,
80 boost::multi_index::indexed_by<
81 // indexed by hash
82 boost::multi_index::hashed_unique<
83 boost::multi_index::tag<__ccnx_private::i_prefix>,
84 boost::multi_index::const_mem_fun<CcnxPitEntry, const CcnxNameComponents&, &CcnxPitEntry::GetPrefix>,
85 CcnxPrefixHash
86 >,
87 // sequenced to implement MRU
Alexander Afanasyevd76f4aa2011-12-15 21:30:16 -080088 boost::multi_index::ordered_non_unique<
89 boost::multi_index::tag<__ccnx_private::i_timestamp>,
90 boost::multi_index::member<CcnxPitEntry, Time, &CcnxPitEntry::m_expireTime>
91 >
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070092 >
93 > type;
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -070094 /// @endcond
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070095};
96
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070097////////////////////////////////////////////////////////////////////////
98////////////////////////////////////////////////////////////////////////
99
100/**
101 * \ingroup ccnx
102 * \brief Class implementing Pending Interests Table
103 */
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700104class CcnxPit : public CcnxPitEntryContainer::type, public Object
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700105{
106public:
107 /**
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700108 * \brief Interface ID
109 *
110 * \return interface ID
111 */
112 static TypeId GetTypeId ();
113
114 /**
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700115 * \brief PIT constructor
116 */
117 CcnxPit ();
118
Alexander Afanasyevd02a5d62011-11-21 11:01:51 -0800119 /**
120 * \brief Destructor
121 */
122 virtual ~CcnxPit ();
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700123
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700124 /**
125 * \brief Find corresponding PIT entry for the given content name
126 * \param prefix Prefix for which to lookup the entry
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700127 * \returns iterator to Pit entry. If record not found,
128 * return end() iterator
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700129 */
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700130 iterator
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700131 Lookup (const CcnxContentObjectHeader &header) const;
132
133 /**
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700134 * \brief Find a PIT entry for the given content interest
135 * \param header parsed interest header
136 * \returns iterator to Pit entry. If record not found,
137 * return end() iterator
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700138 */
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700139 iterator
Alexander Afanasyeva46844b2011-11-21 19:13:26 -0800140 Lookup (const CcnxInterestHeader &header);
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700141
142 /**
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700143 * @brief Check if the Interest carries an existent nonce.
144 * If not, nonce will be added to the list of known nonces
145 * @returns true if interest is duplicate (carries an existent nonce), false otherwise
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700146 */
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700147 bool
148 CheckIfDuplicate (iterator entry, const CcnxInterestHeader &header);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800149
Alexander Afanasyevf034cbd2012-06-29 14:28:31 -0700150 /**
151 * @brief Creates a PIT entry for the given interest
152 * @param header parsed interest header
153 * @returns iterator to Pit entry. If record could not be created (e.g., limit reached),
154 * return end() iterator
155 *
156 * Note. This call assumes that the entry does not exist (i.e., there was a Lookup call before)
157 */
158 iterator
159 Create (const CcnxInterestHeader &header);
160
161 /**
162 * @brief Mark PIT entry deleted
163 * @param entry PIT entry
164 *
165 * Effectively, this method removes all incoming/outgoing faces and set
166 * lifetime +m_PitEntryDefaultLifetime from Now ()
167 */
168 void
169 MarkErased (iterator entry);
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700170
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800171protected:
172 // inherited from Object class
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700173 virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
174 virtual void DoDispose (); ///< @brief Do cleanup
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700175
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800176private:
177 /** \brief Remove expired records from PIT */
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700178 void
179 CleanExpired ();
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700180
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700181 /**
182 * \brief Set cleanup timeout
183 *
184 * Side effect: current clean up even (if any) will be cancelled and a new event started
185 *
186 * \param timeout cleanup timeout
187 */
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700188 void
189 SetCleanupTimeout (const Time &timeout);
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700190
191 /**
192 * \brief Get cleanup timeout
193 *
194 * \returns cleanup timeout
195 */
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700196 Time
197 GetCleanupTimeout () const;
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700198
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700199 friend std::ostream&
200 operator<< (std::ostream& os, const CcnxPit &fib);
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700201
202private:
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700203 Time m_cleanupTimeout; ///< \brief Configurable timeout of how often cleanup events are working
204 EventId m_cleanupEvent; ///< \brief Cleanup event
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800205
206 // configuration variables. Check implementation of GetTypeId for more details
Alexander Afanasyeva46844b2011-11-21 19:13:26 -0800207 Time m_PitEntryPruningTimout;
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800208 Time m_PitEntryDefaultLifetime;
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700209
Alexander Afanasyev3a4a0b32012-06-28 14:14:22 -0700210 uint32_t m_maxSize;
211
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700212 Ptr<CcnxFib> m_fib; ///< \brief Link to FIB table
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700213};
214
215///////////////////////////////////////////////////////////////////////////////
216///////////////////////////////////////////////////////////////////////////////
217
Alexander Afanasyeva95b7392012-03-09 10:54:10 -0800218std::ostream& operator<< (std::ostream& os, const CcnxPit &pit);
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700219
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700220} // namespace ns3
221
222#endif /* CCNX_PIT_H */