OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 <boost/intrusive_ptr.hpp>
9 #include <boost/array.hpp>
10 
11 #include <cmn/agent_cmn.h>
12 #include <cmn/agent.h>
13 #include <sandesh/sandesh_trace.h>
14 
69 #define AGENT_DBWALK_TRACE_BUF "AgentDBwalkTrace"
71 
72 #define AGENT_DBWALK_TRACE(obj, ...) do { \
73  obj::TraceMsg(AgentDBwalkTraceBuf, __FILE__, __LINE__, ##__VA_ARGS__); \
74 } while (false)
75 
76 class AgentRouteWalker;
80 typedef boost::intrusive_ptr<AgentRouteWalker> AgentRouteWalkerPtr;
81 
83  typedef boost::array<DBTable::DBTableWalkRef, Agent::ROUTE_TABLE_MAX> RouteWalkRef;
84  typedef std::map<AgentRouteWalkerPtr, RouteWalkRef> AgentRouteWalkerRefMap;
85  typedef AgentRouteWalkerRefMap::iterator AgentRouteWalkerRefMapIter;
86  typedef AgentRouteWalkerRefMap::const_iterator AgentRouteWalkerRefMapConstIter;
87 
90 };
91 
93 public:
94  static const int kInvalidWalkCount = 0;
95  typedef boost::function<void()> WalkDone;
96  typedef boost::function<void(VrfEntry *)> RouteWalkDoneCb;
97  typedef std::map<const VrfEntry *, tbb::atomic<int> > VrfRouteWalkCountMap;
98 
99  virtual ~AgentRouteWalker();
100 
101  void StartVrfWalk();
102  //Route table walk for specified VRF
103  void StartRouteWalk(VrfEntry *vrf);
104 
105  virtual bool VrfWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
106  virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e);
107 
108  virtual void VrfWalkDone(DBTableBase *part);
109  virtual void RouteWalkDone(DBTableBase *part);
110 
111  //Walk done callbacks
112  void WalkDoneCallback(WalkDone cb);
114 
115  //Helpers
116  int walk_count() const {return walk_count_;}
117  bool IsWalkCompleted() const {return (walk_count_ == kInvalidWalkCount);}
118  bool IsValidDeleteWalkRef() const {
119  return delete_walk_ref_.get() != NULL;
120  }
121  bool IsValidVrfWalkRef() const {
122  return vrf_walk_ref_.get() != NULL;
123  }
124  bool IsDeregisterDone() const { return deregister_done_;}
125  bool AreAllWalksDone() const;
126  bool AreAllRouteWalksDone(const VrfEntry *vrf) const;
129  Agent *agent() const {return agent_;}
130  uint32_t refcount() const { return refcount_; }
131 
132 protected:
134  friend void intrusive_ptr_add_ref(AgentRouteWalker *w);
135  friend void intrusive_ptr_release(AgentRouteWalker *w);
136  AgentRouteWalker(const std::string &name, Agent *agent);
138 
139 private:
140  void Callback(VrfEntry *vrf);
142  void DecrementWalkCount();
143  void DecrementRouteWalkCount(const VrfEntry *vrf);
144  void IncrementWalkCount() {walk_count_.fetch_and_increment();}
145  void IncrementRouteWalkCount(const VrfEntry *vrf);
146  void WalkTable(AgentRouteTable *table,
147  DBTable::DBTableWalkRef &route_table_walk_ref);
149  void VrfWalkDoneInternal(DBTableBase *part);
152  RouteWalkerDBState *state,
153  AgentRouteTable *table);
156  return vrf_walk_ref_;
157  }
159  return delete_walk_ref_;
160  }
161  //Walk to release all references.
163  bool Deregister(DBTablePartBase *partition, DBEntryBase *e);
164  static void DeregisterDone(AgentRouteWalkerPtr walker);
165 
167  std::string name_;
169  tbb::atomic<int> walk_count_;
176  mutable tbb::atomic<uint32_t> refcount_;
178 };
179 
181 public:
182  typedef std::set<AgentRouteWalkerPtr> WalkRefList;
183  typedef std::set<AgentRouteWalkerPtr>::iterator WalkRefListIter;
184 
186  virtual ~AgentRouteWalkerManager();
187  Agent *agent() {return agent_;}
188 
189  void RegisterWalker(AgentRouteWalker *walker);
190  void ReleaseWalker(AgentRouteWalker *walker);
191  void Shutdown();
192  void TryUnregister();
193  //UT helper
194  uint8_t walk_ref_list_size() const {return walk_ref_list_.size();}
195 
196 protected:
197  friend class AgentRouteWalker;
198  void VrfNotify(DBTablePartBase *partition, DBEntryBase *e);
199  void RemoveWalker(AgentRouteWalkerPtr walker);
204  return vrf_listener_id_;
205  }
206 
207 private:
213 };
214 
215 #endif
int intrusive_ptr_add_ref(const AsPath *cpath)
Definition: bgp_aspath.h:147
boost::array< DBTable::DBTableWalkRef, Agent::ROUTE_TABLE_MAX > RouteWalkRef
void ValidateAgentRouteWalker(AgentRouteWalkerPtr walker) const
RouteWalkerDBState * CreateState(VrfEntry *vrf)
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
Agent * agent() const
static void DeregisterDone(AgentRouteWalkerPtr walker)
void WalkDoneCallback(WalkDone cb)
Definition: vrf.h:86
void Callback(VrfEntry *vrf)
void RemoveWalker(AgentRouteWalkerPtr walker)
virtual bool VrfWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
RouteWalkDoneCb route_walk_done_for_vrf_cb_
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge, EVPN (Type2/Type5). This base class contains common code for all types of route tables.
Definition: agent_route.h:109
std::map< AgentRouteWalkerPtr, RouteWalkRef > AgentRouteWalkerRefMap
uint32_t refcount() const
int ListenerId
Definition: db_table.h:62
void set_mgr(AgentRouteWalkerManager *mgr)
void VrfWalkDoneInternal(DBTableBase *part)
void OnRouteTableWalkCompleteForVrf(VrfEntry *vrf)
AgentRouteWalkerManager * mgr_
AgentRouteWalker(const std::string &name, Agent *agent)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
std::map< const VrfEntry *, tbb::atomic< int > > VrfRouteWalkCountMap
DBTable::DBTableWalkRef delete_walk_ref_
boost::function< void(VrfEntry *)> RouteWalkDoneCb
bool IsRouteTableWalkCompleted(RouteWalkerDBState *state)
bool Deregister(DBTablePartBase *partition, DBEntryBase *e)
virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
virtual void RouteWalkDone(DBTableBase *part)
void RegisterWalker(AgentRouteWalker *walker)
void WalkTable(AgentRouteTable *table, DBTable::DBTableWalkRef &route_table_walk_ref)
Definition: agent.h:358
bool IsValidVrfWalkRef() const
SandeshTraceBufferPtr AgentDBwalkTraceBuf
DBTable::DBTableWalkRef LocateRouteTableWalkRef(const VrfEntry *vrf, RouteWalkerDBState *state, AgentRouteTable *table)
AgentRouteWalkerRefMap::const_iterator AgentRouteWalkerRefMapConstIter
DBTable::ListenerId vrf_listener_id() const
friend void intrusive_ptr_add_ref(AgentRouteWalker *w)
bool AreAllWalksDone() const
tbb::atomic< uint32_t > refcount_
void StartRouteWalk(VrfEntry *vrf)
AgentRouteWalkerManager * mgr()
AgentRouteWalkerRefMap::iterator AgentRouteWalkerRefMapIter
void RouteWalkDoneForVrfCallback(RouteWalkDoneCb cb)
bool IsWalkCompleted() const
DBTable::DBTableWalkRef vrf_walk_ref_
boost::intrusive_ptr< AgentRouteWalker > AgentRouteWalkerPtr
DBTable::DBTableWalkRef & vrf_walk_ref()
uint8_t walk_ref_list_size() const
void RemoveWalkReferencesInVrf(RouteWalkerDBState *state, VrfEntry *vrf)
static const int kInvalidWalkCount
void DecrementRouteWalkCount(const VrfEntry *vrf)
std::set< AgentRouteWalkerPtr >::iterator WalkRefListIter
tbb::atomic< int > walk_count_
void ReleaseWalker(AgentRouteWalker *walker)
int walk_count() const
DBTable::ListenerId vrf_listener_id_
void IncrementRouteWalkCount(const VrfEntry *vrf)
DISALLOW_COPY_AND_ASSIGN(AgentRouteWalkerManager)
DISALLOW_COPY_AND_ASSIGN(AgentRouteWalker)
AgentRouteWalkerManager(Agent *agent)
void intrusive_ptr_release(const AsPath *cpath)
Definition: bgp_aspath.h:155
DBTable::DBTableWalkRef & delete_walk_ref()
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
Definition: db_table.h:169
AgentRouteWalkerRefMap walker_ref_map_
bool AreAllRouteWalksDone(const VrfEntry *vrf) const
virtual void VrfWalkDone(DBTableBase *part)
friend void intrusive_ptr_release(AgentRouteWalker *w)
bool IsDeregisterDone() const
DBTable::DBTableWalkRef AllocateRouteTableReferences(AgentRouteTable *table)
VrfRouteWalkCountMap route_walk_count_
boost::function< void()> WalkDone
std::set< AgentRouteWalkerPtr > WalkRefList
RouteWalkerDBState * LocateRouteWalkerDBState(VrfEntry *vrf)
bool IsValidDeleteWalkRef() const
void RouteWalkDoneInternal(DBTableBase *part, AgentRouteWalkerPtr ptr)