NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: NDN, CCN, CCNx, content centric networks
API Documentation
ndn-block-header.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
20 #include "ndn-block-header.hpp"
21 
22 #include <iosfwd>
23 #include <boost/iostreams/concepts.hpp>
24 #include <boost/iostreams/stream.hpp>
25 
26 #include <ndn-cxx/encoding/tlv.hpp>
27 #include <ndn-cxx/interest.hpp>
28 #include <ndn-cxx/data.hpp>
29 #include <ndn-cxx/lp/packet.hpp>
30 
31 namespace io = boost::iostreams;
32 namespace nfdFace = nfd::face;
33 
34 namespace ns3 {
35 namespace ndn {
36 
37 ns3::TypeId
39 {
40  static ns3::TypeId tid =
41  ns3::TypeId("ns3::ndn::Packet")
42  .SetGroupName("Ndn")
43  .SetParent<Header>()
44  .AddConstructor<BlockHeader>()
45  ;
46  return tid;
47 }
48 
49 TypeId
51 {
52  return GetTypeId();
53 }
54 
56 {
57 }
58 
59 BlockHeader::BlockHeader(const Block& packet)
60  : m_block(packet)
61 {
62 }
63 
64 uint32_t
66 {
67  return m_block.size();
68 }
69 
70 void
71 BlockHeader::Serialize(ns3::Buffer::Iterator start) const
72 {
73  start.Write(m_block.wire(), m_block.size());
74 }
75 
76 class Ns3BufferIteratorSource : public io::source {
77 public:
78  Ns3BufferIteratorSource(ns3::Buffer::Iterator& is)
79  : m_is(is)
80  {
81  }
82 
83  std::streamsize
84  read(char* buf, std::streamsize nMaxRead)
85  {
86  std::streamsize i = 0;
87  for (; i < nMaxRead && !m_is.IsEnd(); ++i) {
88  buf[i] = m_is.ReadU8();
89  }
90  if (i == 0) {
91  return -1;
92  }
93  else {
94  return i;
95  }
96  }
97 
98 private:
99  ns3::Buffer::Iterator& m_is;
100 };
101 
102 uint32_t
103 BlockHeader::Deserialize(ns3::Buffer::Iterator start)
104 {
105  io::stream<Ns3BufferIteratorSource> is(start);
106  m_block = ::ndn::Block::fromStream(is);
107  return m_block.size();
108 }
109 
110 void
111 BlockHeader::Print(std::ostream& os) const
112 {
113  namespace tlv = ::ndn::tlv;
114  namespace lp = ::ndn::lp;
115 
116  std::function<void(const Block& block)> decodeAndPrint = [&os, &decodeAndPrint] (const Block& block) {
117  switch (block.type()) {
118  case tlv::Interest: {
119  Interest i(block);
120  os << "Interest: " << i;
121  break;
122  }
123  case tlv::Data: {
124  Data d(block);
125  os << "Data: " << d.getName();
126  break;
127  }
128  case lp::tlv::LpPacket: {
129  os << "NDNLP(";
130  lp::Packet p(block);
131  if (p.has<lp::FragCountField>() && p.get<lp::FragCountField>() != 1) {
132  os << "fragment " << (p.get<lp::FragIndexField>() + 1) << " out of " << p.get<lp::FragCountField>();
133  }
134  else {
135  if (p.has<lp::NackField>()) {
136  lp::NackHeader nack = p.get<lp::NackField>();
137  os << "NACK(" << nack.getReason() << ") for ";
138  }
139 
140  ::ndn::Buffer::const_iterator first, last;
141  std::tie(first, last) = p.get<lp::FragmentField>(0);
142  try {
143  Block fragmentBlock(::ndn::make_span(&*first, std::distance(first, last)));
144  decodeAndPrint(fragmentBlock);
145  }
146  catch (const tlv::Error& error) {
147  os << "Non-TLV bytes (size: " << std::distance(first, last) << ")";
148  }
149  }
150  os << ")";
151  break;
152  }
153  default: {
154  os << "Unrecognized";
155  break;
156  }
157  }
158  };
159 
160  decodeAndPrint(m_block);
161 }
162 
163 Block&
165 {
166  return m_block;
167 }
168 
169 const Block&
171 {
172  return m_block;
173 }
174 
175 } // namespace ndn
176 } // namespace ns3
virtual uint32_t GetSerializedSize(void) const
NDN_CXX_NODISCARD bool has() const
Definition: packet.hpp:74
static Block fromStream(std::istream &is)
Parse Block from an input stream.
Definition: block.cpp:220
Copyright (c) 2011-2015 Regents of the University of California.
virtual uint32_t Deserialize(ns3::Buffer::Iterator start)
virtual void Serialize(ns3::Buffer::Iterator start) const
Ns3BufferIteratorSource(ns3::Buffer::Iterator &is)
NackReason getReason() const
virtual void Print(std::ostream &os) const
Declare a field.
Definition: field-decl.hpp:176
FIELD::ValueType get(size_t index=0) const
Definition: packet.hpp:96
virtual TypeId GetInstanceTypeId(void) const
Copyright (c) 2011-2015 Regents of the University of California.
static ns3::TypeId GetTypeId()
std::streamsize read(char *buf, std::streamsize nMaxRead)
represents a Network NACK header
Definition: nack-header.hpp:57