From e5973ce5b6cad425358b7c0cf870229d0ff05b21 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Thu, 5 Oct 2017 15:39:28 +0200 Subject: [PATCH] isisd: fix issue with lsp queueing logic in lsp_tick --- isisd/isis_circuit.c | 2 +- isisd/isis_circuit.h | 2 +- isisd/isis_constants.h | 2 +- isisd/isis_lsp.c | 8 +++++--- isisd/isis_pdu.c | 8 ++------ 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 1c1385ab7..309e366e8 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -676,7 +676,7 @@ int isis_circuit_up(struct isis_circuit *circuit) circuit->lsp_queue = list_new(); circuit->lsp_hash = isis_lsp_hash_new(); - monotime(&circuit->lsp_queue_last_cleared); + circuit->lsp_queue_last_push = monotime(NULL); return ISIS_OK; } diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index 29694deb3..ac1e15f6b 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -84,7 +84,7 @@ struct isis_circuit { struct thread *t_send_lsp; struct list *lsp_queue; /* LSPs to be txed (both levels) */ struct isis_lsp_hash *lsp_hash; /* Hashtable synchronized with lsp_queue */ - struct timeval lsp_queue_last_cleared; /* timestamp used to enforce transmit + time_t lsp_queue_last_push; /* timestamp used to enforce transmit * interval; * for scalability, use one timestamp per * circuit, instead of one per lsp per diff --git a/isisd/isis_constants.h b/isisd/isis_constants.h index b7b5d35c2..1046b0014 100644 --- a/isisd/isis_constants.h +++ b/isisd/isis_constants.h @@ -73,7 +73,7 @@ #define MAX_MIN_LSP_GEN_INTERVAL 120 /* RFC 4444 says 65535 */ #define DEFAULT_MIN_LSP_GEN_INTERVAL 30 -#define MIN_LSP_TRANS_INTERVAL 20000 /* Microseconds */ +#define MIN_LSP_RETRANS_INTERVAL 5 /* Seconds */ #define MIN_CSNP_INTERVAL 1 #define MAX_CSNP_INTERVAL 600 diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index bee6abfda..34b51d470 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -1805,6 +1805,7 @@ int lsp_tick(struct thread *thread) dnode_t *dnode, *dnode_next; int level; u_int16_t rem_lifetime; + time_t now = monotime(NULL); lsp_list = list_new(); @@ -1883,12 +1884,13 @@ int lsp_tick(struct thread *thread) if (!circuit->lsp_queue) continue; - if (monotime_since( - &circuit->lsp_queue_last_cleared, - NULL) < MIN_LSP_TRANS_INTERVAL) { + if (now - circuit->lsp_queue_last_push + < MIN_LSP_RETRANS_INTERVAL) { continue; } + circuit->lsp_queue_last_push = now; + for (ALL_LIST_ELEMENTS_RO( lsp_list, lspnode, lsp)) { if (circuit->upadjcount diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 2f9e3caf1..1960edeb5 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -2056,12 +2056,8 @@ int send_lsp(struct thread *thread) lsp = isis_circuit_lsp_queue_pop(circuit); if (!lsp) return ISIS_OK; - /* Set the last-cleared time if the queue is empty. */ - /* TODO: Is is possible that new lsps keep being added to the queue - * that the queue is never empty? */ - if (list_isempty(circuit->lsp_queue)) { - monotime(&circuit->lsp_queue_last_cleared); - } else { + + if (!list_isempty(circuit->lsp_queue)) { isis_circuit_schedule_lsp_send(circuit); } -- 2.39.5