[frr] [PATCH 01/11] bgpd: BGP VRF processing handling

Philippe Guibert philippe.guibert at 6wind.com
Wed Dec 21 09:13:46 EST 2016


NLRI entries received from MP-BGP peer exchange are exported in VRF RIB
tables. This commit introduces the BGP VRF processing handler that can
be used for further processing into VRF RIB tables: best selection
algorithm, multipath.

Signed-off-by: Philippe Guibert <philippe.guibert at 6wind.com>
---
 bgpd/bgp_route.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 51 insertions(+), 5 deletions(-)

diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 66f375498870..1a9845392bb4 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -2030,10 +2030,57 @@ bgp_process_vrf_main (struct work_queue *wq, void *data)
 {
   struct bgp_process_queue *pq = data;
   struct bgp_node *rn = pq->rn;
+  struct bgp *bgp = pq->bgp;
+  afi_t afi = pq->afi;
+  safi_t safi = pq->safi;
+  struct bgp_info *new_select;
+  struct bgp_info *old_select;
+  struct bgp_info_pair old_and_new;
 
-  if (rn)
-    UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
+  /* Best path selection. */
+  bgp_best_selection (bgp, rn, &bgp->maxpaths[afi][safi], &old_and_new);
+  old_select = old_and_new.old;
+  new_select = old_and_new.new;
+
+  /* Nothing to do. */
+  if (old_select && old_select == new_select)
+    {
+      if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
+        {
+          /* no zebra announce */
+	  UNSET_FLAG (old_select->flags, BGP_INFO_MULTIPATH_CHG);
+          UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
+          return WQ_SUCCESS;
+        }
+    }
+  if (old_select && new_select)
+    {
+      if(!CHECK_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG) &&
+         !CHECK_FLAG (new_select->flags, BGP_INFO_ATTR_CHANGED))
+        {
+          UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
+          return WQ_SUCCESS;
+        }
+    }
+
+  if (old_select)
+    {
+      bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
+    }
+  if (new_select)
+    {
+      bgp_info_set_flag (rn, new_select, BGP_INFO_SELECTED);
+      bgp_info_unset_flag (rn, new_select, BGP_INFO_ATTR_CHANGED);
+      UNSET_FLAG (new_select->flags, BGP_INFO_MULTIPATH_CHG);
+    }
+
+  /* Reap old select bgp_info, if it has been removed */
+  if (old_select && CHECK_FLAG (old_select->flags, BGP_INFO_REMOVED))
+    bgp_info_reap (rn, old_select);
+
+  UNSET_FLAG (rn->flags, BGP_NODE_PROCESS_SCHEDULED);
   return WQ_SUCCESS;
+  /* no announce */
 }
 
 static void
@@ -2088,10 +2135,9 @@ bgp_process_queue_init (void)
   bm->process_vrf_queue->spec.workfunc = &bgp_process_vrf_main;
   bm->process_vrf_queue->spec.del_item_data = &bgp_processq_del;
   bm->process_vrf_queue->spec.max_retries = 0;
-  bm->process_vrf_queue->spec.hold = 50;
+  bm->process_main_queue->spec.hold = 50;
   /* Use a higher yield value of 50ms for main queue processing */
   bm->process_vrf_queue->spec.yield = 50 * 1000L;
-
 }
 
 void
@@ -2257,7 +2303,7 @@ bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
   
   if (!CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
     bgp_info_delete (rn, ri); /* keep historical info */
-    
+
   bgp_process (peer->bgp, rn, afi, safi);
 }
 
-- 
2.1.4





More information about the dev mailing list