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 if (congestionMarkTag !=
nullptr) {
102 interest->wireEncode().end()));
104 m_face.m_transport->send(packet.
wireEncode());
116 m_pendingInterestTable.
clear();
122 for (
auto entry = m_pendingInterestTable.
begin(); entry != m_pendingInterestTable.
end(); ) {
123 if ((*entry)->getInterest()->matchesData(data)) {
124 shared_ptr<PendingInterest> matchedEntry = *entry;
125 entry = m_pendingInterestTable.
erase(entry);
126 matchedEntry->invokeDataCallback(data);
137 for (
auto entry = m_pendingInterestTable.
begin(); entry != m_pendingInterestTable.
end(); ) {
138 const Interest& pendingInterest = *(*entry)->getInterest();
140 shared_ptr<PendingInterest> matchedEntry = *entry;
141 entry = m_pendingInterestTable.
erase(entry);
142 matchedEntry->invokeNackCallback(nack);
154 m_interestFilterTable.push_back(interestFilterRecord);
160 InterestFilterTable::iterator i = std::find_if(m_interestFilterTable.begin(),
161 m_interestFilterTable.end(),
163 if (i != m_interestFilterTable.end()) {
164 m_interestFilterTable.erase(i);
171 for (
const auto& filter : m_interestFilterTable) {
172 if (filter->doesMatch(interest.
getName())) {
173 filter->invokeInterestCallback(interest);
182 m_face.m_transport->send(wire);
186 const RegisteredPrefixId*
188 shared_ptr<InterestFilterRecord> filter,
198 auto prefixToRegister = make_shared<RegisteredPrefix>(prefix, filter, options);
203 [=] (
const nfd::ControlResponse& resp) { onFailure(prefixToRegister->getPrefix(), resp.getText()); },
206 return reinterpret_cast<const RegisteredPrefixId*
>(prefixToRegister.get());
213 m_registeredPrefixTable.
insert(registeredPrefix);
215 if (registeredPrefix->getFilter() !=
nullptr) {
217 m_interestFilterTable.push_back(registeredPrefix->getFilter());
220 if (onSuccess !=
nullptr) {
221 onSuccess(registeredPrefix->getPrefix());
230 auto i = std::find_if(m_registeredPrefixTable.
begin(),
231 m_registeredPrefixTable.
end(),
233 if (i != m_registeredPrefixTable.
end()) {
235 const shared_ptr<InterestFilterRecord>& filter = record.
getFilter();
237 if (filter !=
nullptr) {
239 m_interestFilterTable.remove(filter);
251 if (onFailure !=
nullptr) {
252 onFailure(
"Unrecognized PrefixId");
263 m_registeredPrefixTable.
erase(item);
265 if (onSuccess !=
nullptr) {
274 if (!m_face.m_transport->isConnected())
275 m_face.m_transport->connect(m_face.m_ioService,
276 [=] (
const Block& wire) { m_face.onReceiveElement(wire); });
278 if (wantResume && !m_face.m_transport->isReceiving()) {
279 m_face.m_transport->resume();
286 if (m_pendingInterestTable.
empty() && m_registeredPrefixTable.
empty()) {
287 m_face.m_transport->pause();
288 if (!m_ioServiceWork) {
289 m_processEventsTimeoutEvent.
cancel();
296 util::Scheduler m_scheduler;
299 PendingInterestTable m_pendingInterestTable;
300 InterestFilterTable m_interestFilterTable;
301 RegisteredPrefixTable m_registeredPrefixTable;
303 unique_ptr<boost::asio::io_service::work> m_ioServiceWork;
310 #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.
bool matchesInterest(const Interest &other) const
Check if Interest matches other interest.
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)