NS-3 based Named Data Networking (NDN) simulator
ndnSIM: NDN, CCN, CCNx, content centric networks
API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
wire-ndnsim.cc
1 
2 /*
3  * Copyright (c) 2013, Regents of the University of California
4  * Alexander Afanasyev
5  *
6  * GNU 3.0 license, See the LICENSE file for more information
7  *
8  * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
9  */
10 
11 #include "wire-ndnsim.h"
12 #include <boost/foreach.hpp>
13 
14 NDN_NAMESPACE_BEGIN
15 
16 namespace wire {
17 
21 
22 size_t
23 NdnSim::SerializeName (Buffer::Iterator &i, const Name &name)
24 {
25  Buffer::Iterator start = i;
26 
27  i.WriteU16 (static_cast<uint16_t> (SerializedSizeName (name)-2));
28 
29  for (Name::const_iterator item = name.begin ();
30  item != name.end ();
31  item++)
32  {
33  i.WriteU16 (static_cast<uint16_t> (item->size ()));
34  i.Write (reinterpret_cast<const uint8_t*> (item->buf ()), item->size ());
35  }
36 
37  return i.GetDistanceFrom (start);
38 }
39 
40 size_t
41 NdnSim::SerializedSizeName (const Name &name)
42 {
43  size_t nameSerializedSize = 2;
44 
45  for (Name::const_iterator i = name.begin ();
46  i != name.end ();
47  i++)
48  {
49  nameSerializedSize += 2 + i->size ();
50  }
51  NS_ASSERT_MSG (nameSerializedSize < 30000, "Name is too long (> 30kbytes)");
52 
53  return nameSerializedSize;
54 }
55 
56 Ptr<Name>
57 NdnSim::DeserializeName (Buffer::Iterator &i)
58 {
59  Ptr<Name> name = Create<Name> ();
60 
61  uint16_t nameLength = i.ReadU16 ();
62  while (nameLength > 0)
63  {
64  uint16_t length = i.ReadU16 ();
65  nameLength = nameLength - 2 - length;
66 
67  uint8_t tmp[length];
68  i.Read (tmp, length);
69 
70  name->append (tmp, length);
71  }
72 
73  return name;
74 }
75 
76 
77 size_t
78 NdnSim::SerializeExclude (Buffer::Iterator &i, const Exclude &exclude)
79 {
80  Buffer::Iterator start = i;
81 
82  i.WriteU16 (static_cast<uint16_t> (SerializedSizeExclude (exclude)-2));
83 
84  for (Exclude::const_reverse_iterator item = exclude.rbegin ();
85  item != exclude.rend ();
86  item++)
87  {
88  if (!item->first.empty ())
89  {
90  i.WriteU8 (ExcludeNameType);
91  i.WriteU16 (static_cast<uint16_t> (item->first.size ()));
92  i.Write (reinterpret_cast<const uint8_t*> (item->first.buf ()), item->first.size ());
93  }
94  if (item->second)
95  {
96  i.WriteU8 (ExcludeAnyType);
97  }
98  }
99  return i.GetDistanceFrom (start);
100 }
101 
102 size_t
103 NdnSim::SerializedSizeExclude (const Exclude &exclude)
104 {
105  size_t excludeSerializedSize = 2;
106 
107  for (Exclude::const_reverse_iterator item = exclude.rbegin ();
108  item != exclude.rend ();
109  item++)
110  {
111  if (!item->first.empty ())
112  {
113  excludeSerializedSize += 1 + 2 + item->first.size ();
114  }
115  if (item->second)
116  {
117  excludeSerializedSize += 1;
118  }
119  }
120 
121  return excludeSerializedSize;
122 }
123 
124 Ptr<Exclude>
125 NdnSim::DeserializeExclude (Buffer::Iterator &i)
126 {
127  Ptr<Exclude> exclude = Create<Exclude> ();
128 
129  uint16_t excludeLength = i.ReadU16 ();
130  while (excludeLength > 0)
131  {
132  uint8_t type = i.ReadU8 ();
133  excludeLength --;
134 
135  if (type == ExcludeAnyType)
136  {
137  exclude->appendExclude (name::Component (), true);
138  }
139  else if (type == ExcludeNameType)
140  {
141  uint16_t length = i.ReadU16 ();
142  excludeLength = excludeLength - 2 - length;
143 
144  uint8_t tmp[length];
145  i.Read (tmp, length);
146 
147  bool any = false;
148  if (excludeLength > 0)
149  {
150  uint8_t type = i.ReadU8 ();
151  if (type != ExcludeAnyType)
152  {
153  i.Prev ();
154  }
155  else
156  {
157  any = true;
158  excludeLength --;
159  }
160  }
161 
162  exclude->appendExclude (name::Component (tmp, length), any);
163  }
164  else
165  {
166  NS_FATAL_ERROR ("Incorrect format of Exclude filter");
167  }
168  }
169  return exclude;
170 }
171 
172 
173 } // wire
174 
175 NDN_NAMESPACE_END
const_reverse_iterator rbegin() const
Get begin iterator of the exclude terms.
Definition: exclude.h:160
Class for NDN Name.
Definition: name.h:29
Name::const_iterator end() const
End iterator (const)
Definition: name.h:537
Class to represent Exclude component in NDN interests.
Definition: exclude.h:25
Name::const_iterator begin() const
Begin iterator (const)
Definition: name.h:525
const_reverse_iterator rend() const
Get end iterator of the exclude terms.
Definition: exclude.h:166
Class to representing binary blob of NDN name component.