summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/acctctl.h
blob: 1dfa8e8577cf99fc334ba03fce49e3f7d740afa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_ACCTCTL_H
#define	_SYS_ACCTCTL_H

#include <sys/types.h>
#include <sys/bitmap.h>
#include <sys/sysmacros.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Definitions for acctctl() system call
 */

/*
 * modes
 */
#define	AC_PROC		(0x1 << 24)	/* change process accounting settings */
#define	AC_TASK		(0x2 << 24)	/* change task accounting settings */
#define	AC_FLOW		(0x4 << 24)	/* change flow accounting settings */
#define	AC_NET		(0x8 << 24)	/* change network accounting settings */
#define	AC_MODE(x)	((x) & 0xff000000)

/*
 * options
 */
#define	AC_FILE_SET	(0x01)	/* set accounting file name */
#define	AC_FILE_GET	(0x02)	/* get accounting file name */
#define	AC_RES_SET	(0x04)	/* set (enable/disable) resources */
#define	AC_RES_GET	(0x08)	/* get a list of enabled resources */
#define	AC_STATE_SET	(0x10)	/* set accounting mode state (on/off) */
#define	AC_STATE_GET	(0x20)	/* get accounting mode state */
#define	AC_OPTION(x)	((x) & 0x00ffffff)

/*
 * Process accounting resource IDs
 */
#define	AC_NONE			0	/* special end-of-list identifier */
#define	AC_PROC_PID		1	/* process ID */
#define	AC_PROC_UID		2	/* user ID */
#define	AC_PROC_GID		3	/* group ID */
#define	AC_PROC_PROJID		4	/* project ID */
#define	AC_PROC_TASKID		5	/* task ID */
#define	AC_PROC_CPU		6	/* user/system cpu time */
#define	AC_PROC_TIME		7	/* start/finish time */
#define	AC_PROC_COMMAND		8	/* command name */
#define	AC_PROC_TTY		9	/* control tty */
#define	AC_PROC_HOSTNAME	10	/* hostname */
#define	AC_PROC_MICROSTATE	11	/* microstate accounting */
#define	AC_PROC_FLAG		12	/* accounting flags */
#define	AC_PROC_ANCPID		13	/* ancestor process's ID */
#define	AC_PROC_WAIT_STATUS	14	/* process wait status */
#define	AC_PROC_ZONENAME	15	/* zone name */
#define	AC_PROC_MEM		16	/* memory usage */
#define	AC_PROC_MAX_RES		16	/* must be equal to the number above */

/*
 * Task accounting resource IDs
 */
#define	AC_TASK_TASKID		1	/* task ID */
#define	AC_TASK_PROJID		2	/* project ID */
#define	AC_TASK_CPU		3	/* user/system cpu time */
#define	AC_TASK_TIME		4	/* start/finish time */
#define	AC_TASK_HOSTNAME	5	/* hostname */
#define	AC_TASK_MICROSTATE	6	/* microstate accounting */
#define	AC_TASK_ANCTASKID	7	/* ancestor task's taskid */
#define	AC_TASK_ZONENAME	8	/* zone name */
#define	AC_TASK_MAX_RES		8	/* must be equal to the number above */

/*
 * Flow accounting resource IDs
 */
#define	AC_FLOW_SADDR		1	/* source address */
#define	AC_FLOW_DADDR		2	/* destination address */
#define	AC_FLOW_SPORT		3	/* source port */
#define	AC_FLOW_DPORT		4	/* destination port */
#define	AC_FLOW_PROTOCOL	5	/* protocol */
#define	AC_FLOW_DSFIELD		6	/* dsfield */
#define	AC_FLOW_CTIME		7	/* creation time for this flow */
#define	AC_FLOW_LSEEN		8	/* pkt last seen for this flow */
#define	AC_FLOW_NBYTES		9	/* no. of bytes in this flow */
#define	AC_FLOW_NPKTS		10	/* no. of packets for this flow */
#define	AC_FLOW_PROJID		11	/* project id */
#define	AC_FLOW_UID		12	/* user id */
#define	AC_FLOW_ANAME		13	/* action instance name */
#define	AC_FLOW_MAX_RES		13	/* must be equal to the number above */

