summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2019-03-04 21:27:36 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2019-03-04 21:27:36 +0000
commit3f4a1931a8bc58b0c7621f3d1a517a9e161e148e (patch)
tree034655d28e9c81d00d0b221d231dbab9b4ea3f14 /usr.bin
parent67285534b385473a497615889c0500354b7a7102 (diff)
expose the interface queue drops in the interface view
by default qdrops and errors are combined in a number of failures. the qdrops and errors can be viewed separately by using 'd' and 'e' respectively, or the combined view again with 'f'. ok claudio@ deraadt@
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/systat/if.c114
-rw-r--r--usr.bin/systat/systat.111
-rw-r--r--usr.bin/systat/systat.h4
3 files changed, 119 insertions, 10 deletions
diff --git a/usr.bin/systat/if.c b/usr.bin/systat/if.c
index 18e9a4f4706..24afc6a2ac4 100644
--- a/usr.bin/systat/if.c
+++ b/usr.bin/systat/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.23 2015/01/16 00:03:37 deraadt Exp $ */
+/* $OpenBSD: if.c,v 1.24 2019/03/04 21:27:35 dlg Exp $ */
/*
* Copyright (c) 2004 Markus Friedl <markus@openbsd.org>
*
@@ -56,6 +56,49 @@ static void showifstat(struct ifstat *);
static void showtotal(void);
static void rt_getaddrinfo(struct sockaddr *, int, struct sockaddr **);
+const char ifails[] = "IFAILS";
+const char ofails[] = "OFAILS";
+
+#define IF_ERR_SUM 0
+#define IF_ERR_ERRORS 1
+#define IF_ERR_QDROPS 2
+
+struct if_err_view {
+ const char *iname;
+ const char *oname;
+ uint64_t (*icount)(const struct ifcount *);
+ uint64_t (*ocount)(const struct ifcount *);
+};
+
+static uint64_t if_err_ifails(const struct ifcount *);
+static uint64_t if_err_ofails(const struct ifcount *);
+static uint64_t if_err_ierrors(const struct ifcount *);
+static uint64_t if_err_oerrors(const struct ifcount *);
+static uint64_t if_err_iqdrops(const struct ifcount *);
+static uint64_t if_err_oqdrops(const struct ifcount *);
+
+static const struct if_err_view if_err_views[] = {
+ [IF_ERR_SUM] = {
+ .iname = ifails,
+ .oname = ofails,
+ .icount = if_err_ifails,
+ .ocount = if_err_ofails,
+ },
+ [IF_ERR_ERRORS] = {
+ .iname = "IERRS",
+ .oname = "OERRS",
+ .icount = if_err_ierrors,
+ .ocount = if_err_oerrors,
+ },
+ [IF_ERR_QDROPS] = {
+ .iname = "IQDROPS",
+ .oname = "OQDROPS",
+ .icount = if_err_iqdrops,
+ .ocount = if_err_oqdrops,
+ },
+};
+
+static const struct if_err_view *if_err_view = &if_err_views[IF_ERR_SUM];
/* Define fields */
field_def fields_if[] = {
@@ -63,10 +106,10 @@ field_def fields_if[] = {
{"STATE", 4, 6, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
{"IPKTS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"IBYTES", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
- {"IERRS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
+ {ifails, 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"OPKTS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"OBYTES", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
- {"OERRS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
+ {ofails, 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"COLLS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"DESC", 14, 64, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
};
@@ -264,9 +307,11 @@ fetchifstat(void)
UPDATE(ifc_ip, ifm_data.ifi_ipackets);
UPDATE(ifc_ib, ifm_data.ifi_ibytes);
UPDATE(ifc_ie, ifm_data.ifi_ierrors);
+ UPDATE(ifc_iq, ifm_data.ifi_iqdrops);
UPDATE(ifc_op, ifm_data.ifi_opackets);
UPDATE(ifc_ob, ifm_data.ifi_obytes);
UPDATE(ifc_oe, ifm_data.ifi_oerrors);
+ UPDATE(ifc_oq, ifm_data.ifi_oqdrops);
UPDATE(ifc_co, ifm_data.ifi_collisions);
ifs->ifs_cur.ifc_flags = ifm.ifm_flags;
ifs->ifs_cur.ifc_state = ifm.ifm_data.ifi_link_state;
@@ -315,11 +360,11 @@ showifstat(struct ifstat *ifs)
print_fld_sdiv(FLD_IF_IBYTES, ifs->ifs_cur.ifc_ib * conv, div);
print_fld_size(FLD_IF_IPKTS, ifs->ifs_cur.ifc_ip);
- print_fld_size(FLD_IF_IERRS, ifs->ifs_cur.ifc_ie);
+ print_fld_size(FLD_IF_IERRS, if_err_view->icount(&ifs->ifs_cur));
print_fld_sdiv(FLD_IF_OBYTES, ifs->ifs_cur.ifc_ob * conv, div);
print_fld_size(FLD_IF_OPKTS, ifs->ifs_cur.ifc_op);
- print_fld_size(FLD_IF_OERRS, ifs->ifs_cur.ifc_oe);
+ print_fld_size(FLD_IF_OERRS, if_err_view->ocount(&ifs->ifs_cur));
print_fld_size(FLD_IF_COLLS, ifs->ifs_cur.ifc_co);
@@ -336,11 +381,11 @@ showtotal(void)
print_fld_sdiv(FLD_IF_IBYTES, sum.ifc_ib * conv, div);
print_fld_size(FLD_IF_IPKTS, sum.ifc_ip);
- print_fld_size(FLD_IF_IERRS, sum.ifc_ie);
+ print_fld_size(FLD_IF_IERRS, if_err_view->icount(&sum));
print_fld_sdiv(FLD_IF_OBYTES, sum.ifc_ob * conv, div);
print_fld_size(FLD_IF_OPKTS, sum.ifc_op);
- print_fld_size(FLD_IF_OERRS, sum.ifc_oe);
+ print_fld_size(FLD_IF_OERRS, if_err_view->ocount(&sum));
print_fld_size(FLD_IF_COLLS, sum.ifc_co);
@@ -348,12 +393,67 @@ showtotal(void)
}
+static uint64_t
+if_err_ifails(const struct ifcount *ifc)
+{
+ return (ifc->ifc_ie + ifc->ifc_iq);
+}
+
+static uint64_t
+if_err_ofails(const struct ifcount *ifc)
+{
+ return (ifc->ifc_oe + ifc->ifc_oq);
+}
+
+static uint64_t
+if_err_ierrors(const struct ifcount *ifc)
+{
+ return (ifc->ifc_ie);
+}
+
+static uint64_t
+if_err_oerrors(const struct ifcount *ifc)
+{
+ return (ifc->ifc_oe);
+}
+
+static uint64_t
+if_err_iqdrops(const struct ifcount *ifc)
+{
+ return (ifc->ifc_iq);
+}
+
+static uint64_t
+if_err_oqdrops(const struct ifcount *ifc)
+{
+ return (ifc->ifc_oq);
+}
+
+static void
+if_set_errs(unsigned int v)
+{
+ if_err_view = &if_err_views[v];
+ FLD_IF_IERRS->title = if_err_view->iname;
+ FLD_IF_IERRS->title = if_err_view->oname;
+ gotsig_alarm = 1;
+}
+
int
if_keyboard_callback(int ch)
{
struct ifstat *ifs;
switch (ch) {
+ case 'd':
+ if_set_errs(IF_ERR_QDROPS);
+ break;
+ case 'e':
+ if_set_errs(IF_ERR_ERRORS);
+ break;
+ case 'f':
+ if_set_errs(IF_ERR_SUM);
+ break;
+
case 'r':
for (ifs = ifstats; ifs < ifstats + nifs; ifs++)
ifs->ifs_old = ifs->ifs_now;
diff --git a/usr.bin/systat/systat.1 b/usr.bin/systat/systat.1
index 6c40b9d1432..c46f5aeb8b4 100644
--- a/usr.bin/systat/systat.1
+++ b/usr.bin/systat/systat.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: systat.1,v 1.110 2018/07/25 17:24:14 bluhm Exp $
+.\" $OpenBSD: systat.1,v 1.111 2019/03/04 21:27:35 dlg Exp $
.\" $NetBSD: systat.1,v 1.6 1996/05/10 23:16:39 thorpej Exp $
.\"
.\" Copyright (c) 1985, 1990, 1993
@@ -30,7 +30,7 @@
.\"
.\" @(#)systat.1 8.2 (Berkeley) 12/30/93
.\"
-.Dd $Mdocdate: July 25 2018 $
+.Dd $Mdocdate: March 4 2019 $
.Dt SYSTAT 1
.Os
.Sh NAME
@@ -290,6 +290,13 @@ between display refreshes.
changes the counters to show the average per second over
the display refresh interval;
this is the default.
+.Ic d
+displays input and output queue drops.
+.Ic e
+displays input and output errors.
+.Ic f
+displays input and output queue drops plus errors.
+This is the default view.
.It Ic iostat
Display statistics about disk throughput.
Statistics
diff --git a/usr.bin/systat/systat.h b/usr.bin/systat/systat.h
index 2c8a9001eec..dde7381545c 100644
--- a/usr.bin/systat/systat.h
+++ b/usr.bin/systat/systat.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: systat.h,v 1.22 2018/05/30 13:43:51 krw Exp $ */
+/* $OpenBSD: systat.h,v 1.23 2019/03/04 21:27:35 dlg Exp $ */
/* $NetBSD: systat.h,v 1.2 1995/01/20 08:52:14 jtc Exp $ */
/*-
@@ -104,9 +104,11 @@ struct ifcount {
u_int64_t ifc_ib; /* input bytes */
u_int64_t ifc_ip; /* input packets */
u_int64_t ifc_ie; /* input errors */
+ u_int64_t ifc_iq; /* input qdrops */
u_int64_t ifc_ob; /* output bytes */
u_int64_t ifc_op; /* output packets */
u_int64_t ifc_oe; /* output errors */
+ u_int64_t ifc_oq; /* output qdrops */
u_int64_t ifc_co; /* collisions */
int ifc_flags; /* up / down */
int ifc_state; /* link state */