diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2019-10-15 08:27:22 -0400 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2019-10-15 09:31:20 -0400 |
| commit | d7d158892a8aec3dba9e7f7a78f95a155cf1e34c (patch) | |
| tree | d027139eaea6508a99dc0dc2dc764576d3d802eb | |
| parent | 4e2313d8ee9946354bd8a05a0ad3504f9a783b3e (diff) | |
bgpd: Soft reconfig-in should find the right bgp_path_info
When using soft reconfiguration inbound we are storing packet
data on the side for replaying when necessary. The problem here
is that we are just grabbing the first bgp_path_info and using
that as the base. What happens when we have soft-reconfig turned
on with multiple bgp_path_info's for a path? This was introduced
in commit 8692c506520f6b268525b80890702432c95f13c4, yes back
in 2012! I would argue, though, that it was just broken
in a different way before this.
Choose the correct bgp_path_info that corresponds to the peer
we received the data from for rethinking.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
| -rw-r--r-- | bgpd/bgp_route.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index fa64d3dd62..cf3b8e8bde 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3934,12 +3934,16 @@ static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi, if (ain->peer != peer) continue; - struct bgp_path_info *pi = - bgp_node_get_bgp_path_info(rn); + struct bgp_path_info *pi; uint32_t num_labels = 0; mpls_label_t *label_pnt = NULL; struct bgp_route_evpn evpn; + for (pi = bgp_node_get_bgp_path_info(rn); pi; + pi = pi->next) + if (pi->peer == peer) + break; + if (pi && pi->extra) num_labels = pi->extra->num_labels; if (num_labels) |
