]> git.puffer.fish Git - mirror/frr.git/commitdiff
2005-10-21 Paul Jakma <paul.jakma@sun.com>
authorpaul <paul>
Fri, 21 Oct 2005 00:45:17 +0000 (00:45 +0000)
committerpaul <paul>
Fri, 21 Oct 2005 00:45:17 +0000 (00:45 +0000)
* (general) OSPF fast, sub-second hello and 1s dead-interval
  support. A warning fix. Millisec support for ospf_timer_dump.
  Change auto-cost ref-bandwidth to add a comment to write out
  of config, rather than printing annoying messages to vty on
  startup.
* ospf_dump.c: (ospf_timer_dump) Print out milliseconds too.
  Callers typically specify a length of 9, so most see
  millisecs unless they specify the additional length.
* ospf_interface.h: (struct ospf_interface) new interface param,
  fast_hello.
* ospf_interface.c: (ospf_if_table_lookup) add brackets,
  gcc warning fix.
  (ospf_new_if_params) Initialise fast_hello param.
  (ospf_free_if_params) Check whether fast_hello is configured.
  (ospf_if_new_hook) set fast_hello to default.
* ospf_ism.h: Wrap OSPF_ISM_TIMER_ON inside do {} while (0) to
  prevent funny side-effects from its if statement when this
  macro is used conditionally by other macros.
  (OSPF_ISM_TIMER_MSEC_ON) new macro, set in milliseconds.
  (OSPF_HELLO_TIMER_ON) new macro to set hello timer according
  to whether fast_hello is set.
* ospf_ism.c: Update all setting of the hello timer to use
  either OSPF_ISM_TIMER_MSEC_ON or OSPF_HELLO_TIMER_ON. The
  former is used when hello is to be sent immediately.
* ospf_nsm.c: ditto
* ospf_packet.c: (ospf_hello) hello-interval is not checked
  for mismatch if fast_hello is set.
  (ospf_read) Annoying nit, fix "no ospf_interface" to be debug
  rather than a warning, as it can be perfectly normal to
  receive packets when logical subnets are used.
  (ospf_make_hello) Set hello-interval to 0 if fast-hellos are
  configured.
* ospf_vty.c: (ospf_auto_cost_reference_bandwidth) annoying
  nit, don't vty_out if this command is given, it gets tired
  quick.
  (show_ip_ospf_interface_sub) Print the hello-interval
  according to whether fast-hello is set or not.
  Print the extra 5 millisec characters from (ospf_timer_dump)
  if fast-hello is configured.
  (ospf_vty_dead_interval_set) new function, common to all
  forms of dead-interval command, to set dead-interval and
  fast-hello correctly. If a dead-interval is given, unset
  fast-hello, else if a hello-multiplier is set, set
          dead-interval to 1 and fast-hello to given multiplier.
  (ip_ospf_dead_interval_addr_cmd) use
  ospf_vty_dead_interval_set().
  (ip_ospf_dead_interval_minimal_addr_cmd) ditto.
  (no_ip_ospf_dead_interval) Unset fast-hello.
  (no_ip_ospf_hello_interval) Bug-fix, unset of hello-interval
  should set it to OSPF_HELLO_INTERVAL_DEFAULT, not
  OSPF_ROUTER_DEAD_INTERVAL_DEFAULT.
  (config_write_interface) Write out fast-hello.
  (ospf_config_write) Write a comment about
  "auto-cost reference-bandwidth" having to be equal on all
  routers. Hopefully just as noticeable as old practice of
  writing to vty, but less annoying.
  (ospf_vty_if_init) install the two new dead-interval
  commands.
* ospfd.h: Add defines for OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
  and OSPF_FAST_HELLO_DEFAULT.

ospfd/ChangeLog
ospfd/ospf_dump.c
ospfd/ospf_interface.c
ospfd/ospf_interface.h
ospfd/ospf_ism.c
ospfd/ospf_ism.h
ospfd/ospf_nsm.c
ospfd/ospf_packet.c
ospfd/ospf_vty.c
ospfd/ospfd.h

