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