On Tue, Mar 07, 2017 at 10:17:16AM +0100, Patrick Wildt wrote:
> Hi,
> 
> currently the pf status struct contains the time since pf was enabled as
> seen on the wall clock.  This means when time drifts, or is set to some
> earlier value, the time will be off.  If we use time since uptime it
> always increments and shows how long pf has been running compared to
> its uptime.
> 
> Does this make sense?  Opinions?
> 
> Patrick

Alternatively it might be nicer to still use the uptime, but only return
the delta since it was enabled.

diff --git a/sbin/pfctl/pfctl_parser.c b/sbin/pfctl/pfctl_parser.c
index e241b11f6fc..ab8834e605c 100644
--- a/sbin/pfctl/pfctl_parser.c
+++ b/sbin/pfctl/pfctl_parser.c
@@ -525,7 +525,7 @@ print_status(struct pf_status *s, int opts)
        char                    buf[PF_MD5_DIGEST_LENGTH * 2 + 1];
        static const char       hex[] = "0123456789abcdef";
 
-       runtime = time(NULL) - s->since;
+       runtime = s->since;
        running = s->running ? "Enabled" : "Disabled";
 
        if (s->since) {
diff --git a/sys/net/pf_ioctl.c b/sys/net/pf_ioctl.c
index 56a43a55ab8..cd5be10e2a1 100644
--- a/sys/net/pf_ioctl.c
+++ b/sys/net/pf_ioctl.c
@@ -994,7 +994,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, 
struct proc *p)
                        error = EEXIST;
                else {
                        pf_status.running = 1;
-                       pf_status.since = time_second;
+                       pf_status.since = time_uptime;
                        if (pf_status.stateid == 0) {
                                pf_status.stateid = time_second;
                                pf_status.stateid = pf_status.stateid << 32;
@@ -1009,7 +1009,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, 
struct proc *p)
                        error = ENOENT;
                else {
                        pf_status.running = 0;
-                       pf_status.since = time_second;
+                       pf_status.since = time_uptime;
                        pf_remove_queues();
                        DPFPRINTF(LOG_NOTICE, "pf: stopped");
                }
@@ -1577,6 +1577,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, 
struct proc *p)
        case DIOCGETSTATUS: {
                struct pf_status *s = (struct pf_status *)addr;
                bcopy(&pf_status, s, sizeof(struct pf_status));
+               s.since = time_uptime - pf_status.since;
                pfi_update_status(s->ifname, s);
                break;
        }
@@ -1605,7 +1606,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, 
struct proc *p)
                bzero(pf_status.counters, sizeof(pf_status.counters));
                bzero(pf_status.fcounters, sizeof(pf_status.fcounters));
                bzero(pf_status.scounters, sizeof(pf_status.scounters));
-               pf_status.since = time_second;
+               pf_status.since = time_uptime;
 
                break;
        }
diff --git a/usr.bin/systat/pf.c b/usr.bin/systat/pf.c
index 6e282bb7359..882985e6594 100644
--- a/usr.bin/systat/pf.c
+++ b/usr.bin/systat/pf.c
@@ -229,7 +229,7 @@ print_pf(void)
        if (end > num_disp)
                end = num_disp;
 
-       tm = time(NULL) - s->since;
+       tm = s->since;
 
        ADD_LINE_S("pf", "Status", s->running ? "Enabled" : "Disabled");
        ADD_LINE_A("pf", "Since", tm);
diff --git a/usr.sbin/snmpd/mib.c b/usr.sbin/snmpd/mib.c
index f53d9379b07..7fb82f22cb5 100644
--- a/usr.sbin/snmpd/mib.c
+++ b/usr.sbin/snmpd/mib.c
@@ -1650,7 +1650,6 @@ int
 mib_pfinfo(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
 {
        struct pf_status         s;
-       time_t                   runtime;
        char                     str[11];
 
        if (pf_get_stats(&s))
@@ -1661,12 +1660,7 @@ mib_pfinfo(struct oid *oid, struct ber_oid *o, struct 
ber_element **elm)
                *elm = ber_add_integer(*elm, s.running);
                break;
        case 2:
-               if (s.since > 0)
-                       runtime = time(NULL) - s.since;
-               else
-                       runtime = 0;
-               runtime *= 100;
-               *elm = ber_add_integer(*elm, runtime);
+               *elm = ber_add_integer(*elm, s.since * 100);
                ber_set_header(*elm, BER_CLASS_APPLICATION, SNMP_T_TIMETICKS);
                break;
        case 3:

Reply via email to