22 #ifndef NDN_DETAIL_FACE_IMPL_HPP
23 #define NDN_DETAIL_FACE_IMPL_HPP
25 #include "../common.hpp"
26 #include "../face.hpp"
32 #include "../util/scheduler.hpp"
33 #include "../util/config-file.hpp"
34 #include "../util/signal.hpp"
36 #include "../transport/transport.hpp"
37 #include "../transport/unix-transport.hpp"
38 #include "../transport/tcp-transport.hpp"
40 #include "../mgmt/nfd/controller.hpp"
41 #include "../mgmt/nfd/command-options.hpp"
43 #include "../lp/packet.hpp"
44 #include "../lp/tags.hpp"
62 , m_processEventsTimeoutEvent(m_scheduler)
64 auto postOnEmptyPitOrNoRegisteredPrefixes = [
this] {
72 m_pendingInterestTable.
onEmpty.connect(postOnEmptyPitOrNoRegisteredPrefixes);
73 m_registeredPrefixTable.
onEmpty.connect(postOnEmptyPitOrNoRegisteredPrefixes);
85 auto entry = m_pendingInterestTable.
insert(make_shared<PendingInterest>(
86 interest, afterSatisfied, afterNacked, afterTimeout, ref(m_scheduler))).first;
87 (*entry)->setDeleter([
this, entry] { m_pendingInterestTable.
erase(entry); });
92 if (nextHopFaceIdTag !=
nullptr) {
97 interest->wireEncode().end()));
111 m_pendingInterestTable.
clear();
117 for (
auto entry = m_pendingInterestTable.
begin(); entry != m_pendingInterestTable.
end(); ) {
118 if ((*entry)->getInterest()->matchesData(data)) {
119 shared_ptr<PendingInterest> matchedEntry = *entry;
120 entry = m_pendingInterestTable.
erase(entry);
121 matchedEntry->invokeDataCallback(data);
132 for (
auto entry = m_pendingInterestTable.
begin(); entry != m_pendingInterestTable.
end(); ) {
133 const Interest& pendingInterest = *(*entry)->getInterest();
135 shared_ptr<PendingInterest> matchedEntry = *entry;
136 entry = m_pendingInterestTable.
erase(entry);
137 matchedEntry->invokeNackCallback(nack);
149 m_interestFilterTable.push_back(interestFilterRecord);
155 InterestFilterTable::iterator i = std::find_if(m_interestFilterTable.begin(),
156 m_interestFilterTable.end(),
158 if (i != m_interestFilterTable.end()) {
159 m_interestFilterTable.erase(i);
166 for (
const auto& filter : m_interestFilterTable) {
167 if (filter->doesMatch(interest.
getName())) {
168 filter->invokeInterestCallback(interest);
177 m_face.m_transport->send(wire);
181 const RegisteredPrefixId*
183 shared_ptr<InterestFilterRecord> filter,
193 auto prefixToRegister = make_shared<RegisteredPrefix>(prefix, filter, options);
198 [=] (
const nfd::ControlResponse& resp) { onFailure(prefixToRegister->getPrefix(), resp.getText()); },
201 return reinterpret_cast<const RegisteredPrefixId*
>(prefixToRegister.get());
208 m_registeredPrefixTable.
insert(registeredPrefix);
210 if (registeredPrefix->getFilter() !=
nullptr) {
212 m_interestFilterTable.push_back(registeredPrefix->getFilter());
215 if (onSuccess !=
nullptr) {
216 onSuccess(registeredPrefix->getPrefix());
225 auto i = std::find_if(m_registeredPrefixTable.
begin(),
226 m_registeredPrefixTable.
end(),
228 if (i != m_registeredPrefixTable.
end()) {
230 const shared_ptr<InterestFilterRecord>& filter = record.
getFilter();
232 if (filter !=
nullptr) {
234 m_interestFilterTable.remove(filter);
246 if (onFailure !=
nullptr) {
247 onFailure(
"Unrecognized PrefixId");
258 m_registeredPrefixTable.
erase(item);
260 if (onSuccess !=
nullptr) {
269 if (!m_face.m_transport->isConnected())
270 m_face.m_transport->connect(m_face.m_ioService,
271 [=] (
const Block& wire) { m_face.onReceiveElement(wire); });
273 if (wantResume && !m_face.m_transport->isReceiving()) {
274 m_face.m_transport->resume();
281 if (m_pendingInterestTable.
empty() && m_registeredPrefixTable.
empty()) {
282 m_face.m_transport->pause();
283 if (!m_ioServiceWork) {
284 m_processEventsTimeoutEvent.
cancel();
291 util::Scheduler m_scheduler;
294 PendingInterestTable m_pendingInterestTable;
295 InterestFilterTable m_interestFilterTable;
296 RegisteredPrefixTable m_registeredPrefixTable;
298 unique_ptr<boost::asio::io_service::work> m_ioServiceWork;
305 #endif // NDN_DETAIL_FACE_IMPL_HPP
size_t wireEncode(EncodingImpl< TAG > &encoder) const
append packet to encoder
iterator erase(iterator item)
const Name & getName() const
Copyright (c) 2013-2016 Regents of the University of California.
void satisfyPendingInterests(const Data &data)
function< void(const std::string &)> UnregisterPrefixFailureCallback
Callback invoked when unregisterPrefix or unsetInterestFilter command fails.
void processInterestFilters(Interest &interest)
represents parameters in a ControlCommand request or response
implementation detail of Face
Packet & add(const typename FIELD::ValueType &value)
add a FIELD with value
void asyncExpressInterest(shared_ptr< const Interest > interest, const DataCallback &afterSatisfied, const NackCallback &afterNacked, const TimeoutCallback &afterTimeout)
const Interest & getInterest() const
ControlParameters & setFlags(uint64_t flags)
std::list< shared_ptr< InterestFilterRecord > > InterestFilterTable
A container that emits onEmpty signal when it becomes empty.
const Name & getPrefix() const
Class representing a wire element of NDN-TLV packet format.
represents an Interest packet
Functor to match PendingInterestId.
void asyncRemovePendingInterest(const PendingInterestId *pendingInterestId)
const shared_ptr< InterestFilterRecord > & getFilter() const
stores information about a prefix registered in NDN forwarder
void asyncRemoveAllPendingInterests()
void asyncUnsetInterestFilter(const InterestFilterId *interestFilterId)
represents a Network Nack
provides a tag type for simple types
void onEmptyPitOrNoRegisteredPrefixes()
void finalizeUnregisterPrefix(RegisteredPrefixTable::iterator item, const UnregisterPrefixSuccessCallback &onSuccess)
contains options for ControlCommand execution
std::pair< iterator, bool > insert(const value_type &value)
Provide a communication channel with local or remote NDN forwarder.
Functor to match InterestFilterId.
void ensureConnected(bool wantResume)
function< void(const Name &, const std::string &)> RegisterPrefixFailureCallback
Callback invoked when registerPrefix or setInterestFilter command fails.
function< void(const Name &)> RegisterPrefixSuccessCallback
Callback invoked when registerPrefix or setInterestFilter command succeeds.
util::Signal< ContainerWithOnEmptySignal< T > > onEmpty
Signal to be fired when container becomes empty.
Name abstraction to represent an absolute name.
represents a rib/unregister command
boost::asio::io_service & getIoService()
represents a rib/register command
Event that is automatically cancelled upon destruction.
void cancel()
cancels the event manually
void nackPendingInterests(const lp::Nack &nack)
void afterPrefixRegistered(shared_ptr< RegisteredPrefix > registeredPrefix, const RegisterPrefixSuccessCallback &onSuccess)
void asyncSend(const Block &wire)
ControlParameters & setName(const Name &name)
function< void()> UnregisterPrefixSuccessCallback
Callback invoked when unregisterPrefix or unsetInterestFilter command succeeds.
Functor to match RegisteredPrefixId.
void remove_if(Predicate p)
const nfd::CommandOptions & getCommandOptions() const
function< void(const Interest &)> TimeoutCallback
Callback invoked when expressed Interest times out.
ContainerWithOnEmptySignal< shared_ptr< RegisteredPrefix > > RegisteredPrefixTable
function< void(const Interest &, const lp::Nack &)> NackCallback
Callback invoked when Nack is sent in response to expressed Interest.
void asyncUnregisterPrefix(const RegisteredPrefixId *registeredPrefixId, const UnregisterPrefixSuccessCallback &onSuccess, const UnregisterPrefixFailureCallback &onFailure)
void asyncSetInterestFilter(shared_ptr< InterestFilterRecord > interestFilterRecord)
ContainerWithOnEmptySignal< shared_ptr< PendingInterest > > PendingInterestTable
function< void(const Interest &, const Data &)> DataCallback
Callback invoked when expressed Interest gets satisfied with a Data packet.
const RegisteredPrefixId * registerPrefix(const Name &prefix, shared_ptr< InterestFilterRecord > filter, const RegisterPrefixSuccessCallback &onSuccess, const RegisterPrefixFailureCallback &onFailure, uint64_t flags, const nfd::CommandOptions &options)