blob: 433453cdd91689c9c26543fb96d6b7a663ef64bd [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -07002/**
Alexander Afanasyev9d158f02015-02-17 21:30:19 -08003 * Copyright (c) 2013-2015 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * 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.
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070020 */
21
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080022#include "face.hpp"
Alexander Afanasyeve9741322015-08-19 23:04:52 -070023
24#include "ns3/log.h"
25NS_LOG_COMPONENT_DEFINE("ndn-cxx.Face");
26
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070027#include "detail/face-impl.hpp"
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070028
Junxiao Shi468abc32014-11-04 09:12:47 -070029#include "encoding/tlv.hpp"
Junxiao Shiedd834e2014-10-28 20:28:58 -070030#include "security/key-chain.hpp"
Junxiao Shic6acc7a2015-06-23 10:03:56 -070031#include "security/signing-helpers.hpp"
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080032#include "util/time.hpp"
33#include "util/random.hpp"
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070034#include "util/face-uri.hpp"
Jeff Thompsonb982b6d2013-07-15 18:15:45 -070035
Alexander Afanasyeve9741322015-08-19 23:04:52 -070036#include "ns3/ndnSIM/helper/ndn-stack-helper.hpp"
37
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070038namespace ndn {
Alexander Afanasyevb790d952014-01-24 12:07:53 -080039
Alexander Afanasyevf7ca3202014-02-14 22:28:31 -080040Face::Face()
Alexander Afanasyeve9741322015-08-19 23:04:52 -070041 : m_impl(new Impl(*this))
Jeff Thompsonfb29cda2013-08-24 10:26:54 -070042{
Alexander Afanasyeve9741322015-08-19 23:04:52 -070043 construct();
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080044}
45
Alexander Afanasyeve9741322015-08-19 23:04:52 -070046Face::Face(boost::asio::io_service&)
47 : m_impl(new Impl(*this))
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -070048{
Alexander Afanasyeve9741322015-08-19 23:04:52 -070049 construct();
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -080050}
51
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080052void
Alexander Afanasyeve9741322015-08-19 23:04:52 -070053Face::construct()
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070054{
Alexander Afanasyeve9741322015-08-19 23:04:52 -070055 static ::ndn::KeyChain keyChain("pib-dummy", "tpm-dummy");
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070056
Alexander Afanasyeve9741322015-08-19 23:04:52 -070057 m_nfdController.reset(new nfd::Controller(*this, ns3::ndn::StackHelper::getKeyChain()));
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080058}
59
Joao Pereira68c0d882015-05-19 14:27:55 -040060Face::~Face() = default;
Junxiao Shiedd834e2014-10-28 20:28:58 -070061
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080062const PendingInterestId*
63Face::expressInterest(const Interest& interest, const OnData& onData, const OnTimeout& onTimeout)
64{
Alexander Afanasyeve9741322015-08-19 23:04:52 -070065 NS_LOG_INFO (">> Interest: " << interest.getName());
66
Alexander Afanasyevf73f0632014-05-12 18:02:37 -070067 shared_ptr<Interest> interestToExpress = make_shared<Interest>(interest);
Alexander Afanasyeve9741322015-08-19 23:04:52 -070068 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] {
69 m_impl->asyncExpressInterest(interestToExpress, onData, onTimeout);
70 });
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -080071
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080072 return reinterpret_cast<const PendingInterestId*>(interestToExpress.get());
73}
74
75const PendingInterestId*
76Face::expressInterest(const Name& name,
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -080077 const Interest& tmpl,
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080078 const OnData& onData, const OnTimeout& onTimeout/* = OnTimeout()*/)
79{
Alexander Afanasyev9c578182014-05-14 17:28:28 -070080 return expressInterest(Interest(tmpl)
Alexander Afanasyeve9741322015-08-19 23:04:52 -070081 .setName(name)
82 .setNonce(0),
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080083 onData, onTimeout);
84}
85
86void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -080087Face::put(const Data& data)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080088{
Alexander Afanasyeve9741322015-08-19 23:04:52 -070089 NS_LOG_INFO (">> Data: " << data.getName());
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -070090
Alexander Afanasyev6a05b4b2014-07-18 17:23:00 -070091 shared_ptr<const Data> dataPtr;
92 try {
93 dataPtr = data.shared_from_this();
94 }
95 catch (const bad_weak_ptr& e) {
Alexander Afanasyeve9741322015-08-19 23:04:52 -070096 NS_LOG_INFO("Face::put WARNING: the supplied Data should be created using make_shared<Data>()");
Alexander Afanasyev6a05b4b2014-07-18 17:23:00 -070097 dataPtr = make_shared<Data>(data);
98 }
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080099
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700100 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] {
101 m_impl->asyncPutData(dataPtr);
102 });
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800103}
104
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800105void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800106Face::removePendingInterest(const PendingInterestId* pendingInterestId)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800107{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700108 m_impl->m_scheduler.scheduleEvent(time::seconds(0),
109 [=] {
110 m_impl->asyncRemovePendingInterest(pendingInterestId);
111 });
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800112}
113
Alexander Afanasyev6fcdde22014-08-22 19:03:36 -0700114size_t
115Face::getNPendingInterests() const
116{
117 return m_impl->m_pendingInterestTable.size();
118}
119
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800120const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000121Face::setInterestFilter(const InterestFilter& interestFilter,
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700122 const OnInterest& onInterest,
123 const RegisterPrefixFailureCallback& onFailure,
124 const security::SigningInfo& signingInfo,
125 uint64_t flags)
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700126{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700127 return setInterestFilter(interestFilter,
128 onInterest,
129 RegisterPrefixSuccessCallback(),
130 onFailure,
131 signingInfo,
132 flags);
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700133}
134
135const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000136Face::setInterestFilter(const InterestFilter& interestFilter,
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700137 const OnInterest& onInterest,
138 const RegisterPrefixSuccessCallback& onSuccess,
139 const RegisterPrefixFailureCallback& onFailure,
140 const security::SigningInfo& signingInfo,
141 uint64_t flags)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700142{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700143 shared_ptr<InterestFilterRecord> filter =
144 make_shared<InterestFilterRecord>(interestFilter, onInterest);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700145
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700146 nfd::CommandOptions options;
147 options.setSigningInfo(signingInfo);
Junxiao Shi388ec252014-11-02 15:19:57 -0700148
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700149 return m_impl->registerPrefix(interestFilter.getPrefix(), filter,
150 onSuccess, onFailure,
151 flags, options);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700152}
153
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700154const InterestFilterId*
155Face::setInterestFilter(const InterestFilter& interestFilter,
156 const OnInterest& onInterest)
157{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700158 NS_LOG_INFO("Set Interest Filter << " << interestFilter);
159
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700160 shared_ptr<InterestFilterRecord> filter =
161 make_shared<InterestFilterRecord>(interestFilter, onInterest);
162
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700163 m_impl->m_scheduler.scheduleEvent(time::seconds(0),
164 [=] { m_impl->asyncSetInterestFilter(filter); });
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700165
166 return reinterpret_cast<const InterestFilterId*>(filter.get());
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700167}
168
Joao Pereira0b3cac52015-07-02 14:49:49 -0400169#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
170
171const RegisteredPrefixId*
172Face::setInterestFilter(const InterestFilter& interestFilter,
173 const OnInterest& onInterest,
174 const RegisterPrefixSuccessCallback& onSuccess,
175 const RegisterPrefixFailureCallback& onFailure,
176 const IdentityCertificate& certificate,
177 uint64_t flags)
178{
179 security::SigningInfo signingInfo;
180 if (!certificate.getName().empty()) {
181 signingInfo = signingByCertificate(certificate.getName());
182 }
183 return setInterestFilter(interestFilter, onInterest,
184 onSuccess, onFailure,
185 signingInfo, flags);
186}
187
188const RegisteredPrefixId*
189Face::setInterestFilter(const InterestFilter& interestFilter,
190 const OnInterest& onInterest,
191 const RegisterPrefixFailureCallback& onFailure,
192 const IdentityCertificate& certificate,
193 uint64_t flags)
194{
195 security::SigningInfo signingInfo;
196 if (!certificate.getName().empty()) {
197 signingInfo = signingByCertificate(certificate.getName());
198 }
199 return setInterestFilter(interestFilter, onInterest,
200 onFailure, signingInfo, flags);
201}
202
203const RegisteredPrefixId*
204Face::setInterestFilter(const InterestFilter& interestFilter,
205 const OnInterest& onInterest,
206 const RegisterPrefixSuccessCallback& onSuccess,
207 const RegisterPrefixFailureCallback& onFailure,
208 const Name& identity,
209 uint64_t flags)
210{
211 security::SigningInfo signingInfo = signingByIdentity(identity);
212
213 return setInterestFilter(interestFilter, onInterest,
214 onSuccess, onFailure,
215 signingInfo, flags);
216}
217
218const RegisteredPrefixId*
219Face::setInterestFilter(const InterestFilter& interestFilter,
220 const OnInterest& onInterest,
221 const RegisterPrefixFailureCallback& onFailure,
222 const Name& identity,
223 uint64_t flags)
224{
225 security::SigningInfo signingInfo = signingByIdentity(identity);
226
227 return setInterestFilter(interestFilter, onInterest,
228 onFailure, signingInfo, flags);
229}
230
231#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
232
233const RegisteredPrefixId*
234Face::registerPrefix(const Name& prefix,
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700235 const RegisterPrefixSuccessCallback& onSuccess,
236 const RegisterPrefixFailureCallback& onFailure,
237 const security::SigningInfo& signingInfo,
238 uint64_t flags)
Joao Pereira0b3cac52015-07-02 14:49:49 -0400239{
240
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700241 nfd::CommandOptions options;
242 options.setSigningInfo(signingInfo);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400243
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700244 return m_impl->registerPrefix(prefix, shared_ptr<InterestFilterRecord>(),
245 onSuccess, onFailure,
246 flags, options);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400247}
248
249#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700250
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700251const RegisteredPrefixId*
252Face::registerPrefix(const Name& prefix,
253 const RegisterPrefixSuccessCallback& onSuccess,
254 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700255 const IdentityCertificate& certificate,
256 uint64_t flags)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700257{
Joao Pereira0b3cac52015-07-02 14:49:49 -0400258 security::SigningInfo signingInfo;
Junxiao Shic6acc7a2015-06-23 10:03:56 -0700259 if (!certificate.getName().empty()) {
Joao Pereira0b3cac52015-07-02 14:49:49 -0400260 signingInfo = signingByCertificate(certificate.getName());
Junxiao Shi388ec252014-11-02 15:19:57 -0700261 }
Joao Pereira0b3cac52015-07-02 14:49:49 -0400262 return registerPrefix(prefix, onSuccess,
263 onFailure, signingInfo, flags);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700264}
265
266const RegisteredPrefixId*
267Face::registerPrefix(const Name& prefix,
268 const RegisterPrefixSuccessCallback& onSuccess,
269 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700270 const Name& identity,
271 uint64_t flags)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700272{
Joao Pereira0b3cac52015-07-02 14:49:49 -0400273 security::SigningInfo signingInfo = signingByIdentity(identity);
274 return registerPrefix(prefix, onSuccess,
275 onFailure, signingInfo, flags);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700276}
Joao Pereira0b3cac52015-07-02 14:49:49 -0400277#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700278
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700279void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800280Face::unsetInterestFilter(const RegisteredPrefixId* registeredPrefixId)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800281{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700282 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] {
283 m_impl->asyncUnregisterPrefix(registeredPrefixId,
284 UnregisterPrefixSuccessCallback(),
285 UnregisterPrefixFailureCallback()); });
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800286}
287
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700288void
289Face::unsetInterestFilter(const InterestFilterId* interestFilterId)
290{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700291 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] {
292 m_impl->asyncUnsetInterestFilter(interestFilterId);
293 });
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700294}
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700295
296void
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700297Face::unregisterPrefix(const RegisteredPrefixId* registeredPrefixId,
298 const UnregisterPrefixSuccessCallback& onSuccess,
299 const UnregisterPrefixFailureCallback& onFailure)
300{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700301 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] {
302 m_impl->asyncUnregisterPrefix(registeredPrefixId,onSuccess, onFailure);
303 });
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700304}
305
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800306void
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700307Face::processEvents(const time::milliseconds& timeout/* = time::milliseconds::zero()*/,
308 bool keepThread/* = false*/)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800309{
Jeff Thompsonfb29cda2013-08-24 10:26:54 -0700310}
311
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800312void
Jeff Thompson0050abe2013-09-17 12:50:25 -0700313Face::shutdown()
Jeff Thompson517ffa82013-08-05 16:04:34 -0700314{
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700315 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] {
316 m_impl->m_pendingInterestTable.clear();
317 m_impl->m_registeredPrefixTable.clear();
Alexander Afanasyev7dced462014-03-19 15:12:32 -0700318
Alexander Afanasyeve9741322015-08-19 23:04:52 -0700319 m_impl->m_nfdFace->close();
320 });
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800321}
322
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800323} // namespace ndn