summaryrefslogtreecommitdiff
path: root/ospfd/ospf_nsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_nsm.c')
-rw-r--r--ospfd/ospf_nsm.c118
1 files changed, 48 insertions, 70 deletions
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index 57303570..a8efdcc1 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -222,13 +222,8 @@ ospf_db_summary_isempty (struct ospf_neighbor *nbr)
}
int
-ospf_db_summary_add (struct ospf_lsa *lsa, void *v, int i)
+ospf_db_summary_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
{
- struct ospf_neighbor *nbr = (struct ospf_neighbor *) v;
-
- if (lsa == NULL)
- return 0;
-
#ifdef HAVE_OPAQUE_LSA
switch (lsa->data->type)
{
@@ -283,73 +278,58 @@ ospf_db_summary_clear (struct ospf_neighbor *nbr)
-#ifdef HAVE_OPAQUE_LSA
-/* The area link state database consists of the router-LSAs,
- network-LSAs, summary-LSAs, and type-9/10 opaque-LSAs contained
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- in the area structure, along with the AS-external and type-11
- ^^^^^^^^^^^
- opaque LSAs contained in the global structure.
- ^^^^^^
- AS-external and type-11 opaque LSAs are omitted from a virtual
- ^^^^^^^^^^^^^^^^^^
- neighbor's Database summary list. AS-external and type-11 opaque
- ^^^^^^^^^^^^^^^^^^
- LSAs are omitted from the Database summary list if the area has
- been configured as a stub. */
-#else /* HAVE_OPAQUE_LSA */
/* The area link state database consists of the router-LSAs,
network-LSAs and summary-LSAs contained in the area structure,
- along with the AS-external- LSAs contained in the global structure.
- AS- external-LSAs are omitted from a virtual neighbor's Database
+ along with the AS-external-LSAs contained in the global structure.
+ AS-external-LSAs are omitted from a virtual neighbor's Database
summary list. AS-external-LSAs are omitted from the Database
summary list if the area has been configured as a stub. */
-#endif /* HAVE_OPAQUE_LSA */
int
nsm_negotiation_done (struct ospf_neighbor *nbr)
{
- struct ospf_area *area;
-
- area = nbr->oi->area;
+ struct ospf_area *area = nbr->oi->area;
+ struct ospf_lsa *lsa;
+ struct route_node *rn;
+
+ LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
+ LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
+ LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
+ LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
- foreach_lsa (ROUTER_LSDB (area), nbr, 0, ospf_db_summary_add);
- foreach_lsa (NETWORK_LSDB (area), nbr, 0, ospf_db_summary_add);
- foreach_lsa (SUMMARY_LSDB (area), nbr, 0, ospf_db_summary_add);
- foreach_lsa (ASBR_SUMMARY_LSDB (area), nbr, 0, ospf_db_summary_add);
-
#ifdef HAVE_OPAQUE_LSA
/* Process only if the neighbor is opaque capable. */
if (CHECK_FLAG (nbr->options, OSPF_OPTION_O))
{
- foreach_lsa (OPAQUE_LINK_LSDB (area), nbr, 0, ospf_db_summary_add);
- foreach_lsa (OPAQUE_AREA_LSDB (area), nbr, 0, ospf_db_summary_add);
+ LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
+ LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
}
#endif /* HAVE_OPAQUE_LSA */
- if (nbr->oi->type != OSPF_IFTYPE_VIRTUALLINK &&
- area->external_routing == OSPF_AREA_DEFAULT)
- foreach_lsa (EXTERNAL_LSDB (ospf_top), nbr, 0, ospf_db_summary_add);
+ if (nbr->oi->type != OSPF_IFTYPE_VIRTUALLINK
+ && area->external_routing == OSPF_AREA_DEFAULT)
+ LSDB_LOOP (EXTERNAL_LSDB (nbr->oi->ospf), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
#ifdef HAVE_OPAQUE_LSA
- if (CHECK_FLAG (nbr->options, OSPF_OPTION_O) &&
- (nbr->oi->type != OSPF_IFTYPE_VIRTUALLINK &&
- area->external_routing == OSPF_AREA_DEFAULT))
- foreach_lsa (OPAQUE_AS_LSDB (ospf_top),
- nbr, 0, ospf_db_summary_add);
+ if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)
+ && (nbr->oi->type != OSPF_IFTYPE_VIRTUALLINK
+ && area->external_routing == OSPF_AREA_DEFAULT))
+ LSDB_LOOP (OPAQUE_AS_LSDB (nbr->oi->ospf), rn, lsa)
+ ospf_db_summary_add (nbr, lsa);
#endif /* HAVE_OPAQUE_LSA */
- /* OSPF_NSM_TIMER_OFF (nbr->t_db_desc); */
-
return 0;
}
int
nsm_exchange_done (struct ospf_neighbor *nbr)
{
- struct ospf_interface *oi;
-
- oi = nbr->oi;
-
if (ospf_ls_request_isempty (nbr))
return NSM_Full;
@@ -382,18 +362,18 @@ nsm_adj_ok (struct ospf_neighbor *nbr)
next_state = nbr->state;
/* These netowork types must be adjacency. */
- if (oi->type == OSPF_IFTYPE_POINTOPOINT ||
- oi->type == OSPF_IFTYPE_POINTOMULTIPOINT ||
- oi->type == OSPF_IFTYPE_VIRTUALLINK)
+ if (oi->type == OSPF_IFTYPE_POINTOPOINT
+ || oi->type == OSPF_IFTYPE_POINTOMULTIPOINT
+ || oi->type == OSPF_IFTYPE_VIRTUALLINK)
flag = 1;
/* Router itself is the DRouter or the BDRouter. */
- if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi)) ||
- IPV4_ADDR_SAME (&oi->address->u.prefix4, &BDR (oi)))
+ if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi))
+ || IPV4_ADDR_SAME (&oi->address->u.prefix4, &BDR (oi)))
flag = 1;
- if (IPV4_ADDR_SAME (&nbr->address.u.prefix4, &DR (oi)) ||
- IPV4_ADDR_SAME (&nbr->address.u.prefix4, &BDR (oi)))
+ if (IPV4_ADDR_SAME (&nbr->address.u.prefix4, &DR (oi))
+ || IPV4_ADDR_SAME (&nbr->address.u.prefix4, &BDR (oi)))
flag = 1;
if (nbr->state == NSM_TwoWay && flag == 1)
@@ -683,7 +663,7 @@ static char *ospf_nsm_event_str[] =
void
nsm_change_state (struct ospf_neighbor *nbr, int state)
{
- struct ospf_interface *oi;
+ struct ospf_interface *oi = nbr->oi;
struct ospf_area *vl_area = NULL;
u_char old_state;
int x;
@@ -705,10 +685,8 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
/* Statistics. */
nbr->state_change++;
- oi = nbr->oi;
-
if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
- vl_area = ospf_area_lookup_by_area_id (oi->vl_data->vl_area_id);
+ vl_area = ospf_area_lookup_by_area_id (oi->ospf, oi->vl_data->vl_area_id);
/* One of the neighboring routers changes to/from the FULL state. */
if ((old_state != NSM_Full && state == NSM_Full) ||
@@ -719,31 +697,31 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
oi->full_nbrs++;
oi->area->full_nbrs++;
- ospf_check_abr_status ();
+ ospf_check_abr_status (oi->ospf);
if (oi->type == OSPF_IFTYPE_VIRTUALLINK && vl_area)
if (++vl_area->full_vls == 1)
- ospf_schedule_abr_task ();
+ ospf_schedule_abr_task (oi->ospf);
/* kevinm: refresh any redistributions */
- for (x = ZEBRA_ROUTE_SYSTEM; x < ZEBRA_ROUTE_MAX; x++) {
- if (x == ZEBRA_ROUTE_OSPF || x == ZEBRA_ROUTE_OSPF6)
- continue;
- ospf_external_lsa_refresh_type(x, force);
- }
-
+ for (x = ZEBRA_ROUTE_SYSTEM; x < ZEBRA_ROUTE_MAX; x++)
+ {
+ if (x == ZEBRA_ROUTE_OSPF || x == ZEBRA_ROUTE_OSPF6)
+ continue;
+ ospf_external_lsa_refresh_type (oi->ospf, x, force);
+ }
}
else
{
oi->full_nbrs--;
oi->area->full_nbrs--;
- ospf_check_abr_status ();
+ ospf_check_abr_status (oi->ospf);
if (oi->type == OSPF_IFTYPE_VIRTUALLINK && vl_area)
if (vl_area->full_vls > 0)
if (--vl_area->full_vls == 0)
- ospf_schedule_abr_task ();
+ ospf_schedule_abr_task (oi->ospf);
/* clear neighbor retransmit list */
if (!ospf_ls_retransmit_isempty (nbr))
@@ -758,7 +736,7 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
{
struct ospf_area *vl_area =
- ospf_area_lookup_by_area_id (oi->vl_data->vl_area_id);
+ ospf_area_lookup_by_area_id (oi->ospf, oi->vl_data->vl_area_id);
if (vl_area)
ospf_router_lsa_timer_add (vl_area);