blob: 387fee1502f5713e2d80e83ef409ab05257adf4d [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 Afanasyev8a677dd2011-08-12 13:08:15 -070030
31#include <string>
32#include <vector>
33#include <list>
34
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070035#include "ndn-name.h"
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070036
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070037namespace ns3 {
38namespace ndn {
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070039
40/**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080041 * ContentObject header
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070042 *
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070043 * Only few important fields are actually implemented in the simulation
44 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070045 * @see http://ndnsim.net/new-packet-formats.html
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070046 *
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070047 * Optimized and simplified formatting of Interest packets
Alexander Afanasyev5d79e682012-11-19 14:12:23 -080048 *
49 * ContentObject ::= Signature
50 * Name
51 * Content
52 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070053 * 0 1 2 3
54 * 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
55 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 * | Length | |
57 * |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
58 * ~ ~
59 * ~ Signature ~
60 * | |
61 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 * | Length | |
63 * |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
64 * ~ ~
65 * ~ Name ~
66 * | |
67 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 * | Length | |
69 * |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
70 * ~ ~
71 * ~ Content ~
72 * | |
73 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Alexander Afanasyev73f06f62013-03-15 15:41:38 -070074 *
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070075 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070076class ContentObject : public SimpleRefCount<ContentObject,Header>
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070077{
78public:
79 /**
Alexander Afanasyevb989b122013-07-10 17:15:46 -070080 * @brief Constructor
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070081 *
82 * Creates a null header
83 **/
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070084 ContentObject ();
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070085
86 /**
Alexander Afanasyevb989b122013-07-10 17:15:46 -070087 * @brief Copy constructor
88 */
89 ContentObject (const ContentObject &other);
90
91 /**
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070092 * \brief Set content object name
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070093 *
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070094 * Sets name of the content object
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070095 **/
96 void
Alexander Afanasyevcc50d982013-03-30 19:09:10 -070097 SetName (Ptr<Name> name);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -070098
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -070099 /**
Alexander Afanasyevcc50d982013-03-30 19:09:10 -0700100 * @brief Another, less efficient, variant of setting content object name
101 *
102 * Sets name of the content object
103 */
104 void
105 SetName (const Name &name);
106
107 /**
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700108 * @brief Get name of the content object
109 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700110 const Name&
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700111 GetName () const;
112
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700113 /**
Alexander Afanasyev30f60e32012-07-10 14:21:16 -0700114 * @brief Get smart pointer to the interest name (to avoid extra memory usage)
115 */
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700116 Ptr<const Name>
Alexander Afanasyev30f60e32012-07-10 14:21:16 -0700117 GetNamePtr () const;
118
119 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800120 * @brief Set content object timestamp
121 * @param timestamp timestamp
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700122 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800123 void
124 SetTimestamp (const Time &timestamp);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700125
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700126 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800127 * @brief Get timestamp of the content object
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700128 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800129 Time
130 GetTimestamp () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700131
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800132 /**
133 * @brief Set freshness of the content object
134 * @param freshness Freshness, 0s means infinity
135 */
136 void
137 SetFreshness (const Time &freshness);
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700138
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700139 /**
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800140 * @brief Get freshness of the content object
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700141 */
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800142 Time
143 GetFreshness () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700144
Alexander Afanasyevd6e5c5f2013-03-30 19:09:56 -0700145 /**
146 * @brief Set "fake" signature on the content object
147 * @param signature uint32_t number, simulating content object signature
148 *
149 * Values for the signature totally depend on the application
150 */
151 void
152 SetSignature (uint32_t signature);
153
154 /**
155 * @brief Get "fake" signature of the content object
156 *
157 * Values for the signature totally depend on the application
158 */
159 uint32_t
160 GetSignature () const;
161
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700162 //////////////////////////////////////////////////////////////////
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700163 /**
164 * @brief Get payload of data packet
165 *
166 * This payload can also carry packet tags
167 */
168 void
169 SetPayload (Ptr<Packet> payload);
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700170
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700171 /**
172 * @brief Set payload of data packet
173 *
174 * This payload can also carry packet tags
175 */
176 Ptr<const Payload>
177 GetPayload () const;
178
179 /**
180 * @brief Get wire formatted packet
181 *
182 * If wire formatted packet has not been set before, 0 will be returned
183 */
184 inline Ptr<const Packet>
185 GetWire () const;
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700186
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700187 /**
188 * @brief Set (cache) wire formatted packet
189 */
190 inline void
191 SetWire (Ptr<const Packet> packet) const;
192
193private:
194 // NO_ASSIGN
195 ContentObject &
196 operator = (const ContentObject &other) { return *this; }
197
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700198private:
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -0700199 Ptr<Name> m_name;
Alexander Afanasyev5d79e682012-11-19 14:12:23 -0800200 Time m_freshness;
201 Time m_timestamp;
Alexander Afanasyevd6e5c5f2013-03-30 19:09:56 -0700202 uint32_t m_signature; // 0, means no signature, any other value application dependent (not a real signature)
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700203 Ptr<Packet> m_payload;
204
205 mutable Ptr<const Packet> m_wire;
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700206};
207
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700208/**
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700209 * @ingroup ndn-exceptions
Alexander Afanasyev73f06f62013-03-15 15:41:38 -0700210 * @brief Class for ContentObject parsing exception
Alexander Afanasyevb4fee8b2012-06-06 12:54:26 -0700211 */
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700212class ContentObjectException {};
Alexander Afanasyev8c5046a2012-06-05 16:22:14 -0700213
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700214} // namespace ndn
Alexander Afanasyev8a677dd2011-08-12 13:08:15 -0700215} // namespace ns3
216
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700217#endif // _NDN_CONTENT_OBJECT_HEADER_H_