]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: raise hello rate for DIS (BZ#539)
authorFritz Reichmann <fritz@reichmann.nl>
Wed, 14 Sep 2011 16:46:57 +0000 (20:46 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Tue, 27 Sep 2011 16:49:26 +0000 (20:49 +0400)
* isis_pdu.c: Divide hello interval by three, depending if we are DIS or
  not.

isisd/isis_pdu.c

index 26330a4d65b786610ed8056e9b6d4baa1c92c3db..4ea3ebd656a6420813a33c1442b6a3ddc0ce3588 100644 (file)
@@ -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;
 }