bgpd: Handle Delete status when peers flapping for BMP

Memory leak when doing quickly: clear ip bgp * or [no] neighbor X shutdown.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
This commit is contained in:
Donatas Abraitis 2021-11-29 17:35:54 +02:00
parent ece7f50d65
commit 60563d0e62

View File

@ -688,22 +688,32 @@ static int bmp_outgoing_packet(struct peer *peer, uint8_t type, bgp_size_t size,
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) {
@ -2435,7 +2445,7 @@ static int bgp_bmp_module_init(void)
{
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);