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) {
110 assert (std::find(walk_ref_list_.begin(), walk_ref_list_.end(), walker) !=
111 walk_ref_list_.end());
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) {
int intrusive_ptr_add_ref(const AsPath *cpath)
boost::array< DBTable::DBTableWalkRef, Agent::ROUTE_TABLE_MAX > RouteWalkRef
void ValidateAgentRouteWalker(AgentRouteWalkerPtr walker) const
RouteWalkerDBState * CreateState(VrfEntry *vrf)
void VrfNotify(DBTablePartBase *partition, DBEntryBase *e)
static void DeregisterDone(AgentRouteWalkerPtr walker)
void WalkDoneCallback(WalkDone cb)
void Callback(VrfEntry *vrf)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void RemoveWalker(AgentRouteWalkerPtr walker)
virtual bool VrfWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
RouteWalkDoneCb route_walk_done_for_vrf_cb_
DBTableBase * get_table() const
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.
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
void set_mgr(AgentRouteWalkerManager *mgr)
void VrfWalkDoneInternal(DBTableBase *part)
void DecrementWalkCount()
void OnRouteTableWalkCompleteForVrf(VrfEntry *vrf)
AgentRouteWalkerManager * mgr_
virtual ~AgentRouteWalker()
const string & GetName() const
static const uint8_t ROUTE_TABLE_START
AgentRouteWalker(const std::string &name, Agent *agent)
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
bool marked_for_deletion_
DBTable::DBTableWalkRef delete_walk_ref_
static void RemoveWalkReferencesInRoutetable(RouteWalkerDBState::AgentRouteWalkerRefMapIter &it, RouteWalkerDBState *state)
boost::function< void(VrfEntry *)> RouteWalkDoneCb
void Unregister(ListenerId listener)
void ReleaseWalker(DBTableWalkRef &walk)
bool IsRouteTableWalkCompleted(RouteWalkerDBState *state)
bool Deregister(DBTablePartBase *partition, DBEntryBase *e)
virtual bool RouteWalkNotify(DBTablePartBase *partition, DBEntryBase *e)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
void WalkAgain(DBTableWalkRef walk)
VrfEntry * vrf_entry() const
virtual void RouteWalkDone(DBTableBase *part)
void RegisterWalker(AgentRouteWalker *walker)
void WalkTable(AgentRouteTable *table, DBTable::DBTableWalkRef &route_table_walk_ref)
AgentRouteWalkerManager * agent_route_walk_manager() const
SandeshTraceBufferPtr AgentDBwalkTraceBuf
DBTable::DBTableWalkRef LocateRouteTableWalkRef(const VrfEntry *vrf, RouteWalkerDBState *state, AgentRouteTable *table)
AgentRouteWalkerRefMap::const_iterator AgentRouteWalkerRefMapConstIter
DBTable::ListenerId vrf_listener_id() const
bool AreAllWalksDone() const
tbb::atomic< uint32_t > refcount_
void StartRouteWalk(VrfEntry *vrf)
AgentRouteWalkerRefMap::iterator AgentRouteWalkerRefMapIter
void RouteWalkDoneForVrfCallback(RouteWalkDoneCb cb)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
DBTable::DBTableWalkRef vrf_walk_ref_
boost::intrusive_ptr< AgentRouteWalker > AgentRouteWalkerPtr
DBTable::DBTableWalkRef & vrf_walk_ref()
void IncrementWalkCount()
void RemoveWalkReferencesInVrf(RouteWalkerDBState *state, VrfEntry *vrf)
static const int kInvalidWalkCount
void DecrementRouteWalkCount(const VrfEntry *vrf)
virtual ~AgentRouteWalkerManager()
VrfTable * vrf_table() const
#define AGENT_DBWALK_TRACE_BUF
tbb::atomic< int > walk_count_
void ReleaseWalker(AgentRouteWalker *walker)
DBTable::ListenerId vrf_listener_id_
void IncrementRouteWalkCount(const VrfEntry *vrf)
AgentRouteWalkerManager(Agent *agent)
AgentRouteTable * GetRouteTable(uint8_t table_type) const
void intrusive_ptr_release(const AsPath *cpath)
WalkRefList walk_ref_list_
DBTable::DBTableWalkRef & delete_walk_ref()
#define AGENT_DBWALK_TRACE(obj,...)
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
AgentRouteWalkerRefMap walker_ref_map_
void ReleaseVrfWalkReference()
bool AreAllRouteWalksDone(const VrfEntry *vrf) const
virtual void VrfWalkDone(DBTableBase *part)
DBTable::DBTableWalkRef AllocateRouteTableReferences(AgentRouteTable *table)
VrfRouteWalkCountMap route_walk_count_
boost::function< void()> WalkDone
RouteWalkerDBState * LocateRouteWalkerDBState(VrfEntry *vrf)
virtual Agent::RouteTableType GetTableType() const =0
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
void RouteWalkDoneInternal(DBTableBase *part, AgentRouteWalkerPtr ptr)