xref: /illumos-gate/usr/src/uts/common/sys/acctctl.h (revision edb348833aaacfa1176e502ad38875fd0b2717ab)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_ACCTCTL_H
27 #define	_SYS_ACCTCTL_H
28 
29 #include <sys/types.h>
30 #include <sys/bitmap.h>
31 #include <sys/sysmacros.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 /*
38  * Definitions for acctctl() system call
39  */
40 
41 /*
42  * modes
43  */
44 #define	AC_PROC		(0x1 << 24)	/* change process accounting settings */
45 #define	AC_TASK		(0x2 << 24)	/* change task accounting settings */
46 #define	AC_FLOW		(0x4 << 24)	/* change flow accounting settings */
47 #define	AC_NET		(0x8 << 24)	/* change network accounting settings */
48 #define	AC_MODE(x)	((x) & 0xff000000)
49 
50 /*
51  * options
52  */
53 #define	AC_FILE_SET	(0x01)	/* set accounting file name */
54 #define	AC_FILE_GET	(0x02)	/* get accounting file name */
55 #define	AC_RES_SET	(0x04)	/* set (enable/disable) resources */
56 #define	AC_RES_GET	(0x08)	/* get a list of enabled resources */
57 #define	AC_STATE_SET	(0x10)	/* set accounting mode state (on/off) */
58 #define	AC_STATE_GET	(0x20)	/* get accounting mode state */
59 #define	AC_OPTION(x)	((x) & 0x00ffffff)
60 
61 /*
62  * Process accounting resource IDs
63  */
64 #define	AC_NONE			0	/* special end-of-list identifier */
65 #define	AC_PROC_PID		1	/* process ID */
66 #define	AC_PROC_UID		2	/* user ID */
67 #define	AC_PROC_GID		3	/* group ID */
68 #define	AC_PROC_PROJID		4	/* project ID */
69 #define	AC_PROC_TASKID		5	/* task ID */
70 #define	AC_PROC_CPU		6	/* user/system cpu time */
71 #define	AC_PROC_TIME		7	/* start/finish time */
72 #define	AC_PROC_COMMAND		8	/* command name */
73 #define	AC_PROC_TTY		9	/* control tty */
74 #define	AC_PROC_HOSTNAME	10	/* hostname */
75 #define	AC_PROC_MICROSTATE	11	/* microstate accounting */
76 #define	AC_PROC_FLAG		12	/* accounting flags */
77 #define	AC_PROC_ANCPID		13	/* ancestor process's ID */
78 #define	AC_PROC_WAIT_STATUS	14	/* process wait status */
79 #define	AC_PROC_ZONENAME	15	/* zone name */
80 #define	AC_PROC_MEM		16	/* memory usage */
81 #define	AC_PROC_MAX_RES		16	/* must be equal to the number above */
82 
83 /*
84  * Task accounting resource IDs
85  */
86 #define	AC_TASK_TASKID		1	/* task ID */
87 #define	AC_TASK_PROJID		2	/* project ID */
88 #define	AC_TASK_CPU		3	/* user/system cpu time */
89 #define	AC_TASK_TIME		4	/* start/finish time */
90 #define	AC_TASK_HOSTNAME	5	/* hostname */
91 #define	AC_TASK_MICROSTATE	6	/* microstate accounting */
92 #define	AC_TASK_ANCTASKID	7	/* ancestor task's taskid */
93 #define	AC_TASK_ZONENAME	8	/* zone name */
94 #define	AC_TASK_MAX_RES		8	/* must be equal to the number above */
95 
96 /*
97  * Flow accounting resource IDs
98  */
99 #define	AC_FLOW_SADDR		1	/* source address */
100 #define	AC_FLOW_DADDR		2	/* destination address */
101 #define	AC_FLOW_SPORT		3	/* source port */
102 #define	AC_FLOW_DPORT		4	/* destination port */
103 #define	AC_FLOW_PROTOCOL	5	/* protocol */
104 #define	AC_FLOW_DSFIELD		6	/* dsfield */
105 #define	AC_FLOW_CTIME		7	/* creation time for this flow */
106 #define	AC_FLOW_LSEEN		8	/* pkt last seen for this flow */
107 #define	AC_FLOW_NBYTES		9	/* no. of bytes in this flow */
108 #define	AC_FLOW_NPKTS		10	/* no. of packets for this flow */
109 #define	AC_FLOW_PROJID		11	/* project id */
110 #define	AC_FLOW_UID		12	/* user id */
111 #define	AC_FLOW_ANAME		13	/* action instance name */
112 #define	AC_FLOW_MAX_RES		13	/* must be equal to the number above */
113 
114 /*
115  * Network accounting resource IDs
116  */
117 #define	AC_NET_NAME		1	/* flow name */
118 #define	AC_NET_EHOST		2	/* ethernet source address */
119 #define	AC_NET_EDEST		3	/* ethernet destination address */
120 #define	AC_NET_VLAN_TPID	4	/* VLAN protocol ID */
121 #define	AC_NET_VLAN_TCI		5	/* VLAN tag control info. */
122 #define	AC_NET_SAP		6	/* SAP */
123 #define	AC_NET_PRIORITY		7	/* Priority */
124 #define	AC_NET_BWLIMIT		8	/* Bandwidth limit */
125 #define	AC_NET_DEVNAME		9	/* Device name */
126 #define	AC_NET_SADDR		10	/* Source IP address */
127 #define	AC_NET_DADDR		11	/* Dest IP address */
128 #define	AC_NET_SPORT		12	/* Source Port */
129 #define	AC_NET_DPORT		13	/* Dest Port */
130 #define	AC_NET_PROTOCOL		14	/* Protocol */
131 #define	AC_NET_DSFIELD		15	/* DiffServ field */
132 #define	AC_NET_CURTIME		16	/* Current Time */
133 #define	AC_NET_IBYTES		17	/* Inbound Bytes */
134 #define	AC_NET_OBYTES		18	/* Outbound Bytes */
135 #define	AC_NET_IPKTS		19	/* Inbound Packets */
136 #define	AC_NET_OPKTS		20	/* Outbound Packets */
137 #define	AC_NET_IERRPKTS		21	/* Inbound Error Packets */
138 #define	AC_NET_OERRPKTS		22	/* Outbound Error Packets */
139 #define	AC_NET_MAX_RES		22	/* must be equal to the number above */
140 
141 #define	AC_MAX_RES		\
142 	MAX(MAX(MAX(AC_PROC_MAX_RES, AC_TASK_MAX_RES), AC_FLOW_MAX_RES), \
143 	AC_NET_MAX_RES)
144 #define	AC_MASK_SZ		BT_BITOUL(AC_MAX_RES + 1)
145 
146 /*
147  * resource states
148  */
149 #define	AC_ON		1	/* enabled resource */
150 #define	AC_OFF		0	/* disabled resource */
151 
152 typedef struct ac_res {
153 	int	ar_id;		/* resource ID */
154 	int	ar_state;	/* resource state; see above */
155 } ac_res_t;
156 
157 #ifdef	_KERNEL
158 
159 #include <sys/vnode.h>
160 #include <sys/zone.h>
161 #include <sys/list.h>
162 
163 typedef struct ac_info {
164 	kmutex_t	ac_lock;		/* protects the structure */
165 	vnode_t		*ac_vnode;		/* exacct file vnode pointer */
166 	char		*ac_file;		/* exacct file name */
167 	int		ac_state;		/* accounting state */
168 	ulong_t		ac_mask[AC_MASK_SZ];	/* bitmask of resources */
169 } ac_info_t;
170 
171 /*
172  * Key used for retrieving per-zone exacct settings.  This remains
173  * uninitialized (ZONE_KEY_UNINITIALIZED) until the acctctl module is loaded.
174  */
175 extern zone_key_t exacct_zone_key;
176 
177 /*
178  * Per-zone exacct settings.  Each zone may have its own settings for
179  * process, task, flow, and network accounting.
180  *
181  * Per-zone flow accounting has not yet been implemented, so this
182  * provides zones with the view that flow accounting in the zone hasn't
183  * been initialized (which is true).  The various system calls will fail
184  * to set flow accounting parameters from within a zone.
185  *
186  * The global list of accounting settings is used when we check to see
187  * if the accounting file is already in use by any zone.
188  */
189 struct exacct_globals {
190 	ac_info_t	ac_task;
191 	ac_info_t	ac_proc;
192 	ac_info_t	ac_flow;
193 	ac_info_t	ac_net;
194 	list_node_t	ac_link;
195 };
196 
197 #else
198 
199 extern int acctctl(int cmd, void *buf, size_t bufsz);
200 
201 #endif	/* ifdef _KERNEL */
202 
203 #ifdef	__cplusplus
204 }
205 #endif
206 
207 #endif	/* _SYS_ACCTCTL_H */
208