rib.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
26 #ifndef NFD_RIB_RIB_HPP
27 #define NFD_RIB_RIB_HPP
28 
29 #include "rib-entry.hpp"
30 #include "rib-update-batch.hpp"
31 
32 #include <ndn-cxx/mgmt/nfd/control-parameters.hpp>
33 
34 namespace nfd {
35 namespace rib {
36 
37 using ndn::nfd::ControlParameters;
38 
39 class FibUpdater;
40 
43 class Rib : noncopyable
44 {
45 public:
46  typedef std::list<shared_ptr<RibEntry>> RibEntryList;
47  typedef std::map<Name, shared_ptr<RibEntry>> RibTable;
48  typedef RibTable::const_iterator const_iterator;
49  typedef std::map<uint64_t, std::list<shared_ptr<RibEntry>>> FaceLookupTable;
50  typedef bool (*RouteComparePredicate)(const Route&, const Route&);
51  typedef std::set<Route, RouteComparePredicate> RouteSet;
52 
53  Rib();
54 
55  ~Rib();
56 
57  void
58  setFibUpdater(FibUpdater* updater);
59 
60  const_iterator
61  find(const Name& prefix) const;
62 
63  Route*
64  find(const Name& prefix, const Route& route) const;
65 
66  const_iterator
67  begin() const;
68 
69  const_iterator
70  end() const;
71 
72  size_t
73  size() const;
74 
75  bool
76  empty() const;
77 
78  shared_ptr<RibEntry>
79  findParent(const Name& prefix) const;
80 
84  std::list<shared_ptr<RibEntry>>
85  findDescendants(const Name& prefix) const;
86 
95  std::list<shared_ptr<RibEntry>>
96  findDescendantsForNonInsertedName(const Name& prefix) const;
97 
98 public:
99  typedef function<void()> UpdateSuccessCallback;
100  typedef function<void(uint32_t code, const std::string& error)> UpdateFailureCallback;
101 
110  void
111  beginApplyUpdate(const RibUpdate& update,
112  const UpdateSuccessCallback& onSuccess,
113  const UpdateFailureCallback& onFailure);
114 
117  void
118  beginRemoveFace(uint64_t faceId);
119 
120  void
121  onFibUpdateSuccess(const RibUpdateBatch& batch,
122  const RibUpdateList& inheritedRoutes,
123  const Rib::UpdateSuccessCallback& onSuccess);
124 
125  void
127  uint32_t code, const std::string& error);
128 
129  void
130  onRouteExpiration(const Name& prefix, const Route& route);
131 
132  void
133  insert(const Name& prefix, const Route& route);
134 
135 private:
146  void
147  addUpdateToQueue(const RibUpdate& update,
148  const Rib::UpdateSuccessCallback& onSuccess,
149  const Rib::UpdateFailureCallback& onFailure);
150 
158  void
159  sendBatchFromQueue();
160 
162  // Used by RibManager unit-tests to get sent batch to simulate successful FIB update
163  function<void(RibUpdateBatch)> m_onSendBatchFromQueue;
164 
165  void
166  erase(const Name& prefix, const Route& route);
167 
168 private:
170  eraseEntry(RibTable::iterator it);
171 
172  void
173  updateRib(const RibUpdateBatch& batch);
174 
179  RouteSet
180  getAncestorRoutes(const RibEntry& entry) const;
181 
188  RouteSet
189  getAncestorRoutes(const Name& name) const;
190 
194  void
195  modifyInheritedRoutes(const RibUpdateList& inheritedRoutes);
196 
198  typedef std::pair<const Name&,const Route&> NameAndRoute;
199 
200  std::list<NameAndRoute>
201  findRoutesWithFaceId(uint64_t faceId);
202 
203 public:
204  ndn::util::signal::Signal<Rib, Name> afterInsertEntry;
205  ndn::util::signal::Signal<Rib, Name> afterEraseEntry;
206 
207 private:
208  RibTable m_rib;
209  FaceLookupTable m_faceMap;
210  FibUpdater* m_fibUpdater;
211 
212  size_t m_nItems;
213 
214  friend class FibUpdater;
215 
216 private:
217  struct UpdateQueueItem
218  {
219  RibUpdateBatch batch;
220  const Rib::UpdateSuccessCallback managerSuccessCallback;
221  const Rib::UpdateFailureCallback managerFailureCallback;
222  };
223 
225  typedef std::list<UpdateQueueItem> UpdateQueue;
226  UpdateQueue m_updateBatches;
227 
228 private:
229  bool m_isUpdateInProgress;
230 };
231 
232 inline Rib::const_iterator
233 Rib::begin() const
234 {
235  return m_rib.begin();
236 }
237 
238 inline Rib::const_iterator
239 Rib::end() const
240 {
241  return m_rib.end();
242 }
243 
244 inline size_t
245 Rib::size() const
246 {
247  return m_nItems;
248 }
249 
250 inline bool
251 Rib::empty() const
252 {
253  return m_rib.empty();
254 }
255 
256 std::ostream&
257 operator<<(std::ostream& os, const Rib& rib);
258 
259 } // namespace rib
260 } // namespace nfd
261 
262 #endif // NFD_RIB_RIB_HPP
bool(* RouteComparePredicate)(const Route &, const Route &)
Definition: rib.hpp:50
represents the RIB
Definition: rib.hpp:43
std::set< Route, RouteComparePredicate > RouteSet
Definition: rib.hpp:51
void onFibUpdateFailure(const Rib::UpdateFailureCallback &onFailure, uint32_t code, const std::string &error)
Definition: rib.cpp:438
computes FibUpdates based on updates to the RIB and sends them to NFD
Definition: fib-updater.hpp:41
size_t size() const
Definition: rib.hpp:245
std::ostream & operator<<(std::ostream &os, const FibUpdate &update)
Definition: fib-update.hpp:74
const_iterator find(const Name &prefix) const
Definition: rib.cpp:59
std::list< shared_ptr< RibEntry > > findDescendantsForNonInsertedName(const Name &prefix) const
finds namespaces under the passed prefix
Definition: rib.cpp:236
represents a collection of RibUpdates to be applied to a single FaceId
void setFibUpdater(FibUpdater *updater)
Definition: rib.cpp:53
ndn::util::signal::Signal< Rib, Name > afterEraseEntry
Definition: rib.hpp:205
const_iterator end() const
Definition: rib.hpp:239
Table::const_iterator iterator
Definition: cs-internal.hpp:41
std::list< RibUpdate > RibUpdateList
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
Definition: algorithm.hpp:32
std::list< shared_ptr< RibEntry > > RibEntryList
Definition: rib.hpp:46
function< void(uint32_t code, const std::string &error)> UpdateFailureCallback
Definition: rib.hpp:100
void insert(const Name &prefix, const Route &route)
Definition: rib.cpp:84
std::list< shared_ptr< RibEntry > > findDescendants(const Name &prefix) const
finds namespaces under the passed prefix
Definition: rib.cpp:214
represents a route for a name prefix
Definition: route.hpp:37
std::map< Name, shared_ptr< RibEntry > > RibTable
Definition: rib.hpp:47
const_iterator begin() const
Definition: rib.hpp:233
function< void()> UpdateSuccessCallback
Definition: rib.hpp:99
#define PUBLIC_WITH_TESTS_ELSE_PRIVATE
Definition: common.hpp:39
void onFibUpdateSuccess(const RibUpdateBatch &batch, const RibUpdateList &inheritedRoutes, const Rib::UpdateSuccessCallback &onSuccess)
Definition: rib.cpp:408
RibTable::const_iterator const_iterator
Definition: rib.hpp:48
represents a RIB entry, which contains one or more Routes with the same prefix
Definition: rib-entry.hpp:36
void beginRemoveFace(uint64_t faceId)
starts the FIB update process when a face has been destroyed
Definition: rib.cpp:350
bool empty() const
Definition: rib.hpp:251
std::map< uint64_t, std::list< shared_ptr< RibEntry > > > FaceLookupTable
Definition: rib.hpp:49
void onRouteExpiration(const Name &prefix, const Route &route)
Definition: rib.cpp:187
void beginApplyUpdate(const RibUpdate &update, const UpdateSuccessCallback &onSuccess, const UpdateFailureCallback &onFailure)
passes the provided RibUpdateBatch to FibUpdater to calculate and send FibUpdates.
Definition: rib.cpp:338
ndn::util::signal::Signal< Rib, Name > afterInsertEntry
Definition: rib.hpp:204
shared_ptr< RibEntry > findParent(const Name &prefix) const
Definition: rib.cpp:200