[packages] quagga: Fix vpnv4 soft-reconfiguration crashes
git-svn-id: svn://svn.openwrt.org/openwrt/packages@32700 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
105cdac237
commit
f0a05cbd8c
@ -0,0 +1,91 @@
|
||||
Index: quagga-0.99.21/bgpd/bgp_route.c
|
||||
===================================================================
|
||||
--- quagga-0.99.21.orig/bgpd/bgp_route.c
|
||||
+++ quagga-0.99.21/bgpd/bgp_route.c
|
||||
@@ -2616,7 +2616,7 @@ bgp_announce_route_all (struct peer *pee
|
||||
|
||||
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
|
||||
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
|
||||
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 *pe
|
||||
{
|
||||
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,
|
||||
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);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user