summaryrefslogtreecommitdiff
path: root/ospfd/ospf_flood.c
diff options
context:
space:
mode:
authorpaul <paul>2003-03-25 05:07:42 +0000
committerpaul <paul>2003-03-25 05:07:42 +0000
commit6898008484a562ff5bae178a6fb0bd885fe8b1e5 (patch)
tree27797ca6532ca0ef85f538ac8f3070639e579229 /ospfd/ospf_flood.c
parent1ef74ef70bdab672458c4d1e4cea24197066c0af (diff)
2003-03-25 Paul Jakma <paul@dishone.st>
* sync to latest zebra CVS * spec file: updated and added define for ospf-api/client NB: OSPF-API has been broken by the zebra.org changes, which has added struct ospf * as a new arg to many functions
Diffstat (limited to 'ospfd/ospf_flood.c')
-rw-r--r--ospfd/ospf_flood.c154
1 files changed, 61 insertions, 93 deletions
diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c
index 00a4c644..8c9a4c6c 100644
--- a/ospfd/ospf_flood.c
+++ b/ospfd/ospf_flood.c
@@ -111,7 +111,8 @@ ospf_external_info_check (struct ospf_lsa *lsa)
}
void
-ospf_process_self_originated_lsa (struct ospf_lsa *new, struct ospf_area *area)
+ospf_process_self_originated_lsa (struct ospf *ospf,
+ struct ospf_lsa *new, struct ospf_area *area)
{
struct ospf_interface *oi;
struct external_info *ei;
@@ -148,7 +149,7 @@ ospf_process_self_originated_lsa (struct ospf_lsa *new, struct ospf_area *area)
/* Look through all interfaces, not just area, since interface
could be moved from one area to another. */
- for (node = listhead (ospf_top->oiflist); node; nextnode (node))
+ for (node = listhead (ospf->oiflist); node; nextnode (node))
/* These are sanity check. */
if ((oi = getdata (node)) != NULL)
if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &new->data->id))
@@ -179,7 +180,7 @@ ospf_process_self_originated_lsa (struct ospf_lsa *new, struct ospf_area *area)
break;
case OSPF_SUMMARY_LSA:
case OSPF_ASBR_SUMMARY_LSA:
- ospf_schedule_abr_task ();
+ ospf_schedule_abr_task (ospf);
break;
case OSPF_AS_EXTERNAL_LSA :
#ifdef HAVE_NSSA
@@ -187,9 +188,9 @@ ospf_process_self_originated_lsa (struct ospf_lsa *new, struct ospf_area *area)
#endif /* HAVE_NSSA */
ei = ospf_external_info_check (new);
if (ei)
- ospf_external_lsa_refresh (new, ei, LSA_REFRESH_FORCE);
+ ospf_external_lsa_refresh (ospf, new, ei, LSA_REFRESH_FORCE);
else
- ospf_lsa_flush_as (new);
+ ospf_lsa_flush_as (ospf, new);
break;
#ifdef HAVE_OPAQUE_LSA
case OSPF_OPAQUE_AREA_LSA:
@@ -229,8 +230,8 @@ ospf_process_self_originated_lsa (struct ospf_lsa *new, struct ospf_area *area)
ABRs calculate external routes from Type-5's and non-self Type-7s
*/
int
-ospf_flood (struct ospf_neighbor *nbr, struct ospf_lsa *current,
- struct ospf_lsa *new)
+ospf_flood (struct ospf *ospf, struct ospf_neighbor *nbr,
+ struct ospf_lsa *current, struct ospf_lsa *new)
{
struct ospf_interface *oi;
struct timeval now;
@@ -281,7 +282,7 @@ ospf_flood (struct ospf_neighbor *nbr, struct ospf_lsa *current,
DR and the LSA was received from a router other than the
Backup DR) the LSA will be flooded back out the receiving
interface. */
- lsa_ack_flag = ospf_flood_through (nbr, new);
+ lsa_ack_flag = ospf_flood_through (ospf, nbr, new);
#ifdef HAVE_OPAQUE_LSA
/* Remove the current database copy from all neighbors' Link state
@@ -302,17 +303,17 @@ ospf_flood (struct ospf_neighbor *nbr, struct ospf_lsa *current,
#ifdef HAVE_OPAQUE_LSA
case OSPF_OPAQUE_AS_LSA:
#endif /* HAVE_OPAQUE_LSA */
- ospf_ls_retransmit_delete_nbr_all (NULL, current);
+ ospf_ls_retransmit_delete_nbr_as (ospf, current);
break;
default:
- ospf_ls_retransmit_delete_nbr_all (nbr->oi->area, current);
+ ospf_ls_retransmit_delete_nbr_area (nbr->oi->area, current);
break;
}
}
/* Do some internal house keeping that is needed here */
SET_FLAG (new->flags, OSPF_LSA_RECEIVED);
- ospf_lsa_is_self_originated (new); /* Let it set the flag */
+ ospf_lsa_is_self_originated (ospf, new); /* Let it set the flag */
/* Install the new LSA in the link state database
(replacing the current database copy). This may cause the
@@ -321,15 +322,7 @@ ospf_flood (struct ospf_neighbor *nbr, struct ospf_lsa *current,
procedure cannot overwrite the newly installed LSA until
MinLSArrival seconds have elapsed. */
- new = ospf_lsa_install (nbr->oi, new);
-
-#ifdef HAVE_NSSA
- if (IS_DEBUG_OSPF_NSSA)
- zlog_info ("LSA[Flooding]: Type-%d installed", new->data->type);
-
- /* if (new->data->type == OSPF_AS_NSSA_LSA )
- return 0; */
-#endif /* HAVE_NSSA */
+ new = ospf_lsa_install (ospf, nbr->oi, new);
/* Acknowledge the receipt of the LSA by sending a Link State
Acknowledgment packet back out the receiving interface. */
@@ -340,11 +333,11 @@ ospf_flood (struct ospf_neighbor *nbr, struct ospf_lsa *current,
receiving router itself, the router must take special action,
either updating the LSA or in some cases flushing it from
the routing domain. */
- if (ospf_lsa_is_self_originated (new))
- ospf_process_self_originated_lsa (new, oi->area);
+ if (ospf_lsa_is_self_originated (ospf, new))
+ ospf_process_self_originated_lsa (ospf, new, oi->area);
else
/* Update statistics value for OSPF-MIB. */
- ospf_top->rx_lsa_count++;
+ ospf->rx_lsa_count++;
return 0;
}
@@ -355,6 +348,7 @@ ospf_flood_through_interface (struct ospf_interface *oi,
struct ospf_neighbor *inbr,
struct ospf_lsa *lsa)
{
+ struct ospf *ospf = oi->ospf;
struct ospf_neighbor *onbr;
struct route_node *rn;
int retx_flag;
@@ -440,7 +434,7 @@ ospf_flood_through_interface (struct ospf_interface *oi,
continue;
}
- if (IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf_top->opaque)
+ if (IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque)
&& IS_LSA_SELF (lsa)
&& onbr->state == NSM_Full)
{
@@ -579,8 +573,8 @@ ospf_flood_through_interface (struct ospf_interface *oi,
}
int
-ospf_flood_through_area (struct ospf_area * area,struct ospf_neighbor *inbr,
- struct ospf_lsa *lsa)
+ospf_flood_through_area (struct ospf_area *area,
+ struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
{
listnode node;
int lsa_ack_flag = 0;
@@ -618,7 +612,8 @@ ospf_flood_through_area (struct ospf_area * area,struct ospf_neighbor *inbr,
}
int
-ospf_flood_through_as (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
+ospf_flood_through_as (struct ospf *ospf, struct ospf_neighbor *inbr,
+ struct ospf_lsa *lsa)
{
listnode node;
int lsa_ack_flag;
@@ -643,7 +638,7 @@ ospf_flood_through_as (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
zlog_info ("Flood/AS: NSSA TRANSLATED LSA");
#endif /* HAVE_NSSA */
- for (node = listhead (ospf_top->areas); node; nextnode (node))
+ for (node = listhead (ospf->areas); node; nextnode (node))
{
int continue_flag = 0;
struct ospf_area *area = getdata (node);
@@ -659,13 +654,12 @@ ospf_flood_through_as (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
case OSPF_AREA_NSSA: /* Sending Type 5 or 7 into NSSA area */
#ifdef HAVE_NSSA
/* Type-7, flood NSSA area */
- if (lsa->data->type == OSPF_AS_NSSA_LSA &&
- area == lsa->area) {
+ if (lsa->data->type == OSPF_AS_NSSA_LSA
+ && area == lsa->area)
/* We will send it. */
continue_flag = 0;
- } else {
+ else
continue_flag = 1; /* Skip this NSSA area for Type-5's et al */
- }
break;
#endif /* HAVE_NSSA */
@@ -707,7 +701,8 @@ ospf_flood_through_as (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
}
int
-ospf_flood_through (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
+ospf_flood_through (struct ospf *ospf,
+ struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
{
int lsa_ack_flag = 0;
@@ -736,7 +731,7 @@ ospf_flood_through (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
#ifdef HAVE_OPAQUE_LSA
case OSPF_OPAQUE_AS_LSA:
#endif /* HAVE_OPAQUE_LSA */
- lsa_ack_flag = ospf_flood_through_as (inbr, lsa);
+ lsa_ack_flag = ospf_flood_through_as (ospf, inbr, lsa);
break;
#ifdef HAVE_NSSA
/* Type-7 Only received within NSSA, then flooded */
@@ -770,7 +765,7 @@ ospf_flood_through (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
#ifdef HAVE_OPAQUE_LSA
case OSPF_OPAQUE_AS_LSA:
#endif /* HAVE_OPAQUE_LSA */
- lsa_ack_flag = ospf_flood_through_as (inbr, lsa);
+ lsa_ack_flag = ospf_flood_through_as (ospf, inbr, lsa);
break;
#ifdef HAVE_NSSA
/* Type-7 Only received within NSSA, then flooded */
@@ -964,62 +959,44 @@ ospf_ls_retransmit_lookup (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
return ospf_lsdb_lookup (&nbr->ls_rxmt, lsa);
}
-/* Remove All neighbor/interface's Link State Retransmit list in area. */
void
-ospf_ls_retransmit_delete_nbr_all (struct ospf_area *area,
- struct ospf_lsa *lsa)
+ospf_ls_retransmit_delete_nbr_if (struct ospf_interface *oi,
+ struct ospf_lsa *lsa)
{
- listnode node;
- list oiflist = area ? area->oiflist : ospf_top->oiflist;
-
- for (node = listhead (oiflist); node; nextnode (node))
- {
- struct ospf_interface *oi = getdata (node);
- struct route_node *rn;
- struct ospf_neighbor *nbr;
- struct ospf_lsa *lsr;
-
- if (ospf_if_is_enable (oi))
- for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
- /* If LSA find in LS-retransmit list, then remove it. */
- if ((nbr = rn->info) != NULL)
- {
- lsr = ospf_ls_retransmit_lookup (nbr, lsa);
+ struct route_node *rn;
+ struct ospf_neighbor *nbr;
+ struct ospf_lsa *lsr;
+
+ if (ospf_if_is_enable (oi))
+ for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
+ /* If LSA find in LS-retransmit list, then remove it. */
+ if ((nbr = rn->info) != NULL)
+ {
+ lsr = ospf_ls_retransmit_lookup (nbr, lsa);
- /* If LSA find in ls-retransmit list, remove it. */
- if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum)
- ospf_ls_retransmit_delete (nbr, lsr);
- }
- }
+ /* If LSA find in ls-retransmit list, remove it. */
+ if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum)
+ ospf_ls_retransmit_delete (nbr, lsr);
+ }
}
-/* Add LSA to the current database copy of all neighbors'
- Link state retransmission lists. */
void
-ospf_ls_retransmit_add_nbr_all (struct ospf_interface *ospfi,
- struct ospf_lsa *lsa)
+ospf_ls_retransmit_delete_nbr_area (struct ospf_area *area,
+ struct ospf_lsa *lsa)
{
listnode node;
- for (node = listhead (ospf_top->oiflist); node; nextnode (node))
- {
- struct ospf_interface *oi = getdata (node);
- struct route_node *rn;
- struct ospf_neighbor *nbr;
- struct ospf_lsa *old;
+ for (node = listhead (area->oiflist); node; nextnode (node))
+ ospf_ls_retransmit_delete_nbr_if (getdata (node), lsa);
+}
- if (ospf_if_is_enable (oi))
- if (OSPF_AREA_SAME (&ospfi->area, &oi->area))
- for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
- if ((nbr = rn->info) != NULL)
- if (nbr->state == NSM_Full)
- {
- if ((old = ospf_ls_retransmit_lookup (nbr, lsa)))
- ospf_ls_retransmit_delete (nbr, old);
+void
+ospf_ls_retransmit_delete_nbr_as (struct ospf *ospf, struct ospf_lsa *lsa)
+{
+ listnode node;
- ospf_ls_retransmit_add (nbr, lsa);
- }
- }
+ for (node = listhead (ospf->oiflist); node; nextnode (node))
+ ospf_ls_retransmit_delete_nbr_if (getdata (node), lsa);
}
@@ -1031,22 +1008,13 @@ ospf_lsa_flush_area (struct ospf_lsa *lsa, struct ospf_area *area)
{
lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
ospf_flood_through_area (area, NULL, lsa);
- ospf_lsa_maxage (lsa);
-}
-
-void
-ospf_lsa_flush_as (struct ospf_lsa *lsa)
-{
- lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
- ospf_flood_through_as (NULL, lsa);
- ospf_lsa_maxage (lsa);
+ ospf_lsa_maxage (area->ospf, lsa);
}
-/* Flush LSA through AS -- used for AS-external-LSAs. */
void
-ospf_flush_through_as (struct ospf_lsa *lsa)
+ospf_lsa_flush_as (struct ospf *ospf, struct ospf_lsa *lsa)
{
lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
- ospf_flood_through_as (NULL, lsa);
- ospf_lsa_maxage (lsa);
+ ospf_flood_through_as (ospf, NULL, lsa);
+ ospf_lsa_maxage (ospf, lsa);
}