summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_flood.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_flood.c')
-rw-r--r--ospf6d/ospf6_flood.c35
1 files changed, 15 insertions, 20 deletions
diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c
index 186eac35a5..6e00bd766f 100644
--- a/ospf6d/ospf6_flood.c
+++ b/ospf6d/ospf6_flood.c
@@ -266,10 +266,14 @@ void ospf6_decrement_retrans_count(struct ospf6_lsa *lsa)
/* RFC2328 section 13.2 Installing LSAs in the database */
void ospf6_install_lsa(struct ospf6_lsa *lsa)
{
+ struct ospf6 *ospf6;
struct timeval now;
struct ospf6_lsa *old;
struct ospf6_area *area = NULL;
+ ospf6 = ospf6_get_by_lsdb(lsa);
+ assert(ospf6);
+
/* Remove the old instance from all neighbors' Link state
retransmission list (RFC2328 13.2 last paragraph) */
old = ospf6_lsdb_lookup(lsa->header->type, lsa->header->id,
@@ -288,7 +292,6 @@ void ospf6_install_lsa(struct ospf6_lsa *lsa)
monotime(&now);
if (!OSPF6_LSA_IS_MAXAGE(lsa)) {
- lsa->expire = NULL;
thread_add_timer(master, ospf6_lsa_expire, lsa,
OSPF_LSA_MAXAGE + lsa->birth.tv_sec
- now.tv_sec,
@@ -331,20 +334,14 @@ void ospf6_install_lsa(struct ospf6_lsa *lsa)
&& !CHECK_FLAG(lsa->flag, OSPF6_LSA_DUPLICATE)) {
/* check if it is new lsa ? or existing lsa got modified ?*/
- if (!old || OSPF6_LSA_IS_CHANGED(old, lsa)) {
- struct ospf6 *ospf6;
-
- ospf6 = ospf6_get_by_lsdb(lsa);
-
- assert(ospf6);
-
+ if (!old || OSPF6_LSA_IS_CHANGED(old, lsa))
ospf6_helper_handle_topo_chg(ospf6, lsa);
- }
}
ospf6_lsdb_add(lsa, lsa->lsdb);
- if (ntohs(lsa->header->type) == OSPF6_LSTYPE_TYPE_7) {
+ if (ntohs(lsa->header->type) == OSPF6_LSTYPE_TYPE_7
+ && lsa->header->adv_router != ospf6->router_id) {
area = OSPF6_AREA(lsa->lsdb->data);
ospf6_translated_nssa_refresh(area, lsa, NULL);
ospf6_schedule_abr_task(area->ospf6);
@@ -547,7 +544,6 @@ void ospf6_flood_interface(struct ospf6_neighbor *from, struct ospf6_lsa *lsa,
/* reschedule retransmissions to all neighbors */
for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on)) {
THREAD_OFF(on->thread_send_lsupdate);
- on->thread_send_lsupdate = NULL;
thread_add_event(master, ospf6_lsupdate_send_neighbor,
on, 0, &on->thread_send_lsupdate);
}
@@ -1028,15 +1024,8 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
if (old)
ospf6_flood_clear(old);
- /* (b) immediately flood and (c) remove from all retrans-list */
- /* Prevent self-originated LSA to be flooded. this is to make
- reoriginated instance of the LSA not to be rejected by other
- routers
- due to MinLSArrival. */
self_originated = (new->header->adv_router
== from->ospf6_if->area->ospf6->router_id);
- if (!self_originated)
- ospf6_flood(from, new);
/* Received non-self-originated Grace LSA. */
if (IS_GRACE_LSA(new) && !self_originated) {
@@ -1082,6 +1071,14 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
}
}
+ /* (b) immediately flood and (c) remove from all retrans-list */
+ /* Prevent self-originated LSA to be flooded. this is to make
+ * reoriginated instance of the LSA not to be rejected by other
+ * routers due to MinLSArrival.
+ */
+ if (!self_originated)
+ ospf6_flood(from, new);
+
/* (d), installing lsdb, which may cause routing
table calculation (replacing database copy) */
ospf6_install_lsa(new);
@@ -1113,7 +1110,6 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
"Newer instance of the self-originated LSA");
zlog_debug("Schedule reorigination");
}
- new->refresh = NULL;
thread_add_event(master, ospf6_lsa_refresh, new, 0,
&new->refresh);
}
@@ -1239,7 +1235,6 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
ospf6_lsa_delete(new);
return;
}
- return;
}
}