mac_policy.h revision 172953
1/*-
2 * Copyright (c) 1999-2002 Robert N. M. Watson
3 * Copyright (c) 2001-2005 Networks Associates Technology, Inc.
4 * Copyright (c) 2005-2006 SPARTA, Inc.
5 * All rights reserved.
6 *
7 * This software was developed by Robert Watson for the TrustedBSD Project.
8 *
9 * This software was developed for the FreeBSD Project in part by Network
10 * Associates Laboratories, the Security Research Division of Network
11 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
12 * as part of the DARPA CHATS research program.
13 *
14 * This software was enhanced by SPARTA ISSO under SPAWAR contract
15 * N66001-04-C-6019 ("SEFOS").
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 * $FreeBSD: head/sys/security/mac/mac_policy.h 172953 2007-10-25 07:49:47Z rwatson $
39 */
40/*
41 * Kernel interface for MAC policy modules.
42 */
43#ifndef _SYS_SECURITY_MAC_MAC_POLICY_H_
44#define	_SYS_SECURITY_MAC_MAC_POLICY_H_
45
46#ifndef _KERNEL
47#error "no user-serviceable parts inside"
48#endif
49
50/*-
51 * Pluggable access control policy definition structure.
52 *
53 * List of operations that are performed as part of the implementation of a
54 * MAC policy.  Policy implementors declare operations with a mac_policy_ops
55 * structure, and using the MAC_POLICY_SET() macro.  If an entry point is not
56 * declared, then then the policy will be ignored during evaluation of that
57 * event or check.
58 *
59 * Operations are sorted first by general class of operation, then
60 * alphabetically.
61 */
62#include <sys/acl.h>	/* XXX acl_type_t */
63
64struct acl;
65struct auditinfo;
66struct auditinfo_addr;
67struct bpf_d;
68struct cdev;
69struct componentname;
70struct devfs_dirent;
71struct ifnet;
72struct image_params;
73struct inpcb;
74struct ipq;
75struct ksem;
76struct label;
77struct mac_policy_conf;
78struct mbuf;
79struct mount;
80struct msg;
81struct msqid_kernel;
82struct pipepair;
83struct proc;
84struct sbuf;
85struct semid_kernel;
86struct shmid_kernel;
87struct sockaddr;
88struct socket;
89struct sysctl_oid;
90struct sysctl_req;
91struct thread;
92struct ucred;
93struct uio;
94struct vattr;
95struct vnode;
96
97/*
98 * Policy module operations.
99 */
100typedef void	(*mpo_destroy_t)(struct mac_policy_conf *mpc);
101typedef void	(*mpo_init_t)(struct mac_policy_conf *mpc);
102
103/*
104 * General policy-directed security system call so that policies may
105 * implement new services without reserving explicit system call numbers.
106 */
107typedef int	(*mpo_syscall_t)(struct thread *td, int call, void *arg);
108
109/*
110 * Place-holder function pointers for ABI-compatibility purposes.
111 */
112typedef void	(*mpo_placeholder_t)(void);
113
114/*
115 * Label operations.  Initialize label storage, destroy label storage,
116 * recycle for re-use without init/destroy, copy a label to initialized
117 * storage, and externalize/internalize from/to initialized storage.
118 */
119typedef void	(*mpo_bpfdesc_init_label_t)(struct label *label);
120typedef void	(*mpo_cred_init_label_t)(struct label *label);
121typedef void	(*mpo_devfs_init_label_t)(struct label *label);
122typedef void	(*mpo_ifnet_init_label_t)(struct label *label);
123typedef int	(*mpo_inpcb_init_label_t)(struct label *label, int flag);
124typedef void	(*mpo_sysvmsg_init_label_t)(struct label *label);
125typedef void	(*mpo_sysvmsq_init_label_t)(struct label *label);
126typedef void	(*mpo_sysvsem_init_label_t)(struct label *label);
127typedef void	(*mpo_sysvshm_init_label_t)(struct label *label);
128typedef int	(*mpo_ipq_init_label_t)(struct label *label, int flag);
129typedef int	(*mpo_mbuf_init_label_t)(struct label *label, int flag);
130typedef void	(*mpo_mount_init_label_t)(struct label *label);
131typedef int	(*mpo_socket_init_label_t)(struct label *label, int flag);
132typedef int	(*mpo_socketpeer_init_label_t)(struct label *label,
133		    int flag);
134typedef void	(*mpo_pipe_init_label_t)(struct label *label);
135typedef void    (*mpo_posixsem_init_label_t)(struct label *label);
136typedef void	(*mpo_proc_init_label_t)(struct label *label);
137typedef void	(*mpo_vnode_init_label_t)(struct label *label);
138typedef void	(*mpo_bpfdesc_destroy_label_t)(struct label *label);
139typedef void	(*mpo_cred_destroy_label_t)(struct label *label);
140typedef void	(*mpo_devfs_destroy_label_t)(struct label *label);
141typedef void	(*mpo_ifnet_destroy_label_t)(struct label *label);
142typedef void	(*mpo_inpcb_destroy_label_t)(struct label *label);
143typedef void	(*mpo_sysvmsg_destroy_label_t)(struct label *label);
144typedef void	(*mpo_sysvmsq_destroy_label_t)(struct label *label);
145typedef void	(*mpo_sysvsem_destroy_label_t)(struct label *label);
146typedef void	(*mpo_sysvshm_destroy_label_t)(struct label *label);
147typedef void	(*mpo_ipq_destroy_label_t)(struct label *label);
148typedef void	(*mpo_mbuf_destroy_label_t)(struct label *label);
149typedef void	(*mpo_mount_destroy_label_t)(struct label *label);
150typedef void	(*mpo_socket_destroy_label_t)(struct label *label);
151typedef void	(*mpo_socketpeer_destroy_label_t)(struct label *label);
152typedef void	(*mpo_pipe_destroy_label_t)(struct label *label);
153typedef void    (*mpo_posixsem_destroy_label_t)(struct label *label);
154typedef void	(*mpo_proc_destroy_label_t)(struct label *label);
155typedef void	(*mpo_vnode_destroy_label_t)(struct label *label);
156typedef void	(*mpo_sysvmsg_cleanup_t)(struct label *msglabel);
157typedef void	(*mpo_sysvmsq_cleanup_t)(struct label *msqlabel);
158typedef void	(*mpo_sysvsem_cleanup_t)(struct label *semalabel);
159typedef void	(*mpo_sysvshm_cleanup_t)(struct label *shmlabel);
160typedef void	(*mpo_cred_copy_label_t)(struct label *src,
161		    struct label *dest);
162typedef void	(*mpo_ifnet_copy_label_t)(struct label *src,
163		    struct label *dest);
164typedef void	(*mpo_mbuf_copy_label_t)(struct label *src,
165		    struct label *dest);
166typedef void	(*mpo_pipe_copy_label_t)(struct label *src,
167		    struct label *dest);
168typedef void	(*mpo_socket_copy_label_t)(struct label *src,
169		    struct label *dest);
170typedef void	(*mpo_vnode_copy_label_t)(struct label *src,
171		    struct label *dest);
172typedef int	(*mpo_cred_externalize_label_t)(struct label *label,
173		    char *element_name, struct sbuf *sb, int *claimed);
174typedef int	(*mpo_ifnet_externalize_label_t)(struct label *label,
175		    char *element_name, struct sbuf *sb, int *claimed);
176typedef int	(*mpo_pipe_externalize_label_t)(struct label *label,
177		    char *element_name, struct sbuf *sb, int *claimed);
178typedef int	(*mpo_socket_externalize_label_t)(struct label *label,
179		    char *element_name, struct sbuf *sb, int *claimed);
180typedef int	(*mpo_socketpeer_externalize_label_t)(struct label *label,
181		    char *element_name, struct sbuf *sb, int *claimed);
182typedef int	(*mpo_vnode_externalize_label_t)(struct label *label,
183		    char *element_name, struct sbuf *sb, int *claimed);
184typedef int	(*mpo_cred_internalize_label_t)(struct label *label,
185		    char *element_name, char *element_data, int *claimed);
186typedef int	(*mpo_ifnet_internalize_label_t)(struct label *label,
187		    char *element_name, char *element_data, int *claimed);
188typedef int	(*mpo_pipe_internalize_label_t)(struct label *label,
189		    char *element_name, char *element_data, int *claimed);
190typedef int	(*mpo_socket_internalize_label_t)(struct label *label,
191		    char *element_name, char *element_data, int *claimed);
192typedef int	(*mpo_vnode_internalize_label_t)(struct label *label,
193		    char *element_name, char *element_data, int *claimed);
194
195/*
196 * Labeling event operations: file system objects, and things that look a lot
197 * like file system objects.
198 */
199typedef void	(*mpo_devfs_vnode_associate_t)(struct mount *mp,
200		    struct label *mplabel, struct devfs_dirent *de,
201		    struct label *delabel, struct vnode *vp,
202		    struct label *vplabel);
203typedef int	(*mpo_vnode_associate_extattr_t)(struct mount *mp,
204		    struct label *mplabel, struct vnode *vp,
205		    struct label *vplabel);
206typedef void	(*mpo_vnode_associate_singlelabel_t)(struct mount *mp,
207		    struct label *mplabel, struct vnode *vp,
208		    struct label *vplabel);
209typedef void	(*mpo_devfs_create_device_t)(struct ucred *cred,
210		    struct mount *mp, struct cdev *dev,
211		    struct devfs_dirent *de, struct label *delabel);
212typedef void	(*mpo_devfs_create_directory_t)(struct mount *mp,
213		    char *dirname, int dirnamelen, struct devfs_dirent *de,
214		    struct label *delabel);
215typedef void	(*mpo_devfs_create_symlink_t)(struct ucred *cred,
216		    struct mount *mp, struct devfs_dirent *dd,
217		    struct label *ddlabel, struct devfs_dirent *de,
218		    struct label *delabel);
219typedef int	(*mpo_vnode_create_extattr_t)(struct ucred *cred,
220		    struct mount *mp, struct label *mplabel,
221		    struct vnode *dvp, struct label *dvplabel,
222		    struct vnode *vp, struct label *vplabel,
223		    struct componentname *cnp);
224typedef void	(*mpo_mount_create_t)(struct ucred *cred, struct mount *mp,
225		    struct label *mplabel);
226typedef void	(*mpo_vnode_relabel_t)(struct ucred *cred, struct vnode *vp,
227		    struct label *vplabel, struct label *label);
228typedef int	(*mpo_vnode_setlabel_extattr_t)(struct ucred *cred,
229		    struct vnode *vp, struct label *vplabel,
230		    struct label *intlabel);
231typedef void	(*mpo_devfs_update_t)(struct mount *mp,
232		    struct devfs_dirent *de, struct label *delabel,
233		    struct vnode *vp, struct label *vplabel);
234
235/*
236 * Labeling event operations: IPC objects.
237 */
238typedef void	(*mpo_socket_create_mbuf_t)(struct socket *so,
239		    struct label *solabel, struct mbuf *m,
240		    struct label *mlabel);
241typedef void	(*mpo_socket_create_t)(struct ucred *cred, struct socket *so,
242		    struct label *solabel);
243typedef void	(*mpo_socket_newconn_t)(struct socket *oldso,
244		    struct label *oldsolabel, struct socket *newso,
245		    struct label *newsolabel);
246typedef void	(*mpo_socket_relabel_t)(struct ucred *cred, struct socket *so,
247		    struct label *oldlabel, struct label *newlabel);
248typedef void	(*mpo_pipe_relabel_t)(struct ucred *cred, struct pipepair *pp,
249		    struct label *oldlabel, struct label *newlabel);
250typedef void	(*mpo_socketpeer_set_from_mbuf_t)(struct mbuf *m,
251		    struct label *mlabel, struct socket *so,
252		    struct label *sopeerlabel);
253typedef void	(*mpo_socketpeer_set_from_socket_t)(struct socket *oldso,
254		    struct label *oldsolabel, struct socket *newso,
255		    struct label *newsopeerlabel);
256typedef void	(*mpo_pipe_create_t)(struct ucred *cred, struct pipepair *pp,
257		    struct label *pplabel);
258
259/*
260 * Labeling event operations: System V IPC primitives.
261 */
262typedef void	(*mpo_sysvmsg_create_t)(struct ucred *cred,
263		    struct msqid_kernel *msqkptr, struct label *msqlabel,
264		    struct msg *msgptr, struct label *msglabel);
265typedef void	(*mpo_sysvmsq_create_t)(struct ucred *cred,
266		    struct msqid_kernel *msqkptr, struct label *msqlabel);
267typedef void	(*mpo_sysvsem_create_t)(struct ucred *cred,
268		    struct semid_kernel *semakptr, struct label *semalabel);
269typedef void	(*mpo_sysvshm_create_t)(struct ucred *cred,
270		    struct shmid_kernel *shmsegptr, struct label *shmlabel);
271
272/*
273 * Labeling event operations: POSIX (global/inter-process) semaphores.
274 */
275typedef void	(*mpo_posixsem_create_t)(struct ucred *cred,
276		    struct ksem *ks, struct label *kslabel);
277
278/*
279 * Labeling event operations: network objects.
280 */
281typedef void	(*mpo_bpfdesc_create_t)(struct ucred *cred,
282		    struct bpf_d *d, struct label *dlabel);
283typedef void	(*mpo_ifnet_create_t)(struct ifnet *ifp,
284		    struct label *ifplabel);
285typedef void	(*mpo_inpcb_create_t)(struct socket *so,
286		    struct label *solabel, struct inpcb *inp,
287		    struct label *inplabel);
288typedef void	(*mpo_ipq_create_t)(struct mbuf *m, struct label *mlabel,
289		    struct ipq *ipq, struct label *ipqlabel);
290typedef void	(*mpo_ipq_reassemble)
291		    (struct ipq *ipq, struct label *ipqlabel, struct mbuf *m,
292		    struct label *mlabel);
293typedef void	(*mpo_netinet_fragment_t)(struct mbuf *m,
294		    struct label *mlabel, struct mbuf *frag,
295		    struct label *fraglabel);
296typedef void	(*mpo_inpcb_create_mbuf_t)(struct inpcb *inp,
297		    struct label *inplabel, struct mbuf *m,
298		    struct label *mlabel);
299typedef void	(*mpo_create_mbuf_linklayer_t)(struct ifnet *ifp,
300		    struct label *ifplabel, struct mbuf *m,
301		    struct label *mlabel);
302typedef void	(*mpo_bpfdesc_create_mbuf_t)(struct bpf_d *d,
303		    struct label *dlabel, struct mbuf *m,
304		    struct label *mlabel);
305typedef void	(*mpo_ifnet_create_mbuf_t)(struct ifnet *ifp,
306		    struct label *ifplabel, struct mbuf *m,
307		    struct label *mlabel);
308typedef void	(*mpo_mbuf_create_multicast_encap_t)(struct mbuf *m,
309		    struct label *mlabel, struct ifnet *ifp,
310		    struct label *ifplabel, struct mbuf *mnew,
311		    struct label *mnewlabel);
312typedef void	(*mpo_mbuf_create_netlayer_t)(struct mbuf *m,
313		    struct label *mlabel, struct mbuf *mnew,
314		    struct label *mnewlabel);
315typedef int	(*mpo_ipq_match_t)(struct mbuf *m, struct label *mlabel,
316		    struct ipq *ipq, struct label *ipqlabel);
317typedef void	(*mpo_netinet_icmp_reply_t)(struct mbuf *m,
318		    struct label *mlabel);
319typedef void	(*mpo_netinet_tcp_reply_t)(struct mbuf *m,
320		    struct label *mlabel);
321typedef void	(*mpo_ifnet_relabel_t)(struct ucred *cred, struct ifnet *ifp,
322		    struct label *ifplabel, struct label *newlabel);
323typedef void	(*mpo_ipq_update_t)(struct mbuf *m, struct label *mlabel,
324		    struct ipq *ipq, struct label *ipqlabel);
325typedef void	(*mpo_inpcb_sosetlabel_t)(struct socket *so,
326		    struct label *label, struct inpcb *inp,
327		    struct label *inplabel);
328
329typedef	void	(*mpo_mbuf_create_from_firewall_t)(struct mbuf *m,
330		    struct label *label);
331typedef void	(*mpo_destroy_syncache_label_t)(struct label *label);
332typedef int	(*mpo_init_syncache_label_t)(struct label *label, int flag);
333typedef void	(*mpo_init_syncache_from_inpcb_t)(struct label *label,
334		    struct inpcb *inp);
335typedef void	(*mpo_create_mbuf_from_syncache_t)(struct label *sc_label,
336		    struct mbuf *m, struct label *mlabel);
337/*
338 * Labeling event operations: processes.
339 */
340typedef void	(*mpo_vnode_execve_transition_t)(struct ucred *old,
341		    struct ucred *new, struct vnode *vp,
342		    struct label *vplabel, struct label *interpvplabel,
343		    struct image_params *imgp, struct label *execlabel);
344typedef int	(*mpo_vnode_execve_will_transition_t)(struct ucred *old,
345		    struct vnode *vp, struct label *vplabel,
346		    struct label *interpvplabel, struct image_params *imgp,
347		    struct label *execlabel);
348typedef void	(*mpo_proc_create_swapper_t)(struct ucred *cred);
349typedef void	(*mpo_proc_create_init_t)(struct ucred *cred);
350typedef void	(*mpo_cred_relabel_t)(struct ucred *cred,
351		    struct label *newlabel);
352typedef void	(*mpo_thread_userret_t)(struct thread *thread);
353
354/*
355 * Access control checks.
356 */
357typedef	int	(*mpo_bpfdesc_check_receive_t)(struct bpf_d *d,
358		    struct label *dlabel, struct ifnet *ifp,
359		    struct label *ifplabel);
360typedef int	(*mpo_cred_check_relabel_t)(struct ucred *cred,
361		    struct label *newlabel);
362typedef int	(*mpo_cred_check_visible_t)(struct ucred *cr1,
363		    struct ucred *cr2);
364typedef int	(*mpo_ifnet_check_relabel_t)(struct ucred *cred,
365		    struct ifnet *ifp, struct label *ifplabel,
366		    struct label *newlabel);
367typedef int	(*mpo_ifnet_check_transmit_t)(struct ifnet *ifp,
368		    struct label *ifplabel, struct mbuf *m,
369		    struct label *mlabel);
370typedef int	(*mpo_inpcb_check_deliver_t)(struct inpcb *inp,
371		    struct label *inplabel, struct mbuf *m,
372		    struct label *mlabel);
373typedef int	(*mpo_sysvmsq_check_msgmsq_t)(struct ucred *cred,
374		    struct msg *msgptr, struct label *msglabel,
375		    struct msqid_kernel *msqkptr, struct label *msqklabel);
376typedef int	(*mpo_sysvmsq_check_msgrcv_t)(struct ucred *cred,
377		    struct msg *msgptr, struct label *msglabel);
378typedef int	(*mpo_sysvmsq_check_msgrmid_t)(struct ucred *cred,
379		    struct msg *msgptr, struct label *msglabel);
380typedef int	(*mpo_sysvmsq_check_msqget_t)(struct ucred *cred,
381		    struct msqid_kernel *msqkptr, struct label *msqklabel);
382typedef int	(*mpo_sysvmsq_check_msqsnd_t)(struct ucred *cred,
383		    struct msqid_kernel *msqkptr, struct label *msqklabel);
384typedef int	(*mpo_sysvmsq_check_msqrcv_t)(struct ucred *cred,
385		    struct msqid_kernel *msqkptr, struct label *msqklabel);
386typedef int	(*mpo_sysvmsq_check_msqctl_t)(struct ucred *cred,
387		    struct msqid_kernel *msqkptr, struct label *msqklabel,
388		    int cmd);
389typedef int	(*mpo_sysvsem_check_semctl_t)(struct ucred *cred,
390		    struct semid_kernel *semakptr, struct label *semaklabel,
391		    int cmd);
392typedef int	(*mpo_sysvsem_check_semget_t)(struct ucred *cred,
393		    struct semid_kernel *semakptr, struct label *semaklabel);
394typedef int	(*mpo_sysvsem_check_semop_t)(struct ucred *cred,
395		    struct semid_kernel *semakptr, struct label *semaklabel,
396		    size_t accesstype);
397typedef int	(*mpo_sysvshm_check_shmat_t)(struct ucred *cred,
398		    struct shmid_kernel *shmsegptr,
399		    struct label *shmseglabel, int shmflg);
400typedef int	(*mpo_sysvshm_check_shmctl_t)(struct ucred *cred,
401		    struct shmid_kernel *shmsegptr,
402		    struct label *shmseglabel, int cmd);
403typedef int	(*mpo_sysvshm_check_shmdt_t)(struct ucred *cred,
404		    struct shmid_kernel *shmsegptr,
405		    struct label *shmseglabel);
406typedef int	(*mpo_sysvshm_check_shmget_t)(struct ucred *cred,
407		    struct shmid_kernel *shmsegptr,
408		    struct label *shmseglabel, int shmflg);
409typedef int	(*mpo_kenv_check_dump_t)(struct ucred *cred);
410typedef int	(*mpo_kenv_check_get_t)(struct ucred *cred, char *name);
411typedef int	(*mpo_kenv_check_set_t)(struct ucred *cred, char *name,
412		    char *value);
413typedef int	(*mpo_kenv_check_unset_t)(struct ucred *cred, char *name);
414typedef int	(*mpo_kld_check_load_t)(struct ucred *cred, struct vnode *vp,
415		    struct label *vplabel);
416typedef int	(*mpo_kld_check_stat_t)(struct ucred *cred);
417typedef int	(*mpo_mpo_placeholder19_t)(void);
418typedef int	(*mpo_mpo_placeholder20_t)(void);
419typedef int	(*mpo_mount_check_stat_t)(struct ucred *cred,
420		    struct mount *mp, struct label *mplabel);
421typedef int	(*mpo_mpo_placeholder21_t)(void);
422typedef int	(*mpo_pipe_check_ioctl_t)(struct ucred *cred,
423		    struct pipepair *pp, struct label *pplabel,
424		    unsigned long cmd, void *data);
425typedef int	(*mpo_pipe_check_poll_t)(struct ucred *cred,
426		    struct pipepair *pp, struct label *pplabel);
427typedef int	(*mpo_pipe_check_read_t)(struct ucred *cred,
428		    struct pipepair *pp, struct label *pplabel);
429typedef int	(*mpo_pipe_check_relabel_t)(struct ucred *cred,
430		    struct pipepair *pp, struct label *pplabel,
431		    struct label *newlabel);
432typedef int	(*mpo_pipe_check_stat_t)(struct ucred *cred,
433		    struct pipepair *pp, struct label *pplabel);
434typedef int	(*mpo_pipe_check_write_t)(struct ucred *cred,
435		    struct pipepair *pp, struct label *pplabel);
436typedef int	(*mpo_posixsem_check_destroy_t)(struct ucred *cred,
437		    struct ksem *ks, struct label *kslabel);
438typedef int	(*mpo_posixsem_check_getvalue_t)(struct ucred *cred,
439		    struct ksem *ks, struct label *kslabel);
440typedef int	(*mpo_posixsem_check_open_t)(struct ucred *cred,
441		    struct ksem *ks, struct label *kslabel);
442typedef int	(*mpo_posixsem_check_post_t)(struct ucred *cred,
443		    struct ksem *ks, struct label *kslabel);
444typedef int	(*mpo_posixsem_check_unlink_t)(struct ucred *cred,
445		    struct ksem *ks, struct label *kslabel);
446typedef int	(*mpo_posixsem_check_wait_t)(struct ucred *cred,
447		    struct ksem *ks, struct label *kslabel);
448typedef int	(*mpo_proc_check_debug_t)(struct ucred *cred,
449		    struct proc *p);
450typedef int	(*mpo_proc_check_sched_t)(struct ucred *cred,
451		    struct proc *p);
452typedef int	(*mpo_proc_check_setaudit_t)(struct ucred *cred,
453		    struct auditinfo *ai);
454typedef int	(*mpo_proc_check_setaudit_addr_t)(struct ucred *cred,
455		    struct auditinfo_addr *aia);
456typedef int	(*mpo_proc_check_setauid_t)(struct ucred *cred, uid_t auid);
457typedef int	(*mpo_proc_check_setuid_t)(struct ucred *cred, uid_t uid);
458typedef int	(*mpo_proc_check_seteuid_t)(struct ucred *cred, uid_t euid);
459typedef int	(*mpo_proc_check_setgid_t)(struct ucred *cred, gid_t gid);
460typedef int	(*mpo_proc_check_setegid_t)(struct ucred *cred, gid_t egid);
461typedef int	(*mpo_proc_check_setgroups_t)(struct ucred *cred, int ngroups,
462		    gid_t *gidset);
463typedef int	(*mpo_proc_check_setreuid_t)(struct ucred *cred, uid_t ruid,
464		    uid_t euid);
465typedef int	(*mpo_proc_check_setregid_t)(struct ucred *cred, gid_t rgid,
466		    gid_t egid);
467typedef int	(*mpo_proc_check_setresuid_t)(struct ucred *cred, uid_t ruid,
468		    uid_t euid, uid_t suid);
469typedef int	(*mpo_proc_check_setresgid_t)(struct ucred *cred, gid_t rgid,
470		    gid_t egid, gid_t sgid);
471typedef int	(*mpo_proc_check_signal_t)(struct ucred *cred,
472		    struct proc *proc, int signum);
473typedef int	(*mpo_proc_check_wait_t)(struct ucred *cred,
474		    struct proc *proc);
475typedef int	(*mpo_socket_check_accept_t)(struct ucred *cred,
476		    struct socket *so, struct label *solabel);
477typedef int	(*mpo_socket_check_bind_t)(struct ucred *cred,
478		    struct socket *so, struct label *solabel,
479		    struct sockaddr *sa);
480typedef int	(*mpo_socket_check_connect_t)(struct ucred *cred,
481		    struct socket *so, struct label *solabel,
482		    struct sockaddr *sa);
483typedef int	(*mpo_socket_check_create_t)(struct ucred *cred, int domain,
484		    int type, int protocol);
485typedef int	(*mpo_socket_check_deliver_t)(struct socket *so,
486		    struct label *solabel, struct mbuf *m,
487		    struct label *mlabel);
488typedef int	(*mpo_socket_check_listen_t)(struct ucred *cred,
489		    struct socket *so, struct label *solabel);
490typedef int	(*mpo_socket_check_poll_t)(struct ucred *cred,
491		    struct socket *so, struct label *solabel);
492typedef int	(*mpo_socket_check_receive_t)(struct ucred *cred,
493		    struct socket *so, struct label *solabel);
494typedef int	(*mpo_socket_check_relabel_t)(struct ucred *cred,
495		    struct socket *so, struct label *solabel,
496		    struct label *newlabel);
497typedef int	(*mpo_socket_check_send_t)(struct ucred *cred,
498		    struct socket *so, struct label *solabel);
499typedef int	(*mpo_socket_check_stat_t)(struct ucred *cred,
500		    struct socket *so, struct label *solabel);
501typedef int	(*mpo_socket_check_visible_t)(struct ucred *cred,
502		    struct socket *so, struct label *solabel);
503typedef int	(*mpo_system_check_acct_t)(struct ucred *cred,
504		    struct vnode *vp, struct label *vplabel);
505typedef int	(*mpo_system_check_audit_t)(struct ucred *cred, void *record,
506		    int length);
507typedef int	(*mpo_system_check_auditctl_t)(struct ucred *cred,
508		    struct vnode *vp, struct label *vplabel);
509typedef int	(*mpo_system_check_auditon_t)(struct ucred *cred, int cmd);
510typedef int	(*mpo_system_check_reboot_t)(struct ucred *cred, int howto);
511typedef int	(*mpo_system_check_swapon_t)(struct ucred *cred,
512		    struct vnode *vp, struct label *vplabel);
513typedef int	(*mpo_system_check_swapoff_t)(struct ucred *cred,
514		    struct vnode *vp, struct label *vplabel);
515typedef int	(*mpo_system_check_sysctl_t)(struct ucred *cred,
516		    struct sysctl_oid *oidp, void *arg1, int arg2,
517		    struct sysctl_req *req);
518typedef int	(*mpo_vnode_check_access_t)(struct ucred *cred,
519		    struct vnode *vp, struct label *vplabel, int acc_mode);
520typedef int	(*mpo_vnode_check_chdir_t)(struct ucred *cred,
521		    struct vnode *dvp, struct label *dvplabel);
522typedef int	(*mpo_vnode_check_chroot_t)(struct ucred *cred,
523		    struct vnode *dvp, struct label *dvplabel);
524typedef int	(*mpo_vnode_check_create_t)(struct ucred *cred,
525		    struct vnode *dvp, struct label *dvplabel,
526		    struct componentname *cnp, struct vattr *vap);
527typedef int	(*mpo_vnode_check_deleteacl_t)(struct ucred *cred,
528		    struct vnode *vp, struct label *vplabel,
529		    acl_type_t type);
530typedef int	(*mpo_vnode_check_deleteextattr_t)(struct ucred *cred,
531		    struct vnode *vp, struct label *vplabel,
532		    int attrnamespace, const char *name);
533typedef int	(*mpo_vnode_check_exec_t)(struct ucred *cred,
534		    struct vnode *vp, struct label *vplabel,
535		    struct image_params *imgp, struct label *execlabel);
536typedef int	(*mpo_vnode_check_getacl_t)(struct ucred *cred,
537		    struct vnode *vp, struct label *vplabel,
538		    acl_type_t type);
539typedef int	(*mpo_vnode_check_getextattr_t)(struct ucred *cred,
540		    struct vnode *vp, struct label *vplabel,
541		    int attrnamespace, const char *name, struct uio *uio);
542typedef int	(*mpo_vnode_check_link_t)(struct ucred *cred,
543		    struct vnode *dvp, struct label *dvplabel,
544		    struct vnode *vp, struct label *vplabel,
545		    struct componentname *cnp);
546typedef int	(*mpo_vnode_check_listextattr_t)(struct ucred *cred,
547		    struct vnode *vp, struct label *vplabel,
548		    int attrnamespace);
549typedef int	(*mpo_vnode_check_lookup_t)(struct ucred *cred,
550		    struct vnode *dvp, struct label *dvplabel,
551		    struct componentname *cnp);
552typedef int	(*mpo_vnode_check_mmap_t)(struct ucred *cred,
553		    struct vnode *vp, struct label *label, int prot,
554		    int flags);
555typedef void	(*mpo_vnode_check_mmap_downgrade_t)(struct ucred *cred,
556		    struct vnode *vp, struct label *vplabel, int *prot);
557typedef int	(*mpo_vnode_check_mprotect_t)(struct ucred *cred,
558		    struct vnode *vp, struct label *vplabel, int prot);
559typedef int	(*mpo_vnode_check_open_t)(struct ucred *cred,
560		    struct vnode *vp, struct label *vplabel, int acc_mode);
561typedef int	(*mpo_vnode_check_poll_t)(struct ucred *active_cred,
562		    struct ucred *file_cred, struct vnode *vp,
563		    struct label *vplabel);
564typedef int	(*mpo_vnode_check_read_t)(struct ucred *active_cred,
565		    struct ucred *file_cred, struct vnode *vp,
566		    struct label *vplabel);
567typedef int	(*mpo_vnode_check_readdir_t)(struct ucred *cred,
568		    struct vnode *dvp, struct label *dvplabel);
569typedef int	(*mpo_vnode_check_readlink_t)(struct ucred *cred,
570		    struct vnode *vp, struct label *vplabel);
571typedef int	(*mpo_vnode_check_relabel_t)(struct ucred *cred,
572		    struct vnode *vp, struct label *vplabel,
573		    struct label *newlabel);
574typedef int	(*mpo_vnode_check_rename_from_t)(struct ucred *cred,
575		    struct vnode *dvp, struct label *dvplabel,
576		    struct vnode *vp, struct label *vplabel,
577		    struct componentname *cnp);
578typedef int	(*mpo_vnode_check_rename_to_t)(struct ucred *cred,
579		    struct vnode *dvp, struct label *dvplabel,
580		    struct vnode *vp, struct label *vplabel, int samedir,
581		    struct componentname *cnp);
582typedef int	(*mpo_vnode_check_revoke_t)(struct ucred *cred,
583		    struct vnode *vp, struct label *vplabel);
584typedef int	(*mpo_vnode_check_setacl_t)(struct ucred *cred,
585		    struct vnode *vp, struct label *vplabel, acl_type_t type,
586		    struct acl *acl);
587typedef int	(*mpo_vnode_check_setextattr_t)(struct ucred *cred,
588		    struct vnode *vp, struct label *vplabel,
589		    int attrnamespace, const char *name, struct uio *uio);
590typedef int	(*mpo_vnode_check_setflags_t)(struct ucred *cred,
591		    struct vnode *vp, struct label *vplabel, u_long flags);
592typedef int	(*mpo_vnode_check_setmode_t)(struct ucred *cred,
593		    struct vnode *vp, struct label *vplabel, mode_t mode);
594typedef int	(*mpo_vnode_check_setowner_t)(struct ucred *cred,
595		    struct vnode *vp, struct label *vplabel, uid_t uid,
596		    gid_t gid);
597typedef int	(*mpo_vnode_check_setutimes_t)(struct ucred *cred,
598		    struct vnode *vp, struct label *vplabel,
599		    struct timespec atime, struct timespec mtime);
600typedef int	(*mpo_vnode_check_stat_t)(struct ucred *active_cred,
601		    struct ucred *file_cred, struct vnode *vp,
602		    struct label *vplabel);
603typedef int	(*mpo_vnode_check_unlink_t)(struct ucred *cred,
604		    struct vnode *dvp, struct label *dvplabel,
605		    struct vnode *vp, struct label *vplabel,
606		    struct componentname *cnp);
607typedef int	(*mpo_vnode_check_write_t)(struct ucred *active_cred,
608		    struct ucred *file_cred, struct vnode *vp,
609		    struct label *vplabel);
610typedef void	(*mpo_associate_nfsd_label_t)(struct ucred *cred);
611typedef int	(*mpo_priv_check_t)(struct ucred *cred, int priv);
612typedef int	(*mpo_priv_grant_t)(struct ucred *cred, int priv);
613
614struct mac_policy_ops {
615	/*
616	 * Policy module operations.
617	 */
618	mpo_destroy_t				mpo_destroy;
619	mpo_init_t				mpo_init;
620
621	/*
622	 * General policy-directed security system call so that policies may
623	 * implement new services without reserving explicit system call
624	 * numbers.
625	 */
626	mpo_syscall_t				mpo_syscall;
627
628	/*
629	 * Label operations.  Initialize label storage, destroy label
630	 * storage, recycle for re-use without init/destroy, copy a label to
631	 * initialized storage, and externalize/internalize from/to
632	 * initialized storage.
633	 */
634	mpo_bpfdesc_init_label_t		mpo_bpfdesc_init_label;
635	mpo_cred_init_label_t			mpo_cred_init_label;
636	mpo_devfs_init_label_t			mpo_devfs_init_label;
637	mpo_placeholder_t			_mpo_placeholder0;
638	mpo_ifnet_init_label_t			mpo_ifnet_init_label;
639	mpo_inpcb_init_label_t			mpo_inpcb_init_label;
640	mpo_sysvmsg_init_label_t		mpo_sysvmsg_init_label;
641	mpo_sysvmsq_init_label_t		mpo_sysvmsq_init_label;
642	mpo_sysvsem_init_label_t		mpo_sysvsem_init_label;
643	mpo_sysvshm_init_label_t		mpo_sysvshm_init_label;
644	mpo_ipq_init_label_t			mpo_ipq_init_label;
645	mpo_mbuf_init_label_t			mpo_mbuf_init_label;
646	mpo_mount_init_label_t			mpo_mount_init_label;
647	mpo_socket_init_label_t			mpo_socket_init_label;
648	mpo_socketpeer_init_label_t		mpo_socketpeer_init_label;
649	mpo_pipe_init_label_t			mpo_pipe_init_label;
650	mpo_posixsem_init_label_t		mpo_posixsem_init_label;
651	mpo_proc_init_label_t			mpo_proc_init_label;
652	mpo_vnode_init_label_t			mpo_vnode_init_label;
653	mpo_bpfdesc_destroy_label_t		mpo_bpfdesc_destroy_label;
654	mpo_cred_destroy_label_t		mpo_cred_destroy_label;
655	mpo_devfs_destroy_label_t		mpo_devfs_destroy_label;
656	mpo_placeholder_t			_mpo_placeholder1;
657	mpo_ifnet_destroy_label_t		mpo_ifnet_destroy_label;
658	mpo_inpcb_destroy_label_t		mpo_inpcb_destroy_label;
659	mpo_sysvmsg_destroy_label_t		mpo_sysvmsg_destroy_label;
660	mpo_sysvmsq_destroy_label_t		mpo_sysvmsq_destroy_label;
661	mpo_sysvsem_destroy_label_t		mpo_sysvsem_destroy_label;
662	mpo_sysvshm_destroy_label_t		mpo_sysvshm_destroy_label;
663	mpo_ipq_destroy_label_t			mpo_ipq_destroy_label;
664	mpo_mbuf_destroy_label_t		mpo_mbuf_destroy_label;
665	mpo_mount_destroy_label_t		mpo_mount_destroy_label;
666	mpo_socket_destroy_label_t		mpo_socket_destroy_label;
667	mpo_socketpeer_destroy_label_t		mpo_socketpeer_destroy_label;
668	mpo_pipe_destroy_label_t		mpo_pipe_destroy_label;
669	mpo_posixsem_destroy_label_t		mpo_posixsem_destroy_label;
670	mpo_proc_destroy_label_t		mpo_proc_destroy_label;
671	mpo_vnode_destroy_label_t		mpo_vnode_destroy_label;
672	mpo_sysvmsg_cleanup_t			mpo_sysvmsg_cleanup;
673	mpo_sysvmsq_cleanup_t			mpo_sysvmsq_cleanup;
674	mpo_sysvsem_cleanup_t			mpo_sysvsem_cleanup;
675	mpo_sysvshm_cleanup_t			mpo_sysvshm_cleanup;
676	mpo_cred_copy_label_t			mpo_cred_copy_label;
677	mpo_ifnet_copy_label_t			mpo_ifnet_copy_label;
678	mpo_mbuf_copy_label_t			mpo_mbuf_copy_label;
679	mpo_placeholder_t			_mpo_placeholder2;
680	mpo_pipe_copy_label_t			mpo_pipe_copy_label;
681	mpo_socket_copy_label_t			mpo_socket_copy_label;
682	mpo_vnode_copy_label_t			mpo_vnode_copy_label;
683	mpo_cred_externalize_label_t		mpo_cred_externalize_label;
684	mpo_ifnet_externalize_label_t		mpo_ifnet_externalize_label;
685	mpo_placeholder_t			_mpo_placeholder3;
686	mpo_pipe_externalize_label_t		mpo_pipe_externalize_label;
687	mpo_socket_externalize_label_t		mpo_socket_externalize_label;
688	mpo_socketpeer_externalize_label_t	mpo_socketpeer_externalize_label;
689	mpo_vnode_externalize_label_t		mpo_vnode_externalize_label;
690	mpo_cred_internalize_label_t		mpo_cred_internalize_label;
691	mpo_ifnet_internalize_label_t		mpo_ifnet_internalize_label;
692	mpo_placeholder_t			_mpo_placeholder4;
693	mpo_pipe_internalize_label_t		mpo_pipe_internalize_label;
694	mpo_socket_internalize_label_t		mpo_socket_internalize_label;
695	mpo_vnode_internalize_label_t		mpo_vnode_internalize_label;
696
697	/*
698	 * Labeling event operations: file system objects, and things that
699	 * look a lot like file system objects.
700	 */
701	mpo_devfs_vnode_associate_t		mpo_devfs_vnode_associate;
702	mpo_vnode_associate_extattr_t		mpo_vnode_associate_extattr;
703	mpo_vnode_associate_singlelabel_t	mpo_vnode_associate_singlelabel;
704	mpo_devfs_create_device_t		mpo_devfs_create_device;
705	mpo_devfs_create_directory_t		mpo_devfs_create_directory;
706	mpo_devfs_create_symlink_t		mpo_devfs_create_symlink;
707	mpo_placeholder_t			_mpo_placeholder5;
708	mpo_vnode_create_extattr_t		mpo_vnode_create_extattr;
709	mpo_mount_create_t			mpo_mount_create;
710	mpo_vnode_relabel_t			mpo_vnode_relabel;
711	mpo_vnode_setlabel_extattr_t		mpo_vnode_setlabel_extattr;
712	mpo_devfs_update_t			mpo_devfs_update;
713
714	/*
715	 * Labeling event operations: IPC objects.
716	 */
717	mpo_socket_create_mbuf_t		mpo_socket_create_mbuf;
718	mpo_socket_create_t			mpo_socket_create;
719	mpo_socket_newconn_t			mpo_socket_newconn;
720	mpo_socket_relabel_t			mpo_socket_relabel;
721	mpo_pipe_relabel_t			mpo_pipe_relabel;
722	mpo_socketpeer_set_from_mbuf_t		mpo_socketpeer_set_from_mbuf;
723	mpo_socketpeer_set_from_socket_t	mpo_socketpeer_set_from_socket;
724	mpo_pipe_create_t			mpo_pipe_create;
725
726	/*
727	 * Labeling event operations: System V IPC primitives.
728	 */
729	mpo_sysvmsg_create_t			mpo_sysvmsg_create;
730	mpo_sysvmsq_create_t			mpo_sysvmsq_create;
731	mpo_sysvsem_create_t			mpo_sysvsem_create;
732	mpo_sysvshm_create_t			mpo_sysvshm_create;
733
734	/*
735	 * Labeling event operations: POSIX (global/inter-process) semaphores.
736	 */
737	mpo_posixsem_create_t			mpo_posixsem_create;
738
739	/*
740	 * Labeling event operations: network objects.
741	 */
742	mpo_bpfdesc_create_t			mpo_bpfdesc_create;
743	mpo_ifnet_create_t			mpo_ifnet_create;
744	mpo_inpcb_create_t			mpo_inpcb_create;
745	mpo_ipq_create_t			mpo_ipq_create;
746	mpo_ipq_reassemble			mpo_ipq_reassemble;
747	mpo_netinet_fragment_t			mpo_netinet_fragment;
748	mpo_inpcb_create_mbuf_t			mpo_inpcb_create_mbuf;
749	mpo_create_mbuf_linklayer_t		mpo_create_mbuf_linklayer;
750	mpo_bpfdesc_create_mbuf_t		mpo_bpfdesc_create_mbuf;
751	mpo_ifnet_create_mbuf_t			mpo_ifnet_create_mbuf;
752	mpo_mbuf_create_multicast_encap_t	mpo_mbuf_create_multicast_encap;
753	mpo_mbuf_create_netlayer_t		mpo_mbuf_create_netlayer;
754	mpo_ipq_match_t				mpo_ipq_match;
755	mpo_netinet_icmp_reply_t		mpo_netinet_icmp_reply;
756	mpo_netinet_tcp_reply_t			mpo_netinet_tcp_reply;
757	mpo_ifnet_relabel_t			mpo_ifnet_relabel;
758	mpo_ipq_update_t			mpo_ipq_update;
759	mpo_inpcb_sosetlabel_t			mpo_inpcb_sosetlabel;
760
761	/*
762	 * Labeling event operations: processes.
763	 */
764	mpo_vnode_execve_transition_t		mpo_vnode_execve_transition;
765	mpo_vnode_execve_will_transition_t	mpo_vnode_execve_will_transition;
766	mpo_proc_create_swapper_t		mpo_proc_create_swapper;
767	mpo_proc_create_init_t			mpo_proc_create_init;
768	mpo_cred_relabel_t			mpo_cred_relabel;
769	mpo_placeholder_t			_mpo_placeholder6;
770	mpo_thread_userret_t			mpo_thread_userret;
771
772	/*
773	 * Access control checks.
774	 */
775	mpo_bpfdesc_check_receive_t		mpo_bpfdesc_check_receive;
776	mpo_placeholder_t			_mpo_placeholder7;
777	mpo_cred_check_relabel_t		mpo_cred_check_relabel;
778	mpo_cred_check_visible_t		mpo_cred_check_visible;
779	mpo_placeholder_t			_mpo_placeholder8;
780	mpo_placeholder_t			_mpo_placeholder9;
781	mpo_placeholder_t			_mpo_placeholder10;
782	mpo_placeholder_t			_mpo_placeholder11;
783	mpo_placeholder_t			_mpo_placeholder12;
784	mpo_placeholder_t			_mpo_placeholder13;
785	mpo_placeholder_t			_mpo_placeholder14;
786	mpo_placeholder_t			_mpo_placeholder15;
787	mpo_placeholder_t			_mpo_placeholder16;
788	mpo_placeholder_t			_mpo_placeholder17;
789	mpo_placeholder_t			_mpo_placeholder18;
790	mpo_ifnet_check_relabel_t		mpo_ifnet_check_relabel;
791	mpo_ifnet_check_transmit_t		mpo_ifnet_check_transmit;
792	mpo_inpcb_check_deliver_t		mpo_inpcb_check_deliver;
793	mpo_sysvmsq_check_msgmsq_t		mpo_sysvmsq_check_msgmsq;
794	mpo_sysvmsq_check_msgrcv_t		mpo_sysvmsq_check_msgrcv;
795	mpo_sysvmsq_check_msgrmid_t		mpo_sysvmsq_check_msgrmid;
796	mpo_sysvmsq_check_msqget_t		mpo_sysvmsq_check_msqget;
797	mpo_sysvmsq_check_msqsnd_t		mpo_sysvmsq_check_msqsnd;
798	mpo_sysvmsq_check_msqrcv_t		mpo_sysvmsq_check_msqrcv;
799	mpo_sysvmsq_check_msqctl_t		mpo_sysvmsq_check_msqctl;
800	mpo_sysvsem_check_semctl_t		mpo_sysvsem_check_semctl;
801	mpo_sysvsem_check_semget_t		mpo_sysvsem_check_semget;
802	mpo_sysvsem_check_semop_t		mpo_sysvsem_check_semop;
803	mpo_sysvshm_check_shmat_t		mpo_sysvshm_check_shmat;
804	mpo_sysvshm_check_shmctl_t		mpo_sysvshm_check_shmctl;
805	mpo_sysvshm_check_shmdt_t		mpo_sysvshm_check_shmdt;
806	mpo_sysvshm_check_shmget_t		mpo_sysvshm_check_shmget;
807	mpo_kenv_check_dump_t			mpo_kenv_check_dump;
808	mpo_kenv_check_get_t			mpo_kenv_check_get;
809	mpo_kenv_check_set_t			mpo_kenv_check_set;
810	mpo_kenv_check_unset_t			mpo_kenv_check_unset;
811	mpo_kld_check_load_t			mpo_kld_check_load;
812	mpo_kld_check_stat_t			mpo_kld_check_stat;
813	mpo_placeholder_t			_mpo_placeholder19;
814	mpo_placeholder_t			_mpo_placeholder20;
815	mpo_mount_check_stat_t			mpo_mount_check_stat;
816	mpo_placeholder_t			_mpo_placeholder_21;
817	mpo_pipe_check_ioctl_t			mpo_pipe_check_ioctl;
818	mpo_pipe_check_poll_t			mpo_pipe_check_poll;
819	mpo_pipe_check_read_t			mpo_pipe_check_read;
820	mpo_pipe_check_relabel_t		mpo_pipe_check_relabel;
821	mpo_pipe_check_stat_t			mpo_pipe_check_stat;
822	mpo_pipe_check_write_t			mpo_pipe_check_write;
823	mpo_posixsem_check_destroy_t		mpo_posixsem_check_destroy;
824	mpo_posixsem_check_getvalue_t		mpo_posixsem_check_getvalue;
825	mpo_posixsem_check_open_t		mpo_posixsem_check_open;
826	mpo_posixsem_check_post_t		mpo_posixsem_check_post;
827	mpo_posixsem_check_unlink_t		mpo_posixsem_check_unlink;
828	mpo_posixsem_check_wait_t		mpo_posixsem_check_wait;
829	mpo_proc_check_debug_t			mpo_proc_check_debug;
830	mpo_proc_check_sched_t			mpo_proc_check_sched;
831	mpo_proc_check_setaudit_t		mpo_proc_check_setaudit;
832	mpo_proc_check_setaudit_addr_t		mpo_proc_check_setaudit_addr;
833	mpo_proc_check_setauid_t		mpo_proc_check_setauid;
834	mpo_proc_check_setuid_t			mpo_proc_check_setuid;
835	mpo_proc_check_seteuid_t		mpo_proc_check_seteuid;
836	mpo_proc_check_setgid_t			mpo_proc_check_setgid;
837	mpo_proc_check_setegid_t		mpo_proc_check_setegid;
838	mpo_proc_check_setgroups_t		mpo_proc_check_setgroups;
839	mpo_proc_check_setreuid_t		mpo_proc_check_setreuid;
840	mpo_proc_check_setregid_t		mpo_proc_check_setregid;
841	mpo_proc_check_setresuid_t		mpo_proc_check_setresuid;
842	mpo_proc_check_setresgid_t		mpo_proc_check_setresgid;
843	mpo_proc_check_signal_t			mpo_proc_check_signal;
844	mpo_proc_check_wait_t			mpo_proc_check_wait;
845	mpo_socket_check_accept_t		mpo_socket_check_accept;
846	mpo_socket_check_bind_t			mpo_socket_check_bind;
847	mpo_socket_check_connect_t		mpo_socket_check_connect;
848	mpo_socket_check_create_t		mpo_socket_check_create;
849	mpo_socket_check_deliver_t		mpo_socket_check_deliver;
850	mpo_placeholder_t			_mpo_placeholder22;
851	mpo_socket_check_listen_t		mpo_socket_check_listen;
852	mpo_socket_check_poll_t			mpo_socket_check_poll;
853	mpo_socket_check_receive_t		mpo_socket_check_receive;
854	mpo_socket_check_relabel_t		mpo_socket_check_relabel;
855	mpo_socket_check_send_t			mpo_socket_check_send;
856	mpo_socket_check_stat_t			mpo_socket_check_stat;
857	mpo_socket_check_visible_t		mpo_socket_check_visible;
858	mpo_system_check_acct_t			mpo_system_check_acct;
859	mpo_system_check_audit_t		mpo_system_check_audit;
860	mpo_system_check_auditctl_t		mpo_system_check_auditctl;
861	mpo_system_check_auditon_t		mpo_system_check_auditon;
862	mpo_system_check_reboot_t		mpo_system_check_reboot;
863	mpo_system_check_swapon_t		mpo_system_check_swapon;
864	mpo_system_check_swapoff_t		mpo_system_check_swapoff;
865	mpo_system_check_sysctl_t		mpo_system_check_sysctl;
866	mpo_placeholder_t			_mpo_placeholder23;
867	mpo_vnode_check_access_t		mpo_vnode_check_access;
868	mpo_vnode_check_chdir_t			mpo_vnode_check_chdir;
869	mpo_vnode_check_chroot_t		mpo_vnode_check_chroot;
870	mpo_vnode_check_create_t		mpo_vnode_check_create;
871	mpo_vnode_check_deleteacl_t		mpo_vnode_check_deleteacl;
872	mpo_vnode_check_deleteextattr_t		mpo_vnode_check_deleteextattr;
873	mpo_vnode_check_exec_t			mpo_vnode_check_exec;
874	mpo_vnode_check_getacl_t		mpo_vnode_check_getacl;
875	mpo_vnode_check_getextattr_t		mpo_vnode_check_getextattr;
876	mpo_placeholder_t			_mpo_placeholder24;
877	mpo_vnode_check_link_t			mpo_vnode_check_link;
878	mpo_vnode_check_listextattr_t		mpo_vnode_check_listextattr;
879	mpo_vnode_check_lookup_t		mpo_vnode_check_lookup;
880	mpo_vnode_check_mmap_t			mpo_vnode_check_mmap;
881	mpo_vnode_check_mmap_downgrade_t	mpo_vnode_check_mmap_downgrade;
882	mpo_vnode_check_mprotect_t		mpo_vnode_check_mprotect;
883	mpo_vnode_check_open_t			mpo_vnode_check_open;
884	mpo_vnode_check_poll_t			mpo_vnode_check_poll;
885	mpo_vnode_check_read_t			mpo_vnode_check_read;
886	mpo_vnode_check_readdir_t		mpo_vnode_check_readdir;
887	mpo_vnode_check_readlink_t		mpo_vnode_check_readlink;
888	mpo_vnode_check_relabel_t		mpo_vnode_check_relabel;
889	mpo_vnode_check_rename_from_t		mpo_vnode_check_rename_from;
890	mpo_vnode_check_rename_to_t		mpo_vnode_check_rename_to;
891	mpo_vnode_check_revoke_t		mpo_vnode_check_revoke;
892	mpo_vnode_check_setacl_t		mpo_vnode_check_setacl;
893	mpo_vnode_check_setextattr_t		mpo_vnode_check_setextattr;
894	mpo_vnode_check_setflags_t		mpo_vnode_check_setflags;
895	mpo_vnode_check_setmode_t		mpo_vnode_check_setmode;
896	mpo_vnode_check_setowner_t		mpo_vnode_check_setowner;
897	mpo_vnode_check_setutimes_t		mpo_vnode_check_setutimes;
898	mpo_vnode_check_stat_t			mpo_vnode_check_stat;
899	mpo_vnode_check_unlink_t		mpo_vnode_check_unlink;
900	mpo_vnode_check_write_t			mpo_vnode_check_write;
901	mpo_associate_nfsd_label_t		mpo_associate_nfsd_label;
902	mpo_mbuf_create_from_firewall_t		mpo_mbuf_create_from_firewall;
903	mpo_init_syncache_label_t		mpo_init_syncache_label;
904	mpo_destroy_syncache_label_t		mpo_destroy_syncache_label;
905	mpo_init_syncache_from_inpcb_t		mpo_init_syncache_from_inpcb;
906	mpo_create_mbuf_from_syncache_t		mpo_create_mbuf_from_syncache;
907	mpo_priv_check_t			mpo_priv_check;
908	mpo_priv_grant_t			mpo_priv_grant;
909};
910
911/*
912 * struct mac_policy_conf is the registration structure for policies, and is
913 * provided to the MAC Framework using MAC_POLICY_SET() to invoke a SYSINIT
914 * to register the policy.  In general, the fields are immutable, with the
915 * exception of the "security field", run-time flags, and policy list entry,
916 * which are managed by the MAC Framework.  Be careful when modifying this
917 * structure, as its layout is statically compiled into all policies.
918 */
919struct mac_policy_conf {
920	char				*mpc_name;	/* policy name */
921	char				*mpc_fullname;	/* policy full name */
922	struct mac_policy_ops		*mpc_ops;	/* policy operations */
923	int				 mpc_loadtime_flags;	/* flags */
924	int				*mpc_field_off; /* security field */
925	int				 mpc_runtime_flags; /* flags */
926	LIST_ENTRY(mac_policy_conf)	 mpc_list;	/* global list */
927};
928
929/* Flags for the mpc_loadtime_flags field. */
930#define	MPC_LOADTIME_FLAG_NOTLATE	0x00000001
931#define	MPC_LOADTIME_FLAG_UNLOADOK	0x00000002
932#define	MPC_LOADTIME_FLAG_LABELMBUFS	0x00000004
933
934/* Flags for the mpc_runtime_flags field. */
935#define	MPC_RUNTIME_FLAG_REGISTERED	0x00000001
936
937/*-
938 * The TrustedBSD MAC Framework has a major version number, MAC_VERSION,
939 * which defines the ABI of the Framework present in the kernel (and depended
940 * on by policy modules compiled against that kernel).  Currently,
941 * MAC_POLICY_SET() requires that the kernel and module ABI version numbers
942 * exactly match.  The following major versions have been defined to date:
943 *
944 *   MAC version             FreeBSD versions
945 *   1                       5.x
946 *   2                       6.x
947 *   3                       7.x
948 *   4                       8.x
949 */
950#define	MAC_VERSION	4
951
952#define	MAC_POLICY_SET(mpops, mpname, mpfullname, mpflags, privdata_wanted) \
953	static struct mac_policy_conf mpname##_mac_policy_conf = {	\
954		#mpname,						\
955		mpfullname,						\
956		mpops,							\
957		mpflags,						\
958		privdata_wanted,					\
959		0,							\
960	};								\
961	static moduledata_t mpname##_mod = {				\
962		#mpname,						\
963		mac_policy_modevent,					\
964		&mpname##_mac_policy_conf				\
965	};								\
966	MODULE_DEPEND(mpname, kernel_mac_support, MAC_VERSION,		\
967	    MAC_VERSION, MAC_VERSION);					\
968	DECLARE_MODULE(mpname, mpname##_mod, SI_SUB_MAC_POLICY,		\
969	    SI_ORDER_MIDDLE)
970
971int	mac_policy_modevent(module_t mod, int type, void *data);
972
973/*
974 * Policy interface to map a struct label pointer to per-policy data.
975 * Typically, policies wrap this in their own accessor macro that casts a
976 * uintptr_t to a policy-specific data type.
977 */
978intptr_t	mac_label_get(struct label *l, int slot);
979void		mac_label_set(struct label *l, int slot, intptr_t v);
980
981#endif /* !_SYS_SECURITY_MAC_MAC_POLICY_H_ */
982