svn commit: r264076 - in stable/10: sys/net usr.bin/netstat
Gleb Smirnoff
glebius at FreeBSD.org
Thu Apr 3 14:58:53 UTC 2014
Author: glebius
Date: Thu Apr 3 14:58:52 2014
New Revision: 264076
URL: http://svnweb.freebsd.org/changeset/base/264076
Log:
o Provide a compatibility shim for netstat(1) to obtain output queue
drops via NET_RT_IFLISTL sysctl. The sysctl handler appends oqdrops
at the end of struct if_msghdrl, and netstat(1) sees that as an
additional field of struct if_data. This allows us to fetch the data
keeping ABI and API compatibility.
This is direct commit to stable/10.
o Merge r263331 from head, to restore printing of queue drops.
Sponsored by: Nginx, Inc.
Sponsored by: Netflix
Modified:
stable/10/sys/net/if.h
stable/10/sys/net/rtsock.c
stable/10/usr.bin/netstat/if.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/net/if.h
==============================================================================
--- stable/10/sys/net/if.h Thu Apr 3 14:47:36 2014 (r264075)
+++ stable/10/sys/net/if.h Thu Apr 3 14:58:52 2014 (r264076)
@@ -106,6 +106,9 @@ struct if_data {
uint64_t ifi_hwassist; /* HW offload capabilities, see IFCAP */
time_t ifi_epoch; /* uptime at attach or stat reset */
struct timeval ifi_lastchange; /* time of last administrative change */
+#ifdef _IFI_OQDROPS
+ u_long ifi_oqdrops; /* dropped on output */
+#endif
};
/*-
@@ -283,6 +286,9 @@ struct if_msghdrl {
u_short ifm_len; /* length of if_msghdrl incl. if_data */
u_short ifm_data_off; /* offset of if_data from beginning */
struct if_data ifm_data;/* statistics and other data about if */
+#ifdef _IN_NET_RTSOCK_C
+ u_long ifi_oqdrops;
+#endif
};
/*
Modified: stable/10/sys/net/rtsock.c
==============================================================================
--- stable/10/sys/net/rtsock.c Thu Apr 3 14:47:36 2014 (r264075)
+++ stable/10/sys/net/rtsock.c Thu Apr 3 14:58:52 2014 (r264076)
@@ -52,6 +52,7 @@
#include <sys/sysctl.h>
#include <sys/systm.h>
+#define _IN_NET_RTSOCK_C
#include <net/if.h>
#include <net/if_dl.h>
#include <net/if_llatbl.h>
@@ -105,6 +106,7 @@ struct if_data32 {
uint32_t ifi_hwassist;
int32_t ifi_epoch;
struct timeval32 ifi_lastchange;
+ uint32_t ifi_oqdrops;
};
struct if_msghdr32 {
@@ -1662,6 +1664,7 @@ sysctl_iflist_ifml(struct ifnet *ifp, st
if (carp_get_vhid_p != NULL)
ifm32->ifm_data.ifi_vhid =
(*carp_get_vhid_p)(ifp->if_addr);
+ ifm32->ifm_data.ifi_oqdrops = ifp->if_snd.ifq_drops;
return (SYSCTL_OUT(w->w_req, (caddr_t)ifm32, len));
}
@@ -1679,6 +1682,9 @@ sysctl_iflist_ifml(struct ifnet *ifp, st
if (carp_get_vhid_p != NULL)
ifm->ifm_data.ifi_vhid = (*carp_get_vhid_p)(ifp->if_addr);
+ ifm->ifm_data.ifi_datalen += sizeof(u_long);
+ ifm->ifi_oqdrops = ifp->if_snd.ifq_drops;
+
return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len));
}
Modified: stable/10/usr.bin/netstat/if.c
==============================================================================
--- stable/10/usr.bin/netstat/if.c Thu Apr 3 14:47:36 2014 (r264075)
+++ stable/10/usr.bin/netstat/if.c Thu Apr 3 14:58:52 2014 (r264076)
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/time.h>
+#define _IFI_OQDROPS
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_dl.h>
@@ -251,7 +252,7 @@ intpr(int interval, void (*pfunc)(char *
printf(" %10.10s","Obytes");
printf(" %5s", "Coll");
if (dflag)
- printf(" %s", "Drop");
+ printf(" %s", "Drop");
putchar('\n');
}
@@ -382,7 +383,8 @@ intpr(int interval, void (*pfunc)(char *
if (bflag)
show_stat("lu", 10, IFA_STAT(obytes), link|network);
show_stat("NRSlu", 5, IFA_STAT(collisions), link);
- /* XXXGL: output queue drops */
+ if (dflag)
+ show_stat("LSlu", 5, IFA_STAT(oqdrops), link);
putchar('\n');
if (!aflag)
@@ -460,6 +462,7 @@ struct iftot {
u_long ift_id; /* input drops */
u_long ift_op; /* output packets */
u_long ift_oe; /* output errors */
+ u_long ift_od; /* output drops */
u_long ift_co; /* collisions */
u_long ift_ib; /* input bytes */
u_long ift_ob; /* output bytes */
@@ -495,6 +498,7 @@ fill_iftot(struct iftot *st)
st->ift_ib += IFA_STAT(ibytes);
st->ift_op += IFA_STAT(opackets);
st->ift_oe += IFA_STAT(oerrors);
+ st->ift_od += IFA_STAT(oqdrops);
st->ift_ob += IFA_STAT(obytes);
st->ift_co += IFA_STAT(collisions);
}
@@ -573,7 +577,8 @@ loop:
show_stat("lu", 5, new->ift_oe - old->ift_oe, 1);
show_stat("lu", 10, new->ift_ob - old->ift_ob, 1);
show_stat("NRSlu", 5, new->ift_co - old->ift_co, 1);
- /* XXXGL: output queue drops */
+ if (dflag)
+ show_stat("LSlu", 5, new->ift_od - old->ift_od, 1);
putchar('\n');
fflush(stdout);
More information about the svn-src-stable
mailing list