index 299de23c7cf136b6bf8560eb44beffd19fc55250..13faf906cdc58b97e26513754db0ef72951dddfc 100644 (file)
@@ -1,3 +1,63 @@
+2005-10-21 Paul Jakma <paul.jakma@sun.com>
+
+       * (general) OSPF fast, sub-second hello and 1s dead-interval
+         support.
+       * ospf_dump.c: (ospf_timer_dump) Print out milliseconds too.
+         Callers typically specify a length of 9, so most see
+         millisecs unless they specify the additional length.
+       * ospf_interface.h: (struct ospf_interface) new interface param, 
+         fast_hello.
+       * ospf_interface.c: (ospf_if_table_lookup) add brackets,
+         gcc warning fix.
+         (ospf_new_if_params) Initialise fast_hello param.
+         (ospf_free_if_params) Check whether fast_hello is configured.
+         (ospf_if_new_hook) set fast_hello to default.
+       * ospf_ism.h: Wrap OSPF_ISM_TIMER_ON inside do {} while (0) to
+         prevent funny side-effects from its if statement when this
+         macro is used conditionally by other macros.
+         (OSPF_ISM_TIMER_MSEC_ON) new macro, set in milliseconds.
+         (OSPF_HELLO_TIMER_ON) new macro to set hello timer according
+         to whether fast_hello is set.
+       * ospf_ism.c: Update all setting of the hello timer to use
+         either OSPF_ISM_TIMER_MSEC_ON or OSPF_HELLO_TIMER_ON. The
+         former is used when hello is to be sent immediately.
+       * ospf_nsm.c: ditto
+       * ospf_packet.c: (ospf_hello) hello-interval is not checked
+         for mismatch if fast_hello is set.
+         (ospf_read) Annoying nit, fix "no ospf_interface" to be debug
+         rather than a warning, as it can be perfectly normal to
+         receive packets when logical subnets are used.
+         (ospf_make_hello) Set hello-interval to 0 if fast-hellos are
+         configured.
+       * ospf_vty.c: (ospf_auto_cost_reference_bandwidth) annoying
+         nit, don't vty_out if this command is given, it gets tired
+         quick.
+         (show_ip_ospf_interface_sub) Print the hello-interval 
+         according to whether fast-hello is set or not.
+         Print the extra 5 millisec characters from (ospf_timer_dump)
+         if fast-hello is configured.
+         (ospf_vty_dead_interval_set) new function, common to all
+         forms of dead-interval command, to set dead-interval and
+         fast-hello correctly. If a dead-interval is given, unset
+         fast-hello, else if a hello-multiplier is set, set
+          dead-interval to 1 and fast-hello to given multiplier.
+         (ip_ospf_dead_interval_addr_cmd) use
+         ospf_vty_dead_interval_set().
+         (ip_ospf_dead_interval_minimal_addr_cmd) ditto.
+         (no_ip_ospf_dead_interval) Unset fast-hello.
+         (no_ip_ospf_hello_interval) Bug-fix, unset of hello-interval
+         should set it to OSPF_HELLO_INTERVAL_DEFAULT, not
+         OSPF_ROUTER_DEAD_INTERVAL_DEFAULT.
+         (config_write_interface) Write out fast-hello.
+         (ospf_config_write) Write a comment about 
+         "auto-cost reference-bandwidth" having to be equal on all
+         routers. Hopefully just as noticeable as old practice of
+         writing to vty, but less annoying.
+         (ospf_vty_if_init) install the two new dead-interval
+         commands.
+       * ospfd.h: Add defines for OSPF_ROUTER_DEAD_INTERVAL_MINIMAL
+         and OSPF_FAST_HELLO_DEFAULT.
+
 2005-10-18 Paul Jakma <paul.jakma@sun.com>
 
        * (general) SPF memory management cleanup and fix for rare
index ac7426924e2973ded436ca4b448e3c63525ccc7b..829c00f7bd4ed4f43f88cf1d7cf862bc305a221b 100644 (file)
@@ -232,31 +232,39 @@ ospf_nbr_state_message (struct ospf_neighbor *nbr, char *buf, size_t size)
 const char *
 ospf_timer_dump (struct thread *t, char *buf, size_t size)
 {
-  struct timeval now;
-  unsigned long h, m, s;
+  struct timeval now, result;
+  unsigned long h, m, s, ms;
 
   if (!t)
     return "inactive";
 
-  h = m = s = 0;
+  h = m = s = ms = 0;
   memset (buf, 0, size);
 
   gettimeofday (&now, NULL);
-
-  s = t->u.sands.tv_sec - now.tv_sec;
-  if (s >= 3600)
+  
+  timersub (&t->u.sands, &now, &result);
+  
+  ms = result.tv_usec / 1000;
+  
+  if (ms >= 1000)
+    {
+      result.tv_sec = ms / 1000;
+      ms =- result.tv_sec * 1000;
+    }
+  if (result.tv_sec >= 3600)
     {
-      h = s / 3600;
-      s -= h * 3600;
+      h = result.tv_sec / 3600;
+      result.tv_sec -= h * 3600;
     }
 
-  if (s >= 60)
+  if (result.tv_sec >= 60)
     {
-      m = s / 60;
-      s -= m * 60;
+      m = result.tv_sec / 60;
+      result.tv_sec -= m * 60;
     }
 
-  snprintf (buf, size, "%02ld:%02ld:%02ld", h, m, s);
+  snprintf (buf, size, "%02ld:%02ld:%02ld.%03ld", h, m, result.tv_sec, ms);
 
   return buf;
 }
