diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2009-12-14 21:17:15 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2009-12-14 21:17:15 +0100 |
commit | f75747073e45c3129568c4936c2f34fa618db41e (patch) | |
tree | 7fcb456e58722fbd2e2fccac67832bd22363a373 | |
parent | 63542845dfb6d2277f93f77ad9ca3ad8bbaddd09 (diff) |
Implements route reload for OSPF.
-rw-r--r-- | proto/ospf/ospf.c | 17 | ||||
-rw-r--r-- | proto/ospf/ospf.h | 3 | ||||
-rw-r--r-- | proto/ospf/rt.c | 5 |
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; |