]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Fix aggregated routes are withdrawn abnormally.
authorliuze03 <liuze03@baidu.com>
Wed, 7 Dec 2022 04:22:43 +0000 (12:22 +0800)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Wed, 4 Jan 2023 20:51:17 +0000 (20:51 +0000)
    The withdraw message and announcement message of a prefix are received continuously within 50ms, which may lead to abnormal aggregation route reference count.
    Steps to reproduce:
    --------------------------
    step1:
    local config aggregate route 111.0.0.0/24
    received route:111.0.0.1/32 111.0.0.02/32
    ref_count:2

    step2:
    peer withdraw 111.0.0.1/32 and network 111.0.0.1/32 in 50ms
    received route:111.0.0.1/32 111.0.0.02/32
    ref_count:1

    step3:
    peer withdraw 111.0.0.1/32
    received route:111.0.0.02/32
    ref_count:0
    aggregate route will be withdrawn abnormally

Signed-off-by: liuze03 <liuze03@baidu.com>
(cherry picked from commit 704e189e594418571463c80a3efcc2c1020adcf4)

bgpd/bgp_route.c

index 35223f5569cc733be5905ede8342406fa40c8e09..29e2768d173ead4d5caa71aa21e5ca2186d8dcdf 100644 (file)
@@ -4233,6 +4233,12 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                         * need to be imported again, so flag accordingly.
                         */
                        force_evpn_import = true;
+               } else {
+                       /* implicit withdraw, decrement aggregate and pcount
+                        * here. only if update is accepted, they'll increment
+                        * below.
+                        */
+                       bgp_aggregate_decrement(bgp, p, pi, afi, safi);
                }
 
                /* Received Logging. */
@@ -4253,11 +4259,6 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
                /* The attribute is changed. */
                bgp_path_info_set_flag(dest, pi, BGP_PATH_ATTR_CHANGED);
 
-               /* implicit withdraw, decrement aggregate and pcount here.
-                * only if update is accepted, they'll increment below.
-                */
-               bgp_aggregate_decrement(bgp, p, pi, afi, safi);
-
                /* Update bgp route dampening information.  */
                if (CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
                    && peer->sort == BGP_PEER_EBGP) {