Bug Summary

File:epan/dissectors/packet-cql.c
Warning:line 1774, column 7
Value stored to 'offset' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-cql.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-21/lib/clang/21 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-truncation -Wno-format-nonliteral -Wno-pointer-sign -std=gnu11 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /builds/wireshark/wireshark/sbout/2025-10-21-100328-3623-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-cql.c
1/* packet-cql.c
2 * Routines for Apache Cassandra CQL dissection
3 * Copyright 2015, Aaron Ten Clay <[email protected]>
4 *
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <[email protected]>
7 * Copyright 1998 Gerald Combs
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12/*
13 * CQL V3 reference: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v3.spec
14 * CQL V4 reference: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v4.spec
15 * CQL V5 reference: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v5.spec
16 */
17#include "config.h"
18#include <epan/conversation.h>
19#include <epan/packet.h>
20#include "packet-tcp.h"
21#include <epan/wmem_scopes.h>
22#include <epan/expert.h>
23#include <epan/to_str.h>
24#include <epan/addr_resolv.h>
25#ifdef HAVE_LZ41
26#include <lz4.h>
27#endif
28#ifdef HAVE_SNAPPY1
29#include <snappy-c.h>
30#endif
31
32#define CQL_DEFAULT_PORT9042 9042 /* Not IANA registered */
33
34/* the code can reasonably attempt to decompress buffer up to 10MB */
35#define MAX_UNCOMPRESSED_SIZE(10 * 1024 * 1024) (10 * 1024 * 1024)
36
37void proto_reg_handoff_cql(void);
38void proto_register_cql(void);
39
40static int proto_cql;
41/* CQL header frame fields */
42static int hf_cql_version;
43static int hf_cql_protocol_version;
44static int hf_cql_direction;
45/* CQL header frame fields */
46static int hf_cql_flags_bitmap;
47static int hf_cql_flag_compression;
48static int hf_cql_flag_tracing;
49static int hf_cql_flag_reserved3;
50static int hf_cql_flag_custom_payload;
51static int hf_cql_flag_warning;
52static int hf_cql_flag_reserved4;
53static int hf_cql_flag_beta;
54static int hf_cql_stream;
55static int hf_cql_opcode;
56static int hf_cql_length;
57static int hf_cql5_header;
58static int hf_cql5_compressed_length;
59static int hf_cql5_uncompressed_length;
60static int hf_cql5_self_contained;
61static int hf_cql5_crc24;
62static int hf_cql5_crc32;
63
64/* CQL data types */
65static int hf_cql_int;
66static int hf_cql_uuid;
67static int hf_cql_bytes;
68
69/* Batch flags */
70static int hf_cql_batch_flag_serial_consistency;
71static int hf_cql_batch_flag_default_timestamp;
72static int hf_cql_batch_flag_with_name_for_values;
73static int hf_cql_batch_flags_bitmap;
74static int ett_cql_batch_flags_bitmap;
75
76static int hf_cql_consistency;
77static int hf_cql_string_length;
78static int hf_cql_string_map_size;
79static int hf_cql_string;
80static int hf_cql_auth_token;
81static int hf_cql_value_count;
82static int hf_cql_short_bytes_length;
83static int hf_cql_bytes_length;
84static int hf_cql_bigint;
85static int hf_cql_scale;
86static int hf_cql_boolean;
87static int hf_cql_ascii;
88static int hf_cql_double;
89static int hf_cql_float;
90static int hf_cql_custom;
91static int hf_cql_null_value;
92static int hf_cql_tracing_uuid;
93static int hf_cql_port;
94static int hf_cql_timeuuid;
95static int hf_cql_varchar;
96static int hf_cql_varint_count8;
97static int hf_cql_varint_count16;
98static int hf_cql_varint_count32;
99static int hf_cql_varint_count64;
100static int hf_cql_raw_compressed_bytes;
101static int hf_cql_paging_state;
102static int hf_cql_page_size;
103static int hf_cql_timestamp;
104static int hf_cql_query_id;
105static int hf_cql_query_metadata_id;
106static int hf_cql_event_type;
107static int hf_cql_event_schema_change_type;
108static int hf_cql_event_schema_change_type_target;
109static int hf_cql_event_schema_change_keyspace;
110static int hf_cql_event_schema_change_object;
111static int hf_cql_result_timestamp;
112static int hf_cql_string_list_size;
113static int hf_cql_batch_type;
114static int hf_cql_batch_query_type;
115static int hf_cql_batch_query_size;
116static int hf_cql_error_code;
117static int hf_cql_result_kind;
118static int hf_cql_result_rows_data_type;
119static int hf_cql_error_failure_received;
120static int hf_cql_error_block_for;
121static int hf_cql_error_num_failures;
122static int hf_cql_error_data_present;
123static int hf_cql_error_write_type;
124
125static int hf_cql_query_flags_values;
126static int hf_cql_query_flags_skip_metadata;
127static int hf_cql_query_flags_page_size;
128static int hf_cql_query_flags_paging_state;
129static int hf_cql_query_flags_serial_consistency;
130static int hf_cql_query_flags_default_timestamp;
131static int hf_cql_query_flags_names_for_values;
132
133static int hf_cql_query_v5_flags_values;
134static int hf_cql_query_v5_flags_skip_metadata;
135static int hf_cql_query_v5_flags_page_size;
136static int hf_cql_query_v5_flags_paging_state;
137static int hf_cql_query_v5_flags_serial_consistency;
138static int hf_cql_query_v5_flags_default_timestamp;
139static int hf_cql_query_v5_flags_names_for_values;
140static int hf_cql_query_v5_flags_with_keyspace;
141static int hf_cql_query_v5_flags_now_in_seconds;
142
143static int hf_cql_result_rows_flags_values;
144static int hf_cql_result_prepared_flags_values;
145static int hf_cql_result_rows_flag_global_tables_spec;
146static int hf_cql_result_rows_flag_has_more_pages;
147static int hf_cql_result_rows_flag_no_metadata;
148static int hf_cql_result_rows_column_count;
149static int hf_cql_result_rows_tuple_size;
150
151static int hf_cql_result_prepared_pk_count;
152
153static int hf_cql_string_result_rows_global_table_spec_ksname;
154static int hf_cql_string_result_rows_global_table_spec_table_name;
155static int hf_cql_string_result_rows_table_name;
156static int hf_cql_string_result_rows_keyspace_name;
157static int hf_cql_string_result_rows_column_name;
158static int hf_cql_result_rows_row_count;
159static int hf_cql_string_result_rows_udt_name;
160static int hf_cql_string_result_rows_udt_size;
161static int hf_cql_string_result_rows_udt_field_name;
162static int hf_cql_string_result_rows_list_size;
163static int hf_cql_string_result_rows_map_size;
164static int hf_cql_string_result_rows_set_size;
165static int hf_cql_bytesmap_string;
166
167static int ett_cql_protocol;
168static int ett_cql_version;
169static int ett_cql_message;
170static int ett_cql_result_columns;
171static int ett_cql_results_no_metadata;
172static int ett_cql_result_map;
173static int ett_cql_result_set;
174static int ett_cql_result_metadata;
175static int ett_cql_result_rows;
176static int ett_cql_result_metadata_colspec;
177static int ett_cql_header_flags_bitmap;
178static int ett_cql_custom_payload;
179
180static int hf_cql_response_in;
181static int hf_cql_response_to;
182static int hf_cql_response_time;
183
184static int hf_cql_ipv4;
185static int hf_cql_ipv6;
186
187static int ett_cql5_header;
188
189/* desegmentation of CQL */
190static bool_Bool cql_desegment = true1;
191
192static expert_field ei_cql_data_not_dissected_yet;
193static expert_field ei_cql_unexpected_negative_value;
194
195
196typedef struct _cql_transaction_type {
197 uint32_t req_frame;
198 uint32_t rep_frame;
199 nstime_t req_time;
200} cql_transaction_type;
201
202typedef enum {
203 CQL_COMPRESSION_NONE = 0,
204 CQL_COMPRESSION_LZ4 = 1,
205 CQL_COMPRESSION_SNAPPY = 2,
206 CQL_DECOMPRESSION_ATTEMPTED = 3,
207} cql_compression_level;
208
209typedef struct _cql_conversation_info_type {
210 wmem_map_t* streams;
211 uint32_t frame_start_v5_proto;
212 cql_compression_level compression_level;
213 uint16_t server_port;
214 uint8_t protocol_version;
215} cql_conversation_type;
216
217static const value_string cql_direction_names[] = {
218 { 0x0, "Request" },
219 { 0x8, "Response" },
220 { 0x0, NULL((void*)0) }
221};
222
223typedef enum {
224 CQL_BATCH_FLAG_SERIAL_CONSISTENCY = 0x10,
225 CQL_BATCH_FLAG_DEFAULT_TIMESTAMP = 0x20,
226 CQL_BATCH_FLAG_WITH_NAME_FOR_VALUES = 0x40
227} cql_batch_flags;
228
229typedef enum {
230 CQL_OPCODE_ERROR = 0x00,
231 CQL_OPCODE_STARTUP = 0x01,
232 CQL_OPCODE_READY = 0x02,
233 CQL_OPCODE_AUTHENTICATE = 0x03,
234 /* Opcode 0x04 not used in CQL */
235 CQL_OPCODE_OPTIONS = 0x05,
236 CQL_OPCODE_SUPPORTED = 0x06,
237 CQL_OPCODE_QUERY = 0x07,
238 CQL_OPCODE_RESULT = 0x08,
239 CQL_OPCODE_PREPARE = 0x09,
240 CQL_OPCODE_EXECUTE = 0x0A,
241 CQL_OPCODE_REGISTER = 0x0B,
242 CQL_OPCODE_EVENT = 0x0C,
243 CQL_OPCODE_BATCH = 0x0D,
244 CQL_OPCODE_AUTH_CHALLENGE = 0x0E,
245 CQL_OPCODE_AUTH_RESPONSE = 0x0F,
246 CQL_OPCODE_AUTH_SUCCESS = 0x10
247} cql_opcode_type;
248
249static const value_string cql_opcode_names[] = {
250 { CQL_OPCODE_ERROR, "ERROR" },
251 { CQL_OPCODE_STARTUP, "STARTUP" },
252 { CQL_OPCODE_READY, "READY" },
253 { CQL_OPCODE_AUTHENTICATE, "AUTHENTICATE" },
254 { CQL_OPCODE_OPTIONS, "OPTIONS" },
255 { CQL_OPCODE_SUPPORTED, "SUPPORTED" },
256 { CQL_OPCODE_QUERY, "QUERY" },
257 { CQL_OPCODE_RESULT, "RESULT" },
258 { CQL_OPCODE_PREPARE, "PREPARE" },
259 { CQL_OPCODE_EXECUTE, "EXECUTE" },
260 { CQL_OPCODE_REGISTER, "REGISTER" },
261 { CQL_OPCODE_EVENT, "EVENT" },
262 { CQL_OPCODE_BATCH, "BATCH" },
263 { CQL_OPCODE_AUTH_CHALLENGE, "AUTH_CHALLENGE" },
264 { CQL_OPCODE_AUTH_RESPONSE, "AUTH_RESPONSE" },
265 { CQL_OPCODE_AUTH_SUCCESS, "AUTH_SUCCESS" },
266 { 0x00, NULL((void*)0) }
267};
268
269
270typedef enum {
271 CQL_HEADER_FLAG_COMPRESSION = 0x01,
272 CQL_HEADER_FLAG_TRACING = 0x02,
273 CQL_HEADER_FLAG_V3_RESERVED = 0xFC,
274 CQL_HEADER_FLAG_CUSTOM_PAYLOAD = 0x04,
275 CQL_HEADER_FLAG_WARNING = 0x08,
276 CQL_HEADER_FLAG_BETA = 0x10,
277 CQL_HEADER_FLAG_V4_RESERVED = 0xF0
278} cql_flags;
279
280typedef enum {
281 CQL_QUERY_FLAG_VALUES = 0x01,
282 CQL_QUERY_FLAG_SKIP_METADATA = 0x02,
283 CQL_QUERY_FLAG_PAGE_SIZE = 0x04,
284 CQL_QUERY_FLAG_PAGING_STATE = 0x08,
285 CQL_QUERY_FLAG_SERIAL_CONSISTENCY = 0x10,
286 CQL_QUERY_FLAG_DEFAULT_TIMESTAMP = 0x20,
287 CQL_QUERY_FLAG_VALUE_NAMES = 0x40,
288 CQL_QUERY_FLAG_WITH_KEYSPACE = 0x80,
289 CQL_QUERY_FLAG_NOW_IN_SECONDS = 0x100
290} cql_query_flags;
291
292
293typedef enum {
294 CQL_RESULT_ROWS_FLAG_GLOBAL_TABLES_SPEC = 0x00000001,
295 CQL_RESULT_ROWS_FLAG_HAS_MORE_PAGES = 0x00000002,
296 CQL_RESULT_ROWS_FLAG_NO_METADATA = 0x00000004
297} cql_result_rows_flags;
298
299typedef enum {
300 CQL_CONSISTENCY_ANY = 0x0000,
301 CQL_CONSISTENCY_ONE = 0x0001,
302 CQL_CONSISTENCY_TWO = 0x0002,
303 CQL_CONSISTENCY_THREE = 0x003,
304 CQL_CONSISTENCY_QUORUM = 0x0004,
305 CQL_CONSISTENCY_ALL = 0x0005,
306 CQL_CONSISTENCY_LOCAL_QUORUM = 0x0006,
307 CQL_CONSISTENCY_EACH_QUORUM = 0x0007,
308 CQL_CONSISTENCY_SERIAL = 0x0008,
309 CQL_CONSISTENCY_LOCAL_SERIAL = 0x0009,
310 CQL_CONSISTENCY_LOCAL_ONE = 0x000A
311} cql_consistencies;
312
313static const value_string cql_consistency_names[] = {
314 { CQL_CONSISTENCY_ANY, "ANY" },
315 { CQL_CONSISTENCY_ONE, "ONE" },
316 { CQL_CONSISTENCY_TWO, "TWO" },
317 { CQL_CONSISTENCY_THREE, "THREE" },
318 { CQL_CONSISTENCY_QUORUM, "QUORUM" },
319 { CQL_CONSISTENCY_ALL, "ALL" },
320 { CQL_CONSISTENCY_LOCAL_QUORUM, "LOCAL_QUORUM" },
321 { CQL_CONSISTENCY_EACH_QUORUM, "EACH_QUORUM" },
322 { CQL_CONSISTENCY_SERIAL, "SERIAL" },
323 { CQL_CONSISTENCY_LOCAL_SERIAL, "LOCAL_SERIAL" },
324 { CQL_CONSISTENCY_LOCAL_ONE, "LOCAL_ONE" },
325 { 0x00, NULL((void*)0) }
326};
327
328
329typedef enum {
330 CQL_BATCH_TYPE_LOGGED = 0,
331 CQL_BATCH_TYPE_UNLOGGED = 1,
332 CQL_BATCH_TYPE_COUNTER = 2
333} cql_batch_types;
334
335static const value_string cql_batch_type_names[] = {
336 { CQL_BATCH_TYPE_LOGGED, "LOGGED" },
337 { CQL_BATCH_TYPE_UNLOGGED, "UNLOGGED" },
338 { CQL_BATCH_TYPE_COUNTER, "COUNTER" },
339 { 0x00, NULL((void*)0) }
340};
341
342typedef enum {
343 CQL_BATCH_QUERY_TYPE_QUERY = 0,
344 CQL_BATCH_QUERY_TYPE_PREPARED = 1
345} cql_batch_query_types;
346
347static const value_string cql_batch_query_type_names[] = {
348 { CQL_BATCH_QUERY_TYPE_QUERY, "QUERY" },
349 { CQL_BATCH_QUERY_TYPE_PREPARED, "PREPARED" },
350 { 0x00, NULL((void*)0) }
351};
352
353typedef enum {
354 CQL_RESULT_KIND_VOID = 0x0001,
355 CQL_RESULT_KIND_ROWS = 0x0002,
356 CQL_RESULT_KIND_SET_KEYSPACE = 0x0003,
357 CQL_RESULT_KIND_PREPARED = 0x0004,
358 CQL_RESULT_KIND_SCHEMA_CHANGE = 0x0005
359} cql_result_kinds;
360
361static const value_string cql_result_kind_names[] = {
362 { CQL_RESULT_KIND_VOID, "VOID" },
363 { CQL_RESULT_KIND_ROWS, "Rows" },
364 { CQL_RESULT_KIND_SET_KEYSPACE, "Set Keyspace" },
365 { CQL_RESULT_KIND_PREPARED, "Prepared" },
366 { CQL_RESULT_KIND_SCHEMA_CHANGE, "Schema Change" },
367 { 0x00, NULL((void*)0) }
368};
369
370
371
372typedef enum {
373 CQL_RESULT_ROW_TYPE_CUSTOM = 0x0000,
374 CQL_RESULT_ROW_TYPE_ASCII = 0x0001,
375 CQL_RESULT_ROW_TYPE_BIGINT = 0x0002,
376 CQL_RESULT_ROW_TYPE_BLOB = 0x0003,
377 CQL_RESULT_ROW_TYPE_BOOLEAN = 0x0004,
378 CQL_RESULT_ROW_TYPE_COUNTER = 0x0005,
379 CQL_RESULT_ROW_TYPE_DECIMAL = 0x0006,
380 CQL_RESULT_ROW_TYPE_DOUBLE = 0x0007,
381 CQL_RESULT_ROW_TYPE_FLOAT = 0x0008,
382 CQL_RESULT_ROW_TYPE_INT = 0x0009,
383 CQL_RESULT_ROW_TYPE_TIMESTAMP = 0x000B,
384 CQL_RESULT_ROW_TYPE_UUID = 0x000C,
385 CQL_RESULT_ROW_TYPE_VARCHAR = 0x000D,
386 CQL_RESULT_ROW_TYPE_VARINT = 0x000E,
387 CQL_RESULT_ROW_TYPE_TIMEUUID = 0x000F,
388 CQL_RESULT_ROW_TYPE_INET = 0x0010,
389 CQL_RESULT_ROW_TYPE_DATE = 0x0011,
390 CQL_RESULT_ROW_TYPE_TIME = 0x0012,
391 CQL_RESULT_ROW_TYPE_SMALLINT = 0x0013,
392 CQL_RESULT_ROW_TYPE_TINYINT = 0x0014,
393 CQL_RESULT_ROW_TYPE_LIST = 0x0020,
394 CQL_RESULT_ROW_TYPE_MAP = 0x0021,
395 CQL_RESULT_ROW_TYPE_SET = 0x0022,
396 CQL_RESULT_ROW_TYPE_UDT = 0x0030,
397 CQL_RESULT_ROW_TYPE_TUPLE = 0x0031
398} cql_result_row_data_types;
399
400static const value_string cql_result_row_type_names[] = {
401 { CQL_RESULT_ROW_TYPE_CUSTOM, "CUSTOM" },
402 { CQL_RESULT_ROW_TYPE_ASCII, "ASCII" },
403 { CQL_RESULT_ROW_TYPE_BIGINT, "BIGINT" },
404 { CQL_RESULT_ROW_TYPE_BLOB, "BLOB" },
405 { CQL_RESULT_ROW_TYPE_BOOLEAN, "BOOLEAN" },
406 { CQL_RESULT_ROW_TYPE_COUNTER, "COUNTER" },
407 { CQL_RESULT_ROW_TYPE_DECIMAL, "DECIMAL" },
408 { CQL_RESULT_ROW_TYPE_DOUBLE, "DOUBLE" },
409 { CQL_RESULT_ROW_TYPE_FLOAT, "FLOAT" },
410 { CQL_RESULT_ROW_TYPE_INT, "INT" },
411 { CQL_RESULT_ROW_TYPE_TIMESTAMP, "TIMESTAMP" },
412 { CQL_RESULT_ROW_TYPE_UUID, "UUID" },
413 { CQL_RESULT_ROW_TYPE_VARCHAR, "VARCHAR" },
414 { CQL_RESULT_ROW_TYPE_VARINT, "VARINT" },
415 { CQL_RESULT_ROW_TYPE_TIMEUUID, "TIMEUUID" },
416 { CQL_RESULT_ROW_TYPE_INET, "INET" },
417 { CQL_RESULT_ROW_TYPE_DATE, "DATE" },
418 { CQL_RESULT_ROW_TYPE_TIME, "TIME" },
419 { CQL_RESULT_ROW_TYPE_SMALLINT, "SMALLINT" },
420 { CQL_RESULT_ROW_TYPE_TINYINT, "TINYINT" },
421 { CQL_RESULT_ROW_TYPE_LIST, "LIST" },
422 { CQL_RESULT_ROW_TYPE_MAP, "MAP" },
423 { CQL_RESULT_ROW_TYPE_SET, "SET" },
424 { CQL_RESULT_ROW_TYPE_UDT, "UDT" },
425 { CQL_RESULT_ROW_TYPE_TUPLE, "TUPLE" },
426 { 0x0, NULL((void*)0) }
427};
428
429/* From https://github.com/apache/cassandra/blob/cbf4dcb3345c7e2f42f6a897c66b6460b7acc2ca/doc/native_protocol_v4.spec#L1046 */
430typedef enum {
431 CQL_ERROR_SERVER = 0x0000,
432 CQL_ERROR_PROTOCOL = 0x000A,
433 CQL_ERROR_AUTH = 0x0100,
434 CQL_ERROR_UNAVAILABLE = 0x1000,
435 CQL_ERROR_OVERLOADED = 0x1001,
436 CQL_ERROR_BOOTSTRAPPING = 0x1002,
437 CQL_ERROR_TRUNCATE = 0x1003,
438 CQL_ERROR_WRITE_TIMEOUT = 0x1100,
439 CQL_ERROR_READ_TIMEOUT = 0x1200,
440 CQL_ERROR_READ_FAILURE = 0x1300,
441 CQL_ERROR_FUNCTION_FAILURE = 0x1400,
442 CQL_ERROR_WRITE_FAILURE = 0x1500,
443 CQL_ERROR_SYNTAX = 0x2000,
444 CQL_ERROR_UNAUTHORIEZED = 0x2100,
445 CQL_ERROR_INVALID = 0x2200,
446 CQL_ERROR_CONFIG = 0x2300,
447 CQL_ERROR_ALREADY_EXISTS = 0x2400,
448 CQL_ERROR_UNPREPARED = 0x2500
449} cql_error_types;
450
451static const value_string cql_error_names[] = {
452 { CQL_ERROR_SERVER, "Server error" },
453 { CQL_ERROR_PROTOCOL, "Protocol error" },
454 { CQL_ERROR_AUTH, "Authentication error" },
455 { CQL_ERROR_UNAVAILABLE, "Unavailable exception" },
456 { CQL_ERROR_OVERLOADED, "Overloaded" },
457 { CQL_ERROR_BOOTSTRAPPING, "Is_bootstrapping" },
458 { CQL_ERROR_TRUNCATE, "Truncate_error" },
459 { CQL_ERROR_WRITE_TIMEOUT, "Write_timeout" },
460 { CQL_ERROR_READ_TIMEOUT, "Read_timeout" },
461 { CQL_ERROR_READ_FAILURE, "Read_failure" },
462 { CQL_ERROR_FUNCTION_FAILURE, "Function_failure" },
463 { CQL_ERROR_WRITE_FAILURE, "Write_failure" },
464 { CQL_ERROR_SYNTAX, "Syntax_error" },
465 { CQL_ERROR_UNAUTHORIEZED, "Unauthorized" },
466 { CQL_ERROR_INVALID, "Invalid" },
467 {CQL_ERROR_CONFIG, "Config_error" },
468 { CQL_ERROR_ALREADY_EXISTS, "Already_exists" },
469 { CQL_ERROR_UNPREPARED, "Unprepared" },
470 { 0x0, NULL((void*)0)}
471};
472
473static int
474dissect_cql_query_parameters(proto_tree* cql_subtree, tvbuff_t* tvb, int offset, const int execute, const uint8_t protocol_version)
475{
476 int32_t bytes_length = 0;
477 uint64_t flags = 0;
478 uint64_t i = 0;
479 uint32_t string_length = 0;
480 uint32_t value_count = 0;
481
482 static int * const cql_query_bitmaps[] = {
483 &hf_cql_query_flags_values,
484 &hf_cql_query_flags_skip_metadata,
485 &hf_cql_query_flags_page_size,
486 &hf_cql_query_flags_paging_state,
487 &hf_cql_query_flags_serial_consistency,
488 &hf_cql_query_flags_default_timestamp,
489 &hf_cql_query_flags_names_for_values,
490 NULL((void*)0)
491 };
492
493 static int * const cql5_query_bitmaps[] = {
494 &hf_cql_query_v5_flags_values,
495 &hf_cql_query_v5_flags_skip_metadata,
496 &hf_cql_query_v5_flags_page_size,
497 &hf_cql_query_v5_flags_paging_state,
498 &hf_cql_query_v5_flags_serial_consistency,
499 &hf_cql_query_v5_flags_default_timestamp,
500 &hf_cql_query_v5_flags_names_for_values,
501 &hf_cql_query_v5_flags_with_keyspace,
502 &hf_cql_query_v5_flags_now_in_seconds,
503 NULL((void*)0)
504 };
505
506 /* consistency */
507 proto_tree_add_item(cql_subtree, hf_cql_consistency, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
508 offset += 2;
509
510 /* flags */
511 if (protocol_version >= 5) {
512 proto_tree_add_bitmask_list_ret_uint64(cql_subtree, tvb, offset, 4, cql5_query_bitmaps, ENC_BIG_ENDIAN0x00000000, &flags);
513 offset += 4;
514 } else {
515 proto_tree_add_bitmask_list_ret_uint64(cql_subtree, tvb, offset, 1, cql_query_bitmaps, ENC_BIG_ENDIAN0x00000000, &flags);
516 offset += 1;
517 }
518
519 if(flags & CQL_QUERY_FLAG_VALUES) {
520 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_value_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &value_count);
521 offset += 2;
522 for (i = 0; i < value_count; ++i) {
523 if (!execute && flags & CQL_QUERY_FLAG_VALUE_NAMES) {
524 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
525 offset += 2;
526 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
527 offset += string_length;
528 }
529 proto_tree_add_item_ret_int(cql_subtree, hf_cql_bytes_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &bytes_length);
530 offset += 4;
531 if (bytes_length > 0) {
532 proto_tree_add_item(cql_subtree, hf_cql_bytes, tvb, offset, bytes_length, ENC_NA0x00000000);
533 offset += bytes_length;
534 }
535 }
536 }
537
538 if (flags & CQL_QUERY_FLAG_PAGE_SIZE) {
539 proto_tree_add_item(cql_subtree, hf_cql_page_size, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
540 offset += 4;
541 }
542
543 if (flags & CQL_QUERY_FLAG_PAGING_STATE) {
544 proto_tree_add_item_ret_int(cql_subtree, hf_cql_bytes_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &bytes_length);
545 offset += 4;
546 if (bytes_length > 0) {
547 proto_tree_add_item(cql_subtree, hf_cql_bytes, tvb, offset, bytes_length, ENC_NA0x00000000);
548 offset += bytes_length;
549 }
550 }
551
552 if (flags & CQL_QUERY_FLAG_SERIAL_CONSISTENCY) {
553 proto_tree_add_item(cql_subtree, hf_cql_consistency, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
554 offset += 2;
555 }
556
557 if (flags & CQL_QUERY_FLAG_DEFAULT_TIMESTAMP) {
558 proto_tree_add_item(cql_subtree, hf_cql_timestamp, tvb, offset, 8, ENC_TIME_USECS0x00000030|ENC_BIG_ENDIAN0x00000000);
559 offset += 8;
560 }
561
562 if (protocol_version >= 5) {
563 if (flags & CQL_QUERY_FLAG_WITH_KEYSPACE) {
564 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
565 offset += 2;
566 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
567 offset += string_length;
568 }
569 if (flags & CQL_QUERY_FLAG_NOW_IN_SECONDS) {
570 proto_tree_add_item(cql_subtree, hf_cql_int, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
571 offset += 4;
572 }
573 }
574 return offset;
575}
576
577static unsigned
578get_cql_pdu_len(packet_info* pinfo _U___attribute__((unused)), tvbuff_t* tvb, const int offset, void* data _U___attribute__((unused)))
579{
580 /* CQL has 32-bit length at 5th byte in frame. */
581 uint32_t length = tvb_get_ntohl(tvb, offset + 5);
582
583 /* Include length of frame header. */
584 return length + 9;
585}
586
587static unsigned
588get_cql5_comp_pdu_len(packet_info* pinfo _U___attribute__((unused)), tvbuff_t* tvb, const int offset, void* data _U___attribute__((unused)))
589{
590 /* CQL v5 has 17-bit length if the frame is LZ4 compressed - at bytes 0-3, inclusive */
591 uint32_t length = tvb_get_letoh24(tvb, offset) & 0x1FFFF;
592
593 /* Include length of frame header. Non-compressed frame has a 6 bytes header, compressed - 8 bytes, + 4 for CRC32 at the end */
594 return length + 8 + 4;
595}
596
597static unsigned
598get_cql5_non_comp_pdu_len(packet_info* pinfo _U___attribute__((unused)), tvbuff_t* tvb, const int offset, void* data _U___attribute__((unused)))
599{
600 /* CQL v5 has 17-bit length at bytes 0-2 in an uncompressed frame */
601 uint32_t length = tvb_get_letoh24(tvb, offset) & 0x1FFFF;
602
603 /* Include length of frame header. Non-compressed frame has a 6 bytes header, compressed - 8 bytes, + 4 for CRC32 at the end */
604 return length + 6 + 4;
605}
606
607static cql_transaction_type*
608cql_transaction_add_request(cql_conversation_type* conv,
609 packet_info* pinfo,
610 int32_t stream,
611 int fake)
612{
613 cql_transaction_type* trans;
614 wmem_list_t* list;
615
616 list = (wmem_list_t*)wmem_map_lookup(conv->streams, GINT_TO_POINTER(stream)((gpointer) (glong) (stream)));
617 if(!list) {
618 list = wmem_list_new(wmem_file_scope());
619 } else {
620 wmem_map_remove(conv->streams, GINT_TO_POINTER(stream)((gpointer) (glong) (stream)));
621 }
622
623 trans = wmem_new(wmem_file_scope(), cql_transaction_type)((cql_transaction_type*)wmem_alloc((wmem_file_scope()), sizeof
(cql_transaction_type)))
;
624 if (fake) {
625 trans->req_frame = 0;
626 } else {
627 trans->req_frame = pinfo->fd->num;
628 }
629 trans->rep_frame = 0;
630 trans->req_time = pinfo->abs_ts;
631
632 wmem_list_append(list, (void *)trans);
633 wmem_map_insert(conv->streams, GINT_TO_POINTER(stream)((gpointer) (glong) (stream)), (void*)list);
634
635 return trans;
636}
637
638static cql_transaction_type*
639cql_enrich_transaction_with_response(cql_conversation_type* conv,
640 packet_info* pinfo,
641 int32_t stream)
642{
643 cql_transaction_type* trans;
644 wmem_list_frame_t* frame;
645 wmem_list_t* list;
646
647 list = (wmem_list_t*)wmem_map_lookup(conv->streams, GINT_TO_POINTER(stream)((gpointer) (glong) (stream)));
648 if (!list) {
649 return NULL((void*)0);
650 }
651
652 frame = wmem_list_tail(list);
653 if (!frame) {
654 return NULL((void*)0);
655 }
656
657 trans = (cql_transaction_type *)wmem_list_frame_data(frame);
658 if (!trans) {
659 return NULL((void*)0);
660 }
661
662 trans->rep_frame = pinfo->fd->num;
663
664 return trans;
665}
666
667static cql_transaction_type*
668cql_transaction_lookup(cql_conversation_type* conv,
669 packet_info* pinfo,
670 int32_t stream)
671{
672 wmem_list_frame_t* frame;
673 wmem_list_t* list;
674
675 list = (wmem_list_t*)wmem_map_lookup(conv->streams, GINT_TO_POINTER(stream)((gpointer) (glong) (stream)));
676 if (!list) {
677 return NULL((void*)0);
678 }
679
680 frame = wmem_list_head(list);
681 if (!frame) {
682 return NULL((void*)0);
683 }
684
685 do {
686 cql_transaction_type* trans = NULL((void*)0);
687 trans = (cql_transaction_type *)wmem_list_frame_data(frame);
688 if (trans->req_frame == pinfo->fd->num || trans->rep_frame == pinfo->fd->num) {
689 return trans;
690 }
691 } while ((frame = wmem_list_frame_next(frame)));
692
693 return NULL((void*)0);
694}
695
696
697// NOLINTNEXTLINE(misc-no-recursion)
698static int parse_option(proto_tree* metadata_subtree, packet_info *pinfo, tvbuff_t* tvb, int offset)
699{
700 uint32_t data_type = 0;
701 uint32_t string_length = 0;
702 uint32_t tuple_size = 0;
703 uint32_t udt_size = 0;
704 uint32_t i = 0;
705
706 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_result_rows_data_type, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &data_type);
707 offset += 2;
708 increment_dissection_depth(pinfo);
709 switch (data_type) {
710 case CQL_RESULT_ROW_TYPE_LIST:
711 offset = parse_option(metadata_subtree, pinfo, tvb, offset);
712 break;
713 case CQL_RESULT_ROW_TYPE_MAP:
714 offset = parse_option(metadata_subtree, pinfo, tvb, offset);
715 offset = parse_option(metadata_subtree, pinfo, tvb, offset);
716 break;
717 case CQL_RESULT_ROW_TYPE_SET:
718 offset = parse_option(metadata_subtree, pinfo, tvb, offset);
719 break;
720 case CQL_RESULT_ROW_TYPE_UDT:
721 /* keyspace */
722 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
723 offset += 2;
724 proto_tree_add_item(metadata_subtree, hf_cql_string_result_rows_keyspace_name, tvb, offset, string_length, ENC_UTF_80x00000002);
725 offset += string_length;
726
727 /* UDT name */
728 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
729 offset += 2;
730 proto_tree_add_item(metadata_subtree, hf_cql_string_result_rows_udt_name, tvb, offset, string_length, ENC_UTF_80x00000002);
731 offset += string_length;
732
733 /* UDT size */
734 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_string_result_rows_udt_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &udt_size);
735 offset += 2;
736
737 for (i = 0; i < udt_size; i++) {
738 /* UDT field name */
739 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
740 offset += 2;
741 proto_tree_add_item(metadata_subtree, hf_cql_string_result_rows_udt_field_name, tvb, offset, string_length, ENC_UTF_80x00000002);
742 offset += string_length;
743
744 /* UDT field option */
745 offset = parse_option(metadata_subtree, pinfo, tvb, offset);
746 }
747 break;
748 case CQL_RESULT_ROW_TYPE_TUPLE:
749 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_result_rows_tuple_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &tuple_size);
750 offset += 2;
751 for (i = 0; i < tuple_size; i++) {
752 offset = parse_option(metadata_subtree, pinfo, tvb, offset);
753 }
754 break;
755 default:
756 break;
757 }
758 decrement_dissection_depth(pinfo);
759
760 return offset;
761}
762
763static void add_varint_item(proto_tree *tree, tvbuff_t *tvb, const int offset, const int length)
764{
765 switch (length)
766 {
767 case 1:
768 proto_tree_add_item(tree, hf_cql_varint_count8, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
769 break;
770 case 2:
771 proto_tree_add_item(tree, hf_cql_varint_count16, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
772 break;
773 case 3:
774 proto_tree_add_item(tree, hf_cql_varint_count32, tvb, offset, 3, ENC_BIG_ENDIAN0x00000000);
775 break;
776 case 4:
777 proto_tree_add_item(tree, hf_cql_varint_count32, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
778 break;
779 case 5:
780 proto_tree_add_item(tree, hf_cql_varint_count64, tvb, offset, 5, ENC_BIG_ENDIAN0x00000000);
781 break;
782 case 6:
783 proto_tree_add_item(tree, hf_cql_varint_count64, tvb, offset, 6, ENC_BIG_ENDIAN0x00000000);
784 break;
785 case 7:
786 proto_tree_add_item(tree, hf_cql_varint_count64, tvb, offset, 7, ENC_BIG_ENDIAN0x00000000);
787 break;
788 case 8:
789 proto_tree_add_item(tree, hf_cql_varint_count64, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
790 break;
791 }
792}
793
794static void add_cql_uuid(proto_tree* tree, const int hf_uuid, tvbuff_t* tvb, const int offset)
795{
796 e_guid_t guid;
797 int i;
798
799 guid.data1 = tvb_get_letohl(tvb, offset+12);
800 guid.data2 = tvb_get_letohl(tvb, offset+10);
801 guid.data3 = tvb_get_letohl(tvb, offset+8);
802
803 for (i = 0; i < 8; i++)
804 {
805 guid.data4[i] = tvb_get_uint8(tvb, offset+(7-i));
806 }
807
808 proto_tree_add_guid(tree, hf_uuid, tvb, offset, 16, &guid);
809}
810
811
812// NOLINTNEXTLINE(misc-no-recursion)
813static int parse_value(proto_tree* columns_subtree, packet_info *pinfo, tvbuff_t* tvb, int* offset_metadata, int offset)
814{
815 uint32_t data_type = 0;
816 uint32_t string_length = 0;
817 int32_t bytes_length = 0;
818 uint32_t tuple_size = 0;
819 int32_t list_size = 0;
820 int32_t map_size = 0;
821 int32_t set_size = 0;
822 uint32_t udt_size = 0;
823 proto_item *item;
824 proto_item *sub_item;
825 uint32_t i = 0;
826 int32_t j = 0;
827 int offset_metadata_backup = 0;
828 uint32_t addr4;
829 ws_in6_addr addr6;
830 uint32_t port_number;
831 proto_tree* map_subtree;
832 proto_tree* set_subtree;
833
834 proto_tree_add_item_ret_int(columns_subtree, hf_cql_bytes_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &bytes_length);
835 offset += 4;
836
837 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_result_rows_data_type, tvb, *offset_metadata, 2, ENC_BIG_ENDIAN0x00000000, &data_type);
838 proto_item_set_hidden(item);
839 *offset_metadata += 2;
840
841 if (bytes_length == -1) { // value is NULL, but need to skip metadata offsets
842 proto_tree_add_item(columns_subtree, hf_cql_null_value, tvb, offset, 0, ENC_NA0x00000000);
843 if (data_type == CQL_RESULT_ROW_TYPE_MAP) {
844 *offset_metadata += 4; /* skip the type fields of *both* key and value in the map in the metadata */
845 } else if (data_type == CQL_RESULT_ROW_TYPE_SET) {
846 *offset_metadata += 2; /* skip the type field of the elements in the set in the metadata */
847 }
848 return offset;
849 }
850
851 increment_dissection_depth(pinfo);
852 switch (data_type) {
853 case CQL_RESULT_ROW_TYPE_CUSTOM:
854 proto_tree_add_item(columns_subtree, hf_cql_custom, tvb, offset, bytes_length, ENC_UTF_80x00000002);
855 offset += bytes_length;
856 break;
857 case CQL_RESULT_ROW_TYPE_ASCII:
858 proto_tree_add_item(columns_subtree, hf_cql_ascii, tvb, offset, bytes_length, ENC_ASCII0x00000000);
859 offset += bytes_length;
860 break;
861 case CQL_RESULT_ROW_TYPE_BIGINT:
862 proto_tree_add_item(columns_subtree, hf_cql_bigint, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
863 offset += 8;
864 break;
865 case CQL_RESULT_ROW_TYPE_BLOB:
866 proto_tree_add_item(columns_subtree, hf_cql_bytes, tvb, offset, bytes_length, ENC_NA0x00000000);
867 offset += bytes_length;
868 break;
869 case CQL_RESULT_ROW_TYPE_BOOLEAN:
870 proto_tree_add_boolean(columns_subtree, hf_cql_boolean, tvb, offset, 1, true1);
871 offset += 1;
872 break;
873 case CQL_RESULT_ROW_TYPE_COUNTER:
874 break;
875 case CQL_RESULT_ROW_TYPE_DECIMAL:
876 proto_tree_add_item(columns_subtree, hf_cql_scale, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
877 offset += 4;
878 add_varint_item(columns_subtree, tvb, offset, bytes_length - 4);
879 offset += bytes_length - 4;
880 break;
881 case CQL_RESULT_ROW_TYPE_DOUBLE:
882 proto_tree_add_item(columns_subtree, hf_cql_double, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
883 offset += 8;
884 break;
885 case CQL_RESULT_ROW_TYPE_FLOAT:
886 proto_tree_add_item(columns_subtree, hf_cql_float, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
887 offset += 4;
888 break;
889 case CQL_RESULT_ROW_TYPE_INT:
890 proto_tree_add_item(columns_subtree, hf_cql_int, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
891 offset += 4;
892 break;
893 case CQL_RESULT_ROW_TYPE_TIMESTAMP:
894 proto_tree_add_item(columns_subtree, hf_cql_result_timestamp, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
895 offset += 8;
896 break;
897 case CQL_RESULT_ROW_TYPE_UUID:
898 add_cql_uuid(columns_subtree, hf_cql_uuid, tvb, offset);
899 offset += 16;
900 break;
901 case CQL_RESULT_ROW_TYPE_VARCHAR:
902 proto_tree_add_item(columns_subtree, hf_cql_varchar, tvb, offset, bytes_length, ENC_ASCII0x00000000);
903 offset += bytes_length;
904 break;
905 case CQL_RESULT_ROW_TYPE_VARINT:
906 add_varint_item(columns_subtree, tvb, offset, bytes_length);
907 offset += bytes_length;
908 break;
909 case CQL_RESULT_ROW_TYPE_TIMEUUID:
910 add_cql_uuid(columns_subtree, hf_cql_timeuuid, tvb, offset);
911 offset += 16;
912 break;
913 case CQL_RESULT_ROW_TYPE_INET:
914 switch (bytes_length) {
915 case 4:
916 case 8:
917 addr4 = tvb_get_ipv4(tvb, offset);
918 proto_tree_add_ipv4_format_value(columns_subtree, hf_cql_ipv4, tvb, offset, 4, addr4, "%s", get_hostname(addr4));
919 offset += 4;
920 break;
921 case 16:
922 case 20:
923 tvb_get_ipv6(tvb, offset, &addr6);
924 proto_tree_add_ipv6_format_value(columns_subtree, hf_cql_ipv6, tvb, offset, 16, &addr6, "%s", get_hostname6(&addr6));
925 offset += 16;
926 break;
927 default:
928 break;
929 }
930 /* port number is optional */
931 if (bytes_length == 16 || bytes_length == 20) {
932 sub_item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_port, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &port_number);
933 proto_item_append_text(sub_item, " (%u)", port_number);
934 offset += 4;
935 }
936 break;
937 case CQL_RESULT_ROW_TYPE_DATE:
938 break;
939 case CQL_RESULT_ROW_TYPE_TIME:
940 break;
941 case CQL_RESULT_ROW_TYPE_SMALLINT:
942 break;
943 case CQL_RESULT_ROW_TYPE_TINYINT:
944 break;
945 case CQL_RESULT_ROW_TYPE_LIST:
946 item = proto_tree_add_item_ret_int(columns_subtree, hf_cql_string_result_rows_list_size, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &list_size);
947 if (list_size < 0) {
948 expert_add_info(pinfo, item, &ei_cql_unexpected_negative_value);
949 decrement_dissection_depth(pinfo);
950 return tvb_reported_length(tvb);
951 }
952 offset += 4;
953 offset_metadata_backup = *offset_metadata;
954 for (j = 0; j < list_size; j++) {
955 *offset_metadata = offset_metadata_backup;
956 offset = parse_value(columns_subtree, pinfo, tvb, offset_metadata, offset);
957 }
958 break;
959 case CQL_RESULT_ROW_TYPE_MAP:
960 map_subtree = proto_tree_add_subtree(columns_subtree, tvb, offset, 0, ett_cql_result_map, NULL((void*)0), "Map");
961 item = proto_tree_add_item_ret_int(map_subtree, hf_cql_string_result_rows_map_size, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &map_size);
962 offset += 4;
963 proto_item_append_text(map_subtree, " with %" PRId32"d" " element(s)", map_size);
964 if (map_size < 0) {
965 expert_add_info(pinfo, item, &ei_cql_unexpected_negative_value);
966 decrement_dissection_depth(pinfo);
967 return tvb_reported_length(tvb);
968 } else if (map_size == 0) {
969 *offset_metadata += 4; /* skip the type fields of *both* key and value in the map in the metadata */
970 } else {
971 offset_metadata_backup = *offset_metadata;
972 for (j = 0; j < map_size; j++) {
973 *offset_metadata = offset_metadata_backup;
974 offset = parse_value(map_subtree, pinfo, tvb, offset_metadata, offset);
975 offset = parse_value(map_subtree, pinfo, tvb, offset_metadata, offset);
976 }
977 }
978 break;
979 case CQL_RESULT_ROW_TYPE_SET:
980 set_subtree = proto_tree_add_subtree(columns_subtree, tvb, offset, 0, ett_cql_result_set, NULL((void*)0), "Set");
981 item = proto_tree_add_item_ret_int(set_subtree, hf_cql_string_result_rows_set_size, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &set_size);
982 offset += 4;
983 if (set_size < 0) {
984 expert_add_info(pinfo, item, &ei_cql_unexpected_negative_value);
985 decrement_dissection_depth(pinfo);
986 return tvb_reported_length(tvb);
987 } else if (set_size == 0) {
988 *offset_metadata += 2; /* skip the type field of the elements in the set in the metadata */
989 } else {
990 offset_metadata_backup = *offset_metadata;
991 for (j = 0; j < set_size; j++) {
992 *offset_metadata = offset_metadata_backup;
993 offset = parse_value(set_subtree, pinfo, tvb, offset_metadata, offset);
994 }
995 }
996 break;
997 case CQL_RESULT_ROW_TYPE_UDT:
998 /* keyspace */
999 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, *offset_metadata, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1000 proto_item_set_hidden(item);
1001 *offset_metadata += 2;
1002 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_keyspace_name, tvb, *offset_metadata, string_length, ENC_UTF_80x00000002);
1003 proto_item_set_hidden(item);
1004 *offset_metadata += string_length;
1005
1006 /* UDT name */
1007 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, *offset_metadata, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1008 proto_item_set_hidden(item);
1009 *offset_metadata += 2;
1010 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_udt_name, tvb, *offset_metadata, string_length, ENC_UTF_80x00000002);
1011 proto_item_set_hidden(item);
1012 *offset_metadata += string_length;
1013
1014 /* UDT size */
1015 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_result_rows_udt_size, tvb, *offset_metadata, 2, ENC_BIG_ENDIAN0x00000000, &udt_size);
1016 proto_item_set_hidden(item);
1017 *offset_metadata += 2;
1018
1019 for (i = 0; i < udt_size; i++) {
1020 /* UDT field name */
1021 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, *offset_metadata, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1022 proto_item_set_hidden(item);
1023 *offset_metadata += 2;
1024 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_udt_field_name, tvb, *offset_metadata, string_length, ENC_UTF_80x00000002);
1025 proto_item_set_hidden(item);
1026 *offset_metadata += string_length;
1027
1028 /* UDT field option */
1029 offset = parse_value(columns_subtree, pinfo, tvb, offset_metadata, offset);
1030 }
1031 break;
1032 case CQL_RESULT_ROW_TYPE_TUPLE:
1033 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_result_rows_tuple_size, tvb, *offset_metadata, 2, ENC_BIG_ENDIAN0x00000000, &tuple_size);
1034 proto_item_set_hidden(item);
1035 *offset_metadata += 2;
1036 for (i = 0; i < tuple_size; i++) {
1037 offset = parse_value(columns_subtree, pinfo, tvb, offset_metadata, offset);
1038 }
1039 break;
1040 default:
1041 break;
1042 }
1043 decrement_dissection_depth(pinfo);
1044
1045 return offset;
1046}
1047
1048static int parse_result_metadata_more_pages(proto_tree* tree, tvbuff_t* tvb, int offset, const uint32_t flags)
1049{
1050 int32_t bytes_length = 0;
1051
1052 if (flags & CQL_RESULT_ROWS_FLAG_HAS_MORE_PAGES) {
1053 /* show paging state */
1054 proto_tree_add_item_ret_int(tree, hf_cql_bytes_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &bytes_length);
1055 offset += 4;
1056 if (bytes_length > 0) {
1057 proto_tree_add_item(tree, hf_cql_paging_state, tvb, offset, bytes_length, ENC_NA0x00000000);
1058 offset += bytes_length;
1059 }
1060 }
1061
1062 return offset;
1063}
1064
1065static int parse_result_metadata(proto_tree* tree, packet_info *pinfo, tvbuff_t* tvb,
1066 int offset, const uint32_t flags, const int result_rows_columns_count)
1067{
1068 proto_tree* col_spec_subtree = NULL((void*)0);
1069 uint32_t string_length = 0;
1070 int j;
1071
1072 if (flags & CQL_RESULT_ROWS_FLAG_NO_METADATA) {
1073 /* There will be no col_spec elements. */
1074 return offset;
1075 }
1076
1077 if ((flags & (CQL_RESULT_ROWS_FLAG_GLOBAL_TABLES_SPEC | CQL_RESULT_ROWS_FLAG_NO_METADATA)) == CQL_RESULT_ROWS_FLAG_GLOBAL_TABLES_SPEC) {
1078 proto_tree_add_item_ret_uint(tree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1079 offset += 2;
1080 proto_tree_add_item(tree, hf_cql_string_result_rows_global_table_spec_ksname, tvb, offset, string_length, ENC_UTF_80x00000002);
1081 offset += string_length;
1082
1083 proto_tree_add_item_ret_uint(tree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1084 offset += 2;
1085 proto_tree_add_item(tree, hf_cql_string_result_rows_global_table_spec_table_name, tvb, offset, string_length, ENC_UTF_80x00000002);
1086 offset += string_length;
1087 }
1088
1089 for (j = 0; j < result_rows_columns_count; ++j) {
1090 col_spec_subtree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_cql_result_metadata_colspec, NULL((void*)0), "Column");
1091 proto_item_append_text(col_spec_subtree, " # %" PRId32"d" " specification", j + 1);
1092 if (!(flags & CQL_RESULT_ROWS_FLAG_GLOBAL_TABLES_SPEC)) {
1093 /* ksname and tablename */
1094 proto_tree_add_item_ret_uint(col_spec_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1095 offset += 2;
1096 proto_tree_add_item(col_spec_subtree, hf_cql_string_result_rows_keyspace_name, tvb, offset, string_length, ENC_UTF_80x00000002);
1097 offset += string_length;
1098 proto_tree_add_item_ret_uint(col_spec_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1099 offset += 2;
1100 proto_tree_add_item(col_spec_subtree, hf_cql_string_result_rows_table_name, tvb, offset, string_length, ENC_UTF_80x00000002);
1101 offset += string_length;
1102 }
1103
1104 /* column name */
1105 proto_tree_add_item_ret_uint(col_spec_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1106 offset += 2;
1107 proto_tree_add_item(col_spec_subtree, hf_cql_string_result_rows_column_name, tvb, offset, string_length, ENC_UTF_80x00000002);
1108 offset += string_length;
1109
1110 /* type "option" */
1111 offset = parse_option(col_spec_subtree, pinfo, tvb, offset);
1112 }
1113
1114 return offset;
1115}
1116
1117
1118static int parse_result_schema_change(proto_tree* subtree, packet_info *pinfo, tvbuff_t* tvb,
1119 int offset)
1120{
1121 uint32_t short_bytes_length = 0;
1122 const uint8_t* string_event_type_target = NULL((void*)0);
1123
1124 proto_tree_add_item_ret_uint(subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1125 offset += 2;
1126 proto_tree_add_item(subtree, hf_cql_event_schema_change_type, tvb, offset, short_bytes_length, ENC_UTF_80x00000002);
1127 offset += short_bytes_length;
1128 proto_tree_add_item_ret_uint(subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1129 offset += 2;
1130 proto_tree_add_item_ret_string(subtree, hf_cql_event_schema_change_type_target, tvb, offset, short_bytes_length, ENC_UTF_80x00000002, pinfo->pool, &string_event_type_target);
1131 offset += short_bytes_length;
1132 /* all targets have the keyspace as the first parameter*/
1133 proto_tree_add_item_ret_uint(subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1134 offset += 2;
1135 proto_tree_add_item(subtree, hf_cql_event_schema_change_keyspace, tvb, offset, short_bytes_length, ENC_UTF_80x00000002);
1136 offset += short_bytes_length;
1137 if ((strcmp(string_event_type_target, "TABLE") == 0) || (strcmp(string_event_type_target, "TYPE") == 0)) {
1138 proto_tree_add_item_ret_uint(subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1139 offset += 2;
1140 proto_tree_add_item(subtree, hf_cql_event_schema_change_object, tvb, offset, short_bytes_length, ENC_UTF_80x00000002);
1141 } else {
1142 /* TODO: handle "FUNCTION" or "AGGREGATE" targets:
1143 - [string] the function/aggregate name
1144 - [string list] one string for each argument type (as CQL type)
1145 */
1146 }
1147
1148 return offset;
1149}
1150
1151
1152static int parse_row(proto_tree* columns_subtree, packet_info *pinfo, tvbuff_t* tvb,
1153 int offset_metadata, int offset, const int result_rows_columns_count, const uint32_t flags)
1154{
1155 int string_length;
1156 int shadow_offset;
1157 proto_item *item;
1158 int j;
1159
1160 shadow_offset = offset_metadata;
1161 for (j = 0; j < result_rows_columns_count; ++j) {
1162 if (!(flags & CQL_RESULT_ROWS_FLAG_GLOBAL_TABLES_SPEC)) {
1163 /* ksname and tablename */
1164 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, shadow_offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1165 proto_item_set_hidden(item);
1166 shadow_offset += 2;
1167 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_keyspace_name, tvb, shadow_offset, string_length, ENC_UTF_80x00000002);
1168 proto_item_set_hidden(item);
1169 shadow_offset += string_length;
1170 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, shadow_offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1171 proto_item_set_hidden(item);
1172 shadow_offset += 2;
1173 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_table_name, tvb, shadow_offset, string_length, ENC_UTF_80x00000002);
1174 proto_item_set_hidden(item);
1175 shadow_offset += string_length;
1176 } else { /* global table spec flag is on: ksname and tablename are NOT repeated for each column */
1177 if (j == 0) { /* only for the 1st column, dissect the global ksname and tablename */
1178 int ks_offset = offset_metadata;
1179 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, ks_offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1180 proto_item_set_hidden(item);
1181 ks_offset += 2;
1182 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_keyspace_name, tvb, ks_offset, string_length, ENC_UTF_80x00000002);
1183 proto_item_set_hidden(item);
1184 ks_offset += string_length;
1185 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, ks_offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1186 proto_item_set_hidden(item);
1187 ks_offset += 2;
1188 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_table_name, tvb, ks_offset, string_length, ENC_UTF_80x00000002);
1189 proto_item_set_hidden(item);
1190 ks_offset += string_length;
1191 if (shadow_offset == offset_metadata) { /* if it's the 1st time we parsed the global ksname and tablename, now shadow_offset should skip them */
1192 shadow_offset = ks_offset;
1193 }
1194 }
1195 }
1196
1197 /* column name */
1198 item = proto_tree_add_item_ret_uint(columns_subtree, hf_cql_string_length, tvb, shadow_offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1199 proto_item_set_hidden(item);
1200 shadow_offset += 2;
1201 item = proto_tree_add_item(columns_subtree, hf_cql_string_result_rows_column_name, tvb, shadow_offset, string_length, ENC_UTF_80x00000002);
1202 proto_item_set_hidden(item);
1203 shadow_offset += string_length;
1204
1205 offset = parse_value(columns_subtree, pinfo, tvb, &shadow_offset, offset);
1206 }
1207
1208 return offset;
1209}
1210
1211#define MAX_PAYLOAD_LENGTH(128 * 1024 - 1) (128 * 1024 - 1) // 128K -1
1212
1213static int
1214dissect_cql_tcp_pdu(tvbuff_t* raw_tvb, packet_info* pinfo, proto_tree* tree, void* data _U___attribute__((unused)));
1215
1216static int
1217dissect_cql5_uncomp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data _U___attribute__((unused)))
1218{
1219 proto_item* ti;
1220 proto_tree* cql_tree;
1221 proto_tree* header_tree;
1222 uint32_t offset = 0;
1223 uint32_t length;
1224 bool_Bool isSelfContained;
1225 uint64_t header_data = tvb_get_letoh64(tvb, offset);
1226 tvbuff_t *payload_tvb = NULL((void*)0);
1227
1228 header_data &= 0xFFFFFFFFFF; // mask to 40 bits
1229 length = header_data & MAX_PAYLOAD_LENGTH(128 * 1024 - 1);
1230 isSelfContained = (header_data >> 17) & 1; // Self-contained flag at bit 17
1231
1232 uint32_t payload_offset = offset + 6; // Skip the 6-byte header + CRC24 to get to payload
1233
1234 ti = proto_tree_add_item(tree, proto_cql, tvb, offset, length + 6 + 4, ENC_NA0x00000000);
1235 cql_tree = proto_item_add_subtree(ti, ett_cql_protocol);
1236
1237 ti = proto_tree_add_item(cql_tree, hf_cql5_header, tvb, offset, 6, ENC_NA0x00000000);
1238 header_tree = proto_item_add_subtree(ti, ett_cql5_header);
1239
1240 proto_tree_add_uint(header_tree, hf_cql5_compressed_length, tvb, offset, 3, length);
1241 proto_tree_add_boolean(header_tree, hf_cql5_self_contained, tvb, offset + 2, 1, isSelfContained);
1242 proto_tree_add_item(header_tree, hf_cql5_crc24, tvb, offset + 3, 3, ENC_LITTLE_ENDIAN0x80000000);
1243
1244 payload_tvb = tvb_new_subset_length(tvb, payload_offset, length);
1245 tcp_dissect_pdus(payload_tvb, pinfo, cql_tree, cql_desegment, 9 /* bytes to determine length of PDU */, get_cql_pdu_len, dissect_cql_tcp_pdu, data);
1246 proto_tree_add_item(tree, hf_cql5_crc32, tvb, length + 6, 4, ENC_LITTLE_ENDIAN0x80000000);
1247 return length + 6 + 4; // length + header + crc32
1248}
1249
1250static int
1251dissect_cql5_comp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data _U___attribute__((unused)))
1252{
1253 proto_item* ti;
1254 proto_tree* cql_tree;
1255 proto_tree* header_tree;
1256 uint32_t offset = 0;
1257 uint32_t length, uncomp_length;
1258 bool_Bool isSelfContained;
1259 uint64_t header_data = tvb_get_letoh64(tvb, offset);
1260
1261 header_data &= 0xFFFFFFFFFF; // mask to 40 bits
1262 length = header_data & MAX_PAYLOAD_LENGTH(128 * 1024 - 1);
1263 uncomp_length = (header_data >> 17) & MAX_PAYLOAD_LENGTH(128 * 1024 - 1);
1264 isSelfContained = (header_data >> 34) & 1; // Self-contained flag at bit 34
1265
1266 // Try to determine if this is actually compressed by attempting LZ4 decompression
1267 uint32_t payload_offset = offset + 8; // Skip the 8-byte header + CRC24 to get to payload
1268 tvbuff_t *decompressed_tvb = NULL((void*)0);
1269
1270 if (uncomp_length == 0) {
1271 // Per CQL v5 spec: uncomp_length=0 means payload is uncompressed (optimization when compression doesn't help)
1272 // actual_uncomp_length is already initialized to length
1273 } else {
1274#ifdef HAVE_LZ41
1275 if (uncomp_length <= MAX_UNCOMPRESSED_SIZE(10 * 1024 * 1024) && length > 0) {
1276 if (tvb_captured_length_remaining(tvb, payload_offset) >= (int)length) {
1277 unsigned char *decompressed_buffer = (unsigned char*)wmem_alloc(pinfo->pool, uncomp_length);
1278 int ret = LZ4_decompress_safe(
1279 (const char*)tvb_get_ptr(tvb, payload_offset, length),
1280 (char*)decompressed_buffer,
1281 length,
1282 uncomp_length
1283 );
1284
1285 if (ret == (int)uncomp_length) {
1286 // Create a new TVB with the decompressed data
1287 decompressed_tvb = tvb_new_child_real_data(tvb, decompressed_buffer, uncomp_length, uncomp_length);
1288 add_new_data_source(pinfo, decompressed_tvb, "LZ4 Decompressed Data");
1289 } else {
1290 // Decompression failed, free the buffer
1291 wmem_free(pinfo->pool, decompressed_buffer);
1292 }
1293 }
1294 }
1295#endif
1296 }
1297
1298 // Use the appropriate TVB for further processing
1299 tvbuff_t *payload_tvb = NULL((void*)0);
1300
1301 if (decompressed_tvb) {
1302 payload_tvb = decompressed_tvb;
1303 } else {
1304 payload_tvb = tvb_new_subset_length(tvb, payload_offset, length);
1305 }
1306
1307 ti = proto_tree_add_item(tree, proto_cql, tvb, offset, length + 8 + 4, ENC_NA0x00000000);
1308 cql_tree = proto_item_add_subtree(ti, ett_cql_protocol);
1309
1310 ti = proto_tree_add_item(cql_tree, hf_cql5_header, tvb, offset, 5, ENC_NA0x00000000);
1311 header_tree = proto_item_add_subtree(ti, ett_cql5_header);
1312
1313 proto_tree_add_uint(header_tree, hf_cql5_compressed_length, tvb, offset, 3, length);
1314 proto_tree_add_uint(header_tree, hf_cql5_uncompressed_length, tvb, offset + 2, 3, uncomp_length);
1315 proto_tree_add_boolean(header_tree, hf_cql5_self_contained, tvb, offset + 3, 1, isSelfContained);
1316 proto_tree_add_item(header_tree, hf_cql5_crc24, tvb, offset + 5, 3, ENC_LITTLE_ENDIAN0x80000000);
1317
1318 tcp_dissect_pdus(payload_tvb, pinfo, cql_tree, cql_desegment, 9 /* bytes to determine length of PDU */, get_cql_pdu_len, dissect_cql_tcp_pdu, data);
1319 proto_tree_add_item(tree, hf_cql5_crc32, tvb, length + 8, 4, ENC_LITTLE_ENDIAN0x80000000);
1320 return length + 8 + 4; // compressed length + header + crc32
1321
1322}
1323
1324static int
1325dissect_cql_tcp_pdu(tvbuff_t* raw_tvb, packet_info* pinfo, proto_tree* tree, void* data _U___attribute__((unused)))
1326{
1327 proto_item* ti;
1328 tvbuff_t* tvb = NULL((void*)0);
1329 proto_tree* cql_tree;
1330 proto_tree* version_tree;
1331 proto_tree* cql_subtree = NULL((void*)0);
1332 proto_tree* cust_payload_tree = NULL((void*)0);
1333 proto_tree* rows_subtree = NULL((void*)0);
1334 proto_tree* columns_subtree = NULL((void*)0);
1335 proto_tree* single_column_subtree = NULL((void*)0);
1336 proto_tree* metadata_subtree = NULL((void*)0);
1337 proto_tree* prepared_metadata_subtree = NULL((void*)0);
1338
1339 int offset = 0;
1340 int offset_row_metadata = 0;
1341 uint8_t flags = 0;
1342 uint8_t first_byte = 0;
1343 uint8_t server_to_client = 0;
1344 uint8_t opcode = 0;
1345 uint32_t message_length = 0;
1346 uint32_t map_size = 0;
1347 uint64_t i = 0;
1348 uint32_t string_length = 0;
1349 int32_t stream = 0;
1350 uint32_t batch_size = 0;
1351 uint32_t batch_query_type = 0;
1352 uint32_t result_kind = 0;
1353 uint32_t result_rows_flags = 0;
1354 int32_t result_rows_columns_count = 0;
1355 int32_t result_prepared_flags = 0;
1356 int32_t result_prepared_pk_count = 0;
1357 int64_t j = 0;
1358 int64_t k = 0;
1359 uint32_t short_bytes_length = 0;
1360 int32_t bytes_length = 0;
1361 int32_t result_rows_row_count = 0;
1362
1363 conversation_t* conversation;
1364 cql_conversation_type* cql_conv;
1365 cql_transaction_type* cql_trans = NULL((void*)0);
1366 cql_compression_level compression_level = CQL_COMPRESSION_NONE;
1367
1368 static int * const cql_batch_flags_bitmaps[] = {
1369 &hf_cql_batch_flag_serial_consistency,
1370 &hf_cql_batch_flag_default_timestamp,
1371 &hf_cql_batch_flag_with_name_for_values,
1372 NULL((void*)0)
1373 };
1374
1375 static int * const cql_header_bitmaps_v3[] = {
1376 &hf_cql_flag_compression,
1377 &hf_cql_flag_tracing,
1378 &hf_cql_flag_reserved3,
1379 NULL((void*)0)
1380 };
1381
1382 static int * const cql_header_bitmaps_v4[] = {
1383 &hf_cql_flag_compression,
1384 &hf_cql_flag_tracing,
1385 &hf_cql_flag_custom_payload,
1386 &hf_cql_flag_warning,
1387 &hf_cql_flag_reserved4,
1388 NULL((void*)0)
1389 };
1390
1391 static int * const cql_header_bitmaps_v5[] = {
1392 &hf_cql_flag_compression, /* deprecated in v5*/
1393 &hf_cql_flag_tracing,
1394 &hf_cql_flag_custom_payload,
1395 &hf_cql_flag_warning,
1396 &hf_cql_flag_beta,
1397 NULL((void*)0)
1398 };
1399
1400 const uint8_t* string_event_type = NULL((void*)0);
1401
1402 col_set_str(pinfo->cinfo, COL_PROTOCOL, "CQL");
1403 col_clear(pinfo->cinfo, COL_INFO);
1404
1405 first_byte = tvb_get_uint8(raw_tvb, 0);
1406 server_to_client = first_byte & (uint8_t)0x80;
1407 opcode = tvb_get_uint8(raw_tvb, 4);
1408
1409 conversation = find_or_create_conversation(pinfo);
1410 cql_conv = (cql_conversation_type*) conversation_get_proto_data(conversation, proto_cql);
1411 if(!cql_conv) {
1412 cql_conv = wmem_new(wmem_file_scope(), cql_conversation_type)((cql_conversation_type*)wmem_alloc((wmem_file_scope()), sizeof
(cql_conversation_type)))
;
1413 cql_conv->streams = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal);
1414 cql_conv->frame_start_v5_proto = 0;
1415 cql_conv->server_port = pinfo->destport;
1416 cql_conv->protocol_version = (first_byte & 0x7F);
1417 cql_conv->compression_level = CQL_COMPRESSION_NONE;
1418 conversation_add_proto_data(conversation, proto_cql, cql_conv);
1419 }
1420
1421 col_add_fstr(pinfo->cinfo, COL_INFO, "v%d %s Type %s",
1422 cql_conv->protocol_version,
1423 server_to_client == 0 ? "C->S" : "S->C",
1424 val_to_str(pinfo->pool, opcode, cql_opcode_names, "Unknown (0x%02x)")
1425 );
1426
1427 ti = proto_tree_add_item(tree, proto_cql, raw_tvb, 0, -1, ENC_NA0x00000000);
1428 cql_tree = proto_item_add_subtree(ti, ett_cql_protocol);
1429
1430 ti = proto_tree_add_item(cql_tree, hf_cql_version, raw_tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1431 version_tree = proto_item_add_subtree(ti, ett_cql_version);
1432 proto_tree_add_item(version_tree, hf_cql_protocol_version, raw_tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1433 proto_tree_add_item(version_tree, hf_cql_direction, raw_tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1434 offset += 1;
1435 switch(cql_conv->protocol_version){
1436 case 3:
1437 proto_tree_add_bitmask(cql_tree, raw_tvb, offset, hf_cql_flags_bitmap, ett_cql_header_flags_bitmap, cql_header_bitmaps_v3, ENC_BIG_ENDIAN0x00000000);
1438 break;
1439 case 4:
1440 proto_tree_add_bitmask(cql_tree, raw_tvb, offset, hf_cql_flags_bitmap, ett_cql_header_flags_bitmap, cql_header_bitmaps_v4, ENC_BIG_ENDIAN0x00000000);
1441 break;
1442 case 5:
1443 proto_tree_add_bitmask(cql_tree, raw_tvb, offset, hf_cql_flags_bitmap, ett_cql_header_flags_bitmap, cql_header_bitmaps_v5, ENC_BIG_ENDIAN0x00000000);
1444 break;
1445 default:
1446 proto_tree_add_item(cql_tree, hf_cql_flags_bitmap, raw_tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1447 break;
1448 }
1449 flags = tvb_get_uint8(raw_tvb, offset);
1450 offset += 1;
1451 proto_tree_add_item_ret_int(cql_tree, hf_cql_stream, raw_tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &stream);
1452 offset += 2;
1453 proto_tree_add_item(cql_tree, hf_cql_opcode, raw_tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1454 offset += 1;
1455 proto_tree_add_item_ret_uint(cql_tree, hf_cql_length, raw_tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &message_length);
1456 offset += 4;
1457
1458 /* Track the request/response. */
1459 if (!pinfo->fd->visited) {
1460 if (server_to_client == 0) {
1461 /* This is a request, add it to this stream tracking */
1462 cql_trans = cql_transaction_add_request(cql_conv, pinfo, stream, 0);
1463 } else {
1464 /* This is a response, bind the response with the latest request */
1465 cql_trans = cql_enrich_transaction_with_response(cql_conv, pinfo, stream);
1466 }
1467 } else {
1468 /* Search for any packet having this packed id as request or response */
1469 cql_trans = cql_transaction_lookup(cql_conv, pinfo, stream);
1470 }
1471
1472 if (!cql_trans) {
1473 /* Add a fake request to this stream tracking */
1474 cql_trans = cql_transaction_add_request(cql_conv, pinfo, stream, 1);
1475 }
1476
1477 /* Add state tracking to tree */
1478 if (server_to_client == 0 && cql_trans->rep_frame) {
1479 /* request */
1480 ti = proto_tree_add_uint(cql_tree, hf_cql_response_in, raw_tvb, 0, 0, cql_trans->rep_frame);
1481 proto_item_set_generated(ti);
1482 }
1483 if (server_to_client && cql_trans->req_frame) {
1484 /* reply */
1485 nstime_t ns;
1486
1487 ti = proto_tree_add_uint(cql_tree, hf_cql_response_to, raw_tvb, 0, 0, cql_trans->req_frame);
1488 proto_item_set_generated(ti);
1489 nstime_delta(&ns, &pinfo->abs_ts, &cql_trans->req_time);
1490 ti = proto_tree_add_time(cql_tree, hf_cql_response_time, raw_tvb, 0, 0, &ns);
1491 proto_item_set_generated(ti);
1492 }
1493
1494 /* We cannot rely on compression negotiation in the STARTUP message because the
1495 * capture can be done at a random time hence missing the negotiation.
1496 * So we will first try to decompress LZ4 then snappy
1497 */
1498 if (flags & CQL_HEADER_FLAG_COMPRESSION && cql_conv->protocol_version < 5) {
1499 compression_level = CQL_DECOMPRESSION_ATTEMPTED;
1500#ifdef HAVE_LZ41
1501 if (tvb_captured_length_remaining(raw_tvb, offset) > 4) {
1502 /* Set ret == 0 to make it fail in case decompression is skipped
1503 * due to orig_size being too big
1504 */
1505 uint32_t ret = 0, orig_size = tvb_get_ntohl(raw_tvb, offset);
1506 unsigned char *decompressed_buffer = NULL((void*)0);
1507 offset += 4;
1508
1509 /* if the decompressed size is reasonably small try to decompress data */
1510 if (orig_size <= MAX_UNCOMPRESSED_SIZE(10 * 1024 * 1024)) {
1511 decompressed_buffer = (unsigned char*)wmem_alloc(pinfo->pool, orig_size);
1512 ret = LZ4_decompress_safe(tvb_get_ptr(raw_tvb, offset, -1),
1513 decompressed_buffer,
1514 tvb_captured_length_remaining(raw_tvb, offset),
1515 orig_size);
1516 }
1517 /* Decompression attempt failed: rewind offset */
1518 if (ret != orig_size) {
1519 wmem_free(pinfo->pool, decompressed_buffer);
1520 offset -= 4;
1521 } else {
1522 /* Now re-setup the tvb buffer to have the new data */
1523 tvb = tvb_new_child_real_data(raw_tvb, decompressed_buffer, orig_size, orig_size);
1524 add_new_data_source(pinfo, tvb, "LZ4 Decompressed Data");
1525 /* mark the decompression as successful */
1526 compression_level = CQL_COMPRESSION_LZ4;
1527 message_length= orig_size;
1528 }
1529 }
1530#endif
1531#ifdef HAVE_SNAPPY1
1532 if (compression_level == CQL_DECOMPRESSION_ATTEMPTED) {
1533 unsigned char *decompressed_buffer = NULL((void*)0);
1534 size_t orig_size = 0;
1535 snappy_status ret;
1536
1537 /* get the raw data length */
1538 ret = snappy_uncompressed_length(tvb_get_ptr(raw_tvb, offset, -1),
1539 tvb_captured_length_remaining(raw_tvb, offset),
1540 &orig_size);
1541 /* if we get the length and it's reasonably short to allocate a buffer for it
1542 * proceed to try decompressing the data
1543 */
1544 if (ret == SNAPPY_OK && orig_size <= MAX_UNCOMPRESSED_SIZE(10 * 1024 * 1024)) {
1545 decompressed_buffer = (unsigned char*)wmem_alloc(pinfo->pool, orig_size);
1546
1547 ret = snappy_uncompress(tvb_get_ptr(raw_tvb, offset, -1),
1548 tvb_captured_length_remaining(raw_tvb, offset),
1549 decompressed_buffer,
1550 &orig_size);
1551 } else {
1552 /* else mark the input as invalid in order to skip the rest of the
1553 * procedure
1554 */
1555 ret = SNAPPY_INVALID_INPUT;
1556 }
1557 /* if the decompression succeeded build the new tvb */
1558 if (ret == SNAPPY_OK) {
1559 tvb = tvb_new_child_real_data(raw_tvb, decompressed_buffer, (uint32_t)orig_size, (uint32_t)orig_size);
1560 add_new_data_source(pinfo, tvb, "Snappy Decompressed Data");
1561 compression_level = CQL_COMPRESSION_SNAPPY;
1562 message_length = (uint32_t)orig_size;
1563 } else {
1564 wmem_free(pinfo->pool, decompressed_buffer);
1565 }
1566 }
1567#endif
1568 }
1569 if (compression_level == CQL_COMPRESSION_NONE) {
1570 /* In case of decompression failure or uncompressed packet */
1571 tvb = tvb_new_subset_remaining(raw_tvb, offset);
1572 } else if (compression_level == CQL_DECOMPRESSION_ATTEMPTED) {
1573 proto_tree_add_item(cql_tree, hf_cql_raw_compressed_bytes, raw_tvb, offset,
1574 tvb_captured_length_remaining(raw_tvb, offset), ENC_NA0x00000000);
1575 return tvb_captured_length(raw_tvb);
1576 }
1577 offset = 0;
1578
1579
1580 /* Dissect the operation. */
1581 if (server_to_client == 0) {
1582 switch (opcode) {
1583 case CQL_OPCODE_STARTUP:
1584 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message STARTUP");
1585 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_map_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &map_size);
1586 offset += 2;
1587 const uint8_t *key_string = NULL((void*)0);
1588 const uint8_t*val_string = NULL((void*)0);
1589 for(i = 0; i < map_size; ++i) {
1590 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1591 offset += 2;
1592 if (string_length == (sizeof("COMPRESSION") - 1)) { /* 'COMPRESSION' = 11 bytes, but there could be other keys with the same length! */
1593 proto_tree_add_item_ret_string(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002, pinfo->pool, &key_string);
1594 } else
1595 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1596 offset += string_length;
1597
1598 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1599 offset += 2;
1600
1601 if (string_length == (sizeof("lz4") - 1) && key_string && strncmp((const char*)key_string, "COMPRESSION", sizeof("COMPRESSION") - 1) == 0) {
1602 proto_tree_add_item_ret_string(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002, pinfo->pool, &val_string);
1603 /* remember the compression for future packets, needed for v5 follow-up conversation */
1604 if (val_string && strncmp((const char*)val_string, "lz4", sizeof("lz4") - 1) == 0) {
1605 cql_conv->compression_level = CQL_COMPRESSION_LZ4;
1606 }
1607 } else
1608 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1609 offset += string_length;
1610 }
1611 break;
1612
1613 case CQL_OPCODE_AUTH_RESPONSE:
1614 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message AUTH_RESPONSE");
1615
1616 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &string_length);
1617 offset += 4;
1618 if (string_length > 0) {
1619 proto_tree_add_item(cql_subtree, hf_cql_auth_token, tvb, offset, string_length, ENC_NA0x00000000);
1620 }
1621 break;
1622
1623 case CQL_OPCODE_OPTIONS:
1624 /* body should be empty */
1625 break;
1626
1627 case CQL_OPCODE_QUERY:
1628 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Query");
1629
1630 /* Query */
1631 const uint8_t *query_string;
1632 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &string_length);
1633 offset += 4;
1634 proto_tree_add_item_ret_string(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002, pinfo->pool, &query_string);
1635 col_append_fstr(pinfo->cinfo, COL_INFO, ": %s", query_string);
1636 offset += string_length;
1637
1638 /* Query parameters */
1639 dissect_cql_query_parameters(cql_subtree, tvb, offset, 0, cql_conv->protocol_version);
1640
1641 break;
1642
1643
1644 case CQL_OPCODE_PREPARE:
1645 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message PREPARE");
1646
1647 /* TODO: Link for later use by EXECUTE? */
1648 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &string_length);
1649 offset += 4;
1650 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1651 break;
1652
1653
1654 case CQL_OPCODE_EXECUTE:
1655 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message EXECUTE");
1656
1657 /* TODO: link to original PREPARE? */
1658
1659 /* Query ID */
1660 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1661 offset += 2;
1662 proto_tree_add_item(cql_subtree, hf_cql_query_id, tvb, offset, short_bytes_length, ENC_NA0x00000000);
1663 offset += short_bytes_length;
1664
1665 /* Query parameters */
1666 dissect_cql_query_parameters(cql_subtree, tvb, offset, 1, cql_conv->protocol_version);
1667 break;
1668
1669
1670 case CQL_OPCODE_BATCH:
1671 /* TODO NOT DONE */
1672 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message BATCH");
1673
1674 proto_tree_add_item(cql_subtree, hf_cql_batch_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
1675 offset += 1;
1676
1677 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_batch_query_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &batch_size);
1678 offset += 2;
1679
1680 for (i = 0; i < batch_size; ++i) {
1681 uint32_t value_count = 0;
1682
1683 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_batch_query_type, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &batch_query_type);
1684 batch_query_type = tvb_get_uint8(tvb, offset);
1685 offset += 1;
1686 if (batch_query_type == 0) {
1687 /* Query */
1688 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &string_length);
1689 offset += 4;
1690 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1691 offset += string_length;
1692 } else if (batch_query_type == 1) {
1693 uint32_t query_id_bytes_length;
1694
1695 /* Query ID */
1696 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &query_id_bytes_length);
1697 offset += 2;
1698 proto_tree_add_item(cql_subtree, hf_cql_query_id, tvb, offset, query_id_bytes_length, ENC_NA0x00000000);
1699 offset += query_id_bytes_length;
1700 }
1701
1702 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_value_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &value_count);
1703 offset += 2;
1704 for (k = 0; k < value_count; ++k) {
1705 int32_t batch_bytes_length = 0;
1706 proto_tree_add_item_ret_int(cql_subtree, hf_cql_bytes_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &batch_bytes_length);
1707 offset += 4;
1708 if (batch_bytes_length > 0) {
1709 proto_tree_add_item(cql_subtree, hf_cql_bytes, tvb, offset, batch_bytes_length, ENC_NA0x00000000);
1710 offset += batch_bytes_length;
1711 }
1712 /* TODO - handle both -1 and -2 batch_bytes_length values:
1713 -1 no byte should follow and the value represented is `null`.
1714 -2 no byte should follow and the value represented is `not set` not resulting in any change to the existing value.
1715 < -2 is an invalid value and results in an error. */
1716 }
1717 }
1718 /* consistency */
1719 proto_tree_add_item(cql_subtree, hf_cql_consistency, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
1720 offset += 2;
1721 proto_tree_add_bitmask(cql_subtree, tvb, offset, hf_cql_batch_flags_bitmap, ett_cql_batch_flags_bitmap, cql_batch_flags_bitmaps, ENC_BIG_ENDIAN0x00000000);
1722 break;
1723
1724 case CQL_OPCODE_REGISTER:
1725 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message REGISTER");
1726
1727 /* string list */
1728 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_list_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &map_size);
1729 offset += 2;
1730 for(i = 0; i < map_size; ++i) {
1731 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1732 offset += 2;
1733 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1734 offset += string_length;
1735 }
1736
1737 break;
1738
1739 default:
1740 proto_tree_add_expert(cql_tree, pinfo, &ei_cql_data_not_dissected_yet, tvb, 0, message_length);
1741 break;
1742 }
1743 } else {
1744 if (flags & CQL_HEADER_FLAG_TRACING) {
1745 add_cql_uuid(cql_tree, hf_cql_tracing_uuid, tvb, offset);
1746 offset += 16;
1747 }
1748 switch (opcode) {
1749 case CQL_OPCODE_ERROR:
1750 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message ERROR");
1751 uint32_t error_code;
1752 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_error_code, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &error_code);
1753 col_append_fstr(pinfo->cinfo, COL_INFO, ": %s (0x%x)", val_to_str_const(error_code, cql_error_names, "Unknown error code"), error_code);
1754 offset += 4;
1755
1756 /* string */
1757 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1758 offset += 2;
1759 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1760 offset += string_length;
1761
1762 if (error_code == CQL_ERROR_WRITE_TIMEOUT || error_code == CQL_ERROR_READ_TIMEOUT || error_code == CQL_ERROR_READ_FAILURE || error_code == CQL_ERROR_WRITE_FAILURE) {
1763 proto_tree_add_item(cql_subtree, hf_cql_consistency, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
1764 offset += 2;
1765 proto_tree_add_item(cql_subtree, hf_cql_error_failure_received, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1766 offset += 4;
1767 proto_tree_add_item(cql_subtree, hf_cql_error_block_for, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1768 offset += 4;
1769
1770 if (error_code == CQL_ERROR_WRITE_TIMEOUT) {
1771 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1772 offset += 2;
1773 proto_tree_add_item(cql_subtree, hf_cql_error_write_type, tvb, offset, string_length, ENC_UTF_80x00000002);
1774 offset += string_length;
Value stored to 'offset' is never read
1775 } else if (error_code == CQL_ERROR_READ_TIMEOUT) {
1776 proto_tree_add_item(cql_subtree, hf_cql_error_data_present, tvb, offset, 1, ENC_NA0x00000000);
1777 offset += 1;
1778 } else if (error_code == CQL_ERROR_READ_FAILURE) {
1779 /* FIXME - in protocol v5, there's a reason_map here instead of num failures as in previous protocols*/
1780 proto_tree_add_item(cql_subtree, hf_cql_error_num_failures, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1781 offset += 4;
1782 proto_tree_add_item(cql_subtree, hf_cql_error_data_present, tvb, offset, 1, ENC_NA0x00000000);
1783 offset += 1;
1784 } else if (error_code == CQL_ERROR_WRITE_FAILURE) {
1785 /* FIXME - in protocol v5, there's a reason_map here instead of num failures as in previous protocols*/
1786 proto_tree_add_item(cql_subtree, hf_cql_error_num_failures, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1787 offset += 4;
1788 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1789 offset += 2;
1790 proto_tree_add_item(cql_subtree, hf_cql_error_write_type, tvb, offset, string_length, ENC_UTF_80x00000002);
1791 offset += string_length;
1792 }
1793 }
1794 break;
1795
1796
1797 case CQL_OPCODE_AUTHENTICATE:
1798 cql_conv->frame_start_v5_proto = pinfo->num; /* remember the frame number where we got past initial negotiation */
1799 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message AUTHENTICATE");
1800
1801 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1802 offset += 2;
1803 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1804 break;
1805
1806
1807 case CQL_OPCODE_SUPPORTED:
1808 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message SUPPORTED");
1809 uint32_t multimap_count, value_count;
1810
1811 /* string multimap */
1812 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_value_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &multimap_count);
1813 offset += 2;
1814 for (k = 0; k < multimap_count; ++k) {
1815 /* key - string */
1816 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1817 offset += 2;
1818 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1819 offset += string_length;
1820
1821 /* value - string list */
1822 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_list_size, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &value_count);
1823 offset += 2;
1824 for(i = 0; i < value_count; ++i) {
1825 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1826 offset += 2;
1827 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1828 offset += string_length;
1829 }
1830 }
1831 break;
1832
1833
1834 case CQL_OPCODE_RESULT:
1835 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message RESULT");
1836
1837 if (flags & CQL_HEADER_FLAG_CUSTOM_PAYLOAD) {
1838 uint32_t bytesmap_count;
1839 cust_payload_tree = proto_tree_add_subtree(cql_subtree, tvb, offset, 0, ett_cql_custom_payload, NULL((void*)0), "Custom Payload");
1840 proto_tree_add_item_ret_uint(cust_payload_tree, hf_cql_value_count, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &bytesmap_count);
1841 offset += 2;
1842 for(k = 0; k < bytesmap_count; ++k) {
1843 proto_tree_add_item_ret_uint(cust_payload_tree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1844 offset += 2;
1845 proto_tree_add_item(cust_payload_tree, hf_cql_bytesmap_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1846 offset += string_length;
1847 if (bytes_length > 0) {
1848 proto_tree_add_item(cust_payload_tree, hf_cql_bytes, tvb, offset, bytes_length, ENC_NA0x00000000);
1849 offset += bytes_length;
1850 }
1851 }
1852 return offset;
1853 }
1854
1855 proto_tree_add_item_ret_int(cql_subtree, hf_cql_result_kind, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_kind);
1856 col_append_fstr(pinfo->cinfo, COL_INFO, ": %s", val_to_str_const(result_kind, cql_result_kind_names, "Unknown kind"));
1857 offset += 4;
1858
1859 switch (result_kind) {
1860 case CQL_RESULT_KIND_VOID:
1861 /* Nothing */
1862 break;
1863
1864 case CQL_RESULT_KIND_ROWS:
1865 metadata_subtree = proto_tree_add_subtree(cql_subtree, tvb, offset, 0, ett_cql_result_metadata, &ti, "Rows Result Metadata");
1866 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_result_rows_flags_values, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_rows_flags);
1867 proto_tree_add_item(metadata_subtree, hf_cql_result_rows_flag_global_tables_spec, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1868 proto_tree_add_item(metadata_subtree, hf_cql_result_rows_flag_has_more_pages, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1869 proto_tree_add_item(metadata_subtree, hf_cql_result_rows_flag_no_metadata, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1870 offset += 4;
1871
1872 ti = proto_tree_add_item_ret_int(metadata_subtree, hf_cql_result_rows_column_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_rows_columns_count);
1873 if (result_rows_columns_count < 0) {
1874 expert_add_info(pinfo, ti, &ei_cql_unexpected_negative_value);
1875 return tvb_reported_length(tvb);
1876 }
1877 offset += 4;
1878
1879 offset = parse_result_metadata_more_pages(metadata_subtree, tvb, offset, result_rows_flags);
1880
1881 offset_row_metadata = offset;
1882 offset = parse_result_metadata(metadata_subtree, pinfo, tvb, offset, result_rows_flags, result_rows_columns_count);
1883 if (offset == offset_row_metadata) {
1884 /* there was no col spec, no row metadata available */
1885 offset_row_metadata = 0;
1886 }
1887
1888 rows_subtree = proto_tree_add_subtree(cql_subtree, tvb, offset, 0, ett_cql_result_rows, &ti, "Rows");
1889 ti = proto_tree_add_item_ret_int(rows_subtree, hf_cql_result_rows_row_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_rows_row_count);
1890 if (result_rows_row_count < 0) {
1891 expert_add_info(pinfo, ti, &ei_cql_unexpected_negative_value);
1892 return tvb_reported_length(tvb);
1893 }
1894 col_append_fstr(pinfo->cinfo, COL_INFO, " (%d rows)", result_rows_row_count);
1895 offset += 4;
1896
1897 if (result_rows_columns_count) {
1898 for (j = 0; j < result_rows_row_count; ++j) {
1899 columns_subtree = proto_tree_add_subtree(rows_subtree, tvb, offset, 0, ett_cql_result_columns, &ti, "Data (columns)");
1900 proto_item_append_text(columns_subtree, " for row # %" PRId64"l" "d", j + 1);
1901
1902 if (offset_row_metadata) {
1903 offset = parse_row(columns_subtree, pinfo, tvb, offset_row_metadata, offset, result_rows_columns_count, result_rows_flags);
1904 } else {
1905 for (k = 0; k < result_rows_columns_count; ++k) {
1906 proto_tree_add_item_ret_int(columns_subtree, hf_cql_bytes_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &bytes_length);
1907 offset += 4;
1908 if (bytes_length >= 0) { /* do not display if there's no column data. If there is NULL or not set - do display it */
1909 single_column_subtree = proto_tree_add_subtree(columns_subtree, tvb, offset, bytes_length > 0 ? bytes_length : 0, ett_cql_results_no_metadata, &ti, "Column data");
1910 }
1911 if (bytes_length > 0) {
1912 proto_item_append_text(single_column_subtree, " for column # %" PRId64"l" "d", k + 1);
1913 proto_tree_add_item(single_column_subtree, hf_cql_bytes, tvb, offset, bytes_length, ENC_NA0x00000000);
1914 offset += bytes_length;
1915 } else if (bytes_length == -1) {
1916 proto_item_append_text(single_column_subtree, " is NULL for column # %" PRId64"l" "d", k + 1);
1917 } else if (bytes_length == -2) {
1918 proto_item_append_text(single_column_subtree, " is not set for column # %" PRId64"l" "d", k + 1);
1919 } else if (bytes_length == 0) {
1920 proto_item_append_text(single_column_subtree, " is empty for column # %" PRId64"l" "d", k + 1);
1921 } else {
1922 expert_add_info(pinfo, ti, &ei_cql_unexpected_negative_value);
1923 return tvb_reported_length(tvb);
1924 }
1925 }
1926 }
1927 }
1928 }
1929
1930 break;
1931
1932 case CQL_RESULT_KIND_SET_KEYSPACE:
1933 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &string_length);
1934 offset += 2;
1935 proto_tree_add_item(cql_subtree, hf_cql_string, tvb, offset, string_length, ENC_UTF_80x00000002);
1936 break;
1937
1938
1939 case CQL_RESULT_KIND_PREPARED:
1940 /* <id><metadata><result_metadata> or <id><metadata_id><result_metadata> for protocol version 5*/
1941
1942 /* Query ID */
1943 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1944 offset += 2;
1945 proto_tree_add_item(cql_subtree, hf_cql_query_id, tvb, offset, short_bytes_length, ENC_NA0x00000000);
1946 offset += short_bytes_length;
1947
1948 if (cql_conv->protocol_version >= 5) {
1949 /* Metadata ID */
1950 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
1951 offset += 2;
1952 proto_tree_add_item(cql_subtree, hf_cql_query_metadata_id, tvb, offset, short_bytes_length, ENC_NA0x00000000);
1953 offset += short_bytes_length;
1954 }
1955
1956 /* metadata: <flags><columns_count><pk_count>[<pk_index_1>...<pk_index_n>][<global_table_spec>?<col_spec_1>...<col_spec_n>] */
1957 prepared_metadata_subtree = proto_tree_add_subtree(cql_subtree, tvb, offset, 0, ett_cql_result_metadata, &ti, "Prepared Metadata");
1958 proto_tree_add_item_ret_uint(prepared_metadata_subtree, hf_cql_result_prepared_flags_values, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_prepared_flags);
1959 proto_tree_add_item(prepared_metadata_subtree, hf_cql_result_rows_flag_global_tables_spec, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1960 offset += 4;
1961 proto_tree_add_item_ret_int(prepared_metadata_subtree, hf_cql_result_rows_column_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_rows_columns_count);
1962 if (result_rows_columns_count < 0) {
1963 expert_add_info(pinfo, ti, &ei_cql_unexpected_negative_value);
1964 return tvb_reported_length(tvb);
1965 }
1966 offset += 4;
1967
1968 proto_tree_add_item_ret_int(prepared_metadata_subtree, hf_cql_result_prepared_pk_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_prepared_pk_count);
1969 if (result_prepared_pk_count < 0) {
1970 expert_add_info(pinfo, ti, &ei_cql_unexpected_negative_value);
1971 return tvb_reported_length(tvb);
1972 }
1973 offset += 4;
1974
1975 /* TODO: skipping all pk_index elements for now*/
1976 offset += (2 * result_prepared_pk_count);
1977
1978 offset = parse_result_metadata(prepared_metadata_subtree, pinfo, tvb, offset, result_prepared_flags, result_rows_columns_count);
1979
1980 /* <result_metadata> is identical to rows result metadata */
1981 metadata_subtree = proto_tree_add_subtree(cql_subtree, tvb, offset, 0, ett_cql_result_metadata, &ti, "Prepared Result Metadata");
1982 proto_tree_add_item_ret_uint(metadata_subtree, hf_cql_result_rows_flags_values, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_rows_flags);
1983 proto_tree_add_item(metadata_subtree, hf_cql_result_rows_flag_global_tables_spec, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1984 proto_tree_add_item(metadata_subtree, hf_cql_result_rows_flag_has_more_pages, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1985 proto_tree_add_item(metadata_subtree, hf_cql_result_rows_flag_no_metadata, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
1986 offset += 4;
1987
1988 ti = proto_tree_add_item_ret_int(metadata_subtree, hf_cql_result_rows_column_count, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &result_rows_columns_count);
1989 if (result_rows_columns_count < 0) {
1990 expert_add_info(pinfo, ti, &ei_cql_unexpected_negative_value);
1991 return tvb_reported_length(tvb);
1992 }
1993 offset += 4;
1994
1995 offset = parse_result_metadata_more_pages(metadata_subtree, tvb, offset, result_rows_flags);
1996
1997 parse_result_metadata(metadata_subtree, pinfo, tvb, offset, result_rows_flags, result_rows_columns_count);
1998
1999 break;
2000 case CQL_RESULT_KIND_SCHEMA_CHANGE:
2001 /*offset = */parse_result_schema_change(cql_subtree, pinfo, tvb, offset);
2002 break;
2003
2004 default:
2005 proto_tree_add_expert(cql_subtree, pinfo, &ei_cql_data_not_dissected_yet, tvb, 0, message_length);
2006 break;
2007 }
2008
2009 break;
2010
2011
2012 case CQL_OPCODE_EVENT:
2013 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message EVENT");
2014
2015 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_short_bytes_length, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &short_bytes_length);
2016 offset += 2;
2017
2018 proto_tree_add_item_ret_string(cql_subtree, hf_cql_event_type, tvb, offset, short_bytes_length, ENC_UTF_80x00000002, pinfo->pool, &string_event_type);
2019 offset += short_bytes_length;
2020 proto_item_append_text(cql_subtree, " (type: %s)", string_event_type);
2021
2022 if (strcmp(string_event_type, "SCHEMA_CHANGE") == 0) {
2023 /*offset = */parse_result_schema_change(cql_subtree, pinfo, tvb, offset);
2024 } else {
2025 /* TODO: handle "TOPOLOGY_CHANGE" and "STATUS_CHANGE" event types as well*/
2026 }
2027 break;
2028
2029
2030 case CQL_OPCODE_AUTH_CHALLENGE:
2031 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message AUTH_CHALLENGE");
2032
2033 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &string_length);
2034 offset += 4;
2035 proto_tree_add_item(cql_subtree, hf_cql_auth_token, tvb, offset, string_length, ENC_NA0x00000000);
2036 break;
2037
2038
2039 case CQL_OPCODE_AUTH_SUCCESS:
2040 cql_subtree = proto_tree_add_subtree(cql_tree, tvb, offset, message_length, ett_cql_message, &ti, "Message AUTH_SUCCESS");
2041
2042 proto_tree_add_item_ret_uint(cql_subtree, hf_cql_string_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &string_length);
2043 offset += 4;
2044 if (string_length > 0) {
2045 proto_tree_add_item(cql_subtree, hf_cql_auth_token, tvb, offset, string_length, ENC_NA0x00000000);
2046 }
2047 break;
2048
2049 case CQL_OPCODE_READY:
2050 cql_conv->frame_start_v5_proto = pinfo->num; /* remember the frame number where we got past initial negotiation */
2051 /* body should be empty */
2052 break;
2053
2054 default:
2055 proto_tree_add_expert(cql_subtree, pinfo, &ei_cql_data_not_dissected_yet, tvb, 0, message_length);
2056 break;
2057 }
2058 }
2059
2060 return tvb_reported_length(tvb);
2061}
2062
2063static int
2064dissect_cql_tcp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data)
2065{
2066 uint8_t version;
2067 conversation_t* conversation;
2068 cql_conversation_type* cql_conv;
2069
2070 /* This dissector version only understands CQL protocol v3, v4, v5. */
2071 if (tvb_reported_length(tvb) < 1)
2072 return 0;
2073
2074 conversation = find_conversation_pinfo(pinfo, 0);
2075 if (conversation) {
2076 cql_conv = (cql_conversation_type*) conversation_get_proto_data(conversation, proto_cql);
2077 if (cql_conv && cql_conv->protocol_version == 5) {
2078 if (cql_conv->frame_start_v5_proto != 0 && pinfo->num > cql_conv->frame_start_v5_proto) {
2079 /* if we are already in v5 and negotiation is done, use the stored compression level */
2080 if (cql_conv->compression_level == CQL_COMPRESSION_NONE) {
2081 tcp_dissect_pdus(tvb, pinfo, tree, cql_desegment, 3 /* bytes to determine length of PDU */, get_cql5_non_comp_pdu_len, dissect_cql5_uncomp, data);
2082 } else if (cql_conv->compression_level == CQL_COMPRESSION_LZ4) {
2083 tcp_dissect_pdus(tvb, pinfo, tree, cql_desegment, 3 /* bytes to determine length of PDU */, get_cql5_comp_pdu_len, dissect_cql5_comp, data);
2084 } else {
2085 /* unknown compression level, should not happen */
2086 return 0;
2087 }
2088 } else {
2089 /* negotiation not done yet, we treat it as pre-v5 frames */
2090 tcp_dissect_pdus(tvb, pinfo, tree, cql_desegment, 9 /* bytes to determine length of PDU */, get_cql_pdu_len, dissect_cql_tcp_pdu, data);
2091 }
2092 } else { /* pre CQLv5 protocol versions */
2093 tcp_dissect_pdus(tvb, pinfo, tree, cql_desegment, 9 /* bytes to determine length of PDU */, get_cql_pdu_len, dissect_cql_tcp_pdu, data);
2094 }
2095 } else {
2096 version = tvb_get_uint8(tvb, 0) & 0x7F;
2097 if ((version != 3 && version != 4 && version != 5)) /* this might fail if we are catching CQLv5 mid-stream, so be it */
2098 return 0;
2099
2100 tcp_dissect_pdus(tvb, pinfo, tree, cql_desegment, 9 /* bytes to determine length of PDU */, get_cql_pdu_len, dissect_cql_tcp_pdu, data);
2101 }
2102
2103 return tvb_reported_length(tvb);
2104}
2105
2106void
2107proto_reg_handoff_cql(void)
2108{
2109 dissector_add_uint_with_preference("tcp.port", CQL_DEFAULT_PORT9042, find_dissector("cql"));
2110}
2111
2112
2113void
2114proto_register_cql(void)
2115{
2116 expert_module_t* expert_cql;
2117 static hf_register_info hf[] = {
2118 {
2119 &hf_cql_batch_flag_serial_consistency,
2120 {
2121 "Serial Consistency", "cql.batch.flags.serial_consistency",
2122 FT_BOOLEAN, 8,
2123 NULL((void*)0), CQL_BATCH_FLAG_SERIAL_CONSISTENCY,
2124 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2125 }
2126 },
2127 {
2128 &hf_cql_batch_flag_default_timestamp,
2129 {
2130 "Default Timestamp", "cql.batch.flags.default_timestamp",
2131 FT_BOOLEAN, 8,
2132 NULL((void*)0), CQL_BATCH_FLAG_DEFAULT_TIMESTAMP,
2133 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2134 }
2135 },
2136 {
2137 &hf_cql_batch_flag_with_name_for_values,
2138 {
2139 "With Name For Value", "cql.batch.flags.with_name_for_values",
2140 FT_BOOLEAN, 8,
2141 NULL((void*)0), CQL_BATCH_FLAG_WITH_NAME_FOR_VALUES,
2142 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2143 }
2144 },
2145 {
2146 &hf_cql_batch_flags_bitmap,
2147 {
2148 "Flags", "cql.batch.flags",
2149 FT_UINT8, BASE_HEX,
2150 NULL((void*)0), 0x0,
2151 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2152 }
2153 },
2154 {
2155 &hf_cql_version,
2156 {
2157 "Version", "cql.version",
2158 FT_UINT8, BASE_HEX,
2159 NULL((void*)0), 0x0,
2160 "CQL protocol version (not language version)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2161 }
2162 },
2163 {
2164 &hf_cql_protocol_version,
2165 {
2166 "Protocol version", "cql.protocol_version",
2167 FT_UINT8, BASE_DEC,
2168 NULL((void*)0), 0x0F,
2169 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2170 }
2171 },
2172 {
2173 &hf_cql_direction,
2174 {
2175 "Direction", "cql.direction",
2176 FT_UINT8, BASE_HEX,
2177 VALS(cql_direction_names)((0 ? (const struct _value_string*)0 : ((cql_direction_names)
)))
, 0xF0,
2178 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2179 }
2180 },
2181 {
2182 &hf_cql_flags_bitmap,
2183 {
2184 "Flags", "cql.flags",
2185 FT_UINT8, BASE_HEX,
2186 NULL((void*)0), 0x0,
2187 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2188 }
2189 },
2190 {
2191 &hf_cql_result_rows_flags_values,
2192 {
2193 "Rows Result Flags", "cql.result.rows.flags",
2194 FT_UINT32, BASE_DEC,
2195 NULL((void*)0), 0x0,
2196 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2197 }
2198 },
2199 {
2200 &hf_cql_result_prepared_flags_values,
2201 {
2202 "Prepared Result Flags", "cql.result.prepared.flags",
2203 FT_UINT32, BASE_DEC,
2204 NULL((void*)0), 0x0,
2205 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2206 }
2207 },
2208 {
2209 &hf_cql_result_rows_flag_global_tables_spec,
2210 {
2211 "Global tables spec.", "cql.result.rows.flags.global_tables",
2212 FT_BOOLEAN, 32,
2213 NULL((void*)0), CQL_RESULT_ROWS_FLAG_GLOBAL_TABLES_SPEC,
2214 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2215 }
2216 },
2217 {
2218 &hf_cql_result_rows_flag_has_more_pages,
2219 {
2220 "Has More Pages", "cql.result.rows.flags.has_more_pages",
2221 FT_BOOLEAN, 32,
2222 NULL((void*)0), CQL_RESULT_ROWS_FLAG_HAS_MORE_PAGES,
2223 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2224 }
2225 },
2226 {
2227 &hf_cql_result_rows_flag_no_metadata,
2228 {
2229 "No Metadata", "cql.result.rows.flags.no_metadata",
2230 FT_BOOLEAN, 32,
2231 NULL((void*)0), CQL_RESULT_ROWS_FLAG_NO_METADATA,
2232 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2233 }
2234 },
2235 {
2236 &hf_cql_flag_compression,
2237 {
2238 "Compression", "cql.flags.compression",
2239 FT_BOOLEAN, 8,
2240 NULL((void*)0), CQL_HEADER_FLAG_COMPRESSION,
2241 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2242 }
2243 },
2244 {
2245 &hf_cql_flag_tracing,
2246 {
2247 "Tracing", "cql.flags.tracing",
2248 FT_BOOLEAN, 8,
2249 NULL((void*)0), CQL_HEADER_FLAG_TRACING,
2250 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2251 }
2252 },
2253 {
2254 &hf_cql_flag_custom_payload,
2255 {
2256 "Custom Payload", "cql.flags.custom_payload",
2257 FT_BOOLEAN, 8,
2258 NULL((void*)0), CQL_HEADER_FLAG_CUSTOM_PAYLOAD,
2259 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2260 }
2261 },
2262 {
2263 &hf_cql_flag_warning,
2264 {
2265 "Warning", "cql.flags.warning",
2266 FT_BOOLEAN, 8,
2267 NULL((void*)0), CQL_HEADER_FLAG_WARNING,
2268 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2269 }
2270 },
2271 {
2272 &hf_cql_flag_reserved3,
2273 {
2274 "Reserved", "cql.flags.reserved",
2275 FT_UINT8, BASE_HEX,
2276 NULL((void*)0), CQL_HEADER_FLAG_V3_RESERVED,
2277 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2278 }
2279 },
2280 {
2281 &hf_cql_flag_reserved4,
2282 {
2283 "Reserved", "cql.flags.reserved",
2284 FT_UINT8, BASE_HEX,
2285 NULL((void*)0), CQL_HEADER_FLAG_V4_RESERVED,
2286 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2287 }
2288 },
2289 {
2290 &hf_cql_flag_beta,
2291 {
2292 "Beta", "cql.flags.beta",
2293 FT_UINT8, BASE_HEX,
2294 NULL((void*)0), CQL_HEADER_FLAG_BETA,
2295 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2296 }
2297 },
2298 {
2299 &hf_cql_query_flags_page_size,
2300 {
2301 "Page Size", "cql.query.flags.page_size",
2302 FT_BOOLEAN, 8,
2303 NULL((void*)0), CQL_QUERY_FLAG_PAGE_SIZE,
2304 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2305 }
2306 },
2307 {
2308 &hf_cql_query_v5_flags_page_size,
2309 {
2310 "Page Size", "cql.queryv5.flags.page_size",
2311 FT_BOOLEAN, 32,
2312 NULL((void*)0), CQL_QUERY_FLAG_PAGE_SIZE,
2313 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2314 }
2315 },
2316 {
2317 &hf_cql_query_flags_skip_metadata,
2318 {
2319 "Skip Metadata", "cql.query.flags.skip_metadata",
2320 FT_BOOLEAN, 8,
2321 NULL((void*)0), CQL_QUERY_FLAG_SKIP_METADATA,
2322 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2323 }
2324 },
2325 {
2326 &hf_cql_query_v5_flags_skip_metadata,
2327 {
2328 "Skip Metadata", "cql.queryv5.flags.skip_metadata",
2329 FT_BOOLEAN, 32,
2330 NULL((void*)0), CQL_QUERY_FLAG_SKIP_METADATA,
2331 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2332 }
2333 },
2334 {
2335 &hf_cql_query_flags_values,
2336 {
2337 "Values", "cql.query.flags.values",
2338 FT_BOOLEAN, 8,
2339 NULL((void*)0), CQL_QUERY_FLAG_VALUES,
2340 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2341 }
2342 },
2343 {
2344 &hf_cql_query_v5_flags_values,
2345 {
2346 "Values", "cql.queryv5.flags.values",
2347 FT_BOOLEAN, 32,
2348 NULL((void*)0), CQL_QUERY_FLAG_VALUES,
2349 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2350 }
2351 },
2352 {
2353 &hf_cql_query_flags_default_timestamp,
2354 {
2355 "Default Timestamp", "cql.query.flags.default_timestamp",
2356 FT_BOOLEAN, 8,
2357 NULL((void*)0), CQL_QUERY_FLAG_DEFAULT_TIMESTAMP,
2358 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2359 }
2360 },
2361 {
2362 &hf_cql_query_v5_flags_default_timestamp,
2363 {
2364 "Default Timestamp", "cql.queryv5.flags.default_timestamp",
2365 FT_BOOLEAN, 32,
2366 NULL((void*)0), CQL_QUERY_FLAG_DEFAULT_TIMESTAMP,
2367 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2368 }
2369 },
2370 {
2371 &hf_cql_query_flags_names_for_values,
2372 {
2373 "Names for Values", "cql.query.flags.value_names",
2374 FT_BOOLEAN, 8,
2375 NULL((void*)0), CQL_QUERY_FLAG_VALUE_NAMES,
2376 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2377 }
2378 },
2379 {
2380 &hf_cql_query_v5_flags_names_for_values,
2381 {
2382 "Names for Values", "cql.queryv5.flags.value_names",
2383 FT_BOOLEAN, 32,
2384 NULL((void*)0), CQL_QUERY_FLAG_VALUE_NAMES,
2385 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2386 }
2387 },
2388 {
2389 &hf_cql_query_flags_paging_state,
2390 {
2391 "Paging State", "cql.query.flags.paging_state",
2392 FT_BOOLEAN, 8,
2393 NULL((void*)0), CQL_QUERY_FLAG_PAGING_STATE,
2394 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2395 }
2396 },
2397 {
2398 &hf_cql_query_v5_flags_paging_state,
2399 {
2400 "Paging State", "cql.query.flags.paging_state",
2401 FT_BOOLEAN, 32,
2402 NULL((void*)0), CQL_QUERY_FLAG_PAGING_STATE,
2403 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2404 }
2405 },
2406 {
2407 &hf_cql_query_flags_serial_consistency,
2408 {
2409 "Serial Consistency", "cql.query.flags.serial_consistency",
2410 FT_BOOLEAN, 8,
2411 NULL((void*)0), CQL_QUERY_FLAG_SERIAL_CONSISTENCY,
2412 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2413 }
2414 },
2415 {
2416 &hf_cql_query_v5_flags_serial_consistency,
2417 {
2418 "Serial Consistency", "cql.queryv5.flags.serial_consistency",
2419 FT_BOOLEAN, 32,
2420 NULL((void*)0), CQL_QUERY_FLAG_SERIAL_CONSISTENCY,
2421 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2422 }
2423 },
2424 {
2425 &hf_cql_query_v5_flags_with_keyspace,
2426 {
2427 "With Keyspace", "cql.queryv5.flags.with_keyspace",
2428 FT_BOOLEAN, 32,
2429 NULL((void*)0), CQL_QUERY_FLAG_WITH_KEYSPACE,
2430 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2431 }
2432 },
2433 {
2434 &hf_cql_query_v5_flags_now_in_seconds,
2435 {
2436 "Now in Seconds", "cql.queryv5.flags.now_in_seconds",
2437 FT_BOOLEAN, 32,
2438 NULL((void*)0), CQL_QUERY_FLAG_NOW_IN_SECONDS,
2439 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2440 }
2441 },
2442 {
2443 &hf_cql_stream,
2444 {
2445 "Stream Identifier", "cql.stream",
2446 FT_INT16, BASE_DEC,
2447 NULL((void*)0), 0x0,
2448 "Stream identifier this packet belongs to", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2449 }
2450 },
2451 {
2452 &hf_cql_opcode,
2453 {
2454 "Opcode", "cql.opcode",
2455 FT_UINT8, BASE_DEC,
2456 VALS(cql_opcode_names)((0 ? (const struct _value_string*)0 : ((cql_opcode_names)))), 0x7F, /* Mask the highest-order bit because it indicates message direction, not opcode. */
2457 "CQL operation this packet describes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2458 }
2459 },
2460 {
2461 &hf_cql_batch_type,
2462 {
2463 "Batch type", "cql.batch_type",
2464 FT_UINT8, BASE_DEC,
2465 VALS(cql_batch_type_names)((0 ? (const struct _value_string*)0 : ((cql_batch_type_names
))))
, 0x0,
2466 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2467 }
2468 },
2469 {
2470 &hf_cql_batch_query_type,
2471 {
2472 "Batch query type", "cql.batch_query_type",
2473 FT_UINT8, BASE_DEC,
2474 VALS(cql_batch_query_type_names)((0 ? (const struct _value_string*)0 : ((cql_batch_query_type_names
))))
, 0x00,
2475 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2476 }
2477 },
2478 {
2479 &hf_cql_length,
2480 {
2481 "Message Length", "cql.message_length",
2482 FT_UINT32, BASE_DEC,
2483 NULL((void*)0), 0x0,
2484 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2485 }
2486 },
2487 {
2488 &hf_cql5_compressed_length,
2489 {
2490 "Compressed Message Length", "cql.v5_message_length.compressed",
2491 FT_UINT32, BASE_DEC,
2492 NULL((void*)0), 0x0,
2493 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2494 }
2495 },
2496 {
2497 &hf_cql5_uncompressed_length,
2498 {
2499 "Uncompressed Message Length", "cql.v5_message_length.uncompressed",
2500 FT_UINT32, BASE_DEC,
2501 NULL((void*)0), 0x0,
2502 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2503 }
2504 },
2505 {
2506 &hf_cql5_header,
2507 {
2508 "CQLv5 Header", "cql.v5_header",
2509 FT_NONE, BASE_NONE,
2510 NULL((void*)0), 0x0,
2511 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2512 }
2513 },
2514 {
2515 &hf_cql5_self_contained,
2516 {
2517 "Self-Contained Flag", "cql.v5_is_self_contained",
2518 FT_BOOLEAN, BASE_NONE,
2519 NULL((void*)0), 0x0,
2520 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2521 }
2522 },
2523 {
2524 &hf_cql5_crc24,
2525 {
2526 "Header CRC24", "cql.v5_crc24",
2527 FT_UINT24, BASE_HEX,
2528 NULL((void*)0), 0x0,
2529 "CRC24 checksum of the header", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2530 }
2531 },
2532 {
2533 &hf_cql5_crc32,
2534 {
2535 "Payload CRC32", "cql.v5_crc32",
2536 FT_UINT32, BASE_HEX,
2537 NULL((void*)0), 0x0,
2538 "CRC32 checksum of the frame payload", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2539 }
2540 },
2541 {
2542 &hf_cql_string_map_size,
2543 {
2544 "String Map Size", "cql.string_map_size",
2545 FT_UINT16, BASE_DEC,
2546 NULL((void*)0), 0x0,
2547 "Number of strings in the map", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2548 }
2549 },
2550 {
2551 &hf_cql_string_list_size,
2552 {
2553 "String List Size", "cql.string_list_size",
2554 FT_UINT16, BASE_DEC,
2555 NULL((void*)0), 0x0,
2556 "Number of strings in the list", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2557 }
2558 },
2559 {
2560 &hf_cql_string,
2561 {
2562 "String", "cql.string",
2563 FT_STRING, BASE_NONE,
2564 NULL((void*)0), 0x0,
2565 "UTF-8 string value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2566 }
2567 },
2568 {
2569 /* TODO: should this be an FT_STRING field? */
2570 &hf_cql_auth_token,
2571 {
2572 "Auth Token", "cql.auth_token",
2573 FT_BYTES, BASE_NONE,
2574 NULL((void*)0), 0x0,
2575 "[bytes] auth token", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2576 }
2577 },
2578 {
2579 &hf_cql_string_result_rows_global_table_spec_ksname,
2580 {
2581 "Global Spec Keyspace Name", "cql.result.rows.keyspace_name",
2582 FT_STRING, BASE_NONE,
2583 NULL((void*)0), 0x0,
2584 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2585 }
2586 },
2587 {
2588 &hf_cql_string_result_rows_global_table_spec_table_name,
2589 {
2590 "Global Spec Table Name", "cql.result.rows.table_name",
2591 FT_STRING, BASE_NONE,
2592 NULL((void*)0), 0x0,
2593 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2594 }
2595 },
2596 {
2597 &hf_cql_string_result_rows_table_name,
2598 {
2599 "Table Name", "cql.result.rows.table_name",
2600 FT_STRING, BASE_NONE,
2601 NULL((void*)0), 0x0,
2602 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2603 }
2604 },
2605 {
2606 &hf_cql_string_result_rows_udt_name,
2607 {
2608 "User Defined Type Name", "cql.result.rows.udt_name",
2609 FT_STRING, BASE_NONE,
2610 NULL((void*)0), 0x0,
2611 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2612 }
2613 },
2614 {
2615 &hf_cql_string_result_rows_udt_field_name,
2616 {
2617 "User Defined Type field Name", "cql.result.rows.udt_field_name",
2618 FT_STRING, BASE_NONE,
2619 NULL((void*)0), 0x0,
2620 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2621 }
2622 },
2623 {
2624 &hf_cql_string_result_rows_udt_size,
2625 {
2626 "User Defined Type Size", "cql.result.rows.udt_size",
2627 FT_UINT16, BASE_DEC,
2628 NULL((void*)0), 0x0,
2629 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2630 }
2631 },
2632 {
2633 &hf_cql_string_result_rows_list_size,
2634 {
2635 "List Size", "cql.result.rows.list_size",
2636 FT_INT32, BASE_DEC,
2637 NULL((void*)0), 0x0,
2638 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2639 }
2640 },
2641 {
2642 &hf_cql_string_result_rows_map_size,
2643 {
2644 "No. of key/value pairs in map", "cql.result.rows.map_size",
2645 FT_INT32, BASE_DEC,
2646 NULL((void*)0), 0x0,
2647 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2648 }
2649 },
2650 {
2651 &hf_cql_string_result_rows_set_size,
2652 {
2653 "Set Size", "cql.result.rows.set_size",
2654 FT_INT32, BASE_DEC,
2655 NULL((void*)0), 0x0,
2656 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2657 }
2658 },
2659 {
2660 &hf_cql_string_result_rows_keyspace_name,
2661 {
2662 "Keyspace Name", "cql.result.rows.keyspace_name",
2663 FT_STRING, BASE_NONE,
2664 NULL((void*)0), 0x0,
2665 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2666 }
2667 },
2668 {
2669 &hf_cql_bytesmap_string,
2670 {
2671 "Key", "cql.bytesmap.key",
2672 FT_STRING, BASE_NONE,
2673 NULL((void*)0), 0x0,
2674 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2675 }
2676 },
2677 {
2678 &hf_cql_string_result_rows_column_name,
2679 {
2680 "Column Name", "cql.result.rows.column_name",
2681 FT_STRING, BASE_NONE,
2682 NULL((void*)0), 0x0,
2683 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2684 }
2685 },
2686 {
2687 &hf_cql_string_length,
2688 {
2689 "String Length", "cql.string_length",
2690 FT_UINT32, BASE_DEC,
2691 NULL((void*)0), 0x0,
2692 "Length of the subsequent string value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2693 }
2694 },
2695 {
2696 &hf_cql_consistency,
2697 {
2698 "Consistency", "cql.consistency",
2699 FT_UINT16, BASE_HEX,
2700 VALS(cql_consistency_names)((0 ? (const struct _value_string*)0 : ((cql_consistency_names
))))
, 0x0,
2701 "CQL consistency level specification", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2702 }
2703 },
2704 { &hf_cql_error_failure_received,
2705 {
2706 "Error Failure Received", "cql.error_failure_received",
2707 FT_UINT32, BASE_DEC,
2708 NULL((void*)0), 0x0,
2709 "Number of nodes answered (read) / failed (write)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2710 }
2711 },
2712 { &hf_cql_error_block_for,
2713 {
2714 "Error Block For", "cql.error_block_for",
2715 FT_UINT32, BASE_DEC,
2716 NULL((void*)0), 0x0,
2717 "Number of replica responss required to achieve CL", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2718 }
2719 },
2720 { &hf_cql_error_num_failures,
2721 {
2722 "Error Num Failures", "cql.error_num_failures",
2723 FT_UINT32, BASE_DEC,
2724 NULL((void*)0), 0x0,
2725 "Number of nodes experienced failure", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2726 }
2727 },
2728 { &hf_cql_error_data_present,
2729 {
2730 "Error data present flag", "cql.error_data_present",
2731 FT_UINT8, BASE_DEC,
2732 NULL((void*)0), 0x0,
2733 "Replica responded or not", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2734 }
2735 },
2736 { &hf_cql_error_write_type,
2737 {
2738 "Error Write Type", "cql.error_write_type",
2739 FT_STRING, BASE_NONE,
2740 NULL((void*)0), 0x0,
2741 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2742 }
2743 },
2744 {
2745 &hf_cql_value_count,
2746 {
2747 "Value count", "cql.value_count",
2748 FT_UINT16, BASE_DEC,
2749 NULL((void*)0), 0x0,
2750 "Number of subsequent values", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2751 }
2752 },
2753 {
2754 &hf_cql_bytes_length,
2755 {
2756 "Bytes length", "cql.bytes_length.int",
2757 FT_INT32, BASE_DEC,
2758 NULL((void*)0), 0x0,
2759 "Number of subsequent bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2760 }
2761 },
2762 {
2763 &hf_cql_short_bytes_length,
2764 {
2765 "Bytes length", "cql.bytes_length.short",
2766 FT_UINT16, BASE_DEC,
2767 NULL((void*)0), 0x0,
2768 "Number of subsequent bytes", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2769 }
2770 }, {
2771 &hf_cql_bytes,
2772 {
2773 "Bytes", "cql.bytes",
2774 FT_BYTES, BASE_NONE,
2775 NULL((void*)0), 0x0,
2776 "Raw byte array", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2777 }
2778 },
2779 {
2780 &hf_cql_bigint,
2781 {
2782 "Bigint", "cql.bigint",
2783 FT_INT64, BASE_DEC,
2784 NULL((void*)0), 0x0,
2785 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2786 }
2787 },
2788 {
2789 &hf_cql_scale,
2790 {
2791 "Scale", "cql.scale",
2792 FT_INT32, BASE_DEC,
2793 NULL((void*)0), 0x0,
2794 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2795 }
2796 },
2797 {
2798 &hf_cql_ascii,
2799 {
2800 "Ascii", "cql.ascii",
2801 FT_STRING, BASE_NONE,
2802 NULL((void*)0), 0x0,
2803 "An Ascii string", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2804 }
2805 },
2806 {
2807 &hf_cql_double,
2808 {
2809 "Double float", "cql.double",
2810 FT_DOUBLE, BASE_NONE,
2811 NULL((void*)0), 0x0,
2812 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2813 }
2814 },
2815 {
2816 &hf_cql_float,
2817 {
2818 "Float", "cql.float",
2819 FT_FLOAT, BASE_NONE,
2820 NULL((void*)0), 0x0,
2821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2822 }
2823 },
2824 {
2825 &hf_cql_int,
2826 {
2827 "Int", "cql.int",
2828 FT_INT32, BASE_DEC,
2829 NULL((void*)0), 0x0,
2830 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2831 }
2832 },
2833 {
2834 &hf_cql_varint_count8,
2835 {
2836 "Varint", "cql.varint",
2837 FT_UINT8, BASE_DEC,
2838 NULL((void*)0), 0x0,
2839 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2840 },
2841 },
2842 {
2843 &hf_cql_varint_count16,
2844 {
2845 "Varint", "cql.varint",
2846 FT_UINT16, BASE_DEC,
2847 NULL((void*)0), 0x0,
2848 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2849 },
2850 },
2851 {
2852 &hf_cql_varint_count32,
2853 {
2854 "Varint", "cql.varint",
2855 FT_UINT32, BASE_DEC,
2856 NULL((void*)0), 0x0,
2857 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2858 },
2859 },
2860 {
2861 &hf_cql_varint_count64,
2862 {
2863 "Varint", "cql.varint64",
2864 FT_UINT64, BASE_DEC,
2865 NULL((void*)0), 0x0,
2866 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2867 },
2868 },
2869 {
2870 &hf_cql_varchar,
2871 {
2872 "Varchar", "cql.varchar",
2873 FT_STRING, BASE_NONE,
2874 NULL((void*)0), 0x0,
2875 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2876 }
2877 },
2878 {
2879 &hf_cql_timeuuid,
2880 {
2881 "Time Uuid", "cql.timeuuid",
2882 FT_GUID, BASE_NONE,
2883 NULL((void*)0), 0x0,
2884 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2885 }
2886 },
2887 {
2888 &hf_cql_custom,
2889 {
2890 "Custom", "cql.custom",
2891 FT_STRING, BASE_NONE,
2892 NULL((void*)0), 0x0,
2893 "A custom field", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2894 }
2895 },
2896 {
2897 &hf_cql_null_value,
2898 {
2899 "NULL value", "cql.null_value",
2900 FT_NONE, BASE_NONE,
2901 NULL((void*)0), 0x0,
2902 "A NULL value", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2903 }
2904 },
2905 {
2906 &hf_cql_raw_compressed_bytes,
2907 {
2908 "Raw compressed bytes", "cql.raw_compressed_bytes",
2909 FT_BYTES, BASE_NONE,
2910 NULL((void*)0), 0x0,
2911 "Raw byte that failed to be decompressed", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2912 }
2913 },
2914
2915 {
2916 &hf_cql_paging_state,
2917 {
2918 "Paging State", "cql.paging_state",
2919 FT_BYTES, BASE_NONE,
2920 NULL((void*)0), 0x0,
2921 "Paging state byte array", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2922 }
2923 },
2924 {
2925 &hf_cql_page_size,
2926 {
2927 "Page size", "cql.page_size",
2928 FT_INT32, BASE_DEC,
2929 NULL((void*)0), 0x0,
2930 "Desired page size of result (in CQL3 rows)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2931 }
2932 },
2933 {
2934 &hf_cql_response_in,
2935 {
2936 "Response in", "cql.response_in",
2937 FT_FRAMENUM, BASE_NONE,
2938 FRAMENUM_TYPE(FT_FRAMENUM_RESPONSE)((gpointer) (glong) (FT_FRAMENUM_RESPONSE)), 0x0,
2939 "The response to this CQL request is in this frame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2940 }
2941 },
2942 {
2943 &hf_cql_response_to,
2944 {
2945 "Request in", "cql.response_to",
2946 FT_FRAMENUM, BASE_NONE,
2947 FRAMENUM_TYPE(FT_FRAMENUM_REQUEST)((gpointer) (glong) (FT_FRAMENUM_REQUEST)), 0x0,
2948 "This is a response to the CQL request in this fame", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2949 }
2950 },
2951 {
2952 &hf_cql_response_time,
2953 {
2954 "Response time", "cql.response_time",
2955 FT_RELATIVE_TIME, BASE_NONE,
2956 NULL((void*)0), 0x0,
2957 "The time between the request and the response", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2958 }
2959 },
2960 {
2961 &hf_cql_timestamp,
2962 {
2963 "Timestamp", "cql.timestamp",
2964 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL,
2965 NULL((void*)0), 0x0,
2966 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2967 }
2968 },
2969 {
2970 &hf_cql_query_id,
2971 {
2972 "Query ID", "cql.query_id",
2973 FT_BYTES, BASE_NONE,
2974 NULL((void*)0), 0x0,
2975 "CQL query id resulting from a PREPARE statement", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2976 }
2977 },
2978 {
2979 &hf_cql_query_metadata_id,
2980 {
2981 "Query Metadata ID", "cql.query_metadata_id",
2982 FT_BYTES, BASE_NONE,
2983 NULL((void*)0), 0x0,
2984 "CQL v5 query metadata ID resulting from a PREPARE statement", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2985 }
2986 },
2987 {
2988 &hf_cql_event_type,
2989 {
2990 "Event Type", "cql.event_type",
2991 FT_STRING, BASE_NONE,
2992 NULL((void*)0), 0x0,
2993 "CQL Event Type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
2994 }
2995 },
2996 {
2997 &hf_cql_event_schema_change_type,
2998 {
2999 "Schema change type", "cql.schema_change_type",
3000 FT_STRING, BASE_NONE,
3001 NULL((void*)0), 0x0,
3002 "CQL Schema Change Type", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3003 }
3004 },
3005 {
3006 &hf_cql_event_schema_change_type_target,
3007 {
3008 "Schema change target", "cql.schema_change_target",
3009 FT_STRING, BASE_NONE,
3010 NULL((void*)0), 0x0,
3011 "CQL Schema Change target object", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3012 }
3013 },
3014 {
3015 &hf_cql_event_schema_change_object,
3016 {
3017 "Schema change event object name", "cql.schema_change_object_name",
3018 FT_STRING, BASE_NONE,
3019 NULL((void*)0), 0x0,
3020 "CQL Schema Change object name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3021 }
3022 },
3023 {
3024 &hf_cql_event_schema_change_keyspace,
3025 {
3026 "Schema change event keyspace name", "cql.schema_change_keyspace",
3027 FT_STRING, BASE_NONE,
3028 NULL((void*)0), 0x0,
3029 "CQL Schema Change keyspace name", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3030 }
3031 },
3032 {
3033 &hf_cql_batch_query_size,
3034 {
3035 "Batch Query Size", "cql.batch_query_size",
3036 FT_UINT16, BASE_DEC,
3037 NULL((void*)0), 0x0,
3038 "Number of statements in CQL batch", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3039 }
3040 },
3041 {
3042 &hf_cql_error_code,
3043 {
3044 "Error Code", "cql.error_code",
3045 FT_UINT32, BASE_HEX,
3046 VALS(cql_error_names)((0 ? (const struct _value_string*)0 : ((cql_error_names)))), 0x0,
3047 "Error code from CQL server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3048 }
3049 },
3050 {
3051 &hf_cql_result_kind,
3052 {
3053 "Result Kind", "cql.result.kind",
3054 FT_INT32, BASE_DEC,
3055 VALS(cql_result_kind_names)((0 ? (const struct _value_string*)0 : ((cql_result_kind_names
))))
, 0x0,
3056 "Kind of result from CQL server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3057 }
3058 },
3059 {
3060 &hf_cql_result_rows_column_count,
3061 {
3062 "Column Count", "cql.result.rows.column_count",
3063 FT_INT32, BASE_DEC,
3064 NULL((void*)0), 0x0,
3065 "Count of columns in a rows result from CQL server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3066 }
3067 },
3068 {
3069 &hf_cql_result_prepared_pk_count,
3070 {
3071 "PK Count", "cql.result.prepared.pk_count",
3072 FT_INT32, BASE_DEC,
3073 NULL((void*)0), 0x0,
3074 "Count of Partition Key columns in a Prepared result from CQL server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3075 }
3076 },
3077 {
3078 &hf_cql_result_rows_tuple_size,
3079 {
3080 "Tuple Size", "cql.result.rows.tuple_size",
3081 FT_UINT16, BASE_DEC,
3082 NULL((void*)0), 0x0,
3083 "Size of a tuple rows result from CQL server", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3084 }
3085 },
3086 {
3087 &hf_cql_result_timestamp,
3088 {
3089 "Timestamp (Epoch Time)", "cql.result.timestamp",
3090 FT_INT64, BASE_DEC,
3091 NULL((void*)0), 0x0,
3092 "Timestamp result", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3093 }
3094 },
3095 {
3096 &hf_cql_result_rows_data_type,
3097 {
3098 "CQL Data Type", "cql.data_type",
3099 FT_UINT16, BASE_DEC,
3100 VALS(cql_result_row_type_names)((0 ? (const struct _value_string*)0 : ((cql_result_row_type_names
))))
, 0x0,
3101 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3102 }
3103 },
3104 {
3105 &hf_cql_result_rows_row_count,
3106 {
3107 "CQL Result Rows Count", "cql.result.rows.row_count",
3108 FT_INT32, BASE_DEC,
3109 NULL((void*)0), 0x0,
3110 "Number of rows returned in CQL result", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3111 }
3112 },
3113 {
3114 &hf_cql_uuid,
3115 {
3116 "UUID", "cql.uuid",
3117 FT_GUID, BASE_NONE,
3118 NULL((void*)0), 0x0,
3119 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3120 }
3121 },
3122 {
3123 &hf_cql_tracing_uuid,
3124 {
3125 "Tracing UUID", "cql.tracing_uuid",
3126 FT_GUID, BASE_NONE,
3127 NULL((void*)0), 0x0,
3128 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3129 }
3130 },
3131 {
3132 &hf_cql_port,
3133 {
3134 "Port", "cql.port",
3135 FT_UINT32, BASE_DEC,
3136 NULL((void*)0), 0x0,
3137 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3138 }
3139 },
3140 {
3141 &hf_cql_boolean,
3142 {
3143 "Boolean", "cql.boolean",
3144 FT_BOOLEAN, BASE_NONE,
3145 NULL((void*)0), 0x0,
3146 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3147 }
3148 },
3149 {
3150 &hf_cql_ipv4,
3151 {
3152 "IPV4", "cql.ipv4",
3153 FT_IPv4, BASE_NONE,
3154 NULL((void*)0), 0x0,
3155 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3156 }
3157 },
3158 {
3159 &hf_cql_ipv6,
3160 {
3161 "IPV6", "cql.ipv6",
3162 FT_IPv6, BASE_NONE,
3163 NULL((void*)0), 0x0,
3164 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)
3165 }
3166 },
3167 };
3168
3169 static ei_register_info ei[] = {
3170 { &ei_cql_data_not_dissected_yet,
3171 { "cql.ie_data_not_dissected_yet",
3172 PI_UNDECODED0x05000000, PI_WARN0x00600000, "IE data not dissected yet", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
3173 { &ei_cql_unexpected_negative_value,
3174 { "cql.unexpected_negative_value",
3175 PI_UNDECODED0x05000000, PI_ERROR0x00800000, "Unexpected negative value", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
3176 };
3177
3178 static int* ett[] = {
3179 &ett_cql_protocol,
3180 &ett_cql_version,
3181 &ett_cql_message,
3182 &ett_cql_result_columns,
3183 &ett_cql_results_no_metadata,
3184 &ett_cql_result_map,
3185 &ett_cql_result_set,
3186 &ett_cql_result_metadata,
3187 &ett_cql_result_metadata_colspec,
3188 &ett_cql_result_rows,
3189 &ett_cql_header_flags_bitmap,
3190 &ett_cql_batch_flags_bitmap,
3191 &ett_cql_custom_payload,
3192 &ett_cql5_header
3193 };
3194
3195 proto_cql = proto_register_protocol("Cassandra CQL Protocol", "CQL", "cql" );
3196 register_dissector("cql", dissect_cql_tcp, proto_cql);
3197
3198 proto_register_field_array(proto_cql, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
3199 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
3200
3201 expert_cql = expert_register_protocol(proto_cql);
3202 expert_register_field_array(expert_cql, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
3203}
3204
3205/*
3206 * Editor modelines - https://www.wireshark.org/tools/modelines.html
3207 *
3208 * Local variables:
3209 * c-basic-offset: 8
3210 * tab-width: 8
3211 * indent-tabs-mode: t
3212 * End:
3213 *
3214 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
3215 * :indentSize=8:tabSize=8:noTabs=false:
3216 */