1843e1988Sjohnlev /*
2843e1988Sjohnlev  * Details of the "wire" protocol between Xen Store Daemon and client
3843e1988Sjohnlev  * library or guest kernel.
4843e1988Sjohnlev  *
5843e1988Sjohnlev  * Permission is hereby granted, free of charge, to any person obtaining a copy
6843e1988Sjohnlev  * of this software and associated documentation files (the "Software"), to
7843e1988Sjohnlev  * deal in the Software without restriction, including without limitation the
8843e1988Sjohnlev  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9843e1988Sjohnlev  * sell copies of the Software, and to permit persons to whom the Software is
10843e1988Sjohnlev  * furnished to do so, subject to the following conditions:
11843e1988Sjohnlev  *
12843e1988Sjohnlev  * The above copyright notice and this permission notice shall be included in
13843e1988Sjohnlev  * all copies or substantial portions of the Software.
14843e1988Sjohnlev  *
15843e1988Sjohnlev  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16843e1988Sjohnlev  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17843e1988Sjohnlev  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18843e1988Sjohnlev  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19843e1988Sjohnlev  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20843e1988Sjohnlev  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21843e1988Sjohnlev  * DEALINGS IN THE SOFTWARE.
22843e1988Sjohnlev  *
23843e1988Sjohnlev  * Copyright (C) 2005 Rusty Russell IBM Corporation
24843e1988Sjohnlev  */
25843e1988Sjohnlev 
26843e1988Sjohnlev #ifndef _XS_WIRE_H
27843e1988Sjohnlev #define _XS_WIRE_H
28843e1988Sjohnlev 
29843e1988Sjohnlev enum xsd_sockmsg_type
30843e1988Sjohnlev {
31843e1988Sjohnlev     XS_DEBUG,
32843e1988Sjohnlev     XS_DIRECTORY,
33843e1988Sjohnlev     XS_READ,
34843e1988Sjohnlev     XS_GET_PERMS,
35843e1988Sjohnlev     XS_WATCH,
36843e1988Sjohnlev     XS_UNWATCH,
37843e1988Sjohnlev     XS_TRANSACTION_START,
38843e1988Sjohnlev     XS_TRANSACTION_END,
39843e1988Sjohnlev     XS_INTRODUCE,
40843e1988Sjohnlev     XS_RELEASE,
41843e1988Sjohnlev     XS_GET_DOMAIN_PATH,
42843e1988Sjohnlev     XS_WRITE,
43843e1988Sjohnlev     XS_MKDIR,
44843e1988Sjohnlev     XS_RM,
45843e1988Sjohnlev     XS_SET_PERMS,
46843e1988Sjohnlev     XS_WATCH_EVENT,
47843e1988Sjohnlev     XS_ERROR,
48a576ab5bSrab     XS_IS_DOMAIN_INTRODUCED,
49*349b53ddSStuart Maybee     XS_RESUME,
50*349b53ddSStuart Maybee     XS_SET_TARGET
51843e1988Sjohnlev };
52843e1988Sjohnlev 
53843e1988Sjohnlev #define XS_WRITE_NONE "NONE"
54843e1988Sjohnlev #define XS_WRITE_CREATE "CREATE"
55843e1988Sjohnlev #define XS_WRITE_CREATE_EXCL "CREATE|EXCL"
56843e1988Sjohnlev 
57843e1988Sjohnlev /* We hand errors as strings, for portability. */
58843e1988Sjohnlev struct xsd_errors
59843e1988Sjohnlev {
60843e1988Sjohnlev     int errnum;
61843e1988Sjohnlev     const char *errstring;
62843e1988Sjohnlev };
63843e1988Sjohnlev #define XSD_ERROR(x) { x, #x }
64843e1988Sjohnlev /* LINTED: static unused */
65a576ab5bSrab static struct xsd_errors xsd_errors[]
66a576ab5bSrab #if defined(__GNUC__)
67a576ab5bSrab __attribute__((unused))
68a576ab5bSrab #endif
69a576ab5bSrab     = {
70843e1988Sjohnlev     XSD_ERROR(EINVAL),
71843e1988Sjohnlev     XSD_ERROR(EACCES),
72843e1988Sjohnlev     XSD_ERROR(EEXIST),
73843e1988Sjohnlev     XSD_ERROR(EISDIR),
74843e1988Sjohnlev     XSD_ERROR(ENOENT),
75843e1988Sjohnlev     XSD_ERROR(ENOMEM),
76843e1988Sjohnlev     XSD_ERROR(ENOSPC),
77843e1988Sjohnlev     XSD_ERROR(EIO),
78843e1988Sjohnlev     XSD_ERROR(ENOTEMPTY),
79843e1988Sjohnlev     XSD_ERROR(ENOSYS),
80843e1988Sjohnlev     XSD_ERROR(EROFS),
81843e1988Sjohnlev     XSD_ERROR(EBUSY),
82843e1988Sjohnlev     XSD_ERROR(EAGAIN),
83843e1988Sjohnlev     XSD_ERROR(EISCONN)
84843e1988Sjohnlev };
85843e1988Sjohnlev 
86843e1988Sjohnlev struct xsd_sockmsg
87843e1988Sjohnlev {
88843e1988Sjohnlev     uint32_t type;  /* XS_??? */
89843e1988Sjohnlev     uint32_t req_id;/* Request identifier, echoed in daemon's response.  */
90843e1988Sjohnlev     uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */
91843e1988Sjohnlev     uint32_t len;   /* Length of data following this. */
92843e1988Sjohnlev 
93843e1988Sjohnlev     /* Generally followed by nul-terminated string(s). */
94843e1988Sjohnlev };
95843e1988Sjohnlev 
96843e1988Sjohnlev enum xs_watch_type
97843e1988Sjohnlev {
98843e1988Sjohnlev     XS_WATCH_PATH = 0,
99843e1988Sjohnlev     XS_WATCH_TOKEN
100843e1988Sjohnlev };
101843e1988Sjohnlev 
102843e1988Sjohnlev /* Inter-domain shared memory communications. */
103843e1988Sjohnlev #define XENSTORE_RING_SIZE 1024
104843e1988Sjohnlev typedef uint32_t XENSTORE_RING_IDX;
105843e1988Sjohnlev #define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1))
106843e1988Sjohnlev struct xenstore_domain_interface {
107843e1988Sjohnlev     char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */
108843e1988Sjohnlev     char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */
109843e1988Sjohnlev     XENSTORE_RING_IDX req_cons, req_prod;
110843e1988Sjohnlev     XENSTORE_RING_IDX rsp_cons, rsp_prod;
111843e1988Sjohnlev };
112843e1988Sjohnlev 
113*349b53ddSStuart Maybee /* Violating this is very bad.  See docs/misc/xenstore.txt. */
114*349b53ddSStuart Maybee #define XENSTORE_PAYLOAD_MAX 4096
115*349b53ddSStuart Maybee 
116*349b53ddSStuart Maybee /* Violating these just gets you an error back */
117*349b53ddSStuart Maybee #define XENSTORE_ABS_PATH_MAX 3072
118*349b53ddSStuart Maybee #define XENSTORE_REL_PATH_MAX 2048
119*349b53ddSStuart Maybee 
120843e1988Sjohnlev #endif /* _XS_WIRE_H */
121843e1988Sjohnlev 
122843e1988Sjohnlev /*
123843e1988Sjohnlev  * Local variables:
124843e1988Sjohnlev  * mode: C
125843e1988Sjohnlev  * c-set-style: "BSD"
126843e1988Sjohnlev  * c-basic-offset: 4
127843e1988Sjohnlev  * tab-width: 4
128843e1988Sjohnlev  * indent-tabs-mode: nil
129843e1988Sjohnlev  * End:
130843e1988Sjohnlev  */
131