xref: /openbsd/usr.sbin/vmd/vmd.h (revision fc61954a)
1 /*	$OpenBSD: vmd.h,v 1.34 2016/11/04 15:16:44 reyk 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 #include <sys/socket.h>
22 
23 #include <machine/vmmvar.h>
24 
25 #include <net/if.h>
26 
27 #include <limits.h>
28 #include <pthread.h>
29 
30 #include "proc.h"
31 
32 #ifndef VMD_H
33 #define VMD_H
34 
35 #define VMD_USER		"_vmd"
36 #define VMD_CONF		"/etc/vm.conf"
37 #define SOCKET_NAME		"/var/run/vmd.sock"
38 #define VMM_NODE		"/dev/vmm"
39 #define VM_NAME_MAX		64
40 #define VM_TTYNAME_MAX		16
41 #define MAX_TAP			256
42 #define NR_BACKLOG		5
43 #define VMD_SWITCH_TYPE		"bridge"
44 
45 #ifdef VMD_DEBUG
46 #define dprintf(x...)   do { log_debug(x); } while(0)
47 #else
48 #define dprintf(x...)
49 #endif /* VMD_DEBUG */
50 
51 enum imsg_type {
52 	IMSG_VMDOP_START_VM_REQUEST = IMSG_PROC_MAX,
53 	IMSG_VMDOP_START_VM_DISK,
54 	IMSG_VMDOP_START_VM_IF,
55 	IMSG_VMDOP_START_VM_END,
56 	IMSG_VMDOP_START_VM_RESPONSE,
57 	IMSG_VMDOP_TERMINATE_VM_REQUEST,
58 	IMSG_VMDOP_TERMINATE_VM_RESPONSE,
59 	IMSG_VMDOP_TERMINATE_VM_EVENT,
60 	IMSG_VMDOP_GET_INFO_VM_REQUEST,
61 	IMSG_VMDOP_GET_INFO_VM_DATA,
62 	IMSG_VMDOP_GET_INFO_VM_END_DATA,
63 	IMSG_VMDOP_LOAD,
64 	IMSG_VMDOP_RELOAD,
65 	IMSG_VMDOP_PRIV_IFDESCR,
66 	IMSG_VMDOP_PRIV_IFADD,
67 	IMSG_VMDOP_PRIV_IFCREATE,
68 	IMSG_VMDOP_PRIV_IFUP,
69 	IMSG_VMDOP_PRIV_IFDOWN,
70 	IMSG_VMDOP_PRIV_IFGROUP
71 };
72 
73 struct vmop_result {
74 	int			 vmr_result;
75 	uint32_t		 vmr_id;
76 	pid_t			 vmr_pid;
77 	char			 vmr_ttyname[VM_TTYNAME_MAX];
78 };
79 
80 struct vmop_info_result {
81 	struct vm_info_result	 vir_info;
82 	char			 vir_ttyname[VM_TTYNAME_MAX];
83 };
84 
85 struct vmop_id {
86 	uint32_t		 vid_id;
87 	char			 vid_name[VMM_MAX_NAME_LEN];
88 };
89 
90 struct vmop_ifreq {
91 	uint32_t		 vfr_id;
92 	char			 vfr_name[IF_NAMESIZE];
93 	char			 vfr_value[VM_NAME_MAX];
94 };
95 
96 struct vmop_create_params {
97 	struct vm_create_params	 vmc_params;
98 
99 	/* userland-only part of the create params */
100 	unsigned int		 vmc_ifflags[VMM_MAX_NICS_PER_VM];
101 	char			 vmc_ifnames[VMM_MAX_NICS_PER_VM][IF_NAMESIZE];
102 	char			 vmc_ifswitch[VMM_MAX_NICS_PER_VM][VM_NAME_MAX];
103 	char			 vmc_ifgroup[VMM_MAX_NICS_PER_VM][IF_NAMESIZE];
104 };
105 
106 struct vmd_if {
107 	char			*vif_name;
108 	char			*vif_switch;
109 	char			*vif_group;
110 	int			 vif_fd;
111 	unsigned int		 vif_flags;
112 	TAILQ_ENTRY(vmd_if)	 vif_entry;
113 };
114 TAILQ_HEAD(viflist, vmd_if);
115 
116 struct vmd_switch {
117 	uint32_t		 sw_id;
118 	char			*sw_name;
119 	char			 sw_ifname[IF_NAMESIZE];
120 	char			*sw_group;
121 	unsigned int		 sw_flags;
122 	struct viflist		 sw_ifs;
123 	int			 sw_running;
124 	TAILQ_ENTRY(vmd_switch)	 sw_entry;
125 };
126 TAILQ_HEAD(switchlist, vmd_switch);
127 
128 struct vmd_vm {
129 	struct vmop_create_params vm_params;
130 	pid_t			 vm_pid;
131 	uint32_t		 vm_vmid;
132 	int			 vm_kernel;
133 	int			 vm_disks[VMM_MAX_DISKS_PER_VM];
134 	struct vmd_if		 vm_ifs[VMM_MAX_NICS_PER_VM];
135 	char			*vm_ttyname;
136 	int			 vm_tty;
137 	uint32_t		 vm_peerid;
138 	int			 vm_running;
139 	TAILQ_ENTRY(vmd_vm)	 vm_entry;
140 };
141 TAILQ_HEAD(vmlist, vmd_vm);
142 
143 struct vmd {
144 	struct privsep		 vmd_ps;
145 	const char		*vmd_conffile;
146 
147 	int			 vmd_debug;
148 	int			 vmd_verbose;
149 	int			 vmd_noaction;
150 
151 	uint32_t		 vmd_nvm;
152 	struct vmlist		*vmd_vms;
153 
154 	uint32_t		 vmd_nswitches;
155 	struct switchlist	*vmd_switches;
156 
157 	int			 vmd_fd;
158 };
159 
160 /* vmd.c */
161 void	 vmd_reload(unsigned int, const char *);
162 struct vmd_vm *vm_getbyvmid(uint32_t);
163 struct vmd_vm *vm_getbyid(uint32_t);
164 struct vmd_vm *vm_getbyname(const char *);
165 struct vmd_vm *vm_getbypid(pid_t);
166 void	 vm_remove(struct vmd_vm *);
167 int	 vm_register(struct privsep *, struct vmop_create_params *,
168 	    struct vmd_vm **, uint32_t);
169 void	 switch_remove(struct vmd_switch *);
170 struct vmd_switch *switch_getbyname(const char *);
171 char	*get_string(uint8_t *, size_t);
172 
173 /* priv.c */
174 void	 priv(struct privsep *, struct privsep_proc *);
175 int	 priv_getiftype(char *, char *, unsigned int *);
176 int	 priv_findname(const char *, const char **);
177 int	 priv_validgroup(const char *);
178 int	 vm_priv_ifconfig(struct privsep *, struct vmd_vm *);
179 int	 vm_priv_brconfig(struct privsep *, struct vmd_switch *);
180 
181 /* vmm.c */
182 void	 vmm(struct privsep *, struct privsep_proc *);
183 void	 vmm_shutdown(void);
184 int	 write_mem(paddr_t, void *buf, size_t);
185 int	 read_mem(paddr_t, void *buf, size_t);
186 int	 opentap(char *);
187 int	 fd_hasdata(int);
188 void	 mutex_lock(pthread_mutex_t *);
189 void	 mutex_unlock(pthread_mutex_t *);
190 
191 /* control.c */
192 int	 config_init(struct vmd *);
193 void	 config_purge(struct vmd *, unsigned int);
194 int	 config_setreset(struct vmd *, unsigned int);
195 int	 config_getreset(struct vmd *, struct imsg *);
196 int	 config_setvm(struct privsep *, struct vmd_vm *, uint32_t);
197 int	 config_getvm(struct privsep *, struct imsg *);
198 int	 config_getdisk(struct privsep *, struct imsg *);
199 int	 config_getif(struct privsep *, struct imsg *);
200 
201 /* parse.y */
202 int	 parse_config(const char *);
203 int	 cmdline_symset(char *);
204 
205 #endif /* VMD_H */
206