7 #include <boost/bind.hpp>
54 assert(!reach || !uinfo_slist->empty());
57 bool duplicate =
false;
65 if (dbstate == NULL) {
89 assert(entry_db_state == dbstate);
95 assert(dynamic_cast<UpdateList *>(dbstate) == NULL);
98 if (rt_update == NULL) {
130 if (rt_update->
History()->empty() && !reach) {
154 if (uinfo_slist->empty()) {
165 assert(!uinfo_slist->empty());
167 updates->
Enqueue(db_entry, rt_update);
194 &mcurrent, &mscheduled);
196 mjoin_subset.
Reset(mcurrent);
197 mjoin_subset.
Reset(mscheduled);
198 if (mjoin_subset.
empty()) {
207 assert(!reach || !uinfo_slist->empty());
219 bool need_tail_dequeue = monitor->
MergeUpdate(db_entry, rt_update);
220 if (need_tail_dequeue) {
243 &mcurrent, &mscheduled);
245 munion.
Set(mcurrent);
246 munion.
Set(mscheduled);
248 if (mleave_subset.
empty()) {
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
const RibPeerSet & PeerSet() const
BgpExport(RibOut *ribout)
virtual bool Export(RibOut *ribout, Route *route, const RibPeerSet &peerset, UpdateInfoSList &uinfo_slist)=0
void Enqueue(DBEntryBase *db_entry, RouteUpdate *rt_update)
void MoveHistory(RouteUpdate *rt_update)
void SetUpdateInfo(UpdateInfoSList &uinfo_slist)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
void Reset(const BitSet &rhs)
void BuildIntersection(const BitSet &lhs, const BitSet &rhs)
DBState * GetDBStateAndDequeue(DBEntryBase *db_entry, UpdateCmp cmp, bool *duplicate)
bool Join(DBTablePartBase *root, const RibPeerSet &mjoin, DBEntryBase *db_entry)
bool CompareUpdateInfo(const UpdateInfoSList &uinfo_slist) const
AdvertiseSList & History()
RibUpdateMonitor * monitor()
BgpUpdateSender * sender()
void MoveHistory(RouteState *rstate)
void BuildNegativeUpdateInfo(UpdateInfoSList &uinfo_slist) const
void Set(const BitSet &rhs)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void Export(DBTablePartBase *root, DBEntryBase *db_entry)
bool GetPeerSetCurrentAndScheduled(DBEntryBase *db_entry, int queue_id, RibPeerSet *mcurrent, RibPeerSet *mscheduled)
bool MergeUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update)
void RibOutActive(int index, RibOut *ribout, int queue_id)
bool Leave(DBTablePartBase *root, const RibPeerSet &mleave, DBEntryBase *db_entry)
void TrimRedundantUpdateInfo(UpdateInfoSList &uinfo_slist) const
RibOutUpdates * updates(int idx)
bool CompareUpdateInfo(const UpdateInfoSList &uinfo_slist) const
void ClearPeerSetCurrentAndScheduled(DBEntryBase *db_entry, const RibPeerSet &mleave)
DBTableBase::ListenerId listener_id() const
static bool IsDuplicate(const RouteUpdate *rt_update, const UpdateInfoSList *uinfo_slist)