On Sat, Nov 19, 2022 at 01:40:14PM +0000, Wouter Prins wrote:
> hello,
> 
> Using OpenBSD 7.2 (and previous versions), i noticed when running
> ospf6d on a loopback interface, the output of 'doas ospf6ctl show
> interface' HelloTimer field contains a weird value:
> 
> dev$ doas ospf6ctl show interface
> Interface   Address                       State  HelloTimer Linkstate  Uptime
> lo1         2001:db8::1                   LOOP   7101w3d0   unknown    
> 00:00:02
> 
> Using ospfd (v4), the output of the HelloTimer field for a loopback
> interface defaults to '-'.
> -- 
> Wouter Prins
> w...@null0.nl

This misc@ repot made me curious.

I don't use OSPF and can't test this, but the relevant code was similar
enough to spot a difference.

dlg's "implement support for fast hello packets." commit to ospfd(8)
in 2010 retyped ospfd.h struct ctl_iface's hello_timer member to
struct timeval.

ospf6d.h struct ctl_iface's hello_timer member is still a time_t since
import in 2007.

Making the v6 version match v4 the version in this regard compiles and
keeps regress/usr.sbin/ospf6d passing.

Does this fix the HelloTimer output?


Index: usr.sbin/ospf6ctl/ospf6ctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6ctl/ospf6ctl.c,v
retrieving revision 1.52
diff -u -p -r1.52 ospf6ctl.c
--- usr.sbin/ospf6ctl/ospf6ctl.c        20 Jan 2022 14:12:55 -0000      1.52
+++ usr.sbin/ospf6ctl/ospf6ctl.c        23 Nov 2022 12:25:37 -0000
@@ -388,7 +388,8 @@ show_interface_msg(struct imsg *imsg)
                        err(1, NULL);
                printf("%-11s %-29s %-6s %-10s %-10s %s\n",
                    iface->name, netid, if_state_name(iface->state),
-                   fmt_timeframe_core(iface->hello_timer),
+                   iface->hello_timer.tv_sec < 0 ? "-" :
+                   fmt_timeframe_core(iface->hello_timer.tv_sec),
                    get_linkstate(iface->if_type, iface->linkstate),
                    fmt_timeframe_core(iface->uptime));
                free(netid);
@@ -446,11 +447,12 @@ show_interface_detail_msg(struct imsg *i
                     iface->dead_interval, iface->rxmt_interval);
                if (iface->passive)
                        printf("    Passive interface (No Hellos)\n");
-               else if (iface->hello_timer < 0)
+               else if (iface->hello_timer.tv_sec < 0)
                        printf("    Hello timer not running\n");
                else
-                       printf("    Hello timer due in %s\n",
-                           fmt_timeframe_core(iface->hello_timer));
+                       printf("    Hello timer due in %s+%ldmsec\n",
+                           fmt_timeframe_core(iface->hello_timer.tv_sec),
+                           iface->hello_timer.tv_usec / 1000);
                printf("    Uptime %s\n", fmt_timeframe_core(iface->uptime));
                printf("  Neighbor count is %d, adjacent neighbor count is "
                    "%d\n", iface->nbr_cnt, iface->adj_cnt);
Index: usr.sbin/ospf6d/interface.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/interface.c,v
retrieving revision 1.29
diff -u -p -r1.29 interface.c
--- usr.sbin/ospf6d/interface.c 27 May 2020 09:03:56 -0000      1.29
+++ usr.sbin/ospf6d/interface.c 23 Nov 2022 12:01:41 -0000
@@ -686,9 +686,9 @@ if_to_ctl(struct iface *iface)
        gettimeofday(&now, NULL);
        if (evtimer_pending(&iface->hello_timer, &tv)) {
                timersub(&tv, &now, &res);
-               ictl.hello_timer = res.tv_sec;
+               ictl.hello_timer = res;
        } else
-               ictl.hello_timer = -1;
+               ictl.hello_timer.tv_sec = -1;
 
        if (iface->state != IF_STA_DOWN) {
                ictl.uptime = now.tv_sec - iface->uptime;
Index: usr.sbin/ospf6d/ospf6d.h
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.h,v
retrieving revision 1.50
diff -u -p -r1.50 ospf6d.h
--- usr.sbin/ospf6d/ospf6d.h    19 Jan 2021 09:46:51 -0000      1.50
+++ usr.sbin/ospf6d/ospf6d.h    23 Nov 2022 11:59:55 -0000
@@ -428,7 +428,7 @@ struct ctl_iface {
        struct in6_addr          dr_addr;
        struct in_addr           bdr_id;
        struct in6_addr          bdr_addr;
-       time_t                   hello_timer;
+       struct timeval           hello_timer;
        time_t                   uptime;
        u_int64_t                baudrate;
        u_int32_t                dead_interval;

Reply via email to