NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: NDN, CCN, CCNx, content centric networks
API Documentation
prefix-announcement.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2019 Regents of the University of California.
4  *
5  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6  *
7  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later version.
10  *
11  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14  *
15  * You should have received copies of the GNU General Public License and GNU Lesser
16  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17  * <http://www.gnu.org/licenses/>.
18  *
19  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20  */
21 
24 
25 namespace ndn {
26 
27 static const name::Component KEYWORD_PA_COMP = "20025041"_block;
28 
30 
32  : m_data(std::move(data))
33 {
34  if (m_data->getContentType() != tlv::ContentType_PrefixAnn) {
35  NDN_THROW(Error("Data is not a prefix announcement: ContentType is " +
36  to_string(m_data->getContentType())));
37  }
38 
39  const Name& dataName = m_data->getName();
40  if (dataName.size() < 3 || dataName[-3] != KEYWORD_PA_COMP ||
41  !dataName[-2].isVersion() || !dataName[-1].isSegment()) {
42  NDN_THROW(Error("Data is not a prefix announcement: wrong name structure"));
43  }
44  m_announcedName = dataName.getPrefix(-3);
45 
46  const Block& payload = m_data->getContent();
47  payload.parse();
48 
49  m_expiration = time::milliseconds(readNonNegativeInteger(payload.get(tlv::nfd::ExpirationPeriod)));
50 
51  auto validityElement = payload.find(tlv::ValidityPeriod);
52  if (validityElement != payload.elements_end()) {
53  m_validity.emplace(*validityElement);
54  }
55 
56  for (const Block& element : payload.elements()) {
57  if (element.type() != tlv::nfd::ExpirationPeriod && element.type() != tlv::ValidityPeriod &&
58  tlv::isCriticalType(element.type())) {
59  NDN_THROW(Error("unrecognized element of critical type " + to_string(element.type())));
60  }
61  }
62 }
63 
64 const Data&
66  optional<uint64_t> version) const
67 {
68  if (!m_data) {
69  Name dataName = m_announcedName;
70  dataName.append(KEYWORD_PA_COMP);
71  dataName.appendVersion(version.value_or(time::toUnixTimestamp(time::system_clock::now()).count()));
72  dataName.appendSegment(0);
73  m_data.emplace(dataName);
74  m_data->setContentType(tlv::ContentType_PrefixAnn);
75 
76  Block content(tlv::Content);
78  m_expiration.count()));
79  if (m_validity) {
80  content.push_back(m_validity->wireEncode());
81  }
82  content.encode();
83  m_data->setContent(content);
84 
85  keyChain.sign(*m_data, si);
86  }
87  return *m_data;
88 }
89 
92 {
93  m_data.reset();
94  m_announcedName = std::move(name);
95  return *this;
96 }
97 
99 PrefixAnnouncement::setExpiration(time::milliseconds expiration)
100 {
101  if (expiration < 0_ms) {
102  NDN_THROW(std::invalid_argument("expiration period is negative"));
103  }
104  m_data.reset();
105  m_expiration = expiration;
106  return *this;
107 }
108 
110 PrefixAnnouncement::setValidityPeriod(optional<security::ValidityPeriod> validity)
111 {
112  m_data.reset();
113  m_validity = std::move(validity);
114  return *this;
115 }
116 
117 bool
119 {
120  return lhs.getAnnouncedName() == rhs.getAnnouncedName() &&
121  lhs.getExpiration() == rhs.getExpiration() &&
122  lhs.getValidityPeriod() == rhs.getValidityPeriod();
123 }
124 
125 std::ostream&
126 operator<<(std::ostream& os, const PrefixAnnouncement& pa)
127 {
128  os << pa.getAnnouncedName() << " expires=" << pa.getExpiration();
129  if (pa.getValidityPeriod()) {
130  os << " validity=" << *pa.getValidityPeriod();
131  }
132  return os;
133 }
134 
135 } // namespace ndn
ndn::tlv::ValidityPeriod
@ ValidityPeriod
Definition: tlv.hpp:143
ndn::Block::elements
const element_container & elements() const
Get container of sub-elements.
Definition: block.hpp:391
nonstd::optional_lite::std11::move
T & move(T &t)
Definition: optional.hpp:421
ndn::Name::size
size_t size() const
Returns the number of components.
Definition: name.hpp:153
ndn::PrefixAnnouncement::Error
Definition: prefix-announcement.hpp:37
ndn::security::SigningInfo
Signing parameters passed to KeyChain.
Definition: signing-info.hpp:42
ndn::PrefixAnnouncement::toData
const Data & toData(KeyChain &keyChain, const ndn::security::SigningInfo &si=KeyChain::getDefaultSigningInfo(), optional< uint64_t > version=nullopt) const
Create a Data packet representing the prefix announcement, if it does not exist.
Definition: prefix-announcement.cpp:65
ndn::time::system_clock::now
static time_point now() noexcept
Definition: time.cpp:46
ndn::PrefixAnnouncement::PrefixAnnouncement
PrefixAnnouncement()
Construct an empty prefix announcement.
ndn::Block::find
element_const_iterator find(uint32_t type) const
Find the first sub-element of the specified TLV-TYPE.
Definition: block.cpp:426
ndn::PrefixAnnouncement::setExpiration
PrefixAnnouncement & setExpiration(time::milliseconds expiration)
Set relative expiration period.
Definition: prefix-announcement.cpp:99
ndn::Block::push_back
void push_back(const Block &element)
Append a sub-element.
Definition: block.cpp:457
ndn::PrefixAnnouncement
A prefix announcement object that represents an application's intent of registering a prefix toward i...
Definition: prefix-announcement.hpp:34
ndn::encoding::readNonNegativeInteger
uint64_t readNonNegativeInteger(const Block &block)
Read a non-negative integer from a TLV element.
Definition: block-helpers.cpp:64
ndn::Name
Represents an absolute name.
Definition: name.hpp:44
ndn::Block::get
const Block & get(uint32_t type) const
Return the first sub-element of the specified TLV-TYPE.
Definition: block.cpp:414
ndn::PrefixAnnouncement::getValidityPeriod
optional< security::ValidityPeriod > getValidityPeriod() const
Return absolute validity period.
Definition: prefix-announcement.hpp:108
ndn::Name::appendVersion
Name & appendVersion(optional< uint64_t > version=nullopt)
Append a version component.
Definition: name.cpp:230
ndn::security::v2::KeyChain
The interface of signing key management.
Definition: key-chain.hpp:47
NDN_THROW
#define NDN_THROW(e)
Definition: exception.hpp:61
ndn::Name::append
Name & append(const Component &component)
Append a component.
Definition: name.hpp:277
ndn::Name::getPrefix
PartialName getPrefix(ssize_t nComponents) const
Returns a prefix of the name.
Definition: name.hpp:211
ndn::encoding::makeNonNegativeIntegerBlock
Block makeNonNegativeIntegerBlock(uint32_t type, uint64_t value)
Create a TLV block containing a non-negative integer.
Definition: block-helpers.cpp:52
ndn::tlv::nfd::ExpirationPeriod
@ ExpirationPeriod
Definition: tlv-nfd.hpp:45
ndn::Block::parse
void parse() const
Parse TLV-VALUE into sub-elements.
Definition: block.cpp:325
ndn::Data
Represents a Data packet.
Definition: data.hpp:36
tlv-nfd.hpp
ndn::KEYWORD_PA_COMP
static const name::Component KEYWORD_PA_COMP
Definition: prefix-announcement.cpp:27
prefix-announcement.hpp
ndn::PrefixAnnouncement::getAnnouncedName
const Name & getAnnouncedName() const
Return announced name.
Definition: prefix-announcement.hpp:79
ndn::tlv::isCriticalType
constexpr bool isCriticalType(uint32_t type)
Determine whether a TLV-TYPE is "critical" for evolvability purpose.
Definition: tlv.hpp:174
ndn::name::Component
Represents a name component.
Definition: name-component.hpp:94
ndn::Block
Represents a TLV element of NDN packet format.
Definition: block.hpp:43
ndn::to_string
std::string to_string(const T &val)
Definition: backports.hpp:102
ndn::Block::elements_end
element_const_iterator elements_end() const
Equivalent to elements().end()
Definition: block.hpp:407
ndn::operator==
bool operator==(const Data &lhs, const Data &rhs)
Definition: data.cpp:312
ndn::operator<<
std::ostream & operator<<(std::ostream &os, const Data &data)
Definition: data.cpp:322
ndn::name
Definition: name-component-types.hpp:33
ndn::time::toUnixTimestamp
milliseconds toUnixTimestamp(const system_clock::TimePoint &point)
Convert system_clock::TimePoint to UNIX timestamp.
Definition: time.cpp:113
ndn::PrefixAnnouncement::setValidityPeriod
PrefixAnnouncement & setValidityPeriod(optional< security::ValidityPeriod > validity)
Set absolute validity period.
Definition: prefix-announcement.cpp:110
ndn::Name::appendSegment
Name & appendSegment(uint64_t segmentNo)
Append a segment number (sequential) component.
Definition: name.hpp:416
ndn::Block::encode
void encode()
Encode sub-elements into TLV-VALUE.
Definition: block.cpp:353
ndn::security::v2::KeyChain::sign
void sign(Data &data, const SigningInfo &params=getDefaultSigningInfo())
Sign data according to the supplied signing information.
Definition: key-chain.cpp:450
ndn::PrefixAnnouncement::setAnnouncedName
PrefixAnnouncement & setAnnouncedName(Name name)
Set announced name.
Definition: prefix-announcement.cpp:91
ndn::PrefixAnnouncement::getExpiration
time::milliseconds getExpiration() const
Return relative expiration period.
Definition: prefix-announcement.hpp:93
ndn::tlv::ContentType_PrefixAnn
@ ContentType_PrefixAnn
prefix announcement
Definition: tlv.hpp:162
ndn
Copyright (c) 2011-2015 Regents of the University of California.
Definition: ndn-strategy-choice-helper.hpp:34
ndn::tlv::Content
@ Content
Definition: tlv.hpp:79