From 0649629483a94a9f74a89a7df13858819489d469 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Mon, 28 Nov 2016 18:35:36 -0200 Subject: [PATCH 1/2] isisd: use a smaller #ifdef for isis_receive() There's no need to provide two definitions of the isis_receive() function (one for GNU_LINUX and the other for !GNU_LINUX). Both differ only slightly so it makes more sense to define isis_receive() just once and use a smaller #ifdef to account for these differences. This improves code readability. Signed-off-by: Renato Westphal --- isisd/isis_pdu.c | 40 ++++------------------------------------ 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 1dfb4623f6..39d2df74b6 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -2139,7 +2139,6 @@ isis_handle_pdu (struct isis_circuit *circuit, u_char * ssnpa) return retval; } -#ifdef GNU_LINUX int isis_receive (struct thread *thread) { @@ -2153,10 +2152,11 @@ isis_receive (struct thread *thread) circuit = THREAD_ARG (thread); assert (circuit); + circuit->t_read = NULL; + isis_circuit_stream(circuit, &circuit->rcv_stream); retval = circuit->rx (circuit, ssnpa); - circuit->t_read = NULL; if (retval == ISIS_OK) retval = isis_handle_pdu (circuit, ssnpa); @@ -2166,52 +2166,20 @@ isis_receive (struct thread *thread) */ if (!circuit->is_passive) { +#ifdef GNU_LINUX THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit, circuit->fd); - } - - return retval; -} - #else -int -isis_receive (struct thread *thread) -{ - struct isis_circuit *circuit; - u_char ssnpa[ETH_ALEN]; - int retval; - - /* - * Get the circuit - */ - circuit = THREAD_ARG (thread); - assert (circuit); - - circuit->t_read = NULL; - - isis_circuit_stream(circuit, &circuit->rcv_stream); - - retval = circuit->rx (circuit, ssnpa); - - if (retval == ISIS_OK) - retval = isis_handle_pdu (circuit, ssnpa); - - /* - * prepare for next packet. - */ - if (!circuit->is_passive) - { circuit->t_read = thread_add_timer_msec (master, isis_receive, circuit, listcount (circuit->area->circuit_list) * 100); +#endif } return retval; } -#endif - /* filling of the fixed isis header */ void fill_fixed_hdr (struct isis_fixed_hdr *hdr, u_char pdu_type) From 5904f19fdf5160ba5c420327a273ad1a93eeabdc Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Mon, 28 Nov 2016 18:55:01 -0200 Subject: [PATCH 2/2] isisd: create the isis_circuit_prepare() helper function This reduces code duplication and the likelihood of a bug like 186534 ("isisd: fix loss of packets after circuit is brought up") to happen again. Signed-off-by: Renato Westphal --- isisd/isis_circuit.c | 20 +++++++++++++------- isisd/isis_circuit.h | 1 + isisd/isis_pdu.c | 12 +----------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 0332023f34..ea3f18a439 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -607,6 +607,18 @@ isis_circuit_stream(struct isis_circuit *circuit, struct stream **stream) } } +void +isis_circuit_prepare (struct isis_circuit *circuit) +{ +#ifdef GNU_LINUX + THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit, + circuit->fd); +#else + THREAD_TIMER_MSEC_ON (master, circuit->t_read, isis_receive, circuit, + listcount (circuit->area->circuit_list) * 100); +#endif +} + int isis_circuit_up (struct isis_circuit *circuit) { @@ -716,13 +728,7 @@ isis_circuit_up (struct isis_circuit *circuit) isis_circuit_stream(circuit, &circuit->rcv_stream); isis_circuit_stream(circuit, &circuit->snd_stream); -#ifdef GNU_LINUX - THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit, - circuit->fd); -#else - THREAD_TIMER_MSEC_ON (master, circuit->t_read, isis_receive, circuit, - listcount (circuit->area->circuit_list) * 100); -#endif + isis_circuit_prepare (circuit); circuit->lsp_queue = list_new (); circuit->lsp_queue_last_cleared = time (NULL); diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index efe153f32e..035e558c0a 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -168,6 +168,7 @@ void isis_circuit_add_addr (struct isis_circuit *circuit, struct connected *conn); void isis_circuit_del_addr (struct isis_circuit *circuit, struct connected *conn); +void isis_circuit_prepare (struct isis_circuit *circuit); int isis_circuit_up (struct isis_circuit *circuit); void isis_circuit_down (struct isis_circuit *); void circuit_update_nlpids (struct isis_circuit *circuit); diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 39d2df74b6..2965a97dc6 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -2165,17 +2165,7 @@ isis_receive (struct thread *thread) * prepare for next packet. */ if (!circuit->is_passive) - { -#ifdef GNU_LINUX - THREAD_READ_ON (master, circuit->t_read, isis_receive, circuit, - circuit->fd); -#else - circuit->t_read = thread_add_timer_msec (master, isis_receive, circuit, - listcount - (circuit->area->circuit_list) * - 100); -#endif - } + isis_circuit_prepare (circuit); return retval; }