]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix crash with vpnv4 soft-reconfiguration
authorJorge Boncompte [DTI2] <jorge@dti2.net>
Mon, 7 May 2012 15:17:34 +0000 (15:17 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Mon, 21 May 2012 13:48:30 +0000 (15:48 +0200)
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>
bgpd/bgp_route.c

index d96224db43a89fd2bbb3be2c7b6c4f33fdde5eb7..589c0738a1a75e7bd43a58a6c3c5fb4dc12241ac 100644 (file)
@@ -2616,7 +2616,7 @@ bgp_announce_route_all (struct peer *peer)
 \f
 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);
+        }
 }
 \f
 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);
+        }
 }
 \f