1 /*
2    ctdb database library
3 
4    Copyright (C) Andrew Tridgell  2006
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #ifndef _CTDB_PROTOCOL_H
21 #define _CTDB_PROTOCOL_H
22 
23 #include <sys/socket.h>
24 #include "protocol/protocol.h"
25 
26 /* define ctdb port number */
27 #define CTDB_PORT 4379
28 
29 /* we must align packets to ensure ctdb works on all architectures (eg. sparc) */
30 #define CTDB_DS_ALIGNMENT 8
31 
32 /*
33   structure passed to a ctdb call backend function
34 */
35 struct ctdb_call_info {
36 	TDB_DATA key;          /* record key */
37 	struct ctdb_ltdb_header *header;
38 	TDB_DATA record_data;  /* current data in the record */
39 	TDB_DATA *new_data;    /* optionally updated record data */
40 	TDB_DATA *call_data;   /* optionally passed from caller */
41 	TDB_DATA *reply_data;  /* optionally returned by function */
42 	uint32_t status;       /* optional reply status - defaults to zero */
43 };
44 
45 /*
46   ctdb flags
47 */
48 #define CTDB_FLAG_TORTURE      (1<<1)
49 
50 struct ctdb_script_list_old {
51 	uint32_t num_scripts;
52 	struct ctdb_script scripts[1];
53 };
54 
55 /* Mapping from enum to names. */
56 extern const char *ctdb_eventscript_call_names[];
57 
58 /*
59   packet structures
60 */
61 struct ctdb_req_call_old {
62 	struct ctdb_req_header hdr;
63 	uint32_t flags;
64 	uint32_t db_id;
65 	uint32_t callid;
66 	uint32_t hopcount;
67 	uint32_t keylen;
68 	uint32_t calldatalen;
69 	uint8_t data[1]; /* key[] followed by calldata[] */
70 };
71 
72 struct ctdb_reply_call_old {
73 	struct ctdb_req_header hdr;
74 	uint32_t status;
75 	uint32_t datalen;
76 	uint8_t  data[1];
77 };
78 
79 struct ctdb_reply_error_old {
80 	struct ctdb_req_header hdr;
81 	uint32_t status;
82 	uint32_t msglen;
83 	uint8_t  msg[1];
84 };
85 
86 struct ctdb_req_dmaster_old {
87 	struct ctdb_req_header hdr;
88 	uint32_t db_id;
89 	uint64_t rsn;
90 	uint32_t dmaster;
91 	uint32_t keylen;
92 	uint32_t datalen;
93 	uint8_t  data[1];
94 };
95 
96 struct ctdb_reply_dmaster_old {
97 	struct ctdb_req_header hdr;
98 	uint32_t db_id;
99 	uint64_t rsn;
100 	uint32_t keylen;
101 	uint32_t datalen;
102 	uint8_t  data[1];
103 };
104 
105 struct ctdb_req_message_old {
106 	struct ctdb_req_header hdr;
107 	uint64_t srvid;
108 	uint32_t datalen;
109 	uint8_t data[1];
110 };
111 
112 struct ctdb_req_control_old {
113 	struct ctdb_req_header hdr;
114 	uint32_t opcode;
115 	uint32_t pad;
116 	uint64_t srvid;
117 	uint32_t client_id;
118 	uint32_t flags;
119 	uint32_t datalen;
120 	uint8_t data[1];
121 };
122 
123 struct ctdb_reply_control_old {
124 	struct ctdb_req_header hdr;
125 	int32_t  status;
126 	uint32_t datalen;
127 	uint32_t errorlen;
128 	uint8_t data[1];
129 };
130 
131 struct ctdb_req_keepalive_old {
132 	struct ctdb_req_header hdr;
133 	uint32_t version;
134 	uint32_t uptime;
135 };
136 
137 struct ctdb_req_tunnel_old {
138 	struct ctdb_req_header hdr;
139 	uint64_t tunnel_id;
140 	uint32_t flags;
141 	uint32_t datalen;
142 	uint8_t data[1];
143 };
144 
145 /*
146    Structure used for a nodemap.
147    The nodemap is the structure containing a list of all nodes
148    known to the cluster and their associated flags.
149 */
150 struct ctdb_node_map_old {
151 	uint32_t num;
152 	struct ctdb_node_and_flags nodes[1];
153 };
154 
155 struct ctdb_public_ip_list_old {
156 	uint32_t num;
157 	struct ctdb_public_ip ips[1];
158 };
159 
160 /*
161   structure used to pass record data between the child and parent
162  */
163 struct ctdb_rec_data_old {
164 	uint32_t length;
165 	uint32_t reqid;
166 	uint32_t keylen;
167 	uint32_t datalen;
168 	uint8_t  data[1];
169 };
170 
171 /*
172  * wire format for statistics history
173  */
174 struct ctdb_statistics_list_old {
175 	uint32_t num;
176 	struct ctdb_statistics stats[1];
177 };
178 
179 /*
180  * db statistics
181  */
182 struct ctdb_db_statistics_old {
183 	struct {
184 		uint32_t num_calls;
185 		uint32_t num_current;
186 		uint32_t num_pending;
187 		uint32_t num_failed;
188 		struct ctdb_latency_counter latency;
189 		uint32_t buckets[MAX_COUNT_BUCKETS];
190 	} locks;
191 	struct {
192 		struct ctdb_latency_counter latency;
193 	} vacuum;
194 	uint32_t db_ro_delegations;
195 	uint32_t db_ro_revokes;
196 	uint32_t hop_count_bucket[MAX_COUNT_BUCKETS];
197 	uint32_t num_hot_keys;
198 	struct {
199 		uint32_t count;
200 		TDB_DATA key;
201 	} hot_keys[MAX_HOT_KEYS];
202 	char hot_keys_wire[1];
203 };
204 
205 /*
206    a wire representation of the vnn map
207  */
208 struct ctdb_vnn_map_wire {
209 	uint32_t generation;
210 	uint32_t size;
211 	uint32_t map[1];
212 };
213 
214 struct ctdb_notify_data_old {
215 	uint64_t srvid;
216 	uint32_t len;
217 	uint8_t notify_data[1];
218 };
219 
220 /* table that contains a list of all dbids on a node
221  */
222 struct ctdb_dbid_map_old {
223 	uint32_t num;
224 	struct ctdb_dbid dbs[1];
225 };
226 
227 /* the list of tcp tickles used by get/set tcp tickle list */
228 struct ctdb_tickle_list_old {
229 	ctdb_sock_addr addr;
230 	uint32_t num;
231 	struct ctdb_connection connections[1];
232 };
233 
234 /*
235   struct holding a ctdb_sock_addr and an interface name,
236   used to add/remove public addresses and grat arp
237  */
238 struct ctdb_addr_info_old {
239 	ctdb_sock_addr addr;
240 	uint32_t mask;
241 	uint32_t len;
242 	char iface[1];
243 };
244 
245 /* structure used for sending lists of records */
246 struct ctdb_marshall_buffer {
247 	uint32_t db_id;
248 	uint32_t count;
249 	uint8_t data[1];
250 };
251 
252 /*
253   structure for setting a tunable
254  */
255 struct ctdb_tunable_old {
256 	uint32_t value;
257 	uint32_t length;
258 	uint8_t  name[1];
259 };
260 
261 /*
262   structure for getting a tunable
263  */
264 struct ctdb_control_get_tunable {
265 	uint32_t length;
266 	uint8_t  name[1];
267 };
268 
269 /*
270   structure for listing tunables
271  */
272 struct ctdb_control_list_tunable {
273 	uint32_t length;
274 	/* returns a : separated list of tunable names */
275 	uint8_t  data[1];
276 };
277 
278 
279 struct ctdb_public_ip_info_old {
280 	struct ctdb_public_ip ip;
281 	uint32_t active_idx;
282 	uint32_t num;
283 	struct ctdb_iface ifaces[1];
284 };
285 
286 struct ctdb_iface_list_old {
287 	uint32_t num;
288 	struct ctdb_iface ifaces[1];
289 };
290 
291 /**
292  * structure to pass to a schedule_for_deletion_control
293  */
294 struct ctdb_control_schedule_for_deletion {
295 	uint32_t db_id;
296 	struct ctdb_ltdb_header hdr;
297 	uint32_t keylen;
298 	uint8_t key[1]; /* key[] */
299 };
300 
301 #endif
302