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
> [email protected]
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;