From owner-p4-projects@FreeBSD.ORG Sun Jun 7 17:03:25 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7F45E1065674; Sun, 7 Jun 2009 17:03:24 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3BF61106566C for ; Sun, 7 Jun 2009 17:03:24 +0000 (UTC) (envelope-from pgj@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 29CC98FC17 for ; Sun, 7 Jun 2009 17:03:24 +0000 (UTC) (envelope-from pgj@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n57H3OvZ043155 for ; Sun, 7 Jun 2009 17:03:24 GMT (envelope-from pgj@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n57H3Oja043153 for perforce@freebsd.org; Sun, 7 Jun 2009 17:03:24 GMT (envelope-from pgj@FreeBSD.org) Date: Sun, 7 Jun 2009 17:03:24 GMT Message-Id: <200906071703.n57H3Oja043153@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to pgj@FreeBSD.org using -f From: Gabor Pali To: Perforce Change Reviews Cc: Subject: PERFORCE change 163718 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Jun 2009 17:03:25 -0000 http://perforce.freebsd.org/chv.cgi?CH=163718 Change 163718 by pgj@petymeg-current on 2009/06/07 17:02:23 - Add and use new properties: snd_cc, rcv_cc, qlen, incqlen, qlimit - Enable compilation with debugging symbols for both libnetstat and netstat - Add extract_xsocket_data() for extracing common properties from a PF_LOCAL-type socket - sotoxsocket() has no return value, so do not check it :) - Fix an sti_iterator bug Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#4 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#6 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#9 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#6 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#8 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/Makefile#3 edit .. //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/unix.c#8 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#4 (text+ko) ==== @@ -7,6 +7,7 @@ INCS= netstat.h CFLAGS+= -I. -I${.CURDIR} +CFLAGS+= -g SHLIB_MAJOR= 1 ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#6 (text+ko) ==== @@ -26,6 +26,8 @@ { .n_name = NULL }, }; +static void extract_xsocket_data(struct xsocket *, struct socket_type *); + static const char *const socktype[] = { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" }; @@ -62,10 +64,12 @@ for (xug = (struct xunpgen *)((char *)xug + xug->xug_len); xug->xug_len > sizeof(struct xunpgen); xug = (struct xunpgen *)((char *)xug + xug->xug_len)) { + xunp = (struct xunpcb *)xug; /* Keep active PCBs only. */ if (xunp->xu_unp.unp_gencnt <= oxug->xug_gen) { stp = _netstat_st_allocate(list, PF_LOCAL, type, socktype[type]); + extract_xsocket_data(&xunp->xu_socket, stp); stp->xup = *((struct xunpcb *)xug); } } @@ -140,12 +144,10 @@ } } KREAD(unp->unp_socket, &so, sizeof(so)); - if (sotoxsocket(&so, &xu.xu_socket) != 0) { - list->stl_error = NETSTAT_ERROR_UNDEFINED; - return (-1); - } + sotoxsocket(&so, &xu.xu_socket); stp = _netstat_st_allocate(list, PF_LOCAL, type, socktype[type]); + extract_xsocket_data(&xu.xu_socket, stp); stp->xup = xu; } @@ -217,3 +219,13 @@ #undef NLP_SCT return (0); } + +void +extract_xsocket_data(struct xsocket *xso, struct socket_type *stp) +{ + stp->st_qlen = xso->so_qlen; + stp->st_incqlen = xso->so_incqlen; + stp->st_qlimit = xso->so_qlimit; + stp->st_snd_cc = xso->so_snd.sb_cc; + stp->st_rcv_cc = xso->so_rcv.sb_cc; +} ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#9 (text+ko) ==== @@ -2,6 +2,8 @@ #ifndef _NETSTAT_H_ #define _NETSTAT_H_ +#include + #define NETSTAT_MAXCALLER 16 #define SOCKTYPE_MAXNAME 32 @@ -49,10 +51,17 @@ struct socket_type_list *, int flags, void *kvm_handle); /* Accessor functions: */ -int netstat_st_get_family(const struct socket_type *stp); -int netstat_st_get_protocol(const struct socket_type *stp); -const char *netstat_st_get_name(const struct socket_type *stp); -void *netstat_st_get_pcb(const struct socket_type *stp); +int netstat_st_get_family(const struct socket_type *stp); +int netstat_st_get_protocol(const struct socket_type *stp); +const char *netstat_st_get_name(const struct socket_type *stp); +u_int netstat_st_get_snd_cc(const struct socket_type *stp); +u_int netstat_st_get_rcv_cc(const struct socket_type *stp); +u_short netstat_st_get_qlen(const struct socket_type *stp); +u_short netstat_st_get_incqlen(const struct socket_type *stp); +u_short netstat_st_get_qlimit(const struct socket_type *stp); + +/* XXX: Remove this hack :) */ +void *netstat_st_get_pcb(const struct socket_type *stp); __END_DECLS ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#6 (text+ko) ==== @@ -26,16 +26,19 @@ int st_flags; char st_name[SOCKTYPE_MAXNAME]; - /* Mixed properties, needed for different reasons, to be refined - * continuously. - */ struct address_type *st_address; /* address(es) */ int st_addrcnt; /* address count */ - struct sockcred st_credentials; - struct xsockbuf st_rcv; /* receive queue */ - struct xsockbuf st_snd; /* send queue */ + u_int st_snd_cc; /* actual chars in the send buffer */ + u_int st_rcv_cc; /* actual chars in the receive buffer */ + u_short st_qlen; /* number of unaccepted connections */ + u_short st_incqlen; /* number of unaccepted incomplete + connections */ + u_short st_qlimit; /* max number queued connections */ + /* Mixed properties, needed for different reasons, to be refined + * continuously. + */ struct xunpcb xup; /* xun */ /* list of types */ @@ -62,6 +65,5 @@ const char *name); void _netstat_st_reset_stats(struct socket_type *list); -int sotoxsocket(struct socket *, struct xsocket *); - +void sotoxsocket(struct socket *so, struct xsocket *xso); #endif /* !_NETSTAT_INTERNAL_H_ */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#8 (text+ko) ==== @@ -194,6 +194,9 @@ { struct socket_type *stp; + if (iterator->sti_first == NULL) + return (NULL); + stp = malloc(sizeof(*stp)); if (stp == NULL) return (NULL); @@ -207,6 +210,9 @@ { struct socket_type *stp; + if (iterator->sti_next == NULL) + return (NULL); + stp = malloc(sizeof(*stp)); if (stp == NULL) return (NULL); @@ -246,6 +252,36 @@ return (stp->st_name); } +u_int +netstat_st_get_rcv_cc(const struct socket_type *stp) +{ + return (stp->st_rcv_cc); +} + +u_int +netstat_st_get_snd_cc(const struct socket_type *stp) +{ + return (stp->st_snd_cc); +} + +u_short +netstat_st_get_qlen(const struct socket_type *stp) +{ + return (stp->st_qlen); +} + +u_short +netstat_st_get_incqlen(const struct socket_type *stp) +{ + return (stp->st_incqlen); +} + +u_short +netstat_st_get_qlimit(const struct socket_type *stp) +{ + return (stp->st_qlimit); +} + /* XXX: hack alert :) */ void * netstat_st_get_pcb(const struct socket_type *stp) ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/Makefile#3 (text+ko) ==== @@ -24,7 +24,7 @@ LDADD= -lkvm -lmemstat -lutil -lnetstat # XXX: temp. solution -CFLAGS+= -I../../lib/libnetstat +CFLAGS+= -I../../lib/libnetstat -g LDFLAGS+= -L../../lib/libnetstat .if ${MK_NETGRAPH_SUPPORT} != "no" ==== //depot/projects/soc2009/pgj_libstat/src/usr.bin/netstat/unix.c#8 (text+ko) ==== @@ -150,17 +150,20 @@ first = 0; } - if (Lflag && so->so_qlimit == 0) + if (Lflag && netstat_st_get_qlimit(stp) == 0) return; if (Lflag) { - snprintf(buf1, 15, "%d/%d/%d", so->so_qlen, - so->so_incqlen, so->so_qlimit); + snprintf(buf1, 15, "%d/%d/%d", netstat_st_get_qlen(stp), + netstat_st_get_incqlen(stp), netstat_st_get_qlimit(stp)); printf("unix %-14.14s", buf1); } else { printf("%8lx %-6.6s %6u %6u %8lx %8lx %8lx %8lx", - (long)so->so_pcb, netstat_st_get_name(stp), - so->so_rcv.sb_cc, so->so_snd.sb_cc, (long)unp->unp_vnode, + (long)so->so_pcb, + netstat_st_get_name(stp), + netstat_st_get_rcv_cc(stp), + netstat_st_get_snd_cc(stp), + (long)unp->unp_vnode, (long)unp->unp_conn, (long)LIST_FIRST(&unp->unp_refs), (long)LIST_NEXT(unp, unp_reflink));