diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2019-03-04 21:27:36 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2019-03-04 21:27:36 +0000 |
commit | 3f4a1931a8bc58b0c7621f3d1a517a9e161e148e (patch) | |
tree | 034655d28e9c81d00d0b221d231dbab9b4ea3f14 /usr.bin | |
parent | 67285534b385473a497615889c0500354b7a7102 (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.c | 114 | ||||
-rw-r--r-- | usr.bin/systat/systat.1 | 11 | ||||
-rw-r--r-- | usr.bin/systat/systat.h | 4 |
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 */ |