xref: /memcached-1.4.29/protocol_binary.h (revision 0e8a58a8)
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_UNKNOWN_COMMAND = 0x81,
72     PROTOCOL_BINARY_RESPONSE_ENOMEM = 0x82
73   } protocol_binary_response_status;
74 
75   /**
76    * Defintion of the different command opcodes.
77    * See section 3.3 Command Opcodes
78    */
79   typedef enum {
80     PROTOCOL_BINARY_CMD_GET = 0x00,
81     PROTOCOL_BINARY_CMD_SET = 0x01,
82     PROTOCOL_BINARY_CMD_ADD = 0x02,
83     PROTOCOL_BINARY_CMD_REPLACE = 0x03,
84     PROTOCOL_BINARY_CMD_DELETE = 0x04,
85     PROTOCOL_BINARY_CMD_INCREMENT = 0x05,
86     PROTOCOL_BINARY_CMD_DECREMENT = 0x06,
87     PROTOCOL_BINARY_CMD_QUIT = 0x07,
88     PROTOCOL_BINARY_CMD_FLUSH = 0x08,
89     PROTOCOL_BINARY_CMD_GETQ = 0x09,
90     PROTOCOL_BINARY_CMD_NOOP = 0x0a,
91     PROTOCOL_BINARY_CMD_VERSION = 0x0b,
92     PROTOCOL_BINARY_CMD_GETK = 0x0c,
93     PROTOCOL_BINARY_CMD_GETKQ = 0x0d,
94     PROTOCOL_BINARY_CMD_APPEND = 0x0e,
95     PROTOCOL_BINARY_CMD_PREPEND = 0x0f,
96     PROTOCOL_BINARY_CMD_STAT = 0x10,
97     PROTOCOL_BINARY_CMD_SETQ = 0x11,
98     PROTOCOL_BINARY_CMD_ADDQ = 0x12,
99     PROTOCOL_BINARY_CMD_REPLACEQ = 0x13,
100     PROTOCOL_BINARY_CMD_DELETEQ = 0x14,
101     PROTOCOL_BINARY_CMD_INCREMENTQ = 0x15,
102     PROTOCOL_BINARY_CMD_DECREMENTQ = 0x16,
103     PROTOCOL_BINARY_CMD_QUITQ = 0x17,
104     PROTOCOL_BINARY_CMD_FLUSHQ = 0x18,
105     PROTOCOL_BINARY_CMD_APPENDQ = 0x19,
106     PROTOCOL_BINARY_CMD_PREPENDQ = 0x1a
107   } protocol_binary_command;
108 
109   /**
110    * Definition of the data types in the packet
111    * See section 3.4 Data Types
112    */
113   typedef enum {
114     PROTOCOL_BINARY_RAW_BYTES = 0x00
115   } protocol_binary_datatypes;
116 
117   /**
118    * Definition of the header structure for a request packet.
119    * See section 2
120    */
121   typedef union {
122     struct {
123       uint8_t magic;
124       uint8_t opcode;
125       uint16_t keylen;
126       uint8_t extlen;
127       uint8_t datatype;
128       uint16_t reserved;
129       uint32_t bodylen;
130       uint32_t opaque;
131       uint64_t cas;
132     } request;
133     uint8_t bytes[24];
134   } protocol_binary_request_header;
135 
136   /**
137    * Definition of the header structure for a response packet.
138    * See section 2
139    */
140   typedef union {
141     struct {
142       uint8_t magic;
143       uint8_t opcode;
144       uint16_t keylen;
145       uint8_t extlen;
146       uint8_t datatype;
147       uint16_t status;
148       uint32_t bodylen;
149       uint32_t opaque;
150       uint64_t cas;
151     } response;
152     uint8_t bytes[24];
153   } protocol_binary_response_header;
154 
155   /**
156    * Definition of a request-packet containing no extras
157    */
158   typedef union {
159     struct {
160       protocol_binary_request_header header;
161     } message;
162     uint8_t bytes[sizeof(protocol_binary_request_header)];
163   } protocol_binary_request_no_extras;
164 
165   /**
166    * Definition of a response-packet containing no extras
167    */
168   typedef union {
169     struct {
170       protocol_binary_response_header header;
171     } message;
172     uint8_t bytes[sizeof(protocol_binary_response_header)];
173   } protocol_binary_response_no_extras;
174 
175   /**
176    * Definition of the packet used by the get, getq, getk and getkq command.
177    * See section 4
178    */
179   typedef protocol_binary_request_no_extras protocol_binary_request_get;
180   typedef protocol_binary_request_no_extras protocol_binary_request_getq;
181   typedef protocol_binary_request_no_extras protocol_binary_request_getk;
182   typedef protocol_binary_request_no_extras protocol_binary_request_getkq;
183 
184   /**
185    * Definition of the packet returned from a successful get, getq, getk and
186    * getkq.
187    * See section 4
188    */
189   typedef union {
190     struct {
191       protocol_binary_response_header header;
192       struct {
193         uint32_t flags;
194       } body;
195     } message;
196     uint8_t bytes[sizeof(protocol_binary_response_header) + 4];
197   } protocol_binary_response_get;
198 
199   typedef protocol_binary_response_get protocol_binary_response_getq;
200   typedef protocol_binary_response_get protocol_binary_response_getk;
201   typedef protocol_binary_response_get protocol_binary_response_getkq;
202 
203   /**
204    * Definition of the packet used by the delete command
205    * See section 4
206    */
207   typedef protocol_binary_request_no_extras protocol_binary_request_delete;
208 
209   /**
210    * Definition of the packet returned by the delete command
211    * See section 4
212    */
213   typedef protocol_binary_response_no_extras protocol_binary_response_delete;
214 
215   /**
216    * Definition of the packet used by the flush command
217    * See section 4
218    * Please note that the expiration field is optional, so remember to see
219    * check the header.bodysize to see if it is present.
220    */
221   typedef union {
222     struct {
223       protocol_binary_request_header header;
224       struct {
225         uint32_t expiration;
226       } body;
227     } message;
228     uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
229   } protocol_binary_request_flush;
230 
231   /**
232    * Definition of the packet returned by the flush command
233    * See section 4
234    */
235   typedef protocol_binary_response_no_extras protocol_binary_response_flush;
236 
237   /**
238    * Definition of the packet used by set, add and replace
239    * See section 4
240    */
241   typedef union {
242     struct {
243       protocol_binary_request_header header;
244       struct {
245         uint32_t flags;
246         uint32_t expiration;
247       } body;
248     } message;
249     uint8_t bytes[sizeof(protocol_binary_request_header) + 8];
250   } protocol_binary_request_set;
251   typedef protocol_binary_request_set protocol_binary_request_add;
252   typedef protocol_binary_request_set protocol_binary_request_replace;
253 
254   /**
255    * Definition of the packet returned by set, add and replace
256    * See section 4
257    */
258   typedef protocol_binary_response_no_extras protocol_binary_response_set;
259   typedef protocol_binary_response_no_extras protocol_binary_response_add;
260   typedef protocol_binary_response_no_extras protocol_binary_response_replace;
261 
262   /**
263    * Definition of the noop packet
264    * See section 4
265    */
266   typedef protocol_binary_request_no_extras protocol_binary_request_noop;
267 
268   /**
269    * Definition of the packet returned by the noop command
270    * See section 4
271    */
272   typedef protocol_binary_response_no_extras protocol_binary_response_noop;
273 
274   /**
275    * Definition of the structure used by the increment and decrement
276    * command.
277    * See section 4
278    */
279   typedef union {
280     struct {
281       protocol_binary_request_header header;
282       struct {
283         uint64_t delta;
284         uint64_t initial;
285         uint32_t expiration;
286       } body;
287     } message;
288     uint8_t bytes[sizeof(protocol_binary_request_header) + 20];
289   } protocol_binary_request_incr;
290   typedef protocol_binary_request_incr protocol_binary_request_decr;
291 
292   /**
293    * Definition of the response from an incr or decr command
294    * command.
295    * See section 4
296    */
297   typedef union {
298     struct {
299       protocol_binary_response_header header;
300       struct {
301         uint64_t value;
302       } body;
303     } message;
304     uint8_t bytes[sizeof(protocol_binary_response_header) + 8];
305   } protocol_binary_response_incr;
306   typedef protocol_binary_response_incr protocol_binary_response_decr;
307 
308   /**
309    * Definition of the quit
310    * See section 4
311    */
312   typedef protocol_binary_request_no_extras protocol_binary_request_quit;
313 
314   /**
315    * Definition of the packet returned by the quit command
316    * See section 4
317    */
318   typedef protocol_binary_response_no_extras protocol_binary_response_quit;
319 
320   /**
321    * Definition of the packet used by append and prepend command
322    * See section 4
323    */
324   typedef protocol_binary_request_no_extras protocol_binary_request_append;
325   typedef protocol_binary_request_no_extras protocol_binary_request_prepend;
326 
327   /**
328    * Definition of the packet returned from a successful append or prepend
329    * See section 4
330    */
331   typedef protocol_binary_response_no_extras protocol_binary_response_append;
332   typedef protocol_binary_response_no_extras protocol_binary_response_prepend;
333 
334   /**
335    * Definition of the packet used by the version command
336    * See section 4
337    */
338   typedef protocol_binary_request_no_extras protocol_binary_request_version;
339 
340   /**
341    * Definition of the packet returned from a successful version command
342    * See section 4
343    */
344   typedef protocol_binary_response_no_extras protocol_binary_response_version;
345 
346 
347   /**
348    * Definition of the packet used by the stats command.
349    * See section 4
350    */
351   typedef protocol_binary_request_no_extras protocol_binary_request_stats;
352 
353   /**
354    * Definition of the packet returned from a successful stats command
355    * See section 4
356    */
357   typedef protocol_binary_response_no_extras protocol_binary_response_stats;
358 #ifdef __cplusplus
359 }
360 #endif
361 #endif /* PROTOCOL_BINARY_H */
362