index fe32268ff3e0b42b56a92328c07a3b408a67c2cd..d21dea3b38fe8630f8fb99aab3eed6e2801ce403 100644 (file)
@@ -156,7 +156,7 @@ ospf_if_table_lookup (struct interface *ifp, struct prefix *prefix)
   p.prefixlen = IPV4_MAX_PREFIXLEN;
   
   /* route_node_get implicitely locks */
-  if (rn = route_node_lookup (IF_OIFS (ifp), &p))
+  if ((rn = route_node_lookup (IF_OIFS (ifp), &p)))
     {
       rninfo = (struct ospf_interface *) rn->info;
       route_unlock_node (rn);
@@ -559,6 +559,7 @@ ospf_new_if_params (void)
   UNSET_IF_PARAM (oip, retransmit_interval);
   UNSET_IF_PARAM (oip, passive_interface);
   UNSET_IF_PARAM (oip, v_hello);
+  UNSET_IF_PARAM (oip, fast_hello);
   UNSET_IF_PARAM (oip, v_wait);
   UNSET_IF_PARAM (oip, priority);
   UNSET_IF_PARAM (oip, type);
@@ -600,6 +601,7 @@ ospf_free_if_params (struct interface *ifp, struct in_addr addr)
       !OSPF_IF_PARAM_CONFIGURED (oip, retransmit_interval) &&
       !OSPF_IF_PARAM_CONFIGURED (oip, passive_interface) &&
       !OSPF_IF_PARAM_CONFIGURED (oip, v_hello) &&
+      !OSPF_IF_PARAM_CONFIGURED (oip, fast_hello) &&
       !OSPF_IF_PARAM_CONFIGURED (oip, v_wait) &&
       !OSPF_IF_PARAM_CONFIGURED (oip, priority) &&
       !OSPF_IF_PARAM_CONFIGURED (oip, type) &&
@@ -700,6 +702,9 @@ ospf_if_new_hook (struct interface *ifp)
   SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
   IF_DEF_PARAMS (ifp)->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
 
+  SET_IF_PARAM (IF_DEF_PARAMS (ifp), fast_hello);
+  IF_DEF_PARAMS (ifp)->fast_hello = OSPF_FAST_HELLO_DEFAULT;
+
   SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
   IF_DEF_PARAMS (ifp)->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
 
index 2b129859b3d63ce15ebf973f7d41064ecb27ff09..28d95d7edcffedcbf9bb551cfe4caf1dadfd666a 100644 (file)
@@ -55,7 +55,10 @@ struct ospf_if_params
 
   /* MTU mismatch check (see RFC2328, chap 10.6) */ 
   DECLARE_IF_PARAM (u_char, mtu_ignore);
-
+  
+  /* Fast-Hellos */
+  DECLARE_IF_PARAM (u_char, fast_hello);
+  
   /* Authentication data. */
   u_char auth_simple[OSPF_AUTH_SIMPLE_SIZE + 1];       /* Simple password. */
   u_char auth_simple__config:1;
index ab91e8d88e0f09f31b6785a4acc7b5f70c110b03..f65c68c9dddbee59e16c76342f0a9fc70dcd5cde 100644 (file)
@@ -263,9 +263,8 @@ ospf_hello_timer (struct thread *thread)
   ospf_hello_send (oi);
 
   /* Hello timer set. */
-  OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer,
-                    OSPF_IF_PARAM (oi, v_hello));
-
+  OSPF_HELLO_TIMER_ON (oi);
+  
   return 0;
 }
 
