7 #include <boost/bind/bind.hpp>
16 using namespace boost::placeholders;
56 assert(!reach || !uinfo_slist->empty());
59 bool duplicate =
false;
67 if (dbstate == NULL) {
91 assert(entry_db_state == dbstate);
97 assert(
dynamic_cast<UpdateList *
>(dbstate) == NULL);
100 if (rt_update == NULL) {
132 if (rt_update->
History()->empty() && !reach) {
156 if (uinfo_slist->empty()) {
167 assert(!uinfo_slist->empty());
169 updates->
Enqueue(db_entry, rt_update);
196 &mcurrent, &mscheduled);
198 mjoin_subset.
Reset(mcurrent);
199 mjoin_subset.
Reset(mscheduled);
200 if (mjoin_subset.
empty()) {
209 assert(!reach || !uinfo_slist->empty());
221 bool need_tail_dequeue = monitor->
MergeUpdate(db_entry, rt_update);
222 if (need_tail_dequeue) {
245 &mcurrent, &mscheduled);
247 munion.
Set(mcurrent);
248 munion.
Set(mscheduled);
250 if (mleave_subset.
empty()) {
static bool IsDuplicate(const RouteUpdate *rt_update, const UpdateInfoSList *uinfo_slist)
BgpExport(RibOut *ribout)
bool Join(DBTablePartBase *root, const RibPeerSet &mjoin, DBEntryBase *db_entry)
void Export(DBTablePartBase *root, DBEntryBase *db_entry)
bool Leave(DBTablePartBase *root, const RibPeerSet &mleave, DBEntryBase *db_entry)
virtual bool Export(RibOut *ribout, Route *route, const RibPeerSet &peerset, UpdateInfoSList &uinfo_slist)=0
void RibOutActive(int index, RibOut *ribout, int queue_id)
void Set(const BitSet &rhs)
void Reset(const BitSet &rhs)
void BuildIntersection(const BitSet &lhs, const BitSet &rhs)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
void Enqueue(DBEntryBase *db_entry, RouteUpdate *rt_update)
RibUpdateMonitor * monitor()
RibOutUpdates * updates(int idx)
const RibPeerSet & PeerSet() const
BgpUpdateSender * sender()
DBTableBase::ListenerId listener_id() const
bool GetPeerSetCurrentAndScheduled(DBEntryBase *db_entry, int queue_id, RibPeerSet *mcurrent, RibPeerSet *mscheduled)
DBState * GetDBStateAndDequeue(DBEntryBase *db_entry, UpdateCmp cmp, bool *duplicate)
bool MergeUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update)
void ClearPeerSetCurrentAndScheduled(DBEntryBase *db_entry, const RibPeerSet &mleave)
bool CompareUpdateInfo(const UpdateInfoSList &uinfo_slist) const
void MoveHistory(RouteUpdate *rt_update)
bool CompareUpdateInfo(const UpdateInfoSList &uinfo_slist) const
void BuildNegativeUpdateInfo(UpdateInfoSList &uinfo_slist) const
AdvertiseSList & History()
void MoveHistory(RouteState *rstate)
void TrimRedundantUpdateInfo(UpdateInfoSList &uinfo_slist) const
void SetUpdateInfo(UpdateInfoSList &uinfo_slist)