xref: /openbsd-src/usr.sbin/vmd/vmd.h (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*	$OpenBSD: vmd.h,v 1.24 2016/09/02 16:23:40 stefan Exp $	*/
2 
3 /*
4  * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/queue.h>
21 
22 #include <machine/vmmvar.h>
23 
24 #include <limits.h>
25 #include <pthread.h>
26 
27 #include "proc.h"
28 
29 #ifndef VMD_H
30 #define VMD_H
31 
32 #define VMD_USER		"_vmd"
33 #define VMD_CONF		"/etc/vm.conf"
34 #define SOCKET_NAME		"/var/run/vmd.sock"
35 #define VMM_NODE		"/dev/vmm"
36 #define VM_NAME_MAX		64
37 #define VM_TTYNAME_MAX		12
38 #define MAX_TAP			256
39 #define NR_BACKLOG		5
40 
41 #ifdef VMD_DEBUG
42 #define dprintf(x...)   do { log_debug(x); } while(0)
43 #else
44 #define dprintf(x...)
45 #endif /* VMD_DEBUG */
46 
47 enum imsg_type {
48 	IMSG_VMDOP_START_VM_REQUEST = IMSG_PROC_MAX,
49 	IMSG_VMDOP_START_VM_DISK,
50 	IMSG_VMDOP_START_VM_IF,
51 	IMSG_VMDOP_START_VM_END,
52 	IMSG_VMDOP_START_VM_RESPONSE,
53 	IMSG_VMDOP_TERMINATE_VM_REQUEST,
54 	IMSG_VMDOP_TERMINATE_VM_RESPONSE,
55 	IMSG_VMDOP_GET_INFO_VM_REQUEST,
56 	IMSG_VMDOP_GET_INFO_VM_DATA,
57 	IMSG_VMDOP_GET_INFO_VM_END_DATA,
58 	IMSG_VMDOP_LOAD,
59 	IMSG_VMDOP_RELOAD,
60 	IMSG_VMDOP_TERMINATE_VM_EVENT
61 };
62 
63 struct vmop_result {
64 	int			 vmr_result;
65 	uint32_t		 vmr_id;
66 	pid_t			 vmr_pid;
67 	char			 vmr_ttyname[VM_TTYNAME_MAX];
68 };
69 
70 struct vmop_info_result {
71 	struct vm_info_result	 vir_info;
72 	char			 vir_ttyname[VM_TTYNAME_MAX];
73 };
74 
75 struct vmop_id {
76 	uint32_t		 vid_id;
77 	char			 vid_name[VMM_MAX_NAME_LEN];
78 };
79 
80 struct vmd_vm {
81 	struct vm_create_params	 vm_params;
82 	pid_t			 vm_pid;
83 	uint32_t		 vm_vmid;
84 	int			 vm_kernel;
85 	int			 vm_disks[VMM_MAX_DISKS_PER_VM];
86 	int			 vm_ifs[VMM_MAX_NICS_PER_VM];
87 	char			 vm_ttyname[VM_TTYNAME_MAX];
88 	int			 vm_tty;
89 	uint32_t		 vm_peerid;
90 	TAILQ_ENTRY(vmd_vm)	 vm_entry;
91 };
92 TAILQ_HEAD(vmlist, vmd_vm);
93 
94 struct vmd {
95 	struct privsep		 vmd_ps;
96 	const char		*vmd_conffile;
97 
98 	int			 vmd_debug;
99 	int			 vmd_verbose;
100 	int			 vmd_noaction;
101 	int			 vmd_vmcount;
102 
103 	uint32_t		 vmd_nvm;
104 	struct vmlist		*vmd_vms;
105 
106 	int			 vmd_fd;
107 };
108 
109 /* vmd.c */
110 void	 vmd_reload(int, const char *);
111 struct vmd_vm *vm_getbyvmid(uint32_t);
112 struct vmd_vm *vm_getbyid(uint32_t);
113 struct vmd_vm *vm_getbyname(const char *);
114 struct vmd_vm *vm_getbypid(pid_t);
115 void	 vm_remove(struct vmd_vm *);
116 char	*get_string(uint8_t *, size_t);
117 
118 /* vmm.c */
119 pid_t	 vmm(struct privsep *, struct privsep_proc *);
120 int	 write_mem(paddr_t, void *buf, size_t);
121 int	 read_mem(paddr_t, void *buf, size_t);
122 int	 opentap(void);
123 int	 fd_hasdata(int);
124 void	 mutex_lock(pthread_mutex_t *);
125 void	 mutex_unlock(pthread_mutex_t *);
126 
127 /* control.c */
128 int	 config_init(struct vmd *);
129 void	 config_purge(struct vmd *, unsigned int);
130 int	 config_setreset(struct vmd *, unsigned int);
131 int	 config_getreset(struct vmd *, struct imsg *);
132 int	 config_getvm(struct privsep *, struct vm_create_params *,
133 	    int, uint32_t);
134 int	 config_getdisk(struct privsep *, struct imsg *);
135 int	 config_getif(struct privsep *, struct imsg *);
136 
137 /* parse.y */
138 int	 parse_config(const char *);
139 int	 cmdline_symset(char *);
140 
141 #endif /* VMD_H */
142