~funderscore blog cgit wiki get in touch
aboutsummaryrefslogtreecommitdiff
blob: f20d9c5122670e727d5b17aa6cdfbe3a36b41925 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* SPDX-License-Identifier: MIT
 *
 * Details of the "wire" protocol between Xen Store Daemon and client
 * library or guest kernel.
 *
 * Copyright (C) 2005 Rusty Russell IBM Corporation
 */

#ifndef _XS_WIRE_H
#define _XS_WIRE_H

enum xsd_sockmsg_type {
	XS_CONTROL,
#define XS_DEBUG XS_CONTROL
	XS_DIRECTORY,
	XS_READ,
	XS_GET_PERMS,
	XS_WATCH,
	XS_UNWATCH,
	XS_TRANSACTION_START,
	XS_TRANSACTION_END,
	XS_INTRODUCE,
	XS_RELEASE,
	XS_GET_DOMAIN_PATH,
	XS_WRITE,
	XS_MKDIR,
	XS_RM,
	XS_SET_PERMS,
	XS_WATCH_EVENT,
	XS_ERROR,
	XS_IS_DOMAIN_INTRODUCED,
	XS_RESUME,
	XS_SET_TARGET,
	/* XS_RESTRICT has been removed */
	XS_RESET_WATCHES = XS_SET_TARGET + 2,
	XS_DIRECTORY_PART,

	XS_TYPE_COUNT,      /* Number of valid types. */

	XS_INVALID = 0xffff /* Guaranteed to remain an invalid type */
};

#define XS_WRITE_NONE "NONE"
#define XS_WRITE_CREATE "CREATE"
#define XS_WRITE_CREATE_EXCL "CREATE|EXCL"

/* We hand errors as strings, for portability. */
struct xsd_errors {
	int errnum;
	const char *errstring;
};

#ifdef EINVAL
#define XSD_ERROR(x) { x, #x }
/* LINTED: static unused */
static struct xsd_errors xsd_errors[]
#if defined(__GNUC__)
__attribute__((unused))
#endif
	= {
	XSD_ERROR(EINVAL),
	XSD_ERROR(EACCES),
	XSD_ERROR(EEXIST),
	XSD_ERROR(EISDIR),
	XSD_ERROR(ENOENT),
	XSD_ERROR(ENOMEM),
	XSD_ERROR(ENOSPC),
	XSD_ERROR(EIO),
	XSD_ERROR(ENOTEMPTY),
	XSD_ERROR(ENOSYS),
	XSD_ERROR(EROFS),
	XSD_ERROR(EBUSY),
	XSD_ERROR(EAGAIN),
	XSD_ERROR(EISCONN),
	XSD_ERROR(E2BIG)
};
#endif

struct xsd_sockmsg {
	u32 type;  /* XS_??? */
	u32 req_id;/* Request identifier, echoed in daemon's response.  */
	u32 tx_id; /* Transaction id (0 if not related to a transaction). */
	u32 len;   /* Length of data following this. */

	/* Generally followed by nul-terminated string(s). */
};

enum xs_watch_type {
	XS_WATCH_PATH = 0,
	XS_WATCH_TOKEN
};

/*
 * `incontents 150 xenstore_struct XenStore wire protocol.
 *
 * Inter-domain shared memory communications.
 */
#define XENSTORE_RING_SIZE 1024
typedef u32 XENSTORE_RING_IDX;
#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE - 1))
struct xenstore_domain_interface {
	char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */
	char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */
	XENSTORE_RING_IDX req_cons, req_prod;
	XENSTORE_RING_IDX rsp_cons, rsp_prod;
	u32 server_features; /* Bitmap of features supported by the server */
	u32 connection;
};

/* Violating this is very bad.  See docs/misc/xenstore.txt. */
#define XENSTORE_PAYLOAD_MAX 4096

/* Violating these just gets you an error back */
#define XENSTORE_ABS_PATH_MAX 3072
#define XENSTORE_REL_PATH_MAX 2048

/* The ability to reconnect a ring */
#define XENSTORE_SERVER_FEATURE_RECONNECTION 1

/* Valid values for the connection field */
#define XENSTORE_CONNECTED 0 /* the steady-state */
#define XENSTORE_RECONNECT 1 /* guest has initiated a reconnect */

#endif /* _XS_WIRE_H */

/*
 * Local variables:
 * mode: C
 * c-file-style: "BSD"
 * c-basic-offset: 4
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 */