11 #include <boost/foreach.hpp>
16 #include "bgp/bgp_peer_types.h"
22 #define PEER_CLOSE_MANAGER_LOG(msg) \
23 BGP_LOG_PEER(Event, peer_close_->peer(), SandeshLevel::SYS_INFO, \
24 BGP_LOG_FLAG_ALL, BGP_PEER_DIR_NA, \
25 "PeerCloseManager: State " << GetStateName(state_) << \
26 ", MembershipState: " << GetMembershipStateName(membership_state_) << \
27 ", MembershipReqPending: " << membership_req_pending_ << \
28 ", CloseAgain?: " << (close_again_ ? "Yes" : "No") << ": " << msg);
30 #define PEER_CLOSE_MANAGER_TABLE_LOG(msg) \
31 BGP_LOG_PEER_TABLE(peer_close_->peer(), SandeshLevel::SYS_INFO, \
32 BGP_LOG_FLAG_ALL, table, \
33 "PeerCloseManager: State " << GetStateName(state_) << \
34 ", MembershipState: " << GetMembershipStateName(membership_state_) << \
35 ", MembershipReqPending: " << membership_req_pending_ << \
36 ", CloseAgain?: " << (close_again_ ? "Yes" : "No") << ": " << msg);
38 #define MOVE_TO_STATE(state) \
40 assert(state_ != state); \
41 PEER_CLOSE_MANAGER_LOG("Move to state " << GetStateName(state)); \
47 boost::asio::io_context *io_service) :
48 peer_close_(peer_close), gr_timer_(NULL),
51 peer_close_->GetTaskName()),
52 peer_close_->GetTaskInstance(),
54 state_(
NONE), close_again_(false), graceful_(true), gr_elapsed_(0),
55 llgr_elapsed_(0), membership_state_(MEMBERSHIP_NONE) {
59 "Graceful Restart Timer");
64 peer_close_(peer_close), gr_timer_(NULL),
67 peer_close_->GetTaskName()),
68 peer_close_->GetTaskInstance(),
70 state_(
NONE), close_again_(false), graceful_(true), gr_elapsed_(0),
71 llgr_elapsed_(0), membership_state_(MEMBERSHIP_NONE) {
77 "Graceful Restart Timer");
128 return "EOR_RECEIVED";
130 return "MEMBERSHIP_REQUEST";
132 return "MEMBERSHIP_REQUEST_COMPLETE_CALLBACK";
134 return "TIMER_CALLBACK";
281 for (IPeerClose::Families::iterator i =
families_.begin(), next = i;
480 std::list<BgpTable *> tables;
483 if (tables.empty()) {
490 BOOST_FOREACH(
BgpTable *table, tables) {
495 "MembershipManager::Unregister");
502 "MembershipManager::UnregisterRibOut");
509 "MembershipManager::UnregisterRibIn");
606 std::map<std::string, PeerCloseRouteInfo> route_stats;
611 PeerCloseRouteInfo route_info;
621 if (!route_stats.empty())
622 close_info->set_route_stats(route_stats);
626 PeerCloseInfo peer_close_info;
628 peer_close_info.set_membership_state(
643 resp->set_peer_close_info(peer_close_info);
649 const BgpPath *old_path, uint32_t path_flags)
const {
virtual void UnregisterRibOut(IPeer *peer, BgpTable *table)
const Community * community() const
virtual bool IsRegistered(BgpTable *table) const
tbb::atomic< int > membership_req_pending_
void set_membership_state(MembershipState state)
MembershipState membership_state_
virtual bool IsCloseLongLivedGraceful() const =0
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
virtual int GetLongLivedGracefulRestartTime() const =0
std::string GetEventName(EventType eventType) const
virtual bool IsCloseGraceful() const =0
tbb::atomic< uint64_t > staled
virtual void StartRestartTimer(int time)
virtual void ReceiveEndOfRIB(Address::Family family)=0
tbb::atomic< uint64_t > llgr_staled
bool IsRegistered(const IPeer *peer, const BgpTable *table) const
#define PEER_CLOSE_MANAGER_LOG(msg)
const uint32_t GetPathId() const
void MembershipRequestCallback()
virtual void WalkRibIn(BgpTable *table)
tbb::atomic< uint64_t > deleted
virtual bool CanUseMembershipManager() const
virtual Address::Family family() const =0
uint32_t GetFlags() const
#define MOVE_TO_STATE(state)
void ProcessEORMarkerReceived(Address::Family family)
#define PEER_CLOSE_MANAGER_TABLE_LOG(msg)
void EnqueueEvent(Event *event)
PeerCloseManager(IPeerClose *peer_close, boost::asio::io_context *io_service)
uint32_t GetL3Label() const
tbb::atomic< uint64_t > refreshed
void WalkRibIn(IPeer *peer, BgpTable *table)
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
virtual void Unregister(BgpTable *table)
virtual bool AssertMembershipReqCount(bool do_assert=true)
virtual bool AssertSweepState(bool do_assert=true)
std::string GetMembershipStateName(MembershipState state) const
virtual void CloseComplete()=0
#define CHECK_CONCURRENCY(...)
virtual void Unregister(IPeer *peer, BgpTable *table)
RouteStats route_stats[Address::NUM_FAMILIES]
virtual void GracefulRestartStale()=0
void UpdateStalePathCount(int count)
void UpdateRouteStats(Address::Family family, const BgpPath *old_path, uint32_t path_flags) const
virtual void CustomClose()=0
void UnregisterRibIn(IPeer *peer, BgpTable *table)
virtual int GetGracefulRestartTime() const =0
virtual void LongLivedGracefulRestartStale()=0
uint32_t GetLabel() const
static Timer * CreateTimer(boost::asio::io_context &service, const std::string &name, int task_id=Timer::GetTimerTaskId(), int task_instance=Timer::GetTimerInstanceId(), bool delete_on_completion=false)
bool EventCallback(Event *event)
virtual BgpServer * server()=0
virtual void UnregisterRibIn(BgpTable *table)
static std::string FamilyToString(Family fmly)
boost::asio::io_context * ioservice()
virtual void MembershipRequestCallbackComplete()=0
bool RestartTimerCallback()
virtual void GracefulRestartSweep()=0
void UpdateLlgrStalePathCount(int count)
virtual bool IsRibInRegistered(BgpTable *table) const
virtual void GetRegisteredRibs(std::list< BgpTable * > *tables)
void Close(bool graceful)
const BgpAttr * GetAttr() const
virtual void GetLongLivedGracefulRestartFamilies(Families *) const =0
bool InputCommon(DBTablePartBase *root, BgpRoute *rt, BgpPath *path, const IPeer *peer, DBRequest *req, DBRequest::DBOperation oper, BgpAttrPtr attrs, uint32_t path_id, uint32_t flags, uint32_t label, uint32_t l3_label)
bool Start(int time, Handler handler, ErrorHandler error_handler=NULL)
bool IsRibInRegistered(const IPeer *peer, const BgpTable *table) const
virtual bool IsReady() const =0
void FillRouteCloseInfo(PeerCloseInfo *close_info) const
bool MembershipPathCallback(DBTablePartBase *root, BgpRoute *rt, BgpPath *path)
virtual IPeer * peer() const =0
virtual bool AssertMembershipManagerInUse(bool do_assert=true)
BgpMembershipManager * membership_mgr()
std::string GetStateName(State state) const
virtual void UnregisterRibOut(BgpTable *table)
BgpNeighborResp * FillCloseInfo(BgpNeighborResp *resp) const
virtual void GetGracefulRestartFamilies(Families *) const =0
virtual bool AssertMembershipState(bool do_assert=true)
int64_t GetElapsedTime() const
void GetRegisteredRibs(const IPeer *peer, std::list< BgpTable * > *table_list) const
virtual const char * GetTaskName() const =0
void TriggerSweepStateActions()
IPeerClose::Families families_
boost::scoped_ptr< WorkQueue< Event * > > event_queue_
tbb::atomic< uint64_t > fresh
virtual ~PeerCloseManager()
virtual bool CanUseMembershipManager() const =0
static bool DeleteTimer(Timer *Timer)