bgpd: Using no bgp fast-external-failover prevents vrf intf moves

When using `no bgp fast-external-failover` and a interface moves
from one vrf into another we would not fully process the change.
Fix this code path.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-09-13 08:59:46 -04:00
parent 6efca3442f
commit c19fe3c7ab

View file

@ -287,6 +287,7 @@ static int bgp_interface_down(int command, struct zclient *zclient,
struct nbr_connected *nc; struct nbr_connected *nc;
struct listnode *node, *nnode; struct listnode *node, *nnode;
struct bgp *bgp; struct bgp *bgp;
struct peer *peer;
bgp = bgp_lookup_by_vrf_id(vrf_id); bgp = bgp_lookup_by_vrf_id(vrf_id);
if (!bgp) if (!bgp)
@ -307,11 +308,7 @@ static int bgp_interface_down(int command, struct zclient *zclient,
bgp_nbr_connected_delete(bgp, nc, 1); bgp_nbr_connected_delete(bgp, nc, 1);
/* Fast external-failover */ /* Fast external-failover */
{ if (!CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) {
struct peer *peer;
if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
return 0;
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
#if defined(HAVE_CUMULUS) #if defined(HAVE_CUMULUS)
@ -474,6 +471,7 @@ static int bgp_interface_vrf_update(int command, struct zclient *zclient,
struct nbr_connected *nc; struct nbr_connected *nc;
struct listnode *node, *nnode; struct listnode *node, *nnode;
struct bgp *bgp; struct bgp *bgp;
struct peer *peer;
ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id, ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id,
&new_vrf_id); &new_vrf_id);
@ -495,12 +493,7 @@ static int bgp_interface_vrf_update(int command, struct zclient *zclient,
bgp_nbr_connected_delete(bgp, nc, 1); bgp_nbr_connected_delete(bgp, nc, 1);
/* Fast external-failover */ /* Fast external-failover */
{ if (!CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER)) {
struct peer *peer;
if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
return 0;
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
if ((peer->ttl != 1) && (peer->gtsm_hops != 1)) if ((peer->ttl != 1) && (peer->gtsm_hops != 1))
continue; continue;