]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Free memory for BMP listeners when deleting BGP instance
authorDonatas Abraitis <donatas@opensourcerouting.org>
Wed, 6 Jul 2022 14:26:05 +0000 (17:26 +0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Thu, 7 Jul 2022 16:23:24 +0000 (16:23 +0000)
When using `no router bgp` we MUST free the memory for the listeners too.

Replicate with:
```
router bgp 100
bmp targets server1
bmp listener 0.0.0.0 port 65535
no router bgp
router bgp 100
bmp targets server1
bmp listener 0.0.0.0 port 65535
no router bgp
router bgp 100
bmp targets server1
bmp listener 0.0.0.0 port 65535
no router bgp
```

Before:
```
Type                          : Current#   Size       Total     Max#  MaxBytes
BMP targets                   :        0    240           0        1       248
BMP targets name              :        0      8           0        1        24
BMP listener                  :       12    152        1824       12      1824
BMP instance state            :        0     88           0        1        88
```

After:
```
Type                          : Current#   Size       Total     Max#  MaxBytes
BMP targets                   :        0    240           0        1       248
BMP targets name              :        0      8           0        1        24
BMP listener                  :        0    152           0        1       152
BMP instance state            :        0     88           0        1        88
```

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit 5cb3a15300749a0bdc0eb391c822ee2473f0caec)

bgpd/bgp_bmp.c

index 49f15a332d2ad971d77c248de85d4fdbc4e1e5af..baf5e0d5d36a5d41ff3b441340a68b235f1b39c9 100644 (file)
@@ -135,6 +135,12 @@ static int bmp_listener_cmp(const struct bmp_listener *a,
 DECLARE_SORTLIST_UNIQ(bmp_listeners, struct bmp_listener, bli,
                      bmp_listener_cmp);
 
+static void bmp_listener_put(struct bmp_listener *bl)
+{
+       bmp_listeners_del(&bl->targets->listeners, bl);
+       XFREE(MTYPE_BMP_LISTENER, bl);
+}
+
 static int bmp_targets_cmp(const struct bmp_targets *a,
                           const struct bmp_targets *b)
 {
@@ -1544,11 +1550,16 @@ static struct bmp_bgp *bmp_bgp_get(struct bgp *bgp)
 static void bmp_bgp_put(struct bmp_bgp *bmpbgp)
 {
        struct bmp_targets *bt;
+       struct bmp_listener *bl;
 
        bmp_bgph_del(&bmp_bgph, bmpbgp);
 
-       frr_each_safe(bmp_targets, &bmpbgp->targets, bt)
+       frr_each_safe (bmp_targets, &bmpbgp->targets, bt) {
+               frr_each_safe (bmp_listeners, &bt->listeners, bl)
+                       bmp_listener_put(bl);
+
                bmp_targets_put(bt);
+       }
 
        bmp_mirrorq_fini(&bmpbgp->mirrorq);
        XFREE(MTYPE_BMP, bmpbgp);
@@ -1678,12 +1689,6 @@ static struct bmp_listener *bmp_listener_get(struct bmp_targets *bt,
        return bl;
 }
 
-static void bmp_listener_put(struct bmp_listener *bl)
-{
-       bmp_listeners_del(&bl->targets->listeners, bl);
-       XFREE(MTYPE_BMP_LISTENER, bl);
-}
-
 static void bmp_listener_start(struct bmp_listener *bl)
 {
        int sock, ret;