@@ -313,7 +312,7 @@ ism_timer_set (struct ospf_interface *oi)
       /* The router is trying to determine the identity of DRouter and
         BDRouter. The router begin to receive and send Hello Packets. */
       /* send first hello immediately */
-      OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer, 1);
+      OSPF_ISM_TIMER_MSEC_ON (oi->t_hello, ospf_hello_timer, 1);
       OSPF_ISM_TIMER_ON (oi->t_wait, ospf_wait_timer,
                         OSPF_IF_PARAM (oi, v_wait));
       OSPF_ISM_TIMER_OFF (oi->t_ls_ack);
@@ -323,8 +322,7 @@ ism_timer_set (struct ospf_interface *oi)
         virtual link. The router attempts to form an adjacency with
         neighboring router. Hello packets are also sent. */
       /* send first hello immediately */
-      OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer, 1);
-      
+      OSPF_ISM_TIMER_MSEC_ON (oi->t_hello, ospf_hello_timer, 1);      
       OSPF_ISM_TIMER_OFF (oi->t_wait);
       OSPF_ISM_TIMER_ON (oi->t_ls_ack, ospf_ls_ack_timer, oi->v_ls_ack);
       break;
@@ -332,24 +330,21 @@ ism_timer_set (struct ospf_interface *oi)
       /* The network type of the interface is broadcast or NBMA network,
         and the router itself is neither Designated Router nor
         Backup Designated Router. */
-      OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer,
-                        OSPF_IF_PARAM (oi, v_hello));
+      OSPF_HELLO_TIMER_ON (oi);
       OSPF_ISM_TIMER_OFF (oi->t_wait);
       OSPF_ISM_TIMER_ON (oi->t_ls_ack, ospf_ls_ack_timer, oi->v_ls_ack);
       break;
     case ISM_Backup:
       /* The network type of the interface is broadcast os NBMA network,
         and the router is Backup Designated Router. */
-      OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer,
-                        OSPF_IF_PARAM (oi, v_hello));
+      OSPF_HELLO_TIMER_ON (oi);
       OSPF_ISM_TIMER_OFF (oi->t_wait);
       OSPF_ISM_TIMER_ON (oi->t_ls_ack, ospf_ls_ack_timer, oi->v_ls_ack);
       break;
     case ISM_DR:
       /* The network type of the interface is broadcast or NBMA network,
         and the router is Designated Router. */
-      OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer,
-                        OSPF_IF_PARAM (oi, v_hello));
+      OSPF_HELLO_TIMER_ON (oi);
       OSPF_ISM_TIMER_OFF (oi->t_wait);
       OSPF_ISM_TIMER_ON (oi->t_ls_ack, ospf_ls_ack_timer, oi->v_ls_ack);
       break;
index 94d75b492d559bbbab96bafbda6dd2dd093ea36b..c714a15c7dee54c7e80c1010d98fc62c0815ed64 100644 (file)
      
 /* Macro for OSPF ISM timer turn on. */
 #define OSPF_ISM_TIMER_ON(T,F,V) \
-      if (!(T)) \
-        (T) = thread_add_timer (master, (F), oi, (V))
+  do { \
+    if (!(T)) \
+      (T) = thread_add_timer (master, (F), oi, (V)); \
+  } while (0)
+#define OSPF_ISM_TIMER_MSEC_ON(T,F,V) \
+  do { \
+    if (!(T)) \
+      (T) = thread_add_timer_msec (master, (F), oi, (V)); \
+  } while (0)
+
+/* convenience macro to set hello timer correctly, according to
+ * whether fast-hello is set or not
+ */
+#define OSPF_HELLO_TIMER_ON(O) \
+  do { \
+    if (OSPF_IF_PARAM ((O), fast_hello)) \
+        OSPF_ISM_TIMER_MSEC_ON ((O)->t_hello, ospf_hello_timer, \
+                                1000 / OSPF_IF_PARAM ((O), fast_hello)); \
+    else \
+        OSPF_ISM_TIMER_ON ((O)->t_hello, ospf_hello_timer, \
+                                OSPF_IF_PARAM ((O), v_hello)); \
+  } while (0)
 
 /* Macro for OSPF ISM timer turn off. */
 #define OSPF_ISM_TIMER_OFF(X) \
