xref: /qemu/include/hw/xen/interface/io/xs_wire.h (revision 8ac98aed)
18ac98aedSDavid Woodhouse /* SPDX-License-Identifier: MIT */
250c88402SJoao Martins /*
350c88402SJoao Martins  * Details of the "wire" protocol between Xen Store Daemon and client
450c88402SJoao Martins  * library or guest kernel.
550c88402SJoao Martins  *
650c88402SJoao Martins  * Copyright (C) 2005 Rusty Russell IBM Corporation
750c88402SJoao Martins  */
850c88402SJoao Martins 
950c88402SJoao Martins #ifndef _XS_WIRE_H
1050c88402SJoao Martins #define _XS_WIRE_H
1150c88402SJoao Martins 
1250c88402SJoao Martins enum xsd_sockmsg_type
1350c88402SJoao Martins {
1450c88402SJoao Martins     XS_CONTROL,
1550c88402SJoao Martins #define XS_DEBUG XS_CONTROL
1650c88402SJoao Martins     XS_DIRECTORY,
1750c88402SJoao Martins     XS_READ,
1850c88402SJoao Martins     XS_GET_PERMS,
1950c88402SJoao Martins     XS_WATCH,
2050c88402SJoao Martins     XS_UNWATCH,
2150c88402SJoao Martins     XS_TRANSACTION_START,
2250c88402SJoao Martins     XS_TRANSACTION_END,
2350c88402SJoao Martins     XS_INTRODUCE,
2450c88402SJoao Martins     XS_RELEASE,
2550c88402SJoao Martins     XS_GET_DOMAIN_PATH,
2650c88402SJoao Martins     XS_WRITE,
2750c88402SJoao Martins     XS_MKDIR,
2850c88402SJoao Martins     XS_RM,
2950c88402SJoao Martins     XS_SET_PERMS,
3050c88402SJoao Martins     XS_WATCH_EVENT,
3150c88402SJoao Martins     XS_ERROR,
3250c88402SJoao Martins     XS_IS_DOMAIN_INTRODUCED,
3350c88402SJoao Martins     XS_RESUME,
3450c88402SJoao Martins     XS_SET_TARGET,
3550c88402SJoao Martins     /* XS_RESTRICT has been removed */
3650c88402SJoao Martins     XS_RESET_WATCHES = XS_SET_TARGET + 2,
3750c88402SJoao Martins     XS_DIRECTORY_PART,
3850c88402SJoao Martins 
3950c88402SJoao Martins     XS_TYPE_COUNT,      /* Number of valid types. */
4050c88402SJoao Martins 
4150c88402SJoao Martins     XS_INVALID = 0xffff /* Guaranteed to remain an invalid type */
4250c88402SJoao Martins };
4350c88402SJoao Martins 
4450c88402SJoao Martins #define XS_WRITE_NONE "NONE"
4550c88402SJoao Martins #define XS_WRITE_CREATE "CREATE"
4650c88402SJoao Martins #define XS_WRITE_CREATE_EXCL "CREATE|EXCL"
4750c88402SJoao Martins 
4850c88402SJoao Martins /* We hand errors as strings, for portability. */
4950c88402SJoao Martins struct xsd_errors
5050c88402SJoao Martins {
5150c88402SJoao Martins     int errnum;
5250c88402SJoao Martins     const char *errstring;
5350c88402SJoao Martins };
5450c88402SJoao Martins #ifdef EINVAL
5550c88402SJoao Martins #define XSD_ERROR(x) { x, #x }
5650c88402SJoao Martins /* LINTED: static unused */
578ac98aedSDavid Woodhouse static const struct xsd_errors xsd_errors[]
5850c88402SJoao Martins #if defined(__GNUC__)
5950c88402SJoao Martins __attribute__((unused))
6050c88402SJoao Martins #endif
6150c88402SJoao Martins     = {
628ac98aedSDavid Woodhouse     /* /!\ New errors should be added at the end of the array. */
6350c88402SJoao Martins     XSD_ERROR(EINVAL),
6450c88402SJoao Martins     XSD_ERROR(EACCES),
6550c88402SJoao Martins     XSD_ERROR(EEXIST),
6650c88402SJoao Martins     XSD_ERROR(EISDIR),
6750c88402SJoao Martins     XSD_ERROR(ENOENT),
6850c88402SJoao Martins     XSD_ERROR(ENOMEM),
6950c88402SJoao Martins     XSD_ERROR(ENOSPC),
7050c88402SJoao Martins     XSD_ERROR(EIO),
7150c88402SJoao Martins     XSD_ERROR(ENOTEMPTY),
7250c88402SJoao Martins     XSD_ERROR(ENOSYS),
7350c88402SJoao Martins     XSD_ERROR(EROFS),
7450c88402SJoao Martins     XSD_ERROR(EBUSY),
7550c88402SJoao Martins     XSD_ERROR(EAGAIN),
7650c88402SJoao Martins     XSD_ERROR(EISCONN),
778ac98aedSDavid Woodhouse     XSD_ERROR(E2BIG),
788ac98aedSDavid Woodhouse     XSD_ERROR(EPERM),
7950c88402SJoao Martins };
8050c88402SJoao Martins #endif
8150c88402SJoao Martins 
8250c88402SJoao Martins struct xsd_sockmsg
8350c88402SJoao Martins {
8450c88402SJoao Martins     uint32_t type;  /* XS_??? */
8550c88402SJoao Martins     uint32_t req_id;/* Request identifier, echoed in daemon's response.  */
8650c88402SJoao Martins     uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */
8750c88402SJoao Martins     uint32_t len;   /* Length of data following this. */
8850c88402SJoao Martins 
8950c88402SJoao Martins     /* Generally followed by nul-terminated string(s). */
9050c88402SJoao Martins };
9150c88402SJoao Martins 
9250c88402SJoao Martins enum xs_watch_type
9350c88402SJoao Martins {
9450c88402SJoao Martins     XS_WATCH_PATH = 0,
9550c88402SJoao Martins     XS_WATCH_TOKEN
9650c88402SJoao Martins };
9750c88402SJoao Martins 
9850c88402SJoao Martins /*
9950c88402SJoao Martins  * `incontents 150 xenstore_struct XenStore wire protocol.
10050c88402SJoao Martins  *
10150c88402SJoao Martins  * Inter-domain shared memory communications. */
10250c88402SJoao Martins #define XENSTORE_RING_SIZE 1024
10350c88402SJoao Martins typedef uint32_t XENSTORE_RING_IDX;
10450c88402SJoao Martins #define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1))
10550c88402SJoao Martins struct xenstore_domain_interface {
10650c88402SJoao Martins     char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */
10750c88402SJoao Martins     char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */
10850c88402SJoao Martins     XENSTORE_RING_IDX req_cons, req_prod;
10950c88402SJoao Martins     XENSTORE_RING_IDX rsp_cons, rsp_prod;
11050c88402SJoao Martins     uint32_t server_features; /* Bitmap of features supported by the server */
11150c88402SJoao Martins     uint32_t connection;
1128ac98aedSDavid Woodhouse     uint32_t error;
11350c88402SJoao Martins };
11450c88402SJoao Martins 
11550c88402SJoao Martins /* Violating this is very bad.  See docs/misc/xenstore.txt. */
11650c88402SJoao Martins #define XENSTORE_PAYLOAD_MAX 4096
11750c88402SJoao Martins 
11850c88402SJoao Martins /* Violating these just gets you an error back */
11950c88402SJoao Martins #define XENSTORE_ABS_PATH_MAX 3072
12050c88402SJoao Martins #define XENSTORE_REL_PATH_MAX 2048
12150c88402SJoao Martins 
12250c88402SJoao Martins /* The ability to reconnect a ring */
12350c88402SJoao Martins #define XENSTORE_SERVER_FEATURE_RECONNECTION 1
1248ac98aedSDavid Woodhouse /* The presence of the "error" field in the ring page */
1258ac98aedSDavid Woodhouse #define XENSTORE_SERVER_FEATURE_ERROR        2
12650c88402SJoao Martins 
12750c88402SJoao Martins /* Valid values for the connection field */
12850c88402SJoao Martins #define XENSTORE_CONNECTED 0 /* the steady-state */
1298ac98aedSDavid Woodhouse #define XENSTORE_RECONNECT 1 /* reconnect in progress */
1308ac98aedSDavid Woodhouse 
1318ac98aedSDavid Woodhouse /* Valid values for the error field */
1328ac98aedSDavid Woodhouse #define XENSTORE_ERROR_NONE    0 /* No error */
1338ac98aedSDavid Woodhouse #define XENSTORE_ERROR_COMM    1 /* Communication problem */
1348ac98aedSDavid Woodhouse #define XENSTORE_ERROR_RINGIDX 2 /* Invalid ring index */
1358ac98aedSDavid Woodhouse #define XENSTORE_ERROR_PROTO   3 /* Protocol violation (payload too long) */
13650c88402SJoao Martins 
13750c88402SJoao Martins #endif /* _XS_WIRE_H */
13850c88402SJoao Martins 
13950c88402SJoao Martins /*
14050c88402SJoao Martins  * Local variables:
14150c88402SJoao Martins  * mode: C
14250c88402SJoao Martins  * c-file-style: "BSD"
14350c88402SJoao Martins  * c-basic-offset: 4
14450c88402SJoao Martins  * tab-width: 4
14550c88402SJoao Martins  * indent-tabs-mode: nil
14650c88402SJoao Martins  * End:
14750c88402SJoao Martins  */
148