OpenSDN source code
agent_route_walker.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef vnsw_agent_route_walker_hpp
6 #define vnsw_agent_route_walker_hpp
7 
8 #include <atomic>
9 
10 #include <boost/intrusive_ptr.hpp>
11 #include <boost/array.hpp>
12 
13 #include <cmn/agent_cmn.h>
14 #include <cmn/agent.h>
15 #include <sandesh/sandesh_trace.h>
16 
71 #define AGENT_DBWALK_TRACE_BUF "AgentDBwalkTrace"
73 
74 #define AGENT_DBWALK_TRACE(obj, ...) do { \
75  obj::TraceMsg(AgentDBwalkTraceBuf, __FILE__, __LINE__, ##__VA_ARGS__); \
76 } while (false)
77 
78 class AgentRouteWalker;
82 typedef boost::intrusive_ptr<AgentRouteWalker> AgentRouteWalkerPtr;
83 
85  typedef boost::array<DBTable::DBTableWalkRef, Agent::ROUTE_TABLE_MAX> RouteWalkRef;
86  typedef std::map<AgentRouteWalkerPtr, RouteWalkRef> AgentRouteWalkerRefMap;
87  typedef AgentRouteWalkerRefMap::iterator AgentRouteWalkerRefMapIter;
88  typedef AgentRouteWalkerRefMap::const_iterator AgentRouteWalkerRefMapConstIter;
89 
92 };
93 
95 public:
96  static const int kInvalidWalkCount = 0;
97  typedef boost::function<void()> WalkDone;
98  typedef boost::function<void(VrfEntry *)> RouteWalkDoneCb;
99  typedef std::map<const VrfEntry *, std::atomic<int> > VrfRouteWalkCountMap;
100 
101  virtual ~AgentRouteWalker();
102 
103  void StartVrfWalk();
104  //Route table walk for specified VRF
105  void StartRouteWalk(VrfEntry *vrf);
106 
107  virtual bool VrfWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
108  virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
109 
110  virtual void VrfWalkDone(DBTableBase *part);
111  virtual void RouteWalkDone(DBTableBase *part);
112 
113  //Walk done callbacks
114  void WalkDoneCallback(WalkDone cb);
116 
117  //Helpers
118  int walk_count() const {return walk_count_;}
119  bool IsWalkCompleted() const {return (walk_count_ == kInvalidWalkCount);}
120  bool IsValidDeleteWalkRef() const {
121  return delete_walk_ref_.get() != NULL;
122  }
123  bool IsValidVrfWalkRef() const {
124  return vrf_walk_ref_.get() != NULL;
125  }
126  bool IsDeregisterDone() const { return deregister_done_;}
127  bool AreAllWalksDone() const;
128  bool AreAllRouteWalksDone(const VrfEntry *vrf) const;
131  Agent *agent() const {return agent_;}
132  uint32_t refcount() const { return refcount_; }
133 
134 protected:
136  friend void intrusive_ptr_add_ref(AgentRouteWalker *w);
137  friend void intrusive_ptr_release(AgentRouteWalker *w);
138  AgentRouteWalker(const std::string &name, Agent *agent);
140 
141 private:
142  void Callback(VrfEntry *vrf);
144  void DecrementWalkCount();
145  void DecrementRouteWalkCount(const VrfEntry *vrf);
147  void IncrementRouteWalkCount(const VrfEntry *vrf);
148  void WalkTable(AgentRouteTable *table,
149  DBTable::DBTableWalkRef &route_table_walk_ref);
151  void VrfWalkDoneInternal(DBTableBase *part);
154  RouteWalkerDBState *state,
155  AgentRouteTable *table);
158  return vrf_walk_ref_;
159  }
161  return delete_walk_ref_;
162  }
163  //Walk to release all references.
165  bool Deregister(DBTablePartBase *partition, DBEntryBase *e);
166  static void DeregisterDone(AgentRouteWalkerPtr walker);
167 
169  std::string name_;
171  std::atomic<int> walk_count_;
178  mutable std::atomic<uint32_t> refcount_;
180 };
181 
183 public:
184  typedef std::set<AgentRouteWalkerPtr> WalkRefList;
185  typedef std::set<AgentRouteWalkerPtr>::iterator WalkRefListIter;
186 
188  virtual ~AgentRouteWalkerManager();
189  Agent *agent() {return agent_;}
190 
191  void RegisterWalker(AgentRouteWalker *walker);
192  void ReleaseWalker(AgentRouteWalker *walker);
193  void Shutdown();
194  void TryUnregister();
195  //UT helper
196  uint8_t walk_ref_list_size() const {return walk_ref_list_.size();}
197 
198 protected:
199  friend class AgentRouteWalker;
200  void VrfNotify(DBTablePartBase *partition, DBEntryBase *e);
201  void RemoveWalker(AgentRouteWalkerPtr walker);
206  return vrf_listener_id_;
207  }
208 
209 private:
215 };
216 
217 #endif
boost::intrusive_ptr< AgentRouteWalker > AgentRouteWalkerPtr
SandeshTraceBufferPtr AgentDBwalkTraceBuf
void intrusive_ptr_add_ref(AgentRouteWalker *w)
void intrusive_ptr_release(AgentRouteWalker *w)
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge,...
Definition: agent_route.h:109
AgentRouteWalkerManager(Agent *agent)
DISALLOW_COPY_AND_ASSIGN(AgentRouteWalkerManager)
RouteWalkerDBState * CreateState(VrfEntry *vrf)
void RemoveWalkReferencesInVrf(RouteWalkerDBState *state, VrfEntry *vrf)
void ReleaseWalker(AgentRouteWalker *walker)
DBTable::ListenerId vrf_listener_id_
void RemoveWalker(AgentRouteWalkerPtr walker)
uint8_t walk_ref_list_size() const
void RegisterWalker(AgentRouteWalker *walker)
void ValidateAgentRouteWalker(AgentRouteWalkerPtr walker) const
DBTable::ListenerId vrf_listener_id() const
std::set< AgentRouteWalkerPtr > WalkRefList
std::set< AgentRouteWalkerPtr >::iterator WalkRefListIter
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
DISALLOW_COPY_AND_ASSIGN(AgentRouteWalker)
RouteWalkDoneCb route_walk_done_for_vrf_cb_
void RouteWalkDoneForVrfCallback(RouteWalkDoneCb cb)
virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
bool AreAllWalksDone() const
void RouteWalkDoneInternal(DBTableBase *part, AgentRouteWalkerPtr ptr)
DBTable::DBTableWalkRef AllocateRouteTableReferences(AgentRouteTable *table)
RouteWalkerDBState * LocateRouteWalkerDBState(VrfEntry *vrf)
bool IsRouteTableWalkCompleted(RouteWalkerDBState *state)
AgentRouteWalkerManager * mgr_
std::atomic< int > walk_count_
void StartRouteWalk(VrfEntry *vrf)
AgentRouteWalker(const std::string &name, Agent *agent)
bool IsValidVrfWalkRef() const
void IncrementRouteWalkCount(const VrfEntry *vrf)
DBTable::DBTableWalkRef delete_walk_ref_
bool Deregister(DBTablePartBase *partition, DBEntryBase *e)
void WalkTable(AgentRouteTable *table, DBTable::DBTableWalkRef &route_table_walk_ref)
bool IsDeregisterDone() const
boost::function< void(VrfEntry *)> RouteWalkDoneCb
virtual void VrfWalkDone(DBTableBase *part)
DBTable::DBTableWalkRef & vrf_walk_ref()
bool IsValidDeleteWalkRef() const
void OnRouteTableWalkCompleteForVrf(VrfEntry *vrf)
virtual bool VrfWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
DBTable::DBTableWalkRef & delete_walk_ref()
friend void intrusive_ptr_add_ref(AgentRouteWalker *w)
void Callback(VrfEntry *vrf)
static void DeregisterDone(AgentRouteWalkerPtr walker)
DBTable::DBTableWalkRef vrf_walk_ref_
VrfRouteWalkCountMap route_walk_count_
void DecrementRouteWalkCount(const VrfEntry *vrf)
void WalkDoneCallback(WalkDone cb)
DBTable::DBTableWalkRef LocateRouteTableWalkRef(const VrfEntry *vrf, RouteWalkerDBState *state, AgentRouteTable *table)
friend void intrusive_ptr_release(AgentRouteWalker *w)
void VrfWalkDoneInternal(DBTableBase *part)
AgentRouteWalkerManager * mgr()
boost::function< void()> WalkDone
std::map< const VrfEntry *, std::atomic< int > > VrfRouteWalkCountMap
bool AreAllRouteWalksDone(const VrfEntry *vrf) const
std::atomic< uint32_t > refcount_
virtual void RouteWalkDone(DBTableBase *part)
Agent * agent() const
uint32_t refcount() const
bool IsWalkCompleted() const
void set_mgr(AgentRouteWalkerManager *mgr)
static const int kInvalidWalkCount
Definition: agent.h:360
int ListenerId
Definition: db_table.h:62
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
Definition: db_table.h:169
Definition: vrf.h:89
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
AgentRouteWalkerRefMap::iterator AgentRouteWalkerRefMapIter
AgentRouteWalkerRefMap::const_iterator AgentRouteWalkerRefMapConstIter
std::map< AgentRouteWalkerPtr, RouteWalkRef > AgentRouteWalkerRefMap
boost::array< DBTable::DBTableWalkRef, Agent::ROUTE_TABLE_MAX > RouteWalkRef
AgentRouteWalkerRefMap walker_ref_map_