From owner-p4-projects@FreeBSD.ORG Wed Jun 3 16:42:11 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4B0B81065675; Wed, 3 Jun 2009 16:42:11 +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 0CF781065673 for ; Wed, 3 Jun 2009 16:42:11 +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 EF7C68FC1C for ; Wed, 3 Jun 2009 16:42:10 +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 n53GgAkM078785 for ; Wed, 3 Jun 2009 16:42:10 GMT (envelope-from pgj@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n53GgANE078783 for perforce@freebsd.org; Wed, 3 Jun 2009 16:42:10 GMT (envelope-from pgj@FreeBSD.org) Date: Wed, 3 Jun 2009 16:42:10 GMT Message-Id: <200906031642.n53GgANE078783@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 163425 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: Wed, 03 Jun 2009 16:42:12 -0000 http://perforce.freebsd.org/chv.cgi?CH=163425 Change 163425 by pgj@petymeg-current on 2009/06/03 16:41:53 Import some utility routines and an overall skeleton from libmemstat(3) sources. This will serve as a base for further experimentations. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_all.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_tcp.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_udp.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#2 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#2 (text+ko) ==== @@ -2,7 +2,8 @@ .include LIB= netstat -SRCS= netstat_util.c +SRCS= netstat_tcp.c netstat_udp.c \ + netstat_all.c netstat_util.c INCS= netstat.h ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#2 (text+ko) ==== @@ -2,6 +2,16 @@ #ifndef _NETSTAT_H_ #define _NETSTAT_H_ +#define NETSTAT_MAXCPU 32 +#define NETSTAT_MAXCALLER 16 + +#define NETSTAT_TYPE_UNKNOWN 0 +#define NETSTAT_TYPE_TCP 1 +#define NETSTAT_TYPE_UDP 2 +#define NETSTAT_TYPE_ANY 255 + +#define NETSTAT_MAXNAME 32 + #define NETSTAT_ERROR_UNDEFINED 0 #define NETSTAT_ERROR_NOMEMORY 1 #define NETSTAT_ERROR_VERSION 2 @@ -9,4 +19,28 @@ #define NETSTAT_ERROR_KVM_NOSYMBOL 4 #define NETSTAT_ERROR_KVM_SHORTREAD 5 +struct netstat; +struct netstat_list; + +__BEGIN_DECLS +const char *netstat_strerror(int); + +struct netstat_list *netstat_nsl_alloc(void); +struct netstat *netstat_nsl_first(struct netstat_list *); +struct netstat *netstat_nsl_next(struct netstat *); +struct netstat *netstat_nsl_find(struct netstat_list *, + int, const char *); + +void netstat_nsl_free(struct netstat_list *); +int netstat_nsl_geterror(struct netstat_list *); + +int netstat_sysctl_all(struct netstat_list *, int); +int netstat_sysctl_tcp(struct netstat_list *, int); +int netstat_sysctl_udp(struct netstat_list *, int); + +int netstat_kvm_all(struct netstat_list *, void *); +int netstat_kvm_tcp(struct netstat_list *, void *); +int netstat_kvm_udp(struct netstat_list *, void *); +__END_DECLS + #endif /* !_NETSTAT_H_ */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#2 (text+ko) ==== @@ -2,4 +2,27 @@ #ifndef _NETSTAT_INTERNAL_H_ #define _NETSTAT_INTERNAL_H_ +#include +#include + +struct netstat { + int ns_type; + char ns_name[NETSTAT_MAXNAME]; + + LIST_ENTRY(netstat) ns_list; +}; + +struct netstat_list { + LIST_HEAD(, netstat) nsl_list; + int nsl_error; +}; + +int kread(kvm_t *, void *, void *, size_t, size_t); +int kread_string(kvm_t *, void *, char *, int); + +void _netstat_nsl_empty(struct netstat_list *); +struct netstat *_netstat_ns_allocate(struct netstat_list *, + int, const char *); +void _netstat_ns_reset_stats(struct netstat *); + #endif /* !_NETSTAT_INTERNAL_H_ */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#2 (text+ko) ==== @@ -1,11 +1,14 @@ +#include #include #include +#include +#include #include "netstat.h" #include "netstat_internal.h" -static int +int kread(kvm_t *kvm, void *kvm_pointer, void *address, size_t size, size_t offset) { @@ -20,7 +23,7 @@ return (0); } -static int +int kread_string(kvm_t *kvm, void *kvm_pointer, char *buffer, int buflen) { ssize_t ret; @@ -39,3 +42,124 @@ buffer[i - 1] = '\0'; return (0); } + +const char * +netstat_strerror(int error) +{ + switch (error) { + case NETSTAT_ERROR_NOMEMORY: + return ("Cannot allocate memory"); + case NETSTAT_ERROR_VERSION: + return ("Version mismatch"); + case NETSTAT_ERROR_KVM: + return ("KVM error"); + case NETSTAT_ERROR_KVM_NOSYMBOL: + return ("KVM unable to find symbol"); + case NETSTAT_ERROR_KVM_SHORTREAD: + return ("KVM short read"); + case NETSTAT_ERROR_UNDEFINED: + default: + return ("Unknown error"); + } +} + +struct netstat_list * +netstat_nsl_alloc(void) +{ + struct netstat_list *nslp; + + nslp = malloc(sizeof(*nslp)); + if (nslp == NULL) + return NULL; + + LIST_INIT(&nslp->nsl_list); + nslp->nsl_error = NETSTAT_ERROR_UNDEFINED; + return (nslp); +} + +struct netstat * +netstat_nsl_first(struct netstat_list *list) +{ + return (LIST_FIRST(&list->nsl_list)); +} + +struct netstat * +netstat_nsl_next(struct netstat * nsp) +{ + return (LIST_NEXT(nsp, ns_list)); +} + +void +_netstat_nsl_empty(struct netstat_list *list) +{ + struct netstat *nsp; + + while ((nsp = LIST_FIRST(&list->nsl_list))) { + LIST_REMOVE(nsp, ns_list); + free(nsp); + } +} + +void +_netstat_nsl_free(struct netstat_list *list) +{ + _netstat_nsl_empty(list); + free(list); +} + +int +netstat_nsl_geterror(struct netstat_list *list) +{ + return (list->nsl_error); +} + +struct netstat * +netstat_nsl_find(struct netstat_list *list, int ns_type, + const char *name) +{ + struct netstat *nsp; + + LIST_FOREACH(nsp, &list->nsl_list, ns_list) { + if ((nsp->ns_type == ns_type || + ns_type == NETSTAT_TYPE_ANY) && + strcmp(nsp->ns_name, name) == 0) + return (nsp); + } + return (NULL); +} + +struct netstat * +_netstat_ns_allocate(struct netstat_list *list, int ns_type, + const char *name) +{ + struct netstat *nsp; + + nsp = malloc(sizeof(*nsp)); + if (nsp == NULL) + return (NULL); + + bzero(nsp, sizeof(*nsp)); + + nsp->ns_type = ns_type; + strlcpy(nsp->ns_name, name, NETSTAT_MAXNAME); + LIST_INSERT_HEAD(&list->nsl_list, nsp, ns_list); + return (nsp); +} + +void +_netstat_ns_reset_stats(struct netstat *nsp) +{ +} + +const char * +netstat_get_name(const struct netstat *nsp) +{ + return (nsp->ns_name); +} + +int +netstat_get_type(const struct netstat *nsp) +{ + return (nsp->ns_type); +} +