PERFORCE change 163425 for review
Gabor Pali
pgj at FreeBSD.org
Wed Jun 3 16:42:12 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163425
Change 163425 by pgj at 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);
+}
+
More information about the p4-projects
mailing list