Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Jun 2009 16:42:10 GMT
From:      Gabor Pali <pgj@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 163425 for review
Message-ID:  <200906031642.n53GgANE078783@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <bsd.own.mk>
 
 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 <sys/queue.h>
+#include <kvm.h>
+
+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 <sys/queue.h>
 #include <sys/types.h>
 #include <kvm.h>
+#include <stdlib.h>
+#include <string.h>
 
 #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);
+}
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906031642.n53GgANE078783>