blob: c749025372be937e4c9dd641a9911bc5d371af90 [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 Afanasyev57e00362016-06-23 13:22:54 -07003 * Copyright (c) 2013-2016 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 Afanasyev258ec2b2014-05-14 16:15:37 -070023#include "detail/face-impl.hpp"
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070024
Junxiao Shi468abc32014-11-04 09:12:47 -070025#include "encoding/tlv.hpp"
Junxiao Shiedd834e2014-10-28 20:28:58 -070026#include "security/key-chain.hpp"
Junxiao Shic6acc7a2015-06-23 10:03:56 -070027#include "security/signing-helpers.hpp"
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080028#include "util/time.hpp"
29#include "util/random.hpp"
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070030#include "util/face-uri.hpp"
Jeff Thompsonb982b6d2013-07-15 18:15:45 -070031
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080032#include "ns3/node-list.h"
33#include "ns3/ndnSIM/helper/ndn-stack-helper.hpp"
34#include "ns3/ndnSIM/NFD/daemon/face/generic-link-service.hpp"
35#include "ns3/ndnSIM/NFD/daemon/face/internal-transport.hpp"
36
Junxiao Shiae0b4182016-08-08 22:53:17 +000037// A callback scheduled through io.post and io.dispatch may be invoked after the face
38// is destructed. To prevent this situation, these macros captures Face::m_impl as weak_ptr,
39// and skips callback execution if the face has been destructed.
40#define IO_CAPTURE_WEAK_IMPL(OP) \
41 { \
42 weak_ptr<Impl> implWeak(m_impl); \
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080043 m_impl->m_scheduler.scheduleEvent(time::seconds(0), [=] { \
Junxiao Shiae0b4182016-08-08 22:53:17 +000044 auto impl = implWeak.lock(); \
45 if (impl != nullptr) {
46#define IO_CAPTURE_WEAK_IMPL_END \
47 } \
48 }); \
49 }
50
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070051namespace ndn {
Alexander Afanasyevb790d952014-01-24 12:07:53 -080052
Junxiao Shi103d8ed2016-08-07 20:34:10 +000053Face::Face(shared_ptr<Transport> transport)
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080054 : m_impl(new Impl(*this))
Jeff Thompsonfb29cda2013-08-24 10:26:54 -070055{
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080056 construct(transport, ns3::ndn::StackHelper::getKeyChain());
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080057}
58
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -070059Face::Face(boost::asio::io_service& ioService)
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080060 : m_impl(new Impl(*this))
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -070061{
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080062 construct(nullptr, ns3::ndn::StackHelper::getKeyChain());
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080063}
64
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -070065Face::Face(shared_ptr<Transport> transport, KeyChain& keyChain)
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080066 : m_impl(new Impl(*this))
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -070067{
68 construct(transport, keyChain);
69}
70
71Face::Face(shared_ptr<Transport> transport, boost::asio::io_service& ioService)
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080072 : m_impl(new Impl(*this))
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080073{
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080074 construct(transport, ns3::ndn::StackHelper::getKeyChain());
Junxiao Shiedd834e2014-10-28 20:28:58 -070075}
76
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -070077Face::Face(shared_ptr<Transport> transport, boost::asio::io_service& ioService, KeyChain& keyChain)
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080078 : m_impl(new Impl(*this))
Junxiao Shiedd834e2014-10-28 20:28:58 -070079{
Joao Pereira68c0d882015-05-19 14:27:55 -040080 construct(transport, keyChain);
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -080081}
82
Alexander Afanasyevbb64c172015-12-29 20:32:45 -080083shared_ptr<Transport>
84Face::makeDefaultTransport()
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070085{
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080086 ns3::Ptr<ns3::Node> node = ns3::NodeList::GetNode(ns3::Simulator::GetContext());
87 NS_ASSERT_MSG(node->GetObject<ns3::ndn::L3Protocol>() != 0,
88 "NDN stack should be installed on the node " << node);
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070089
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080090 auto uri = ::nfd::FaceUri("ndnFace://" + boost::lexical_cast<std::string>(node->GetId()));
Alexander Afanasyev57e00362016-06-23 13:22:54 -070091
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080092 ::nfd::face::GenericLinkService::Options serviceOpts;
93 serviceOpts.allowLocalFields = true;
Alexander Afanasyev57e00362016-06-23 13:22:54 -070094
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080095 auto nfdFace = make_shared<::nfd::Face>(make_unique<::nfd::face::GenericLinkService>(serviceOpts),
96 make_unique<::nfd::face::InternalForwarderTransport>(uri, uri));
97 auto forwarderTransport = static_cast<::nfd::face::InternalForwarderTransport*>(nfdFace->getTransport());
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -070098
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -080099 auto clientTransport = make_shared<::nfd::face::InternalClientTransport>();
100 clientTransport->connectToForwarder(forwarderTransport);
Alexander Afanasyev57e00362016-06-23 13:22:54 -0700101
Spyridon Mastorakisabd6bfa2016-11-28 18:03:05 -0800102 node->GetObject<ns3::ndn::L3Protocol>()->addFace(nfdFace);;
103
104 return clientTransport;
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -0700105}
106
107void
Joao Pereira68c0d882015-05-19 14:27:55 -0400108Face::construct(shared_ptr<Transport> transport, KeyChain& keyChain)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800109{
Alexander Afanasyevbb64c172015-12-29 20:32:45 -0800110 if (transport == nullptr) {
111 transport = makeDefaultTransport();
112 }
113 BOOST_ASSERT(transport != nullptr);
Alexander Afanasyevf39c5372014-02-17 19:42:56 -0800114 m_transport = transport;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800115
Alexander Afanasyevbb64c172015-12-29 20:32:45 -0800116 m_nfdController.reset(new nfd::Controller(*this, keyChain));
117
Junxiao Shiae0b4182016-08-08 22:53:17 +0000118 IO_CAPTURE_WEAK_IMPL(post) {
119 impl->ensureConnected(false);
120 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800121}
122
Joao Pereira68c0d882015-05-19 14:27:55 -0400123Face::~Face() = default;
Junxiao Shiedd834e2014-10-28 20:28:58 -0700124
Alexander Afanasyev3a6da362015-12-29 20:31:03 -0800125shared_ptr<Transport>
126Face::getTransport()
127{
128 return m_transport;
129}
130
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800131const PendingInterestId*
Eric Newberry83872fd2015-08-06 17:01:24 -0700132Face::expressInterest(const Interest& interest,
133 const DataCallback& afterSatisfied,
134 const NackCallback& afterNacked,
135 const TimeoutCallback& afterTimeout)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800136{
Alexander Afanasyevf73f0632014-05-12 18:02:37 -0700137 shared_ptr<Interest> interestToExpress = make_shared<Interest>(interest);
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800138
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700139 // Use `interestToExpress` to avoid wire format creation for the original Interest
Eric Newberry83872fd2015-08-06 17:01:24 -0700140 if (interestToExpress->wireEncode().size() > MAX_NDN_PACKET_SIZE) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700141 BOOST_THROW_EXCEPTION(Error("Interest size exceeds maximum limit"));
Eric Newberry83872fd2015-08-06 17:01:24 -0700142 }
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700143
Alexander Afanasyev4e50b972014-03-25 10:57:50 -0700144 // If the same ioService thread, dispatch directly calls the method
Junxiao Shiae0b4182016-08-08 22:53:17 +0000145 IO_CAPTURE_WEAK_IMPL(dispatch) {
146 impl->asyncExpressInterest(interestToExpress, afterSatisfied, afterNacked, afterTimeout);
147 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800148
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800149 return reinterpret_cast<const PendingInterestId*>(interestToExpress.get());
150}
151
152const PendingInterestId*
Eric Newberry83872fd2015-08-06 17:01:24 -0700153Face::expressInterest(const Interest& interest,
154 const OnData& onData,
155 const OnTimeout& onTimeout)
156{
157 return this->expressInterest(
158 interest,
159 [onData] (const Interest& interest, const Data& data) {
160 if (onData != nullptr) {
161 onData(interest, const_cast<Data&>(data));
162 }
163 },
164 [onTimeout] (const Interest& interest, const lp::Nack& nack) {
165 if (onTimeout != nullptr) {
166 onTimeout(interest);
167 }
168 },
169 onTimeout
170 );
171}
172
173const PendingInterestId*
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000174Face::expressInterest(const Name& name, const Interest& tmpl,
175 const OnData& onData, const OnTimeout& onTimeout)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800176{
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000177 return expressInterest(Interest(tmpl).setName(name).setNonce(0),
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800178 onData, onTimeout);
179}
180
181void
Junxiao Shiae0b4182016-08-08 22:53:17 +0000182Face::removePendingInterest(const PendingInterestId* pendingInterestId)
183{
184 IO_CAPTURE_WEAK_IMPL(post) {
185 impl->asyncRemovePendingInterest(pendingInterestId);
186 } IO_CAPTURE_WEAK_IMPL_END
187}
188
189void
190Face::removeAllPendingInterests()
191{
192 IO_CAPTURE_WEAK_IMPL(post) {
193 impl->asyncRemoveAllPendingInterests();
194 } IO_CAPTURE_WEAK_IMPL_END
195}
196
197size_t
198Face::getNPendingInterests() const
199{
200 return m_impl->m_pendingInterestTable.size();
201}
202
203void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800204Face::put(const Data& data)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800205{
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000206 Block wire = data.wireEncode();
207
Eric Newberry4d261b62016-11-10 13:40:09 -0700208 lp::Packet packet;
209 bool hasLpFields = false;
210
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000211 shared_ptr<lp::CachePolicyTag> cachePolicyTag = data.getTag<lp::CachePolicyTag>();
212 if (cachePolicyTag != nullptr) {
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000213 packet.add<lp::CachePolicyField>(*cachePolicyTag);
Eric Newberry4d261b62016-11-10 13:40:09 -0700214 hasLpFields = true;
215 }
216
217 shared_ptr<lp::CongestionMarkTag> congestionMarkTag = data.getTag<lp::CongestionMarkTag>();
218 if (congestionMarkTag != nullptr) {
219 packet.add<lp::CongestionMarkField>(*congestionMarkTag);
220 hasLpFields = true;
221 }
222
223 if (hasLpFields) {
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000224 packet.add<lp::FragmentField>(std::make_pair(wire.begin(), wire.end()));
225 wire = packet.wireEncode();
226 }
227
228 if (wire.size() > MAX_NDN_PACKET_SIZE)
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700229 BOOST_THROW_EXCEPTION(Error("Data size exceeds maximum limit"));
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700230
Junxiao Shiae0b4182016-08-08 22:53:17 +0000231 IO_CAPTURE_WEAK_IMPL(dispatch) {
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000232 impl->asyncSend(wire);
Junxiao Shiae0b4182016-08-08 22:53:17 +0000233 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800234}
235
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800236void
Eric Newberry83872fd2015-08-06 17:01:24 -0700237Face::put(const lp::Nack& nack)
238{
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000239 lp::Packet packet;
240 packet.add<lp::NackField>(nack.getHeader());
241 const Block& interestWire = nack.getInterest().wireEncode();
242 packet.add<lp::FragmentField>(std::make_pair(interestWire.begin(), interestWire.end()));
243
Eric Newberry4d261b62016-11-10 13:40:09 -0700244 shared_ptr<lp::CongestionMarkTag> congestionMarkTag = nack.getTag<lp::CongestionMarkTag>();
245 if (congestionMarkTag != nullptr) {
246 packet.add<lp::CongestionMarkField>(*congestionMarkTag);
247 }
248
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000249 Block wire = packet.wireEncode();
250
251 if (wire.size() > MAX_NDN_PACKET_SIZE)
252 BOOST_THROW_EXCEPTION(Error("Nack size exceeds maximum limit"));
Eric Newberry83872fd2015-08-06 17:01:24 -0700253
Junxiao Shiae0b4182016-08-08 22:53:17 +0000254 IO_CAPTURE_WEAK_IMPL(dispatch) {
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000255 impl->asyncSend(wire);
Junxiao Shiae0b4182016-08-08 22:53:17 +0000256 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev6fcdde22014-08-22 19:03:36 -0700257}
258
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800259const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000260Face::setInterestFilter(const InterestFilter& interestFilter,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000261 const InterestCallback& onInterest,
262 const RegisterPrefixFailureCallback& onFailure,
263 const security::SigningInfo& signingInfo,
264 uint64_t flags)
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700265{
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000266 return setInterestFilter(interestFilter, onInterest, nullptr, onFailure, signingInfo, flags);
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700267}
268
269const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000270Face::setInterestFilter(const InterestFilter& interestFilter,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000271 const InterestCallback& onInterest,
272 const RegisterPrefixSuccessCallback& onSuccess,
273 const RegisterPrefixFailureCallback& onFailure,
274 const security::SigningInfo& signingInfo,
275 uint64_t flags)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700276{
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000277 auto filter = make_shared<InterestFilterRecord>(interestFilter, onInterest);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700278
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000279 nfd::CommandOptions options;
280 options.setSigningInfo(signingInfo);
Junxiao Shi388ec252014-11-02 15:19:57 -0700281
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000282 return m_impl->registerPrefix(interestFilter.getPrefix(), filter,
283 onSuccess, onFailure, flags, options);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700284}
285
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700286const InterestFilterId*
287Face::setInterestFilter(const InterestFilter& interestFilter,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000288 const InterestCallback& onInterest)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700289{
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000290 auto filter = make_shared<InterestFilterRecord>(interestFilter, onInterest);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700291
Junxiao Shiae0b4182016-08-08 22:53:17 +0000292 IO_CAPTURE_WEAK_IMPL(post) {
293 impl->asyncSetInterestFilter(filter);
294 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700295
296 return reinterpret_cast<const InterestFilterId*>(filter.get());
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700297}
298
Joao Pereira0b3cac52015-07-02 14:49:49 -0400299#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
300
301const RegisteredPrefixId*
302Face::setInterestFilter(const InterestFilter& interestFilter,
303 const OnInterest& onInterest,
304 const RegisterPrefixSuccessCallback& onSuccess,
305 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700306 const security::v1::IdentityCertificate& certificate,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400307 uint64_t flags)
308{
309 security::SigningInfo signingInfo;
310 if (!certificate.getName().empty()) {
311 signingInfo = signingByCertificate(certificate.getName());
312 }
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000313 return setInterestFilter(interestFilter, onInterest, onSuccess, onFailure, signingInfo, flags);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400314}
315
316const RegisteredPrefixId*
317Face::setInterestFilter(const InterestFilter& interestFilter,
318 const OnInterest& onInterest,
319 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700320 const security::v1::IdentityCertificate& certificate,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400321 uint64_t flags)
322{
323 security::SigningInfo signingInfo;
324 if (!certificate.getName().empty()) {
325 signingInfo = signingByCertificate(certificate.getName());
326 }
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000327 return setInterestFilter(interestFilter, onInterest, onFailure, signingInfo, flags);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400328}
329
330const RegisteredPrefixId*
331Face::setInterestFilter(const InterestFilter& interestFilter,
332 const OnInterest& onInterest,
333 const RegisterPrefixSuccessCallback& onSuccess,
334 const RegisterPrefixFailureCallback& onFailure,
335 const Name& identity,
336 uint64_t flags)
337{
338 security::SigningInfo signingInfo = signingByIdentity(identity);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400339 return setInterestFilter(interestFilter, onInterest,
340 onSuccess, onFailure,
341 signingInfo, flags);
342}
343
344const RegisteredPrefixId*
345Face::setInterestFilter(const InterestFilter& interestFilter,
346 const OnInterest& onInterest,
347 const RegisterPrefixFailureCallback& onFailure,
348 const Name& identity,
349 uint64_t flags)
350{
351 security::SigningInfo signingInfo = signingByIdentity(identity);
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000352 return setInterestFilter(interestFilter, onInterest, onFailure, signingInfo, flags);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400353}
354
355#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
356
357const RegisteredPrefixId*
358Face::registerPrefix(const Name& prefix,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000359 const RegisterPrefixSuccessCallback& onSuccess,
360 const RegisterPrefixFailureCallback& onFailure,
361 const security::SigningInfo& signingInfo,
362 uint64_t flags)
Joao Pereira0b3cac52015-07-02 14:49:49 -0400363{
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000364 nfd::CommandOptions options;
365 options.setSigningInfo(signingInfo);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400366
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000367 return m_impl->registerPrefix(prefix, nullptr, onSuccess, onFailure, flags, options);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400368}
369
370#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700371const RegisteredPrefixId*
372Face::registerPrefix(const Name& prefix,
373 const RegisterPrefixSuccessCallback& onSuccess,
374 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev2fa59392016-07-29 17:24:23 -0700375 const security::v1::IdentityCertificate& certificate,
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700376 uint64_t flags)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700377{
Joao Pereira0b3cac52015-07-02 14:49:49 -0400378 security::SigningInfo signingInfo;
Junxiao Shic6acc7a2015-06-23 10:03:56 -0700379 if (!certificate.getName().empty()) {
Joao Pereira0b3cac52015-07-02 14:49:49 -0400380 signingInfo = signingByCertificate(certificate.getName());
Junxiao Shi388ec252014-11-02 15:19:57 -0700381 }
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000382 return registerPrefix(prefix, onSuccess, onFailure, signingInfo, flags);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700383}
384
385const RegisteredPrefixId*
386Face::registerPrefix(const Name& prefix,
387 const RegisterPrefixSuccessCallback& onSuccess,
388 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700389 const Name& identity,
390 uint64_t flags)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700391{
Joao Pereira0b3cac52015-07-02 14:49:49 -0400392 security::SigningInfo signingInfo = signingByIdentity(identity);
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000393 return registerPrefix(prefix, onSuccess, onFailure, signingInfo, flags);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700394}
Joao Pereira0b3cac52015-07-02 14:49:49 -0400395#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700396
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700397void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800398Face::unsetInterestFilter(const RegisteredPrefixId* registeredPrefixId)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800399{
Junxiao Shiae0b4182016-08-08 22:53:17 +0000400 IO_CAPTURE_WEAK_IMPL(post) {
401 impl->asyncUnregisterPrefix(registeredPrefixId, nullptr, nullptr);
402 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800403}
404
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700405void
406Face::unsetInterestFilter(const InterestFilterId* interestFilterId)
407{
Junxiao Shiae0b4182016-08-08 22:53:17 +0000408 IO_CAPTURE_WEAK_IMPL(post) {
409 impl->asyncUnsetInterestFilter(interestFilterId);
410 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700411}
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700412
413void
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700414Face::unregisterPrefix(const RegisteredPrefixId* registeredPrefixId,
415 const UnregisterPrefixSuccessCallback& onSuccess,
416 const UnregisterPrefixFailureCallback& onFailure)
417{
Junxiao Shiae0b4182016-08-08 22:53:17 +0000418 IO_CAPTURE_WEAK_IMPL(post) {
419 impl->asyncUnregisterPrefix(registeredPrefixId, onSuccess, onFailure);
420 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700421}
422
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800423void
Junxiao Shic828dfc2016-09-15 13:26:22 +0000424Face::doProcessEvents(const time::milliseconds& timeout, bool keepThread)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800425{
Jeff Thompsonfb29cda2013-08-24 10:26:54 -0700426}
427
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800428void
Jeff Thompson0050abe2013-09-17 12:50:25 -0700429Face::shutdown()
Jeff Thompson517ffa82013-08-05 16:04:34 -0700430{
Junxiao Shiae0b4182016-08-08 22:53:17 +0000431 IO_CAPTURE_WEAK_IMPL(post) {
432 this->asyncShutdown();
433 } IO_CAPTURE_WEAK_IMPL_END
Alexander Afanasyev7dced462014-03-19 15:12:32 -0700434}
435
436void
437Face::asyncShutdown()
438{
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700439 m_impl->m_pendingInterestTable.clear();
440 m_impl->m_registeredPrefixTable.clear();
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800441
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700442 if (m_transport->isConnected())
443 m_transport->close();
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -0700444}
445
Eric Newberry83872fd2015-08-06 17:01:24 -0700446/**
447 * @brief extract local fields from NDNLPv2 packet and tag onto a network layer packet
448 */
Eric Newberry4d261b62016-11-10 13:40:09 -0700449template<typename NetPkt>
Eric Newberry83872fd2015-08-06 17:01:24 -0700450static void
Eric Newberry4d261b62016-11-10 13:40:09 -0700451extractLpLocalFields(NetPkt& netPacket, const lp::Packet& lpPacket)
Eric Newberry83872fd2015-08-06 17:01:24 -0700452{
453 if (lpPacket.has<lp::IncomingFaceIdField>()) {
Junxiao Shi4b469982015-12-03 18:20:19 +0000454 netPacket.setTag(make_shared<lp::IncomingFaceIdTag>(lpPacket.get<lp::IncomingFaceIdField>()));
Eric Newberry83872fd2015-08-06 17:01:24 -0700455 }
Eric Newberry4d261b62016-11-10 13:40:09 -0700456
457 if (lpPacket.has<lp::CongestionMarkField>()) {
458 netPacket.setTag(make_shared<lp::CongestionMarkTag>(lpPacket.get<lp::CongestionMarkField>()));
459 }
Alexander Afanasyev4692ba82017-02-08 20:15:58 -0800460
461 if (lpPacket.has<lp::HopCountTagField>()) {
462 netPacket.setTag(make_shared<lp::HopCountTag>(lpPacket.get<lp::HopCountTagField>() + 1));
463 }
Eric Newberry83872fd2015-08-06 17:01:24 -0700464}
465
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800466void
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800467Face::onReceiveElement(const Block& blockFromDaemon)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800468{
Eric Newberry83872fd2015-08-06 17:01:24 -0700469 lp::Packet lpPacket(blockFromDaemon); // bare Interest/Data is a valid lp::Packet,
470 // no need to distinguish
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800471
Eric Newberry83872fd2015-08-06 17:01:24 -0700472 Buffer::const_iterator begin, end;
473 std::tie(begin, end) = lpPacket.get<lp::FragmentField>();
474 Block netPacket(&*begin, std::distance(begin, end));
475 switch (netPacket.type()) {
476 case tlv::Interest: {
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000477 auto interest = make_shared<Interest>(netPacket);
Eric Newberry83872fd2015-08-06 17:01:24 -0700478 if (lpPacket.has<lp::NackField>()) {
479 auto nack = make_shared<lp::Nack>(std::move(*interest));
480 nack->setHeader(lpPacket.get<lp::NackField>());
481 extractLpLocalFields(*nack, lpPacket);
482 m_impl->nackPendingInterests(*nack);
483 }
484 else {
485 extractLpLocalFields(*interest, lpPacket);
486 m_impl->processInterestFilters(*interest);
487 }
488 break;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800489 }
Eric Newberry83872fd2015-08-06 17:01:24 -0700490 case tlv::Data: {
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000491 auto data = make_shared<Data>(netPacket);
Eric Newberry83872fd2015-08-06 17:01:24 -0700492 extractLpLocalFields(*data, lpPacket);
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700493 m_impl->satisfyPendingInterests(*data);
Eric Newberry83872fd2015-08-06 17:01:24 -0700494 break;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800495 }
Eric Newberry83872fd2015-08-06 17:01:24 -0700496 }
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800497}
498
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800499} // namespace ndn