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