[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