blob: dd568673edfffd3c8d8214d7b33819abdac93602 [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 Afanasyev070aa482011-08-20 00:38:25 -070022#ifndef CCNX_CONTENT_STORE_H
23#define CCNX_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 Afanasyeva46844b2011-11-21 19:13:26 -080027#include <boost/tuple/tuple.hpp>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070028
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -070029namespace ns3
30{
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070031
32class Packet;
33class CcnxContentObjectHeader;
34class CcnxInterestHeader;
35class CcnxNameComponents;
36
Alexander Afanasyev070aa482011-08-20 00:38:25 -070037/**
38 * \ingroup ccnx
39 * \brief NDN content store entry
40 *
41 * Content store entry stores separately pseudo header and content of
42 * ContentObject packet. It is responsibility of the caller to
43 * construct a fully formed CcnxPacket by calling Copy(), AddHeader(),
44 * AddTail() on the packet received by GetPacket() method.
45 *
46 * GetFullyFormedCcnxPacket method provided as a convenience
47 */
48class CcnxContentStoreEntry
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -070049{
50public:
Alexander Afanasyev070aa482011-08-20 00:38:25 -070051 /**
52 * \brief Construct content store entry
53 *
54 * \param header Parsed CcnxContentObject header
55 * \param packet Original CCNx packet
56 *
57 * The constructor will make a copy of the supplied packet and calls
58 * RemoveHeader and RemoveTail on the copy.
59 */
60 CcnxContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
61
62 /**
63 * \brief Get prefix of the stored entry
64 * \returns prefix of the stored entry
65 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070066 const CcnxNameComponents&
Alexander Afanasyev070aa482011-08-20 00:38:25 -070067 GetName () const;
68
69 /**
70 * \brief Get CcnxContentObjectHeader of the stored entry
71 * \returns CcnxContentObjectHeader of the stored entry
72 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070073 Ptr<const CcnxContentObjectHeader>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070074 GetHeader () const;
75
76 /**
77 * \brief Get content of the stored entry
78 * \returns content of the stored entry
79 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070080 Ptr<const Packet>
Alexander Afanasyev070aa482011-08-20 00:38:25 -070081 GetPacket () const;
82
83 /**
84 * \brief Convenience method to create a fully formed CCNx packet from stored header and content
85 * \returns A read-write copy of the packet with CcnxContentObjectHeader and CcxnContentObjectTail
86 */
87 Ptr<Packet>
88 GetFullyFormedCcnxPacket () const;
89
Alexander Afanasyev070aa482011-08-20 00:38:25 -070090private:
91 Ptr<CcnxContentObjectHeader> m_header; ///< \brief non-modifiable CcnxContentObjectHeader
92 Ptr<Packet> m_packet; ///< \brief non-modifiable content of the ContentObject packet
Alexander Afanasyev070aa482011-08-20 00:38:25 -070093};
94
Alexander Afanasyev070aa482011-08-20 00:38:25 -070095
96/**
97 * \ingroup ccnx
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -070098 * \brief Base class for NDN content store
99 *
100 * Particular implementations should implement Lookup, Add, and Print methods
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700101 */
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700102class CcnxContentStore : public Object
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700103{
104public:
105 /**
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700106 * \brief Interface ID
107 *
108 * \return interface ID
109 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700110 static
111 TypeId GetTypeId ();
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700112
113 /**
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700114 * @brief Virtual destructor
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700115 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700116 virtual ~CcnxContentStore ();
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700117
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700118 /**
119 * \brief Find corresponding CS entry for the given interest
120 *
121 * \param interest Interest for which matching content store entry
122 * will be searched
123 *
124 * If an entry is found, it is promoted to the top of most recent
125 * used entries index, \see m_contentStore
126 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700127 virtual boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
128 Lookup (Ptr<const CcnxInterestHeader> interest) = 0;
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700129
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700130 /**
131 * \brief Add a new content to the content store.
132 *
133 * \param header Fully parsed CcnxContentObjectHeader
134 * \param packet Fully formed CCNx packet to add to content store
135 * (will be copied and stripped down of headers)
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700136 * @returns true if an existing entry was updated, false otherwise
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700137 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700138 virtual bool
139 Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet) = 0;
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700140
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700141 // /**
142 // * \brief Add a new content to the content store.
143 // *
144 // * \param header Interest header for which an entry should be removed
145 // * @returns true if an existing entry was removed, false otherwise
146 // */
147 // virtual bool
148 // Remove (Ptr<CcnxInterestHeader> header) = 0;
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700149
150 /**
151 * \brief Print out content store entries
152 *
153 * Debug build provides dumping of content store entries in
154 * lexicographical order of corresponding prefixes
155 *
156 * Release build dumps everything in MRU order
157 */
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700158 virtual void
159 Print () const = 0;
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700160};
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700161
162inline std::ostream&
163operator<< (std::ostream &os, const CcnxContentStore &cs)
164{
165 cs.Print ();
166 return os;
Ilya Moiseenko1c570bc2011-08-17 19:18:02 -0700167}
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700168
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700169} // namespace ns3
Alexander Afanasyev070aa482011-08-20 00:38:25 -0700170
171#endif // CCNX_CONTENT_STORE_H