index 1d100848c77252c2206b51f93b680efebea90cfe..bfd565ef346b2abce951e53ce77f8b958caf6ea1 100644 (file)
@@ -826,7 +826,7 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
   if (state == NSM_Init)
     {
       OSPF_ISM_TIMER_OFF (oi->t_hello);
-      OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer, 1);
+      OSPF_ISM_TIMER_MSEC_ON (oi->t_hello, ospf_hello_timer, 1);
     }
 
   /* Preserve old status? */
index e50b7435c2edc6ab40f00296b9209abe5d327889..7c29a04a212c640cbc1459c2d0478ed1d693d9e0 100644 (file)
@@ -789,14 +789,6 @@ ospf_hello (struct ip *iph, struct ospf_header *ospfh,
        return;
       }
 
-  /* Compare Hello Interval. */
-  if (OSPF_IF_PARAM (oi, v_hello) != ntohs (hello->hello_interval))
-    {
-      zlog_warn ("Packet %s [Hello:RECV]: HelloInterval mismatch.",
-                inet_ntoa (ospfh->router_id));
-      return;
-    }
-
   /* Compare Router Dead Interval. */
   if (OSPF_IF_PARAM (oi, v_wait) != ntohl (hello->dead_interval))
     {
@@ -805,6 +797,17 @@ ospf_hello (struct ip *iph, struct ospf_header *ospfh,
       return;
     }
 
+  /* Compare Hello Interval - ignored if fast-hellos are set. */
+  if (OSPF_IF_PARAM (oi, fast_hello) == 0)
+    {
+      if (OSPF_IF_PARAM (oi, v_hello) != ntohs (hello->hello_interval))
+        {
+          zlog_warn ("Packet %s [Hello:RECV]: HelloInterval mismatch.",
+                     inet_ntoa (ospfh->router_id));
+          return;
+        }
+    }
+  
   if (IS_DEBUG_OSPF_EVENT)
     zlog_debug ("Packet %s [Hello:RECV]: Options %s",
               inet_ntoa (ospfh->router_id),
@@ -2356,7 +2359,7 @@ ospf_read (struct thread *thread)
     {
       if ((oi = ospf_associate_packet_vl (ospf, ifp, iph, ospfh)) == NULL)
         {
-          zlog_warn ("Packet from [%s] received on link %s"
+          zlog_debug ("Packet from [%s] received on link %s"
                      " but no ospf_interface",
                      inet_ntoa (iph->ip_src), ifp->name);
           return 0;
@@ -2576,7 +2579,10 @@ ospf_make_hello (struct ospf_interface *oi, struct stream *s)
   stream_put_ipv4 (s, mask.s_addr);
 
   /* Set Hello Interval. */
-  stream_putw (s, OSPF_IF_PARAM (oi, v_hello));
+  if (OSPF_IF_PARAM (oi, fast_hello) == 0)
+    stream_putw (s, OSPF_IF_PARAM (oi, v_hello));
+  else
+    stream_putw (s, 0); /* hello-interval of 0 for fast-hellos */
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_debug ("make_hello: options: %x, int: %s",
index a47eca18a411a20103db891e681cf6bf18e937c0..0d0befa7cecb7adad965c65fda6f6126302f9743 100644 (file)
@@ -2353,9 +2353,6 @@ DEFUN (ospf_auto_cost_reference_bandwidth,
     return CMD_SUCCESS;
   
   ospf->ref_bandwidth = refbw * 1000;
-  vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
-  vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
-      
   for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
     ospf_if_recalculate_output_cost (ifp);
   
@@ -2697,15 +2694,29 @@ show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
       vty_out (vty, "%s", VTY_NEWLINE);
 
       vty_out (vty, "  Timer intervals configured,");
-      vty_out (vty, " Hello %d, Dead %d, Wait %d, Retransmit %d%s",
-              OSPF_IF_PARAM (oi, v_hello), OSPF_IF_PARAM (oi, v_wait),
+      vty_out (vty, " Hello ");
+      if (OSPF_IF_PARAM (oi, fast_hello) == 0)
+        vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
+      else
+        vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
+      vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
+              OSPF_IF_PARAM (oi, v_wait),
               OSPF_IF_PARAM (oi, v_wait),
               OSPF_IF_PARAM (oi, retransmit_interval),
               VTY_NEWLINE);
       
       if (OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_ACTIVE)
-       vty_out (vty, "    Hello due in %s%s",
-                ospf_timer_dump (oi->t_hello, buf, 9), VTY_NEWLINE);
+        {
+          int timer_slen = 9; /* length of "hh:mm:ss(nul)" */
+          
+          /* for fast hello we also want to see the .XXXX ms part */
+          if (OSPF_IF_PARAM (oi, fast_hello))
+            timer_slen += 5;
+          
+         vty_out (vty, "    Hello due in %s%s",
+                  ospf_timer_dump (oi->t_hello, buf, timer_slen), 
+                  VTY_NEWLINE);
+        }
       else /* OSPF_IF_PASSIVE is set */
        vty_out (vty, "    No Hellos (Passive interface)%s", VTY_NEWLINE);
       
@@ -4583,17 +4594,14 @@ ospf_nbr_timer_update (struct ospf_interface *oi)
       }
 }
 
-DEFUN (ip_ospf_dead_interval,
-       ip_ospf_dead_interval_addr_cmd,
-       "ip ospf dead-interval <1-65535> A.B.C.D",
-       "IP Information\n"
-       "OSPF interface commands\n"
-       "Interval after which a neighbor is declared dead\n"
-       "Seconds\n"
-       "Address of interface")
+static int
+ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
+                            const char *nbr_str,
+                            const char *fast_hello_str)
 {
   struct interface *ifp = vty->index;
   u_int32_t seconds;
+  u_char hellomult;
   struct in_addr addr;
   int ret;
   struct ospf_if_params *params;
@@ -4604,19 +4612,10 @@ DEFUN (ip_ospf_dead_interval,
   ospf = ospf_lookup ();
 
   params = IF_DEF_PARAMS (ifp);
-
-  seconds = strtol (argv[0], NULL, 10);
-
-  /* dead_interval range is <1-65535>. */
-  if (seconds < 1 || seconds > 65535)
-    {
-      vty_out (vty, "Router Dead Interval is invalid%s", VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  if (argc == 2)
+  
+  if (nbr_str)
     {
-      ret = inet_aton(argv[1], &addr);
+      ret = inet_aton(nbr_str, &addr);
       if (!ret)
        {
          vty_out (vty, "Please specify interface address by A.B.C.D%s",
@@ -4628,11 +4627,36 @@ DEFUN (ip_ospf_dead_interval,
       ospf_if_update_params (ifp, addr);
     }
 
+  if (interval_str)
+    {
+      VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
+                             1, 65535);
+                             
+      /* reset fast_hello too, just to be sure */
+      UNSET_IF_PARAM (params, fast_hello);
+      params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
+    }
+  else if (fast_hello_str)
+    {
+      VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
+                             1, 10);
+      /* 1s dead-interval with sub-second hellos desired */
+      seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
+      SET_IF_PARAM (params, fast_hello);
+      params->fast_hello = hellomult;
+    }
+  else
+    {
+      vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
+              VTY_NEWLINE);
+      return CMD_WARNING;
+    }
+    
   SET_IF_PARAM (params, v_wait);
   params->v_wait = seconds;
   
   /* Update timer values in neighbor structure. */
-  if (argc == 2)
+  if (nbr_str)
     {
       if (ospf)
        {
@@ -4651,6 +4675,22 @@ DEFUN (ip_ospf_dead_interval,
   return CMD_SUCCESS;
 }
 
+
+DEFUN (ip_ospf_dead_interval,
+       ip_ospf_dead_interval_addr_cmd,
+       "ip ospf dead-interval <1-65535> A.B.C.D",
+       "IP Information\n"
+       "OSPF interface commands\n"
+       "Interval after which a neighbor is declared dead\n"
+       "Seconds\n"
+       "Address of interface\n")
+{
+  if (argc == 2)
+    return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
+  else
+    return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
+}
+
 ALIAS (ip_ospf_dead_interval,
        ip_ospf_dead_interval_cmd,
        "ip ospf dead-interval <1-65535>",
@@ -4666,6 +4706,33 @@ ALIAS (ip_ospf_dead_interval,
        "Interval after which a neighbor is declared dead\n"
        "Seconds\n")
 
+DEFUN (ip_ospf_dead_interval_minimal,
+       ip_ospf_dead_interval_minimal_addr_cmd,
+       "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
+       "IP Information\n"
+       "OSPF interface commands\n"
+       "Interval after which a neighbor is declared dead\n"
+       "Minimal 1s dead-interval with fast sub-second hellos\n"
+       "Hello multiplier factor\n"
+       "Number of Hellos to send each second\n"
+       "Address of interface\n")
+{
+  if (argc == 2)
+    return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
+  else
+    return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
+}
+
+ALIAS (ip_ospf_dead_interval_minimal,
+       ip_ospf_dead_interval_minimal_cmd,
+       "ip ospf dead-interval minimal hello-multiplier <1-10>",
+       "IP Information\n"
+       "OSPF interface commands\n"
+       "Interval after which a neighbor is declared dead\n"
+       "Minimal 1s dead-interval with fast sub-second hellos\n"
+       "Hello multiplier factor\n"
+       "Number of Hellos to send each second\n")
+
 DEFUN (no_ip_ospf_dead_interval,
        no_ip_ospf_dead_interval_addr_cmd,
        "no ip ospf dead-interval A.B.C.D",
@@ -4705,7 +4772,10 @@ DEFUN (no_ip_ospf_dead_interval,
 
   UNSET_IF_PARAM (params, v_wait);
   params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
-
+  
+  UNSET_IF_PARAM (params, fast_hello);
+  params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
+  
   if (params != IF_DEF_PARAMS (ifp))
     {
       ospf_free_if_params (ifp, addr);
@@ -4787,7 +4857,7 @@ DEFUN (ip_ospf_hello_interval,
       ospf_if_update_params (ifp, addr);
     }
 
-  SET_IF_PARAM (params, v_hello); 
+  SET_IF_PARAM (params, v_hello);
   params->v_hello = seconds;
 
   return CMD_SUCCESS;
@@ -4841,7 +4911,7 @@ DEFUN (no_ip_ospf_hello_interval,
     }
 
   UNSET_IF_PARAM (params, v_hello);
-  params->v_hello = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
+  params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
 
   if (params != IF_DEF_PARAMS (ifp))
     {
@@ -6994,7 +7064,15 @@ config_write_interface (struct vty *vty)
        if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
            params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
          {
-           vty_out (vty, " ip ospf dead-interval %u", params->v_wait);
+           vty_out (vty, " ip ospf dead-interval ");
+           
+           /* fast hello ? */
+           if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
+             vty_out (vty, "minimal hello-multiplier %d",
+                      params->fast_hello);
+            else
+              vty_out (vty, "%u", params->v_wait);
+            
            if (params != IF_DEF_PARAMS (ifp))
              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
            vty_out (vty, "%s", VTY_NEWLINE);
@@ -7435,8 +7513,12 @@ ospf_config_write (struct vty *vty)
 
       /* auto-cost reference-bandwidth configuration.  */
       if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
-       vty_out (vty, " auto-cost reference-bandwidth %d%s",
-                ospf->ref_bandwidth / 1000, VTY_NEWLINE);
+        {
+          vty_out (vty, "! Important: ensure reference bandwidth "
+                        "is consistent across all routers%s", VTY_NEWLINE);
+          vty_out (vty, " auto-cost reference-bandwidth %d%s",
+                  ospf->ref_bandwidth / 1000, VTY_NEWLINE);
+        }
 
       /* SPF timers print. */
       if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
@@ -7601,9 +7683,11 @@ ospf_vty_if_init (void)
   /* "ip ospf dead-interval" commands. */
   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
+  install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
+  install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
-
+  
   /* "ip ospf hello-interval" commands. */
   install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
   install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
index 7a2649f6c2ca65d63521b1b990ba82d783349b4d..b24a1cf79959b77ca457c040313d3e3d9dec261a 100644 (file)
@@ -94,6 +94,7 @@
 /* OSPF interface default values. */
 #define OSPF_OUTPUT_COST_DEFAULT           10
 #define OSPF_ROUTER_DEAD_INTERVAL_DEFAULT  40
+#define OSPF_ROUTER_DEAD_INTERVAL_MINIMAL   1
 #define OSPF_HELLO_INTERVAL_DEFAULT        10
 #define OSPF_ROUTER_PRIORITY_DEFAULT        1
 #define OSPF_RETRANSMIT_INTERVAL_DEFAULT    5
 #define OSPF_NEIGHBOR_PRIORITY_DEFAULT      0
 
 #define OSPF_MTU_IGNORE_DEFAULT             0
+#define OSPF_FAST_HELLO_DEFAULT             0
 
 /* OSPF options. */
 #define OSPF_OPTION_T                    0x01  /* TOS. */