1/*	$NetBSD: kstat.c,v 1.3 2018/05/28 21:05:09 chs Exp $	*/
2
3/*-
4 * Copyright (c) 2009 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andrew Doran.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*-
33 * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org>
34 * All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 *    notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 *    notice, this list of conditions and the following disclaimer in the
43 *    documentation and/or other materials provided with the distribution.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58#include <sys/param.h>
59#include <sys/kernel.h>
60#include <sys/systm.h>
61#include <sys/kmem.h>
62#include <sys/sysctl.h>
63#include <sys/kstat.h>
64
65kstat_t *
66kstat_create(char *module, int instance, char *name, char *class, uchar_t type,
67	     ulong_t ndata, uchar_t flags)
68{
69	struct sysctl_oid *root;
70	const struct sysctlnode *rnode, *mnode, *cnode;
71	kstat_t *ks;
72
73	KASSERT(instance == 0);
74	KASSERT(type == KSTAT_TYPE_NAMED);
75	KASSERT(flags == KSTAT_FLAG_VIRTUAL);
76
77	ks = kmem_zalloc(sizeof(*ks), KM_SLEEP);
78	ks->ks_ndata = ndata;
79
80	sysctl_createv(&ks->ks_clog, 0, NULL, &rnode,
81		CTLFLAG_PERMANENT,
82		CTLTYPE_NODE, "kstat", NULL,
83		NULL, 0, NULL, 0,
84		CTL_CREATE, CTL_EOL);
85	sysctl_createv(&ks->ks_clog, 0, &rnode, &mnode,
86		CTLFLAG_PERMANENT,
87		CTLTYPE_NODE, module, NULL,
88		NULL, 0, NULL, 0,
89		CTL_CREATE, CTL_EOL);
90	sysctl_createv(&ks->ks_clog, 0, &mnode, &cnode,
91		CTLFLAG_PERMANENT,
92		CTLTYPE_NODE, class, NULL,
93		NULL, 0, NULL, 0,
94		CTL_CREATE, CTL_EOL);
95	sysctl_createv(&ks->ks_clog, 0, &cnode, &ks->ks_node,
96		CTLFLAG_PERMANENT,
97		CTLTYPE_NODE, name, NULL,
98		NULL, 0, NULL, 0,
99		CTL_CREATE, CTL_EOL);
100
101	return (ks);
102}
103
104void
105kstat_install(kstat_t *ks)
106{
107	kstat_named_t *ksent;
108	u_int i;
109
110	ksent = ks->ks_data;
111
112	for (i = 0; i < ks->ks_ndata; i++, ksent++) {
113		KASSERT(ksent->data_type == KSTAT_DATA_UINT64);
114		sysctl_createv(&ks->ks_clog, 0, &ks->ks_node, NULL,
115			CTLFLAG_PERMANENT | CTLFLAG_READONLY,
116			CTLTYPE_QUAD, ksent->name, NULL,
117			NULL, 0, &ksent->value.ui64, 0,
118			CTL_CREATE, CTL_EOL);
119	}
120}
121
122void
123kstat_delete(kstat_t *ks)
124{
125
126	sysctl_teardown(&ks->ks_clog);
127	kmem_free(ks, sizeof(*ks));
128}
129
130void
131kstat_set_string(char *dst, const char *src)
132{
133
134	memset(dst, 0, KSTAT_STRLEN);
135	(void) strncpy(dst, src, KSTAT_STRLEN - 1);
136}
137
138void
139kstat_named_init(kstat_named_t *knp, const char *name, uchar_t data_type)
140{
141
142	kstat_set_string(knp->name, name);
143	knp->data_type = data_type;
144}
145