On Mon, Mar 04, 2019 at 09:17:00PM +1000, David Gwynne wrote:
> this combines errors and qdrops into fails, and shows them by default.
> if you want to look at drops or errors, you can use d or f to switch to
> that view.
> 
> this also changes netstat so it shows fails by default which is a
> combination of errors and qdrops too, but -d and -e force drops or
> errors respectively.
> 
> it is really frustrating at the moment that i can't see qdrops anywhere,
> which makes it hard to judge the effectiveness of some changes im
> working on.
> 
> for example, this is before and after with netstat:
> 
> dlg@ix netstat$ netstat -I ix1 
> Name    Mtu   Network     Address              Ipkts Ierrs    Opkts Oerrs 
> Colls
> ix1     1500  <Link>      b8:ca:3a:66:e2:72 193968251     0 172754300     0
> ix1     1500  192.168.1.3 192.168.1.3       193968251     0 172754300     0
> ix1     1500  192.168.1.1 192.168.1.19      193968251     0 172754300     0
> dlg@ix netstat$ ./obj/netstat -I ix1
> Name    Mtu   Network     Address              Ipkts Ifail    Opkts Ofail 
> Colls
> ix1     1500  <Link>      b8:ca:3a:66:e2:72 193968251 1789065 172754300     0
> ix1     1500  192.168.1.3 192.168.1.3       193968251 1789065 172754300     0
> ix1     1500  192.168.1.1 192.168.1.19      193968251 1789065 172754300     0
> dlg@ix netstat$ ./obj/netstat -dI ix1
> Name    Mtu   Network     Address              Ipkts Idrop    Opkts Odrop 
> Colls
> ix1     1500  <Link>      b8:ca:3a:66:e2:72 193968251 1789065 172754300     0
> ix1     1500  192.168.1.3 192.168.1.3       193968251 1789065 172754300     0
> ix1     1500  192.168.1.1 192.168.1.19      193968251 1789065 172754300     0
> dlg@ix netstat$ ./obj/netstat -eI ix1 
> Name    Mtu   Network     Address              Ipkts Ierrs    Opkts Oerrs 
> Colls
> ix1     1500  <Link>      b8:ca:3a:66:e2:72 193968251     0 172754300     0
> ix1     1500  192.168.1.3 192.168.1.3       193968251     0 172754300     0
> ix1     1500  192.168.1.1 192.168.1.19      193968251     0 172754300     0
> 
> thoughts?

I'm all for this. Having a way to see every place where packets are
dropped is important.
 
