blob: 1e01a6ef5772c374d1697763d58ad85b699bae8d [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;
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070039class Name;
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070040
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -070041class ContentStore;
42
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070043namespace cs {
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070044
Alexander Afanasyev070aa482011-08-20 00:38:25 -070045/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070046 * \ingroup ndn
Alexander Afanasyev070aa482011-08-20 00:38:25 -070047 * \brief NDN content store entry
48 *
49 * Content store entry stores separately pseudo header and content of
50 * ContentObject packet. It is responsibility of the caller to
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070051 * construct a fully formed NDN Packet by calling Copy(), AddHeader(),
Alexander Afanasyev070aa482011-08-20 00:38:25 -070052 * AddTail() on the packet received by GetPacket() method.
53 *
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070054 * GetFullyFormedNdnPacket method provided as a convenience
Alexander Afanasyev070aa482011-08-20 00:38:25 -070055 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070056class Entry : public SimpleRefCount<Entry>
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -070057{
58public:
Alexander Afanasyev070aa482011-08-20 00:38:25 -070059 /**
60 * \brief Construct content store entry
61 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070062 * \param header Parsed ContentObject header
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070063 * \param packet Original Ndn packet
Alexander Afanasyev070aa482011-08-20 00:38:25 -070064 *
65 * The constructor will make a copy of the supplied packet and calls
66 * RemoveHeader and RemoveTail on the copy.
67 */
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -070068 Entry (Ptr<ContentStore> cs, Ptr<const ContentObjectHeader> header, Ptr<const Packet> packet);
Alexander Afanasyev070aa482011-08-20 00:38:25 -070069
70 /**
71 * \brief Get prefix of the stored entry
72 * \returns prefix of the stored entry
73 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070074 const Name&
Alexander Afanasyev070aa482011-08-20 00:38:25 -070075 GetName () const;
76
77 /**
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070078 * \brief Get ContentObjectHeader of the stored entry
79 * \returns ContentObjectHeader of the stored entry
Alexander Afanasyev070aa482011-08-20 00:38:25 -070080 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070081 Ptr<const ContentObjectHeader>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070082 GetHeader () const;
83
84 /**
85 * \brief Get content of the stored entry
86 * \returns content of the stored entry
87 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070088 Ptr<const Packet>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070089 GetPacket () const;
90
91 /**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070092 * \brief Convenience method to create a fully formed Ndn packet from stored header and content
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070093 * \returns A read-write copy of the packet with ContentObjectHeader and ContentObjectTail
Alexander Afanasyev070aa482011-08-20 00:38:25 -070094 */
95 Ptr<Packet>
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070096 GetFullyFormedNdnPacket () const;
Alexander Afanasyev070aa482011-08-20 00:38:25 -070097
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -070098 /**
99 * @brief Get pointer to access store, to which this entry is added
100 */
101 Ptr<ContentStore>
102 GetContentStore ();
103
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700104private:
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700105 Ptr<ContentStore> m_cs; ///< \brief content store to which entry is added
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700106 Ptr<const ContentObjectHeader> m_header; ///< \brief non-modifiable ContentObjectHeader
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700107 Ptr<Packet> m_packet; ///< \brief non-modifiable content of the ContentObject packet
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700108};
109
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700110} // namespace cs
111
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700112
113/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700114 * \ingroup ndn
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700115 * \brief Base class for NDN content store
116 *
117 * Particular implementations should implement Lookup, Add, and Print methods
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700118 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700119class ContentStore : public Object
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700120{
121public:
122 /**
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700123 * \brief Interface ID
124 *
125 * \return interface ID
126 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700127 static
128 TypeId GetTypeId ();
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700129
130 /**
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700131 * @brief Virtual destructor
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700132 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700133 virtual
134 ~ContentStore ();
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700135
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700136 /**
137 * \brief Find corresponding CS entry for the given interest
138 *
139 * \param interest Interest for which matching content store entry
140 * will be searched
141 *
142 * If an entry is found, it is promoted to the top of most recent
143 * used entries index, \see m_contentStore
144 */
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700145 virtual boost::tuple<Ptr<Packet>, Ptr<const ContentObjectHeader>, Ptr<const Packet> >
146 Lookup (Ptr<const InterestHeader> interest) = 0;
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700147
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700148 /**
149 * \brief Add a new content to the content store.
150 *
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700151 * \param header Fully parsed ContentObjectHeader
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700152 * \param packet Fully formed Ndn packet to add to content store
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700153 * (will be copied and stripped down of headers)
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700154 * @returns true if an existing entry was updated, false otherwise
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700155 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700156 virtual bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700157 Add (Ptr<const ContentObjectHeader> header, Ptr<const Packet> packet) = 0;
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700158
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800159 // /*
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700160 // * \brief Add a new content to the content store.
161 // *
162 // * \param header Interest header for which an entry should be removed
163 // * @returns true if an existing entry was removed, false otherwise
164 // */
165 // virtual bool
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700166 // Remove (Ptr<InterestHeader> header) = 0;
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700167
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700168 /**
169 * \brief Print out content store entries
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700170 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700171 virtual void
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700172 Print (std::ostream &os) const = 0;
Alexander Afanasyev39485d82012-06-08 17:51:47 -0700173
Alexander Afanasyev29c19b92012-09-03 23:46:41 -0700174
175 /**
176 * @brief Get number of entries in content store
177 */
178 virtual uint32_t
179 GetSize () const = 0;
180
181 /**
182 * @brief Return first element of content store (no order guaranteed)
183 */
184 virtual Ptr<cs::Entry>
185 Begin () = 0;
186
187 /**
188 * @brief Return item next after last (no order guaranteed)
189 */
190 virtual Ptr<cs::Entry>
191 End () = 0;
192
193 /**
194 * @brief Advance the iterator
195 */
196 virtual Ptr<cs::Entry>
197 Next (Ptr<cs::Entry>) = 0;
198
199 ////////////////////////////////////////////////////////////////////////////
200 ////////////////////////////////////////////////////////////////////////////
201 ////////////////////////////////////////////////////////////////////////////
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700202
Alexander Afanasyev29c19b92012-09-03 23:46:41 -0700203 /**
204 * @brief Static call to cheat python bindings
205 */
206 static inline Ptr<ContentStore>
207 GetContentStore (Ptr<Object> node);
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700208
Alexander Afanasyev39485d82012-06-08 17:51:47 -0700209protected:
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700210 TracedCallback<Ptr<const InterestHeader>,
211 Ptr<const ContentObjectHeader> > m_cacheHitsTrace; ///< @brief trace of cache hits
Alexander Afanasyev0e4ae8e2013-03-12 15:59:18 -0700212
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700213 TracedCallback<Ptr<const InterestHeader> > m_cacheMissesTrace; ///< @brief trace of cache misses
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700214};
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700215
216inline std::ostream&
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700217operator<< (std::ostream &os, const ContentStore &cs)
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700218{
Alexander Afanasyev9a989702012-06-29 17:44:00 -0700219 cs.Print (os);
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700220 return os;
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700221}
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700222
Alexander Afanasyev29c19b92012-09-03 23:46:41 -0700223inline Ptr<ContentStore>
224ContentStore::GetContentStore (Ptr<Object> node)
225{
226 return node->GetObject<ContentStore> ();
227}
228
229
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700230} // namespace ndn
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700231} // namespace ns3
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700232
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700233#endif // NDN_CONTENT_STORE_H