summaryrefslogtreecommitdiffstats
path: root/ospf6d
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d')
-rw-r--r--ospf6d/ospf6_flood.c19
-rw-r--r--ospf6d/ospf6_lsa.h3
-rw-r--r--ospf6d/ospf6_lsdb.c13
3 files changed, 34 insertions, 1 deletions
diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c
index e02a432f..7f6b2850 100644
--- a/ospf6d/ospf6_flood.c
+++ b/ospf6d/ospf6_flood.c
@@ -230,6 +230,25 @@ ospf6_install_lsa (struct ospf6_lsa *lsa)
else
lsa->expire = NULL;
+ if (OSPF6_LSA_IS_SEQWRAP(lsa) &&
+ ! (CHECK_FLAG(lsa->flag,OSPF6_LSA_SEQWRAPPED) &&
+ lsa->header->seqnum == htonl(OSPF_MAX_SEQUENCE_NUMBER)))
+ {
+ if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
+ zlog_debug("lsa install wrapping: sequence 0x%x",
+ ntohl(lsa->header->seqnum));
+ SET_FLAG(lsa->flag, OSPF6_LSA_SEQWRAPPED);
+ /* in lieu of premature_aging, since we do not want to recreate this lsa
+ * and/or mess with timers etc, we just want to wrap the sequence number
+ * and reflood the lsa before continuing.
+ * NOTE: Flood needs to be called right after this function call, by the
+ * caller
+ */
+ lsa->header->seqnum = htonl (OSPF_MAX_SEQUENCE_NUMBER);
+ lsa->header->age = htons (OSPF_LSA_MAXAGE);
+ ospf6_lsa_checksum (lsa->header);
+ }
+
/* actually install */
lsa->installed = now;
ospf6_lsdb_add (lsa, lsa->lsdb);
diff --git a/ospf6d/ospf6_lsa.h b/ospf6d/ospf6_lsa.h
index 998599ba..ffd6ae0a 100644
--- a/ospf6d/ospf6_lsa.h
+++ b/ospf6d/ospf6_lsa.h
@@ -109,6 +109,8 @@ struct ospf6_lsa_header
#define OSPF6_LSA_IS_DIFFER(L1, L2) ospf6_lsa_is_differ (L1, L2)
#define OSPF6_LSA_IS_MAXAGE(L) (ospf6_lsa_age_current (L) == OSPF_LSA_MAXAGE)
#define OSPF6_LSA_IS_CHANGED(L1, L2) ospf6_lsa_is_changed (L1, L2)
+#define OSPF6_LSA_IS_SEQWRAP(L) ((L)->header->seqnum == htonl(OSPF_MAX_SEQUENCE_NUMBER + 1))
+
struct ospf6_lsa
{
@@ -139,6 +141,7 @@ struct ospf6_lsa
#define OSPF6_LSA_FLOODBACK 0x02
#define OSPF6_LSA_DUPLICATE 0x04
#define OSPF6_LSA_IMPLIEDACK 0x08
+#define OSPF6_LSA_SEQWRAPPED 0x20
struct ospf6_lsa_handler
{
diff --git a/ospf6d/ospf6_lsdb.c b/ospf6d/ospf6_lsdb.c
index b13ae9b1..5138d1c1 100644
--- a/ospf6d/ospf6_lsdb.c
+++ b/ospf6d/ospf6_lsdb.c
@@ -465,7 +465,18 @@ ospf6_lsdb_maxage_remover (struct ospf6_lsdb *lsdb)
}
if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))
zlog_debug ("Remove MaxAge %s", lsa->name);
- ospf6_lsdb_remove (lsa, lsdb);
+ if (CHECK_FLAG(lsa->flag, OSPF6_LSA_SEQWRAPPED))
+ {
+ UNSET_FLAG(lsa->flag, OSPF6_LSA_SEQWRAPPED);
+ /*
+ * lsa->header->age = 0;
+ */
+ lsa->header->seqnum = htonl(OSPF_MAX_SEQUENCE_NUMBER + 1);
+ ospf6_lsa_checksum (lsa->header);
+ thread_execute (master, ospf6_lsa_refresh, lsa, 0);
+ } else {
+ ospf6_lsdb_remove (lsa, lsdb);
+ }
}
return (reschedule);