]> git.puffer.fish Git - mirror/frr.git/commitdiff
If a route-map is used on a neighbor default-originate statement we need to dynamical...
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 20 May 2015 01:04:20 +0000 (18:04 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 20 May 2015 01:04:20 +0000 (18:04 -0700)
bgpd/bgp_route.c
bgpd/bgp_updgrp.c
bgpd/bgp_updgrp.h
bgpd/bgpd.c
bgpd/bgpd.h

index 55c2f13927c58e655864c1726c093310e707187b..be35c9c1ffd54f1a077ba9757a97b912b996c204 100644 (file)
@@ -2556,7 +2556,17 @@ bgp_process_main (struct work_queue *wq, void *data)
 
   /* bestpath has changed; bump version */
   if (old_select || new_select)
-    bgp_bump_version(rn);
+    {
+      bgp_bump_version(rn);
+
+      if (!bgp->t_rmap_def_originate_eval)
+        {
+          bgp_lock (bgp);
+          THREAD_TIMER_ON(master, bgp->t_rmap_def_originate_eval,
+                          update_group_refresh_default_originate_route_map,
+                          bgp, RMAP_DEFAULT_ORIGINATE_EVAL_TIMER);
+        }
+    }
 
   if (old_select)
     bgp_info_unset_flag (rn, old_select, BGP_INFO_SELECTED);
index 667a30c6d930a0ef92dcf3e4b414060a0f6c9782..3c4e7936699a4f859c5742caa52b2cb130bb7cd6 100644 (file)
@@ -1739,7 +1739,9 @@ update_group_af_walk (struct bgp *bgp, afi_t afi, safi_t safi,
   memset (&wctx, 0, sizeof (wctx));
   wctx.cb = cb;
   wctx.context = ctx;
-  hash_walk (bgp->update_groups[afid], update_group_walkcb, &wctx);
+
+  if (bgp->update_groups[afid])
+    hash_walk (bgp->update_groups[afid], update_group_walkcb, &wctx);
 }
 
 void
@@ -1763,6 +1765,44 @@ update_group_periodic_merge (struct bgp *bgp)
                     (void *) reason);
 }
 
+static int
+update_group_default_originate_route_map_walkcb(struct update_group *updgrp,
+                                                void *arg)
+{
+  struct update_subgroup *subgrp;
+  struct peer *peer;
+  struct peer_af *paf;
+  afi_t afi;
+  safi_t safi;
+
+  UPDGRP_FOREACH_SUBGRP (updgrp, subgrp)
+    {
+      peer = SUBGRP_PEER (subgrp);
+      afi = SUBGRP_AFI (subgrp);
+      safi = SUBGRP_SAFI (subgrp);
+
+      if (peer->default_rmap[afi][safi].name)
+        {
+          subgroup_default_originate (subgrp, 0);
+        }
+    }
+
+  return UPDWALK_CONTINUE;
+}
+
+void
+update_group_refresh_default_originate_route_map (struct thread *thread)
+{
+  struct bgp *bgp;
+  char reason[] = "refresh default-originate route-map";
+
+  bgp = THREAD_ARG(thread);
+  update_group_walk (bgp, update_group_default_originate_route_map_walkcb,
+                     reason);
+  THREAD_TIMER_OFF (bgp->t_rmap_def_originate_eval);
+  bgp_unlock(bgp);
+}
+
 /*
  * peer_af_announce_route
  *
index 49fdc26e9d39c3607aabbeba6f127eb4bc7cf8da..1a04f0ad3cfc7ecb4d33043ff0bd96ca14d95e46 100644 (file)
@@ -377,6 +377,7 @@ extern void update_group_af_walk (struct bgp *bgp, afi_t afi, safi_t safi,
                                  updgrp_walkcb cb, void *ctx);
 extern void update_group_walk (struct bgp *bgp, updgrp_walkcb cb, void *ctx);
 extern void update_group_periodic_merge (struct bgp *bgp);
+extern void update_group_refresh_default_originate_route_map (struct thread *thread);
 extern void update_group_start_advtimer (struct bgp *bgp);
 
 extern void update_subgroup_inherit_info (struct update_subgroup *to,
index eb61d8b4010db7462cf217167eeb47e5745b18c2..61b2fb93c96ffff0e65cc86b4ab3841b8f8f1fc5 100644 (file)
@@ -2612,6 +2612,7 @@ bgp_get (struct bgp **bgp_val, as_t *as, const char *name)
   bgp_router_id_set(bgp, &router_id_zebra);
   *bgp_val = bgp;
 
+  bgp->t_rmap_def_originate_eval = NULL;
   bgp->t_rmap_update = NULL;
   bgp->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
 
@@ -2694,6 +2695,12 @@ bgp_delete (struct bgp *bgp)
     peer_delete(bgp->peer_self);
     bgp->peer_self = NULL;
   }
+
+  if (bgp->t_rmap_def_originate_eval)
+    {
+      BGP_TIMER_OFF(bgp->t_rmap_def_originate_eval);
+      bgp_unlock(bgp);
+    }
   
   /* Remove visibility via the master list - there may however still be
    * routes to be processed still referencing the struct bgp.
index fc8683f2bd4ffff47779f4eb891530c7eb3585c1..0cd72e0e64ce8d30c9595e3ab67a98a5dff184bc 100644 (file)
@@ -266,6 +266,10 @@ struct bgp
   u_int32_t rmap_update_timer;   /* Route map update timer */
 #define RMAP_DEFAULT_UPDATE_TIMER 5 /* disabled by default */
 
+  /* timer to re-evaluate neighbor default-originate route-maps */
+  struct thread *t_rmap_def_originate_eval;
+#define RMAP_DEFAULT_ORIGINATE_EVAL_TIMER 5
+
   /* BGP distance configuration.  */
   u_char distance_ebgp;
   u_char distance_ibgp;