7 #include <vnc_cfg_types.h>
8 #include <agent_types.h>
13 #include <sandesh/sandesh.h>
14 #include <sandesh/sandesh_types.h>
15 #include <sandesh/sandesh_trace.h>
16 #include <sandesh/common/vns_constants.h>
36 walk_ref_list_(), marked_for_deletion_(false) {
122 Agent *agent) : agent_(agent), name_(name),
123 route_walk_count_(), walk_done_cb_(), route_walk_done_for_vrf_cb_(),
124 mgr_(NULL), deregister_done_(false) {
162 assert(state != NULL);
175 std::pair<RouteWalkerDBState::AgentRouteWalkerRefMapIter, bool> ret;
176 ret = state->
walker_ref_map_.insert(std::make_pair(walker_ptr, route_walk_ref));
177 if (ret.second ==
false) {
179 "LocateRouteTableWalkRef walker add failed.",
192 this, _2, walker_ptr));
194 return it->second[table_type];
219 if (route_table_walk_ref->in_progress() ==
false) {
239 if (!table)
continue;
264 "VrfWalkNotify: Vrf deleted, no route walk.",
265 (vrf != NULL) ? vrf->
GetName() :
"Unknown",
301 uint32_t vrf_id = table->
vrf_id();
304 FindVrfFromIdIncludingDeletedVrf(vrf_id);
320 it->second.fetch_and_decrement();
339 "All Walks are done",
340 (vrf != NULL) ? vrf->
GetName() :
"Unknown",
372 "All route walks are done",
373 (vrf != NULL) ? vrf->
GetName() :
"Unknown",
447 if (walker.get()->vrf_walk_ref().get() != NULL) {
451 if (walker.get()->delete_walk_ref().get() != NULL) {
452 walker.get()->agent()->vrf_table()->ReleaseWalker(walker.get()->
457 walker.get()->mgr()->RemoveWalker(walker);
458 walker.get()->mgr()->TryUnregister();
460 walker.get()->deregister_done_ =
true;
468 if (w->
refcount_.fetch_and_decrement() == 1) {
static void RemoveWalkReferencesInRoutetable(RouteWalkerDBState::AgentRouteWalkerRefMapIter &it, RouteWalkerDBState *state)
void intrusive_ptr_add_ref(AgentRouteWalker *w)
void intrusive_ptr_release(AgentRouteWalker *w)
SandeshTraceBufferPtr AgentDBwalkTraceBuf(SandeshTraceBufferCreate(AGENT_DBWALK_TRACE_BUF, 1000))
boost::intrusive_ptr< AgentRouteWalker > AgentRouteWalkerPtr
#define AGENT_DBWALK_TRACE_BUF
#define AGENT_DBWALK_TRACE(obj,...)
Agent supports multiple route tables - Inet-unicast (IPv4/IPv6), Inet-multicast, bridge,...
virtual Agent::RouteTableType GetTableType() const =0
VrfEntry * vrf_entry() const
AgentRouteWalkerManager(Agent *agent)
RouteWalkerDBState * CreateState(VrfEntry *vrf)
WalkRefList walk_ref_list_
void RemoveWalkReferencesInVrf(RouteWalkerDBState *state, VrfEntry *vrf)
void ReleaseWalker(AgentRouteWalker *walker)
DBTable::ListenerId vrf_listener_id_
virtual ~AgentRouteWalkerManager()
void RemoveWalker(AgentRouteWalkerPtr walker)
void RegisterWalker(AgentRouteWalker *walker)
void ValidateAgentRouteWalker(AgentRouteWalkerPtr walker) const
DBTable::ListenerId vrf_listener_id() const
bool marked_for_deletion_
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
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)
tbb::atomic< uint32_t > refcount_
AgentRouteWalkerManager * mgr_
void StartRouteWalk(VrfEntry *vrf)
AgentRouteWalker(const std::string &name, Agent *agent)
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)
boost::function< void(VrfEntry *)> RouteWalkDoneCb
virtual void VrfWalkDone(DBTableBase *part)
DBTable::DBTableWalkRef & vrf_walk_ref()
virtual ~AgentRouteWalker()
void OnRouteTableWalkCompleteForVrf(VrfEntry *vrf)
virtual bool VrfWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
DBTable::DBTableWalkRef & delete_walk_ref()
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)
void ReleaseVrfWalkReference()
void DecrementWalkCount()
DBTable::DBTableWalkRef LocateRouteTableWalkRef(const VrfEntry *vrf, RouteWalkerDBState *state, AgentRouteTable *table)
void VrfWalkDoneInternal(DBTableBase *part)
boost::function< void()> WalkDone
void IncrementWalkCount()
bool AreAllRouteWalksDone(const VrfEntry *vrf) const
virtual void RouteWalkDone(DBTableBase *part)
tbb::atomic< int > walk_count_
void set_mgr(AgentRouteWalkerManager *mgr)
static const int kInvalidWalkCount
VrfTable * vrf_table() const
static const uint8_t ROUTE_TABLE_START
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
DBTableBase * get_table() const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
void Unregister(ListenerId listener)
void WalkAgain(DBTableWalkRef walk)
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
void ReleaseWalker(DBTableWalkRef &walk)
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
AgentRouteWalkerManager * agent_route_walk_manager() const
const string & GetName() const
AgentRouteTable * GetRouteTable(uint8_t table_type) const
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
AgentRouteWalkerRefMap::iterator AgentRouteWalkerRefMapIter
AgentRouteWalkerRefMap::const_iterator AgentRouteWalkerRefMapConstIter
boost::array< DBTable::DBTableWalkRef, Agent::ROUTE_TABLE_MAX > RouteWalkRef
AgentRouteWalkerRefMap walker_ref_map_