blob: f586c152de1fc4dd188282c40fbdfc5eea476dfc [file] [log] [blame]
Alexander Afanasyevc74a6022011-08-15 20:01:35 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -07002/*
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -07003 * Copyright (c) 2011-2013 University of California, Los Angeles
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -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 *
18 * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
19 * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
20 */
21
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070022#ifndef _NDN_CONTENT_OBJECT_HEADER_H_
23#define _NDN_CONTENT_OBJECT_HEADER_H_
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070024
Alexander Afanasyev2536e202011-08-12 14:13:10 -070025#include "ns3/integer.h"
26#include "ns3/header.h"
Alexander Afanasyeve275cf82012-04-18 14:25:02 -070027#include "ns3/simple-ref-count.h"
Alexander Afanasyev070aa482011-08-20 00:38:25 -070028#include "ns3/trailer.h"
Alexander Afanasyev9568f952012-04-05 16:09:14 -070029#include "ns3/nstime.h"
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070030#include "ns3/packet.h"
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070031
32#include <string>
33#include <vector>
34#include <list>
35
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070036#include "ndn-name.h"
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070037
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070038namespace ns3 {
39namespace ndn {
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070040
41/**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080042 * ContentObject header
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070043 *
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070044 * Only few important fields are actually implemented in the simulation
45 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070046 * @see http://ndnsim.net/new-packet-formats.html
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070047 *
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070048 * Optimized and simplified formatting of Interest packets
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080049 *
50 * ContentObject ::= Signature
51 * Name
52 * Content
53 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070054 * 0 1 2 3
55 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
56 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57 * | Length | |
58 * |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
59 * ~ ~
60 * ~ Signature ~
61 * | |
62 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 * | Length | |
64 * |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
65 * ~ ~
66 * ~ Name ~
67 * | |
68 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69 * | Length | |
70 * |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
71 * ~ ~
72 * ~ Content ~
73 * | |
74 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070075 *
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070076 */
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070077class ContentObject : public SimpleRefCount<ContentObject>
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070078{
79public:
80 /**
Alexander Afanasyevb989b122013-07-10 17:15:46 -070081 * @brief Constructor
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070082 *
83 * Creates a null header
84 **/
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070085 ContentObject (Ptr<Packet> payload = Create<Packet> ());
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070086
87 /**
Alexander Afanasyevb989b122013-07-10 17:15:46 -070088 * @brief Copy constructor
89 */
90 ContentObject (const ContentObject &other);
91
92 /**
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070093 * \brief Set content object name
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070094 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070095 * Sets name of the content object
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070096 **/
97 void
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070098 SetName (Ptr<Name> name);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070099
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700100 /**
Alexander Afanasyevcc50d982013-03-30 19:09:10 -0700101 * @brief Another, less efficient, variant of setting content object name
102 *
103 * Sets name of the content object
104 */
105 void
106 SetName (const Name &name);
107
108 /**
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700109 * @brief Get name of the content object
110 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700111 const Name&
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700112 GetName () const;
113
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700114 /**
Alexander Afanasyev30f60e32012-07-10 14:21:16 -0700115 * @brief Get smart pointer to the interest name (to avoid extra memory usage)
116 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700117 Ptr<const Name>
Alexander Afanasyev30f60e32012-07-10 14:21:16 -0700118 GetNamePtr () const;
119
120 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800121 * @brief Set content object timestamp
122 * @param timestamp timestamp
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700123 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800124 void
125 SetTimestamp (const Time &timestamp);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700126
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700127 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800128 * @brief Get timestamp of the content object
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700129 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800130 Time
131 GetTimestamp () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700132
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800133 /**
134 * @brief Set freshness of the content object
135 * @param freshness Freshness, 0s means infinity
136 */
137 void
138 SetFreshness (const Time &freshness);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700139
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700140 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800141 * @brief Get freshness of the content object
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700142 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800143 Time
144 GetFreshness () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700145
Alexander Afanasyevd6e5c5f2013-03-30 19:09:56 -0700146 /**
147 * @brief Set "fake" signature on the content object
148 * @param signature uint32_t number, simulating content object signature
149 *
150 * Values for the signature totally depend on the application
151 */
152 void
153 SetSignature (uint32_t signature);
154
155 /**
156 * @brief Get "fake" signature of the content object
157 *
158 * Values for the signature totally depend on the application
159 */
160 uint32_t
161 GetSignature () const;
162
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700163 //////////////////////////////////////////////////////////////////
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700164 /**
165 * @brief Get payload of data packet
166 *
167 * This payload can also carry packet tags
168 */
169 void
170 SetPayload (Ptr<Packet> payload);
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700171
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700172 /**
173 * @brief Set payload of data packet
174 *
175 * This payload can also carry packet tags
176 */
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700177 Ptr<const Packet>
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700178 GetPayload () const;
179
180 /**
181 * @brief Get wire formatted packet
182 *
183 * If wire formatted packet has not been set before, 0 will be returned
184 */
185 inline Ptr<const Packet>
186 GetWire () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700187
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700188 /**
189 * @brief Set (cache) wire formatted packet
190 */
191 inline void
192 SetWire (Ptr<const Packet> packet) const;
193
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700194 /**
195 * @brief Print Interest in plain-text to the specified output stream
196 */
197 void
198 Print (std::ostream &os) const;
199
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700200private:
201 // NO_ASSIGN
202 ContentObject &
203 operator = (const ContentObject &other) { return *this; }
204
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700205private:
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700206 Ptr<Name> m_name;
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800207 Time m_freshness;
208 Time m_timestamp;
Alexander Afanasyevd6e5c5f2013-03-30 19:09:56 -0700209 uint32_t m_signature; // 0, means no signature, any other value application dependent (not a real signature)
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700210 Ptr<Packet> m_payload;
211
212 mutable Ptr<const Packet> m_wire;
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700213};
214
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700215/**
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700216 * @ingroup ndn-exceptions
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700217 * @brief Class for ContentObject parsing exception
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700218 */
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700219class ContentObjectException {};
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700220
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700221inline Ptr<const Packet>
222ContentObject::GetWire () const
223{
224 return m_wire;
225}
226
227inline void
228ContentObject::SetWire (Ptr<const Packet> packet) const
229{
230 m_wire = packet;
231}
232
233
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700234} // namespace ndn
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700235} // namespace ns3
236
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700237#endif // _NDN_CONTENT_OBJECT_HEADER_H_