xref: /memcached-1.4.29/protocol_binary.h (revision cce46e8f)
1 /*
2  * Copyright (c) <2008>, Sun Microsystems, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the  nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY SUN MICROSYSTEMS, INC. ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 /*
28  * Summary: Constants used by to implement the binary protocol.
29  *
30  * Copy: See Copyright for the status of this software.
31  *
32  * Author: Trond Norbye <[email protected]>
33  */
34 
35 #ifndef PROTOCOL_BINARY_H
36 #define PROTOCOL_BINARY_H
37 
38 #include <stdint.h>
39 
40 /**
41  * This file contains definitions of the constants and packet formats
42  * defined in the binary specification. Please note that you _MUST_ remember
43  * to convert each multibyte field to / from network byte order to / from
44  * host order.
45  */
46 #ifdef __cplusplus
47 extern "C"
48 {
49 #endif
50 
51   /**
52    * Definition of the legal "magic" values used in a packet.
53    * See section 3.1 Magic byte
54    */
55   typedef enum {
56     PROTOCOL_BINARY_REQ = 0x80,
57     PROTOCOL_BINARY_RES = 0x81
58   } protocol_binary_magic;
59 
60   /**
61    * Definition of the valid response status numbers.
62    * See section 3.2 Response Status
63    */
64   typedef enum {
65     PROTOCOL_BINARY_RESPONSE_SUCCESS = 0x00,
66     PROTOCOL_BINARY_RESPONSE_KEY_ENOENT = 0x01,
67     PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS = 0x02,
68     PROTOCOL_BINARY_RESPONSE_E2BIG = 0x03,
69     PROTOCOL_BINARY_RESPONSE_EINVAL = 0x04,
70     PROTOCOL_BINARY_RESPONSE_NOT_STORED = 0x05,
71     PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL = 0x06,
72     PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND = 0x81,
73     PROTOCOL_BINARY_RESPONSE_ENOMEM = 0x82
74   } protocol_binary_response_status;
75 
76   /**
77    * Defintion of the different command opcodes.
78    * See section 3.3 Command Opcodes
79    */
80   typedef enum {
81     PROTOCOL_BINARY_CMD_GET = 0x00,
82     PROTOCOL_BINARY_CMD_SET = 0x01,
83     PROTOCOL_BINARY_CMD_ADD = 0x02,
84     PROTOCOL_BINARY_CMD_REPLACE = 0x03,
85     PROTOCOL_BINARY_CMD_DELETE = 0x04,
86     PROTOCOL_BINARY_CMD_INCREMENT = 0x05,
87     PROTOCOL_BINARY_CMD_DECREMENT = 0x06,
88     PROTOCOL_BINARY_CMD_QUIT = 0x07,
89     PROTOCOL_BINARY_CMD_FLUSH = 0x08,
90     PROTOCOL_BINARY_CMD_GETQ = 0x09,
91     PROTOCOL_BINARY_CMD_NOOP = 0x0a,
92     PROTOCOL_BINARY_CMD_VERSION = 0x0b,
93     PROTOCOL_BINARY_CMD_GETK = 0x0c,
94     PROTOCOL_BINARY_CMD_GETKQ = 0x0d,
95     PROTOCOL_BINARY_CMD_APPEND = 0x0e,
96     PROTOCOL_BINARY_CMD_PREPEND = 0x0f,
97     PROTOCOL_BINARY_CMD_STAT = 0x10,
98     PROTOCOL_BINARY_CMD_SETQ = 0x11,
99     PROTOCOL_BINARY_CMD_ADDQ = 0x12,
100     PROTOCOL_BINARY_CMD_REPLACEQ = 0x13,
101     PROTOCOL_BINARY_CMD_DELETEQ = 0x14,
102     PROTOCOL_BINARY_CMD_INCREMENTQ = 0x15,
103     PROTOCOL_BINARY_CMD_DECREMENTQ = 0x16,
104     PROTOCOL_BINARY_CMD_QUITQ = 0x17,
105     PROTOCOL_BINARY_CMD_FLUSHQ = 0x18,
106     PROTOCOL_BINARY_CMD_APPENDQ = 0x19,
107     PROTOCOL_BINARY_CMD_PREPENDQ = 0x1a
108   } protocol_binary_command;
109 
110   /**
111    * Definition of the data types in the packet
112    * See section 3.4 Data Types
113    */
114   typedef enum {
115     PROTOCOL_BINARY_RAW_BYTES = 0x00
116   } protocol_binary_datatypes;
117 
118   /**
119    * Definition of the header structure for a request packet.
120    * See section 2
121    */
122   typedef union {
123     struct {
124       uint8_t magic;
125       uint8_t opcode;
126       uint16_t keylen;
127       uint8_t extlen;
128       uint8_t datatype;
129       uint16_t reserved;
130       uint32_t bodylen;
131       uint32_t opaque;
132       uint64_t cas;
133     } request;
134     uint8_t bytes[24];
135   } protocol_binary_request_header;
136 
137   /**
138    * Definition of the header structure for a response packet.
139    * See section 2
140    */
141   typedef union {
142     struct {
143       uint8_t magic;
144       uint8_t opcode;
145       uint16_t keylen;
146       uint8_t extlen;
147       uint8_t datatype;
148       uint16_t status;
149       uint32_t bodylen;
150       uint32_t opaque;
151       uint64_t cas;
152     } response;
153     uint8_t bytes[24];
154   } protocol_binary_response_header;
155 
156   /**
157    * Definition of a request-packet containing no extras
158    */
159   typedef union {
160     struct {
161       protocol_binary_request_header header;
162     } message;
163     uint8_t bytes[sizeof(protocol_binary_request_header)];
164   } protocol_binary_request_no_extras;
165 
166   /**
167    * Definition of a response-packet containing no extras
168    */
169   typedef union {
170     struct {
171       protocol_binary_response_header header;
172     } message;
173     uint8_t bytes[sizeof(protocol_binary_response_header)];
174   } protocol_binary_response_no_extras;
175 
176   /**
177    * Definition of the packet used by the get, getq, getk and getkq command.
178    * See section 4
179    */
180   typedef protocol_binary_request_no_extras protocol_binary_request_get;
181   typedef protocol_binary_request_no_extras protocol_binary_request_getq;
182   typedef protocol_binary_request_no_extras protocol_binary_request_getk;
183   typedef protocol_binary_request_no_extras protocol_binary_request_getkq;
184 
185   /**
186    * Definition of the packet returned from a successful get, getq, getk and
187    * getkq.
188    * See section 4
189    */
190   typedef union {
191     struct {
192       protocol_binary_response_header header;
193       struct {
194         uint32_t flags;
195       } body;
196     } message;
197     uint8_t bytes[sizeof(protocol_binary_response_header) + 4];
198   } protocol_binary_response_get;
199 
200   typedef protocol_binary_response_get protocol_binary_response_getq;
201   typedef protocol_binary_response_get protocol_binary_response_getk;
202   typedef protocol_binary_response_get protocol_binary_response_getkq;
203 
204   /**
205    * Definition of the packet used by the delete command
206    * See section 4
207    */
208   typedef protocol_binary_request_no_extras protocol_binary_request_delete;
209 
210   /**
211    * Definition of the packet returned by the delete command
212    * See section 4
213    */
214   typedef protocol_binary_response_no_extras protocol_binary_response_delete;
215 
216   /**
217    * Definition of the packet used by the flush command
218    * See section 4
219    * Please note that the expiration field is optional, so remember to see
220    * check the header.bodysize to see if it is present.
221    */
222   typedef union {
223     struct {
224       protocol_binary_request_header header;
225       struct {
226         uint32_t expiration;
227       } body;
228     } message;
229     uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
230   } protocol_binary_request_flush;
231 
232   /**
233    * Definition of the packet returned by the flush command
234    * See section 4
235    */
236   typedef protocol_binary_response_no_extras protocol_binary_response_flush;
237 
238   /**
239    * Definition of the packet used by set, add and replace
240    * See section 4
241    */
242   typedef union {
243     struct {
244       protocol_binary_request_header header;
245       struct {
246         uint32_t flags;
247         uint32_t expiration;
248       } body;
249     } message;
250     uint8_t bytes[sizeof(protocol_binary_request_header) + 8];
251   } protocol_binary_request_set;
252   typedef protocol_binary_request_set protocol_binary_request_add;
253   typedef protocol_binary_request_set protocol_binary_request_replace;
254 
255   /**
256    * Definition of the packet returned by set, add and replace
257    * See section 4
258    */
259   typedef protocol_binary_response_no_extras protocol_binary_response_set;
260   typedef protocol_binary_response_no_extras protocol_binary_response_add;
261   typedef protocol_binary_response_no_extras protocol_binary_response_replace;
262 
263   /**
264    * Definition of the noop packet
265    * See section 4
266    */
267   typedef protocol_binary_request_no_extras protocol_binary_request_noop;
268 
269   /**
270    * Definition of the packet returned by the noop command
271    * See section 4
272    */
273   typedef protocol_binary_response_no_extras protocol_binary_response_noop;
274 
275   /**
276    * Definition of the structure used by the increment and decrement
277    * command.
278    * See section 4
279    */
280   typedef union {
281     struct {
282       protocol_binary_request_header header;
283       struct {
284         uint64_t delta;
285         uint64_t initial;
286         uint32_t expiration;
287       } body;
288     } message;
289     uint8_t bytes[sizeof(protocol_binary_request_header) + 20];
290   } protocol_binary_request_incr;
291   typedef protocol_binary_request_incr protocol_binary_request_decr;
292 
293   /**
294    * Definition of the response from an incr or decr command
295    * command.
296    * See section 4
297    */
298   typedef union {
299     struct {
300       protocol_binary_response_header header;
301       struct {
302         uint64_t value;
303       } body;
304     } message;
305     uint8_t bytes[sizeof(protocol_binary_response_header) + 8];
306   } protocol_binary_response_incr;
307   typedef protocol_binary_response_incr protocol_binary_response_decr;
308 
309   /**
310    * Definition of the quit
311    * See section 4
312    */
313   typedef protocol_binary_request_no_extras protocol_binary_request_quit;
314 
315   /**
316    * Definition of the packet returned by the quit command
317    * See section 4
318    */
319   typedef protocol_binary_response_no_extras protocol_binary_response_quit;
320 
321   /**
322    * Definition of the packet used by append and prepend command
323    * See section 4
324    */
325   typedef protocol_binary_request_no_extras protocol_binary_request_append;
326   typedef protocol_binary_request_no_extras protocol_binary_request_prepend;
327 
328   /**
329    * Definition of the packet returned from a successful append or prepend
330    * See section 4
331    */
332   typedef protocol_binary_response_no_extras protocol_binary_response_append;
333   typedef protocol_binary_response_no_extras protocol_binary_response_prepend;
334 
335   /**
336    * Definition of the packet used by the version command
337    * See section 4
338    */
339   typedef protocol_binary_request_no_extras protocol_binary_request_version;
340 
341   /**
342    * Definition of the packet returned from a successful version command
343    * See section 4
344    */
345   typedef protocol_binary_response_no_extras protocol_binary_response_version;
346 
347 
348   /**
349    * Definition of the packet used by the stats command.
350    * See section 4
351    */
352   typedef protocol_binary_request_no_extras protocol_binary_request_stats;
353 
354   /**
355    * Definition of the packet returned from a successful stats command
356    * See section 4
357    */
358   typedef protocol_binary_response_no_extras protocol_binary_response_stats;
359 #ifdef __cplusplus
360 }
361 #endif
362 #endif /* PROTOCOL_BINARY_H */
363