xref: /qemu/include/hw/xen/interface/io/xs_wire.h (revision 50c88402ca599e577f025e78a4380431be2b3f6d)
1*50c88402SJoao Martins /*
2*50c88402SJoao Martins  * Details of the "wire" protocol between Xen Store Daemon and client
3*50c88402SJoao Martins  * library or guest kernel.
4*50c88402SJoao Martins  *
5*50c88402SJoao Martins  * Permission is hereby granted, free of charge, to any person obtaining a copy
6*50c88402SJoao Martins  * of this software and associated documentation files (the "Software"), to
7*50c88402SJoao Martins  * deal in the Software without restriction, including without limitation the
8*50c88402SJoao Martins  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9*50c88402SJoao Martins  * sell copies of the Software, and to permit persons to whom the Software is
10*50c88402SJoao Martins  * furnished to do so, subject to the following conditions:
11*50c88402SJoao Martins  *
12*50c88402SJoao Martins  * The above copyright notice and this permission notice shall be included in
13*50c88402SJoao Martins  * all copies or substantial portions of the Software.
14*50c88402SJoao Martins  *
15*50c88402SJoao Martins  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*50c88402SJoao Martins  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*50c88402SJoao Martins  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18*50c88402SJoao Martins  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*50c88402SJoao Martins  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*50c88402SJoao Martins  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*50c88402SJoao Martins  * DEALINGS IN THE SOFTWARE.
22*50c88402SJoao Martins  *
23*50c88402SJoao Martins  * Copyright (C) 2005 Rusty Russell IBM Corporation
24*50c88402SJoao Martins  */
25*50c88402SJoao Martins 
26*50c88402SJoao Martins #ifndef _XS_WIRE_H
27*50c88402SJoao Martins #define _XS_WIRE_H
28*50c88402SJoao Martins 
29*50c88402SJoao Martins enum xsd_sockmsg_type
30*50c88402SJoao Martins {
31*50c88402SJoao Martins     XS_CONTROL,
32*50c88402SJoao Martins #define XS_DEBUG XS_CONTROL
33*50c88402SJoao Martins     XS_DIRECTORY,
34*50c88402SJoao Martins     XS_READ,
35*50c88402SJoao Martins     XS_GET_PERMS,
36*50c88402SJoao Martins     XS_WATCH,
37*50c88402SJoao Martins     XS_UNWATCH,
38*50c88402SJoao Martins     XS_TRANSACTION_START,
39*50c88402SJoao Martins     XS_TRANSACTION_END,
40*50c88402SJoao Martins     XS_INTRODUCE,
41*50c88402SJoao Martins     XS_RELEASE,
42*50c88402SJoao Martins     XS_GET_DOMAIN_PATH,
43*50c88402SJoao Martins     XS_WRITE,
44*50c88402SJoao Martins     XS_MKDIR,
45*50c88402SJoao Martins     XS_RM,
46*50c88402SJoao Martins     XS_SET_PERMS,
47*50c88402SJoao Martins     XS_WATCH_EVENT,
48*50c88402SJoao Martins     XS_ERROR,
49*50c88402SJoao Martins     XS_IS_DOMAIN_INTRODUCED,
50*50c88402SJoao Martins     XS_RESUME,
51*50c88402SJoao Martins     XS_SET_TARGET,
52*50c88402SJoao Martins     /* XS_RESTRICT has been removed */
53*50c88402SJoao Martins     XS_RESET_WATCHES = XS_SET_TARGET + 2,
54*50c88402SJoao Martins     XS_DIRECTORY_PART,
55*50c88402SJoao Martins 
56*50c88402SJoao Martins     XS_TYPE_COUNT,      /* Number of valid types. */
57*50c88402SJoao Martins 
58*50c88402SJoao Martins     XS_INVALID = 0xffff /* Guaranteed to remain an invalid type */
59*50c88402SJoao Martins };
60*50c88402SJoao Martins 
61*50c88402SJoao Martins #define XS_WRITE_NONE "NONE"
62*50c88402SJoao Martins #define XS_WRITE_CREATE "CREATE"
63*50c88402SJoao Martins #define XS_WRITE_CREATE_EXCL "CREATE|EXCL"
64*50c88402SJoao Martins 
65*50c88402SJoao Martins /* We hand errors as strings, for portability. */
66*50c88402SJoao Martins struct xsd_errors
67*50c88402SJoao Martins {
68*50c88402SJoao Martins     int errnum;
69*50c88402SJoao Martins     const char *errstring;
70*50c88402SJoao Martins };
71*50c88402SJoao Martins #ifdef EINVAL
72*50c88402SJoao Martins #define XSD_ERROR(x) { x, #x }
73*50c88402SJoao Martins /* LINTED: static unused */
74*50c88402SJoao Martins static struct xsd_errors xsd_errors[]
75*50c88402SJoao Martins #if defined(__GNUC__)
76*50c88402SJoao Martins __attribute__((unused))
77*50c88402SJoao Martins #endif
78*50c88402SJoao Martins     = {
79*50c88402SJoao Martins     XSD_ERROR(EINVAL),
80*50c88402SJoao Martins     XSD_ERROR(EACCES),
81*50c88402SJoao Martins     XSD_ERROR(EEXIST),
82*50c88402SJoao Martins     XSD_ERROR(EISDIR),
83*50c88402SJoao Martins     XSD_ERROR(ENOENT),
84*50c88402SJoao Martins     XSD_ERROR(ENOMEM),
85*50c88402SJoao Martins     XSD_ERROR(ENOSPC),
86*50c88402SJoao Martins     XSD_ERROR(EIO),
87*50c88402SJoao Martins     XSD_ERROR(ENOTEMPTY),
88*50c88402SJoao Martins     XSD_ERROR(ENOSYS),
89*50c88402SJoao Martins     XSD_ERROR(EROFS),
90*50c88402SJoao Martins     XSD_ERROR(EBUSY),
91*50c88402SJoao Martins     XSD_ERROR(EAGAIN),
92*50c88402SJoao Martins     XSD_ERROR(EISCONN),
93*50c88402SJoao Martins     XSD_ERROR(E2BIG)
94*50c88402SJoao Martins };
95*50c88402SJoao Martins #endif
96*50c88402SJoao Martins 
97*50c88402SJoao Martins struct xsd_sockmsg
98*50c88402SJoao Martins {
99*50c88402SJoao Martins     uint32_t type;  /* XS_??? */
100*50c88402SJoao Martins     uint32_t req_id;/* Request identifier, echoed in daemon's response.  */
101*50c88402SJoao Martins     uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */
102*50c88402SJoao Martins     uint32_t len;   /* Length of data following this. */
103*50c88402SJoao Martins 
104*50c88402SJoao Martins     /* Generally followed by nul-terminated string(s). */
105*50c88402SJoao Martins };
106*50c88402SJoao Martins 
107*50c88402SJoao Martins enum xs_watch_type
108*50c88402SJoao Martins {
109*50c88402SJoao Martins     XS_WATCH_PATH = 0,
110*50c88402SJoao Martins     XS_WATCH_TOKEN
111*50c88402SJoao Martins };
112*50c88402SJoao Martins 
113*50c88402SJoao Martins /*
114*50c88402SJoao Martins  * `incontents 150 xenstore_struct XenStore wire protocol.
115*50c88402SJoao Martins  *
116*50c88402SJoao Martins  * Inter-domain shared memory communications. */
117*50c88402SJoao Martins #define XENSTORE_RING_SIZE 1024
118*50c88402SJoao Martins typedef uint32_t XENSTORE_RING_IDX;
119*50c88402SJoao Martins #define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1))
120*50c88402SJoao Martins struct xenstore_domain_interface {
121*50c88402SJoao Martins     char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */
122*50c88402SJoao Martins     char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */
123*50c88402SJoao Martins     XENSTORE_RING_IDX req_cons, req_prod;
124*50c88402SJoao Martins     XENSTORE_RING_IDX rsp_cons, rsp_prod;
125*50c88402SJoao Martins     uint32_t server_features; /* Bitmap of features supported by the server */
126*50c88402SJoao Martins     uint32_t connection;
127*50c88402SJoao Martins };
128*50c88402SJoao Martins 
129*50c88402SJoao Martins /* Violating this is very bad.  See docs/misc/xenstore.txt. */
130*50c88402SJoao Martins #define XENSTORE_PAYLOAD_MAX 4096
131*50c88402SJoao Martins 
132*50c88402SJoao Martins /* Violating these just gets you an error back */
133*50c88402SJoao Martins #define XENSTORE_ABS_PATH_MAX 3072
134*50c88402SJoao Martins #define XENSTORE_REL_PATH_MAX 2048
135*50c88402SJoao Martins 
136*50c88402SJoao Martins /* The ability to reconnect a ring */
137*50c88402SJoao Martins #define XENSTORE_SERVER_FEATURE_RECONNECTION 1
138*50c88402SJoao Martins 
139*50c88402SJoao Martins /* Valid values for the connection field */
140*50c88402SJoao Martins #define XENSTORE_CONNECTED 0 /* the steady-state */
141*50c88402SJoao Martins #define XENSTORE_RECONNECT 1 /* guest has initiated a reconnect */
142*50c88402SJoao Martins 
143*50c88402SJoao Martins #endif /* _XS_WIRE_H */
144*50c88402SJoao Martins 
145*50c88402SJoao Martins /*
146*50c88402SJoao Martins  * Local variables:
147*50c88402SJoao Martins  * mode: C
148*50c88402SJoao Martins  * c-file-style: "BSD"
149*50c88402SJoao Martins  * c-basic-offset: 4
150*50c88402SJoao Martins  * tab-width: 4
151*50c88402SJoao Martins  * indent-tabs-mode: nil
152*50c88402SJoao Martins  * End:
153*50c88402SJoao Martins  */
154