From 8692c506520f6b268525b80890702432c95f13c4 Mon Sep 17 00:00:00 2001 From: "Jorge Boncompte [DTI2]" Date: Mon, 7 May 2012 15:17:34 +0000 Subject: bgpd: fix crash with vpnv4 soft-reconfiguration bgp_afi_node_get() expects a non-NULL prd for a SAFI_MPLS_VPN prefix. * bgp_route.c: pass down the struct prefix_rd from bgp_soft_reconfig_in() and bgp_soft_reconfig_rsclient(). Signed-off-by: Jorge Boncompte [DTI2] Signed-off-by: David Lamparter --- bgpd/bgp_route.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index d96224db..589c0738 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2616,7 +2616,7 @@ bgp_announce_route_all (struct peer *peer) static void bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi, - safi_t safi, struct bgp_table *table) + safi_t safi, struct bgp_table *table, struct prefix_rd *prd) { struct bgp_node *rn; struct bgp_adj_in *ain; @@ -2627,8 +2627,11 @@ bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi, for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn)) for (ain = rn->adj_in; ain; ain = ain->next) { + struct bgp_info *ri = rn->info; + bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer, - &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL); + &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd, + (bgp_info_extra_get (ri))->tag); } } @@ -2639,18 +2642,25 @@ bgp_soft_reconfig_rsclient (struct peer *rsclient, afi_t afi, safi_t safi) struct bgp_node *rn; if (safi != SAFI_MPLS_VPN) - bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL); + bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL, NULL); else for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn)) if ((table = rn->info) != NULL) - bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table); + { + struct prefix_rd prd; + prd.family = AF_UNSPEC; + prd.prefixlen = 64; + memcpy(&prd.val, rn->p.u.val, 8); + + bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table, &prd); + } } static void bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi, - struct bgp_table *table) + struct bgp_table *table, struct prefix_rd *prd) { int ret; struct bgp_node *rn; @@ -2664,9 +2674,12 @@ bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi, { if (ain->peer == peer) { + struct bgp_info *ri = rn->info; + ret = bgp_update (peer, &rn->p, ain->attr, afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, - NULL, NULL, 1); + prd, (bgp_info_extra_get (ri))->tag, 1); + if (ret < 0) { bgp_unlock_node (rn); @@ -2687,12 +2700,19 @@ bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi) return; if (safi != SAFI_MPLS_VPN) - bgp_soft_reconfig_table (peer, afi, safi, NULL); + bgp_soft_reconfig_table (peer, afi, safi, NULL, NULL); else for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; rn = bgp_route_next (rn)) if ((table = rn->info) != NULL) - bgp_soft_reconfig_table (peer, afi, safi, table); + { + struct prefix_rd prd; + prd.family = AF_UNSPEC; + prd.prefixlen = 64; + memcpy(&prd.val, rn->p.u.val, 8); + + bgp_soft_reconfig_table (peer, afi, safi, table, &prd); + } } -- cgit v1.2.1