summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-12-14 21:17:15 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2009-12-14 21:17:15 +0100
commitf75747073e45c3129568c4936c2f34fa618db41e (patch)
tree7fcb456e58722fbd2e2fccac67832bd22363a373 /proto
parent63542845dfb6d2277f93f77ad9ca3ad8bbaddd09 (diff)
Implements route reload for OSPF.
Diffstat (limited to 'proto')
-rw-r--r--proto/ospf/ospf.c17
-rw-r--r--proto/ospf/ospf.h3
-rw-r--r--proto/ospf/rt.c5
3 files changed, 22 insertions, 3 deletions
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c
index 4c2f1c2a..920f84f6 100644
--- a/proto/ospf/ospf.c
+++ b/proto/ospf/ospf.c
@@ -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
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index 0930a065..0b25dedf 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -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;
diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c
index ae815b3c..29283268 100644
--- a/proto/ospf/rt.c
+++ b/proto/ospf/rt.c
@@ -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;