]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Implements route reload for OSPF.
authorOndrej Zajicek <santiago@crfreenet.org>
Mon, 14 Dec 2009 20:17:15 +0000 (21:17 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Mon, 14 Dec 2009 20:17:15 +0000 (21:17 +0100)
proto/ospf/ospf.c
proto/ospf/ospf.h
proto/ospf/rt.c

index 4c2f1c2a20b885f408f5f0ff54fa881525149a3e..920f84f657a92fdba823f4055eb80f689bdb8152 100644 (file)
@@ -77,6 +77,7 @@
 #include "ospf.h"
 
 
+static int ospf_reload_routes(struct proto *p);
 static void ospf_rt_notify(struct proto *p, net * n, rte * new, rte * old UNUSED, ea_list * attrs);
 static void ospf_ifa_notify(struct proto *p, unsigned flags, struct ifa *a);
 static int ospf_rte_better(struct rte *new, struct rte *old);
@@ -234,9 +235,10 @@ ospf_init(struct proto_config *c)
 {
   struct proto *p = proto_new(c, sizeof(struct proto_ospf));
 
-  p->import_control = ospf_import_control;
   p->make_tmp_attrs = ospf_make_tmp_attrs;
   p->store_tmp_attrs = ospf_store_tmp_attrs;
+  p->import_control = ospf_import_control;
+  p->reload_routes = ospf_reload_routes;
   p->accept_ra_types = RA_OPTIMAL;
   p->rt_notify = ospf_rt_notify;
   p->if_notify = ospf_iface_notify;
@@ -345,6 +347,19 @@ schedule_rtcalc(struct proto_ospf *po)
   po->calcrt = 1;
 }
 
+static int
+ospf_reload_routes(struct proto *p)
+{
+  struct proto_ospf *po = (struct proto_ospf *) p;
+
+  if (po->calcrt != 2)
+    OSPF_TRACE(D_EVENTS, "Scheduling routing table calculation with route reload");
+
+  po->calcrt = 2;
+
+  return 1;
+}
+
 /**
  * area_disp - invokes origination of
  * router LSA and routing table cleanup
index 0930a0654c2f906d3d55d3b409114cb8a9fe5112..0b25dedf63016ef6c2c62f211b058ac1b15da4fb 100644 (file)
@@ -719,7 +719,8 @@ struct proto_ospf
   unsigned tick;
   struct top_graph *gr;                /* LSA graph */
   slist lsal;                  /* List of all LSA's */
-  int calcrt;                  /* Routing table calculation scheduled? */
+  int calcrt;                  /* Routing table calculation scheduled?
+                                  0=no, 1=normal, 2=forced reload */
   int cleanup;                  /* Should I cleanup after RT calculation? */
   list iface_list;             /* Interfaces we really use */
   list area_list;
index ae815b3ca57cd804052ea80ce10acd06660430c8..29283268db92b4f746a50bf5855836f51e4f7e8a 100644 (file)
@@ -1133,6 +1133,9 @@ rt_sync(struct proto_ospf *po)
   struct area_net *anet;
   int flush;
 
+  /* This is used for forced reload of routes */
+  int reload = (po->calcrt == 2);
+
   OSPF_TRACE(D_EVENTS, "Starting routing table synchronisation");
 
   DBG("Now syncing my rt table with nest's\n");
@@ -1142,7 +1145,7 @@ again1:
   {
     nf = (ort *) nftmp;
     check_sum_lsa(po, nf, ORT_NET);
-    if (memcmp(&nf->n, &nf->o, sizeof(orta)))
+    if (reload || memcmp(&nf->n, &nf->o, sizeof(orta)))
     {                          /* Some difference */
       net *ne;
       rta a0;