1 /* Copyright (c) 2008, XenSource Inc.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of XenSource Inc. nor the names of its contributors
12  *       may be used to endorse or promote products derived from this software
13  *       without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 #ifndef _TAPDISK_MESSAGE_H_
28 #define _TAPDISK_MESSAGE_H_
29 
30 #include <inttypes.h>
31 #include <sys/types.h>
32 
33 #define TAPDISK_MESSAGE_MAX_PATH_LENGTH  256
34 #define TAPDISK_MESSAGE_STRING_LENGTH    256
35 
36 #define TAPDISK_MESSAGE_MAX_MINORS \
37 	((TAPDISK_MESSAGE_MAX_PATH_LENGTH / sizeof(int)) - 1)
38 
39 #define TAPDISK_MESSAGE_FLAG_SHARED      0x01
40 #define TAPDISK_MESSAGE_FLAG_RDONLY      0x02
41 #define TAPDISK_MESSAGE_FLAG_ADD_CACHE   0x04
42 #define TAPDISK_MESSAGE_FLAG_VHD_INDEX   0x08
43 #define TAPDISK_MESSAGE_FLAG_LOG_DIRTY   0x10
44 
45 typedef struct tapdisk_message           tapdisk_message_t;
46 typedef uint8_t                          tapdisk_message_flag_t;
47 typedef struct tapdisk_message_image     tapdisk_message_image_t;
48 typedef struct tapdisk_message_params    tapdisk_message_params_t;
49 typedef struct tapdisk_message_string    tapdisk_message_string_t;
50 typedef struct tapdisk_message_response  tapdisk_message_response_t;
51 typedef struct tapdisk_message_minors    tapdisk_message_minors_t;
52 typedef struct tapdisk_message_list      tapdisk_message_list_t;
53 
54 struct tapdisk_message_params {
55 	tapdisk_message_flag_t           flags;
56 
57 	uint8_t                          storage;
58 	uint32_t                         devnum;
59 	uint32_t                         domid;
60 	uint16_t                         path_len;
61 	char                             path[TAPDISK_MESSAGE_MAX_PATH_LENGTH];
62 };
63 
64 struct tapdisk_message_image {
65 	uint64_t                         sectors;
66 	uint32_t                         sector_size;
67 	uint32_t                         info;
68 };
69 
70 struct tapdisk_message_string {
71 	char                             text[TAPDISK_MESSAGE_STRING_LENGTH];
72 };
73 
74 struct tapdisk_message_response {
75 	int                              error;
76 	char                             message[TAPDISK_MESSAGE_STRING_LENGTH];
77 };
78 
79 struct tapdisk_message_minors {
80 	int                              count;
81 	int                              list[TAPDISK_MESSAGE_MAX_MINORS];
82 };
83 
84 struct tapdisk_message_list {
85 	int                              count;
86 	int                              minor;
87 	int                              state;
88 	char                             path[TAPDISK_MESSAGE_MAX_PATH_LENGTH];
89 };
90 
91 struct tapdisk_message {
92 	uint16_t                         type;
93 	uint16_t                         cookie;
94 
95 	union {
96 		pid_t                    tapdisk_pid;
97 		tapdisk_message_image_t  image;
98 		tapdisk_message_params_t params;
99 		tapdisk_message_string_t string;
100 		tapdisk_message_minors_t minors;
101 		tapdisk_message_response_t response;
102 		tapdisk_message_list_t   list;
103 	} u;
104 };
105 
106 enum tapdisk_message_id {
107 	TAPDISK_MESSAGE_ERROR = 1,
108 	TAPDISK_MESSAGE_RUNTIME_ERROR,
109 	TAPDISK_MESSAGE_PID,
110 	TAPDISK_MESSAGE_PID_RSP,
111 	TAPDISK_MESSAGE_ATTACH,
112 	TAPDISK_MESSAGE_ATTACH_RSP,
113 	TAPDISK_MESSAGE_OPEN,
114 	TAPDISK_MESSAGE_OPEN_RSP,
115 	TAPDISK_MESSAGE_PAUSE,
116 	TAPDISK_MESSAGE_PAUSE_RSP,
117 	TAPDISK_MESSAGE_RESUME,
118 	TAPDISK_MESSAGE_RESUME_RSP,
119 	TAPDISK_MESSAGE_CLOSE,
120 	TAPDISK_MESSAGE_CLOSE_RSP,
121 	TAPDISK_MESSAGE_DETACH,
122 	TAPDISK_MESSAGE_DETACH_RSP,
123 	TAPDISK_MESSAGE_LIST_MINORS,
124 	TAPDISK_MESSAGE_LIST_MINORS_RSP,
125 	TAPDISK_MESSAGE_LIST,
126 	TAPDISK_MESSAGE_LIST_RSP,
127 	TAPDISK_MESSAGE_FORCE_SHUTDOWN,
128 	TAPDISK_MESSAGE_EXIT,
129 };
130 
131 static inline char *
tapdisk_message_name(enum tapdisk_message_id id)132 tapdisk_message_name(enum tapdisk_message_id id)
133 {
134 	switch (id) {
135 	case TAPDISK_MESSAGE_ERROR:
136 		return "error";
137 
138 	case TAPDISK_MESSAGE_PID:
139 		return "pid";
140 
141 	case TAPDISK_MESSAGE_PID_RSP:
142 		return "pid response";
143 
144 	case TAPDISK_MESSAGE_OPEN:
145 		return "open";
146 
147 	case TAPDISK_MESSAGE_OPEN_RSP:
148 		return "open response";
149 
150 	case TAPDISK_MESSAGE_PAUSE:
151 		return "pause";
152 
153 	case TAPDISK_MESSAGE_PAUSE_RSP:
154 		return "pause response";
155 
156 	case TAPDISK_MESSAGE_RESUME:
157 		return "resume";
158 
159 	case TAPDISK_MESSAGE_RESUME_RSP:
160 		return "resume response";
161 
162 	case TAPDISK_MESSAGE_CLOSE:
163 		return "close";
164 
165 	case TAPDISK_MESSAGE_FORCE_SHUTDOWN:
166 		return "force shutdown";
167 
168 	case TAPDISK_MESSAGE_CLOSE_RSP:
169 		return "close response";
170 
171 	case TAPDISK_MESSAGE_ATTACH:
172 		return "attach";
173 
174 	case TAPDISK_MESSAGE_ATTACH_RSP:
175 		return "attach response";
176 
177 	case TAPDISK_MESSAGE_DETACH:
178 		return "detach";
179 
180 	case TAPDISK_MESSAGE_DETACH_RSP:
181 		return "detach response";
182 
183 	case TAPDISK_MESSAGE_LIST_MINORS:
184 		return "list minors";
185 
186 	case TAPDISK_MESSAGE_LIST_MINORS_RSP:
187 		return "list minors response";
188 
189 	case TAPDISK_MESSAGE_LIST:
190 		return "list";
191 
192 	case TAPDISK_MESSAGE_LIST_RSP:
193 		return "list response";
194 
195 	case TAPDISK_MESSAGE_EXIT:
196 		return "exit";
197 
198 	default:
199 		return "unknown";
200 	}
201 }
202 
203 #endif
204