/*
 * Network accounting resource IDs
 */
#define	AC_NET_NAME		1	/* flow name */
#define	AC_NET_EHOST		2	/* ethernet source address */
#define	AC_NET_EDEST		3	/* ethernet destination address */
#define	AC_NET_VLAN_TPID	4	/* VLAN protocol ID */
#define	AC_NET_VLAN_TCI		5	/* VLAN tag control info. */
#define	AC_NET_SAP		6	/* SAP */
#define	AC_NET_PRIORITY		7	/* Priority */
#define	AC_NET_BWLIMIT		8	/* Bandwidth limit */
#define	AC_NET_DEVNAME		9	/* Device name */
#define	AC_NET_SADDR		10	/* Source IP address */
#define	AC_NET_DADDR		11	/* Dest IP address */
#define	AC_NET_SPORT		12	/* Source Port */
#define	AC_NET_DPORT		13	/* Dest Port */
#define	AC_NET_PROTOCOL		14	/* Protocol */
#define	AC_NET_DSFIELD		15	/* DiffServ field */
#define	AC_NET_CURTIME		16	/* Current Time */
#define	AC_NET_IBYTES		17	/* Inbound Bytes */
#define	AC_NET_OBYTES		18	/* Outbound Bytes */
#define	AC_NET_IPKTS		19	/* Inbound Packets */
#define	AC_NET_OPKTS		20	/* Outbound Packets */
#define	AC_NET_IERRPKTS		21	/* Inbound Error Packets */
#define	AC_NET_OERRPKTS		22	/* Outbound Error Packets */
#define	AC_NET_MAX_RES		22	/* must be equal to the number above */

#define	AC_MAX_RES		\
	MAX(MAX(MAX(AC_PROC_MAX_RES, AC_TASK_MAX_RES), AC_FLOW_MAX_RES), \
	AC_NET_MAX_RES)
#define	AC_MASK_SZ		BT_BITOUL(AC_MAX_RES + 1)

/*
 * resource states
 */
#define	AC_ON		1	/* enabled resource */
#define	AC_OFF		0	/* disabled resource */

typedef struct ac_res {
	int	ar_id;		/* resource ID */
	int	ar_state;	/* resource state; see above */
} ac_res_t;

#ifdef	_KERNEL

#include <sys/vnode.h>
#include <sys/zone.h>
#include <sys/list.h>

typedef struct ac_info {
	kmutex_t	ac_lock;		/* protects the structure */
	vnode_t		*ac_vnode;		/* exacct file vnode pointer */
	char		*ac_file;		/* exacct file name */
	int		ac_state;		/* accounting state */
	ulong_t		ac_mask[AC_MASK_SZ];	/* bitmask of resources */
} ac_info_t;

/*
 * Key used for retrieving per-zone exacct settings.  This remains
 * uninitialized (ZONE_KEY_UNINITIALIZED) until the acctctl module is loaded.
 */
extern zone_key_t exacct_zone_key;

/*
 * Per-zone exacct settings.  Each zone may have its own settings for
 * process, task, flow, and network accounting.
 *
 * Per-zone flow accounting has not yet been implemented, so this
 * provides zones with the view that flow accounting in the zone hasn't
 * been initialized (which is true).  The various system calls will fail
 * to set flow accounting parameters from within a zone.
 *
 * The global list of accounting settings is used when we check to see
 * if the accounting file is already in use by any zone.
 */
struct exacct_globals {
	ac_info_t	ac_task;
	ac_info_t	ac_proc;
	ac_info_t	ac_flow;
	ac_info_t	ac_net;
	list_node_t	ac_link;
};

#else

extern int acctctl(int cmd, void *buf, size_t bufsz);

#endif	/* ifdef _KERNEL */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_ACCTCTL_H */