Skip to content

Commit

Permalink
Merge "Allow multiple in-network services in chain to be on 1 vRouter…
Browse files Browse the repository at this point in the history
…" into R1.10
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Nov 1, 2014
2 parents f263eb3 + 90b8ff4 commit 97fc1b9
Show file tree
Hide file tree
Showing 7 changed files with 813 additions and 182 deletions.
64 changes: 64 additions & 0 deletions src/bgp/bgp_peer_membership.cc
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,58 @@ PeerRibMembershipManager::~PeerRibMembershipManager() {
delete event_queue_;
}

int PeerRibMembershipManager::RegisterPeerRegistrationCallback(
PeerRegistrationCallback callback) {
tbb::mutex::scoped_lock lock(registration_mutex_);

size_t id = registration_bmap_.find_first();
if (id == registration_bmap_.npos) {
id = registration_callbacks_.size();
registration_callbacks_.push_back(callback);
} else {
registration_bmap_.reset(id);
if (registration_bmap_.none()) {
registration_bmap_.clear();
}
registration_callbacks_[id] = callback;
}
return id;
}

void PeerRibMembershipManager::UnregisterPeerRegistrationCallback(int id) {
tbb::mutex::scoped_lock lock(registration_mutex_);

registration_callbacks_[id] = NULL;
if ((size_t) id == registration_callbacks_.size() - 1) {
while (!registration_callbacks_.empty() &&
registration_callbacks_.back() == NULL) {
registration_callbacks_.pop_back();
}
if (registration_bmap_.size() > registration_callbacks_.size()) {
registration_bmap_.resize(registration_callbacks_.size());
}
} else {
if ((size_t) id >= registration_bmap_.size()) {
registration_bmap_.resize(id + 1);
}
registration_bmap_.set(id);
}
}

void PeerRibMembershipManager::NotifyPeerRegistration(IPeer *ipeer,
BgpTable *table, bool unregister) {
tbb::mutex::scoped_lock lock(registration_mutex_);

for (PeerRegistrationListenerList::iterator iter =
registration_callbacks_.begin();
iter != registration_callbacks_.end(); ++iter) {
if (*iter != NULL) {
PeerRegistrationCallback callback = *iter;
(callback)(ipeer, table, unregister);
}
}
}

//
// Concurrency: Runs in the context of the BGP peer membership task.
//
Expand Down Expand Up @@ -760,6 +812,16 @@ IPeerRib *PeerRibMembershipManager::IPeerRibFind(IPeer *ipeer,
return (iter != peer_rib_set_.end() ? *iter : NULL);
}

//
// Return the instance-id of the IPeer for the BgpTable.
//
int PeerRibMembershipManager::GetRegistrationId(const IPeer *ipeer,
BgpTable *table) {
assert(ipeer->IsXmppPeer());
IPeerRib *peer_rib = IPeerRibFind(const_cast<IPeer *>(ipeer), table);
return (peer_rib ? peer_rib->instance_id() : -1);
}

void PeerRibMembershipManager::FillPeerMembershipInfo(const IPeer *peer,
BgpNeighborResp &resp) {
assert(resp.get_routing_tables().size() == 0);
Expand Down Expand Up @@ -803,13 +865,15 @@ IPeerRib *PeerRibMembershipManager::IPeerRibInsert(IPeer *ipeer,
rib_peer_map_.insert(std::make_pair(table, ipeer));
peer_rib_map_.insert(std::make_pair(ipeer, peer_rib));
peer_rib_set_.insert(peer_rib);
NotifyPeerRegistration(ipeer, table, false);
return peer_rib;
}

//
// Remove the IPeerRib from the set.
//
void PeerRibMembershipManager::IPeerRibRemove(IPeerRib *peer_rib) {
NotifyPeerRegistration(peer_rib->ipeer(), peer_rib->table(), true);
peer_rib_set_.erase(peer_rib);
for (RibPeerMap::iterator it = rib_peer_map_.find(peer_rib->table());
it != rib_peer_map_.end(); it++) {
Expand Down
15 changes: 15 additions & 0 deletions src/bgp/bgp_peer_membership.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,19 @@ class PeerRibMembershipManager {
typedef std::map<BgpTable *, MembershipRequestList *>
TableMembershipRequestMap;
typedef MembershipRequest::NotifyCompletionFn NotifyCompletionFn;

typedef boost::function<void(IPeer *, BgpTable *, bool)>
PeerRegistrationCallback;
typedef std::vector<PeerRegistrationCallback> PeerRegistrationListenerList;

static const int kMembershipTaskInstanceId = 0;

PeerRibMembershipManager(BgpServer *server);
virtual ~PeerRibMembershipManager();

int RegisterPeerRegistrationCallback(PeerRegistrationCallback callback);
void UnregisterPeerRegistrationCallback(int id);

virtual void Register(IPeer *ipeer, BgpTable *table,
const RibExportPolicy &policy, int instance_id,
NotifyCompletionFn notify_completion_fn = NULL);
Expand All @@ -214,6 +222,7 @@ class PeerRibMembershipManager {
}
return false;
}
int GetRegistrationId(const IPeer *ipeer, BgpTable *table);

void Enqueue(IPeerRibEvent *event) { event_queue_->Enqueue(event); }

Expand All @@ -235,6 +244,8 @@ class PeerRibMembershipManager {
typedef std::multimap<const BgpTable *, IPeer *> RibPeerMap;
typedef std::multimap<const IPeer *, IPeerRib *> PeerRibMap;

void NotifyPeerRegistration(IPeer *ipeer, BgpTable *table, bool unregister);

void Join(BgpTable *table, MembershipRequestList *request_list);
bool RouteJoin(DBTablePartBase *root, DBEntryBase *db_entry,
BgpTable *table, MembershipRequestList *request_list);
Expand Down Expand Up @@ -281,6 +292,10 @@ class PeerRibMembershipManager {
TableMembershipRequestMap unregister_request_map_;
tbb::mutex mutex_;

boost::dynamic_bitset<> registration_bmap_;
tbb::mutex registration_mutex_;
PeerRegistrationListenerList registration_callbacks_;

DISALLOW_COPY_AND_ASSIGN(PeerRibMembershipManager);
};

Expand Down

0 comments on commit 97fc1b9

Please sign in to comment.