mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-09 11:05:04 +00:00
ospf6d: handle seqnum wrapping
Signed-off-by: Shrijeet Mukherjee <shm at cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt at cumulusnetworks.com> [DL: mechanical adjust to rebase] [DL: adjust to removal of timerwheel code] Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
f41b4a0216
commit
3b220289a4
@ -230,6 +230,25 @@ ospf6_install_lsa (struct ospf6_lsa *lsa)
|
|||||||
else
|
else
|
||||||
lsa->expire = NULL;
|
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 */
|
/* actually install */
|
||||||
lsa->installed = now;
|
lsa->installed = now;
|
||||||
ospf6_lsdb_add (lsa, lsa->lsdb);
|
ospf6_lsdb_add (lsa, lsa->lsdb);
|
||||||
|
@ -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_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_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_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
|
struct ospf6_lsa
|
||||||
{
|
{
|
||||||
@ -139,6 +141,7 @@ struct ospf6_lsa
|
|||||||
#define OSPF6_LSA_FLOODBACK 0x02
|
#define OSPF6_LSA_FLOODBACK 0x02
|
||||||
#define OSPF6_LSA_DUPLICATE 0x04
|
#define OSPF6_LSA_DUPLICATE 0x04
|
||||||
#define OSPF6_LSA_IMPLIEDACK 0x08
|
#define OSPF6_LSA_IMPLIEDACK 0x08
|
||||||
|
#define OSPF6_LSA_SEQWRAPPED 0x20
|
||||||
|
|
||||||
struct ospf6_lsa_handler
|
struct ospf6_lsa_handler
|
||||||
{
|
{
|
||||||
|
@ -465,7 +465,18 @@ ospf6_lsdb_maxage_remover (struct ospf6_lsdb *lsdb)
|
|||||||
}
|
}
|
||||||
if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))
|
if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))
|
||||||
zlog_debug ("Remove MaxAge %s", lsa->name);
|
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);
|
return (reschedule);
|
||||||
|
Loading…
Reference in New Issue
Block a user