mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 15:06:58 +00:00
isisd: handle lsp confusion (ISO/IEC 10589:2002 7.3.16.2)
Signed-off-by: Christian Franke <chris@opensourcerouting.org> Acked-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
8c8829a620
commit
0250758d15
@ -273,7 +273,19 @@ lsp_compare (char *areatag, struct isis_lsp *lsp, u_int32_t seq_num,
|
|||||||
return LSP_EQUAL;
|
return LSP_EQUAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntohl (seq_num) >= ntohl (lsp->lsp_header->seq_num))
|
/*
|
||||||
|
* LSPs with identical checksums should only be treated as newer if:
|
||||||
|
* a) The current LSP has a remaining lifetime != 0 and the other LSP has a
|
||||||
|
* remaining lifetime == 0. In this case, we should participate in the purge
|
||||||
|
* and should not treat the current LSP with remaining lifetime == 0 as older.
|
||||||
|
* b) The LSP has an incorrect checksum. In this case, we need to react as given
|
||||||
|
* in 7.3.16.2.
|
||||||
|
*/
|
||||||
|
if (ntohl (seq_num) > ntohl (lsp->lsp_header->seq_num)
|
||||||
|
|| (ntohl(seq_num) == ntohl(lsp->lsp_header->seq_num)
|
||||||
|
&& ( (lsp->lsp_header->rem_lifetime != 0
|
||||||
|
&& rem_lifetime == 0)
|
||||||
|
|| lsp->lsp_header->checksum != checksum)))
|
||||||
{
|
{
|
||||||
if (isis->debugs & DEBUG_SNP_PACKETS)
|
if (isis->debugs & DEBUG_SNP_PACKETS)
|
||||||
{
|
{
|
||||||
|
@ -1281,6 +1281,7 @@ process_lsp (int level, struct isis_circuit *circuit, const u_char *ssnpa)
|
|||||||
u_char lspid[ISIS_SYS_ID_LEN + 2];
|
u_char lspid[ISIS_SYS_ID_LEN + 2];
|
||||||
struct isis_passwd *passwd;
|
struct isis_passwd *passwd;
|
||||||
uint16_t pdu_len;
|
uint16_t pdu_len;
|
||||||
|
int lsp_confusion;
|
||||||
|
|
||||||
if (isis->debugs & DEBUG_UPDATE_PACKETS)
|
if (isis->debugs & DEBUG_UPDATE_PACKETS)
|
||||||
{
|
{
|
||||||
@ -1455,6 +1456,21 @@ dontcheckadj:
|
|||||||
|
|
||||||
/* 7.3.15.1 a) 9 - OriginatingLSPBufferSize - not implemented FIXME: do it */
|
/* 7.3.15.1 a) 9 - OriginatingLSPBufferSize - not implemented FIXME: do it */
|
||||||
|
|
||||||
|
/* 7.3.16.2 - If this is an LSP from another IS with identical seq_num but
|
||||||
|
* wrong checksum, initiate a purge. */
|
||||||
|
if (lsp
|
||||||
|
&& (lsp->lsp_header->seq_num == hdr->seq_num)
|
||||||
|
&& (lsp->lsp_header->checksum != hdr->checksum))
|
||||||
|
{
|
||||||
|
zlog_warn("ISIS-Upd (%s): LSP %s seq 0x%08x with confused checksum received.",
|
||||||
|
circuit->area->area_tag, rawlspid_print(hdr->lsp_id),
|
||||||
|
ntohl(hdr->seq_num));
|
||||||
|
hdr->rem_lifetime = 0;
|
||||||
|
lsp_confusion = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lsp_confusion = 0;
|
||||||
|
|
||||||
/* 7.3.15.1 b) - If the remaining life time is 0, we perform 7.3.16.4 */
|
/* 7.3.15.1 b) - If the remaining life time is 0, we perform 7.3.16.4 */
|
||||||
if (hdr->rem_lifetime == 0)
|
if (hdr->rem_lifetime == 0)
|
||||||
{
|
{
|
||||||
@ -1477,14 +1493,20 @@ dontcheckadj:
|
|||||||
lsp_update (lsp, circuit->rcv_stream, circuit->area, level);
|
lsp_update (lsp, circuit->rcv_stream, circuit->area, level);
|
||||||
/* ii */
|
/* ii */
|
||||||
lsp_set_all_srmflags (lsp);
|
lsp_set_all_srmflags (lsp);
|
||||||
/* iii */
|
|
||||||
ISIS_CLEAR_FLAG (lsp->SRMflags, circuit);
|
|
||||||
/* v */
|
/* v */
|
||||||
ISIS_FLAGS_CLEAR_ALL (lsp->SSNflags); /* FIXME: OTHER than c */
|
ISIS_FLAGS_CLEAR_ALL (lsp->SSNflags); /* FIXME: OTHER than c */
|
||||||
|
|
||||||
|
/* For the case of lsp confusion, flood the purge back to its
|
||||||
|
* originator so that it can react. Otherwise, don't reflood
|
||||||
|
* through incoming circuit as usual */
|
||||||
|
if (!lsp_confusion)
|
||||||
|
{
|
||||||
|
/* iii */
|
||||||
|
ISIS_CLEAR_FLAG (lsp->SRMflags, circuit);
|
||||||
/* iv */
|
/* iv */
|
||||||
if (circuit->circ_type != CIRCUIT_T_BROADCAST)
|
if (circuit->circ_type != CIRCUIT_T_BROADCAST)
|
||||||
ISIS_SET_FLAG (lsp->SSNflags, circuit);
|
ISIS_SET_FLAG (lsp->SSNflags, circuit);
|
||||||
|
}
|
||||||
} /* 7.3.16.4 b) 2) */
|
} /* 7.3.16.4 b) 2) */
|
||||||
else if (comp == LSP_EQUAL)
|
else if (comp == LSP_EQUAL)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user