blob: 2944ed7baa2a731cdf6b4cec2e20021f915903d1 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi2ed9e072017-08-13 16:45:48 +00002/*
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -08003 * Copyright (c) 2013-2017 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
Jeff Thompsonb9e3c8e2013-08-02 11:42:51 -070022#ifndef NDN_FACE_HPP
Jeff Thompsona0d18c92013-08-06 13:55:32 -070023#define NDN_FACE_HPP
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070024
Junxiao Shib6e276f2017-08-14 20:10:04 +000025#include "data.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070026#include "name.hpp"
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080027#include "interest.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070028#include "interest-filter.hpp"
Junxiao Shi4b469982015-12-03 18:20:19 +000029#include "encoding/nfd-constants.hpp"
Eric Newberry83872fd2015-08-06 17:01:24 -070030#include "lp/nack.hpp"
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -080031#include "security/key-chain.hpp"
Junxiao Shib6e276f2017-08-14 20:10:04 +000032#include "security/signing-info.hpp"
Joao Pereira0b3cac52015-07-02 14:49:49 -040033
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070034namespace boost {
35namespace asio {
36class io_service;
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -070037} // namespace asio
38} // namespace boost
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080039
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070040namespace ndn {
41
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070042class Transport;
43
44class PendingInterestId;
45class RegisteredPrefixId;
46class InterestFilterId;
47
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -070048namespace nfd {
49class Controller;
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -070050} // namespace nfd
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -070051
Jeff Thompsonfe08e5a2013-08-13 11:15:59 -070052/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000053 * @brief Callback invoked when expressed Interest gets satisfied with a Data packet
Eric Newberry83872fd2015-08-06 17:01:24 -070054 */
55typedef function<void(const Interest&, const Data&)> DataCallback;
56
57/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000058 * @brief Callback invoked when Nack is sent in response to expressed Interest
Eric Newberry83872fd2015-08-06 17:01:24 -070059 */
60typedef function<void(const Interest&, const lp::Nack&)> NackCallback;
61
62/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000063 * @brief Callback invoked when expressed Interest times out
Eric Newberry83872fd2015-08-06 17:01:24 -070064 */
65typedef function<void(const Interest&)> TimeoutCallback;
66
67/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000068 * @brief Callback invoked when incoming Interest matches the specified InterestFilter
69 */
70typedef function<void(const InterestFilter&, const Interest&)> InterestCallback;
71
72/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000073 * @brief Callback invoked when registerPrefix or setInterestFilter command succeeds
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080074 */
Alexander Afanasyev984ad192014-05-02 19:11:15 -070075typedef function<void(const Name&)> RegisterPrefixSuccessCallback;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080076
Alexander Afanasyev984ad192014-05-02 19:11:15 -070077/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000078 * @brief Callback invoked when registerPrefix or setInterestFilter command fails
Alexander Afanasyev984ad192014-05-02 19:11:15 -070079 */
80typedef function<void(const Name&, const std::string&)> RegisterPrefixFailureCallback;
81
82/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000083 * @brief Callback invoked when unregisterPrefix or unsetInterestFilter command succeeds
Alexander Afanasyev984ad192014-05-02 19:11:15 -070084 */
85typedef function<void()> UnregisterPrefixSuccessCallback;
86
87/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000088 * @brief Callback invoked when unregisterPrefix or unsetInterestFilter command fails
Alexander Afanasyev984ad192014-05-02 19:11:15 -070089 */
90typedef function<void(const std::string&)> UnregisterPrefixFailureCallback;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080091
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080092/**
Junxiao Shi103d8ed2016-08-07 20:34:10 +000093 * @brief Provide a communication channel with local or remote NDN forwarder
Jeff Thompsonfe08e5a2013-08-13 11:15:59 -070094 */
Alexander Afanasyev8460afb2014-02-15 20:31:42 -080095class Face : noncopyable
96{
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070097public:
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070098 class Error : public std::runtime_error
99 {
100 public:
101 explicit
102 Error(const std::string& what)
103 : std::runtime_error(what)
104 {
105 }
106 };
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800107
Junxiao Shib6e276f2017-08-14 20:10:04 +0000108 /**
109 * @brief Exception thrown when attempting to send a packet over size limit
110 */
111 class OversizedPacketError : public Error
112 {
113 public:
114 /**
115 * @brief Constructor
116 * @param pktType packet type, 'I' for Interest, 'D' for Data, 'N' for Nack
117 * @param name packet name
118 * @param wireSize wire encoding size
119 */
120 OversizedPacketError(char pktType, const Name& name, size_t wireSize);
121
122 public:
123 const char pktType;
124 const Name name;
125 const size_t wireSize;
126 };
127
Junxiao Shiedd834e2014-10-28 20:28:58 -0700128public: // constructors
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800129 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000130 * @brief Create Face using given transport (or default transport if omitted)
131 * @param transport the transport for lower layer communication. If nullptr,
132 * a default transport will be used. The default transport is
133 * determined from a FaceUri in NDN_CLIENT_TRANSPORT environ,
134 * a FaceUri in configuration file 'transport' key, or UnixTransport.
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700135 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000136 * @throw ConfigFile::Error @p transport is nullptr, and the configuration file cannot be
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000137 * parsed or specifies an unsupported protocol
138 * @note shared_ptr is passed by value because ownership is shared with this class
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800139 */
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000140 explicit
141 Face(shared_ptr<Transport> transport = nullptr);
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800142
143 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000144 * @brief Create Face using default transport and given io_service
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700145 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000146 * Usage examples:
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700147 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000148 * @code
149 * Face face1;
150 * Face face2(face1.getIoService());
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700151 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000152 * // Now the following ensures that events on both faces are processed
153 * face1.processEvents();
154 * // or face1.getIoService().run();
155 * @endcode
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700156 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000157 * or
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700158 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000159 * @code
160 * boost::asio::io_service ioService;
161 * Face face1(ioService);
162 * Face face2(ioService);
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700163 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000164 * ioService.run();
165 * @endcode
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700166 *
167 * @param ioService A reference to boost::io_service object that should control all
168 * IO operations.
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000169 * @throw ConfigFile::Error the configuration file cannot be parsed or specifies an unsupported protocol
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700170 */
171 explicit
172 Face(boost::asio::io_service& ioService);
173
174 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000175 * @brief Create Face using given transport and KeyChain
176 * @param transport the transport for lower layer communication. If nullptr,
177 * a default transport will be used.
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -0700178 * @param keyChain the KeyChain to sign commands
179 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000180 * @sa Face(shared_ptr<Transport>)
181 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000182 * @throw ConfigFile::Error @p transport is nullptr, and the configuration file cannot be
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000183 * parsed or specifies an unsupported protocol
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -0700184 * @note shared_ptr is passed by value because ownership is shared with this class
185 */
186 Face(shared_ptr<Transport> transport, KeyChain& keyChain);
187
188 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000189 * @brief Create Face using given transport and IO service
190 * @param transport the transport for lower layer communication. If nullptr,
191 * a default transport will be used.
Alexander Afanasyevbb64c172015-12-29 20:32:45 -0800192 * @param ioService the io_service that controls all IO operations
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800193 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700194 * @sa Face(boost::asio::io_service&)
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000195 * @sa Face(shared_ptr<Transport>)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800196 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000197 * @throw ConfigFile::Error @p transport is nullptr, and the configuration file cannot be
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000198 * parsed or specifies an unsupported protocol
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -0700199 * @note shared_ptr is passed by value because ownership is shared with this class
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800200 */
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -0700201 Face(shared_ptr<Transport> transport, boost::asio::io_service& ioService);
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800202
Jeff Thompson4fe45512013-08-23 14:06:38 -0700203 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000204 * @brief Create a new Face using given Transport and IO service
205 * @param transport the transport for lower layer communication. If nullptr,
206 * a default transport will be used.
Junxiao Shiedd834e2014-10-28 20:28:58 -0700207 * @param ioService the io_service that controls all IO operations
208 * @param keyChain the KeyChain to sign commands
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -0700209 *
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000210 * @sa Face(boost::asio::io_service&)
211 * @sa Face(shared_ptr<Transport>, KeyChain&)
212 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000213 * @throw ConfigFile::Error @p transport is nullptr, and the configuration file cannot be
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000214 * parsed or specifies an unsupported protocol
Junxiao Shiedd834e2014-10-28 20:28:58 -0700215 * @note shared_ptr is passed by value because ownership is shared with this class
216 */
Alexander Afanasyev8cf1c562016-06-23 16:01:55 -0700217 Face(shared_ptr<Transport> transport, boost::asio::io_service& ioService, KeyChain& keyChain);
Junxiao Shiedd834e2014-10-28 20:28:58 -0700218
Davide Pesavento7f20d6e2017-01-16 14:43:58 -0500219 virtual
Junxiao Shiedd834e2014-10-28 20:28:58 -0700220 ~Face();
221
222public: // consumer
223 /**
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800224 * @brief Express Interest
Eric Newberry83872fd2015-08-06 17:01:24 -0700225 * @param interest the Interest; a copy will be made, so that the caller is not
226 * required to maintain the argument unchanged
227 * @param afterSatisfied function to be invoked if Data is returned
228 * @param afterNacked function to be invoked if Network NACK is returned
229 * @param afterTimeout function to be invoked if neither Data nor Network NACK
230 * is returned within InterestLifetime
Junxiao Shib6e276f2017-08-14 20:10:04 +0000231 * @throw OversizedPacketError encoded Interest size exceeds MAX_NDN_PACKET_SIZE
Eric Newberry83872fd2015-08-06 17:01:24 -0700232 */
233 const PendingInterestId*
234 expressInterest(const Interest& interest,
235 const DataCallback& afterSatisfied,
236 const NackCallback& afterNacked,
237 const TimeoutCallback& afterTimeout);
238
239 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700240 * @brief Cancel previously expressed Interest
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700241 *
Jeff Thompson11095142013-10-01 16:20:28 -0700242 * @param pendingInterestId The ID returned from expressInterest.
243 */
244 void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800245 removePendingInterest(const PendingInterestId* pendingInterestId);
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700246
Jeff Thompson432c8be2013-08-09 16:16:08 -0700247 /**
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500248 * @brief Cancel all previously expressed Interests
249 */
250 void
251 removeAllPendingInterests();
252
253 /**
Alexander Afanasyev6fcdde22014-08-22 19:03:36 -0700254 * @brief Get number of pending Interests
255 */
256 size_t
257 getNPendingInterests() const;
258
Junxiao Shiedd834e2014-10-28 20:28:58 -0700259public: // producer
Alexander Afanasyev6fcdde22014-08-22 19:03:36 -0700260 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700261 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
262 * callback and register the filtered prefix with the connected NDN forwarder
263 *
264 * This version of setInterestFilter combines setInterestFilter and registerPrefix
265 * operations and is intended to be used when only one filter for the same prefix needed
266 * to be set. When multiple names sharing the same prefix should be dispatched to
267 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
268 * a series of setInterestFilter calls.
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700269 *
Alexander Afanasyev90164962014-03-06 08:29:59 +0000270 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700271 * @param onInterest A callback to be called when a matching interest is received
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700272 * @param onFailure A callback to be called when prefixRegister command fails
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400273 * @param flags (optional) RIB flags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400274 * @param signingInfo (optional) Signing parameters. When omitted, a default parameters
275 * used in the signature will be used.
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700276 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700277 * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
278 * removeRegisteredPrefix
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700279 */
280 const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000281 setInterestFilter(const InterestFilter& interestFilter,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000282 const InterestCallback& onInterest,
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700283 const RegisterPrefixFailureCallback& onFailure,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400284 const security::SigningInfo& signingInfo = security::SigningInfo(),
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700285 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700286
287 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700288 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
289 * callback and register the filtered prefix with the connected NDN forwarder
290 *
291 * This version of setInterestFilter combines setInterestFilter and registerPrefix
292 * operations and is intended to be used when only one filter for the same prefix needed
293 * to be set. When multiple names sharing the same prefix should be dispatched to
294 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
295 * a series of setInterestFilter calls.
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700296 *
Alexander Afanasyev90164962014-03-06 08:29:59 +0000297 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700298 * @param onInterest A callback to be called when a matching interest is received
299 * @param onSuccess A callback to be called when prefixRegister command succeeds
300 * @param onFailure A callback to be called when prefixRegister command fails
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400301 * @param flags (optional) RIB flags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400302 * @param signingInfo (optional) Signing parameters. When omitted, a default parameters
303 * used in the signature will be used.
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700304 *
Joao Pereira0b3cac52015-07-02 14:49:49 -0400305 * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
306 * removeRegisteredPrefix
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700307 */
308 const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000309 setInterestFilter(const InterestFilter& interestFilter,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000310 const InterestCallback& onInterest,
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700311 const RegisterPrefixSuccessCallback& onSuccess,
312 const RegisterPrefixFailureCallback& onFailure,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400313 const security::SigningInfo& signingInfo = security::SigningInfo(),
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700314 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700315
316 /**
317 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest callback
318 *
319 * @param interestFilter Interest
320 * @param onInterest A callback to be called when a matching interest is received
321 *
322 * This method modifies library's FIB only, and does not register the prefix with the
323 * forwarder. It will always succeed. To register prefix with the forwarder, use
324 * registerPrefix, or use the setInterestFilter overload taking two callbacks.
325 *
326 * @return Opaque interest filter ID which can be used with unsetInterestFilter
327 */
328 const InterestFilterId*
329 setInterestFilter(const InterestFilter& interestFilter,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000330 const InterestCallback& onInterest);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700331
Joao Pereira0b3cac52015-07-02 14:49:49 -0400332 /**
333 * @brief Register prefix with the connected NDN forwarder
334 *
335 * This method only modifies forwarder's RIB and does not associate any
336 * onInterest callbacks. Use setInterestFilter method to dispatch incoming Interests to
337 * the right callbacks.
338 *
339 * @param prefix A prefix to register with the connected NDN forwarder
340 * @param onSuccess A callback to be called when prefixRegister command succeeds
341 * @param onFailure A callback to be called when prefixRegister command fails
342 * @param signingInfo (optional) Signing parameters. When omitted, a default parameters
343 * used in the signature will be used.
Alexander Afanasyevf2a46222015-09-17 18:01:30 -0700344 * @param flags Prefix registration flags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400345 *
346 * @return The registered prefix ID which can be used with unregisterPrefix
Alexander Afanasyevf2a46222015-09-17 18:01:30 -0700347 * @see nfd::RouteFlags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400348 */
349 const RegisteredPrefixId*
350 registerPrefix(const Name& prefix,
351 const RegisterPrefixSuccessCallback& onSuccess,
352 const RegisterPrefixFailureCallback& onFailure,
353 const security::SigningInfo& signingInfo = security::SigningInfo(),
354 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
355
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700356 /**
Alexander Afanasyev1b01c312014-05-26 16:58:10 +0300357 * @brief Remove the registered prefix entry with the registeredPrefixId
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700358 *
359 * This does not affect another registered prefix with a different registeredPrefixId,
360 * even it if has the same prefix name. If there is no entry with the
361 * registeredPrefixId, do nothing.
362 *
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700363 * unsetInterestFilter will use the same credentials as original
364 * setInterestFilter/registerPrefix command
365 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700366 * @param registeredPrefixId The ID returned from registerPrefix
Jeff Thompson11095142013-10-01 16:20:28 -0700367 */
368 void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800369 unsetInterestFilter(const RegisteredPrefixId* registeredPrefixId);
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800370
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700371 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700372 * @brief Remove previously set InterestFilter from library's FIB
373 *
374 * This method always succeeds and will **NOT** send any request to the connected
375 * forwarder.
376 *
377 * @param interestFilterId The ID returned from setInterestFilter.
378 */
379 void
380 unsetInterestFilter(const InterestFilterId* interestFilterId);
381
382 /**
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400383 * @brief Unregister prefix from RIB
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700384 *
385 * unregisterPrefix will use the same credentials as original
386 * setInterestFilter/registerPrefix command
387 *
388 * If registeredPrefixId was obtained using setInterestFilter, the corresponding
389 * InterestFilter will be unset too.
390 *
Alexander Afanasyev770827c2014-05-13 17:42:55 -0700391 * @param registeredPrefixId The ID returned from registerPrefix
392 * @param onSuccess Callback to be called when operation succeeds
393 * @param onFailure Callback to be called when operation fails
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700394 */
395 void
396 unregisterPrefix(const RegisteredPrefixId* registeredPrefixId,
397 const UnregisterPrefixSuccessCallback& onSuccess,
398 const UnregisterPrefixFailureCallback& onFailure);
399
Junxiao Shib6e276f2017-08-14 20:10:04 +0000400 /**
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800401 * @brief Publish data packet
Junxiao Shib6e276f2017-08-14 20:10:04 +0000402 * @param data the Data; a copy will be made, so that the caller is not required to
403 * maintain the argument unchanged
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800404 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000405 * This method can be called to satisfy incoming Interests, or to add Data packet into the cache
406 * of the local NDN forwarder if forwarder is configured to accept unsolicited Data.
Alexander Afanasyev6a05b4b2014-07-18 17:23:00 -0700407 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000408 * @throw OversizedPacketError encoded Data size exceeds MAX_NDN_PACKET_SIZE
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800409 */
410 void
Junxiao Shib6e276f2017-08-14 20:10:04 +0000411 put(Data data);
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700412
Eric Newberry83872fd2015-08-06 17:01:24 -0700413 /**
Junxiao Shib6e276f2017-08-14 20:10:04 +0000414 * @brief Send a network NACK
Eric Newberry83872fd2015-08-06 17:01:24 -0700415 * @param nack the Nack; a copy will be made, so that the caller is not required to
416 * maintain the argument unchanged
Junxiao Shib6e276f2017-08-14 20:10:04 +0000417 * @throw OversizedPacketError encoded Nack size exceeds MAX_NDN_PACKET_SIZE
Eric Newberry83872fd2015-08-06 17:01:24 -0700418 */
419 void
Junxiao Shib6e276f2017-08-14 20:10:04 +0000420 put(lp::Nack nack);
Eric Newberry83872fd2015-08-06 17:01:24 -0700421
Junxiao Shiedd834e2014-10-28 20:28:58 -0700422public: // IO routine
Jeff Thompson86507bc2013-08-23 20:51:38 -0700423 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700424 * @brief Process any data to receive or call timeout callbacks.
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800425 *
426 * This call will block forever (default timeout == 0) to process IO on the face.
427 * To exit, one expected to call face.shutdown() from one of the callback methods.
428 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700429 * If positive timeout is specified, then processEvents will exit after this timeout, if
430 * not stopped earlier with face.shutdown() or when all active events finish. The call
431 * can be called repeatedly, if desired.
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800432 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700433 * If negative timeout is specified, then processEvents will not block and process only
434 * pending events.
Alexander Afanasyevf75a0aa2014-01-09 14:29:22 -0800435 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700436 * @param timeout maximum time to block the thread
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700437 * @param keepThread Keep thread in a blocked state (in event processing), even when
438 * there are no outstanding events (e.g., no Interest/Data is expected)
439 *
Junxiao Shib6e276f2017-08-14 20:10:04 +0000440 * @note This may throw an exception for reading data or in the callback for processing
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700441 * the data. If you call this from an main event loop, you may want to catch and
442 * log/disregard all exceptions.
Junxiao Shib6e276f2017-08-14 20:10:04 +0000443 *
444 * @throw OversizedPacketError encoded packet size exceeds MAX_NDN_PACKET_SIZE
Jeff Thompson432c8be2013-08-09 16:16:08 -0700445 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700446 void
Junxiao Shi2ed9e072017-08-13 16:45:48 +0000447 processEvents(time::milliseconds timeout = time::milliseconds::zero(),
Junxiao Shic828dfc2016-09-15 13:26:22 +0000448 bool keepThread = false)
449 {
450 this->doProcessEvents(timeout, keepThread);
451 }
Jeff Thompson432c8be2013-08-09 16:16:08 -0700452
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700453 /**
454 * @brief Shutdown face operations
455 *
456 * This method cancels all pending operations and closes connection to NDN Forwarder.
457 *
458 * Note that this method does not stop IO service and if the same IO service is shared
459 * between multiple Faces or with other IO objects (e.g., Scheduler).
460 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700461 void
Jeff Thompson0050abe2013-09-17 12:50:25 -0700462 shutdown();
Yingdi Yu0d920812014-01-30 14:50:57 -0800463
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700464 /**
Spyridon Mastorakisbf266ab2016-11-28 18:03:05 -0800465 * @brief Return nullptr (cannot use IoService in simulations), preserved for API compatibility
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700466 */
467 boost::asio::io_service&
468 getIoService()
469 {
Spyridon Mastorakisbf266ab2016-11-28 18:03:05 -0800470 return *static_cast<boost::asio::io_service*>(nullptr);
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700471 }
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800472
Alexander Afanasyev3a6da362015-12-29 20:31:03 -0800473NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PROTECTED:
474 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000475 * @return underlying transport
Alexander Afanasyev3a6da362015-12-29 20:31:03 -0800476 */
477 shared_ptr<Transport>
478 getTransport();
479
Junxiao Shic828dfc2016-09-15 13:26:22 +0000480protected:
481 virtual void
Junxiao Shi2ed9e072017-08-13 16:45:48 +0000482 doProcessEvents(time::milliseconds timeout, bool keepThread);
Junxiao Shic828dfc2016-09-15 13:26:22 +0000483
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800484private:
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -0700485 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000486 * @throw ConfigFile::Error on parse error and unsupported protocols
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -0700487 */
Alexander Afanasyevbb64c172015-12-29 20:32:45 -0800488 shared_ptr<Transport>
489 makeDefaultTransport();
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -0700490
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600491 /**
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000492 * @throw Face::Error on unsupported protocol
Junxiao Shi2cced062014-11-02 21:27:38 -0700493 * @note shared_ptr is passed by value because ownership is transferred to this function
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600494 */
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800495 void
Joao Pereira68c0d882015-05-19 14:27:55 -0400496 construct(shared_ptr<Transport> transport, KeyChain& keyChain);
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600497
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700498 void
Eric Newberry83872fd2015-08-06 17:01:24 -0700499 onReceiveElement(const Block& blockFromDaemon);
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800500
Alexander Afanasyev7dced462014-03-19 15:12:32 -0700501 void
502 asyncShutdown();
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700503
Jeff Thompsonb982b6d2013-07-15 18:15:45 -0700504private:
Alexander Afanasyevf39c5372014-02-17 19:42:56 -0800505 shared_ptr<Transport> m_transport;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800506
Joao Pereira68c0d882015-05-19 14:27:55 -0400507 unique_ptr<nfd::Controller> m_nfdController;
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600508
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700509 class Impl;
Junxiao Shiae0b4182016-08-08 22:53:17 +0000510 shared_ptr<Impl> m_impl;
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -0700511};
512
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800513} // namespace ndn
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -0700514
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800515#endif // NDN_FACE_HPP