summaryrefslogtreecommitdiffstats
path: root/ospfd/ospfd.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospfd.c')
-rw-r--r--ospfd/ospfd.c2691
1 files changed, 1298 insertions, 1393 deletions
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 9af9f7f31..cee2244dd 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -30,7 +30,7 @@
#include "memory.h"
#include "stream.h"
#include "log.h"
-#include "sockunion.h" /* for inet_aton () */
+#include "sockunion.h" /* for inet_aton () */
#include "zclient.h"
#include "plist.h"
#include "sockopt.h"
@@ -68,331 +68,328 @@ extern struct zclient *zclient;
extern struct in_addr router_id_zebra;
-static void ospf_remove_vls_through_area (struct ospf *, struct ospf_area *);
-static void ospf_network_free (struct ospf *, struct ospf_network *);
-static void ospf_area_free (struct ospf_area *);
-static void ospf_network_run (struct prefix *, struct ospf_area *);
-static void ospf_network_run_interface (struct ospf *, struct interface *,
- struct prefix *, struct ospf_area *);
-static void ospf_network_run_subnet (struct ospf *, struct connected *,
- struct prefix *, struct ospf_area *);
-static int ospf_network_match_iface (const struct connected *,
- const struct prefix *);
-static void ospf_finish_final (struct ospf *);
+static void ospf_remove_vls_through_area(struct ospf *, struct ospf_area *);
+static void ospf_network_free(struct ospf *, struct ospf_network *);
+static void ospf_area_free(struct ospf_area *);
+static void ospf_network_run(struct prefix *, struct ospf_area *);
+static void ospf_network_run_interface(struct ospf *, struct interface *,
+ struct prefix *, struct ospf_area *);
+static void ospf_network_run_subnet(struct ospf *, struct connected *,
+ struct prefix *, struct ospf_area *);
+static int ospf_network_match_iface(const struct connected *,
+ const struct prefix *);
+static void ospf_finish_final(struct ospf *);
#define OSPF_EXTERNAL_LSA_ORIGINATE_DELAY 1
-void
-ospf_router_id_update (struct ospf *ospf)
+void ospf_router_id_update(struct ospf *ospf)
{
- struct in_addr router_id, router_id_old;
- struct ospf_interface *oi;
- struct interface *ifp;
- struct listnode *node;
- int type;
-
- if (!ospf->oi_running)
- {
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("Router ospf not configured -- Router-ID update postponed");
- return;
- }
-
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("Router-ID[OLD:%s]: Update", inet_ntoa (ospf->router_id));
-
- router_id_old = ospf->router_id;
-
- /* Select the router ID based on these priorities:
- 1. Statically assigned router ID is always the first choice.
- 2. If there is no statically assigned router ID, then try to stick
- with the most recent value, since changing router ID's is very
- disruptive.
- 3. Last choice: just go with whatever the zebra daemon recommends.
- */
- if (ospf->router_id_static.s_addr != 0)
- router_id = ospf->router_id_static;
- else if (ospf->router_id.s_addr != 0)
- router_id = ospf->router_id;
- else
- router_id = router_id_zebra;
-
-
- if (!IPV4_ADDR_SAME (&router_id_old, &router_id))
- {
+ struct in_addr router_id, router_id_old;
+ struct ospf_interface *oi;
+ struct interface *ifp;
+ struct listnode *node;
+ int type;
- for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
- {
- /* Some nbrs are identified by router_id, these needs
- * to be rebuilt. Possible optimization would be to do
- * oi->nbr_self->router_id = router_id for
- * !(virtual | ptop) links
- */
- ospf_nbr_self_reset (oi, router_id);
+ if (!ospf->oi_running) {
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug(
+ "Router ospf not configured -- Router-ID update postponed");
+ return;
}
- /* If AS-external-LSA is queued, then flush those LSAs. */
- if (router_id_old.s_addr == 0 && ospf->external_origin)
- {
- /* Originate each redistributed external route. */
- for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
- if (ospf->external_origin & (1 << type))
- thread_add_event(master, ospf_external_lsa_originate_timer,
- ospf, type, NULL);
- /* Originate Deafult. */
- if (ospf->external_origin & (1 << ZEBRA_ROUTE_MAX))
- thread_add_event(master, ospf_default_originate_timer, ospf, 0,
- NULL);
-
- ospf->external_origin = 0;
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("Router-ID[OLD:%s]: Update",
+ inet_ntoa(ospf->router_id));
+
+ router_id_old = ospf->router_id;
+
+ /* Select the router ID based on these priorities:
+ 1. Statically assigned router ID is always the first choice.
+ 2. If there is no statically assigned router ID, then try to stick
+ with the most recent value, since changing router ID's is very
+ disruptive.
+ 3. Last choice: just go with whatever the zebra daemon recommends.
+ */
+ if (ospf->router_id_static.s_addr != 0)
+ router_id = ospf->router_id_static;
+ else if (ospf->router_id.s_addr != 0)
+ router_id = ospf->router_id;
+ else
+ router_id = router_id_zebra;
+
+
+ if (!IPV4_ADDR_SAME(&router_id_old, &router_id)) {
+
+ for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
+ /* Some nbrs are identified by router_id, these needs
+ * to be rebuilt. Possible optimization would be to do
+ * oi->nbr_self->router_id = router_id for
+ * !(virtual | ptop) links
+ */
+ ospf_nbr_self_reset(oi, router_id);
+ }
+
+ /* If AS-external-LSA is queued, then flush those LSAs. */
+ if (router_id_old.s_addr == 0 && ospf->external_origin) {
+ /* Originate each redistributed external route. */
+ for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
+ if (ospf->external_origin & (1 << type))
+ thread_add_event(
+ master,
+ ospf_external_lsa_originate_timer,
+ ospf, type, NULL);
+ /* Originate Deafult. */
+ if (ospf->external_origin & (1 << ZEBRA_ROUTE_MAX))
+ thread_add_event(master,
+ ospf_default_originate_timer,
+ ospf, 0, NULL);
+
+ ospf->external_origin = 0;
+ }
+
+ /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF
+ * flag */
+ if (ospf->lsdb) {
+ struct route_node *rn;
+ struct ospf_lsa *lsa;
+
+ LSDB_LOOP(EXTERNAL_LSDB(ospf), rn, lsa)
+ if (IS_LSA_SELF(lsa))
+ ospf_lsa_flush_schedule(ospf, lsa);
+ }
+
+ ospf->router_id = router_id;
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("Router-ID[NEW:%s]: Update",
+ inet_ntoa(ospf->router_id));
+
+ /* Flush (inline) all external LSAs which now match the new
+ router-id,
+ need to adjust the OSPF_LSA_SELF flag, so the flush doesnt
+ hit
+ asserts in ospf_refresher_unregister_lsa(). This step is
+ needed
+ because the current quagga code does look-up for
+ self-originated LSAs
+ based on the self router-id alone but expects OSPF_LSA_SELF
+ to be
+ properly set */
+ if (ospf->lsdb) {
+ struct route_node *rn;
+ struct ospf_lsa *lsa;
+
+ LSDB_LOOP(EXTERNAL_LSDB(ospf), rn, lsa)
+ {
+ /* AdvRouter and Router ID is the same. */
+ if (IPV4_ADDR_SAME(&lsa->data->adv_router,
+ &ospf->router_id)) {
+ SET_FLAG(lsa->flags,
+ OSPF_LSA_SELF_CHECKED);
+ SET_FLAG(lsa->flags, OSPF_LSA_SELF);
+ ospf_lsa_flush_schedule(ospf, lsa);
+ }
+ }
+ }
+
+ /* Originate each redistributed external route. */
+ for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
+ thread_add_event(master,
+ ospf_external_lsa_originate_timer,
+ ospf, type, NULL);
+ thread_add_event(master, ospf_default_originate_timer, ospf, 0,
+ NULL);
+
+ /* update router-lsa's for each area */
+ ospf_router_lsa_update(ospf);
+
+ /* update ospf_interface's */
+ for (ALL_LIST_ELEMENTS_RO(om->iflist, node, ifp))
+ ospf_if_update(ospf, ifp);
}
-
- /* Flush (inline) all external LSAs based on the OSPF_LSA_SELF flag */
- if (ospf->lsdb)
- {
- struct route_node *rn;
- struct ospf_lsa *lsa;
-
- LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
- if (IS_LSA_SELF(lsa))
- ospf_lsa_flush_schedule(ospf, lsa);
- }
-
- ospf->router_id = router_id;
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("Router-ID[NEW:%s]: Update", inet_ntoa (ospf->router_id));
-
- /* Flush (inline) all external LSAs which now match the new router-id,
- need to adjust the OSPF_LSA_SELF flag, so the flush doesnt hit
- asserts in ospf_refresher_unregister_lsa(). This step is needed
- because the current quagga code does look-up for self-originated LSAs
- based on the self router-id alone but expects OSPF_LSA_SELF to be
- properly set */
- if (ospf->lsdb)
- {
- struct route_node *rn;
- struct ospf_lsa *lsa;
-
- LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
- {
- /* AdvRouter and Router ID is the same. */
- if (IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf->router_id))
- {
- SET_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED);
- SET_FLAG (lsa->flags, OSPF_LSA_SELF);
- ospf_lsa_flush_schedule(ospf, lsa);
- }
- }
- }
-
- /* Originate each redistributed external route. */
- for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
- thread_add_event(master, ospf_external_lsa_originate_timer, ospf,
- type, NULL);
- thread_add_event(master, ospf_default_originate_timer, ospf, 0, NULL);
-
- /* update router-lsa's for each area */
- ospf_router_lsa_update (ospf);
-
- /* update ospf_interface's */
- for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
- ospf_if_update (ospf, ifp);
- }
}
/* For OSPF area sort by area id. */
-static int
-ospf_area_id_cmp (struct ospf_area *a1, struct ospf_area *a2)
+static int ospf_area_id_cmp(struct ospf_area *a1, struct ospf_area *a2)
{
- if (ntohl (a1->area_id.s_addr) > ntohl (a2->area_id.s_addr))
- return 1;
- if (ntohl (a1->area_id.s_addr) < ntohl (a2->area_id.s_addr))
- return -1;
- return 0;
+ if (ntohl(a1->area_id.s_addr) > ntohl(a2->area_id.s_addr))
+ return 1;
+ if (ntohl(a1->area_id.s_addr) < ntohl(a2->area_id.s_addr))
+ return -1;
+ return 0;
}
/* Allocate new ospf structure. */
-static struct ospf *
-ospf_new (u_short instance)
+static struct ospf *ospf_new(u_short instance)
{
- int i;
+ int i;
- struct ospf *new = XCALLOC (MTYPE_OSPF_TOP, sizeof (struct ospf));
+ struct ospf *new = XCALLOC(MTYPE_OSPF_TOP, sizeof(struct ospf));
- new->instance = instance;
- new->router_id.s_addr = htonl (0);
- new->router_id_static.s_addr = htonl (0);
+ new->instance = instance;
+ new->router_id.s_addr = htonl(0);
+ new->router_id_static.s_addr = htonl(0);
- new->abr_type = OSPF_ABR_DEFAULT;
- new->oiflist = list_new ();
- new->vlinks = list_new ();
- new->areas = list_new ();
- new->areas->cmp = (int (*)(void *, void *)) ospf_area_id_cmp;
- new->networks = route_table_init ();
- new->nbr_nbma = route_table_init ();
+ new->abr_type = OSPF_ABR_DEFAULT;
+ new->oiflist = list_new();
+ new->vlinks = list_new();
+ new->areas = list_new();
+ new->areas->cmp = (int (*)(void *, void *))ospf_area_id_cmp;
+ new->networks = route_table_init();
+ new->nbr_nbma = route_table_init();
- new->lsdb = ospf_lsdb_new ();
+ new->lsdb = ospf_lsdb_new();
- new->default_originate = DEFAULT_ORIGINATE_NONE;
+ new->default_originate = DEFAULT_ORIGINATE_NONE;
- new->passive_interface_default = OSPF_IF_ACTIVE;
-
- new->new_external_route = route_table_init ();
- new->old_external_route = route_table_init ();
- new->external_lsas = route_table_init ();
-
- new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
- new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
- new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
+ new->passive_interface_default = OSPF_IF_ACTIVE;
- /* Distribute parameter init. */
- for (i = 0; i <= ZEBRA_ROUTE_MAX; i++)
- {
- new->dtag[i] = 0;
- }
- new->default_metric = -1;
- new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
-
- /* LSA timers */
- new->min_ls_interval = OSPF_MIN_LS_INTERVAL;
- new->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
-
- /* SPF timer value init. */
- new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
- new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
- new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
- new->spf_hold_multiplier = 1;
-
- /* MaxAge init. */
- new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
- new->maxage_lsa = route_table_init();
- new->t_maxage_walker = NULL;
- thread_add_timer(master, ospf_lsa_maxage_walker, new, OSPF_LSA_MAXAGE_CHECK_INTERVAL,
- &new->t_maxage_walker);
-
- /* Distance table init. */
- new->distance_table = route_table_init ();
-
- new->lsa_refresh_queue.index = 0;
- new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
- new->t_lsa_refresher = NULL;
- thread_add_timer(master, ospf_lsa_refresh_walker, new, new->lsa_refresh_interval,
- &new->t_lsa_refresher);
- new->lsa_refresher_started = monotime(NULL);
-
- if ((new->fd = ospf_sock_init()) < 0)
- {
- zlog_err("ospf_new: fatal error: ospf_sock_init was unable to open "
- "a socket");
- exit(1);
- }
- if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE+1)) == NULL)
- {
- zlog_err("ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
- OSPF_MAX_PACKET_SIZE+1);
- exit(1);
- }
- new->t_read = NULL;
- thread_add_read(master, ospf_read, new, new->fd, &new->t_read);
- new->oi_write_q = list_new ();
- new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
-
- /* Enable "log-adjacency-changes" */
+ new->new_external_route = route_table_init();
+ new->old_external_route = route_table_init();
+ new->external_lsas = route_table_init();
+
+ new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
+ new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
+ new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
+
+ /* Distribute parameter init. */
+ for (i = 0; i <= ZEBRA_ROUTE_MAX; i++) {
+ new->dtag[i] = 0;
+ }
+ new->default_metric = -1;
+ new->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
+
+ /* LSA timers */
+ new->min_ls_interval = OSPF_MIN_LS_INTERVAL;
+ new->min_ls_arrival = OSPF_MIN_LS_ARRIVAL;
+
+ /* SPF timer value init. */
+ new->spf_delay = OSPF_SPF_DELAY_DEFAULT;
+ new->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
+ new->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
+ new->spf_hold_multiplier = 1;
+
+ /* MaxAge init. */
+ new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
+ new->maxage_lsa = route_table_init();
+ new->t_maxage_walker = NULL;
+ thread_add_timer(master, ospf_lsa_maxage_walker, new,
+ OSPF_LSA_MAXAGE_CHECK_INTERVAL, &new->t_maxage_walker);
+
+ /* Distance table init. */
+ new->distance_table = route_table_init();
+
+ new->lsa_refresh_queue.index = 0;
+ new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
+ new->t_lsa_refresher = NULL;
+ thread_add_timer(master, ospf_lsa_refresh_walker, new,
+ new->lsa_refresh_interval, &new->t_lsa_refresher);
+ new->lsa_refresher_started = monotime(NULL);
+
+ if ((new->fd = ospf_sock_init()) < 0) {
+ zlog_err(
+ "ospf_new: fatal error: ospf_sock_init was unable to open "
+ "a socket");
+ exit(1);
+ }
+ if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1)) == NULL) {
+ zlog_err(
+ "ospf_new: fatal error: stream_new(%u) failed allocating ibuf",
+ OSPF_MAX_PACKET_SIZE + 1);
+ exit(1);
+ }
+ new->t_read = NULL;
+ thread_add_read(master, ospf_read, new, new->fd, &new->t_read);
+ new->oi_write_q = list_new();
+ new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
+
+/* Enable "log-adjacency-changes" */
#if DFLT_OSPF_LOG_ADJACENCY_CHANGES
- SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
+ SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
#endif
- QOBJ_REG (new, ospf);
+ QOBJ_REG(new, ospf);
- return new;
+ return new;
}
-struct ospf *
-ospf_lookup ()
+struct ospf *ospf_lookup()
{
- if (listcount (om->ospf) == 0)
- return NULL;
+ if (listcount(om->ospf) == 0)
+ return NULL;
- return listgetdata ((struct listnode *)listhead (om->ospf));
+ return listgetdata((struct listnode *)listhead(om->ospf));
}
-struct ospf *
-ospf_lookup_instance (u_short instance)
+struct ospf *ospf_lookup_instance(u_short instance)
{
- struct ospf *ospf;
- struct listnode *node, *nnode;
+ struct ospf *ospf;
+ struct listnode *node, *nnode;
- if (listcount (om->ospf) == 0)
- return NULL;
+ if (listcount(om->ospf) == 0)
+ return NULL;
- for (ALL_LIST_ELEMENTS (om->ospf, node, nnode, ospf))
- if ((ospf->instance == 0 && instance == 0)
- || (ospf->instance && instance && ospf->instance == instance))
- return ospf;
+ for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
+ if ((ospf->instance == 0 && instance == 0)
+ || (ospf->instance && instance
+ && ospf->instance == instance))
+ return ospf;
- return NULL;
+ return NULL;
}
-static int
-ospf_is_ready (struct ospf *ospf)
+static int ospf_is_ready(struct ospf *ospf)
{
- /* OSPF must be on and Router-ID must be configured. */
- if (!ospf || ospf->router_id.s_addr == 0)
- return 0;
-
- return 1;
+ /* OSPF must be on and Router-ID must be configured. */
+ if (!ospf || ospf->router_id.s_addr == 0)
+ return 0;
+
+ return 1;
}
-static void
-ospf_add (struct ospf *ospf)
+static void ospf_add(struct ospf *ospf)
{
- listnode_add (om->ospf, ospf);
+ listnode_add(om->ospf, ospf);
}
-static void
-ospf_delete (struct ospf *ospf)
+static void ospf_delete(struct ospf *ospf)
{
- listnode_delete (om->ospf, ospf);
+ listnode_delete(om->ospf, ospf);
}
-struct ospf *
-ospf_get ()
+struct ospf *ospf_get()
{
- struct ospf *ospf;
+ struct ospf *ospf;
- ospf = ospf_lookup ();
- if (ospf == NULL)
- {
- ospf = ospf_new (0);
- ospf_add (ospf);
+ ospf = ospf_lookup();
+ if (ospf == NULL) {
+ ospf = ospf_new(0);
+ ospf_add(ospf);
- if (ospf->router_id_static.s_addr == 0)
- ospf_router_id_update (ospf);
+ if (ospf->router_id_static.s_addr == 0)
+ ospf_router_id_update(ospf);
- ospf_opaque_type11_lsa_init (ospf);
- }
+ ospf_opaque_type11_lsa_init(ospf);
+ }
- return ospf;
+ return ospf;
}
-struct ospf *
-ospf_get_instance (u_short instance)
+struct ospf *ospf_get_instance(u_short instance)
{
- struct ospf *ospf;
+ struct ospf *ospf;
- ospf = ospf_lookup_instance (instance);
- if (ospf == NULL)
- {
- ospf = ospf_new (instance);
- ospf_add (ospf);
+ ospf = ospf_lookup_instance(instance);
+ if (ospf == NULL) {
+ ospf = ospf_new(instance);
+ ospf_add(ospf);
- if (ospf->router_id_static.s_addr == 0)
- ospf_router_id_update (ospf);
+ if (ospf->router_id_static.s_addr == 0)
+ ospf_router_id_update(ospf);
- ospf_opaque_type11_lsa_init (ospf);
- }
+ ospf_opaque_type11_lsa_init(ospf);
+ }
- return ospf;
+ return ospf;
}
/* Handle the second half of deferred shutdown. This is called either
@@ -403,633 +400,592 @@ ospf_get_instance (u_short instance)
* to complete shutdown of this ospf instance. Possibly exit if the
* whole process is being shutdown and this was the last OSPF instance.
*/
-static void
-ospf_deferred_shutdown_finish (struct ospf *ospf)
-{
- ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
- OSPF_TIMER_OFF (ospf->t_deferred_shutdown);
-
- ospf_finish_final (ospf);
-
- /* *ospf is now invalid */
-
- /* ospfd being shut-down? If so, was this the last ospf instance? */
- if (CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN)
- && (listcount (om->ospf) == 0))
- {
- exit (0);
- }
+static void ospf_deferred_shutdown_finish(struct ospf *ospf)
+{
+ ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
+ OSPF_TIMER_OFF(ospf->t_deferred_shutdown);
+
+ ospf_finish_final(ospf);
+
+ /* *ospf is now invalid */
- return;
+ /* ospfd being shut-down? If so, was this the last ospf instance? */
+ if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN)
+ && (listcount(om->ospf) == 0)) {
+ exit(0);
+ }
+
+ return;
}
/* Timer thread for G-R */
-static int
-ospf_deferred_shutdown_timer (struct thread *t)
+static int ospf_deferred_shutdown_timer(struct thread *t)
{
- struct ospf *ospf = THREAD_ARG(t);
-
- ospf_deferred_shutdown_finish (ospf);
-
- return 0;
+ struct ospf *ospf = THREAD_ARG(t);
+
+ ospf_deferred_shutdown_finish(ospf);
+
+ return 0;
}
/* Check whether deferred-shutdown must be scheduled, otherwise call
* down directly into second-half of instance shutdown.
*/
-static void
-ospf_deferred_shutdown_check (struct ospf *ospf)
-{
- unsigned long timeout;
- struct listnode *ln;
- struct ospf_area *area;
-
- /* deferred shutdown already running? */
- if (ospf->t_deferred_shutdown)
- return;
-
- /* Should we try push out max-metric LSAs? */
- if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
- {
- for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
- {
- SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
-
- if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
- ospf_router_lsa_update_area (area);
- }
- timeout = ospf->stub_router_shutdown_time;
- }
- else
- {
- /* No timer needed */
- ospf_deferred_shutdown_finish (ospf);
- return;
- }
-
- OSPF_TIMER_ON (ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
- timeout);
- return;
+static void ospf_deferred_shutdown_check(struct ospf *ospf)
+{
+ unsigned long timeout;
+ struct listnode *ln;
+ struct ospf_area *area;
+
+ /* deferred shutdown already running? */
+ if (ospf->t_deferred_shutdown)
+ return;
+
+ /* Should we try push out max-metric LSAs? */
+ if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED) {
+ for (ALL_LIST_ELEMENTS_RO(ospf->areas, ln, area)) {
+ SET_FLAG(area->stub_router_state,
+ OSPF_AREA_ADMIN_STUB_ROUTED);
+
+ if (!CHECK_FLAG(area->stub_router_state,
+ OSPF_AREA_IS_STUB_ROUTED))
+ ospf_router_lsa_update_area(area);
+ }
+ timeout = ospf->stub_router_shutdown_time;
+ } else {
+ /* No timer needed */
+ ospf_deferred_shutdown_finish(ospf);
+ return;
+ }
+
+ OSPF_TIMER_ON(ospf->t_deferred_shutdown, ospf_deferred_shutdown_timer,
+ timeout);
+ return;
}
/* Shut down the entire process */
-void
-ospf_terminate (void)
-{
- struct ospf *ospf;
- struct listnode *node, *nnode;
-
- /* shutdown already in progress */
- if (CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN))
- return;
-
- SET_FLAG (om->options, OSPF_MASTER_SHUTDOWN);
-
- /* exit immediately if OSPF not actually running */
- if (listcount(om->ospf) == 0)
- exit(0);
-
- bfd_gbl_exit();
- for (ALL_LIST_ELEMENTS (om->ospf, node, nnode, ospf))
- ospf_finish (ospf);
-
- /* Deliberately go back up, hopefully to thread scheduler, as
- * One or more ospf_finish()'s may have deferred shutdown to a timer
- * thread
- */
- zclient_stop (zclient);
- zclient_free (zclient);
-}
-
-void
-ospf_finish (struct ospf *ospf)
-{
- /* let deferred shutdown decide */
- ospf_deferred_shutdown_check (ospf);
-
- /* if ospf_deferred_shutdown returns, then ospf_finish_final is
- * deferred to expiry of G-S timer thread. Return back up, hopefully
- * to thread scheduler.
- */
- return;
+void ospf_terminate(void)
+{
+ struct ospf *ospf;
+ struct listnode *node, *nnode;
+
+ /* shutdown already in progress */
+ if (CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
+ return;
+
+ SET_FLAG(om->options, OSPF_MASTER_SHUTDOWN);
+
+ /* exit immediately if OSPF not actually running */
+ if (listcount(om->ospf) == 0)
+ exit(0);
+
+ bfd_gbl_exit();
+ for (ALL_LIST_ELEMENTS(om->ospf, node, nnode, ospf))
+ ospf_finish(ospf);
+
+ /* Deliberately go back up, hopefully to thread scheduler, as
+ * One or more ospf_finish()'s may have deferred shutdown to a timer
+ * thread
+ */
+ zclient_stop(zclient);
+ zclient_free(zclient);
+}
+
+void ospf_finish(struct ospf *ospf)
+{
+ /* let deferred shutdown decide */
+ ospf_deferred_shutdown_check(ospf);
+
+ /* if ospf_deferred_shutdown returns, then ospf_finish_final is
+ * deferred to expiry of G-S timer thread. Return back up, hopefully
+ * to thread scheduler.
+ */
+ return;
}
/* Final cleanup of ospf instance */
-static void
-ospf_finish_final (struct ospf *ospf)
+static void ospf_finish_final(struct ospf *ospf)
{
- struct route_node *rn;
- struct ospf_nbr_nbma *nbr_nbma;
- struct ospf_lsa *lsa;
- struct interface *ifp;
- struct ospf_interface *oi;
- struct ospf_area *area;
- struct ospf_vl_data *vl_data;
- struct listnode *node, *nnode;
- int i;
- u_short instance = 0;
-
- QOBJ_UNREG (ospf);
-
- ospf_opaque_type11_lsa_term (ospf);
-
- /* be nice if this worked, but it doesn't */
- /*ospf_flush_self_originated_lsas_now (ospf);*/
-
- /* Unregister redistribution */
- for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
- {
- struct list *red_list;
- struct ospf_redist *red;
+ struct route_node *rn;
+ struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_lsa *lsa;
+ struct interface *ifp;
+ struct ospf_interface *oi;
+ struct ospf_area *area;
+ struct ospf_vl_data *vl_data;
+ struct listnode *node, *nnode;
+ int i;
+ u_short instance = 0;
- red_list = ospf->redist[i];
- if (!red_list)
- continue;
+ QOBJ_UNREG(ospf);
- for (ALL_LIST_ELEMENTS(red_list, node, nnode, red))
- ospf_redistribute_unset (ospf, i, red->instance);
- }
- ospf_redistribute_default_unset (ospf);
-
- for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
- ospf_remove_vls_through_area (ospf, area);
-
- for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data))
- ospf_vl_delete (ospf, vl_data);
-
- list_delete (ospf->vlinks);
-
- /* Remove any ospf interface config params */
- for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp))
- {
- struct ospf_if_params *params;
+ ospf_opaque_type11_lsa_term(ospf);
- params = IF_DEF_PARAMS (ifp);
- if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
- UNSET_IF_PARAM (params, if_area);
- }
+ /* be nice if this worked, but it doesn't */
+ /*ospf_flush_self_originated_lsas_now (ospf);*/
- /* Reset interface. */
- for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
- ospf_if_free (oi);
+ /* Unregister redistribution */
+ for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
+ struct list *red_list;
+ struct ospf_redist *red;
- /* Clear static neighbors */
- for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
- if ((nbr_nbma = rn->info))
- {
- OSPF_POLL_TIMER_OFF (nbr_nbma->t_poll);
+ red_list = ospf->redist[i];
+ if (!red_list)
+ continue;
- if (nbr_nbma->nbr)
- {
- nbr_nbma->nbr->nbr_nbma = NULL;
- nbr_nbma->nbr = NULL;
- }
+ for (ALL_LIST_ELEMENTS(red_list, node, nnode, red))
+ ospf_redistribute_unset(ospf, i, red->instance);
+ }
+ ospf_redistribute_default_unset(ospf);
- if (nbr_nbma->oi)
- {
- listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
- nbr_nbma->oi = NULL;
- }
+ for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
+ ospf_remove_vls_through_area(ospf, area);
- XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
- }
+ for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
+ ospf_vl_delete(ospf, vl_data);
- route_table_finish (ospf->nbr_nbma);
+ list_delete(ospf->vlinks);
- /* Clear networks and Areas. */
- for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
- {
- struct ospf_network *network;
+ /* Remove any ospf interface config params */
+ for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) {
+ struct ospf_if_params *params;
- if ((network = rn->info) != NULL)
- {
- ospf_network_free (ospf, network);
- rn->info = NULL;
- route_unlock_node (rn);
+ params = IF_DEF_PARAMS(ifp);
+ if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
+ UNSET_IF_PARAM(params, if_area);
}
- }
- for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
- {
- listnode_delete (ospf->areas, area);
- ospf_area_free (area);
- }
+ /* Reset interface. */
+ for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi))
+ ospf_if_free(oi);
- /* Cancel all timers. */
- OSPF_TIMER_OFF (ospf->t_external_lsa);
- OSPF_TIMER_OFF (ospf->t_spf_calc);
- OSPF_TIMER_OFF (ospf->t_ase_calc);
- OSPF_TIMER_OFF (ospf->t_maxage);
- OSPF_TIMER_OFF (ospf->t_maxage_walker);
- OSPF_TIMER_OFF (ospf->t_abr_task);
- OSPF_TIMER_OFF (ospf->t_asbr_check);
- OSPF_TIMER_OFF (ospf->t_distribute_update);
- OSPF_TIMER_OFF (ospf->t_lsa_refresher);
- OSPF_TIMER_OFF (ospf->t_read);
- OSPF_TIMER_OFF (ospf->t_write);
- OSPF_TIMER_OFF (ospf->t_opaque_lsa_self);
-
- close (ospf->fd);
- stream_free(ospf->ibuf);
-
- LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
- ospf_discard_from_db (ospf, ospf->lsdb, lsa);
- LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
- ospf_discard_from_db (ospf, ospf->lsdb, lsa);
-
- ospf_lsdb_delete_all (ospf->lsdb);
- ospf_lsdb_free (ospf->lsdb);
-
- for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
- {
- struct ospf_lsa *lsa;
+ /* Clear static neighbors */
+ for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
+ if ((nbr_nbma = rn->info)) {
+ OSPF_POLL_TIMER_OFF(nbr_nbma->t_poll);
- if ((lsa = rn->info) != NULL)
- {
- ospf_lsa_unlock (&lsa);
- rn->info = NULL;
+ if (nbr_nbma->nbr) {
+ nbr_nbma->nbr->nbr_nbma = NULL;
+ nbr_nbma->nbr = NULL;
+ }
+
+ if (nbr_nbma->oi) {
+ listnode_delete(nbr_nbma->oi->nbr_nbma,
+ nbr_nbma);
+ nbr_nbma->oi = NULL;
+ }
+
+ XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
+ }
+
+ route_table_finish(ospf->nbr_nbma);
+
+ /* Clear networks and Areas. */
+ for (rn = route_top(ospf->networks); rn; rn = route_next(rn)) {
+ struct ospf_network *network;
+
+ if ((network = rn->info) != NULL) {
+ ospf_network_free(ospf, network);
+ rn->info = NULL;
+ route_unlock_node(rn);
+ }
}
- route_unlock_node (rn);
- }
- route_table_finish (ospf->maxage_lsa);
- if (ospf->old_table)
- ospf_route_table_free (ospf->old_table);
- if (ospf->new_table)
- {
- ospf_route_delete (ospf->new_table);
- ospf_route_table_free (ospf->new_table);
- }
- if (ospf->old_rtrs)
- ospf_rtrs_free (ospf->old_rtrs);
- if (ospf->new_rtrs)
- ospf_rtrs_free (ospf->new_rtrs);
- if (ospf->new_external_route)
- {
- ospf_route_delete (ospf->new_external_route);
- ospf_route_table_free (ospf->new_external_route);
- }
- if (ospf->old_external_route)
- {
- ospf_route_delete (ospf->old_external_route);
- ospf_route_table_free (ospf->old_external_route);
- }
- if (ospf->external_lsas)
- {
- ospf_ase_external_lsas_finish (ospf->external_lsas);
- }
+ for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area)) {
+ listnode_delete(ospf->areas, area);
+ ospf_area_free(area);
+ }
- list_delete (ospf->areas);
-
- for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++)
- {
- struct list *ext_list;
- struct listnode *node;
- struct ospf_external *ext;
-
- ext_list = om->external[i];
- if (!ext_list)
- continue;
-
- for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext))
- {
- if (ext->external_info)
- for (rn = route_top (ext->external_info); rn; rn = route_next (rn))
- {
- if (rn->info == NULL)
- continue;
-
- XFREE (MTYPE_OSPF_EXTERNAL_INFO, rn->info);
- rn->info = NULL;
- route_unlock_node (rn);
- }
- }
- }
+ /* Cancel all timers. */
+ OSPF_TIMER_OFF(ospf->t_external_lsa);
+ OSPF_TIMER_OFF(ospf->t_spf_calc);
+ OSPF_TIMER_OFF(ospf->t_ase_calc);
+ OSPF_TIMER_OFF(ospf->t_maxage);
+ OSPF_TIMER_OFF(ospf->t_maxage_walker);
+ OSPF_TIMER_OFF(ospf->t_abr_task);
+ OSPF_TIMER_OFF(ospf->t_asbr_check);
+ OSPF_TIMER_OFF(ospf->t_distribute_update);
+ OSPF_TIMER_OFF(ospf->t_lsa_refresher);
+ OSPF_TIMER_OFF(ospf->t_read);
+ OSPF_TIMER_OFF(ospf->t_write);
+ OSPF_TIMER_OFF(ospf->t_opaque_lsa_self);
+
+ close(ospf->fd);
+ stream_free(ospf->ibuf);
+
+ LSDB_LOOP(OPAQUE_AS_LSDB(ospf), rn, lsa)
+ ospf_discard_from_db(ospf, ospf->lsdb, lsa);
+ LSDB_LOOP(EXTERNAL_LSDB(ospf), rn, lsa)
+ ospf_discard_from_db(ospf, ospf->lsdb, lsa);
+
+ ospf_lsdb_delete_all(ospf->lsdb);
+ ospf_lsdb_free(ospf->lsdb);
+
+ for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn)) {
+ struct ospf_lsa *lsa;
+
+ if ((lsa = rn->info) != NULL) {
+ ospf_lsa_unlock(&lsa);
+ rn->info = NULL;
+ }
+ route_unlock_node(rn);
+ }
+ route_table_finish(ospf->maxage_lsa);
+
+ if (ospf->old_table)
+ ospf_route_table_free(ospf->old_table);
+ if (ospf->new_table) {
+ ospf_route_delete(ospf->new_table);
+ ospf_route_table_free(ospf->new_table);
+ }
+ if (ospf->old_rtrs)
+ ospf_rtrs_free(ospf->old_rtrs);
+ if (ospf->new_rtrs)
+ ospf_rtrs_free(ospf->new_rtrs);
+ if (ospf->new_external_route) {
+ ospf_route_delete(ospf->new_external_route);
+ ospf_route_table_free(ospf->new_external_route);
+ }
+ if (ospf->old_external_route) {
+ ospf_route_delete(ospf->old_external_route);
+ ospf_route_table_free(ospf->old_external_route);
+ }
+ if (ospf->external_lsas) {
+ ospf_ase_external_lsas_finish(ospf->external_lsas);
+ }
- ospf_distance_reset (ospf);
- route_table_finish (ospf->distance_table);
+ list_delete(ospf->areas);
+
+ for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
+ struct list *ext_list;
+ struct listnode *node;
+ struct ospf_external *ext;
+
+ ext_list = om->external[i];
+ if (!ext_list)
+ continue;
+
+ for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) {
+ if (ext->external_info)
+ for (rn = route_top(ext->external_info); rn;
+ rn = route_next(rn)) {
+ if (rn->info == NULL)
+ continue;
+
+ XFREE(MTYPE_OSPF_EXTERNAL_INFO,
+ rn->info);
+ rn->info = NULL;
+ route_unlock_node(rn);
+ }
+ }
+ }
- if (!CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN))
- instance = ospf->instance;
+ ospf_distance_reset(ospf);
+ route_table_finish(ospf->distance_table);
- ospf_delete (ospf);
+ if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
+ instance = ospf->instance;
- XFREE (MTYPE_OSPF_TOP, ospf);
+ ospf_delete(ospf);
- if (!CHECK_FLAG (om->options, OSPF_MASTER_SHUTDOWN))
- ospf_get_instance(instance);
+ XFREE(MTYPE_OSPF_TOP, ospf);
+ if (!CHECK_FLAG(om->options, OSPF_MASTER_SHUTDOWN))
+ ospf_get_instance(instance);
}
/* allocate new OSPF Area object */
-static struct ospf_area *
-ospf_area_new (struct ospf *ospf, struct in_addr area_id)
+static struct ospf_area *ospf_area_new(struct ospf *ospf,
+ struct in_addr area_id)
{
- struct ospf_area *new;
+ struct ospf_area *new;
- /* Allocate new config_network. */
- new = XCALLOC (MTYPE_OSPF_AREA, sizeof (struct ospf_area));
+ /* Allocate new config_network. */
+ new = XCALLOC(MTYPE_OSPF_AREA, sizeof(struct ospf_area));
- new->ospf = ospf;
+ new->ospf = ospf;
- new->area_id = area_id;
- new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
+ new->area_id = area_id;
+ new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
- new->external_routing = OSPF_AREA_DEFAULT;
- new->default_cost = 1;
- new->auth_type = OSPF_AUTH_NULL;
-
- /* New LSDB init. */
- new->lsdb = ospf_lsdb_new ();
+ new->external_routing = OSPF_AREA_DEFAULT;
+ new->default_cost = 1;
+ new->auth_type = OSPF_AUTH_NULL;
- /* Self-originated LSAs initialize. */
- new->router_lsa_self = NULL;
+ /* New LSDB init. */
+ new->lsdb = ospf_lsdb_new();
- ospf_opaque_type10_lsa_init (new);
+ /* Self-originated LSAs initialize. */
+ new->router_lsa_self = NULL;
- new->oiflist = list_new ();
- new->ranges = route_table_init ();
+ ospf_opaque_type10_lsa_init(new);
- if (area_id.s_addr == OSPF_AREA_BACKBONE)
- ospf->backbone = new;
+ new->oiflist = list_new();
+ new->ranges = route_table_init();
- return new;
+ if (area_id.s_addr == OSPF_AREA_BACKBONE)
+ ospf->backbone = new;
+
+ return new;
}
-static void
-ospf_area_free (struct ospf_area *area)
+static void ospf_area_free(struct ospf_area *area)
{
- struct route_node *rn;
- struct ospf_lsa *lsa;
+ struct route_node *rn;
+ struct ospf_lsa *lsa;
+
+ /* Free LSDBs. */
+ LSDB_LOOP(ROUTER_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
+ LSDB_LOOP(NETWORK_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
+ LSDB_LOOP(SUMMARY_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
+ LSDB_LOOP(ASBR_SUMMARY_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
- /* Free LSDBs. */
- LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
- LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
- LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
- LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
+ LSDB_LOOP(NSSA_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
+ LSDB_LOOP(OPAQUE_AREA_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
+ LSDB_LOOP(OPAQUE_LINK_LSDB(area), rn, lsa)
+ ospf_discard_from_db(area->ospf, area->lsdb, lsa);
- LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
- LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
- LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
- ospf_discard_from_db (area->ospf, area->lsdb, lsa);
+ ospf_lsdb_delete_all(area->lsdb);
+ ospf_lsdb_free(area->lsdb);
- ospf_lsdb_delete_all (area->lsdb);
- ospf_lsdb_free (area->lsdb);
+ ospf_lsa_unlock(&area->router_lsa_self);
- ospf_lsa_unlock (&area->router_lsa_self);
-
- route_table_finish (area->ranges);
- list_delete (area->oiflist);
+ route_table_finish(area->ranges);
+ list_delete(area->oiflist);
- if (EXPORT_NAME (area))
- free (EXPORT_NAME (area));
+ if (EXPORT_NAME(area))
+ free(EXPORT_NAME(area));
- if (IMPORT_NAME (area))
- free (IMPORT_NAME (area));
+ if (IMPORT_NAME(area))
+ free(IMPORT_NAME(area));
- /* Cancel timer. */
- OSPF_TIMER_OFF (area->t_stub_router);
- OSPF_TIMER_OFF (area->t_opaque_lsa_self);
-
- if (OSPF_IS_AREA_BACKBONE (area))
- area->ospf->backbone = NULL;
+ /* Cancel timer. */
+ OSPF_TIMER_OFF(area->t_stub_router);
+ OSPF_TIMER_OFF(area->t_opaque_lsa_self);
- XFREE (MTYPE_OSPF_AREA, area);
+ if (OSPF_IS_AREA_BACKBONE(area))
+ area->ospf->backbone = NULL;
+
+ XFREE(MTYPE_OSPF_AREA, area);
}
-void
-ospf_area_check_free (struct ospf *ospf, struct in_addr area_id)
+void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_lookup_by_area_id (ospf, area_id);
- if (area &&
- listcount (area->oiflist) == 0 &&
- area->ranges->top == NULL &&
- area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
- area->external_routing == OSPF_AREA_DEFAULT &&
- area->no_summary == 0 &&
- area->default_cost == 1 &&
- EXPORT_NAME (area) == NULL &&
- IMPORT_NAME (area) == NULL &&
- area->auth_type == OSPF_AUTH_NULL)
- {
- listnode_delete (ospf->areas, area);
- ospf_area_free (area);
- }
+ area = ospf_area_lookup_by_area_id(ospf, area_id);
+ if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
+ && area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
+ && area->external_routing == OSPF_AREA_DEFAULT
+ && area->no_summary == 0 && area->default_cost == 1
+ && EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL
+ && area->auth_type == OSPF_AUTH_NULL) {
+ listnode_delete(ospf->areas, area);
+ ospf_area_free(area);
+ }
}
-struct ospf_area *
-ospf_area_get (struct ospf *ospf, struct in_addr area_id)
+struct ospf_area *ospf_area_get(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
-
- area = ospf_area_lookup_by_area_id (ospf, area_id);
- if (!area)
- {
- area = ospf_area_new (ospf, area_id);
- listnode_add_sort (ospf->areas, area);
- ospf_check_abr_status (ospf);
- if (ospf->stub_router_admin_set == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET)
- {
- SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
- }
- }
+ struct ospf_area *area;
+
+ area = ospf_area_lookup_by_area_id(ospf, area_id);
+ if (!area) {
+ area = ospf_area_new(ospf, area_id);
+ listnode_add_sort(ospf->areas, area);
+ ospf_check_abr_status(ospf);
+ if (ospf->stub_router_admin_set
+ == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET) {
+ SET_FLAG(area->stub_router_state,
+ OSPF_AREA_ADMIN_STUB_ROUTED);
+ }
+ }
- return area;
+ return area;
}
-struct ospf_area *
-ospf_area_lookup_by_area_id (struct ospf *ospf, struct in_addr area_id)
+struct ospf_area *ospf_area_lookup_by_area_id(struct ospf *ospf,
+ struct in_addr area_id)
{
- struct ospf_area *area;
- struct listnode *node;
+ struct ospf_area *area;
+ struct listnode *node;
- for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
- if (IPV4_ADDR_SAME (&area->area_id, &area_id))
- return area;
+ for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
+ if (IPV4_ADDR_SAME(&area->area_id, &area_id))
+ return area;
- return NULL;
+ return NULL;
}
-void
-ospf_area_add_if (struct ospf_area *area, struct ospf_interface *oi)
+void ospf_area_add_if(struct ospf_area *area, struct ospf_interface *oi)
{
- listnode_add (area->oiflist, oi);
+ listnode_add(area->oiflist, oi);
}
-void
-ospf_area_del_if (struct ospf_area *area, struct ospf_interface *oi)
+void ospf_area_del_if(struct ospf_area *area, struct ospf_interface *oi)
{
- listnode_delete (area->oiflist, oi);
+ listnode_delete(area->oiflist, oi);
}
-
-static void
-add_ospf_interface (struct connected *co, struct ospf_area *area)
+static void add_ospf_interface(struct connected *co, struct ospf_area *area)
{
- struct ospf_interface *oi;
-
- oi = ospf_if_new (area->ospf, co->ifp, co->address);
- oi->connected = co;
+ struct ospf_interface *oi;
- oi->area = area;
+ oi = ospf_if_new(area->ospf, co->ifp, co->address);
+ oi->connected = co;
- oi->params = ospf_lookup_if_params (co->ifp, oi->address->u.prefix4);
- oi->output_cost = ospf_if_get_output_cost (oi);
+ oi->area = area;
- /* Relate ospf interface to ospf instance. */
- oi->ospf = area->ospf;
+ oi->params = ospf_lookup_if_params(co->ifp, oi->address->u.prefix4);
+ oi->output_cost = ospf_if_get_output_cost(oi);
- /* update network type as interface flag */
- /* If network type is specified previously,
- skip network type setting. */
- oi->type = IF_DEF_PARAMS (co->ifp)->type;
+ /* Relate ospf interface to ospf instance. */
+ oi->ospf = area->ospf;
- /* Add pseudo neighbor. */
- ospf_nbr_self_reset (oi, oi->ospf->router_id);
+ /* update network type as interface flag */
+ /* If network type is specified previously,
+ skip network type setting. */
+ oi->type = IF_DEF_PARAMS(co->ifp)->type;
- ospf_area_add_if (oi->area, oi);
+ /* Add pseudo neighbor. */
+ ospf_nbr_self_reset(oi, oi->ospf->router_id);
- /*
- * if router_id is not configured, dont bring up
- * interfaces.
- * ospf_router_id_update() will call ospf_if_update
- * whenever r-id is configured instead.
- */
- if ((area->ospf->router_id.s_addr != 0)
- && if_is_operative (co->ifp))
- ospf_if_up (oi);
+ ospf_area_add_if(oi->area, oi);
+ /*
+ * if router_id is not configured, dont bring up
+ * interfaces.
+ * ospf_router_id_update() will call ospf_if_update
+ * whenever r-id is configured instead.
+ */
+ if ((area->ospf->router_id.s_addr != 0) && if_is_operative(co->ifp))
+ ospf_if_up(oi);
}
static void update_redistributed(struct ospf *ospf, int add_to_ospf)
{
- struct route_node *rn;
- struct external_info *ei;
- struct ospf_external *ext;
-
- if (ospf_is_type_redistributed (ZEBRA_ROUTE_CONNECT, 0))
- if ((ext = ospf_external_lookup(ZEBRA_ROUTE_CONNECT, 0)) &&
- EXTERNAL_INFO (ext))
- {
- for (rn = route_top (EXTERNAL_INFO (ext));
- rn; rn = route_next (rn))
- {
- if ((ei = rn->info) != NULL)
- {
- if (add_to_ospf)
- {
- if (ospf_external_info_find_lsa (ospf, &ei->p))
- if (!ospf_distribute_check_connected (ospf, ei))
- ospf_external_lsa_flush (ospf, ei->type, &ei->p,
- ei->ifindex /*, ei->nexthop */);
- }
- else
- {
- if (!ospf_external_info_find_lsa (ospf, &ei->p))
- if (ospf_distribute_check_connected (ospf, ei))
- ospf_external_lsa_originate (ospf, ei);
- }
- }
- }
- }
+ struct route_node *rn;
+ struct external_info *ei;
+ struct ospf_external *ext;
+
+ if (ospf_is_type_redistributed(ZEBRA_ROUTE_CONNECT, 0))
+ if ((ext = ospf_external_lookup(ZEBRA_ROUTE_CONNECT, 0))
+ && EXTERNAL_INFO(ext)) {
+ for (rn = route_top(EXTERNAL_INFO(ext)); rn;
+ rn = route_next(rn)) {
+ if ((ei = rn->info) != NULL) {
+ if (add_to_ospf) {
+ if (ospf_external_info_find_lsa(
+ ospf, &ei->p))
+ if (!ospf_distribute_check_connected(
+ ospf, ei))
+ ospf_external_lsa_flush(
+ ospf,
+ ei->type,
+ &ei->p,
+ ei->ifindex /*, ei->nexthop */);
+ } else {
+ if (!ospf_external_info_find_lsa(
+ ospf, &ei->p))
+ if (ospf_distribute_check_connected(
+ ospf, ei))
+ ospf_external_lsa_originate(
+ ospf,
+ ei);
+ }
+ }
+ }
+ }
}
/* Config network statement related functions. */
-static struct ospf_network *
-ospf_network_new (struct in_addr area_id)
+static struct ospf_network *ospf_network_new(struct in_addr area_id)
{
- struct ospf_network *new;
- new = XCALLOC (MTYPE_OSPF_NETWORK, sizeof (struct ospf_network));
+ struct ospf_network *new;
+ new = XCALLOC(MTYPE_OSPF_NETWORK, sizeof(struct ospf_network));
- new->area_id = area_id;
- new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
-
- return new;
+ new->area_id = area_id;
+ new->area_id_fmt = OSPF_AREA_ID_FMT_DOTTEDQUAD;
+
+ return new;
}
-static void
-ospf_network_free (struct ospf *ospf, struct ospf_network *network)
+static void ospf_network_free(struct ospf *ospf, struct ospf_network *network)
{
- ospf_area_check_free (ospf, network->area_id);
- ospf_schedule_abr_task (ospf);
- XFREE (MTYPE_OSPF_NETWORK, network);
+ ospf_area_check_free(ospf, network->area_id);
+ ospf_schedule_abr_task(ospf);
+ XFREE(MTYPE_OSPF_NETWORK, network);
}
-int
-ospf_network_set (struct ospf *ospf, struct prefix_ipv4 *p,
- struct in_addr area_id, int df)
+int ospf_network_set(struct ospf *ospf, struct prefix_ipv4 *p,
+ struct in_addr area_id, int df)
{
- struct ospf_network *network;
- struct ospf_area *area;
- struct route_node *rn;
+ struct ospf_network *network;
+ struct ospf_area *area;
+ struct route_node *rn;
- rn = route_node_get (ospf->networks, (struct prefix *)p);
- if (rn->info)
- {
- /* There is already same network statement. */
- route_unlock_node (rn);
- return 0;
- }
+ rn = route_node_get(ospf->networks, (struct prefix *)p);
+ if (rn->info) {
+ /* There is already same network statement. */
+ route_unlock_node(rn);
+ return 0;
+ }
- rn->info = network = ospf_network_new (area_id);
- network->area_id_fmt = df;
- area = ospf_area_get (ospf, area_id);
- ospf_area_display_format_set (ospf, area, df);
+ rn->info = network = ospf_network_new(area_id);
+ network->area_id_fmt = df;
+ area = ospf_area_get(ospf, area_id);
+ ospf_area_display_format_set(ospf, area, df);
- /* Run network config now. */
- ospf_network_run ((struct prefix *)p, area);
+ /* Run network config now. */
+ ospf_network_run((struct prefix *)p, area);
- /* Update connected redistribute. */
- update_redistributed(ospf, 1); /* interfaces possibly added */
+ /* Update connected redistribute. */
+ update_redistributed(ospf, 1); /* interfaces possibly added */
- ospf_area_check_free (ospf, area_id);
+ ospf_area_check_free(ospf, area_id);
- return 1;
+ return 1;
}
-int
-ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p,
- struct in_addr area_id)
+int ospf_network_unset(struct ospf *ospf, struct prefix_ipv4 *p,
+ struct in_addr area_id)
{
- struct route_node *rn;
- struct ospf_network *network;
- struct listnode *node, *nnode;
- struct ospf_interface *oi;
+ struct route_node *rn;
+ struct ospf_network *network;
+ struct listnode *node, *nnode;
+ struct ospf_interface *oi;
- rn = route_node_lookup (ospf->networks, (struct prefix *)p);
- if (rn == NULL)
- return 0;
+ rn = route_node_lookup(ospf->networks, (struct prefix *)p);
+ if (rn == NULL)
+ return 0;
- network = rn->info;
- route_unlock_node (rn);
- if (!IPV4_ADDR_SAME (&area_id, &network->area_id))
- return 0;
+ network = rn->info;
+ route_unlock_node(rn);
+ if (!IPV4_ADDR_SAME(&area_id, &network->area_id))
+ return 0;
- ospf_network_free (ospf, rn->info);
- rn->info = NULL;
- route_unlock_node (rn); /* initial reference */
+ ospf_network_free(ospf, rn->info);
+ rn->info = NULL;
+ route_unlock_node(rn); /* initial reference */
- /* Find interfaces that not configured already. */
- for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
- {
- ospf_network_run_subnet (ospf, oi->connected, NULL, NULL);
- }
-
- /* Update connected redistribute. */
- update_redistributed(ospf, 0); /* interfaces possibly removed */
- ospf_area_check_free (ospf, area_id);
+ /* Find interfaces that not configured already. */
+ for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi)) {
+ ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
+ }
- return 1;
+ /* Update connected redistribute. */
+ update_redistributed(ospf, 0); /* interfaces possibly removed */
+ ospf_area_check_free(ospf, area_id);
+
+ return 1;
}
/* Ensure there's an OSPF instance, as "ip ospf area" enabled OSPF means
@@ -1037,69 +993,67 @@ ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p,
*
* Otherwise, doesn't do anything different to ospf_if_update for now
*/
-void
-ospf_interface_area_set (struct interface *ifp)
+void ospf_interface_area_set(struct interface *ifp)
{
- struct ospf *ospf = ospf_get();
-
- ospf_if_update (ospf, ifp);
- /* if_update does a update_redistributed */
-
- return;
+ struct ospf *ospf = ospf_get();
+
+ ospf_if_update(ospf, ifp);
+ /* if_update does a update_redistributed */
+
+ return;
}
-void
-ospf_interface_area_unset (struct interface *ifp)
+void ospf_interface_area_unset(struct interface *ifp)
{
- struct route_node *rn_oi;
- struct ospf *ospf;
+ struct route_node *rn_oi;
+ struct ospf *ospf;
- ospf = ospf_lookup ();
- if (!ospf)
- return; /* Ospf not ready yet */
+ ospf = ospf_lookup();
+ if (!ospf)
+ return; /* Ospf not ready yet */
- /* Find interfaces that may need to be removed. */
- for (rn_oi = route_top (IF_OIFS (ifp)); rn_oi; rn_oi = route_next (rn_oi))
- {
- struct ospf_interface *oi;
-
- if ( (oi = rn_oi->info) == NULL)
- continue;
-
- if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
- continue;
-
- ospf_network_run_subnet (ospf, oi->connected, NULL, NULL);
- }
+ /* Find interfaces that may need to be removed. */
+ for (rn_oi = route_top(IF_OIFS(ifp)); rn_oi;
+ rn_oi = route_next(rn_oi)) {
+ struct ospf_interface *oi;
+
+ if ((oi = rn_oi->info) == NULL)
+ continue;
+
+ if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
+ continue;
+
+ ospf_network_run_subnet(ospf, oi->connected, NULL, NULL);
+ }
- /* Update connected redistribute. */
- update_redistributed(ospf, 0); /* interfaces possibly removed */
+ /* Update connected redistribute. */
+ update_redistributed(ospf, 0); /* interfaces possibly removed */
}
/* Check whether interface matches given network
* returns: 1, true. 0, false
*/
-static int
-ospf_network_match_iface(const struct connected *co, const struct prefix *net)
+static int ospf_network_match_iface(const struct connected *co,
+ const struct prefix *net)
{
- /* new approach: more elegant and conceptually clean */
- return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
+ /* new approach: more elegant and conceptually clean */
+ return prefix_match_network_statement(net, CONNECTED_PREFIX(co));
}
-static void
-ospf_update_interface_area (struct connected *co, struct ospf_area *area)
+static void ospf_update_interface_area(struct connected *co,
+ struct ospf_area *area)
{
- struct ospf_interface *oi = ospf_if_table_lookup (co->ifp, co->address);
-
- /* nothing to be done case */
- if (oi && oi->area == area){
- return;
- }
-
- if (oi)
- ospf_if_free (oi);
-
- add_ospf_interface (co, area);
+ struct ospf_interface *oi = ospf_if_table_lookup(co->ifp, co->address);
+
+ /* nothing to be done case */
+ if (oi && oi->area == area) {
+ return;
+ }
+
+ if (oi)
+ ospf_if_free(oi);
+
+ add_ospf_interface(co, area);
}
/* Run OSPF for the given subnet, taking into account the following
@@ -1111,399 +1065,379 @@ ospf_update_interface_area (struct connected *co, struct ospf_area *area)
* - If no specific network prefix/area is supplied, whether there's
* a matching network configured.
*/
-static void
-ospf_network_run_subnet (struct ospf *ospf, struct connected *co,
- struct prefix *p, struct ospf_area *given_area)
-{
- struct ospf_interface *oi;
- struct ospf_if_params *params;
- struct ospf_area *area = NULL;
- struct route_node *rn;
- int configed = 0;
-
- if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
- return;
-
- if (co->address->family != AF_INET)
- return;
-
- /* Try determine the appropriate area for this interface + address
- * Start by checking interface config
- */
- params = ospf_lookup_if_params (co->ifp, co->address->u.prefix4);
- if ( params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
- area = ospf_area_get (ospf, params->if_area);
- else{
- params = IF_DEF_PARAMS (co->ifp);
- if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
- area = ospf_area_get (ospf, params->if_area);
- }
+static void ospf_network_run_subnet(struct ospf *ospf, struct connected *co,
+ struct prefix *p,
+ struct ospf_area *given_area)
+{
+ struct ospf_interface *oi;
+ struct ospf_if_params *params;
+ struct ospf_area *area = NULL;
+ struct route_node *rn;
+ int configed = 0;
+
+ if (CHECK_FLAG(co->flags, ZEBRA_IFA_SECONDARY))
+ return;
+
+ if (co->address->family != AF_INET)
+ return;
+
+ /* Try determine the appropriate area for this interface + address
+ * Start by checking interface config
+ */
+ params = ospf_lookup_if_params(co->ifp, co->address->u.prefix4);
+ if (params && OSPF_IF_PARAM_CONFIGURED(params, if_area))
+ area = ospf_area_get(ospf, params->if_area);
+ else {
+ params = IF_DEF_PARAMS(co->ifp);
+ if (OSPF_IF_PARAM_CONFIGURED(params, if_area))
+ area = ospf_area_get(ospf, params->if_area);
+ }
- /* If we've found an interface and/or addr specific area, then we're
- * done
- */
- if (area)
- {
- ospf_update_interface_area (co, area);
- return;
- }
-
- /* Otherwise, only remaining possibility is a matching network statement */
- if (p)
- {
- assert (given_area != NULL);
-
- /* Which either was supplied as a parameter.. (e.g. cause a new
- * network/area was just added)..
- */
- if (p->family == co->address->family
- && ospf_network_match_iface (co, p))
- ospf_update_interface_area (co, given_area);
-
- return;
- }
-
- /* Else we have to search the existing network/area config to see
- * if any match..
- */
- for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
- if (rn->info != NULL
- && ospf_network_match_iface (co, &rn->p))
- {
- struct ospf_network *network = (struct ospf_network *) rn->info;
- area = ospf_area_get (ospf, network->area_id);
- ospf_update_interface_area (co, area);
- configed = 1;
- }
-
- /* If the subnet isn't in any area, deconfigure */
- if (!configed && (oi = ospf_if_table_lookup (co->ifp, co->address)))
- ospf_if_free (oi);
-}
-
-static void
-ospf_network_run_interface (struct ospf *ospf, struct interface *ifp,
- struct prefix *p,
- struct ospf_area *given_area)
-{
- struct listnode *cnode;
- struct connected *co;
-
- if (memcmp (ifp->name, "VLINK", 5) == 0)
- return;
-
- /* Network prefix without area is nonsensical */
- if (p)
- assert (given_area != NULL);
-
- /* if interface prefix is match specified prefix,
- then create socket and join multicast group. */
- for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, co))
- ospf_network_run_subnet (ospf, co, p, given_area);
-}
-
-static void
-ospf_network_run (struct prefix *p, struct ospf_area *area)
-{
- struct interface *ifp;
- struct listnode *node;
+ /* If we've found an interface and/or addr specific area, then we're
+ * done
+ */
+ if (area) {
+ ospf_update_interface_area(co, area);
+ return;
+ }
- /* Schedule Router ID Update. */
- if (area->ospf->router_id.s_addr == 0)
- ospf_router_id_update (area->ospf);
-
- /* Get target interface. */
- for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
- ospf_network_run_interface (area->ospf, ifp, p, area);
-}
-
-void
-ospf_ls_upd_queue_empty (struct ospf_interface *oi)
-{
- struct route_node *rn;
- struct listnode *node, *nnode;
- struct list *lst;
- struct ospf_lsa *lsa;
-
- /* empty ls update queue */
- for (rn = route_top (oi->ls_upd_queue); rn;
- rn = route_next (rn))
- if ((lst = (struct list *) rn->info))
- {
- for (ALL_LIST_ELEMENTS (lst, node, nnode, lsa))
- ospf_lsa_unlock (&lsa); /* oi->ls_upd_queue */
- list_free (lst);
- rn->info = NULL;
- }
-
- /* remove update event */
- if (oi->t_ls_upd_event)
- {
- thread_cancel (oi->t_ls_upd_event);
- oi->t_ls_upd_event = NULL;
- }
+ /* Otherwise, only remaining possibility is a matching network statement
+ */
+ if (p) {
+ assert(given_area != NULL);
+
+ /* Which either was supplied as a parameter.. (e.g. cause a new
+ * network/area was just added)..
+ */
+ if (p->family == co->address->family
+ && ospf_network_match_iface(co, p))
+ ospf_update_interface_area(co, given_area);
+
+ return;
+ }
+
+ /* Else we have to search the existing network/area config to see
+ * if any match..
+ */
+ for (rn = route_top(ospf->networks); rn; rn = route_next(rn))
+ if (rn->info != NULL && ospf_network_match_iface(co, &rn->p)) {
+ struct ospf_network *network =
+ (struct ospf_network *)rn->info;
+ area = ospf_area_get(ospf, network->area_id);
+ ospf_update_interface_area(co, area);
+ configed = 1;
+ }
+
+ /* If the subnet isn't in any area, deconfigure */
+ if (!configed && (oi = ospf_if_table_lookup(co->ifp, co->address)))
+ ospf_if_free(oi);
}
-void
-ospf_if_update (struct ospf *ospf, struct interface *ifp)
+static void ospf_network_run_interface(struct ospf *ospf, struct interface *ifp,
+ struct prefix *p,
+ struct ospf_area *given_area)
{
- if (!ospf)
- ospf = ospf_lookup ();
+ struct listnode *cnode;
+ struct connected *co;
+
+ if (memcmp(ifp->name, "VLINK", 5) == 0)
+ return;
- /* OSPF must be ready. */
- if (!ospf_is_ready (ospf))
- return;
-
- ospf_network_run_interface (ospf, ifp, NULL, NULL);
-
- /* Update connected redistribute. */
- update_redistributed(ospf, 1);
+ /* Network prefix without area is nonsensical */
+ if (p)
+ assert(given_area != NULL);
+
+ /* if interface prefix is match specified prefix,
+ then create socket and join multicast group. */
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, co))
+ ospf_network_run_subnet(ospf, co, p, given_area);
}
-void
-ospf_remove_vls_through_area (struct ospf *ospf, struct ospf_area *area)
+static void ospf_network_run(struct prefix *p, struct ospf_area *area)
{
- struct listnode *node, *nnode;
- struct ospf_vl_data *vl_data;
+ struct interface *ifp;
+ struct listnode *node;
+
+ /* Schedule Router ID Update. */
+ if (area->ospf->router_id.s_addr == 0)
+ ospf_router_id_update(area->ospf);
- for (ALL_LIST_ELEMENTS (ospf->vlinks, node, nnode, vl_data))
- if (IPV4_ADDR_SAME (&vl_data->vl_area_id, &area->area_id))
- ospf_vl_delete (ospf, vl_data);
+ /* Get target interface. */
+ for (ALL_LIST_ELEMENTS_RO(om->iflist, node, ifp))
+ ospf_network_run_interface(area->ospf, ifp, p, area);
}
+void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
+{
+ struct route_node *rn;
+ struct listnode *node, *nnode;
+ struct list *lst;
+ struct ospf_lsa *lsa;
+
+ /* empty ls update queue */
+ for (rn = route_top(oi->ls_upd_queue); rn; rn = route_next(rn))
+ if ((lst = (struct list *)rn->info)) {
+ for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
+ ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
+ list_free(lst);
+ rn->info = NULL;
+ }
+
+ /* remove update event */
+ if (oi->t_ls_upd_event) {
+ thread_cancel(oi->t_ls_upd_event);
+ oi->t_ls_upd_event = NULL;
+ }
+}
-static const struct message ospf_area_type_msg[] =
+void ospf_if_update(struct ospf *ospf, struct interface *ifp)
{
- { OSPF_AREA_DEFAULT, "Default" },
- { OSPF_AREA_STUB, "Stub" },
- { OSPF_AREA_NSSA, "NSSA" },
- { 0 }
-};
+ if (!ospf)
+ ospf = ospf_lookup();
+
+ /* OSPF must be ready. */
+ if (!ospf_is_ready(ospf))
+ return;
+
+ ospf_network_run_interface(ospf, ifp, NULL, NULL);
+
+ /* Update connected redistribute. */
+ update_redistributed(ospf, 1);
+}
-static void
-ospf_area_type_set (struct ospf_area *area, int type)
+void ospf_remove_vls_through_area(struct ospf *ospf, struct ospf_area *area)
{
- struct listnode *node;
- struct ospf_interface *oi;
+ struct listnode *node, *nnode;
+ struct ospf_vl_data *vl_data;
- if (area->external_routing == type)
- {
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("Area[%s]: Types are the same, ignored.",
- inet_ntoa (area->area_id));
- return;
- }
+ for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
+ if (IPV4_ADDR_SAME(&vl_data->vl_area_id, &area->area_id))
+ ospf_vl_delete(ospf, vl_data);
+}
- area->external_routing = type;
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("Area[%s]: Configured as %s", inet_ntoa (area->area_id),
- lookup_msg(ospf_area_type_msg, type, NULL));
+static const struct message ospf_area_type_msg[] = {
+ {OSPF_AREA_DEFAULT, "Default"},
+ {OSPF_AREA_STUB, "Stub"},
+ {OSPF_AREA_NSSA, "NSSA"},
+ {0}};
- switch (area->external_routing)
- {
- case OSPF_AREA_DEFAULT:
- for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
- if (oi->nbr_self != NULL)
- {
- UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
- SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
- }
- break;
- case OSPF_AREA_STUB:
- for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
- if (oi->nbr_self != NULL)
- {
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("setting options on %s accordingly", IF_NAME (oi));
- UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
- UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("options set on %s: %x",
- IF_NAME (oi), OPTIONS (oi));
- }
- break;
- case OSPF_AREA_NSSA:
- for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
- if (oi->nbr_self != NULL)
- {
- zlog_debug ("setting nssa options on %s accordingly", IF_NAME (oi));
- UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
- SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
- zlog_debug ("options set on %s: %x", IF_NAME (oi), OPTIONS (oi));
- }
- break;
- default:
- break;
- }
+static void ospf_area_type_set(struct ospf_area *area, int type)
+{
+ struct listnode *node;
+ struct ospf_interface *oi;
+
+ if (area->external_routing == type) {
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("Area[%s]: Types are the same, ignored.",
+ inet_ntoa(area->area_id));
+ return;
+ }
- ospf_router_lsa_update_area (area);
- ospf_schedule_abr_task (area->ospf);
+ area->external_routing = type;
+
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("Area[%s]: Configured as %s",
+ inet_ntoa(area->area_id),
+ lookup_msg(ospf_area_type_msg, type, NULL));
+
+ switch (area->external_routing) {
+ case OSPF_AREA_DEFAULT:
+ for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
+ if (oi->nbr_self != NULL) {
+ UNSET_FLAG(oi->nbr_self->options,
+ OSPF_OPTION_NP);
+ SET_FLAG(oi->nbr_self->options, OSPF_OPTION_E);
+ }
+ break;
+ case OSPF_AREA_STUB:
+ for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
+ if (oi->nbr_self != NULL) {
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug(
+ "setting options on %s accordingly",
+ IF_NAME(oi));
+ UNSET_FLAG(oi->nbr_self->options,
+ OSPF_OPTION_NP);
+ UNSET_FLAG(oi->nbr_self->options,
+ OSPF_OPTION_E);
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug("options set on %s: %x",
+ IF_NAME(oi), OPTIONS(oi));
+ }
+ break;
+ case OSPF_AREA_NSSA:
+ for (ALL_LIST_ELEMENTS_RO(area->oiflist, node, oi))
+ if (oi->nbr_self != NULL) {
+ zlog_debug(
+ "setting nssa options on %s accordingly",
+ IF_NAME(oi));
+ UNSET_FLAG(oi->nbr_self->options,
+ OSPF_OPTION_E);
+ SET_FLAG(oi->nbr_self->options, OSPF_OPTION_NP);
+ zlog_debug("options set on %s: %x", IF_NAME(oi),
+ OPTIONS(oi));
+ }
+ break;
+ default:
+ break;
+ }
+
+ ospf_router_lsa_update_area(area);
+ ospf_schedule_abr_task(area->ospf);
}
-int
-ospf_area_shortcut_set (struct ospf *ospf, struct ospf_area *area, int mode)
+int ospf_area_shortcut_set(struct ospf *ospf, struct ospf_area *area, int mode)
{
- if (area->shortcut_configured == mode)
- return 0;
+ if (area->shortcut_configured == mode)
+ return 0;
- area->shortcut_configured = mode;
- ospf_router_lsa_update_area (area);
- ospf_schedule_abr_task (ospf);
+ area->shortcut_configured = mode;
+ ospf_router_lsa_update_area(area);
+ ospf_schedule_abr_task(ospf);
- ospf_area_check_free (ospf, area->area_id);
+ ospf_area_check_free(ospf, area->area_id);
- return 1;
+ return 1;
}
-int
-ospf_area_shortcut_unset (struct ospf *ospf, struct ospf_area *area)
+int ospf_area_shortcut_unset(struct ospf *ospf, struct ospf_area *area)
{
- area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
- ospf_router_lsa_update_area (area);
- ospf_area_check_free (ospf, area->area_id);
- ospf_schedule_abr_task (ospf);
+ area->shortcut_configured = OSPF_SHORTCUT_DEFAULT;
+ ospf_router_lsa_update_area(area);
+ ospf_area_check_free(ospf, area->area_id);
+ ospf_schedule_abr_task(ospf);
- return 1;
+ return 1;
}
-static int
-ospf_area_vlink_count (struct ospf *ospf, struct ospf_area *area)
+static int ospf_area_vlink_count(struct ospf *ospf, struct ospf_area *area)
{
- struct ospf_vl_data *vl;
- struct listnode *node;
- int count = 0;
+ struct ospf_vl_data *vl;
+ struct listnode *node;
+ int count = 0;
- for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl))
- if (IPV4_ADDR_SAME (&vl->vl_area_id, &area->area_id))
- count++;
+ for (ALL_LIST_ELEMENTS_RO(ospf->vlinks, node, vl))
+ if (IPV4_ADDR_SAME(&vl->vl_area_id, &area->area_id))
+ count++;
- return count;
+ return count;
}
-int
-ospf_area_display_format_set (struct ospf *ospf, struct ospf_area *area, int df)
+int ospf_area_display_format_set(struct ospf *ospf, struct ospf_area *area,
+ int df)
{
- area->area_id_fmt = df;
+ area->area_id_fmt = df;
- return 1;
+ return 1;
}
-int
-ospf_area_stub_set (struct ospf *ospf, struct in_addr area_id)
+int ospf_area_stub_set(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_get (ospf, area_id);
- if (ospf_area_vlink_count (ospf, area))
- return 0;
+ area = ospf_area_get(ospf, area_id);
+ if (ospf_area_vlink_count(ospf, area))
+ return 0;
- if (area->external_routing != OSPF_AREA_STUB)
- ospf_area_type_set (area, OSPF_AREA_STUB);
+ if (area->external_routing != OSPF_AREA_STUB)
+ ospf_area_type_set(area, OSPF_AREA_STUB);
- return 1;
+ return 1;
}
-int
-ospf_area_stub_unset (struct ospf *ospf, struct in_addr area_id)
+int ospf_area_stub_unset(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_lookup_by_area_id (ospf, area_id);
- if (area == NULL)
- return 1;
+ area = ospf_area_lookup_by_area_id(ospf, area_id);
+ if (area == NULL)
+ return 1;
- if (area->external_routing == OSPF_AREA_STUB)
- ospf_area_type_set (area, OSPF_AREA_DEFAULT);
+ if (area->external_routing == OSPF_AREA_STUB)
+ ospf_area_type_set(area, OSPF_AREA_DEFAULT);
- ospf_area_check_free (ospf, area_id);
+ ospf_area_check_free(ospf, area_id);
- return 1;
+ return 1;
}
-int
-ospf_area_no_summary_set (struct ospf *ospf, struct in_addr area_id)
+int ospf_area_no_summary_set(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_get (ospf, area_id);
- area->no_summary = 1;
+ area = ospf_area_get(ospf, area_id);
+ area->no_summary = 1;
- return 1;
+ return 1;
}
-int
-ospf_area_no_summary_unset (struct ospf *ospf, struct in_addr area_id)
+int ospf_area_no_summary_unset(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_lookup_by_area_id (ospf, area_id);
- if (area == NULL)
- return 0;
+ area = ospf_area_lookup_by_area_id(ospf, area_id);
+ if (area == NULL)
+ return 0;
- area->no_summary = 0;
- ospf_area_check_free (ospf, area_id);
+ area->no_summary = 0;
+ ospf_area_check_free(ospf, area_id);
- return 1;
+ return 1;
}
-int
-ospf_area_nssa_set (struct ospf *ospf, struct in_addr area_id)
+int ospf_area_nssa_set(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_get (ospf, area_id);
- if (ospf_area_vlink_count (ospf, area))
- return 0;
+ area = ospf_area_get(ospf, area_id);
+ if (ospf_area_vlink_count(ospf, area))
+ return 0;
- if (area->external_routing != OSPF_AREA_NSSA)
- {
- ospf_area_type_set (area, OSPF_AREA_NSSA);
- ospf->anyNSSA++;
- }
+ if (area->external_routing != OSPF_AREA_NSSA) {
+ ospf_area_type_set(area, OSPF_AREA_NSSA);
+ ospf->anyNSSA++;
+ }
- /* set NSSA area defaults */
- area->no_summary = 0;
- area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
- area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
- area->NSSATranslatorStabilityInterval = OSPF_NSSA_TRANS_STABLE_DEFAULT;
+ /* set NSSA area defaults */
+ area->no_summary = 0;
+ area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
+ area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
+ area->NSSATranslatorStabilityInterval = OSPF_NSSA_TRANS_STABLE_DEFAULT;
- return 1;
+ return 1;
}
-int
-ospf_area_nssa_unset (struct ospf *ospf, struct in_addr area_id)
+int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_lookup_by_area_id (ospf, area_id);
- if (area == NULL)
- return 0;
+ area = ospf_area_lookup_by_area_id(ospf, area_id);
+ if (area == NULL)
+ return 0;
- if (area->external_routing == OSPF_AREA_NSSA)
- {
- ospf->anyNSSA--;
- ospf_area_type_set (area, OSPF_AREA_DEFAULT);
- }
+ if (area->external_routing == OSPF_AREA_NSSA) {
+ ospf->anyNSSA--;
+ ospf_area_type_set(area, OSPF_AREA_DEFAULT);
+ }
- ospf_area_check_free (ospf, area_id);
+ ospf_area_check_free(ospf, area_id);
- return 1;
+ return 1;
}
-int
-ospf_area_nssa_translator_role_set (struct ospf *ospf, struct in_addr area_id,
- int role)
+int ospf_area_nssa_translator_role_set(struct ospf *ospf,
+ struct in_addr area_id, int role)
{
- struct ospf_area *area;
+ struct ospf_area *area;
- area = ospf_area_lookup_by_area_id (ospf, area_id);
- if (area == NULL)
- return 0;
+ area = ospf_area_lookup_by_area_id(ospf, area_id);
+ if (area == NULL)
+ return 0;
- area->NSSATranslatorRole = role;
+ area->NSSATranslatorRole = role;
- return 1;
+ return 1;
}
#if 0
@@ -1526,276 +1460,258 @@ ospf_area_nssa_translator_role_unset (struct ospf *ospf,
}
#endif
-int
-ospf_area_export_list_set (struct ospf *ospf,
- struct ospf_area *area, const char *list_name)
+int ospf_area_export_list_set(struct ospf *ospf, struct ospf_area *area,
+ const char *list_name)
{
- struct access_list *list;
- list = access_list_lookup (AFI_IP, list_name);
+ struct access_list *list;
+ list = access_list_lookup(AFI_IP, list_name);
- EXPORT_LIST (area) = list;
+ EXPORT_LIST(area) = list;
- if (EXPORT_NAME (area))
- free (EXPORT_NAME (area));
+ if (EXPORT_NAME(area))
+ free(EXPORT_NAME(area));
- EXPORT_NAME (area) = strdup (list_name);
- ospf_schedule_abr_task (ospf);
+ EXPORT_NAME(area) = strdup(list_name);
+ ospf_schedule_abr_task(ospf);
- return 1;
+ return 1;
}
-int
-ospf_area_export_list_unset (struct ospf *ospf, struct ospf_area * area)
+int ospf_area_export_list_unset(struct ospf *ospf, struct ospf_area *area)
{
- EXPORT_LIST (area) = 0;
+ EXPORT_LIST(area) = 0;
- if (EXPORT_NAME (area))
- free (EXPORT_NAME (area));
+ if (EXPORT_NAME(area))
+ free(EXPORT_NAME(area));
- EXPORT_NAME (area) = NULL;
+ EXPORT_NAME(area) = NULL;
- ospf_area_check_free (ospf, area->area_id);
-
- ospf_schedule_abr_task (ospf);
+ ospf_area_check_free(ospf, area->area_id);
- return 1;
+ ospf_schedule_abr_task(ospf);
+
+ return 1;
}
-int
-ospf_area_import_list_set (struct ospf *ospf, struct ospf_area *area,
- const char *name)
+int ospf_area_import_list_set(struct ospf *ospf, struct ospf_area *area,
+ const char *name)
{
- struct access_list *list;
- list = access_list_lookup (AFI_IP, name);
+ struct access_list *list;
+ list = access_list_lookup(AFI_IP, name);
- IMPORT_LIST (area) = list;
+ IMPORT_LIST(area) = list;
- if (IMPORT_NAME (area))
- free (IMPORT_NAME (area));
+ if (IMPORT_NAME(area))
+ free(IMPORT_NAME(area));
- IMPORT_NAME (area) = strdup (name);
- ospf_schedule_abr_task (ospf);
+ IMPORT_NAME(area) = strdup(name);
+ ospf_schedule_abr_task(ospf);
- return 1;
+ return 1;
}
-int
-ospf_area_import_list_unset (struct ospf *ospf, struct ospf_area * area)
+int ospf_area_import_list_unset(struct ospf *ospf, struct ospf_area *area)
{
- IMPORT_LIST (area) = 0;
+ IMPORT_LIST(area) = 0;
- if (IMPORT_NAME (area))
- free (IMPORT_NAME (area));
+ if (IMPORT_NAME(area))
+ free(IMPORT_NAME(area));
- IMPORT_NAME (area) = NULL;
- ospf_area_check_free (ospf, area->area_id);
+ IMPORT_NAME(area) = NULL;
+ ospf_area_check_free(ospf, area->area_id);
- ospf_schedule_abr_task (ospf);
+ ospf_schedule_abr_task(ospf);
- return 1;
+ return 1;
}
-int
-ospf_timers_refresh_set (struct ospf *ospf, int interval)
+int ospf_timers_refresh_set(struct ospf *ospf, int interval)
{
- int time_left;
+ int time_left;
- if (ospf->lsa_refresh_interval == interval)
- return 1;
+ if (ospf->lsa_refresh_interval == interval)
+ return 1;
- time_left = ospf->lsa_refresh_interval -
- (monotime(NULL) - ospf->lsa_refresher_started);
-
- if (time_left > interval)
- {
- OSPF_TIMER_OFF (ospf->t_lsa_refresher);
- thread_add_timer(master, ospf_lsa_refresh_walker, ospf, interval,
- &ospf->t_lsa_refresher);
- }
- ospf->lsa_refresh_interval = interval;
+ time_left = ospf->lsa_refresh_interval
+ - (monotime(NULL) - ospf->lsa_refresher_started);
- return 1;
+ if (time_left > interval) {
+ OSPF_TIMER_OFF(ospf->t_lsa_refresher);
+ thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
+ interval, &ospf->t_lsa_refresher);
+ }
+ ospf->lsa_refresh_interval = interval;
+
+ return 1;
}
-int
-ospf_timers_refresh_unset (struct ospf *ospf)
+int ospf_timers_refresh_unset(struct ospf *ospf)
{
- int time_left;
+ int time_left;
- time_left = ospf->lsa_refresh_interval -
- (monotime(NULL) - ospf->lsa_refresher_started);
+ time_left = ospf->lsa_refresh_interval
+ - (monotime(NULL) - ospf->lsa_refresher_started);
- if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
- {
- OSPF_TIMER_OFF (ospf->t_lsa_refresher);
- ospf->t_lsa_refresher = NULL;
- thread_add_timer(master, ospf_lsa_refresh_walker, ospf, OSPF_LSA_REFRESH_INTERVAL_DEFAULT,
- &ospf->t_lsa_refresher);
- }
+ if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT) {
+ OSPF_TIMER_OFF(ospf->t_lsa_refresher);
+ ospf->t_lsa_refresher = NULL;
+ thread_add_timer(master, ospf_lsa_refresh_walker, ospf,
+ OSPF_LSA_REFRESH_INTERVAL_DEFAULT,
+ &ospf->t_lsa_refresher);
+ }
- ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
+ ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
- return 1;
+ return 1;
}
-static struct ospf_nbr_nbma *
-ospf_nbr_nbma_new (void)
+static struct ospf_nbr_nbma *ospf_nbr_nbma_new(void)
{
- struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_nbr_nbma *nbr_nbma;
- nbr_nbma = XCALLOC (MTYPE_OSPF_NEIGHBOR_STATIC,
- sizeof (struct ospf_nbr_nbma));
+ nbr_nbma = XCALLOC(MTYPE_OSPF_NEIGHBOR_STATIC,
+ sizeof(struct ospf_nbr_nbma));
- nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
- nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
+ nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
+ nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
- return nbr_nbma;
+ return nbr_nbma;
}
-static void
-ospf_nbr_nbma_free (struct ospf_nbr_nbma *nbr_nbma)
+static void ospf_nbr_nbma_free(struct ospf_nbr_nbma *nbr_nbma)
{
- XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
+ XFREE(MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);
}
-static void
-ospf_nbr_nbma_delete (struct ospf *ospf, struct ospf_nbr_nbma *nbr_nbma)
+static void ospf_nbr_nbma_delete(struct ospf *ospf,
+ struct ospf_nbr_nbma *nbr_nbma)
{
- struct route_node *rn;
- struct prefix_ipv4 p;
+ struct route_node *rn;
+ struct prefix_ipv4 p;
- p.family = AF_INET;
- p.prefix = nbr_nbma->addr;
- p.prefixlen = IPV4_MAX_BITLEN;
+ p.family = AF_INET;
+ p.prefix = nbr_nbma->addr;
+ p.prefixlen = IPV4_MAX_BITLEN;
- rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
- if (rn)
- {
- ospf_nbr_nbma_free (rn->info);
- rn->info = NULL;
- route_unlock_node (rn);
- route_unlock_node (rn);
- }
+ rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
+ if (rn) {
+ ospf_nbr_nbma_free(rn->info);
+ rn->info = NULL;
+ route_unlock_node(rn);
+ route_unlock_node(rn);
+ }
}
-static void
-ospf_nbr_nbma_down (struct ospf_nbr_nbma *nbr_nbma)
+static void ospf_nbr_nbma_down(struct ospf_nbr_nbma *nbr_nbma)
{
- OSPF_TIMER_OFF (nbr_nbma->t_poll);
+ OSPF_TIMER_OFF(nbr_nbma->t_poll);
- if (nbr_nbma->nbr)
- {
- nbr_nbma->nbr->nbr_nbma = NULL;
- OSPF_NSM_EVENT_EXECUTE (nbr_nbma->nbr, NSM_KillNbr);
- }
+ if (nbr_nbma->nbr) {
+ nbr_nbma->nbr->nbr_nbma = NULL;
+ OSPF_NSM_EVENT_EXECUTE(nbr_nbma->nbr, NSM_KillNbr);
+ }
- if (nbr_nbma->oi)
- listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);
+ if (nbr_nbma->oi)
+ listnode_delete(nbr_nbma->oi->nbr_nbma, nbr_nbma);
}
-static void
-ospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma,
- struct ospf_interface *oi)
+static void ospf_nbr_nbma_add(struct ospf_nbr_nbma *nbr_nbma,
+ struct ospf_interface *oi)
{
- struct ospf_neighbor *nbr;
- struct route_node *rn;
- struct prefix p;
+ struct ospf_neighbor *nbr;
+ struct route_node *rn;
+ struct prefix p;
- if (oi->type != OSPF_IFTYPE_NBMA)
- return;
+ if (oi->type != OSPF_IFTYPE_NBMA)
+ return;
- if (nbr_nbma->nbr != NULL)
- return;
+ if (nbr_nbma->nbr != NULL)
+ return;
- if (IPV4_ADDR_SAME (&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
- return;
-
- nbr_nbma->oi = oi;
- listnode_add (oi->nbr_nbma, nbr_nbma);
+ if (IPV4_ADDR_SAME(&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))
+ return;
- /* Get neighbor information from table. */
- p.family = AF_INET;
- p.prefixlen = IPV4_MAX_BITLEN;
- p.u.prefix4 = nbr_nbma->addr;
+ nbr_nbma->oi = oi;
+ listnode_add(oi->nbr_nbma, nbr_nbma);
- rn = route_node_get (oi->nbrs, (struct prefix *)&p);
- if (rn->info)
- {
- nbr = rn->info;
- nbr->nbr_nbma = nbr_nbma;
- nbr_nbma->nbr = nbr;
+ /* Get neighbor information from table. */
+ p.family = AF_INET;
+ p.prefixlen = IPV4_MAX_BITLEN;
+ p.u.prefix4 = nbr_nbma->addr;
- route_unlock_node (rn);
- }
- else
- {
- nbr = rn->info = ospf_nbr_new (oi);
- nbr->state = NSM_Down;
- nbr->src = nbr_nbma->addr;
- nbr->nbr_nbma = nbr_nbma;
- nbr->priority = nbr_nbma->priority;
- nbr->address = p;
+ rn = route_node_get(oi->nbrs, (struct prefix *)&p);
+ if (rn->info) {
+ nbr = rn->info;
+ nbr->nbr_nbma = nbr_nbma;
+ nbr_nbma->nbr = nbr;
- nbr_nbma->nbr = nbr;
+ route_unlock_node(rn);
+ } else {
+ nbr = rn->info = ospf_nbr_new(oi);
+ nbr->state = NSM_Down;
+ nbr->src = nbr_nbma->addr;
+ nbr->nbr_nbma = nbr_nbma;
+ nbr->priority = nbr_nbma->priority;
+ nbr->address = p;
- OSPF_NSM_EVENT_EXECUTE (nbr, NSM_Start);
- }
+ nbr_nbma->nbr = nbr;
+
+ OSPF_NSM_EVENT_EXECUTE(nbr, NSM_Start);
+ }
}
-void
-ospf_nbr_nbma_if_update (struct ospf *ospf, struct ospf_interface *oi)
+void ospf_nbr_nbma_if_update(struct ospf *ospf, struct ospf_interface *oi)
{
- struct ospf_nbr_nbma *nbr_nbma;
- struct route_node *rn;
- struct prefix_ipv4 p;
+ struct ospf_nbr_nbma *nbr_nbma;
+ struct route_node *rn;
+ struct prefix_ipv4 p;
- if (oi->type != OSPF_IFTYPE_NBMA)
- return;
+ if (oi->type != OSPF_IFTYPE_NBMA)
+ return;
- for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
- if ((nbr_nbma = rn->info))
- if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL)
- {
- p.family = AF_INET;
- p.prefix = nbr_nbma->addr;
- p.prefixlen = IPV4_MAX_BITLEN;
+ for (rn = route_top(ospf->nbr_nbma); rn; rn = route_next(rn))
+ if ((nbr_nbma = rn->info))
+ if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL) {
+ p.family = AF_INET;
+ p.prefix = nbr_nbma->addr;
+ p.prefixlen = IPV4_MAX_BITLEN;
- if (prefix_match (oi->address, (struct prefix *)&p))
- ospf_nbr_nbma_add (nbr_nbma, oi);
- }
+ if (prefix_match(oi->address,
+ (struct prefix *)&p))
+ ospf_nbr_nbma_add(nbr_nbma, oi);
+ }
}
-struct ospf_nbr_nbma *
-ospf_nbr_nbma_lookup (struct ospf *ospf, struct in_addr nbr_addr)
+struct ospf_nbr_nbma *ospf_nbr_nbma_lookup(struct ospf *ospf,
+ struct in_addr nbr_addr)
{
- struct route_node *rn;
- struct prefix_ipv4 p;
+ struct route_node *rn;
+ struct prefix_ipv4 p;
- p.family = AF_INET;
- p.prefix = nbr_addr;
- p.prefixlen = IPV4_MAX_BITLEN;
+ p.family = AF_INET;
+ p.prefix = nbr_addr;
+ p.prefixlen = IPV4_MAX_BITLEN;
- rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);
- if (rn)
- {
- route_unlock_node (rn);
- return rn->info;
- }
- return NULL;
+ rn = route_node_lookup(ospf->nbr_nbma, (struct prefix *)&p);
+ if (rn) {
+ route_unlock_node(rn);
+ return rn->info;
+ }
+ return NULL;
}
-struct ospf_nbr_nbma *
-ospf_nbr_nbma_lookup_next (struct ospf *ospf, struct in_addr *addr, int first)
+struct ospf_nbr_nbma *ospf_nbr_nbma_lookup_next(struct ospf *ospf,
+ struct in_addr *addr, int first)
{
#if 0
struct ospf_nbr_nbma *nbr_nbma;
struct listnode *node;
#endif
- if (ospf == NULL)
- return NULL;
+ if (ospf == NULL)
+ return NULL;
#if 0
for (ALL_LIST_ELEMENTS_RO (ospf->nbr_nbma, node, nbr_nbma))
@@ -1812,138 +1728,127 @@ ospf_nbr_nbma_lookup_next (struct ospf *ospf, struct in_addr *addr, int first)
}
}
#endif
- return NULL;
+ return NULL;
}
-int
-ospf_nbr_nbma_set (struct ospf *ospf, struct in_addr nbr_addr)
+int ospf_nbr_nbma_set(struct ospf *ospf, struct in_addr nbr_addr)
{
- struct ospf_nbr_nbma *nbr_nbma;
- struct ospf_interface *oi;
- struct prefix_ipv4 p;
- struct route_node *rn;
- struct listnode *node;
+ struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_interface *oi;
+ struct prefix_ipv4 p;
+ struct route_node *rn;
+ struct listnode *node;
- nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
- if (nbr_nbma)
- return 0;
+ nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
+ if (nbr_nbma)
+ return 0;
- nbr_nbma = ospf_nbr_nbma_new ();
- nbr_nbma->addr = nbr_addr;
+ nbr_nbma = ospf_nbr_nbma_new();
+ nbr_nbma->addr = nbr_addr;
- p.family = AF_INET;
- p.prefix = nbr_addr;
- p.prefixlen = IPV4_MAX_BITLEN;
+ p.family = AF_INET;
+ p.prefix = nbr_addr;
+ p.prefixlen = IPV4_MAX_BITLEN;
- rn = route_node_get (ospf->nbr_nbma, (struct prefix *)&p);
- if (rn->info)
- route_unlock_node (rn);
- rn->info = nbr_nbma;
+ rn = route_node_get(ospf->nbr_nbma, (struct prefix *)&p);
+ if (rn->info)
+ route_unlock_node(rn);
+ rn->info = nbr_nbma;
- for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
- {
- if (oi->type == OSPF_IFTYPE_NBMA)
- if (prefix_match (oi->address, (struct prefix *)&p))
- {
- ospf_nbr_nbma_add (nbr_nbma, oi);
- break;
- }
- }
+ for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
+ if (oi->type == OSPF_IFTYPE_NBMA)
+ if (prefix_match(oi->address, (struct prefix *)&p)) {
+ ospf_nbr_nbma_add(nbr_nbma, oi);
+ break;
+ }
+ }
- return 1;
+ return 1;
}
-int
-ospf_nbr_nbma_unset (struct ospf *ospf, struct in_addr nbr_addr)
+int ospf_nbr_nbma_unset(struct ospf *ospf, struct in_addr nbr_addr)
{
- struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_nbr_nbma *nbr_nbma;
- nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
- if (nbr_nbma == NULL)
- return 0;
+ nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
+ if (nbr_nbma == NULL)
+ return 0;
- ospf_nbr_nbma_down (nbr_nbma);
- ospf_nbr_nbma_delete (ospf, nbr_nbma);
+ ospf_nbr_nbma_down(nbr_nbma);
+ ospf_nbr_nbma_delete(ospf, nbr_nbma);
- return 1;
+ return 1;
}
-int
-ospf_nbr_nbma_priority_set (struct ospf *ospf, struct in_addr nbr_addr,
- u_char priority)
+int ospf_nbr_nbma_priority_set(struct ospf *ospf, struct in_addr nbr_addr,
+ u_char priority)
{
- struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_nbr_nbma *nbr_nbma;
- nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
- if (nbr_nbma == NULL)
- return 0;
+ nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
+ if (nbr_nbma == NULL)
+ return 0;
- if (nbr_nbma->priority != priority)
- nbr_nbma->priority = priority;
+ if (nbr_nbma->priority != priority)
+ nbr_nbma->priority = priority;
- return 1;
+ return 1;
}
-int
-ospf_nbr_nbma_priority_unset (struct ospf *ospf, struct in_addr nbr_addr)
+int ospf_nbr_nbma_priority_unset(struct ospf *ospf, struct in_addr nbr_addr)
{
- struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_nbr_nbma *nbr_nbma;
- nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
- if (nbr_nbma == NULL)
- return 0;
+ nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
+ if (nbr_nbma == NULL)
+ return 0;
- if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
- nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
+ if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
+ nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
- return 1;
+ return 1;
}
-int
-ospf_nbr_nbma_poll_interval_set (struct ospf *ospf, struct in_addr nbr_addr,
- unsigned int interval)
+int ospf_nbr_nbma_poll_interval_set(struct ospf *ospf, struct in_addr nbr_addr,
+ unsigned int interval)
{
- struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_nbr_nbma *nbr_nbma;
- nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);
- if (nbr_nbma == NULL)
- return 0;
+ nbr_nbma = ospf_nbr_nbma_lookup(ospf, nbr_addr);
+ if (nbr_nbma == NULL)
+ return 0;
- if (nbr_nbma->v_poll != interval)
- {
- nbr_nbma->v_poll = interval;
- if (nbr_nbma->oi && ospf_if_is_up (nbr_nbma->oi))
- {
- OSPF_TIMER_OFF (nbr_nbma->t_poll);
- OSPF_POLL_TIMER_ON (nbr_nbma->t_poll, ospf_poll_timer,
- nbr_nbma->v_poll);
+ if (nbr_nbma->v_poll != interval) {
+ nbr_nbma->v_poll = interval;
+ if (nbr_nbma->oi && ospf_if_is_up(nbr_nbma->oi)) {
+ OSPF_TIMER_OFF(nbr_nbma->t_poll);
+ OSPF_POLL_TIMER_ON(nbr_nbma->t_poll, ospf_poll_timer,
+ nbr_nbma->v_poll);
+ }
}
- }
- return 1;
+ return 1;
}
-int
-ospf_nbr_nbma_poll_interval_unset (struct ospf *ospf, struct in_addr addr)
+int ospf_nbr_nbma_poll_interval_unset(struct ospf *ospf, struct in_addr addr)
{
- struct ospf_nbr_nbma *nbr_nbma;
+ struct ospf_nbr_nbma *nbr_nbma;
- nbr_nbma = ospf_nbr_nbma_lookup (ospf, addr);
- if (nbr_nbma == NULL)
- return 0;
+ nbr_nbma = ospf_nbr_nbma_lookup(ospf, addr);
+ if (nbr_nbma == NULL)
+ return 0;
- if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
- nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
+ if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
+ nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;
- return 1;
+ return 1;
}
-void
-ospf_master_init (struct thread_master *master)
+void ospf_master_init(struct thread_master *master)
{
- memset (&ospf_master, 0, sizeof (struct ospf_master));
+ memset(&ospf_master, 0, sizeof(struct ospf_master));
- om = &ospf_master;
- om->ospf = list_new ();
- om->master = master;
+ om = &ospf_master;
+ om->ospf = list_new();
+ om->master = master;
}