return 0;
}
-static int bmp_peer_established(struct peer *peer)
+static int bmp_peer_status_changed(struct peer *peer)
{
struct bmp_bgp *bmpbgp = bmp_bgp_find(peer->bgp);
+ struct bmp_bgp_peer *bbpeer, *bbdopp;
frrtrace(1, frr_bgp, bmp_peer_status_changed, peer);
if (!bmpbgp)
return 0;
+ if (peer->status == Deleted) {
+ bbpeer = bmp_bgp_peer_find(peer->qobj_node.nid);
+ if (bbpeer) {
+ XFREE(MTYPE_BMP_OPEN, bbpeer->open_rx);
+ XFREE(MTYPE_BMP_OPEN, bbpeer->open_tx);
+ bmp_peerh_del(&bmp_peerh, bbpeer);
+ XFREE(MTYPE_BMP_PEER, bbpeer);
+ }
+ return 0;
+ }
+
/* Check if this peer just went to Established */
if ((peer->ostatus != OpenConfirm) || !(peer_established(peer)))
return 0;
if (peer->doppelganger && (peer->doppelganger->status != Deleted)) {
- struct bmp_bgp_peer *bbpeer, *bbdopp;
-
bbpeer = bmp_bgp_peer_get(peer);
bbdopp = bmp_bgp_peer_find(peer->doppelganger->qobj_node.nid);
if (bbdopp) {
{
hook_register(bgp_packet_dump, bmp_mirror_packet);
hook_register(bgp_packet_send, bmp_outgoing_packet);
- hook_register(peer_status_changed, bmp_peer_established);
+ hook_register(peer_status_changed, bmp_peer_status_changed);
hook_register(peer_backward_transition, bmp_peer_backward);
hook_register(bgp_process, bmp_process);
hook_register(bgp_inst_config_write, bmp_config_write);