]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Handle Delete status when peers flapping for BMP
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Mon, 29 Nov 2021 15:35:54 +0000 (17:35 +0200)
committermergify-bot <noreply@mergify.com>
Mon, 6 Dec 2021 16:26:44 +0000 (16:26 +0000)
Memory leak when doing quickly: clear ip bgp * or [no] neighbor X shutdown.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
(cherry picked from commit 60563d0e62bbc61447eac0fdcf1a9a2b802e7ed6)

bgpd/bgp_bmp.c

index 1bc3fd0dbae7226f5f78cfd2735b37b52345fe25..6ce0ddb7b2c3889b89efb7c9116fe412d786e7eb 100644 (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);