summaryrefslogtreecommitdiff
path: root/isisd
diff options
context:
space:
mode:
authorFritz Reichmann <fritz@reichmann.nl>2011-09-14 20:46:57 +0400
committerDenis Ovsienko <infrastation@yandex.ru>2011-09-25 18:15:51 +0400
commit4e60f63ccc7a46b1b8500fce657b0164d881a585 (patch)
tree933fbaacb904bcb7c3a393e539ca2a3e91a9dbf1 /isisd
parentd0d29979d05ddc532475b595b32041412de523c7 (diff)
isisd: raise hello rate for DIS (BZ#539)
* isis_pdu.c: Divide hello interval by three, depending if we are DIS or not.
Diffstat (limited to 'isisd')
-rw-r--r--isisd/isis_pdu.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c
index 34e4b03d..0896d540 100644
--- a/isisd/isis_pdu.c
+++ b/isisd/isis_pdu.c
@@ -1943,6 +1943,9 @@ send_hello (struct isis_circuit *circuit, int level)
memset (&hello_hdr, 0, sizeof (struct isis_lan_hello_hdr));
interval = circuit->hello_multiplier[level - 1] *
circuit->hello_interval[level - 1];
+ /* If we are the DIS then hello interval is divided by three, as is the hold-timer */
+ if (circuit->u.bc.is_dr[level - 1])
+ interval=interval/3;
if (interval > USHRT_MAX)
interval = USHRT_MAX;
hello_hdr.circuit_t = circuit->circuit_is_type;
@@ -2065,9 +2068,21 @@ send_lan_l1_hello (struct thread *thread)
{
struct isis_circuit *circuit;
int retval;
+ unsigned long next_hello;
circuit = THREAD_ARG (thread);
assert (circuit);
+
+ if (!circuit->area) {
+ return ISIS_OK;
+ }
+
+ /* Pseudonode sends hellos three times more than the other nodes */
+ if (circuit->u.bc.is_dr[0])
+ next_hello=circuit->hello_interval[0]/3+1;
+ else
+ next_hello=circuit->hello_interval[0];
+
circuit->u.bc.t_send_lan_hello[0] = NULL;
if (circuit->u.bc.run_dr_elect[0])
@@ -2078,7 +2093,7 @@ send_lan_l1_hello (struct thread *thread)
/* set next timer thread */
THREAD_TIMER_ON (master, circuit->u.bc.t_send_lan_hello[0],
send_lan_l1_hello, circuit,
- isis_jitter (circuit->hello_interval[0], IIH_JITTER));
+ isis_jitter (next_hello, IIH_JITTER));
return retval;
}
@@ -2088,6 +2103,7 @@ send_lan_l2_hello (struct thread *thread)
{
struct isis_circuit *circuit;
int retval;
+ unsigned long next_hello;
circuit = THREAD_ARG (thread);
assert (circuit);
@@ -2096,6 +2112,12 @@ send_lan_l2_hello (struct thread *thread)
return ISIS_OK;
}
+ /* Pseudonode sends hellos three times more than the other nodes */
+ if (circuit->u.bc.is_dr[1])
+ next_hello=circuit->hello_interval[1]/3+1;
+ else
+ next_hello=circuit->hello_interval[1];
+
circuit->u.bc.t_send_lan_hello[1] = NULL;
if (circuit->u.bc.run_dr_elect[1])
@@ -2106,7 +2128,7 @@ send_lan_l2_hello (struct thread *thread)
/* set next timer thread */
THREAD_TIMER_ON (master, circuit->u.bc.t_send_lan_hello[1],
send_lan_l2_hello, circuit,
- isis_jitter (circuit->hello_interval[1], IIH_JITTER));
+ isis_jitter (next_hello, IIH_JITTER));
return retval;
}