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] <jorge@dti2.net>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
Jorge Boncompte [DTI2] 2012-05-07 15:17:34 +00:00 committed by David Lamparter
parent 1b79fcb646
commit 8692c50652

View File

@ -2616,7 +2616,7 @@ bgp_announce_route_all (struct peer *peer)
static void static void
bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi, 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_node *rn;
struct bgp_adj_in *ain; 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 (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
for (ain = rn->adj_in; ain; ain = ain->next) 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, 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; struct bgp_node *rn;
if (safi != SAFI_MPLS_VPN) 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 else
for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn; for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
rn = bgp_route_next (rn)) rn = bgp_route_next (rn))
if ((table = rn->info) != NULL) 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 static void
bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi, 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; int ret;
struct bgp_node *rn; 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) if (ain->peer == peer)
{ {
struct bgp_info *ri = rn->info;
ret = bgp_update (peer, &rn->p, ain->attr, afi, safi, ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
NULL, NULL, 1); prd, (bgp_info_extra_get (ri))->tag, 1);
if (ret < 0) if (ret < 0)
{ {
bgp_unlock_node (rn); bgp_unlock_node (rn);
@ -2687,12 +2700,19 @@ bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
return; return;
if (safi != SAFI_MPLS_VPN) if (safi != SAFI_MPLS_VPN)
bgp_soft_reconfig_table (peer, afi, safi, NULL); bgp_soft_reconfig_table (peer, afi, safi, NULL, NULL);
else else
for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn; for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
rn = bgp_route_next (rn)) rn = bgp_route_next (rn))
if ((table = rn->info) != NULL) 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);
}
} }