This commit appends or withdraw entries in ADJ-RIB-IN entries of VRF
RIB tables.

Signed-off-by: Philippe Guibert <philippe.guib...@6wind.com>
---
 bgpd/bgp_route.c | 45 +++++++++++++++++++++++++++++++++------------
 1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 789e219a1178..674dbced9a6c 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1800,10 +1800,13 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
   struct bgp_node *vrf_rn;
   struct bgp_info *iter = NULL;
   struct prefix_rd *prd;
-  char pfx_str[INET6_BUFSIZ];
+  char pfx_str[PREFIX_STRLEN];
+  afi_t afi_int;
 
   if(afi == AFI_INTERNAL_L2VPN)
-    afi = AFI_IP; /* XXX should be set to appropriate AFI : AF_INET or 
AF_INET6 */
+    afi_int = AFI_IP; /* XXX should be set to appropriate AFI : AF_INET or 
AF_INET6 */
+  else
+    afi_int = afi;
   prd = &bgp_node_table (rn)->prd;
   if (BGP_DEBUG (events, EVENTS))
     {
@@ -1815,9 +1818,9 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
       prefix2str(&rn->p, pfx_str, sizeof(pfx_str));
       if(select && select->attr && select->attr->extra)
         {
-          if (afi == AFI_IP)
+          if (afi_int == AFI_IP)
             strcpy (nh_str, inet_ntoa 
(select->attr->extra->mp_nexthop_global_in));
-          else if (afi == AFI_IP6)
+          else if (afi_int == AFI_IP6)
             inet_ntop (AF_INET6, &select->attr->extra->mp_nexthop_global, 
nh_str, BUFSIZ);
         }
       else if(select)
@@ -1835,11 +1838,11 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
   /* check if global RIB plans for destroying initial entry
    * if yes, then suppress it
    */
-  if(!vrf || !vrf->rib[afi] || !select)
+  if(!vrf || !vrf->rib[afi_int] || !select)
     {
       return;
     }
-  vrf_rn = bgp_node_get (vrf->rib[afi], &rn->p);
+  vrf_rn = bgp_node_get (vrf->rib[afi_int], &rn->p);
   if(!vrf_rn)
     {
       return;
@@ -1852,6 +1855,15 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
         {
           if(iter->peer->remote_id.s_addr == select->peer->remote_id.s_addr)
             {
+              if (CHECK_FLAG (iter->peer->af_flags[afi][safi], 
PEER_FLAG_SOFT_RECONFIG)
+                  && iter->peer != iter->peer->bgp->peer_self)
+                if (!bgp_adj_in_unset (vrf_rn, iter->peer))
+                  {
+                    prefix2str(&vrf_rn->p, pfx_str, sizeof(pfx_str));
+                    if (BGP_DEBUG (update, UPDATE_IN))
+                      zlog (iter->peer->log, LOG_DEBUG, "%s withdrawing route 
%s "
+                            "not in adj-in", iter->peer->host, pfx_str);
+                  }
               bgp_info_delete(vrf_rn, iter);
               prefix2str(&vrf_rn->p, pfx_str, sizeof(pfx_str));
               if (BGP_DEBUG (events, EVENTS))
@@ -1859,9 +1871,9 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
                   char nh_str[BUFSIZ] = "<?>";
                   if(iter->attr && iter->attr->extra)
                     {
-                      if (afi == AFI_IP)
+                      if (afi_int == AFI_IP)
                         strcpy (nh_str, inet_ntoa 
(iter->attr->extra->mp_nexthop_global_in));
-                      else if (afi == AFI_IP6)
+                      else if (afi_int == AFI_IP6)
                         inet_ntop (AF_INET6, 
&iter->attr->extra->mp_nexthop_global, nh_str, BUFSIZ);
                     }
                   else
@@ -1872,7 +1884,7 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
                   zlog_debug ("%s: processing entry (for removal) from %s [ nh 
%s]", 
                               pfx_str, iter->peer->host, nh_str);
                 }
-              bgp_process (iter->peer->bgp, vrf_rn, afi, SAFI_UNICAST);
+              bgp_process (iter->peer->bgp, vrf_rn, afi_int, SAFI_UNICAST);
               break;
             }
         }
@@ -1927,9 +1939,9 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
           prefix2str(&rn->p, pfx_str, sizeof(pfx_str));
           if(iter->attr && iter->attr->extra)
             {
-              if (afi == AFI_IP)
+              if (afi_int == AFI_IP)
                 strcpy (nh_str, inet_ntoa 
(iter->attr->extra->mp_nexthop_global_in));
-              else if (afi == AFI_IP6)
+              else if (afi_int == AFI_IP6)
                 inet_ntop (AF_INET6, &iter->attr->extra->mp_nexthop_global, 
nh_str, BUFSIZ);
             }
           else
@@ -1942,7 +1954,16 @@ bgp_vrf_process_one (struct bgp_vrf *vrf, afi_t afi, 
safi_t safi, struct bgp_nod
                       iter->peer->host, nh_str);
 
         }
-      bgp_process (iter->peer->bgp, vrf_rn, afi, SAFI_UNICAST);
+      /* When peer's soft reconfiguration enabled.  Record input packet in
+         Adj-RIBs-In.  */
+      if( ( action == ROUTE_INFO_TO_UPDATE) || (action == ROUTE_INFO_TO_ADD ))
+        {
+          /* soft_reconfig is set to 0 so, it should work XXX */
+          if ( CHECK_FLAG (iter->peer->af_flags[afi][safi], 
PEER_FLAG_SOFT_RECONFIG)
+               && iter->peer != iter->peer->bgp->peer_self)
+            bgp_adj_in_set (vrf_rn, iter->peer, iter->attr);
+        }
+      bgp_process (iter->peer->bgp, vrf_rn, afi_int, SAFI_UNICAST);
     }
 }
 
-- 
2.1.4


_______________________________________________
Quagga-dev mailing list
Quagga-dev@lists.quagga.net
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to