> Index: systat/if.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/if.c,v
> retrieving revision 1.23
> diff -u -p -r1.23 if.c
> --- systat/if.c       16 Jan 2015 00:03:37 -0000      1.23
> +++ systat/if.c       4 Mar 2019 11:13:40 -0000
> @@ -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;
> Index: systat/systat.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/systat.1,v
> retrieving revision 1.110
> diff -u -p -r1.110 systat.1
> --- systat/systat.1   25 Jul 2018 17:24:14 -0000      1.110
> +++ systat/systat.1   4 Mar 2019 11:13:40 -0000
> @@ -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
> Index: systat/systat.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/systat.h,v
> retrieving revision 1.22
> diff -u -p -r1.22 systat.h
> --- systat/systat.h   30 May 2018 13:43:51 -0000      1.22
> +++ systat/systat.h   4 Mar 2019 11:13:40 -0000
> @@ -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 */
> Index: netstat/if.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/netstat/if.c,v
> retrieving revision 1.74
> diff -u -p -r1.74 if.c
> --- netstat/if.c      5 Oct 2015 15:40:39 -0000       1.74
> +++ netstat/if.c      4 Mar 2019 11:13:40 -0000
> @@ -63,6 +63,26 @@ static void catchalarm(int);
>  static void get_rtaddrs(int, struct sockaddr *, struct sockaddr **);
>  static void fetchifs(void);
>  
> +struct iftot;
> +
> +struct if_show_err {
> +     const char *name;
> +     const char *iname;
> +     const char *oname;
> +     uint64_t (*count)(uint64_t, uint64_t);
> +};
> +
> +static uint64_t      if_show_fails(uint64_t, uint64_t);
> +static uint64_t      if_show_errors(uint64_t, uint64_t);
> +static uint64_t      if_show_qdrops(uint64_t, uint64_t);
> +
> +static const struct if_show_err if_show_errs[] = {
> +     { "fail", "Ifail", "Ofail", if_show_fails },
> +     { "errs", "Ierrs", "Oerrs", if_show_errors },
> +     { "drop", "Idrop", "Odrop", if_show_qdrops },
> +};
> +static const struct if_show_err *if_errs = if_show_errs;
> +
>  /*
>   * Print a description of the network interfaces.
>   * NOTE: ifnetaddr is the location of the kernel global "ifnet",
> @@ -83,6 +103,8 @@ intpr(int interval, int repeatcount)
>       u_int64_t total = 0;
>       size_t len;
>  
> +     if_errs = &if_show_errs[dflag];
> +
>       if (interval) {
>               sidewaysintpr((unsigned)interval, repeatcount);
>               return;
> @@ -94,13 +116,13 @@ intpr(int interval, int repeatcount)
>           "Name", "Mtu", "Network", "Address");
>       if (bflag)
>               printf("%10.10s %10.10s", "Ibytes", "Obytes");
> -     else
> +     else {
>               printf("%8.8s %5.5s %8.8s %5.5s %5.5s",
> -                 "Ipkts", "Ierrs", "Opkts", "Oerrs", "Colls");
> +                 "Ipkts", if_errs->iname,
> +                 "Opkts", if_errs->oname, "Colls");
> +     }
>       if (tflag)
>               printf(" %s", "Time");
> -     if (dflag)
> -             printf(" %s", "Drop");
>       putchar('\n');
>  
>       lim = buf + len;
> @@ -137,13 +159,15 @@ intpr(int interval, int repeatcount)
>  
>                       if (qflag) {
>                               total = ifd->ifi_ibytes + ifd->ifi_obytes +
> -                                 ifd->ifi_ipackets + ifd->ifi_ierrors +
> -                                 ifd->ifi_opackets + ifd->ifi_oerrors +
> +                                 ifd->ifi_ipackets +
> +                                 ifd->ifi_opackets +
>                                   ifd->ifi_collisions;
> +                             total += if_errs->count(ifd->ifi_ierrors,
> +                                 ifd->ifi_iqdrops);
> +                             total += if_errs->count(ifd->ifi_oerrors,
> +                                 ifd->ifi_oqdrops);
>                               if (tflag)
>                                       total += 0; // XXX ifnet.if_timer;
> -                             if (dflag)
> -                                     total += ifd->ifi_oqdrops;
>                               if (total == 0)
>                                       continue;
>                       }
> @@ -271,13 +295,13 @@ hexprint:
>                           ifd->ifi_ibytes, ifd->ifi_obytes);
>       } else
>               printf("%8llu %5llu %8llu %5llu %5llu",
> -                 ifd->ifi_ipackets, ifd->ifi_ierrors,
> -                 ifd->ifi_opackets, ifd->ifi_oerrors,
> +                 ifd->ifi_ipackets,
> +                 if_errs->count(ifd->ifi_ierrors, ifd->ifi_iqdrops),
> +                 ifd->ifi_opackets,
> +                 if_errs->count(ifd->ifi_oerrors, ifd->ifi_oqdrops),
>                   ifd->ifi_collisions);
>       if (tflag)
>               printf(" %4d", 0 /* XXX ifnet.if_timer */);
> -     if (dflag)
> -             printf(" %5llu", ifd->ifi_oqdrops);
>       putchar('\n');
>  }
>  
> @@ -286,11 +310,12 @@ struct  iftot {
>       u_int64_t ift_ip;               /* input packets */
>       u_int64_t ift_ib;               /* input bytes */
>       u_int64_t ift_ie;               /* input errors */
> +     u_int64_t ift_iq;               /* input qdrops */
>       u_int64_t ift_op;               /* output packets */
>       u_int64_t ift_ob;               /* output bytes */
>       u_int64_t ift_oe;               /* output errors */
> +     u_int64_t ift_oq;               /* output qdrops */
>       u_int64_t ift_co;               /* collisions */
> -     u_int64_t ift_dr;               /* drops */
>  } ip_cur, ip_old, sum_cur, sum_old;
>  
>  volatile sig_atomic_t signalled;     /* set if alarm goes off "early" */
> @@ -328,8 +353,6 @@ banner:
>               printf("%5.5s in %5.5s%5.5s out %5.5s %5.5s",
>                   ip_cur.ift_name, " ",
>                   ip_cur.ift_name, " ", " ");
> -     if (dflag)
> -             printf(" %5.5s", " ");
>  
>       if (bflag)
>               printf("  %7.7s in %8.8s %6.6s out %5.5s",
> @@ -337,17 +360,14 @@ banner:
>       else
>               printf("  %5.5s in %5.5s%5.5s out %5.5s %5.5s",
>                   "total", " ", "total", " ", " ");
> -     if (dflag)
> -             printf(" %5.5s", " ");
>       putchar('\n');
>       if (bflag)
>               printf("%10.10s %8.8s %10.10s %5.5s",
>                   "bytes", " ", "bytes", " ");
>       else
>               printf("%8.8s %5.5s %8.8s %5.5s %5.5s",
> -                 "packets", "errs", "packets", "errs", "colls");
> -     if (dflag)
> -             printf(" %5.5s", "drops");
> +                 "packets", if_errs->name,
> +                 "packets", if_errs->name, "colls");
>  
>       if (bflag)
>               printf("%10.10s %8.8s %10.10s %5.5s",
> @@ -355,8 +375,6 @@ banner:
>       else
>               printf("  %8.8s %5.5s %8.8s %5.5s %5.5s",
>                   "packets", "errs", "packets", "errs", "colls");
> -     if (dflag)
> -             printf(" %5.5s", "drops");
>       putchar('\n');
>       fflush(stdout);
>       line = 0;
> @@ -380,13 +398,12 @@ loop:
>       } else
>               printf("%8llu %5llu %8llu %5llu %5llu",
>                   ip_cur.ift_ip - ip_old.ift_ip,
> -                 ip_cur.ift_ie - ip_old.ift_ie,
> +                 if_errs->count(ip_cur.ift_ie - ip_old.ift_ie,
> +                  ip_cur.ift_iq - ip_old.ift_iq),
>                   ip_cur.ift_op - ip_old.ift_op,
> -                 ip_cur.ift_oe - ip_old.ift_oe,
> +                 if_errs->count(ip_cur.ift_oe - ip_old.ift_oe,
> +                  ip_cur.ift_oq - ip_old.ift_oq),
>                   ip_cur.ift_co - ip_old.ift_co);
> -     if (dflag)
> -             printf(" %5llu",
> -                 ip_cur.ift_dr - ip_old.ift_dr);
>  
>       ip_old = ip_cur;
>  
> @@ -394,21 +411,21 @@ loop:
>               if (hflag) {
>                       fmt_scaled(sum_cur.ift_ib - sum_old.ift_ib, ibytes);
>                       fmt_scaled(sum_cur.ift_ob - sum_old.ift_ob, obytes);
> -                     printf("  %10s %8.8s %10s %5.5s",
> +                     printf("%10s %8.8s %10s %5.5s",
>                           ibytes, " ", obytes, " ");
>               } else
> -                     printf("  %10llu %8.8s %10llu %5.5s",
> +                     printf("%10llu %8.8s %10llu %5.5s",
>                           sum_cur.ift_ib - sum_old.ift_ib, " ",
>                           sum_cur.ift_ob - sum_old.ift_ob, " ");
>       } else
> -             printf("  %8llu %5llu %8llu %5llu %5llu",
> +             printf("%8llu %5llu %8llu %5llu %5llu",
>                   sum_cur.ift_ip - sum_old.ift_ip,
> -                 sum_cur.ift_ie - sum_old.ift_ie,
> +                 if_errs->count(sum_cur.ift_ie - sum_old.ift_ie,
> +                  sum_cur.ift_iq - sum_old.ift_iq),
>                   sum_cur.ift_op - sum_old.ift_op,
> -                 sum_cur.ift_oe - sum_old.ift_oe,
> +                 if_errs->count(sum_cur.ift_oe - sum_old.ift_oe,
> +                  sum_cur.ift_oq - sum_old.ift_oq),
>                   sum_cur.ift_co - sum_old.ift_co);
> -     if (dflag)
> -             printf(" %5llu", sum_cur.ift_dr - sum_old.ift_dr);
>  
>       sum_old = sum_cur;
>  
> @@ -547,21 +564,23 @@ fetchifs(void)
>                               ip_cur.ift_ip = ifd->ifi_ipackets;
>                               ip_cur.ift_ib = ifd->ifi_ibytes;
>                               ip_cur.ift_ie = ifd->ifi_ierrors;
> +                             ip_cur.ift_iq = ifd->ifi_iqdrops;
>                               ip_cur.ift_op = ifd->ifi_opackets;
>                               ip_cur.ift_ob = ifd->ifi_obytes;
>                               ip_cur.ift_oe = ifd->ifi_oerrors;
> +                             ip_cur.ift_oq = ifd->ifi_oqdrops;
>                               ip_cur.ift_co = ifd->ifi_collisions;
> -                             ip_cur.ift_dr = ifd->ifi_oqdrops;
>                       }
>  
>                       sum_cur.ift_ip += ifd->ifi_ipackets;
>                       sum_cur.ift_ib += ifd->ifi_ibytes;
>                       sum_cur.ift_ie += ifd->ifi_ierrors;
> +                     sum_cur.ift_iq += ifd->ifi_iqdrops;
>                       sum_cur.ift_op += ifd->ifi_opackets;
>                       sum_cur.ift_ob += ifd->ifi_obytes;
>                       sum_cur.ift_oe += ifd->ifi_oerrors;
> +                     sum_cur.ift_oq += ifd->ifi_oqdrops;
>                       sum_cur.ift_co += ifd->ifi_collisions;
> -                     sum_cur.ift_dr += ifd->ifi_oqdrops;
>                       break;
>               }
>       }
> @@ -571,11 +590,30 @@ fetchifs(void)
>               ip_cur.ift_ip = ifd->ifi_ipackets;
>               ip_cur.ift_ib = ifd->ifi_ibytes;
>               ip_cur.ift_ie = ifd->ifi_ierrors;
> +             ip_cur.ift_iq = ifd->ifi_iqdrops;
>               ip_cur.ift_op = ifd->ifi_opackets;
>               ip_cur.ift_ob = ifd->ifi_obytes;
>               ip_cur.ift_oe = ifd->ifi_oerrors;
> +             ip_cur.ift_oq = ifd->ifi_oqdrops;
>               ip_cur.ift_co = ifd->ifi_collisions;
> -             ip_cur.ift_dr = ifd->ifi_oqdrops;
>       }
>       free(buf);
> +}
> +
> +static uint64_t
> +if_show_fails(uint64_t errors, uint64_t qdrops)
> +{
> +     return (errors + qdrops);
> +}
> +
> +static uint64_t
> +if_show_errors(uint64_t errors, uint64_t qdrops)
> +{
> +     return (errors);
> +}
> +
> +static uint64_t
> +if_show_qdrops(uint64_t errors, uint64_t qdrops)
> +{
> +     return (qdrops);
>  }
> Index: netstat/main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/netstat/main.c,v
> retrieving revision 1.113
> diff -u -p -r1.113 main.c
> --- netstat/main.c    13 Aug 2018 14:36:54 -0000      1.113
> +++ netstat/main.c    4 Mar 2019 11:13:40 -0000
> @@ -129,7 +129,7 @@ main(int argc, char *argv[])
>       tableid = getrtable();
>  
>       while ((ch = getopt(argc, argv,
> -         "AaBbc:dFf:ghI:iLlM:mN:np:P:qrsT:tuvW:w:")) != -1)
> +         "AaBbc:deFf:ghI:iLlM:mN:np:P:qrsT:tuvW:w:")) != -1)
>               switch (ch) {
>               case 'A':
>                       Aflag = 1;
> @@ -149,7 +149,10 @@ main(int argc, char *argv[])
>                               errx(1, "count is %s", errstr);
>                       break;
>               case 'd':
> -                     dflag = 1;
> +                     dflag = IF_SHOW_DROP;
> +                     break;
> +             case 'e':
> +                     dflag = IF_SHOW_ERRS;
>                       break;
>               case 'F':
>                       Fflag = 1;
> Index: netstat/netstat.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/netstat/netstat.1,v
> retrieving revision 1.83
> diff -u -p -r1.83 netstat.1
> --- netstat/netstat.1 13 Jul 2018 09:06:58 -0000      1.83
> +++ netstat/netstat.1 4 Mar 2019 11:13:40 -0000
> @@ -45,7 +45,7 @@
>  .Op Fl N Ar system
>  .Nm netstat
>  .Bk -words
> -.Op Fl bdFgilmnqrstu
> +.Op Fl bdeFgilmnqrstu
>  .Op Fl f Ar address_family
>  .Op Fl p Ar protocol
>  .Op Fl M Ar core
> @@ -53,7 +53,7 @@
>  .Op Fl T Ar rtable
>  .Ek
>  .Nm netstat
> -.Op Fl bdhn
> +.Op Fl bdehn
>  .Op Fl c Ar count
>  .Op Fl I Ar interface
>  .Op Fl M Ar core
> Index: netstat/netstat.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/netstat/netstat.h,v
> retrieving revision 1.72
> diff -u -p -r1.72 netstat.h
> --- netstat/netstat.h 13 Aug 2018 14:36:54 -0000      1.72
> +++ netstat/netstat.h 4 Mar 2019 11:13:40 -0000
> @@ -142,6 +142,10 @@ void     routepr(u_long, u_long, u_long, u_l
>  
>  void nsprotopr(u_long, char *);
>  
> +#define      IF_SHOW_FAIL    0
> +#define      IF_SHOW_ERRS    1
> +#define      IF_SHOW_DROP    2
> +
>  void intpr(int, int);
>  
>  void mroutepr(void);
> 

-- 
:wq Claudio

Reply via email to