blob: 047fd819f2347989fa3eff28a2bd09314586cf6f [file] [log] [blame]
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -07003 * Copyright (c) 2011,2012 University of California, Los Angeles
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -07004 *
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 *
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070018 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 * Ilya Moiseenko <iliamo@cs.ucla.edu>
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -070020 */
21
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070022#ifndef NDN_CONTENT_STORE_H
23#define NDN_CONTENT_STORE_H
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -070024
Alexander Afanasyev070aa482011-08-20 00:38:25 -070025#include "ns3/object.h"
26#include "ns3/ptr.h"
Alexander Afanasyev39485d82012-06-08 17:51:47 -070027#include "ns3/traced-callback.h"
28
Alexander Afanasyeva46844b2011-11-21 19:13:26 -080029#include <boost/tuple/tuple.hpp>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070030
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070031namespace ns3 {
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070032
33class Packet;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070034
35namespace ndn {
36
37class ContentObjectHeader;
38class InterestHeader;
39class NameComponents;
40
41namespace cs {
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070042
Alexander Afanasyev070aa482011-08-20 00:38:25 -070043/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070044 * \ingroup ndn
Alexander Afanasyev070aa482011-08-20 00:38:25 -070045 * \brief NDN content store entry
46 *
47 * Content store entry stores separately pseudo header and content of
48 * ContentObject packet. It is responsibility of the caller to
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070049 * construct a fully formed NDN Packet by calling Copy(), AddHeader(),
Alexander Afanasyev070aa482011-08-20 00:38:25 -070050 * AddTail() on the packet received by GetPacket() method.
51 *
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070052 * GetFullyFormedNdnPacket method provided as a convenience
Alexander Afanasyev070aa482011-08-20 00:38:25 -070053 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070054class Entry : public SimpleRefCount<Entry>
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -070055{
56public:
Alexander Afanasyev070aa482011-08-20 00:38:25 -070057 /**
58 * \brief Construct content store entry
59 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070060 * \param header Parsed ContentObject header
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070061 * \param packet Original Ndn packet
Alexander Afanasyev070aa482011-08-20 00:38:25 -070062 *
63 * The constructor will make a copy of the supplied packet and calls
64 * RemoveHeader and RemoveTail on the copy.
65 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070066 Entry (Ptr<const ContentObjectHeader> header, Ptr<const Packet> packet);
Alexander Afanasyev070aa482011-08-20 00:38:25 -070067
68 /**
69 * \brief Get prefix of the stored entry
70 * \returns prefix of the stored entry
71 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070072 const NameComponents&
Alexander Afanasyev070aa482011-08-20 00:38:25 -070073 GetName () const;
74
75 /**
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070076 * \brief Get ContentObjectHeader of the stored entry
77 * \returns ContentObjectHeader of the stored entry
Alexander Afanasyev070aa482011-08-20 00:38:25 -070078 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070079 Ptr<const ContentObjectHeader>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070080 GetHeader () const;
81
82 /**
83 * \brief Get content of the stored entry
84 * \returns content of the stored entry
85 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070086 Ptr<const Packet>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070087 GetPacket () const;
88
89 /**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070090 * \brief Convenience method to create a fully formed Ndn packet from stored header and content
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070091 * \returns A read-write copy of the packet with ContentObjectHeader and ContentObjectTail
Alexander Afanasyev070aa482011-08-20 00:38:25 -070092 */
93 Ptr<Packet>
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070094 GetFullyFormedNdnPacket () const;
Alexander Afanasyev070aa482011-08-20 00:38:25 -070095
Alexander Afanasyev070aa482011-08-20 00:38:25 -070096private:
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070097 Ptr<const ContentObjectHeader> m_header; ///< \brief non-modifiable ContentObjectHeader
Alexander Afanasyev070aa482011-08-20 00:38:25 -070098 Ptr<Packet> m_packet; ///< \brief non-modifiable content of the ContentObject packet
Alexander Afanasyev070aa482011-08-20 00:38:25 -070099};
100
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700101} // namespace cs
102
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700103
104/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700105 * \ingroup ndn
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700106 * \brief Base class for NDN content store
107 *
108 * Particular implementations should implement Lookup, Add, and Print methods
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700109 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700110class ContentStore : public Object
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700111{
112public:
113 /**
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700114 * \brief Interface ID
115 *
116 * \return interface ID
117 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700118 static
119 TypeId GetTypeId ();
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700120
121 /**
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700122 * @brief Virtual destructor
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700123 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700124 virtual
125 ~ContentStore ();
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700126
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700127 /**
128 * \brief Find corresponding CS entry for the given interest
129 *
130 * \param interest Interest for which matching content store entry
131 * will be searched
132 *
133 * If an entry is found, it is promoted to the top of most recent
134 * used entries index, \see m_contentStore
135 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700136 virtual boost::tuple<Ptr<Packet>, Ptr<const ContentObjectHeader>, Ptr<const Packet> >
137 Lookup (Ptr<const InterestHeader> interest) = 0;
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700138
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700139 /**
140 * \brief Add a new content to the content store.
141 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700142 * \param header Fully parsed ContentObjectHeader
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700143 * \param packet Fully formed Ndn packet to add to content store
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700144 * (will be copied and stripped down of headers)
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700145 * @returns true if an existing entry was updated, false otherwise
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700146 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700147 virtual bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700148 Add (Ptr<const ContentObjectHeader> header, Ptr<const Packet> packet) = 0;
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700149
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700150 // /**
151 // * \brief Add a new content to the content store.
152 // *
153 // * \param header Interest header for which an entry should be removed
154 // * @returns true if an existing entry was removed, false otherwise
155 // */
156 // virtual bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700157 // Remove (Ptr<InterestHeader> header) = 0;
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700158
159 /**
160 * \brief Print out content store entries
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700161 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700162 virtual void
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700163 Print (std::ostream &os) const = 0;
Alexander Afanasyev39485d82012-06-08 17:51:47 -0700164
Alexander Afanasyev29c19b92012-09-03 23:46:41 -0700165
166 /**
167 * @brief Get number of entries in content store
168 */
169 virtual uint32_t
170 GetSize () const = 0;
171
172 /**
173 * @brief Return first element of content store (no order guaranteed)
174 */
175 virtual Ptr<cs::Entry>
176 Begin () = 0;
177
178 /**
179 * @brief Return item next after last (no order guaranteed)
180 */
181 virtual Ptr<cs::Entry>
182 End () = 0;
183
184 /**
185 * @brief Advance the iterator
186 */
187 virtual Ptr<cs::Entry>
188 Next (Ptr<cs::Entry>) = 0;
189
190 ////////////////////////////////////////////////////////////////////////////
191 ////////////////////////////////////////////////////////////////////////////
192 ////////////////////////////////////////////////////////////////////////////
193
194 /**
195 * @brief Static call to cheat python bindings
196 */
197 static inline Ptr<ContentStore>
198 GetContentStore (Ptr<Object> node);
199
Alexander Afanasyev39485d82012-06-08 17:51:47 -0700200protected:
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700201 TracedCallback<Ptr<const InterestHeader>,
202 Ptr<const ContentObjectHeader> > m_cacheHitsTrace; ///< @brief trace of cache hits
Alexander Afanasyev39485d82012-06-08 17:51:47 -0700203
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700204 TracedCallback<Ptr<const InterestHeader> > m_cacheMissesTrace; ///< @brief trace of cache misses
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700205};
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700206
207inline std::ostream&
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700208operator<< (std::ostream &os, const ContentStore &cs)
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700209{
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700210 cs.Print (os);
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700211 return os;
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700212}
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700213
Alexander Afanasyev29c19b92012-09-03 23:46:41 -0700214inline Ptr<ContentStore>
215ContentStore::GetContentStore (Ptr<Object> node)
216{
217 return node->GetObject<ContentStore> ();
218}
219
220
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700221} // namespace ndn
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700222} // namespace ns3
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700223
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700224#endif // NDN_CONTENT_STORE_H