Coverage Report

Created: 2025-12-27 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-ceph.c
Line
Count
Source
1
/* packet-ceph.c
2
 * Routines for Ceph dissection
3
 * Copyright 2014, Kevin Cox <kevincox@kevincox.ca>
4
 *
5
 * Wireshark - Network traffic analyzer
6
 * By Gerald Combs <gerald@wireshark.org>
7
 * Copyright 1998 Gerald Combs
8
 *
9
 * SPDX-License-Identifier: GPL-2.0-or-later
10
 */
11
12
#include "config.h"
13
14
#include <epan/packet.h>
15
#include <epan/expert.h>
16
#include <epan/conversation.h>
17
#include <epan/to_str.h>
18
#include <epan/proto_data.h>
19
#include <epan/tfs.h>
20
21
void proto_reg_handoff_ceph(void);
22
void proto_register_ceph(void);
23
24
/* Extending the Ceph Dissector.
25
 *
26
 * Hello, this is a quick overview of the insertion points in the Ceph dissector
27
 * it is assumed that you know how dissectors work in general (if not please
28
 * read 'doc/README.dissector' and related documents).
29
 *
30
 * If you have any questions feel free to contact Kevin <kevincox@kevincox.ca>.
31
 *
32
 * ## Adding a MSGR Tag
33
 *
34
 * To add a MSGR tag you must update the switch statements inside both
35
 * `c_dissect_msgr()` to actually dissect the data and `c_pdu_end()` to
36
 * calculate the length of the data.
37
 *
38
 * ## Adding a New Message.
39
 *
40
 * To add a new message type you simply create a new function
41
 * `c_dissect_msg_{name}()` with the same signature as the others.  Please
42
 * insert your function in order of the tag value like the others.
43
 *
44
 * Then you simply add it into the switch in `c_dissect_msg()` (also in the
45
 * correct order).  Your message will then be dissected when encountered.
46
 *
47
 * ## Supporting new encodings.
48
 *
49
 * ### Message Encodings.
50
 *
51
 * The encoding version of messages is available in `data->head.ver` and the
52
 * code should be modified to conditionally decode the new version of the
53
 * message.
54
 *
55
 * ### Data Type Encodings.
56
 *
57
 * Data types encoded using Ceph's `ENCODE_START()` macro can be decoded by
58
 * using `c_dissect_encoded()` to extract the version and length.  You can
59
 * then conditionally decode using the version.
60
 *
61
 * Please rely on the length returned by `c_dissect_encoded()` to ensure future
62
 * compatibility.
63
 */
64
65
static dissector_handle_t ceph_handle;
66
67
/* Initialize the protocol and registered fields */
68
static int proto_ceph;
69
static int hf_filter_data;
70
static int hf_node_id;
71
static int hf_node_type;
72
static int hf_node_nonce;
73
static int hf_entityinst_name;
74
static int hf_entityinst_addr;
75
static int hf_EntityName;
76
static int hf_EntityName_type;
77
static int hf_EntityName_id;
78
static int hf_src_slug;
79
static int hf_src_type;
80
static int hf_dst_type;
81
static int hf_dst_slug;
82
static int hf_banner;
83
static int hf_client_info;
84
static int hf_server_info;
85
static int hf_sockaddr;
86
static int hf_inet_family;
87
static int hf_port;
88
static int hf_addr_ipv4;
89
static int hf_addr_ipv6;
90
static int hf_data_data;
91
static int hf_data_size;
92
static int hf_string_data;
93
static int hf_string_size;
94
static int hf_keepalive_time;
95
static int hf_encoded_ver;
96
static int hf_encoded_compat;
97
static int hf_encoded_size;
98
static int hf_version;
99
static int hf_epoch;
100
static int hf_pool;
101
static int hf_key;
102
static int hf_namespace;
103
static int hf_hash;
104
static int hf_pgid_ver;
105
static int hf_pgid_pool;
106
static int hf_pgid_seed;
107
static int hf_pgid_preferred;
108
static int hf_pg_create_epoch;
109
static int hf_pg_create_parent;
110
static int hf_pg_create_splitbits;
111
static int hf_path_ver;
112
static int hf_path_inode;
113
static int hf_path_rel;
114
static int hf_mds_release_inode;
115
static int hf_mds_release_capid;
116
static int hf_mds_release_new;
117
static int hf_mds_release_wanted;
118
static int hf_mds_release_seq;
119
static int hf_mds_release_seq_issue;
120
static int hf_mds_release_mseq;
121
static int hf_mds_release_dname_seq;
122
static int hf_mds_release_dname;
123
static int hf_hitset_params;
124
static int hf_hitset_params_type;
125
static int hf_hitset_params_exphash_count;
126
static int hf_hitset_params_exphash_hit;
127
static int hf_snapinfo;
128
static int hf_snapinfo_id;
129
static int hf_snapinfo_time;
130
static int hf_snapinfo_name;
131
static int hf_pgpool;
132
static int hf_pgpool_type;
133
static int hf_pgpool_size;
134
static int hf_pgpool_crush_ruleset;
135
static int hf_pgpool_hash;
136
static int hf_pgpool_pgnum;
137
static int hf_pgpool_pgpnum;
138
static int hf_pgpool_changed;
139
static int hf_pgpool_snapseq;
140
static int hf_pgpool_snapepoch;
141
static int hf_pgpool_snap;
142
static int hf_pgpool_snap_id;
143
static int hf_pgpool_snapdel;
144
static int hf_pgpool_snapdel_from;
145
static int hf_pgpool_snapdel_to;
146
static int hf_pgpool_uid;
147
static int hf_pgpool_flags_low;
148
static int hf_pgpool_flags_high;
149
static int hf_pgpool_crash_reply_interval;
150
static int hf_pgpool_min_size;
151
static int hf_pgpool_quota_bytes;
152
static int hf_pgpool_quota_objects;
153
static int hf_pgpool_tier;
154
static int hf_pgpool_tierof;
155
static int hf_pgpool_cachemode;
156
static int hf_pgpool_readtier;
157
static int hf_pgpool_writetier;
158
static int hf_pgpool_property;
159
static int hf_pgpool_property_key;
160
static int hf_pgpool_property_val;
161
static int hf_pgpool_hitset_period;
162
static int hf_pgpool_hitset_count;
163
static int hf_pgpool_stripewidth;
164
static int hf_pgpool_targetmaxsize;
165
static int hf_pgpool_targetmaxobj;
166
static int hf_pgpool_cache_targetdirtyratio;
167
static int hf_pgpool_cache_targetfullratio;
168
static int hf_pgpool_cache_flushage_min;
169
static int hf_pgpool_cache_evictage_min;
170
static int hf_pgpool_erasurecode_profile;
171
static int hf_pgpool_lastforceresend;
172
static int hf_pgpool_flag_hashpool;
173
static int hf_pgpool_flag_full;
174
static int hf_pgpool_flag_fake_ec_pool;
175
static int hf_monmap;
176
static int hf_monmap_fsid;
177
static int hf_monmap_epoch;
178
static int hf_monmap_address;
179
static int hf_monmap_address_name;
180
static int hf_monmap_address_addr;
181
static int hf_monmap_changed;
182
static int hf_monmap_created;
183
static int hf_pg_stat_ver;
184
static int hf_pg_stat_seq;
185
static int hf_pg_stat_epoch;
186
static int hf_pg_stat_state;
187
static int hf_pg_stat_logstart;
188
static int hf_pg_stat_logstartondisk;
189
static int hf_pg_stat_created;
190
static int hf_pg_stat_lastepochclean;
191
static int hf_pg_stat_parent;
192
static int hf_pg_stat_parent_splitbits;
193
static int hf_pg_stat_lastscrub;
194
static int hf_pg_stat_lastscrubstamp;
195
static int hf_pg_stat_stats;
196
static int hf_pg_stat_logsize;
197
static int hf_pg_stat_logsizeondisk;
198
static int hf_pg_stat_up;
199
static int hf_pg_stat_acting;
200
static int hf_pg_stat_lastfresh;
201
static int hf_pg_stat_lastchange;
202
static int hf_pg_stat_lastactive;
203
static int hf_pg_stat_lastclean;
204
static int hf_pg_stat_lastunstale;
205
static int hf_pg_stat_mappingepoch;
206
static int hf_pg_stat_lastdeepscrub;
207
static int hf_pg_stat_lastdeepscrubstamp;
208
static int hf_pg_stat_statsinvalid;
209
static int hf_pg_stat_lastcleanscrubstamp;
210
static int hf_pg_stat_lastbecameactive;
211
static int hf_pg_stat_dirtystatsinvalid;
212
static int hf_pg_stat_upprimary;
213
static int hf_pg_stat_actingprimary;
214
static int hf_pg_stat_omapstatsinvalid;
215
static int hf_pg_stat_hitsetstatsinvalid;
216
static int hf_crush;
217
static int hf_osd_peerstat;
218
static int hf_osd_peerstat_timestamp;
219
static int hf_featureset_mask;
220
static int hf_featureset_name;
221
static int hf_featureset_name_val;
222
static int hf_featureset_name_name;
223
static int hf_compatset;
224
static int hf_compatset_compat;
225
static int hf_compatset_compatro;
226
static int hf_compatset_incompat;
227
static int hf_osd_superblock;
228
static int hf_osd_superblock_clusterfsid;
229
static int hf_osd_superblock_role;
230
static int hf_osd_superblock_epoch;
231
static int hf_osd_superblock_map_old;
232
static int hf_osd_superblock_map_new;
233
static int hf_osd_superblock_weight;
234
static int hf_osd_superblock_mounted;
235
static int hf_osd_superblock_osdfsid;
236
static int hf_osd_superblock_clean;
237
static int hf_osd_superblock_full;
238
static int hf_osdinfo_ver;
239
static int hf_osdinfo_lastclean_begin;
240
static int hf_osdinfo_lastclean_end;
241
static int hf_osdinfo_up_from;
242
static int hf_osdinfo_up_through;
243
static int hf_osdinfo_downat;
244
static int hf_osdinfo_lostat;
245
static int hf_osdxinfo_down;
246
static int hf_osdxinfo_laggy_probability;
247
static int hf_osdxinfo_laggy_interval;
248
static int hf_osdxinfo_oldweight;
249
static int hf_perfstat_commitlatency;
250
static int hf_perfstat_applylatency;
251
static int hf_osdstat;
252
static int hf_osdstat_kb;
253
static int hf_osdstat_kbused;
254
static int hf_osdstat_kbavail;
255
static int hf_osdstat_trimqueue;
256
static int hf_osdstat_trimming;
257
static int hf_osdstat_hbin;
258
static int hf_osdstat_hbout;
259
static int hf_osdstat_opqueue;
260
static int hf_osdstat_fsperf;
261
static int hf_osdmap;
262
static int hf_osdmap_client;
263
static int hf_osdmap_fsid;
264
static int hf_osdmap_epoch;
265
static int hf_osdmap_created;
266
static int hf_osdmap_modified;
267
static int hf_osdmap_pool;
268
static int hf_osdmap_pool_id;
269
static int hf_osdmap_poolname_item;
270
static int hf_osdmap_poolname;
271
static int hf_osdmap_poolmax;
272
static int hf_osdmap_flags;
273
static int hf_osdmap_osdmax;
274
static int hf_osdmap_osd_state;
275
static int hf_osdmap_osd_weight;
276
static int hf_osdmap_osd_addr;
277
static int hf_osdmap_pgtmp;
278
static int hf_osdmap_pgtmp_pg;
279
static int hf_osdmap_pgtmp_val;
280
static int hf_osdmap_primarytmp;
281
static int hf_osdmap_primarytmp_pg;
282
static int hf_osdmap_primarytmp_val;
283
static int hf_osdmap_osd_primaryaffinity;
284
static int hf_osdmap_erasurecodeprofile;
285
static int hf_osdmap_erasurecodeprofile_name;
286
static int hf_osdmap_erasurecodeprofile_prop;
287
static int hf_osdmap_erasurecodeprofile_k;
288
static int hf_osdmap_erasurecodeprofile_v;
289
static int hf_osdmap_osd;
290
static int hf_osdmap_hbaddr_back;
291
static int hf_osdmap_osd_info;
292
static int hf_osdmap_blacklist;
293
static int hf_osdmap_blacklist_addr;
294
static int hf_osdmap_blacklist_time;
295
static int hf_osdmap_cluster_addr;
296
static int hf_osdmap_cluster_snapepoch;
297
static int hf_osdmap_cluster_snap;
298
static int hf_osdmap_osd_uuid;
299
static int hf_osdmap_osd_xinfo;
300
static int hf_osdmap_hbaddr_front;
301
static int hf_osdmap_inc;
302
static int hf_osdmap_inc_client;
303
static int hf_osdmap_inc_fsid;
304
static int hf_osdmap_inc_osd;
305
static int hf_features_high;
306
static int hf_features_low;
307
static int hf_feature_uid;
308
static int hf_feature_nosrcaddr;
309
static int hf_feature_monclockcheck;
310
static int hf_feature_flock;
311
static int hf_feature_subscribe2;
312
static int hf_feature_monnames;
313
static int hf_feature_reconnect_seq;
314
static int hf_feature_dirlayouthash;
315
static int hf_feature_objectlocator;
316
static int hf_feature_pgid64;
317
static int hf_feature_incsubosdmap;
318
static int hf_feature_pgpool3;
319
static int hf_feature_osdreplymux;
320
static int hf_feature_osdenc;
321
static int hf_feature_omap;
322
static int hf_feature_monenc;
323
static int hf_feature_query_t;
324
static int hf_feature_indep_pg_map;
325
static int hf_feature_crush_tunables;
326
static int hf_feature_chunky_scrub;
327
static int hf_feature_mon_nullroute;
328
static int hf_feature_mon_gv;
329
static int hf_feature_backfill_reservation;
330
static int hf_feature_msg_auth;
331
static int hf_feature_recovery_reservation;
332
static int hf_feature_crush_tunables2;
333
static int hf_feature_createpoolid;
334
static int hf_feature_reply_create_inode;
335
static int hf_feature_osd_hbmsgs;
336
static int hf_feature_mdsenc;
337
static int hf_feature_osdhashpspool;
338
static int hf_feature_mon_single_paxos;
339
static int hf_feature_osd_snapmapper;
340
static int hf_feature_mon_scrub;
341
static int hf_feature_osd_packed_recovery;
342
static int hf_feature_osd_cachepool;
343
static int hf_feature_crush_v2;
344
static int hf_feature_export_peer;
345
static int hf_feature_osd_erasure_codes;
346
static int hf_feature_osd_tmap2omap;
347
static int hf_feature_osdmap_enc;
348
static int hf_feature_mds_inline_data;
349
static int hf_feature_crush_tunables3;
350
static int hf_feature_osd_primary_affinity;
351
static int hf_feature_msgr_keepalive2;
352
static int hf_feature_reserved;
353
static int hf_connect_host_type;
354
static int hf_connect_seq_global;
355
static int hf_connect_seq;
356
static int hf_connect_proto_ver;
357
static int hf_connect_auth_proto;
358
static int hf_connect_auth_size;
359
static int hf_connect_auth;
360
static int hf_flags;
361
static int hf_flag_lossy;
362
static int hf_osd_flags;
363
static int hf_osd_flag_ack;
364
static int hf_osd_flag_onnvram;
365
static int hf_osd_flag_ondisk;
366
static int hf_osd_flag_retry;
367
static int hf_osd_flag_read;
368
static int hf_osd_flag_write;
369
static int hf_osd_flag_ordersnap;
370
static int hf_osd_flag_peerstat_old;
371
static int hf_osd_flag_balance_reads;
372
static int hf_osd_flag_parallelexec;
373
static int hf_osd_flag_pgop;
374
static int hf_osd_flag_exec;
375
static int hf_osd_flag_exec_public;
376
static int hf_osd_flag_localize_reads;
377
static int hf_osd_flag_rwordered;
378
static int hf_osd_flag_ignore_cache;
379
static int hf_osd_flag_skiprwlocks;
380
static int hf_osd_flag_ignore_overlay;
381
static int hf_osd_flag_flush;
382
static int hf_osd_flag_map_snap_clone;
383
static int hf_osd_flag_enforce_snapc;
384
static int hf_osd_op_type;
385
static int hf_osd_op_data;
386
static int hf_osd_op_extent_off;
387
static int hf_osd_op_extent_size;
388
static int hf_osd_op_extent_trunc_size;
389
static int hf_osd_op_extent_trunc_seq;
390
static int hf_osd_op_payload_size;
391
static int hf_osd_redirect_oloc;
392
static int hf_osd_redirect_obj;
393
static int hf_osd_redirect_osdinstr;
394
static int hf_osd_redirect_osdinstr_data;
395
static int hf_osd_redirect_osdinstr_len;
396
static int hf_statsum_bytes;
397
static int hf_statsum_objects;
398
static int hf_statsum_clones;
399
static int hf_statsum_copies;
400
static int hf_statsum_missing;
401
static int hf_statsum_degraded;
402
static int hf_statsum_unfound;
403
static int hf_statsum_read_bytes;
404
static int hf_statsum_read_kbytes;
405
static int hf_statsum_written_bytes;
406
static int hf_statsum_written_kbytes;
407
static int hf_statsum_scrub_errors;
408
static int hf_statsum_recovered;
409
static int hf_statsum_bytes_recovered;
410
static int hf_statsum_keys_recovered;
411
static int hf_statsum_shallow_scrub_errors;
412
static int hf_statsum_deep_scrub_errors;
413
static int hf_statsum_dirty;
414
static int hf_statsum_whiteouts;
415
static int hf_statsum_omap;
416
static int hf_statsum_hitset_archive;
417
static int hf_connect;
418
static int hf_connect_reply;
419
static int hf_tag;
420
static int hf_ack;
421
static int hf_seq_existing;
422
static int hf_seq_new;
423
static int hf_head;
424
static int hf_head_seq;
425
static int hf_head_tid;
426
static int hf_head_type;
427
static int hf_head_priority;
428
static int hf_head_version;
429
static int hf_head_front_size;
430
static int hf_head_middle_size;
431
static int hf_head_data_size;
432
static int hf_head_data_off;
433
static int hf_head_srcname;
434
static int hf_head_compat_version;
435
static int hf_head_reserved;
436
static int hf_head_crc;
437
static int hf_foot;
438
static int hf_foot_front_crc;
439
static int hf_foot_middle_crc;
440
static int hf_foot_data_crc;
441
static int hf_foot_signature;
442
static int hf_msg_front;
443
static int hf_msg_middle;
444
static int hf_msg_data;
445
static int hf_statcollection;
446
static int hf_paxos;
447
static int hf_paxos_ver;
448
static int hf_paxos_mon;
449
static int hf_paxos_mon_tid;
450
static int hf_msg_mon_map;
451
static int hf_msg_statfs;
452
static int hf_msg_statfs_fsid;
453
static int hf_msg_statfsreply;
454
static int hf_msg_statfsreply_fsid;
455
static int hf_msg_statfsreply_ver;
456
static int hf_msg_statfsreply_kb;
457
static int hf_msg_statfsreply_kbused;
458
static int hf_msg_statfsreply_kbavail;
459
static int hf_msg_statfsreply_obj;
460
static int hf_msg_mon_sub;
461
static int hf_msg_mon_sub_item;
462
static int hf_msg_mon_sub_item_len;
463
static int hf_msg_mon_sub_what;
464
static int hf_msg_mon_sub_start;
465
static int hf_msg_mon_sub_flags;
466
static int hf_msg_mon_sub_flags_onetime;
467
static int hf_msg_mon_sub_ack;
468
static int hf_msg_mon_sub_ack_interval;
469
static int hf_msg_mon_sub_ack_fsid;
470
static int hf_msg_auth;
471
static int hf_msg_auth_proto;
472
static int hf_msg_auth_supportedproto;
473
static int hf_msg_auth_supportedproto_ver;
474
static int hf_msg_auth_supportedproto_proto;
475
static int hf_msg_auth_supportedproto_gid;
476
static int hf_msg_auth_cephx;
477
static int hf_msg_auth_cephx_req_type;
478
static int hf_msg_auth_monmap_epoch;
479
static int hf_msg_auth_reply;
480
static int hf_msg_auth_reply_proto;
481
static int hf_msg_auth_reply_result;
482
static int hf_msg_auth_reply_global_id;
483
static int hf_msg_auth_reply_msg;
484
static int hf_msg_mon_getversion;
485
static int hf_msg_mon_getversion_tid;
486
static int hf_msg_mon_getversion_what;
487
static int hf_msg_mon_getversionreply;
488
static int hf_msg_mon_getversionreply_tid;
489
static int hf_msg_mon_getversionreply_ver;
490
static int hf_msg_mon_getversionreply_veroldest;
491
static int hf_msg_mds_map;
492
static int hf_msg_mds_map_fsid;
493
static int hf_msg_mds_map_epoch;
494
static int hf_msg_mds_map_datai;
495
static int hf_msg_mds_map_data;
496
static int hf_msg_mds_map_data_size;
497
static int hf_msg_client_sess;
498
static int hf_msg_client_sess_op;
499
static int hf_msg_client_sess_seq;
500
static int hf_msg_client_sess_time;
501
static int hf_msg_client_sess_caps_max;
502
static int hf_msg_client_sess_leases_max;
503
static int hf_msg_client_req;
504
static int hf_msg_client_req_oldest_tid;
505
static int hf_msg_client_req_mdsmap_epoch;
506
static int hf_msg_client_req_flags;
507
static int hf_msg_client_req_retry;
508
static int hf_msg_client_req_forward;
509
static int hf_msg_client_req_releases;
510
static int hf_msg_client_req_op;
511
static int hf_msg_client_req_caller_uid;
512
static int hf_msg_client_req_caller_gid;
513
static int hf_msg_client_req_inode;
514
static int hf_msg_client_req_path_src;
515
static int hf_msg_client_req_path_dst;
516
static int hf_msg_client_req_release;
517
static int hf_msg_client_req_time;
518
static int hf_msg_client_reqfwd;
519
static int hf_msg_client_reqfwd_dst;
520
static int hf_msg_client_reqfwd_fwd;
521
static int hf_msg_client_reqfwd_resend;
522
static int hf_msg_client_reply;
523
static int hf_msg_client_reply_op;
524
static int hf_msg_client_reply_result;
525
static int hf_msg_client_reply_mdsmap_epoch;
526
static int hf_msg_client_reply_safe;
527
static int hf_msg_client_reply_isdentry;
528
static int hf_msg_client_reply_istarget;
529
static int hf_msg_client_reply_trace;
530
static int hf_msg_client_reply_extra;
531
static int hf_msg_client_reply_snaps;
532
static int hf_msg_osd_map;
533
static int hf_msg_osd_map_fsid;
534
static int hf_msg_osd_map_inc;
535
static int hf_msg_osd_map_inc_len;
536
static int hf_msg_osd_map_map;
537
static int hf_msg_osd_map_map_len;
538
static int hf_msg_osd_map_epoch;
539
static int hf_msg_osd_map_oldest;
540
static int hf_msg_osd_map_newest;
541
static int hf_msg_osd_op;
542
static int hf_msg_osd_op_client_inc;
543
static int hf_msg_osd_op_osdmap_epoch;
544
static int hf_msg_osd_op_mtime;
545
static int hf_msg_osd_op_reassert_version;
546
static int hf_msg_osd_op_oloc;
547
static int hf_msg_osd_op_pgid;
548
static int hf_msg_osd_op_oid;
549
static int hf_msg_osd_op_ops_len;
550
static int hf_msg_osd_op_op;
551
static int hf_msg_osd_op_snap_id;
552
static int hf_msg_osd_op_snap_seq;
553
static int hf_msg_osd_op_snaps_len;
554
static int hf_msg_osd_op_snap;
555
static int hf_msg_osd_op_retry_attempt;
556
static int hf_msg_osd_op_payload;
557
static int hf_msg_osd_opreply;
558
static int hf_msg_osd_opreply_oid;
559
static int hf_msg_osd_opreply_pgid;
560
static int hf_msg_osd_opreply_result;
561
static int hf_msg_osd_opreply_bad_replay_ver;
562
static int hf_msg_osd_opreply_osdmap_epoch;
563
static int hf_msg_osd_opreply_ops_len;
564
static int hf_msg_osd_opreply_op;
565
static int hf_msg_osd_opreply_retry_attempt;
566
static int hf_msg_osd_opreply_rval;
567
static int hf_msg_osd_opreply_replay_ver;
568
static int hf_msg_osd_opreply_user_ver;
569
static int hf_msg_osd_opreply_redirect;
570
static int hf_msg_osd_opreply_payload;
571
static int hf_msg_poolopreply;
572
static int hf_msg_poolopreply_fsid;
573
static int hf_msg_poolopreply_code;
574
static int hf_msg_poolopreply_epoch;
575
static int hf_msg_poolopreply_datai;
576
static int hf_msg_poolopreply_data;
577
static int hf_msg_poolopreply_data_size;
578
static int hf_msg_poolop;
579
static int hf_msg_poolop_fsid;
580
static int hf_msg_poolop_pool;
581
static int hf_msg_poolop_type;
582
static int hf_msg_poolop_auid;
583
static int hf_msg_poolop_snapid;
584
static int hf_msg_poolop_name;
585
static int hf_msg_poolop_crush_rule;
586
static int hf_msg_poolop_crush_rule8;
587
static int hf_msg_mon_cmd;
588
static int hf_msg_mon_cmd_fsid;
589
static int hf_msg_mon_cmd_arg;
590
static int hf_msg_mon_cmd_arg_len;
591
static int hf_msg_mon_cmd_str;
592
static int hf_msg_mon_cmd_ack;
593
static int hf_msg_mon_cmd_ack_code;
594
static int hf_msg_mon_cmd_ack_res;
595
static int hf_msg_mon_cmd_ack_arg;
596
static int hf_msg_mon_cmd_ack_arg_len;
597
static int hf_msg_mon_cmd_ack_arg_str;
598
static int hf_msg_mon_cmd_ack_data;
599
static int hf_msg_poolstats;
600
static int hf_msg_poolstats_fsid;
601
static int hf_msg_poolstats_pool;
602
static int hf_msg_poolstatsreply;
603
static int hf_msg_poolstatsreply_fsid;
604
static int hf_msg_poolstatsreply_stat;
605
static int hf_msg_poolstatsreply_pool;
606
static int hf_msg_poolstatsreply_log_size;
607
static int hf_msg_poolstatsreply_log_size_ondisk;
608
static int hf_msg_mon_globalid_max;
609
static int hf_msg_mon_election;
610
static int hf_msg_mon_election_fsid;
611
static int hf_msg_mon_election_op;
612
static int hf_msg_mon_election_epoch;
613
static int hf_msg_mon_election_quorum;
614
static int hf_msg_mon_election_quorum_features;
615
static int hf_msg_mon_election_defunct_one;
616
static int hf_msg_mon_election_defunct_two;
617
static int hf_msg_mon_election_sharing;
618
static int hf_msg_mon_election_sharing_data;
619
static int hf_msg_mon_election_sharing_size;
620
static int hf_msg_mon_paxos;
621
static int hf_msg_mon_paxos_epoch;
622
static int hf_msg_mon_paxos_op;
623
static int hf_msg_mon_paxos_first;
624
static int hf_msg_mon_paxos_last;
625
static int hf_msg_mon_paxos_pnfrom;
626
static int hf_msg_mon_paxos_pn;
627
static int hf_msg_mon_paxos_pnuncommitted;
628
static int hf_msg_mon_paxos_lease;
629
static int hf_msg_mon_paxos_sent;
630
static int hf_msg_mon_paxos_latest_ver;
631
static int hf_msg_mon_paxos_latest_val;
632
static int hf_msg_mon_paxos_latest_val_data;
633
static int hf_msg_mon_paxos_latest_val_size;
634
static int hf_msg_mon_paxos_value;
635
static int hf_msg_mon_paxos_ver;
636
static int hf_msg_mon_paxos_val;
637
static int hf_msg_mon_paxos_val_data;
638
static int hf_msg_mon_paxos_val_size;
639
static int hf_msg_mon_probe;
640
static int hf_msg_mon_probe_fsid;
641
static int hf_msg_mon_probe_type;
642
static int hf_msg_mon_probe_name;
643
static int hf_msg_mon_probe_quorum;
644
static int hf_msg_mon_probe_paxos_first_ver;
645
static int hf_msg_mon_probe_paxos_last_ver;
646
static int hf_msg_mon_probe_ever_joined;
647
static int hf_msg_mon_probe_req_features;
648
static int hf_msg_osd_ping;
649
static int hf_msg_osd_ping_fsid;
650
static int hf_msg_osd_ping_mapepoch;
651
static int hf_msg_osd_ping_peerepoch;
652
static int hf_msg_osd_ping_op;
653
static int hf_msg_osd_ping_time;
654
static int hf_msg_osd_boot;
655
static int hf_msg_osd_boot_addr_back;
656
static int hf_msg_osd_boot_addr_cluster;
657
static int hf_msg_osd_boot_epoch;
658
static int hf_msg_osd_boot_addr_front;
659
static int hf_msg_osd_boot_metadata;
660
static int hf_msg_osd_boot_metadata_k;
661
static int hf_msg_osd_boot_metadata_v;
662
static int hf_msg_pgstats;
663
static int hf_msg_pgstats_fsid;
664
static int hf_msg_pgstats_pgstat;
665
static int hf_msg_pgstats_pgstat_pg;
666
static int hf_msg_pgstats_pgstat_stat;
667
static int hf_msg_pgstats_epoch;
668
static int hf_msg_pgstats_mapfor;
669
static int hf_msg_osd_pg_create;
670
static int hf_msg_osd_pg_create_epoch;
671
static int hf_msg_osd_pg_create_mkpg;
672
static int hf_msg_osd_pg_create_mkpg_pg;
673
static int hf_msg_osd_pg_create_mkpg_create;
674
static int hf_msg_client_caps;
675
static int hf_msg_client_caps_op;
676
static int hf_msg_client_caps_inode;
677
static int hf_msg_client_caps_relam;
678
static int hf_msg_client_caps_cap_id;
679
static int hf_msg_client_caps_seq;
680
static int hf_msg_client_caps_seq_issue;
681
static int hf_msg_client_caps_new;
682
static int hf_msg_client_caps_wanted;
683
static int hf_msg_client_caps_dirty;
684
static int hf_msg_client_caps_seq_migrate;
685
static int hf_msg_client_caps_snap_follows;
686
static int hf_msg_client_caps_uid;
687
static int hf_msg_client_caps_gid;
688
static int hf_msg_client_caps_mode;
689
static int hf_msg_client_caps_nlink;
690
static int hf_msg_client_caps_xattr_ver;
691
static int hf_msg_client_caps_snap;
692
static int hf_msg_client_caps_flock;
693
static int hf_msg_client_caps_inline_ver;
694
static int hf_msg_client_caps_inline_data;
695
static int hf_msg_client_caps_xattr;
696
static int hf_msg_client_caprel;
697
static int hf_msg_client_caprel_cap;
698
static int hf_msg_client_caprel_cap_inode;
699
static int hf_msg_client_caprel_cap_id;
700
static int hf_msg_client_caprel_cap_migrate;
701
static int hf_msg_client_caprel_cap_seq;
702
static int hf_msg_timecheck;
703
static int hf_msg_timecheck_op;
704
static int hf_msg_timecheck_epoch;
705
static int hf_msg_timecheck_round;
706
static int hf_msg_timecheck_time;
707
static int hf_msg_timecheck_skew;
708
static int hf_msg_timecheck_skew_node;
709
static int hf_msg_timecheck_skew_skew;
710
static int hf_msg_timecheck_latency;
711
static int hf_msg_timecheck_latency_node;
712
static int hf_msg_timecheck_latency_latency;
713
714
/* Initialize the expert items. */
715
static expert_field ei_unused;
716
static expert_field ei_overrun;
717
static expert_field ei_tag_unknown;
718
static expert_field ei_msg_unknown;
719
static expert_field ei_union_unknown;
720
static expert_field ei_ver_tooold;
721
static expert_field ei_ver_toonew;
722
static expert_field ei_oloc_both;
723
/* static expert_field ei_banner_invalid; */
724
static expert_field ei_sizeillogical;
725
726
/* Initialize the subtree pointers */
727
static int ett_ceph;
728
static int ett_data;
729
static int ett_str;
730
static int ett_blob;
731
static int ett_sockaddr;
732
static int ett_entityaddr;
733
static int ett_entityname;
734
static int ett_EntityName;
735
static int ett_entityinst;
736
static int ett_kv;
737
static int ett_eversion;
738
static int ett_objectlocator;
739
static int ett_pg;
740
static int ett_pg_create;
741
static int ett_filepath;
742
static int ett_mds_release;
743
static int ett_hitset_params;
744
static int ett_snapinfo;
745
static int ett_pgpool;
746
static int ett_pgpool_snap;
747
static int ett_pgpool_snapdel;
748
static int ett_pgpool_property;
749
static int ett_mon_map;
750
static int ett_mon_map_address;
751
static int ett_osd_peerstat;
752
static int ett_featureset;
753
static int ett_featureset_name;
754
static int ett_compatset;
755
static int ett_osd_superblock;
756
static int ett_osd_info;
757
static int ett_osd_xinfo;
758
static int ett_perfstat;
759
static int ett_osdstat;
760
static int ett_pg_stat;
761
static int ett_osd_map;
762
static int ett_osd_map_client;
763
static int ett_osd_map_pool;
764
static int ett_osd_map_poolname;
765
static int ett_osd_map_pgtmp;
766
static int ett_osd_map_primarytmp;
767
static int ett_osd_map_erasurecodeprofile;
768
static int ett_osd_map_osd;
769
static int ett_osd_map_blacklist;
770
static int ett_osd_map_inc;
771
static int ett_osd_map_inc_client;
772
static int ett_osd_map_inc_osd;
773
static int ett_osd_op;
774
static int ett_redirect;
775
static int ett_statcollection;
776
static int ett_paxos;
777
static int ett_msg_mon_map;
778
static int ett_msg_statfs;
779
static int ett_msg_statfsreply;
780
static int ett_msg_mon_sub;
781
static int ett_msg_mon_sub_item;
782
static int ett_msg_mon_sub_flags;
783
static int ett_msg_mon_sub_ack;
784
static int ett_msg_auth;
785
static int ett_msg_auth_supportedproto;
786
static int ett_msg_auth_cephx;
787
static int ett_msg_authreply;
788
static int ett_msg_mon_getversion;
789
static int ett_msg_mon_getversionreply;
790
static int ett_msg_mds_map;
791
static int ett_msg_client_sess;
792
static int ett_msg_client_req;
793
static int ett_msg_client_reqfwd;
794
static int ett_msg_client_reply;
795
static int ett_msg_osd_map;
796
static int ett_msg_osd_map_inc;
797
static int ett_msg_osd_map_full;
798
static int ett_msg_osd_op;
799
static int ett_msg_osd_opreply;
800
static int ett_msg_poolopreply;
801
static int ett_msg_poolop;
802
static int ett_msg_mon_cmd;
803
static int ett_msg_mon_cmd_arg;
804
static int ett_msg_mon_cmdack;
805
static int ett_msg_mon_cmdack_arg;
806
static int ett_msg_poolstats;
807
static int ett_msg_poolstatsreply;
808
static int ett_msg_poolstatsreply_stat;
809
static int ett_msg_mon_election;
810
static int ett_msg_mon_paxos;
811
static int ett_msg_mon_paxos_value;
812
static int ett_msg_mon_probe;
813
static int ett_msg_osd_ping;
814
static int ett_msg_osd_boot;
815
static int ett_msg_pgstats;
816
static int ett_msg_pgstats_pgstat;
817
static int ett_msg_osd_pg_create;
818
static int ett_msg_osd_pg_create_mkpg;
819
static int ett_msg_client_caps;
820
static int ett_msg_client_caprel;
821
static int ett_msg_client_caprel_cap;
822
static int ett_msg_timecheck;
823
static int ett_msg_timecheck_skew;
824
static int ett_msg_timecheck_latency;
825
static int ett_head;
826
static int ett_foot;
827
static int ett_connect;
828
static int ett_connect_reply;
829
static int ett_filter_data;
830
831
static const uint8_t *C_BANNER = (const uint8_t*)"ceph v";
832
833
789
#define C_BANNER_SIZE     9
834
4.14k
#define C_BANNER_SIZE_MIN 6
835
836
/** Feature Flags */
837
/* Transmuted from ceph:/src/include/ceph_features.h */
838
14
#define C_FEATURE_UID          (1U <<  0)
839
14
#define C_FEATURE_NOSRCADDR        (1U <<  1)
840
14
#define C_FEATURE_MONCLOCKCHECK        (1U <<  2)
841
14
#define C_FEATURE_FLOCK          (1U <<  3)
842
14
#define C_FEATURE_SUBSCRIBE2         (1U <<  4)
843
14
#define C_FEATURE_MONNAMES         (1U <<  5)
844
14
#define C_FEATURE_RECONNECT_SEQ        (1U <<  6)
845
14
#define C_FEATURE_DIRLAYOUTHASH        (1U <<  7)
846
14
#define C_FEATURE_OBJECTLOCATOR        (1U <<  8)
847
14
#define C_FEATURE_PGID64         (1U <<  9)
848
14
#define C_FEATURE_INCSUBOSDMAP         (1U << 10)
849
14
#define C_FEATURE_PGPOOL3        (1U << 11)
850
14
#define C_FEATURE_OSDREPLYMUX        (1U << 12)
851
14
#define C_FEATURE_OSDENC         (1U << 13)
852
14
#define C_FEATURE_OMAP           (1U << 14)
853
14
#define C_FEATURE_MONENC         (1U << 15)
854
14
#define C_FEATURE_QUERY_T        (1U << 16)
855
14
#define C_FEATURE_INDEP_PG_MAP         (1U << 17)
856
14
#define C_FEATURE_CRUSH_TUNABLES       (1U << 18)
857
14
#define C_FEATURE_CHUNKY_SCRUB         (1U << 19)
858
14
#define C_FEATURE_MON_NULLROUTE        (1U << 20)
859
14
#define C_FEATURE_MON_GV         (1U << 21)
860
14
#define C_FEATURE_BACKFILL_RESERVATION (1U << 22)
861
14
#define C_FEATURE_MSG_AUTH         (1U << 23)
862
14
#define C_FEATURE_RECOVERY_RESERVATION (1U << 24)
863
14
#define C_FEATURE_CRUSH_TUNABLES2      (1U << 25)
864
14
#define C_FEATURE_CREATEPOOLID         (1U << 26)
865
14
#define C_FEATURE_REPLY_CREATE_INODE   (1U << 27)
866
14
#define C_FEATURE_OSD_HBMSGS         (1U << 28)
867
14
#define C_FEATURE_MDSENC         (1U << 29)
868
14
#define C_FEATURE_OSDHASHPSPOOL        (1U << 30)
869
14
#define C_FEATURE_MON_SINGLE_PAXOS     (1U << 31)
870
14
#define C_FEATURE_OSD_SNAPMAPPER       (1U <<  0)
871
14
#define C_FEATURE_MON_SCRUB        (1U <<  1)
872
14
#define C_FEATURE_OSD_PACKED_RECOVERY  (1U <<  2)
873
14
#define C_FEATURE_OSD_CACHEPOOL        (1U <<  3)
874
14
#define C_FEATURE_CRUSH_V2         (1U <<  4)
875
14
#define C_FEATURE_EXPORT_PEER        (1U <<  5)
876
14
#define C_FEATURE_OSD_ERASURE_CODES    (1U <<  6)
877
14
#define C_FEATURE_OSD_TMAP2OMAP        (1U <<  6)
878
14
#define C_FEATURE_OSDMAP_ENC         (1U <<  7)
879
14
#define C_FEATURE_MDS_INLINE_DATA      (1U <<  8)
880
14
#define C_FEATURE_CRUSH_TUNABLES3      (1U <<  9)
881
14
#define C_FEATURE_OSD_PRIMARY_AFFINITY (1U <<  9)
882
14
#define C_FEATURE_MSGR_KEEPALIVE2      (1U << 10)
883
14
#define C_FEATURE_RESERVED         (1U << 31)
884
885
/** Connect Message Flags */
886
14
#define C_FLAG_LOSSY                 (1U << 0)
887
888
14
#define C_PGPOOL_FLAG_HASHPSPOOL       (1U << 0) /* hash pg seed and pool together (instead of adding) */
889
14
#define C_PGPOOL_FLAG_FULL         (1U << 1) /* pool is full */
890
14
#define C_PGPOOL_FLAG_FAKE_EC_POOL     (1U << 2) /* require ReplicatedPG to act like an EC pg */
891
892
/** Macros to create value_strings.
893
 *
894
 * These are a quick wrapper around the functions in value_string.h.  They
895
 * create an enum `base` with the given values, a `value_string base_strings[]`
896
 * and a function `const char `base_string(base val)` which gets the string
897
 * for a value.
898
 *
899
 * Additionally, C_MAKE_STRINGS_EXT creates a
900
 * `value_strings_ext base_strings_ext` and uses this for the `base_string`
901
 * lookup.
902
 *
903
 * @param base The root name.
904
 * @param chars The number of characters to use when displaying the value.
905
 *    this is generally 2*bytes.
906
 */
907
#define C_MAKE_STRINGS(base, chars) \
908
  typedef int base; \
909
  VALUE_STRING_ENUM(base##_strings); \
910
  VALUE_STRING_ARRAY(base##_strings); \
911
92
  static const char *base##_string(base val, wmem_allocator_t* scope) { \
912
92
    return val_to_str(scope, val, base##_strings, "Unknown (0x0"#chars"X)"); \
913
92
  }
packet-ceph.c:c_node_type_string
Line
Count
Source
911
92
  static const char *base##_string(base val, wmem_allocator_t* scope) { \
912
92
    return val_to_str(scope, val, base##_strings, "Unknown (0x0"#chars"X)"); \
913
92
  }
Unexecuted instantiation: packet-ceph.c:c_auth_proto_string
Unexecuted instantiation: packet-ceph.c:c_cephx_req_type_string
Unexecuted instantiation: packet-ceph.c:c_pgpool_type_string
Unexecuted instantiation: packet-ceph.c:c_poolop_type_string
914
915
#define C_MAKE_STRINGS_EXT(base, chars) \
916
  typedef int base; \
917
  VALUE_STRING_ENUM(base##_strings); \
918
  VALUE_STRING_ARRAY(base##_strings); \
919
  \
920
  static value_string_ext \
921
  base##_strings_ext = VALUE_STRING_EXT_INIT(base##_strings); \
922
  \
923
52
  static const char *base##_string(base val, wmem_allocator_t* scope) { \
924
52
    return val_to_str_ext(scope, val, &base##_strings_ext, "Unknown (0x0"#chars"X)"); \
925
52
  }
packet-ceph.c:c_msg_type_string
Line
Count
Source
923
52
  static const char *base##_string(base val, wmem_allocator_t* scope) { \
924
52
    return val_to_str_ext(scope, val, &base##_strings_ext, "Unknown (0x0"#chars"X)"); \
925
52
  }
Unexecuted instantiation: packet-ceph.c:c_session_op_type_string
Unexecuted instantiation: packet-ceph.c:c_mds_op_type_string
Unexecuted instantiation: packet-ceph.c:c_hitset_params_type_string
Unexecuted instantiation: packet-ceph.c:c_pgpool_cachemode_string
Unexecuted instantiation: packet-ceph.c:c_osd_optype_string
Unexecuted instantiation: packet-ceph.c:c_mon_election_type_string
Unexecuted instantiation: packet-ceph.c:c_mon_paxos_op_string
Unexecuted instantiation: packet-ceph.c:c_mon_probe_type_string
Unexecuted instantiation: packet-ceph.c:c_osd_ping_op_string
Unexecuted instantiation: packet-ceph.c:c_cap_op_type_string
Unexecuted instantiation: packet-ceph.c:c_timecheck_op_string
926
927
#define c_inet_strings_VALUE_STRING_LIST(V) \
928
  V(C_IPv4, 0x0002, "IPv4") \
929
  V(C_IPv6, 0x000A, "IPv6")
930
931
typedef int c_inet;
932
VALUE_STRING_ENUM(c_inet_strings);
933
VALUE_STRING_ARRAY(c_inet_strings);
934
935
/** Message Tags */
936
#define c_tag_strings_VALUE_STRING_LIST(V) \
937
  V(C_TAG_READY,    0x01, "server->client: ready for messages")        \
938
  V(C_TAG_RESETSESSION, 0x02, "server->client: reset, try again")        \
939
  V(C_TAG_WAIT,   0x03, "server->client: wait for racing incoming connection") \
940
  V(C_TAG_RETRY_SESSION,  0x04, "server->client + cseq: try again with higher cseq")   \
941
  V(C_TAG_RETRY_GLOBAL, 0x05, "server->client + gseq: try again with higher gseq")   \
942
  V(C_TAG_CLOSE,    0x06, "closing pipe")              \
943
  V(C_TAG_MSG,    0x07, "message")               \
944
  V(C_TAG_ACK,    0x08, "message ack")               \
945
  V(C_TAG_KEEPALIVE,  0x09, "just a keepalive byte!")            \
946
  V(C_TAG_BADPROTOVER,  0x0A, "bad protocol version")            \
947
  V(C_TAG_BADAUTHORIZER,  0x0B, "bad authorizer")              \
948
  V(C_TAG_FEATURES, 0x0C, "insufficient features")             \
949
  V(C_TAG_SEQ,    0x0D, "64-bit int follows with seen seq number")       \
950
  V(C_TAG_KEEPALIVE2, 0x0E, "keepalive2")              \
951
  V(C_TAG_KEEPALIVE2_ACK, 0x0F, "keepalive2 reply")            \
952
953
typedef int c_tag;
954
VALUE_STRING_ENUM(c_tag_strings);
955
VALUE_STRING_ARRAY(c_tag_strings);
956
static value_string_ext c_tag_strings_ext = VALUE_STRING_EXT_INIT(c_tag_strings);
957
958
/* Extracted from the Ceph tree.
959
 *
960
 * These are MSG_* constants for server <-> server (internal) messages. and
961
 * CEPH_MSG_* for client <-> server messages.  There is no functional
962
 * difference, just a naming convention.
963
 */
964
#define c_msg_type_strings_VALUE_STRING_LIST(V) \
965
  V(C_MSG_UNKNOWN,         0x0000, "Unknown (0x0000)")      \
966
                        \
967
  V(C_CEPH_MSG_SHUTDOWN,         0x0001, "C_CEPH_MSG_SHUTDOWN")     \
968
  V(C_CEPH_MSG_PING,         0x0002, "C_CEPH_MSG_PING")       \
969
  V(C_CEPH_MSG_MON_MAP,        0x0004, "C_CEPH_MSG_MON_MAP")      \
970
  V(C_CEPH_MSG_MON_GET_MAP,      0x0005, "C_CEPH_MSG_MON_GET_MAP")      \
971
  V(C_CEPH_MSG_STATFS,         0x000D, "C_CEPH_MSG_STATFS")     \
972
  V(C_CEPH_MSG_STATFS_REPLY,       0x000E, "C_CEPH_MSG_STATFS_REPLY")     \
973
  V(C_CEPH_MSG_MON_SUBSCRIBE,      0x000F, "C_CEPH_MSG_MON_SUBSCRIBE")    \
974
  V(C_CEPH_MSG_MON_SUBSCRIBE_ACK,      0x0010, "C_CEPH_MSG_MON_SUBSCRIBE_ACK")    \
975
  V(C_CEPH_MSG_AUTH,         0x0011, "C_CEPH_MSG_AUTH")       \
976
  V(C_CEPH_MSG_AUTH_REPLY,       0x0012, "C_CEPH_MSG_AUTH_REPLY")     \
977
  V(C_CEPH_MSG_MON_GET_VERSION,      0x0013, "C_CEPH_MSG_MON_GET_VERSION")    \
978
  V(C_CEPH_MSG_MON_GET_VERSION_REPLY,  0x0014, "C_CEPH_MSG_MON_GET_VERSION_REPLY")  \
979
  V(C_CEPH_MSG_MDS_MAP,        0x0015, "C_CEPH_MSG_MDS_MAP")      \
980
  V(C_CEPH_MSG_CLIENT_SESSION,       0x0016, "C_CEPH_MSG_CLIENT_SESSION")   \
981
  V(C_CEPH_MSG_CLIENT_RECONNECT,       0x0017, "C_CEPH_MSG_CLIENT_RECONNECT")   \
982
  V(C_CEPH_MSG_CLIENT_REQUEST,       0x0018, "C_CEPH_MSG_CLIENT_REQUEST")   \
983
  V(C_CEPH_MSG_CLIENT_REQUEST_FORWARD, 0x0019, "C_CEPH_MSG_CLIENT_REQUEST_FORWARD") \
984
  V(C_CEPH_MSG_CLIENT_REPLY,       0x001A, "C_CEPH_MSG_CLIENT_REPLY")     \
985
  V(C_MSG_PAXOS,           0x0028, "C_MSG_PAXOS")       \
986
  V(C_CEPH_MSG_OSD_MAP,        0x0029, "C_CEPH_MSG_OSD_MAP")      \
987
  V(C_CEPH_MSG_OSD_OP,         0x002A, "C_CEPH_MSG_OSD_OP")     \
988
  V(C_CEPH_MSG_OSD_OPREPLY,      0x002B, "C_CEPH_MSG_OSD_OPREPLY")      \
989
  V(C_CEPH_MSG_WATCH_NOTIFY,       0x002C, "C_CEPH_MSG_WATCH_NOTIFY")     \
990
  V(C_MSG_FORWARD,         0x002E, "C_MSG_FORWARD")       \
991
  V(C_MSG_ROUTE,           0x002F, "C_MSG_ROUTE")       \
992
  V(C_MSG_POOLOPREPLY,         0x0030, "C_MSG_POOLOPREPLY")     \
993
  V(C_MSG_POOLOP,          0x0031, "C_MSG_POOLOP")        \
994
  V(C_MSG_MON_COMMAND,         0x0032, "C_MSG_MON_COMMAND")     \
995
  V(C_MSG_MON_COMMAND_ACK,       0x0033, "C_MSG_MON_COMMAND_ACK")     \
996
  V(C_MSG_LOG,           0x0034, "C_MSG_LOG")       \
997
  V(C_MSG_LOGACK,          0x0035, "C_MSG_LOGACK")        \
998
  V(C_MSG_MON_OBSERVE,         0x0036, "C_MSG_MON_OBSERVE")     \
999
  V(C_MSG_MON_OBSERVE_NOTIFY,      0x0037, "C_MSG_MON_OBSERVE_NOTIFY")    \
1000
  V(C_MSG_CLASS,           0x0038, "C_MSG_CLASS")       \
1001
  V(C_MSG_CLASS_ACK,         0x0039, "C_MSG_CLASS_ACK")       \
1002
  V(C_MSG_GETPOOLSTATS,        0x003A, "C_MSG_GETPOOLSTATS")      \
1003
  V(C_MSG_GETPOOLSTATSREPLY,       0x003B, "C_MSG_GETPOOLSTATSREPLY")     \
1004
  V(C_MSG_MON_GLOBAL_ID,         0x003C, "C_MSG_MON_GLOBAL_ID")     \
1005
/*  V(C_CEPH_MSG_PRIO_LOW,         0x0040, "C_CEPH_MSG_PRIO_LOW")   */ \
1006
  V(C_MSG_MON_SCRUB,         0x0040, "C_MSG_MON_SCRUB")       \
1007
  V(C_MSG_MON_ELECTION,        0x0041, "C_MSG_MON_ELECTION")      \
1008
  V(C_MSG_MON_PAXOS,         0x0042, "C_MSG_MON_PAXOS")       \
1009
  V(C_MSG_MON_PROBE,         0x0043, "C_MSG_MON_PROBE")       \
1010
  V(C_MSG_MON_JOIN,        0x0044, "C_MSG_MON_JOIN")        \
1011
  V(C_MSG_MON_SYNC,        0x0045, "C_MSG_MON_SYNC")        \
1012
  V(C_MSG_OSD_PING,        0x0046, "C_MSG_OSD_PING")        \
1013
  V(C_MSG_OSD_BOOT,        0x0047, "C_MSG_OSD_BOOT")        \
1014
  V(C_MSG_OSD_FAILURE,         0x0048, "C_MSG_OSD_FAILURE")     \
1015
  V(C_MSG_OSD_ALIVE,         0x0049, "C_MSG_OSD_ALIVE")       \
1016
  V(C_MSG_OSD_MARK_ME_DOWN,      0x004A, "C_MSG_OSD_MARK_ME_DOWN")      \
1017
  V(C_MSG_OSD_SUBOP,         0x004C, "C_MSG_OSD_SUBOP")       \
1018
  V(C_MSG_OSD_SUBOPREPLY,        0x004D, "C_MSG_OSD_SUBOPREPLY")      \
1019
  V(C_MSG_OSD_PGTEMP,        0x004E, "C_MSG_OSD_PGTEMP")      \
1020
  V(C_MSG_OSD_PG_NOTIFY,         0x0050, "C_MSG_OSD_PG_NOTIFY")     \
1021
  V(C_MSG_OSD_PG_QUERY,        0x0051, "C_MSG_OSD_PG_QUERY")      \
1022
  V(C_MSG_OSD_PG_SUMMARY,        0x0052, "C_MSG_OSD_PG_SUMMARY")      \
1023
  V(C_MSG_OSD_PG_LOG,        0x0053, "C_MSG_OSD_PG_LOG")      \
1024
  V(C_MSG_OSD_PG_REMOVE,         0x0054, "C_MSG_OSD_PG_REMOVE")     \
1025
  V(C_MSG_OSD_PG_INFO,         0x0055, "C_MSG_OSD_PG_INFO")     \
1026
  V(C_MSG_OSD_PG_TRIM,         0x0056, "C_MSG_OSD_PG_TRIM")     \
1027
  V(C_MSG_PGSTATS,         0x0057, "C_MSG_PGSTATS")       \
1028
  V(C_MSG_PGSTATSACK,        0x0058, "C_MSG_PGSTATSACK")      \
1029
  V(C_MSG_OSD_PG_CREATE,         0x0059, "C_MSG_OSD_PG_CREATE")     \
1030
  V(C_MSG_REMOVE_SNAPS,        0x005A, "C_MSG_REMOVE_SNAPS")      \
1031
  V(C_MSG_OSD_SCRUB,         0x005B, "C_MSG_OSD_SCRUB")       \
1032
  V(C_MSG_OSD_PG_MISSING,        0x005C, "C_MSG_OSD_PG_MISSING")      \
1033
  V(C_MSG_OSD_REP_SCRUB,         0x005D, "C_MSG_OSD_REP_SCRUB")     \
1034
  V(C_MSG_OSD_PG_SCAN,         0x005E, "C_MSG_OSD_PG_SCAN")     \
1035
  V(C_MSG_OSD_PG_BACKFILL,       0x005F, "C_MSG_OSD_PG_BACKFILL")     \
1036
  V(C_MSG_COMMAND,         0x0061, "C_MSG_COMMAND")       \
1037
  V(C_MSG_COMMAND_REPLY,         0x0062, "C_MSG_COMMAND_REPLY")     \
1038
  V(C_MSG_OSD_BACKFILL_RESERVE,      0x0063, "C_MSG_OSD_BACKFILL_RESERVE")    \
1039
  V(C_MSG_MDS_BEACON,        0x0064, "C_MSG_MDS_BEACON")      \
1040
  V(C_MSG_MDS_SLAVE_REQUEST,       0x0065, "C_MSG_MDS_SLAVE_REQUEST")     \
1041
  V(C_MSG_MDS_TABLE_REQUEST,       0x0066, "C_MSG_MDS_TABLE_REQUEST")     \
1042
  V(C_MSG_OSD_PG_PUSH,         0x0069, "C_MSG_OSD_PG_PUSH")     \
1043
  V(C_MSG_OSD_PG_PULL,         0x006A, "C_MSG_OSD_PG_PULL")     \
1044
  V(C_MSG_OSD_PG_PUSH_REPLY,       0x006B, "C_MSG_OSD_PG_PUSH_REPLY")     \
1045
  V(C_MSG_OSD_EC_WRITE,        0x006C, "C_MSG_OSD_EC_WRITE")      \
1046
  V(C_MSG_OSD_EC_WRITE_REPLY,      0x006D, "C_MSG_OSD_EC_WRITE_REPLY")    \
1047
  V(C_MSG_OSD_EC_READ,         0x006E, "C_MSG_OSD_EC_READ")     \
1048
  V(C_MSG_OSD_EC_READ_REPLY,       0x006F, "C_MSG_OSD_EC_READ_REPLY")     \
1049
  V(C_CEPH_MSG_PRIO_DEFAULT,       0x007F, "C_CEPH_MSG_PRIO_DEFAULT")     \
1050
  V(C_MSG_OSD_RECOVERY_RESERVE,      0x0096, "C_MSG_OSD_RECOVERY_RESERVE")    \
1051
  V(C_CEPH_MSG_PRIO_HIGH,        0x00C4, "C_CEPH_MSG_PRIO_HIGH")      \
1052
  V(C_CEPH_MSG_PRIO_HIGHEST,       0x00FF, "C_CEPH_MSG_PRIO_HIGHEST")     \
1053
  V(C_MSG_MDS_RESOLVE,         0x0200, "C_MSG_MDS_RESOLVE")     \
1054
  V(C_MSG_MDS_RESOLVEACK,        0x0201, "C_MSG_MDS_RESOLVEACK")      \
1055
  V(C_MSG_MDS_CACHEREJOIN,       0x0202, "C_MSG_MDS_CACHEREJOIN")     \
1056
  V(C_MSG_MDS_DISCOVER,        0x0203, "C_MSG_MDS_DISCOVER")      \
1057
  V(C_MSG_MDS_DISCOVERREPLY,       0x0204, "C_MSG_MDS_DISCOVERREPLY")     \
1058
  V(C_MSG_MDS_INODEUPDATE,       0x0205, "C_MSG_MDS_INODEUPDATE")     \
1059
  V(C_MSG_MDS_DIRUPDATE,         0x0206, "C_MSG_MDS_DIRUPDATE")     \
1060
  V(C_MSG_MDS_CACHEEXPIRE,       0x0207, "C_MSG_MDS_CACHEEXPIRE")     \
1061
  V(C_MSG_MDS_DENTRYUNLINK,      0x0208, "C_MSG_MDS_DENTRYUNLINK")      \
1062
  V(C_MSG_MDS_FRAGMENTNOTIFY,      0x0209, "C_MSG_MDS_FRAGMENTNOTIFY")    \
1063
  V(C_MSG_MDS_OFFLOAD_TARGETS,       0x020A, "C_MSG_MDS_OFFLOAD_TARGETS")   \
1064
  V(C_MSG_MDS_DENTRYLINK,        0x020C, "C_MSG_MDS_DENTRYLINK")      \
1065
  V(C_MSG_MDS_FINDINO,         0x020D, "C_MSG_MDS_FINDINO")     \
1066
  V(C_MSG_MDS_FINDINOREPLY,      0x020E, "C_MSG_MDS_FINDINOREPLY")      \
1067
  V(C_MSG_MDS_OPENINO,         0x020F, "C_MSG_MDS_OPENINO")     \
1068
  V(C_MSG_MDS_OPENINOREPLY,      0x0210, "C_MSG_MDS_OPENINOREPLY")      \
1069
  V(C_MSG_MDS_LOCK,        0x0300, "C_MSG_MDS_LOCK")        \
1070
  V(C_MSG_MDS_INODEFILECAPS,       0x0301, "C_MSG_MDS_INODEFILECAPS")     \
1071
  V(C_CEPH_MSG_CLIENT_CAPS,      0x0310, "C_CEPH_MSG_CLIENT_CAPS")      \
1072
  V(C_CEPH_MSG_CLIENT_LEASE,       0x0311, "C_CEPH_MSG_CLIENT_LEASE")     \
1073
  V(C_CEPH_MSG_CLIENT_SNAP,      0x0312, "C_CEPH_MSG_CLIENT_SNAP")      \
1074
  V(C_CEPH_MSG_CLIENT_CAPRELEASE,      0x0313, "C_CEPH_MSG_CLIENT_CAPRELEASE")    \
1075
  V(C_MSG_MDS_EXPORTDIRDISCOVER,       0x0449, "C_MSG_MDS_EXPORTDIRDISCOVER")   \
1076
  V(C_MSG_MDS_EXPORTDIRDISCOVERACK,    0x0450, "C_MSG_MDS_EXPORTDIRDISCOVERACK")    \
1077
  V(C_MSG_MDS_EXPORTDIRCANCEL,       0x0451, "C_MSG_MDS_EXPORTDIRCANCEL")   \
1078
  V(C_MSG_MDS_EXPORTDIRPREP,       0x0452, "C_MSG_MDS_EXPORTDIRPREP")     \
1079
  V(C_MSG_MDS_EXPORTDIRPREPACK,      0x0453, "C_MSG_MDS_EXPORTDIRPREPACK")    \
1080
  V(C_MSG_MDS_EXPORTDIRWARNING,      0x0454, "C_MSG_MDS_EXPORTDIRWARNING")    \
1081
  V(C_MSG_MDS_EXPORTDIRWARNINGACK,     0x0455, "C_MSG_MDS_EXPORTDIRWARNINGACK")   \
1082
  V(C_MSG_MDS_EXPORTDIR,         0x0456, "C_MSG_MDS_EXPORTDIR")     \
1083
  V(C_MSG_MDS_EXPORTDIRACK,      0x0457, "C_MSG_MDS_EXPORTDIRACK")      \
1084
  V(C_MSG_MDS_EXPORTDIRNOTIFY,       0x0458, "C_MSG_MDS_EXPORTDIRNOTIFY")   \
1085
  V(C_MSG_MDS_EXPORTDIRNOTIFYACK,      0x0459, "C_MSG_MDS_EXPORTDIRNOTIFYACK")    \
1086
  V(C_MSG_MDS_EXPORTDIRFINISH,       0x0460, "C_MSG_MDS_EXPORTDIRFINISH")   \
1087
  V(C_MSG_MDS_EXPORTCAPS,        0x0470, "C_MSG_MDS_EXPORTCAPS")      \
1088
  V(C_MSG_MDS_EXPORTCAPSACK,       0x0471, "C_MSG_MDS_EXPORTCAPSACK")     \
1089
  V(C_MSG_MDS_HEARTBEAT,         0x0500, "C_MSG_MDS_HEARTBEAT")     \
1090
  V(C_MSG_TIMECHECK,         0x0600, "C_MSG_TIMECHECK")       \
1091
  V(C_MSG_MON_HEALTH,        0x0601, "C_MSG_MON_HEALTH")
1092
1093
C_MAKE_STRINGS_EXT(c_msg_type, 4)
1094
1095
#define c_osd_optype_strings_VALUE_STRING_LIST(V) \
1096
  /*** Raw Codes ***/                       \
1097
  V(C_OSD_OP_TYPE_LOCK,  0x0100, "C_OSD_OP_TYPE_LOCK")                \
1098
  V(C_OSD_OP_TYPE_DATA,  0x0200, "C_OSD_OP_TYPE_DATA")                \
1099
  V(C_OSD_OP_TYPE_ATTR,  0x0300, "C_OSD_OP_TYPE_ATTR")                \
1100
  V(C_OSD_OP_TYPE_EXEC,  0x0400, "C_OSD_OP_TYPE_EXEC")                \
1101
  V(C_OSD_OP_TYPE_PG,    0x0500, "C_OSD_OP_TYPE_PG")                \
1102
  V(C_OSD_OP_TYPE_MULTI, 0x0600, "C_OSD_OP_TYPE_MULTI") /* multiobject */           \
1103
  V(C_OSD_OP_TYPE,       0x0f00, "C_OSD_OP_TYPE")                 \
1104
                              \
1105
  /*** Sorted by value, keep it that way. ***/                  \
1106
  V(C_OSD_OP_MODE_RD,        0x1000,             "C_OSD_OP_MODE_RD")    \
1107
  V(C_OSD_OP_READ,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x01, "C_OSD_OP_READ")   \
1108
  V(C_OSD_OP_STAT,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x02, "C_OSD_OP_STAT")   \
1109
  V(C_OSD_OP_MAPEXT,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x03, "C_OSD_OP_MAPEXT")   \
1110
  V(C_OSD_OP_MASKTRUNC,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x04, "C_OSD_OP_MASKTRUNC")    \
1111
  V(C_OSD_OP_SPARSE_READ,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x05, "C_OSD_OP_SPARSE_READ")  \
1112
  V(C_OSD_OP_NOTIFY,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x06, "C_OSD_OP_NOTIFY")   \
1113
  V(C_OSD_OP_NOTIFY_ACK,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x07, "C_OSD_OP_NOTIFY_ACK")   \
1114
  V(C_OSD_OP_ASSERT_VER,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x08, "C_OSD_OP_ASSERT_VER")   \
1115
  V(C_OSD_OP_LIST_WATCHERS,      C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x09, "C_OSD_OP_LIST_WATCHERS")  \
1116
  V(C_OSD_OP_LIST_SNAPS,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x0A, "C_OSD_OP_LIST_SNAPS")   \
1117
  V(C_OSD_OP_SYNC_READ,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x0B, "C_OSD_OP_SYNC_READ")    \
1118
  V(C_OSD_OP_TMAPGET,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x0C, "C_OSD_OP_TMAPGET")    \
1119
  V(C_OSD_OP_OMAPGETKEYS,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x11, "C_OSD_OP_OMAPGETKEYS")  \
1120
  V(C_OSD_OP_OMAPGETVALS,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x12, "C_OSD_OP_OMAPGETVALS")  \
1121
  V(C_OSD_OP_OMAPGETHEADER,      C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x13, "C_OSD_OP_OMAPGETHEADER")  \
1122
  V(C_OSD_OP_OMAPGETVALSBYKEYS,  C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x14, "C_OSD_OP_OMAPGETVALSBYKEYS")  \
1123
  V(C_OSD_OP_OMAP_CMP,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x19, "C_OSD_OP_OMAP_CMP")   \
1124
  V(C_OSD_OP_COPY_GET_CLASSIC,   C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x1B, "C_OSD_OP_COPY_GET_CLASSIC") \
1125
  V(C_OSD_OP_ISDIRTY,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x1D, "C_OSD_OP_ISDIRTY")    \
1126
  V(C_OSD_OP_COPY_GET,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_DATA  | 0x1E, "C_OSD_OP_COPY_GET")   \
1127
  V(C_OSD_OP_GETXATTR,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_ATTR  | 0x01, "C_OSD_OP_GETXATTR")   \
1128
  V(C_OSD_OP_GETXATTRS,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_ATTR  | 0x02, "C_OSD_OP_GETXATTRS")    \
1129
  V(C_OSD_OP_CMPXATTR,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_ATTR  | 0x03, "C_OSD_OP_CMPXATTR")   \
1130
  V(C_OSD_OP_CALL,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_EXEC  | 0x01, "C_OSD_OP_CALL")   \
1131
  V(C_OSD_OP_PGLS,         C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_PG  | 0x01, "C_OSD_OP_PGLS")   \
1132
  V(C_OSD_OP_PGLS_FILTER,        C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_PG  | 0x02, "C_OSD_OP_PGLS_FILTER")  \
1133
  V(C_OSD_OP_PG_HITSET_LS,       C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_PG  | 0x03, "C_OSD_OP_PG_HITSET_LS") \
1134
  V(C_OSD_OP_PG_HITSET_GET,      C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_PG  | 0x04, "C_OSD_OP_PG_HITSET_GET")  \
1135
  V(C_OSD_OP_ASSERT_SRC_VERSION, C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_MULTI | 0x02, "C_OSD_OP_ASSERT_SRC_VERSION") \
1136
  V(C_OSD_OP_SRC_CMPXATTR,       C_OSD_OP_MODE_RD    | C_OSD_OP_TYPE_MULTI | 0x03, "C_OSD_OP_SRC_CMPXATTR") \
1137
  V(C_OSD_OP_MODE_WR,        0x2000,             "C_OSD_OP_MODE_WR")    \
1138
  V(C_OSD_OP_WRLOCK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_LOCK  | 0x01, "C_OSD_OP_WRLOCK")   \
1139
  V(C_OSD_OP_WRUNLOCK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_LOCK  | 0x02, "C_OSD_OP_WRUNLOCK")   \
1140
  V(C_OSD_OP_RDLOCK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_LOCK  | 0x03, "C_OSD_OP_RDLOCK")   \
1141
  V(C_OSD_OP_RDUNLOCK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_LOCK  | 0x04, "C_OSD_OP_RDUNLOCK")   \
1142
  V(C_OSD_OP_UPLOCK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_LOCK  | 0x05, "C_OSD_OP_UPLOCK")   \
1143
  V(C_OSD_OP_DNLOCK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_LOCK  | 0x06, "C_OSD_OP_DNLOCK")   \
1144
  V(C_OSD_OP_WRITE,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x01, "C_OSD_OP_WRITE")    \
1145
  V(C_OSD_OP_WRITEFULL,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x02, "C_OSD_OP_WRITEFULL")    \
1146
  V(C_OSD_OP_TRUNCATE,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x03, "C_OSD_OP_TRUNCATE")   \
1147
  V(C_OSD_OP_ZERO,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x04, "C_OSD_OP_ZERO")   \
1148
  V(C_OSD_OP_DELETE,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x05, "C_OSD_OP_DELETE")   \
1149
  V(C_OSD_OP_APPEND,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x06, "C_OSD_OP_APPEND")   \
1150
  V(C_OSD_OP_STARTSYNC,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x07, "C_OSD_OP_STARTSYNC")    \
1151
  V(C_OSD_OP_SETTRUNC,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x08, "C_OSD_OP_SETTRUNC")   \
1152
  V(C_OSD_OP_TRIMTRUNC,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x09, "C_OSD_OP_TRIMTRUNC")    \
1153
  V(C_OSD_OP_TMAPPUT,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x0B, "C_OSD_OP_TMAPPUT")    \
1154
  V(C_OSD_OP_CREATE,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x0D, "C_OSD_OP_CREATE")   \
1155
  V(C_OSD_OP_ROLLBACK,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x0E, "C_OSD_OP_ROLLBACK")   \
1156
  V(C_OSD_OP_WATCH,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x0F, "C_OSD_OP_WATCH")    \
1157
  V(C_OSD_OP_OMAPSETVALS,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x15, "C_OSD_OP_OMAPSETVALS")  \
1158
  V(C_OSD_OP_OMAPSETHEADER,      C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x16, "C_OSD_OP_OMAPSETHEADER")  \
1159
  V(C_OSD_OP_OMAPCLEAR,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x17, "C_OSD_OP_OMAPCLEAR")    \
1160
  V(C_OSD_OP_OMAPRMKEYS,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x18, "C_OSD_OP_OMAPRMKEYS")   \
1161
  V(C_OSD_OP_COPY_FROM,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x1A, "C_OSD_OP_COPY_FROM")    \
1162
  V(C_OSD_OP_UNDIRTY,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x1C, "C_OSD_OP_UNDIRTY")    \
1163
  V(C_OSD_OP_SETALLOCHINT,       C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_DATA  | 0x23, "C_OSD_OP_SETALLOCHINT") \
1164
  V(C_OSD_OP_SETXATTR,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_ATTR  | 0x01, "C_OSD_OP_SETXATTR")   \
1165
  V(C_OSD_OP_SETXATTRS,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_ATTR  | 0x02, "C_OSD_OP_SETXATTRS")    \
1166
  V(C_OSD_OP_RESETXATTRS,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_ATTR  | 0x03, "C_OSD_OP_RESETXATTRS")  \
1167
  V(C_OSD_OP_RMXATTR,        C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_ATTR  | 0x04, "C_OSD_OP_RMXATTR")    \
1168
  V(C_OSD_OP_CLONERANGE,         C_OSD_OP_MODE_WR    | C_OSD_OP_TYPE_MULTI | 0x01, "C_OSD_OP_CLONERANGE")   \
1169
  V(C_OSD_OP_MODE_RMW,         0x3000,             "C_OSD_OP_MODE_RMW")   \
1170
  V(C_OSD_OP_TMAPUP,         C_OSD_OP_MODE_RMW   | C_OSD_OP_TYPE_DATA  | 0x0A, "C_OSD_OP_TMAPUP")   \
1171
  V(C_OSD_OP_TMAP2OMAP,        C_OSD_OP_MODE_RMW   | C_OSD_OP_TYPE_DATA  | 0x22, "C_OSD_OP_TMAP2OMAP")    \
1172
  V(C_OSD_OP_MODE_SUB,         0x4000,             "C_OSD_OP_MODE_SUB")   \
1173
  V(C_OSD_OP_PULL,         C_OSD_OP_MODE_SUB       | 0x01, "C_OSD_OP_PULL")   \
1174
  V(C_OSD_OP_PUSH,         C_OSD_OP_MODE_SUB       | 0x02, "C_OSD_OP_PUSH")   \
1175
  V(C_OSD_OP_BALANCEREADS,       C_OSD_OP_MODE_SUB       | 0x03, "C_OSD_OP_BALANCEREADS") \
1176
  V(C_OSD_OP_UNBALANCEREADS,     C_OSD_OP_MODE_SUB       | 0x04, "C_OSD_OP_UNBALANCEREADS") \
1177
  V(C_OSD_OP_SCRUB,        C_OSD_OP_MODE_SUB       | 0x05, "C_OSD_OP_SCRUB")    \
1178
  V(C_OSD_OP_SCRUB_RESERVE,      C_OSD_OP_MODE_SUB       | 0x06, "C_OSD_OP_SCRUB_RESERVE")  \
1179
  V(C_OSD_OP_SCRUB_UNRESERVE,    C_OSD_OP_MODE_SUB       | 0x07, "C_OSD_OP_SCRUB_UNRESERVE")  \
1180
  V(C_OSD_OP_SCRUB_STOP,         C_OSD_OP_MODE_SUB       | 0x08, "C_OSD_OP_SCRUB_STOP")   \
1181
  V(C_OSD_OP_SCRUB_MAP,        C_OSD_OP_MODE_SUB       | 0x09, "C_OSD_OP_SCRUB_MAP")    \
1182
  V(C_OSD_OP_MODE_CACHE,         0x8000,             "C_OSD_OP_MODE_CACHE")   \
1183
  V(C_OSD_OP_CACHE_FLUSH,        C_OSD_OP_MODE_CACHE | C_OSD_OP_TYPE_DATA  | 0x1F, "C_OSD_OP_CACHE_FLUSH")  \
1184
  V(C_OSD_OP_CACHE_EVICT,        C_OSD_OP_MODE_CACHE | C_OSD_OP_TYPE_DATA  | 0x20, "C_OSD_OP_CACHE_EVICT")  \
1185
  V(C_OSD_OP_CACHE_TRY_FLUSH,    C_OSD_OP_MODE_CACHE | C_OSD_OP_TYPE_DATA  | 0x21, "C_OSD_OP_CACHE_TRY_FLUSH")  \
1186
  V(C_OSD_OP_MODE,         0xf000,             "C_OSD_OP_MODE")
1187
1188
C_MAKE_STRINGS_EXT(c_osd_optype, 4)
1189
1190
#define c_poolop_type_strings_VALUE_STRING_LIST(V) \
1191
  V(POOL_OP_CREATE,    0x01, "Create")        \
1192
  V(POOL_OP_DELETE,    0x02, "Delete")        \
1193
  V(POOL_OP_AUID_CHANGE,     0x03, "Change Owner")        \
1194
  V(POOL_OP_CREATE_SNAP,     0x11, "Create Snapshot")     \
1195
  V(POOL_OP_DELETE_SNAP,     0x12, "Delete Snapshot")     \
1196
  V(POOL_OP_CREATE_UNMANAGED_SNAP, 0x21, "Create Unmanaged Snapshot") \
1197
  V(POOL_OP_DELETE_UNMANAGED_SNAP, 0x22, "Delete Unmanaged Snapshot")
1198
1199
C_MAKE_STRINGS(c_poolop_type, 2)
1200
1201
#define c_mon_election_type_strings_VALUE_STRING_LIST(V) \
1202
  V(C_MON_ELECTION_PROPOSE, 0x00000001, "Propose")        \
1203
  V(C_MON_ELECTION_ACK,   0x00000002, "Acknowledge")        \
1204
  V(C_MON_ELECTION_NAK,   0x00000003, "Negative Acknowledge") \
1205
  V(C_MON_ELECTION_VICTORY, 0x00000004, "Victory")
1206
1207
C_MAKE_STRINGS_EXT(c_mon_election_type, 8)
1208
1209
#define c_mon_paxos_op_strings_VALUE_STRING_LIST(V) \
1210
  V(C_MON_PAXOS_COLLECT,  0x00000001, "Propose Round")      \
1211
  V(C_MON_PAXOS_LAST, 0x00000002, "Accept Round")     \
1212
  V(C_MON_PAXOS_BEGIN,  0x00000003, "Propose Value")      \
1213
  V(C_MON_PAXOS_ACCEPT, 0x00000004, "Accept Value")     \
1214
  V(C_MON_PAXOS_COMMIT, 0x00000005, "Commit")       \
1215
  V(C_MON_PAXOS_LEASE,  0x00000006, "Extend Peon Lease")    \
1216
  V(C_MON_PAXOS_LEASEACK, 0x00000007, "Lease Acknowledgment")
1217
1218
C_MAKE_STRINGS_EXT(c_mon_paxos_op, 8)
1219
1220
#define c_mon_probe_type_strings_VALUE_STRING_LIST(V) \
1221
  V(C_MON_PROBE_PROBE,    0x00000001, "Probe")    \
1222
  V(C_MON_PROBE_REPLY,    0x00000002, "Reply")    \
1223
  V(C_MON_PROBE_SLURP,    0x00000003, "Slurp")    \
1224
  V(C_MON_PROBE_SLURP_LATEST, 0x00000004, "Slurp Latest") \
1225
  V(C_MON_PROBE_DATA,   0x00000005, "Data")   \
1226
  V(C_MON_PROBE_MISSING_FEATURES, 0x00000006, "Missing Features")
1227
1228
C_MAKE_STRINGS_EXT(c_mon_probe_type, 8)
1229
1230
#define c_osd_ping_op_strings_VALUE_STRING_LIST(V) \
1231
  V(C_TIMECHECK_HEARTBEAT,       0x00, "Heartbeat")  \
1232
  V(C_TIMECHECK_START_HEARTBEAT, 0x01, "Start Heartbeats") \
1233
  V(C_TIMECHECK_YOU_DIED,        0x02, "You Died")   \
1234
  V(C_TIMECHECK_STOP_HEARTBEAT,  0x03, "Stop Heartbeats")  \
1235
  V(C_TIMECHECK_PING,        0x04, "Ping")     \
1236
  V(C_TIMECHECK_PING_REPLY,      0x05, "Pong")
1237
1238
C_MAKE_STRINGS_EXT(c_osd_ping_op, 2)
1239
1240
#define c_session_op_type_strings_VALUE_STRING_LIST(V) \
1241
  V(C_SESSION_REQUEST_OPEN,      0x00000000, "Request Open")   \
1242
  V(C_SESSION_OPEN,        0x00000001, "Open")     \
1243
  V(C_SESSION_REQUEST_CLOSE,     0x00000002, "Request Close")  \
1244
  V(C_SESSION_CLOSE,         0x00000003, "Close")    \
1245
  V(C_SESSION_REQUEST_RENEWCAPS, 0x00000004, "Request Renew Caps") \
1246
  V(C_SESSION_RENEWCAPS,         0x00000005, "Renew Caps")   \
1247
  V(C_SESSION_STALE,         0x00000006, "Stale")    \
1248
  V(C_SESSION_RECALL_STATE,      0x00000007, "Recall Stale")   \
1249
  V(C_SESSION_FLUSHMSG,        0x00000008, "Flush Message")  \
1250
  V(C_SESSION_FLUSHMSG_ACK,      0x00000009, "Flush Message Ack")
1251
1252
C_MAKE_STRINGS_EXT(c_session_op_type, 8)
1253
1254
#define c_mds_op_type_strings_VALUE_STRING_LIST(V) \
1255
  V(C_MDS_OP_LOOKUP,   0x00000100, "MDS_OP_LOOKUP")     \
1256
  V(C_MDS_OP_GETATTR,  0x00000101, "MDS_OP_GETATTR")      \
1257
  V(C_MDS_OP_LOOKUPHASH,   0x00000102, "MDS_OP_LOOKUPHASH")   \
1258
  V(C_MDS_OP_LOOKUPPARENT, 0x00000103, "MDS_OP_LOOKUPPARENT") \
1259
  V(C_MDS_OP_LOOKUPINO,  0x00000104, "MDS_OP_LOOKUPINO")    \
1260
  V(C_MDS_OP_LOOKUPNAME,   0x00000105, "MDS_OP_LOOKUPNAME")   \
1261
  V(C_MDS_OP_GETFILELOCK,  0x00000110, "MDS_OP_GETFILELOCK")  \
1262
  V(C_MDS_OP_OPEN,   0x00000302, "MDS_OP_OPEN")     \
1263
  V(C_MDS_OP_READDIR,  0x00000305, "MDS_OP_READDIR")      \
1264
  V(C_MDS_OP_LOOKUPSNAP,   0x00000400, "MDS_OP_LOOKUPSNAP")   \
1265
  V(C_MDS_OP_LSSNAP,   0x00000402, "MDS_OP_LSSNAP")     \
1266
  V(C_MDS_OP_WRITE,  0x00001000, "MDS_OP_WRITE")      \
1267
  V(C_MDS_OP_SETXATTR,   0x00001105, "MDS_OP_SETXATTR")     \
1268
  V(C_MDS_OP_RMXATTR,  0x00001106, "MDS_OP_RMXATTR")      \
1269
  V(C_MDS_OP_SETLAYOUT,  0x00001107, "MDS_OP_SETLAYOUT")    \
1270
  V(C_MDS_OP_SETATTR,  0x00001108, "MDS_OP_SETATTR")      \
1271
  V(C_MDS_OP_SETFILELOCK,  0x00001109, "MDS_OP_SETFILELOCK")  \
1272
  V(C_MDS_OP_SETDIRLAYOUT, 0x0000110a, "MDS_OP_SETDIRLAYOUT") \
1273
  V(C_MDS_OP_MKNOD,  0x00001201, "MDS_OP_MKNOD")      \
1274
  V(C_MDS_OP_LINK,   0x00001202, "MDS_OP_LINK")     \
1275
  V(C_MDS_OP_UNLINK,   0x00001203, "MDS_OP_UNLINK")     \
1276
  V(C_MDS_OP_RENAME,   0x00001204, "MDS_OP_RENAME")     \
1277
  V(C_MDS_OP_MKDIR,  0x00001220, "MDS_OP_MKDIR")      \
1278
  V(C_MDS_OP_RMDIR,  0x00001221, "MDS_OP_RMDIR")      \
1279
  V(C_MDS_OP_SYMLINK,  0x00001222, "MDS_OP_SYMLINK")      \
1280
  V(C_MDS_OP_CREATE,   0x00001301, "MDS_OP_CREATE")     \
1281
  V(C_MDS_OP_MKSNAP,   0x00001400, "MDS_OP_MKSNAP")     \
1282
  V(C_MDS_OP_RMSNAP,   0x00001401, "MDS_OP_RMSNAP")     \
1283
  V(C_MDS_OP_FRAGMENTDIR,  0x00001500, "MDS_OP_FRAGMENTDIR")  \
1284
  V(C_MDS_OP_EXPORTDIR,  0x00001501, "MDS_OP_EXPORTDIR")
1285
1286
C_MAKE_STRINGS_EXT(c_mds_op_type, 8)
1287
1288
#define c_cap_op_type_strings_VALUE_STRING_LIST(V) \
1289
  V(C_CAP_OP_GRANT,   0x00000000, "mds->client grant")          \
1290
  V(C_CAP_OP_REVOKE,    0x00000001, "mds->client revoke")         \
1291
  V(C_CAP_OP_TRUNC,   0x00000002, "mds->client trunc notify")       \
1292
  V(C_CAP_OP_EXPORT,    0x00000003, "mds has exported the cap")       \
1293
  V(C_CAP_OP_IMPORT,    0x00000004, "mds has imported the cap")       \
1294
  V(C_CAP_OP_UPDATE,    0x00000005, "client->mds update")         \
1295
  V(C_CAP_OP_DROP,    0x00000006, "client->mds drop cap bits")        \
1296
  V(C_CAP_OP_FLUSH,   0x00000007, "client->mds cap writeback")        \
1297
  V(C_CAP_OP_FLUSH_ACK,   0x00000008, "mds->client flushed")          \
1298
  V(C_CAP_OP_FLUSHSNAP,   0x00000009, "client->mds flush snapped metadata")   \
1299
  V(C_CAP_OP_FLUSHSNAP_ACK, 0x0000000A, "mds->client flushed snapped metadata") \
1300
  V(C_CAP_OP_RELEASE,   0x0000000B, "client->mds release (clean) cap")      \
1301
  V(C_CAP_OP_RENEW,   0x0000000C, "client->mds renewal request")
1302
1303
C_MAKE_STRINGS_EXT(c_cap_op_type, 8)
1304
1305
#define c_timecheck_op_strings_VALUE_STRING_LIST(V) \
1306
  V(C_TIMECHECK_OP_PING,   0x00000001, "Ping")   \
1307
  V(C_TIMECHECK_OP_PONG,   0x00000002, "Pong")   \
1308
  V(C_TIMECHECK_OP_REPORT, 0x00000003, "Report")
1309
1310
C_MAKE_STRINGS_EXT(c_timecheck_op, 8)
1311
1312
#define c_pgpool_type_strings_VALUE_STRING_LIST(V) \
1313
  V(C_PGPOOL_REPLICATED, 0x01, "Replicated")    \
1314
  V(C_PGPOOL_RAID4,      0x02, "Raid4")       \
1315
  V(C_PGPOOL_ERASURE,    0x03, "Erasure-coded")
1316
1317
C_MAKE_STRINGS(c_pgpool_type, 2)
1318
1319
#define c_pgpool_cachemode_strings_VALUE_STRING_LIST(V) \
1320
  V(C_PGPOOL_CACHEMODE_NONE,  0x00, "No caching")           \
1321
  V(C_PGPOOL_CACHEMODE_WRITEBACK, 0x01, "Write to cache, flush later")        \
1322
  V(C_PGPOOL_CACHEMODE_FORWARD, 0x02, "Forward if not in cache")        \
1323
  V(C_PGPOOL_CACHEMODE_READONLY,  0x03, "Handle reads, forward writes [not strongly consistent]")
1324
1325
C_MAKE_STRINGS_EXT(c_pgpool_cachemode, 2)
1326
1327
#define c_hitset_params_type_strings_VALUE_STRING_LIST(V) \
1328
  V(C_HITSET_PARAMS_TYPE_NONE,    0x00, "None")    \
1329
  V(C_HITSET_PARAMS_TYPE_EXPLICIT_HASH, 0x01, "Explicit Hash")   \
1330
  V(C_HITSET_PARAMS_TYPE_EXPLICIT_OBJECT, 0x02, "Explicit Object") \
1331
  V(C_HITSET_PARAMS_TYPE_BLOOM,   0x03, "Bloom Filter")
1332
1333
C_MAKE_STRINGS_EXT(c_hitset_params_type, 2)
1334
1335
#define c_auth_proto_strings_VALUE_STRING_LIST(V) \
1336
  V(C_AUTH_PROTO_UNKNOWN, 0x00, "Undecided") \
1337
  V(C_AUTH_PROTO_NONE,  0x01, "None")    \
1338
  V(C_AUTH_PROTO_CEPHX, 0x02, "CephX")
1339
1340
C_MAKE_STRINGS(c_auth_proto, 2)
1341
1342
#define c_cephx_req_type_strings_VALUE_STRING_LIST(V) \
1343
  V(C_CEPHX_REQ_AUTH_SESSIONKEY, 0x0100, "Get Auth Session Key")     \
1344
  V(C_CEPHX_REQ_PRINCIPAL_SESSIONKEY, 0x0200, "Get Principal Session Key") \
1345
  V(C_CEPHX_REQ_ROTATINGKEY, 0x0400, "Get Rotating Key")
1346
1347
C_MAKE_STRINGS(c_cephx_req_type, 4)
1348
1349
/** Node type database. */
1350
#define c_node_type_strings_LIST(V, W) \
1351
  V(C_NODE_TYPE_UNKNOWN, 0x00, W("Unknown",   "unknown")) \
1352
  V(C_NODE_TYPE_MON,     0x01, W("Monitor",   "mon"  )) \
1353
  V(C_NODE_TYPE_MDS,     0x02, W("Meta Data Server",  "mds"  )) \
1354
  V(C_NODE_TYPE_OSD,     0x04, W("Object Storage Daemon", "osd"  )) \
1355
  V(C_NODE_TYPE_CLIENT,  0x08, W("Client",    "client" )) \
1356
  V(C_NODE_TYPE_AUTH,    0x20, W("Authentication Server", "auth"   ))
1357
1358
#define C_EXTRACT_1(a, b) a
1359
#define C_EXTRACT_2(a, b) b
1360
1361
/** Extract the full names to create a value_string list. */
1362
#define c_node_type_strings_VALUE_STRING_LIST(V) \
1363
  c_node_type_strings_LIST(V, C_EXTRACT_1)
1364
1365
C_MAKE_STRINGS(c_node_type, 2)
1366
1367
/** Extract the abbreviations to create a value_string list. */
1368
#define c_node_type_abbr_strings_VALUE_STRING_LIST(V) \
1369
  c_node_type_strings_LIST(V, C_EXTRACT_2)
1370
1371
VALUE_STRING_ARRAY(c_node_type_abbr_strings);
1372
1373
14
#define C_MON_SUB_FLAG_ONETIME  0x01
1374
1375
typedef enum _c_state {
1376
  C_STATE_NEW,
1377
  C_STATE_OPEN,
1378
  C_STATE_SEQ /* Waiting for sequence number. */
1379
} c_state;
1380
1381
typedef struct _c_node_name {
1382
  const char *slug;
1383
  const char *type_str;
1384
  uint64_t id;
1385
  c_node_type type;
1386
} c_entityname;
1387
1388
static
1389
void c_node_name_init(c_entityname *d)
1390
216
{
1391
216
  d->slug     = NULL;
1392
216
  d->type_str = NULL;
1393
216
  d->id     = UINT64_MAX;
1394
216
  d->type     = C_NODE_TYPE_UNKNOWN;
1395
216
}
1396
1397
typedef struct _c_node {
1398
  address addr;
1399
  c_entityname name;
1400
  c_state state;
1401
  uint16_t port;
1402
} c_node;
1403
1404
static
1405
void c_node_init(c_node *n)
1406
216
{
1407
216
  clear_address(&n->addr);
1408
216
  c_node_name_init(&n->name);
1409
216
  n->port = 0xFFFF;
1410
216
  n->state = C_STATE_NEW;
1411
216
}
1412
1413
static
1414
c_node *c_node_copy(c_node *src, c_node *dst)
1415
1.85k
{
1416
1.85k
  dst->name = src->name;
1417
1.85k
  copy_address_shallow(&dst->addr, &src->addr);
1418
1.85k
  dst->port = src->port;
1419
1.85k
  dst->state = src->state;
1420
1421
1.85k
  return dst;
1422
1.85k
}
1423
1424
typedef struct _c_conv_data {
1425
  c_node client; /* The node that initiated this connection. */
1426
  c_node server; /* The other node. */
1427
} c_conv_data;
1428
1429
static
1430
void c_conv_data_init(c_conv_data *d)
1431
108
{
1432
108
  c_node_init(&d->client);
1433
108
  c_node_init(&d->server);
1434
108
}
1435
1436
static
1437
c_conv_data *c_conv_data_copy(c_conv_data *src, c_conv_data *dst)
1438
927
{
1439
927
  c_node_copy(&src->client, &dst->client);
1440
927
  c_node_copy(&src->server, &dst->server);
1441
1442
927
  return dst;
1443
927
}
1444
1445
static
1446
c_conv_data *c_conv_data_clone(c_conv_data *d)
1447
927
{
1448
927
  return c_conv_data_copy(d, wmem_new(wmem_file_scope(), c_conv_data));
1449
927
}
1450
1451
static
1452
c_conv_data *c_conv_data_new(void)
1453
108
{
1454
108
  c_conv_data *r;
1455
108
  r = wmem_new(wmem_file_scope(), c_conv_data);
1456
108
  c_conv_data_init(r);
1457
108
  return r;
1458
108
}
1459
1460
typedef struct _c_header {
1461
  uint64_t seq;
1462
  uint64_t tid;
1463
  c_msg_type type;
1464
  uint16_t ver;
1465
  uint16_t priority;
1466
  c_entityname src;
1467
} c_header;
1468
1469
static
1470
void c_header_init(c_header *h)
1471
961
{
1472
961
  h->seq      = 0;
1473
961
  h->tid      = 0;
1474
961
  h->type     = C_MSG_UNKNOWN;
1475
961
  h->priority = 0;
1476
961
  h->ver      = 0;
1477
961
  memset(&h->src, 0, sizeof(h->src));
1478
961
}
1479
1480
typedef struct _c_pkt_data {
1481
  conversation_t *conv; /* The wireshark conversation. */
1482
  c_conv_data *convd; /* The Ceph conversation data. */
1483
  c_node *src;    /* The node in convd that sent this message. */
1484
  c_node *dst;    /* The node in convd that is receiving this message. */
1485
1486
  proto_item  *item_root; /* The root proto_item for the message. */
1487
  packet_info *pinfo;
1488
1489
  c_header header;  /* The MSG header. */
1490
} c_pkt_data;
1491
1492
/** Initialize the packet data.
1493
 *
1494
 * The packet data structure holds all of the Ceph-specific data that is needed
1495
 * to dissect the protocol.  This function initializes the structure.
1496
 *
1497
 * This function grabs the appropriate data either from previous packets in the
1498
 * dissection, or creating a new data for new conversations.
1499
 *
1500
 * Lastly this function saves the state before every packet so that if we are
1501
 * asked to dissect the same packet again the same state will be used as when
1502
 * it was dissected initially.
1503
 */
1504
static void
1505
c_pkt_data_init(c_pkt_data *d, packet_info *pinfo, unsigned off)
1506
961
{
1507
  /* Get conversation to store/retrieve connection data. */
1508
961
  d->conv = find_or_create_conversation(pinfo);
1509
961
  DISSECTOR_ASSERT_HINT(d->conv, "find_or_create_conversation() returned NULL");
1510
1511
961
  if (pinfo->fd->visited)
1512
0
  {
1513
    /* Retrieve the saved state. */
1514
0
    d->convd = (c_conv_data*)p_get_proto_data(wmem_file_scope(), pinfo,
1515
0
                proto_ceph, off);
1516
0
    DISSECTOR_ASSERT_HINT(d->convd, "Frame visited, but no saved state.");
1517
    /* Make a copy and use that so we don't mess up the original. */
1518
0
    d->convd = c_conv_data_copy(d->convd, wmem_new(pinfo->pool, c_conv_data));
1519
0
  }
1520
961
  else
1521
961
  {
1522
    /*
1523
      If there is no saved state get the state from dissecting the
1524
      last packet.
1525
    */
1526
961
    d->convd = (c_conv_data*)conversation_get_proto_data(d->conv, proto_ceph);
1527
961
  }
1528
1529
961
  if (!d->convd) /* New conversation. */
1530
108
  {
1531
108
    d->convd = c_conv_data_new();
1532
108
    conversation_add_proto_data(d->conv, proto_ceph, d->convd);
1533
108
  }
1534
1535
  /*
1536
   * Set up src and dst pointers correctly, if the client port is
1537
   * already set. Otherwise, we need to wait until we have enough
1538
   * data to determine which is which.
1539
   */
1540
961
  if (d->convd->client.port != 0xFFFF) {
1541
795
    if (addresses_equal(&d->convd->client.addr, &pinfo->src) &&
1542
735
        d->convd->client.port == pinfo->srcport)
1543
735
    {
1544
735
      d->src = &d->convd->client;
1545
735
      d->dst = &d->convd->server;
1546
735
    }
1547
60
    else
1548
60
    {
1549
60
      d->src = &d->convd->server;
1550
60
      d->dst = &d->convd->client;
1551
60
    }
1552
795
    DISSECTOR_ASSERT(d->src);
1553
795
    DISSECTOR_ASSERT(d->dst);
1554
795
  }
1555
1556
961
  c_header_init(&d->header);
1557
961
  d->item_root = NULL;
1558
961
  d->pinfo    = pinfo;
1559
961
}
1560
1561
/** Save packet data.
1562
 *
1563
 * This function should be called on complete PDUs to save the state so that
1564
 * it will be available when redissecting the packet again later..
1565
 *
1566
 * This function only actually saves the state when necessary.
1567
 */
1568
static
1569
void c_pkt_data_save(c_pkt_data *d, packet_info *pinfo, unsigned off)
1570
927
{
1571
927
  if (!pinfo->fd->visited)
1572
927
  {
1573
    /*
1574
      Save a copy of the state for next time we dissect this packet.
1575
    */
1576
927
    p_add_proto_data(wmem_file_scope(), pinfo, proto_ceph, off,
1577
927
                c_conv_data_clone(d->convd));
1578
927
  }
1579
927
}
1580
1581
/** Check if packet is from the client.
1582
 *
1583
 * Returns true iff the packet is from the client.
1584
 */
1585
static
1586
bool c_from_client(c_pkt_data *d)
1587
196
{
1588
196
  return d->src == &d->convd->client;
1589
196
}
1590
1591
/** Check if packet is from the server.
1592
 *
1593
 * See c_from_client()
1594
 */
1595
static
1596
bool c_from_server(c_pkt_data *d)
1597
83
{
1598
83
  return d->src == &d->convd->server;
1599
83
}
1600
1601
static
1602
void c_set_type(c_pkt_data *data, const char *type)
1603
847
{
1604
847
  col_add_str(data->pinfo->cinfo, COL_INFO, type);
1605
847
  proto_item_append_text(data->item_root, " %s", type);
1606
847
}
1607
1608
#define c_append_text(data, ti, ...) \
1609
0
  do { \
1610
0
    proto_item_append_text(ti, __VA_ARGS__); \
1611
0
    proto_item_append_text(data->item_root, __VA_ARGS__); \
1612
0
  } while (0);
1613
1614
/** Format a timespec.
1615
 *
1616
 * The returned string has packet lifetime.
1617
 */
1618
static
1619
char *c_format_timespec(tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1620
0
{
1621
0
  nstime_t t;
1622
0
  t.secs  = tvb_get_letohl(tvb, off);
1623
0
  t.nsecs = tvb_get_letohl(tvb, off+4);
1624
0
  return abs_time_to_str(pinfo->pool, &t, ABSOLUTE_TIME_LOCAL, 1);
1625
0
}
1626
1627
/** Format a UUID
1628
 *
1629
 * The returned string has packet lifetime.
1630
 */
1631
static
1632
char *c_format_uuid(tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1633
0
{
1634
0
  e_guid_t uuid;
1635
0
  tvb_get_guid(tvb, off, &uuid, ENC_BIG_ENDIAN);
1636
0
  return guid_to_str(pinfo->pool, &uuid);
1637
0
}
1638
1639
1.00k
#define C_NEEDMORE      UINT_MAX
1640
967
#define C_INVALID       0
1641
1642
/*** Expert info warning functions. ***/
1643
1644
/** Warn about unused data.
1645
 *
1646
 * Check if there is unused data and if there is warn about it.
1647
 *
1648
 * @param tree  The tree where the error should be added.
1649
 * @param tvb The buffer with the data.
1650
 * @param start The start of the unused data.
1651
 * @param end Then end of the unused data.
1652
 * @param data  The packet data.
1653
 * @return True iff there was unused data.
1654
 */
1655
static
1656
bool c_warn_unused(proto_tree *tree,
1657
           tvbuff_t *tvb, unsigned start, unsigned end, c_pkt_data *data)
1658
1
{
1659
1
  unsigned diff;
1660
1661
1
  DISSECTOR_ASSERT_CMPUINT(start, <=, end);
1662
1663
1
  diff = end - start;
1664
1
  if (!diff) return false; /* no unused space. */
1665
1666
1
  proto_tree_add_expert_format(tree, data->pinfo, &ei_unused,
1667
1
             tvb, start, diff,
1668
1
             "%u unused byte%s", diff, diff == 1? "":"s");
1669
1670
1
  return true;
1671
1
}
1672
1673
/** Warn about dissection using more data then expected.
1674
 *
1675
 * Check if there is an overrun and if there is warn about it.
1676
 *
1677
 * @param tree  The tree where the error should be added.
1678
 * @param tvb The buffer with the data.
1679
 * @param start The start of the overun.
1680
 * @param end Then end of the overrun.
1681
 * @param data  The packet data.
1682
 * @return True iff there was an overrun.
1683
 */
1684
static
1685
bool c_warn_overrun(proto_tree *tree,
1686
      tvbuff_t *tvb, unsigned start, unsigned end, c_pkt_data *data)
1687
14
{
1688
14
  unsigned diff;
1689
1690
14
  DISSECTOR_ASSERT_CMPUINT(start, <=, end);
1691
1692
14
  diff = end - start;
1693
14
  if (!diff) return false; /* no unused space. */
1694
1695
0
  proto_tree_add_expert_format(tree, data->pinfo, &ei_overrun,
1696
0
             tvb, start, diff,
1697
0
             "%u overrun byte%s", diff, diff == 1? "":"s");
1698
1699
0
  return true;
1700
14
}
1701
1702
/** Warn about incorrect offset.
1703
 *
1704
 * Check if the offset is at the expected location, otherwise warn about it.
1705
 *
1706
 * @param tree The tree where the error should be added.
1707
 * @param tvb  The buffer with the data.
1708
 * @param act  The actual offset.
1709
 * @param exp  The expected offset.
1710
 * @param data The packet data.
1711
 * @return True iff there was a mismatch.
1712
 */
1713
static
1714
bool c_warn_size(proto_tree *tree,
1715
         tvbuff_t *tvb, unsigned act, unsigned exp, c_pkt_data *data)
1716
15
{
1717
15
  if (act < exp) return c_warn_unused (tree, tvb, act, exp, data);
1718
14
  else         return c_warn_overrun(tree, tvb, exp, act, data);
1719
15
}
1720
1721
/** Warn about version mismatches.
1722
 *
1723
 * Check that the version is within the supported range, otherwise warn about
1724
 * it.
1725
 *
1726
 * @param ti   The item to attach the warning to (probably the version item).
1727
 * @param min  The minimum supported version.
1728
 * @param max  The maximum supported version.
1729
 * @param data The packet data.
1730
 * @return A value less than zero if the version is to old and a value greater
1731
 *     then zero if the version is too new.  Otherwise return zero.
1732
 */
1733
static
1734
int c_warn_ver(proto_item *ti,
1735
         int act, int min, int max, c_pkt_data *data)
1736
0
{
1737
0
  DISSECTOR_ASSERT_CMPINT(min, <=, max);
1738
1739
0
  if (act < min)
1740
0
  {
1741
0
    expert_add_info_format(data->pinfo, ti, &ei_ver_tooold,
1742
0
               "Version %d is lower than the minimum "
1743
0
               "supported version (%d).",
1744
0
               act, min);
1745
0
    return -1;
1746
0
  }
1747
0
  if (act > max)
1748
0
  {
1749
0
    expert_add_info_format(data->pinfo, ti, &ei_ver_toonew,
1750
0
               "Version %d is higher than the maximum "
1751
0
               "supported version (%d).",
1752
0
               act, max);
1753
0
    return 1;
1754
0
  }
1755
1756
0
  return 0;
1757
0
}
1758
1759
/***** Data Structure Dissectors *****/
1760
1761
/** Dissect a length-delimited binary blob.
1762
 */
1763
static
1764
unsigned c_dissect_blob(proto_tree *root, int hf, int hf_data, int hf_len,
1765
         tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1766
0
{
1767
0
  proto_item *ti;
1768
0
  proto_tree *tree;
1769
0
  uint32_t size;
1770
1771
0
  size = tvb_get_letohl(tvb, off);
1772
1773
0
  ti = proto_tree_add_item(root, hf, tvb, off, size+4, ENC_NA);
1774
0
  tree = proto_item_add_subtree(ti, ett_data);
1775
1776
0
  proto_item_append_text(ti, ", Size: %"PRIu32, size);
1777
0
  if (size)
1778
0
  {
1779
0
    proto_item_append_text(ti, ", Data: %s",
1780
0
               tvb_bytes_to_str(pinfo->pool, tvb, off+4, size));
1781
0
  }
1782
1783
0
  proto_tree_add_item(tree, hf_len,
1784
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
1785
0
  off += 4;
1786
0
  proto_tree_add_item(tree, hf_data,
1787
0
          tvb, off, size, ENC_NA);
1788
0
  off += size;
1789
1790
0
  return off;
1791
0
}
1792
1793
/** Dissect a blob of data.
1794
 *
1795
 * This is intended for data that is not yet being dissected but will be later.
1796
 */
1797
static
1798
unsigned c_dissect_data(proto_tree *tree, int hf,
1799
         tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1800
0
{
1801
0
  return c_dissect_blob(tree, hf, hf_data_data, hf_data_size, tvb, pinfo, off);
1802
0
}
1803
1804
typedef struct _c_str {
1805
  char  *str;  /** The string data ('\0' terminated). */
1806
  uint32_t   size; /** The number of bytes in the string. */
1807
} c_str;
1808
1809
/** Dissect a length-delimited string.
1810
 *
1811
 * If \a out is provided the string will be stored there.
1812
 */
1813
static
1814
unsigned c_dissect_str(proto_tree *root, int hf, c_str *out,
1815
         tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1816
0
{
1817
0
  proto_item *ti;
1818
0
  proto_tree *tree;
1819
0
  c_str d;
1820
1821
0
  d.size = tvb_get_letohl(tvb, off);
1822
0
  d.str  = (char*)tvb_get_string_enc(pinfo->pool,
1823
0
             tvb, off+4, d.size, ENC_ASCII);
1824
1825
0
  ti = proto_tree_add_string(root, hf, tvb, off, 4+d.size, d.str);
1826
0
  tree = proto_item_add_subtree(ti, ett_str);
1827
1828
0
  proto_tree_add_item(tree, hf_string_size,
1829
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
1830
0
  off += 4;
1831
0
  proto_tree_add_item(tree, hf_string_data,
1832
0
          tvb, off, d.size, ENC_UTF_8);
1833
0
  off += d.size;
1834
1835
0
  if (out) *out = d;
1836
1837
0
  return off;
1838
0
}
1839
1840
893
#define C_SIZE_SOCKADDR_STORAGE 128
1841
1842
typedef struct _c_sockaddr {
1843
  const char *str;      /** A string representing the entire address. */
1844
  const char *addr_str; /** A string representing the address portion. */
1845
1846
  c_inet af;         /** Address family. */
1847
  uint16_t port;         /** Network Port. */
1848
} c_sockaddr;
1849
1850
/** Dissect sockaddr structure.
1851
 *
1852
 * If \a out is provided the data will be stored there.
1853
 */
1854
static
1855
unsigned c_dissect_sockaddr(proto_tree *root, c_sockaddr *out,
1856
       tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1857
92
{
1858
92
  proto_item *ti;
1859
92
  proto_tree *tree;
1860
92
  c_sockaddr d;
1861
1862
  /*
1863
  struct sockaddr_storage {
1864
    uint16_t family;
1865
    uint8_t pad[???]; // Implementation defined.
1866
  };
1867
  struct sockaddr_in {
1868
    uint16_t family;
1869
    uint16_t port;
1870
    uint32_t addr;
1871
    uint8_t pad[8];
1872
  };
1873
  struct sockaddr_in6 {
1874
    uint16_t family;
1875
    uint16_t port;
1876
    uint32_t flow;
1877
    uint8_t addr[16];
1878
    uint32_t scope;
1879
  };
1880
  */
1881
1882
92
  ti = proto_tree_add_item(root, hf_sockaddr,
1883
92
         tvb, off, C_SIZE_SOCKADDR_STORAGE, ENC_NA);
1884
92
  tree = proto_item_add_subtree(ti, ett_sockaddr);
1885
1886
92
  d.af = (c_inet)tvb_get_ntohs(tvb, off);
1887
1888
92
  proto_tree_add_item(tree, hf_inet_family, tvb, off, 2, ENC_BIG_ENDIAN);
1889
1890
92
  switch (d.af) {
1891
9
  case C_IPv4:
1892
9
    d.port     = tvb_get_ntohs(tvb, off+2);
1893
9
    d.addr_str = tvb_ip_to_str(pinfo->pool, tvb, off+4);
1894
1895
9
    proto_tree_add_item(tree, hf_port, tvb, off+2, 2, ENC_BIG_ENDIAN);
1896
9
    proto_tree_add_item(tree, hf_addr_ipv4, tvb, off+4, 4, ENC_BIG_ENDIAN);
1897
9
    break;
1898
0
  case C_IPv6:
1899
0
    d.port     = tvb_get_ntohs (tvb, off+2);
1900
0
    d.addr_str = tvb_ip6_to_str(pinfo->pool, tvb, off+8);
1901
1902
0
    proto_tree_add_item(tree, hf_port, tvb, off+2, 2, ENC_BIG_ENDIAN);
1903
0
    proto_tree_add_item(tree, hf_addr_ipv6, tvb, off+8, 16, ENC_NA);
1904
0
    break;
1905
83
  default:
1906
83
    d.port = 0;
1907
83
    d.addr_str = "Unknown INET";
1908
92
  }
1909
92
  off += C_SIZE_SOCKADDR_STORAGE; /* Skip over sockaddr_storage. */
1910
1911
92
  d.str = wmem_strdup_printf(pinfo->pool, "%s:%"PRIu16,
1912
92
           d.addr_str,
1913
92
           d.port);
1914
92
  proto_item_append_text(ti, ": %s", d.str);
1915
1916
92
  if (out) *out = d;
1917
1918
92
  return off;
1919
92
}
1920
1921
709
#define C_SIZE_ENTITY_ADDR (4 + 4 + C_SIZE_SOCKADDR_STORAGE)
1922
1923
typedef struct _c_entity_addr {
1924
  c_sockaddr addr;
1925
  const char *type_str;
1926
  c_node_type type;
1927
} c_entityaddr;
1928
1929
static
1930
unsigned c_dissect_entityaddr(proto_tree *root, int hf, c_entityaddr *out,
1931
         tvbuff_t *tvb, packet_info* pinfo, unsigned off)
1932
92
{
1933
92
  proto_item *ti;
1934
92
  proto_tree *tree;
1935
92
  c_entityaddr d;
1936
1937
  /* entity_addr_t from ceph:/src/msg/msg_types.h */
1938
1939
92
  ti = proto_tree_add_item(root, hf, tvb, off, C_SIZE_ENTITY_ADDR, ENC_NA);
1940
92
  tree = proto_item_add_subtree(ti, ett_entityaddr);
1941
1942
92
  d.type = (c_node_type)tvb_get_letohl(tvb, off);
1943
92
  d.type_str = c_node_type_string(d.type, pinfo->pool);
1944
92
  proto_tree_add_item(tree, hf_node_type,
1945
92
          tvb, off, 4, ENC_LITTLE_ENDIAN);
1946
92
  off += 4;
1947
92
  proto_tree_add_item(tree, hf_node_nonce,
1948
92
          tvb, off, 4, ENC_LITTLE_ENDIAN);
1949
92
  off += 4;
1950
92
  off = c_dissect_sockaddr(tree, &d.addr, tvb, pinfo, off);
1951
1952
92
  proto_item_append_text(ti, ", Type: %s, Address: %s",
1953
92
             d.type_str, d.addr.str);
1954
1955
92
  if (out) *out = d;
1956
1957
92
  return off;
1958
92
}
1959
1960
58
#define C_SIZE_ENTITY_NAME 9
1961
1962
/** Dissect a ceph_entity_name.
1963
 *
1964
 * If \a out is provided the data is stored there.
1965
 */
1966
static
1967
unsigned c_dissect_entityname(proto_tree *root, int hf, c_entityname *out,
1968
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
1969
18
{
1970
  /* From ceph:/src/include/msgr.h
1971
  struct ceph_entity_name {
1972
    __u8 type;  // CEPH_ENTITY_TYPE_*
1973
    __le64 num;
1974
  } __attribute__ ((packed));
1975
  */
1976
1977
18
  proto_item *ti;
1978
18
  proto_tree *tree;
1979
18
  c_entityname d;
1980
1981
18
  ti = proto_tree_add_item(root, hf,
1982
18
         tvb, off, C_SIZE_ENTITY_NAME, ENC_NA);
1983
18
  tree = proto_item_add_subtree(ti, ett_entityname);
1984
1985
18
  d.type     = (c_node_type)tvb_get_uint8(tvb, off);
1986
18
  d.type_str = val_to_str(data->pinfo->pool, d.type, c_node_type_abbr_strings, "Unknown (0x%02x)");
1987
18
  proto_tree_add_item(tree, hf_node_type,
1988
18
          tvb, off, 1, ENC_LITTLE_ENDIAN);
1989
18
  off += 1;
1990
1991
18
  d.id   = tvb_get_letoh64(tvb, off);
1992
18
  proto_tree_add_item(tree, hf_node_id,
1993
18
          tvb, off, 8, ENC_LITTLE_ENDIAN);
1994
18
  off += 8;
1995
1996
18
  if (d.id == UINT64_MAX)
1997
2
  {
1998
2
    d.slug = d.type_str;
1999
2
  }
2000
16
  else
2001
16
  {
2002
16
    d.slug = wmem_strdup_printf(data->pinfo->pool, "%s%"PRIu64,
2003
16
              d.type_str,
2004
16
              d.id);
2005
16
  }
2006
2007
18
  proto_item_append_text(ti, ": %s", d.slug);
2008
2009
18
  if (out) *out = d;
2010
18
  return off;
2011
18
}
2012
2013
typedef struct _c_entityinst {
2014
  c_entityname name;
2015
  c_entityaddr addr;
2016
} c_entityinst;
2017
2018
/** Dissect an entity_inst_t.
2019
 */
2020
static
2021
unsigned c_dissect_entityinst(proto_tree *root, int hf, c_entityinst *out,
2022
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2023
0
{
2024
0
  proto_item *ti;
2025
0
  proto_tree *tree;
2026
2027
0
  c_entityinst d;
2028
2029
0
  ti = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2030
0
  tree = proto_item_add_subtree(ti, ett_entityinst);
2031
2032
0
  off = c_dissect_entityname(tree, hf_entityinst_name, &d.name, tvb, off, data);
2033
0
  off = c_dissect_entityaddr(tree, hf_entityinst_addr, &d.addr, tvb, data->pinfo, off);
2034
2035
0
  proto_item_append_text(ti, ", Name: %s, Address: %s", d.name.slug, d.addr.addr.str);
2036
2037
0
  if (out) *out = d;
2038
2039
0
  proto_item_set_end(ti, tvb, off);
2040
0
  return off;
2041
0
}
2042
2043
/** Dissect an EntityName.
2044
 *
2045
 * If \a out is provided the data is stored there.
2046
 *
2047
 * \note This is different then c_dissect_entityname()
2048
 */
2049
static
2050
unsigned c_dissect_EntityName(proto_tree *root,
2051
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2052
0
{
2053
  /* EntityName from ceph:/src/common/entity_name.h */
2054
2055
0
  proto_item *ti;
2056
0
  proto_tree *tree;
2057
0
  c_node_type type;
2058
0
  c_str name;
2059
2060
0
  ti = proto_tree_add_item(root, hf_EntityName,
2061
0
         tvb, off, -1, ENC_NA);
2062
0
  tree = proto_item_add_subtree(ti, ett_EntityName);
2063
2064
0
  type = (c_node_type)tvb_get_letohl(tvb, off);
2065
0
  proto_tree_add_item(tree, hf_EntityName_type,
2066
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2067
0
  off += 4;
2068
2069
0
  off = c_dissect_str(tree, hf_EntityName_id, &name, tvb, data->pinfo, off);
2070
2071
0
  proto_item_append_text(ti, ": %s.%s", val_to_str(data->pinfo->pool, type, c_node_type_abbr_strings, "Unknown (0x%02x)"), name.str);
2072
2073
0
  proto_item_set_end(ti, tvb, off);
2074
0
  return off;
2075
0
}
2076
2077
/** Dissect a connection features list. */
2078
static
2079
unsigned c_dissect_features(proto_tree *tree,
2080
       tvbuff_t *tvb, unsigned off, c_pkt_data *data _U_)
2081
205
{
2082
205
  static int * const lowword[] = {
2083
205
    &hf_feature_uid,
2084
205
    &hf_feature_nosrcaddr,
2085
205
    &hf_feature_monclockcheck,
2086
205
    &hf_feature_flock,
2087
205
    &hf_feature_subscribe2,
2088
205
    &hf_feature_monnames,
2089
205
    &hf_feature_reconnect_seq,
2090
205
    &hf_feature_dirlayouthash,
2091
205
    &hf_feature_objectlocator,
2092
205
    &hf_feature_pgid64,
2093
205
    &hf_feature_incsubosdmap,
2094
205
    &hf_feature_pgpool3,
2095
205
    &hf_feature_osdreplymux,
2096
205
    &hf_feature_osdenc,
2097
205
    &hf_feature_omap,
2098
205
    &hf_feature_monenc,
2099
205
    &hf_feature_query_t,
2100
205
    &hf_feature_indep_pg_map,
2101
205
    &hf_feature_crush_tunables,
2102
205
    &hf_feature_chunky_scrub,
2103
205
    &hf_feature_mon_nullroute,
2104
205
    &hf_feature_mon_gv,
2105
205
    &hf_feature_backfill_reservation,
2106
205
    &hf_feature_msg_auth,
2107
205
    &hf_feature_recovery_reservation,
2108
205
    &hf_feature_crush_tunables2,
2109
205
    &hf_feature_createpoolid,
2110
205
    &hf_feature_reply_create_inode,
2111
205
    &hf_feature_osd_hbmsgs,
2112
205
    &hf_feature_mdsenc,
2113
205
    &hf_feature_osdhashpspool,
2114
205
    &hf_feature_mon_single_paxos,
2115
205
    NULL
2116
205
  };
2117
205
  static int * const highword[] = {
2118
205
    &hf_feature_osd_snapmapper,
2119
205
    &hf_feature_mon_scrub,
2120
205
    &hf_feature_osd_packed_recovery,
2121
205
    &hf_feature_osd_cachepool,
2122
205
    &hf_feature_crush_v2,
2123
205
    &hf_feature_export_peer,
2124
205
    &hf_feature_osd_erasure_codes,
2125
205
    &hf_feature_osd_tmap2omap,
2126
205
    &hf_feature_osdmap_enc,
2127
205
    &hf_feature_mds_inline_data,
2128
205
    &hf_feature_crush_tunables3,
2129
205
    &hf_feature_osd_primary_affinity,
2130
205
    &hf_feature_msgr_keepalive2,
2131
205
    &hf_feature_reserved,
2132
205
    NULL
2133
205
  };
2134
2135
  /* Wireshark doesn't have support for 64 bit bitfields so dissect as
2136
     two 32 bit ones. */
2137
2138
205
  proto_tree_add_bitmask(tree, tvb, off, hf_features_low, hf_features_low,
2139
205
             lowword, ENC_LITTLE_ENDIAN);
2140
205
  off += 4;
2141
2142
205
  proto_tree_add_bitmask(tree, tvb, off, hf_features_high, hf_features_high,
2143
205
             highword, ENC_LITTLE_ENDIAN);
2144
205
  off += 4;
2145
2146
205
  return off;
2147
205
}
2148
2149
/** Dissect message flags. */
2150
static
2151
unsigned c_dissect_flags(proto_tree *tree,
2152
          tvbuff_t *tvb, unsigned off, c_pkt_data *data _U_)
2153
220
{
2154
220
  static int * const flags[] = {
2155
220
    &hf_flag_lossy,
2156
220
    NULL
2157
220
  };
2158
2159
220
  proto_tree_add_bitmask(tree, tvb, off, hf_flags, hf_flags,
2160
220
             flags, ENC_LITTLE_ENDIAN);
2161
2162
220
  return off+1;
2163
220
}
2164
2165
14
#define C_OSD_FLAG_ACK        0x00000001   /* want (or is) "ack" ack */
2166
14
#define C_OSD_FLAG_ONNVRAM      0x00000002   /* want (or is) "onnvram" ack */
2167
14
#define C_OSD_FLAG_ONDISK     0x00000004   /* want (or is) "ondisk" ack */
2168
14
#define C_OSD_FLAG_RETRY      0x00000008   /* resend attempt */
2169
14
#define C_OSD_FLAG_READ       0x00000010   /* op may read */
2170
14
#define C_OSD_FLAG_WRITE      0x00000020   /* op may write */
2171
14
#define C_OSD_FLAG_ORDERSNAP      0x00000040   /* EOLDSNAP if snapc is out of order */
2172
14
#define C_OSD_FLAG_PEERSTAT_OLD     0x00000080   /* DEPRECATED msg includes osd_peer_stat */
2173
14
#define C_OSD_FLAG_BALANCE_READS    0x00000100
2174
14
#define C_OSD_FLAG_PARALLELEXEC     0x00000200   /* execute op in parallel */
2175
14
#define C_OSD_FLAG_PGOP       0x00000400   /* pg op, no object */
2176
14
#define C_OSD_FLAG_EXEC       0x00000800   /* op may exec */
2177
14
#define C_OSD_FLAG_EXEC_PUBLIC      0x00001000   /* DEPRECATED op may exec (public) */
2178
14
#define C_OSD_FLAG_LOCALIZE_READS   0x00002000   /* read from nearby replica, if any */
2179
14
#define C_OSD_FLAG_RWORDERED      0x00004000   /* order wrt concurrent reads */
2180
14
#define C_OSD_FLAG_IGNORE_CACHE     0x00008000   /* ignore cache logic */
2181
14
#define C_OSD_FLAG_SKIPRWLOCKS      0x00010000   /* skip rw locks */
2182
14
#define C_OSD_FLAG_IGNORE_OVERLAY   0x00020000   /* ignore pool overlay */
2183
14
#define C_OSD_FLAG_FLUSH      0x00040000   /* this is part of flush */
2184
14
#define C_OSD_FLAG_MAP_SNAP_CLONE   0x00080000   /* map snap direct to clone id */
2185
14
#define C_OSD_FLAG_ENFORCE_SNAPC    0x00100000   /* use snapc provided even if pool uses pool snaps */
2186
2187
/** Dissect OSD flags. */
2188
static
2189
unsigned c_dissect_osd_flags(proto_tree *tree,
2190
        tvbuff_t *tvb, unsigned off, c_pkt_data *data _U_)
2191
0
{
2192
0
  static int * const flags[] = {
2193
0
    &hf_osd_flag_ack,
2194
0
    &hf_osd_flag_onnvram,
2195
0
    &hf_osd_flag_ondisk,
2196
0
    &hf_osd_flag_retry,
2197
0
    &hf_osd_flag_read,
2198
0
    &hf_osd_flag_write,
2199
0
    &hf_osd_flag_ordersnap,
2200
0
    &hf_osd_flag_peerstat_old,
2201
0
    &hf_osd_flag_balance_reads,
2202
0
    &hf_osd_flag_parallelexec,
2203
0
    &hf_osd_flag_pgop,
2204
0
    &hf_osd_flag_exec,
2205
0
    &hf_osd_flag_exec_public,
2206
0
    &hf_osd_flag_localize_reads,
2207
0
    &hf_osd_flag_rwordered,
2208
0
    &hf_osd_flag_ignore_cache,
2209
0
    &hf_osd_flag_skiprwlocks,
2210
0
    &hf_osd_flag_ignore_overlay,
2211
0
    &hf_osd_flag_flush,
2212
0
    &hf_osd_flag_map_snap_clone,
2213
0
    &hf_osd_flag_enforce_snapc,
2214
0
    NULL
2215
0
  };
2216
2217
0
  proto_tree_add_bitmask(tree, tvb, off, hf_osd_flags, hf_osd_flags,
2218
0
             flags, ENC_LITTLE_ENDIAN);
2219
2220
0
  return off+4;
2221
0
}
2222
2223
/** Dissect a map<string,string>
2224
 */
2225
static
2226
unsigned c_dissect_kv(proto_tree *root, int hf, int hf_k, int hf_v,
2227
       tvbuff_t *tvb, packet_info* pinfo, unsigned off)
2228
0
{
2229
0
  proto_item *ti;
2230
0
  proto_tree *tree;
2231
0
  c_str k, v;
2232
2233
0
  ti = proto_tree_add_item(root, hf, tvb, off, -1, ENC_LITTLE_ENDIAN);
2234
0
  tree = proto_item_add_subtree(ti, ett_kv);
2235
2236
0
  off = c_dissect_str(tree, hf_k, &k, tvb, pinfo, off);
2237
0
  off = c_dissect_str(tree, hf_v, &v, tvb, pinfo, off);
2238
2239
0
  proto_item_append_text(ti, ", %s = %s", k.str, v.str);
2240
0
  proto_item_set_end(ti, tvb, off);
2241
2242
0
  return off;
2243
0
}
2244
2245
typedef struct _c_encoded {
2246
  uint8_t version; /** The version of the struct. */
2247
  uint8_t compat;  /** The oldest compatible version. */
2248
  uint32_t size;   /** The size of the struct in bytes */
2249
  unsigned  end;   /** The end of the structure's data. */
2250
} c_encoded;
2251
2252
/** Dissect and 'encoded' struct.
2253
 *
2254
 * @param enc The encoded structure to store data in.
2255
 * @param minver The minimum version that is understood.
2256
 * @param maxver The maximum version that is understood.
2257
 * @return The offset of the data.
2258
 */
2259
static
2260
unsigned c_dissect_encoded(proto_tree *tree, c_encoded *enc,
2261
      uint8_t minver, uint8_t maxver,
2262
      tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2263
0
{
2264
0
  proto_item *ti;
2265
2266
0
  DISSECTOR_ASSERT_HINT(enc, "enc out parameter must be non-null.");
2267
2268
0
  enc->version = tvb_get_uint8(tvb, off);
2269
0
  ti = proto_tree_add_item(tree, hf_encoded_ver,
2270
0
         tvb, off++, 1, ENC_LITTLE_ENDIAN);
2271
  /* XXX - should we quit if this doesn't return 0? */
2272
0
  c_warn_ver(ti, enc->version, minver, maxver, data);
2273
0
  enc->compat = tvb_get_uint8(tvb, off);
2274
0
  proto_tree_add_item(tree, hf_encoded_compat,
2275
0
          tvb, off++, 1, ENC_LITTLE_ENDIAN);
2276
2277
0
  enc->size = tvb_get_letohl(tvb, off);
2278
0
  proto_tree_add_item(tree, hf_encoded_size,
2279
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2280
0
  off += 4;
2281
2282
0
  enc->end = off + enc->size;
2283
2284
0
  return off;
2285
0
}
2286
2287
56
#define C_SIZE_TIMESPEC  (4 + 4)
2288
2289
0
#define C_SIZE_EVERSION  12
2290
2291
/** Dissect a eversion_t */
2292
static
2293
unsigned c_dissect_eversion(proto_tree *root, int hf,
2294
       tvbuff_t *tvb, unsigned off, c_pkt_data *data _U_)
2295
0
{
2296
0
  proto_item *ti;
2297
0
  proto_tree *tree;
2298
0
  uint64_t ver;
2299
0
  uint32_t epoch;
2300
2301
  /** eversion_t from ceph:/src/osd/osd_types.h */
2302
2303
0
  ti   = proto_tree_add_item(root, hf, tvb, off, C_SIZE_EVERSION, ENC_NA);
2304
0
  tree = proto_item_add_subtree(ti, ett_eversion);
2305
2306
  /*** version_t ***/
2307
0
  ver = tvb_get_letoh64(tvb, off);
2308
0
  proto_tree_add_item(tree, hf_version, tvb, off, 8, ENC_LITTLE_ENDIAN);
2309
0
  off += 8;
2310
2311
  /*** epoch_t ***/
2312
0
  epoch = tvb_get_letohl(tvb, off);
2313
0
  proto_tree_add_item(tree, hf_epoch, tvb, off, 4, ENC_LITTLE_ENDIAN);
2314
0
  off += 4;
2315
2316
0
  proto_item_append_text(ti,
2317
0
             ", Version: %"PRId64
2318
0
             ", Epoch: %"PRId32,
2319
0
             ver, epoch);
2320
2321
0
  proto_item_set_end(ti, tvb, off);
2322
0
  return off;
2323
0
}
2324
2325
/** Dissect an object locator. */
2326
static
2327
unsigned c_dissect_object_locator(proto_tree *root, int hf,
2328
             tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2329
0
{
2330
0
  proto_item *ti;
2331
0
  proto_tree *tree;
2332
0
  c_encoded enchdr;
2333
0
  c_str key, nspace;
2334
0
  int64_t hash;
2335
2336
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2337
0
  tree = proto_item_add_subtree(ti, ett_objectlocator);
2338
2339
0
  off = c_dissect_encoded(tree, &enchdr, 3, 6, tvb, off, data);
2340
2341
0
  proto_item_append_text(ti, ", Pool: %"PRId64,
2342
0
             tvb_get_letohi64(tvb, off));
2343
0
  proto_tree_add_item(tree, hf_pool, tvb, off, 8, ENC_LITTLE_ENDIAN);
2344
0
  off += 8;
2345
2346
0
  off += 4; /* Skip over preferred == -1 that old code used. */
2347
2348
0
  key.size = tvb_get_letohl(tvb, off);
2349
0
  if (key.size)
2350
0
  {
2351
0
    off = c_dissect_str(tree, hf_key, &key, tvb, data->pinfo, off);
2352
0
    proto_item_append_text(ti, ", Key: \"%s\"", key.str);
2353
0
  }
2354
0
  else off += 4; /* If string is empty we should use hash. */
2355
2356
0
  if (enchdr.version >= 5)
2357
0
  {
2358
0
    off = c_dissect_str(tree, hf_namespace, &nspace, tvb, data->pinfo, off);
2359
0
    if (nspace.size)
2360
0
      proto_item_append_text(ti, ", Namespace: \"%s\"", nspace.str);
2361
0
  }
2362
2363
0
  if (enchdr.version >= 6)
2364
0
  {
2365
0
    hash = tvb_get_letoh64(tvb, off);
2366
0
    if (hash >= 0)
2367
0
    {
2368
0
      proto_tree_add_item(tree, hf_hash, tvb, off, 8, ENC_LITTLE_ENDIAN);
2369
0
      proto_item_append_text(ti, ", Hash: %"PRId64, hash);
2370
0
    }
2371
0
    off += 8;
2372
0
  }
2373
0
  else hash = -1;
2374
2375
0
  if (key.size && hash >= 0)
2376
0
  {
2377
0
    proto_tree_add_expert(tree, data->pinfo, &ei_oloc_both, NULL, 0, 0);
2378
0
  }
2379
2380
0
  c_warn_size(tree, tvb, off, enchdr.end, data);
2381
0
  off = enchdr.end;
2382
2383
0
  proto_item_set_end(ti, tvb, off);
2384
0
  return off;
2385
0
}
2386
2387
/** Dissect a placement group. */
2388
static
2389
unsigned c_dissect_pg(proto_tree *root, int hf,
2390
       tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2391
0
{
2392
0
  proto_item *ti, *ti2;
2393
0
  proto_tree *tree;
2394
0
  uint8_t ver;
2395
0
  int32_t preferred;
2396
2397
  /** pg_t from ceph:/src/osd/osd_types.h */
2398
2399
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2400
0
  tree = proto_item_add_subtree(ti, ett_pg);
2401
2402
0
  ver = tvb_get_uint8(tvb, off);
2403
0
  ti2 = proto_tree_add_item(tree, hf_pgid_ver, tvb, off, 1, ENC_LITTLE_ENDIAN);
2404
  /* XXX - should we quit if this doesn't return 0? */
2405
0
  c_warn_ver(ti2, ver, 1, 1, data);
2406
0
  off += 1;
2407
2408
0
  proto_item_append_text(ti, ", Pool: %"PRId64,
2409
0
             tvb_get_letoh64(tvb, off));
2410
0
  proto_tree_add_item(tree, hf_pgid_pool, tvb, off, 8, ENC_LITTLE_ENDIAN);
2411
0
  off += 8;
2412
2413
0
  proto_item_append_text(ti, ", Seed: %08"PRIX32,
2414
0
             tvb_get_letohl(tvb, off));
2415
0
  proto_tree_add_item(tree, hf_pgid_seed, tvb, off, 4, ENC_LITTLE_ENDIAN);
2416
0
  off += 4;
2417
2418
0
  preferred = tvb_get_letohl(tvb, off);
2419
0
  if (preferred >= 0)
2420
0
    proto_item_append_text(ti, ", Prefer: %"PRId32, preferred);
2421
0
  proto_tree_add_item(tree, hf_pgid_preferred, tvb, off, 4, ENC_LITTLE_ENDIAN);
2422
0
  off += 4;
2423
2424
0
  proto_item_set_end(ti, tvb, off);
2425
0
  return off;
2426
0
}
2427
2428
/** Dissect a placement group creation. */
2429
static
2430
unsigned c_dissect_pg_create(proto_tree *root, int hf,
2431
        tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2432
0
{
2433
0
  proto_item *ti;
2434
0
  proto_tree *tree;
2435
0
  c_encoded enc;
2436
2437
  /** pg_create_t from ceph:/src/osd/osd_types.h */
2438
2439
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2440
0
  tree = proto_item_add_subtree(ti, ett_pg_create);
2441
2442
0
  off = c_dissect_encoded(tree, &enc, 1, 1, tvb, off, data);
2443
2444
0
  proto_tree_add_item(tree, hf_pg_create_epoch,
2445
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2446
0
  off += 4;
2447
2448
0
  off = c_dissect_pg(tree, hf_pg_create_parent, tvb, off, data);
2449
2450
0
  proto_tree_add_item(tree, hf_pg_create_splitbits,
2451
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2452
0
  off += 4;
2453
2454
0
  c_warn_size(tree, tvb, off, enc.end, data);
2455
0
  off = enc.end;
2456
2457
0
  proto_item_set_end(ti, tvb, off);
2458
0
  return off;
2459
0
}
2460
2461
/** Dissect a filepath. */
2462
static
2463
unsigned c_dissect_path(proto_tree *root, int hf,
2464
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2465
0
{
2466
0
  proto_item *ti, *ti2;
2467
0
  proto_tree *tree;
2468
0
  uint64_t inode;
2469
0
  c_str rel;
2470
0
  unsigned v;
2471
2472
  /** filepath from ceph:/src/include/filepath.h */
2473
2474
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2475
0
  tree = proto_item_add_subtree(ti, ett_filepath);
2476
2477
0
  v = tvb_get_uint8(tvb, off);
2478
0
  ti2 = proto_tree_add_item(tree, hf_path_ver, tvb, off, 1, ENC_LITTLE_ENDIAN);
2479
  /* XXX - should we quit if this doesn't return 0? */
2480
0
  c_warn_ver(ti2, v, 1, 1, data);
2481
0
  off += 1;
2482
2483
0
  inode = tvb_get_letoh64(tvb, off);
2484
0
  proto_tree_add_item(tree, hf_path_inode, tvb, off, 8, ENC_LITTLE_ENDIAN);
2485
0
  off += 8;
2486
2487
0
  off = c_dissect_str(tree, hf_path_rel, &rel, tvb, data->pinfo, off);
2488
2489
0
  if (inode)
2490
0
    proto_item_append_text(ti, ", Inode: 0x%016"PRIu64, inode);
2491
0
  if (rel.size)
2492
0
    proto_item_append_text(ti, ", Rel: \"%s\"", rel.str);
2493
2494
0
  proto_item_set_end(ti, tvb, off);
2495
0
  return off;
2496
0
}
2497
2498
/** Dissect a capability release. */
2499
static
2500
unsigned c_dissect_mds_release(proto_tree *root, int hf,
2501
          tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2502
0
{
2503
0
  proto_item *ti;
2504
0
  proto_tree *tree;
2505
0
  uint64_t inode;
2506
2507
  /** MClientRequest::Release from ceph:/src/messages/MClientRequest.h */
2508
2509
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2510
0
  tree = proto_item_add_subtree(ti, ett_mds_release);
2511
2512
0
  inode = tvb_get_letoh64(tvb, off);
2513
0
  proto_tree_add_item(tree, hf_mds_release_inode,
2514
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2515
0
  off += 8;
2516
2517
0
  proto_tree_add_item(tree, hf_mds_release_capid,
2518
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2519
0
  off += 8;
2520
2521
0
  proto_tree_add_item(tree, hf_mds_release_new,
2522
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2523
0
  off += 4;
2524
2525
0
  proto_tree_add_item(tree, hf_mds_release_wanted,
2526
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2527
0
  off += 4;
2528
2529
0
  proto_tree_add_item(tree, hf_mds_release_seq,
2530
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2531
0
  off += 4;
2532
2533
0
  proto_tree_add_item(tree, hf_mds_release_seq_issue,
2534
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2535
0
  off += 4;
2536
2537
0
  proto_tree_add_item(tree, hf_mds_release_mseq,
2538
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2539
0
  off += 4;
2540
2541
0
  proto_tree_add_item(tree, hf_mds_release_dname_seq,
2542
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2543
0
  off += 4;
2544
2545
0
  off = c_dissect_str(tree, hf_mds_release_dname, NULL, tvb, data->pinfo, off);
2546
2547
0
  proto_item_append_text(ti, ", Inode: 0x%016"PRIu64, inode);
2548
2549
0
  proto_item_set_end(ti, tvb, off);
2550
0
  return off;
2551
0
}
2552
2553
/** Dissect a HitSet::Params */
2554
static
2555
unsigned c_dissect_hitset_params(proto_tree *root,
2556
            tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2557
0
{
2558
0
  proto_item *ti, *ti2;
2559
0
  proto_tree *tree;
2560
0
  c_encoded enc, encimpl;
2561
0
  c_hitset_params_type type;
2562
0
  uint32_t i;
2563
2564
  /** HitSet::Params from ceph:/src/osd/HitSet.h */
2565
2566
0
  ti   = proto_tree_add_item(root, hf_hitset_params, tvb, off, -1, ENC_NA);
2567
0
  tree = proto_item_add_subtree(ti, ett_hitset_params);
2568
2569
0
  off = c_dissect_encoded(tree, &enc, 1, 1, tvb, off, data);
2570
2571
0
  type = (c_hitset_params_type)tvb_get_uint8(tvb, off);
2572
0
  proto_item_append_text(ti, ", Type: %s", c_hitset_params_type_string(type, data->pinfo->pool));
2573
0
  ti2 = proto_tree_add_item(tree, hf_hitset_params_type,
2574
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2575
0
  off += 1;
2576
2577
0
  switch (type)
2578
0
  {
2579
0
  case C_HITSET_PARAMS_TYPE_NONE:
2580
0
    break;
2581
0
  case C_HITSET_PARAMS_TYPE_EXPLICIT_HASH:
2582
0
    off = c_dissect_encoded(tree, &encimpl, 1, 1, tvb, off, data);
2583
2584
0
    proto_tree_add_item(tree, hf_hitset_params_exphash_count,
2585
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
2586
0
    off += 8;
2587
2588
0
    i = tvb_get_letohl(tvb, off);
2589
0
    off += 4;
2590
0
    while (i--)
2591
0
    {
2592
0
      proto_tree_add_item(tree, hf_hitset_params_exphash_hit,
2593
0
              tvb, off, 4, ENC_LITTLE_ENDIAN);
2594
0
      off += 4;
2595
0
    }
2596
2597
0
    c_warn_size(tree, tvb, off, encimpl.end, data);
2598
0
    off = encimpl.end;
2599
0
    break;
2600
0
  default:
2601
0
    expert_add_info(data->pinfo, ti2, &ei_union_unknown);
2602
0
    off = enc.end; /* Skip everything. */
2603
0
  }
2604
2605
0
  c_warn_size(tree, tvb, off, enc.end, data);
2606
0
  off = enc.end;
2607
2608
0
  return off;
2609
0
}
2610
2611
2612
/** Dissect a pool_snap_info_t */
2613
static
2614
unsigned c_dissect_snapinfo(proto_tree *root,
2615
       tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2616
0
{
2617
0
  proto_item *ti;
2618
0
  proto_tree *tree;
2619
0
  c_encoded enc;
2620
0
  uint64_t id;
2621
0
  c_str name;
2622
0
  char *date;
2623
2624
  /** pool_snap_info_t from ceph:/src/osd/osd_types.h */
2625
2626
0
  ti   = proto_tree_add_item(root, hf_snapinfo, tvb, off, -1, ENC_NA);
2627
0
  tree = proto_item_add_subtree(ti, ett_snapinfo);
2628
2629
0
  off = c_dissect_encoded(tree, &enc, 2, 2, tvb, off, data);
2630
2631
0
  id = tvb_get_letoh64(tvb, off);
2632
0
  proto_tree_add_item(tree, hf_snapinfo_id,
2633
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2634
0
  off += 8;
2635
2636
0
  date = c_format_timespec(tvb, data->pinfo, off);
2637
0
  proto_tree_add_item(tree, hf_snapinfo_time,
2638
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2639
0
  off += 8;
2640
2641
0
  off = c_dissect_str(tree, hf_snapinfo_name, &name, tvb, data->pinfo, off);
2642
2643
0
  proto_item_set_text(ti, ", ID: 0x%016"PRIX64
2644
0
          ", Name: %s, Date: %s",
2645
0
          id,
2646
0
          name.str,
2647
0
          date);
2648
2649
0
  c_warn_size(tree, tvb, off, enc.size, data);
2650
0
  off = enc.size;
2651
2652
0
  return off;
2653
0
}
2654
2655
/** Dissect a pg pool. */
2656
static
2657
unsigned c_dissect_pgpool(proto_tree *root,
2658
           tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2659
0
{
2660
0
  proto_item *ti, *ti2;
2661
0
  proto_tree *tree, *subtree;
2662
0
  c_encoded enc;
2663
0
  uint32_t i;
2664
0
  c_pgpool_type type;
2665
0
  c_pgpool_cachemode cachemode;
2666
2667
0
  static int * const flags_low[] = {
2668
0
    &hf_pgpool_flag_hashpool,
2669
0
    &hf_pgpool_flag_full,
2670
0
    &hf_pgpool_flag_fake_ec_pool,
2671
0
    NULL
2672
0
  };
2673
0
  static int * const flags_high[] = {
2674
0
    NULL
2675
0
  };
2676
2677
  /** pg_pool_t from ceph:/src/osd/osd_types.h */
2678
2679
0
  ti   = proto_tree_add_item(root, hf_pgpool, tvb, off, -1, ENC_NA);
2680
0
  tree = proto_item_add_subtree(ti, ett_pgpool);
2681
2682
0
  off = c_dissect_encoded(tree, &enc, 5, 15, tvb, off, data);
2683
2684
0
  type = (c_pgpool_type)tvb_get_uint8(tvb, off);
2685
0
  proto_tree_add_item(tree, hf_pgpool_type,
2686
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2687
0
  off += 1;
2688
2689
0
  proto_tree_add_item(tree, hf_pgpool_size,
2690
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2691
0
  off += 1;
2692
2693
0
  proto_tree_add_item(tree, hf_pgpool_crush_ruleset,
2694
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2695
0
  off += 1;
2696
2697
0
  proto_tree_add_item(tree, hf_pgpool_hash,
2698
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2699
0
  off += 1;
2700
2701
0
  proto_tree_add_item(tree, hf_pgpool_pgnum,
2702
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2703
0
  off += 4;
2704
2705
0
  proto_tree_add_item(tree, hf_pgpool_pgpnum,
2706
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2707
0
  off += 4;
2708
2709
0
  off += 4 + 4; /* Always 0 in new code.  Ignored field. */
2710
2711
0
  proto_tree_add_item(tree, hf_pgpool_changed,
2712
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2713
0
  off += 4;
2714
2715
0
  proto_tree_add_item(tree, hf_pgpool_snapseq,
2716
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2717
0
  off += 8;
2718
2719
0
  proto_tree_add_item(tree, hf_pgpool_snapepoch,
2720
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2721
0
  off += 4;
2722
2723
0
  i = tvb_get_letohl(tvb, off);
2724
0
  off += 4;
2725
0
  while (i--)
2726
0
  {
2727
0
    ti2 = proto_tree_add_item(tree, hf_pgpool_snap,
2728
0
            tvb, off, -1, ENC_NA);
2729
0
    subtree = proto_item_add_subtree(ti2, ett_pgpool_snap);
2730
2731
0
    proto_tree_add_item(subtree, hf_pgpool_snap_id,
2732
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
2733
0
    off += 8;
2734
2735
0
    off = c_dissect_snapinfo(subtree, tvb, off, data);
2736
2737
0
    proto_item_set_end(ti2, tvb, off);
2738
0
  }
2739
2740
0
  i = tvb_get_letohl(tvb, off);
2741
0
  off += 4;
2742
0
  while (i--)
2743
0
  {
2744
0
    ti2 = proto_tree_add_item(tree, hf_pgpool_snapdel,
2745
0
            tvb, off, -1, ENC_NA);
2746
0
    subtree = proto_item_add_subtree(ti2, ett_pgpool_snapdel);
2747
2748
0
    proto_tree_add_item(subtree, hf_pgpool_snapdel_from,
2749
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
2750
0
    off += 8;
2751
0
    proto_tree_add_item(subtree, hf_pgpool_snapdel_to,
2752
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
2753
0
    off += 8;
2754
2755
0
    proto_item_set_end(ti2, tvb, off);
2756
0
  }
2757
2758
0
  proto_tree_add_item(tree, hf_pgpool_uid,
2759
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2760
0
  off += 8;
2761
2762
0
  proto_tree_add_bitmask(tree, tvb, off, hf_pgpool_flags_low, hf_pgpool_flags_low,
2763
0
             flags_low, ENC_LITTLE_ENDIAN);
2764
0
  off += 4;
2765
0
  proto_tree_add_bitmask(tree, tvb, off, hf_pgpool_flags_high, hf_pgpool_flags_high,
2766
0
             flags_high, ENC_LITTLE_ENDIAN);
2767
0
  off += 4;
2768
2769
0
  proto_tree_add_item(tree, hf_pgpool_crash_reply_interval,
2770
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2771
0
  off += 4;
2772
2773
0
  proto_tree_add_item(tree, hf_pgpool_min_size,
2774
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2775
0
  off += 1;
2776
2777
0
  proto_tree_add_item(tree, hf_pgpool_quota_bytes,
2778
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2779
0
  off += 8;
2780
2781
0
  proto_tree_add_item(tree, hf_pgpool_quota_objects,
2782
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2783
0
  off += 8;
2784
2785
0
  i = tvb_get_letohl(tvb, off);
2786
0
  off += 4;
2787
0
  while (i--)
2788
0
  {
2789
0
    proto_tree_add_item(tree, hf_pgpool_tier,
2790
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
2791
0
    off += 8;
2792
0
  }
2793
2794
0
  proto_tree_add_item(tree, hf_pgpool_tierof,
2795
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2796
0
  off += 8;
2797
2798
0
  cachemode = (c_pgpool_cachemode)tvb_get_uint8(tvb, off);
2799
0
  proto_tree_add_item(tree, hf_pgpool_cachemode,
2800
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
2801
0
  off += 1;
2802
2803
0
  proto_tree_add_item(tree, hf_pgpool_readtier,
2804
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2805
0
  off += 8;
2806
2807
0
  proto_tree_add_item(tree, hf_pgpool_writetier,
2808
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2809
0
  off += 8;
2810
2811
0
  i = tvb_get_letohl(tvb, off);
2812
0
  off += 4;
2813
0
  while (i--)
2814
0
  {
2815
0
    c_str k, v;
2816
2817
0
    ti2 = proto_tree_add_item(tree, hf_pgpool_property, tvb, off, -1, ENC_NA);
2818
0
    subtree = proto_item_add_subtree(ti2, ett_pgpool_property);
2819
2820
0
    off = c_dissect_str(subtree, hf_pgpool_property_key, &k, tvb, data->pinfo, off);
2821
0
    off = c_dissect_str(subtree, hf_pgpool_property_val, &v, tvb, data->pinfo, off);
2822
2823
0
    proto_item_append_text(ti2, ": %s=%s", k.str, v.str);
2824
2825
0
    proto_item_set_end(ti2, tvb, off);
2826
0
  }
2827
2828
0
  off = c_dissect_hitset_params(tree, tvb, off, data);
2829
2830
0
  proto_tree_add_item(tree, hf_pgpool_hitset_period,
2831
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2832
0
  off += 4;
2833
2834
0
  proto_tree_add_item(tree, hf_pgpool_hitset_count,
2835
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2836
0
  off += 4;
2837
2838
0
  proto_tree_add_item(tree, hf_pgpool_stripewidth,
2839
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2840
0
  off += 4;
2841
2842
0
  proto_tree_add_item(tree, hf_pgpool_targetmaxsize,
2843
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2844
0
  off += 8;
2845
2846
0
  proto_tree_add_item(tree, hf_pgpool_targetmaxobj,
2847
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2848
0
  off += 8;
2849
2850
0
  proto_tree_add_item(tree, hf_pgpool_cache_targetdirtyratio,
2851
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2852
0
  off += 4;
2853
2854
0
  proto_tree_add_item(tree, hf_pgpool_cache_targetfullratio,
2855
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2856
0
  off += 4;
2857
2858
0
  proto_tree_add_item(tree, hf_pgpool_cache_flushage_min,
2859
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2860
0
  off += 4;
2861
2862
0
  proto_tree_add_item(tree, hf_pgpool_cache_evictage_min,
2863
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2864
0
  off += 4;
2865
2866
0
  off = c_dissect_str(tree, hf_pgpool_erasurecode_profile, NULL, tvb, data->pinfo, off);
2867
2868
0
  proto_tree_add_item(tree, hf_pgpool_lastforceresend,
2869
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
2870
0
  off += 4;
2871
2872
0
  c_warn_size(tree, tvb, off, enc.end, data);
2873
0
  off = enc.end;
2874
2875
0
  proto_item_append_text(ti, ", Type: %s, Cache Mode: %s",
2876
0
             c_pgpool_type_string(type, data->pinfo->pool),
2877
0
             c_pgpool_cachemode_string(cachemode, data->pinfo->pool));
2878
2879
0
  return off;
2880
0
}
2881
2882
/** Dissect a MonMap. */
2883
static
2884
unsigned c_dissect_monmap(proto_tree *root,
2885
           tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2886
1
{
2887
1
  proto_item *ti, *ti2;
2888
1
  proto_tree *tree, *subtree;
2889
1
  unsigned size, end;
2890
1
  uint32_t i;
2891
1
  c_encoded enc;
2892
1
  c_str str;
2893
1
  c_entityaddr addr;
2894
2895
  /** MonMap from ceph:/src/mon/MonMap.cc */
2896
2897
1
  size = tvb_get_letohl(tvb, off);
2898
1
  end = off + 4 + size;
2899
2900
  /* No data here. */
2901
1
  if (!size) return end;
2902
2903
0
  ti   = proto_tree_add_item(root, hf_monmap, tvb, off, size, ENC_NA);
2904
0
  tree = proto_item_add_subtree(ti, ett_mon_map);
2905
2906
0
  off += 4;
2907
2908
0
  off = c_dissect_encoded(tree, &enc, 3, 3, tvb, off, data);
2909
  /* Check the blob size and encoded size match. */
2910
0
  c_warn_size(tree, tvb, enc.end, end, data);
2911
2912
0
  proto_tree_add_item(tree, hf_monmap_fsid, tvb, off, 16, ENC_BIG_ENDIAN);
2913
0
  off += 16;
2914
2915
0
  proto_tree_add_item(tree, hf_monmap_epoch, tvb, off, 4, ENC_LITTLE_ENDIAN);
2916
0
  off += 4;
2917
2918
0
  i = tvb_get_letohl(tvb, off);
2919
0
  off += 4;
2920
0
  while (i--)
2921
0
  {
2922
0
    ti2 = proto_tree_add_item(tree, hf_monmap_address,
2923
0
            tvb, off, -1, ENC_NA);
2924
0
    subtree = proto_item_add_subtree(ti2, ett_mon_map_address);
2925
2926
0
    off = c_dissect_str(subtree, hf_monmap_address_name, &str, tvb, data->pinfo, off);
2927
0
    off = c_dissect_entityaddr(subtree, hf_monmap_address_addr, &addr,
2928
0
             tvb, data->pinfo, off);
2929
2930
0
    proto_item_append_text(ti2, ", Name: %s, Address: %s",
2931
0
               str.str, addr.addr.addr_str);
2932
2933
0
    proto_item_set_end(ti2, tvb, off);
2934
0
  }
2935
2936
0
  proto_tree_add_item(tree, hf_monmap_changed, tvb, off, 8, ENC_LITTLE_ENDIAN);
2937
0
  off += 8;
2938
2939
0
  proto_tree_add_item(tree, hf_monmap_created, tvb, off, 8, ENC_LITTLE_ENDIAN);
2940
0
  off += 8;
2941
2942
0
  c_warn_size(tree, tvb, off, end, data);
2943
0
  off = end;
2944
2945
0
  return off;
2946
1
}
2947
2948
/** Dissect an osd_peer_stat_t */
2949
static
2950
unsigned c_dissect_osd_peerstat(proto_tree *root,
2951
           tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2952
0
{
2953
0
  proto_item *ti;
2954
0
  proto_tree *tree;
2955
0
  c_encoded enc;
2956
2957
  /* osd_peer_stat_t from ceph:/src/osd/osd_types.h */
2958
2959
0
  ti   = proto_tree_add_item(root, hf_osd_peerstat, tvb, off, -1, ENC_NA);
2960
0
  tree = proto_item_add_subtree(ti, ett_osd_peerstat);
2961
2962
0
  off = c_dissect_encoded(tree, &enc, 1, 1, tvb, off, data);
2963
2964
0
  proto_tree_add_item(tree, hf_osd_peerstat_timestamp,
2965
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2966
0
  off += 8;
2967
2968
0
  c_warn_size(tree, tvb, off, enc.end, data);
2969
0
  off = enc.end;
2970
2971
0
  proto_item_set_end(ti, tvb, off);
2972
0
  return off;
2973
0
}
2974
2975
/** Dissect a CompatSet::FeatureSet */
2976
static
2977
unsigned c_dissect_featureset(proto_tree *root, int hf,
2978
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
2979
0
{
2980
0
  proto_item *ti;
2981
0
  proto_tree *tree;
2982
0
  uint32_t i;
2983
0
  uint64_t features;
2984
2985
  /* CompatSet::FeatureSet from ceph:/src/include/FeatureSet.h */
2986
2987
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
2988
0
  tree = proto_item_add_subtree(ti, ett_featureset);
2989
2990
0
  features = tvb_get_letoh64(tvb, off);
2991
0
  proto_tree_add_item(tree, hf_featureset_mask,
2992
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
2993
0
  off += 8;
2994
2995
0
  i = tvb_get_letohl(tvb, off);
2996
0
  off += 4;
2997
0
  while (i--)
2998
0
  {
2999
0
    proto_item *ti2;
3000
0
    proto_tree *subtree;
3001
0
    uint64_t val;
3002
0
    c_str name;
3003
3004
0
    ti2 = proto_tree_add_item(tree, hf_featureset_name, tvb, off, -1, ENC_NA);
3005
0
    subtree = proto_item_add_subtree(ti2, ett_featureset_name);
3006
3007
0
    val = tvb_get_letoh64(tvb, off);
3008
0
    proto_tree_add_item(subtree, hf_featureset_name_val,
3009
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3010
0
    off += 8;
3011
3012
0
    off = c_dissect_str(subtree, hf_featureset_name_name, &name, tvb, data->pinfo, off);
3013
3014
0
    proto_item_append_text(ti2, ", Value: %"PRIu64", Name: %s",
3015
0
               val, name.str);
3016
0
    proto_item_set_end(ti2, tvb, off);
3017
0
  }
3018
3019
0
  proto_item_append_text(ti, ", Features: 0x%016"PRIX64, features);
3020
0
  proto_item_set_end(ti, tvb, off);
3021
0
  return off;
3022
0
}
3023
3024
/** Dissect a CompatSet */
3025
static
3026
unsigned c_dissect_compatset(proto_tree *root,
3027
        tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3028
0
{
3029
0
  proto_item *ti;
3030
0
  proto_tree *tree;
3031
3032
  /* CompatSet from ceph:/src/include/CompatSet.h */
3033
3034
0
  ti   = proto_tree_add_item(root, hf_compatset, tvb, off, -1, ENC_NA);
3035
0
  tree = proto_item_add_subtree(ti, ett_compatset);
3036
3037
0
  off = c_dissect_featureset(tree, hf_compatset_compat, tvb, off, data);
3038
0
  off = c_dissect_featureset(tree, hf_compatset_compatro, tvb, off, data);
3039
0
  off = c_dissect_featureset(tree, hf_compatset_incompat, tvb, off, data);
3040
3041
0
  proto_item_set_end(ti, tvb, off);
3042
0
  return off;
3043
0
}
3044
3045
/** Dissect an OSDSuperblock */
3046
static
3047
unsigned c_dissect_osd_superblock(proto_tree *root,
3048
             tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3049
0
{
3050
0
  proto_item *ti;
3051
0
  proto_tree *tree;
3052
0
  c_encoded enc;
3053
0
  uint32_t role, epoch;
3054
0
  double weight;
3055
3056
  /* OSDSuperblock from ceph:/src/osd/osd_types.h */
3057
3058
0
  ti   = proto_tree_add_item(root, hf_osd_superblock, tvb, off, -1, ENC_NA);
3059
0
  tree = proto_item_add_subtree(ti, ett_osd_superblock);
3060
3061
0
  off = c_dissect_encoded(tree, &enc, 5, 6, tvb, off, data);
3062
3063
0
  proto_tree_add_item(tree, hf_osd_superblock_clusterfsid,
3064
0
          tvb, off, 16, ENC_BIG_ENDIAN);
3065
0
  off += 16;
3066
3067
0
  role = tvb_get_letohl(tvb, off);
3068
0
  proto_tree_add_item(tree, hf_osd_superblock_role,
3069
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3070
0
  off += 4;
3071
3072
0
  epoch = tvb_get_letohl(tvb, off);
3073
0
  proto_tree_add_item(tree, hf_osd_superblock_epoch,
3074
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3075
0
  off += 4;
3076
3077
0
  proto_tree_add_item(tree, hf_osd_superblock_map_old,
3078
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3079
0
  off += 4;
3080
3081
0
  proto_tree_add_item(tree, hf_osd_superblock_map_new,
3082
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3083
0
  off += 4;
3084
3085
0
  weight = tvb_get_letohieee_double(tvb, off);
3086
0
  proto_tree_add_item(tree, hf_osd_superblock_weight,
3087
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3088
0
  off += 8;
3089
3090
0
  if (enc.version >= 2)
3091
0
    off = c_dissect_compatset(tree, tvb, off, data);
3092
3093
0
  proto_tree_add_item(tree, hf_osd_superblock_clean,
3094
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3095
0
  off += 4;
3096
3097
0
  proto_tree_add_item(tree, hf_osd_superblock_mounted,
3098
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3099
0
  off += 4;
3100
3101
0
  proto_item_append_text(ti, ", Role: %"PRId32", Weight: %lf"
3102
0
             ", Boot Epoch: %"PRId32,
3103
0
             role, weight, epoch);
3104
0
  if (enc.version >= 4)
3105
0
  {
3106
0
    proto_item_append_text(ti, ", OSD FSID: %s", c_format_uuid(tvb, data->pinfo, off));
3107
0
    proto_tree_add_item(tree, hf_osd_superblock_osdfsid,
3108
0
            tvb, off, 16, ENC_BIG_ENDIAN);
3109
0
    off += 16;
3110
0
  }
3111
3112
0
  if (enc.version >= 6)
3113
0
  {
3114
0
    proto_tree_add_item(tree, hf_osd_superblock_full,
3115
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
3116
0
    off += 4;
3117
0
  }
3118
3119
0
  c_warn_size(tree, tvb, off, enc.end, data);
3120
0
  off = enc.end;
3121
3122
0
  proto_item_set_end(ti, tvb, off);
3123
0
  return off;
3124
0
}
3125
3126
/** Dissect an osd_info_t. */
3127
static
3128
unsigned c_dissect_osdinfo(proto_tree *root, int hf,
3129
      tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3130
0
{
3131
0
  proto_item *ti, *ti2;
3132
0
  proto_tree *tree;
3133
0
  uint8_t ver;
3134
3135
  /* osd_info_t from ceph:/src/osd/OSDMap.h */
3136
3137
0
  ti   = proto_tree_add_item(root, hf, tvb, off, 25, ENC_NA);
3138
0
  tree = proto_item_add_subtree(ti, ett_osd_info);
3139
3140
0
  ver = tvb_get_uint8(tvb, off);
3141
0
  ti2 = proto_tree_add_item(tree, hf_osdinfo_ver,
3142
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
3143
  /* XXX - should we quit if this doesn't return 0? */
3144
0
  c_warn_ver(ti2, ver, 1, 1, data);
3145
0
  off += 1;
3146
3147
0
  proto_tree_add_item(tree, hf_osdinfo_lastclean_begin,
3148
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3149
0
  off += 4;
3150
3151
0
  proto_tree_add_item(tree, hf_osdinfo_lastclean_end,
3152
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3153
0
  off += 4;
3154
3155
0
  proto_tree_add_item(tree, hf_osdinfo_up_from,
3156
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3157
0
  off += 4;
3158
3159
0
  proto_tree_add_item(tree, hf_osdinfo_up_through,
3160
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3161
0
  off += 4;
3162
3163
0
  proto_tree_add_item(tree, hf_osdinfo_downat,
3164
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3165
0
  off += 4;
3166
3167
0
  proto_tree_add_item(tree, hf_osdinfo_lostat,
3168
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3169
0
  off += 4;
3170
3171
0
  return off;
3172
0
}
3173
3174
/** Dissect an osd_xinfo_t. */
3175
static
3176
unsigned c_dissect_osd_xinfo(proto_tree *root, int hf,
3177
        tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3178
0
{
3179
0
  proto_item *ti;
3180
0
  proto_tree *tree;
3181
0
  c_encoded enc;
3182
3183
  /* osd_xinfo_t from ceph:/src/osd/OSDMap.h */
3184
3185
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
3186
0
  tree = proto_item_add_subtree(ti, ett_osd_xinfo);
3187
3188
0
  off = c_dissect_encoded(tree, &enc, 1, 3, tvb, off, data);
3189
3190
0
  proto_tree_add_item(tree, hf_osdxinfo_down,
3191
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3192
0
  off += 8;
3193
3194
0
  proto_tree_add_item(tree, hf_osdxinfo_laggy_probability,
3195
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3196
0
  off += 4;
3197
3198
0
  proto_tree_add_item(tree, hf_osdxinfo_laggy_interval,
3199
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3200
0
  off += 4;
3201
3202
0
  if (enc.version >= 2 )
3203
0
  {
3204
0
    off = c_dissect_features(tree, tvb, off, data);
3205
0
  }
3206
0
  if (enc.version >= 3)
3207
0
  {
3208
0
    proto_tree_add_item(tree, hf_osdxinfo_oldweight,
3209
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
3210
0
    off += 4;
3211
0
  }
3212
3213
0
  c_warn_size(tree, tvb, off, enc.end, data);
3214
0
  off = enc.end;
3215
0
  proto_item_set_end(ti, tvb, off);
3216
3217
0
  return off;
3218
0
}
3219
3220
/** Dissect an objectstore_perfstat_t. */
3221
static
3222
unsigned c_dissect_perfstat(proto_tree *root, int hf,
3223
       tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3224
0
{
3225
0
  proto_item *ti;
3226
0
  proto_tree *tree;
3227
0
  c_encoded enc;
3228
3229
  /* objectstore_perfstat_t from ceph:/src/osd/osd_types.h */
3230
3231
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
3232
0
  tree = proto_item_add_subtree(ti, ett_perfstat);
3233
3234
0
  off = c_dissect_encoded(tree, &enc, 1, 1, tvb, off, data);
3235
3236
0
  proto_tree_add_item(tree, hf_perfstat_commitlatency,
3237
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3238
0
  off += 4;
3239
3240
0
  proto_tree_add_item(tree, hf_perfstat_applylatency,
3241
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3242
0
  off += 4;
3243
3244
0
  c_warn_size(tree, tvb, off, enc.end, data);
3245
0
  off = enc.end;
3246
3247
0
  proto_item_set_end(ti, tvb, off);
3248
0
  return off;
3249
0
}
3250
3251
/** Dissect an osd_stat_t. */
3252
static
3253
unsigned c_dissect_osd_stat(proto_tree *root,
3254
       tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3255
0
{
3256
0
  proto_item *ti;
3257
0
  proto_tree *tree;
3258
0
  c_encoded enc, enc2;
3259
0
  uint32_t i;
3260
3261
  /* osd_stat_t from ceph:/src/osd/osd_types.h */
3262
3263
0
  ti   = proto_tree_add_item(root, hf_osdstat, tvb, off, -1, ENC_NA);
3264
0
  tree = proto_item_add_subtree(ti, ett_pg_stat);
3265
3266
0
  off = c_dissect_encoded(tree, &enc, 2, 4, tvb, off, data);
3267
3268
0
  proto_tree_add_item(tree, hf_osdstat_kb,
3269
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3270
0
  off += 8;
3271
3272
0
  proto_tree_add_item(tree, hf_osdstat_kbused,
3273
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3274
0
  off += 8;
3275
3276
0
  proto_tree_add_item(tree, hf_osdstat_kbavail,
3277
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3278
0
  off += 8;
3279
3280
0
  proto_tree_add_item(tree, hf_osdstat_trimqueue,
3281
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3282
0
  off += 4;
3283
3284
0
  proto_tree_add_item(tree, hf_osdstat_trimming,
3285
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3286
0
  off += 4;
3287
3288
0
  i = tvb_get_letohl(tvb, off);
3289
0
  off += 4;
3290
0
  while (i--)
3291
0
  {
3292
0
    proto_tree_add_item(tree, hf_osdstat_hbin,
3293
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
3294
0
    off += 4;
3295
0
  }
3296
3297
0
  i = tvb_get_letohl(tvb, off);
3298
0
  off += 4;
3299
0
  while (i--)
3300
0
  {
3301
0
    proto_tree_add_item(tree, hf_osdstat_hbout,
3302
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
3303
0
    off += 4;
3304
0
  }
3305
3306
0
  if (enc.version >= 3)
3307
0
  {
3308
0
    off = c_dissect_encoded(tree, &enc2, 1, 1, tvb, off, data);
3309
0
    i = tvb_get_letohl(tvb, off);
3310
0
    off += 4;
3311
0
    if (i >= 1)
3312
0
      proto_tree_add_item(tree, hf_osdstat_opqueue,
3313
0
              tvb, off, 4, ENC_LITTLE_ENDIAN);
3314
0
    off += 4*i; /* Skip older values because they are unitless and meaningless. */
3315
0
    c_warn_size(tree, tvb, off, enc2.end, data);
3316
0
    off = enc2.end;
3317
0
  }
3318
3319
0
  if (enc.version >= 4)
3320
0
    off = c_dissect_perfstat(tree, hf_osdstat_fsperf, tvb, off, data);
3321
3322
0
  c_warn_size(tree, tvb, off, enc.end, data);
3323
0
  off = enc.end;
3324
3325
0
  proto_item_set_end(ti, tvb, off);
3326
0
  return off;
3327
0
}
3328
3329
/** Dissect a CRUSH Ruleset. */
3330
static
3331
unsigned c_dissect_crush(proto_tree *root,
3332
          tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3333
0
{
3334
0
  off = c_dissect_data(root, hf_crush, tvb, data->pinfo, off);
3335
3336
0
  return off;
3337
0
}
3338
3339
/** Dissect an OSDMap. */
3340
static
3341
unsigned c_dissect_osdmap(proto_tree *root,
3342
           tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3343
0
{
3344
0
  proto_item *ti, *ti2;
3345
0
  proto_tree *tree, *subtree;
3346
0
  unsigned size, end;
3347
0
  uint32_t i;
3348
0
  c_encoded enc, enc2; /* There is an outer one, and multiple inner ones. */
3349
3350
  /*** Storage for values that will be formatted and
3351
   *** added to the root nodes.
3352
   ***/
3353
0
  char *fsid;
3354
0
  char *time_created, *time_modified;
3355
3356
  /* OSDMap from ceph:/src/osd/OSDMap.cc */
3357
3358
0
  size = tvb_get_letohl(tvb, off);
3359
0
  end = off + 4 + size;
3360
3361
0
  ti   = proto_tree_add_item(root, hf_osdmap, tvb, off, size, ENC_NA);
3362
0
  tree = proto_item_add_subtree(ti, ett_osd_map);
3363
3364
0
  off += 4;
3365
3366
0
  off = c_dissect_encoded(tree, &enc, 7, 7, tvb, off, data);
3367
  /* Check the blob size and encoded size match. */
3368
0
  c_warn_size(tree, tvb, enc.end, end, data);
3369
3370
  /*** Start first inner ***/
3371
0
  ti2 = proto_tree_add_item(tree, hf_osdmap_client, tvb, off, -1, ENC_NA);
3372
0
  subtree = proto_item_add_subtree(ti2, ett_osd_map_client);
3373
3374
0
  off = c_dissect_encoded(subtree, &enc2, 1, 3, tvb, off, data);
3375
0
  proto_item_set_len(ti2, enc2.size);
3376
3377
0
  fsid = c_format_uuid(tvb, data->pinfo, off);
3378
0
  proto_tree_add_item(subtree, hf_osdmap_fsid, tvb, off, 16, ENC_BIG_ENDIAN);
3379
0
  off += 16;
3380
3381
0
  proto_tree_add_item(subtree, hf_osdmap_epoch,
3382
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3383
0
  off += 4;
3384
3385
0
  time_created = c_format_timespec(tvb, data->pinfo, off);
3386
0
  proto_tree_add_item(subtree, hf_osdmap_created,
3387
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3388
0
  off += 8;
3389
3390
0
  time_modified = c_format_timespec(tvb, data->pinfo, off);
3391
0
  proto_tree_add_item(subtree, hf_osdmap_modified,
3392
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3393
0
  off += 8;
3394
3395
0
  i = tvb_get_letohl(tvb, off);
3396
0
  off += 4;
3397
0
  while (i--)
3398
0
  {
3399
0
    proto_item *poolti;
3400
0
    proto_tree *pooltree;
3401
0
    uint64_t id;
3402
3403
0
    poolti = proto_tree_add_item(subtree, hf_osdmap_pool,
3404
0
               tvb, off, -1, ENC_NA);
3405
0
    pooltree = proto_item_add_subtree(poolti, ett_osd_map_pool);
3406
3407
0
    id = tvb_get_letoh64(tvb, off);
3408
0
    proto_tree_add_item(pooltree, hf_osdmap_pool_id,
3409
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3410
0
    off += 8;
3411
3412
0
    off = c_dissect_pgpool(pooltree, tvb, off, data);
3413
3414
0
    proto_item_append_text(poolti, ", ID: 0x%016"PRIX64, id);
3415
3416
0
    proto_item_set_end(poolti, tvb, off);
3417
0
  }
3418
3419
0
  i = tvb_get_letohl(tvb, off);
3420
0
  off += 4;
3421
0
  while (i--)
3422
0
  {
3423
0
    proto_item *nameti;
3424
0
    proto_tree *nametree;
3425
0
    uint64_t id;
3426
0
    c_str name;
3427
3428
0
    nameti = proto_tree_add_item(subtree, hf_osdmap_poolname_item,
3429
0
               tvb, off, -1, ENC_NA);
3430
0
    nametree = proto_item_add_subtree(nameti, ett_osd_map_poolname);
3431
3432
0
    id = tvb_get_letoh64(tvb, off);
3433
0
    proto_tree_add_item(nametree, hf_osdmap_pool_id,
3434
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3435
0
    off += 8;
3436
3437
0
    off = c_dissect_str(nametree, hf_osdmap_poolname, &name, tvb, data->pinfo, off);
3438
3439
0
    proto_item_append_text(nameti,
3440
0
               ", ID: 0x%016"PRIX64", Name: %s",
3441
0
               id, name.str);
3442
0
    proto_item_set_end(nameti, tvb, off);
3443
0
  }
3444
3445
0
  proto_tree_add_item(subtree, hf_osdmap_poolmax,
3446
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3447
0
  off += 4;
3448
3449
0
  proto_tree_add_item(subtree, hf_osdmap_flags,
3450
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3451
0
  off += 4;
3452
3453
0
  proto_tree_add_item(subtree, hf_osdmap_osdmax,
3454
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3455
0
  off += 4;
3456
3457
0
  i = tvb_get_letohl(tvb, off);
3458
0
  off += 4;
3459
0
  while (i--)
3460
0
  {
3461
0
    proto_tree_add_item(subtree, hf_osdmap_osd_state,
3462
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
3463
0
    off += 1;
3464
0
  }
3465
3466
0
  i = tvb_get_letohl(tvb, off);
3467
0
  off += 4;
3468
0
  while (i--)
3469
0
  {
3470
0
    proto_tree_add_item(subtree, hf_osdmap_osd_weight,
3471
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
3472
0
    off += 4;
3473
0
  }
3474
3475
0
  i = tvb_get_letohl(tvb, off);
3476
0
  off += 4;
3477
0
  while (i--)
3478
0
  {
3479
0
    off = c_dissect_entityaddr(subtree, hf_osdmap_osd_addr, NULL,
3480
0
             tvb, data->pinfo, off);
3481
0
  }
3482
3483
0
  i = tvb_get_letohl(tvb, off);
3484
0
  off += 4;
3485
0
  while (i--)
3486
0
  {
3487
0
    uint32_t j;
3488
0
    proto_item *pgtti;
3489
0
    proto_tree *pgttree;
3490
3491
0
    pgtti = proto_tree_add_item(subtree, hf_osdmap_pgtmp,
3492
0
             tvb, off, -1, ENC_NA);
3493
0
    pgttree = proto_item_add_subtree(pgtti, ett_osd_map_pgtmp);
3494
3495
0
    off = c_dissect_pg(pgttree, hf_osdmap_pgtmp_pg, tvb, off, data);
3496
3497
0
    j = tvb_get_letohl(tvb, off);
3498
0
    off += 4;
3499
0
    while (j--)
3500
0
    {
3501
0
      proto_tree_add_item(pgttree, hf_osdmap_pgtmp_val,
3502
0
              tvb, off, 4, ENC_LITTLE_ENDIAN);
3503
0
      off += 4;
3504
0
    }
3505
3506
0
    proto_item_set_end(pgtti, tvb, off);
3507
0
  }
3508
3509
0
  i = tvb_get_letohl(tvb, off);
3510
0
  off += 4;
3511
0
  while (i--)
3512
0
  {
3513
0
    proto_item *pgtti;
3514
0
    proto_tree *pgttree;
3515
3516
0
    pgtti = proto_tree_add_item(subtree, hf_osdmap_primarytmp,
3517
0
             tvb, off, -1, ENC_NA);
3518
0
    pgttree = proto_item_add_subtree(pgtti, ett_osd_map_primarytmp);
3519
3520
0
    off = c_dissect_pg(pgttree, hf_osdmap_primarytmp_pg, tvb, off, data);
3521
3522
0
    proto_tree_add_item(pgttree, hf_osdmap_primarytmp_val,
3523
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
3524
0
    off += 4;
3525
3526
0
    proto_item_set_end(pgtti, tvb, off);
3527
0
  }
3528
3529
0
  if (enc2.version >= 2)
3530
0
  {
3531
0
    i = tvb_get_letohl(tvb, off);
3532
0
    off += 4;
3533
0
    while (i--)
3534
0
    {
3535
0
      proto_tree_add_item(subtree, hf_osdmap_osd_primaryaffinity,
3536
0
              tvb, off, 4, ENC_LITTLE_ENDIAN);
3537
0
      off += 4;
3538
0
    }
3539
0
  }
3540
3541
0
  off = c_dissect_crush(subtree, tvb, off, data);
3542
3543
0
  if (enc2.version >= 3)
3544
0
  {
3545
0
    i = tvb_get_letohl(tvb, off);
3546
0
    off += 4;
3547
0
    while (i--)
3548
0
    {
3549
0
      uint32_t j;
3550
0
      proto_item *ecti;
3551
0
      proto_tree *ectree;
3552
0
      c_str profile;
3553
3554
0
      ecti = proto_tree_add_item(subtree, hf_osdmap_erasurecodeprofile,
3555
0
               tvb, off, -1, ENC_NA);
3556
0
      ectree = proto_item_add_subtree(ecti, ett_osd_map_erasurecodeprofile);
3557
3558
0
      off = c_dissect_str(ectree, hf_osdmap_erasurecodeprofile_name, &profile,
3559
0
              tvb, data->pinfo, off);
3560
0
      proto_item_append_text(ecti, ", Name: %s", profile.str);
3561
3562
0
      j = tvb_get_letohl(tvb, off);
3563
0
      off += 4;
3564
0
      while (j--)
3565
0
      {
3566
0
        off = c_dissect_kv(ectree, hf_osdmap_erasurecodeprofile_prop,
3567
0
               hf_osdmap_erasurecodeprofile_k,
3568
0
               hf_osdmap_erasurecodeprofile_v,
3569
0
               tvb, data->pinfo, off);
3570
0
      }
3571
3572
0
      proto_item_set_end(ecti, tvb, off);
3573
0
    }
3574
0
  }
3575
3576
0
  c_warn_size(subtree, tvb, off, enc2.end, data);
3577
0
  off = enc2.end;
3578
  /*** End first inner ***/
3579
3580
  /*** Start second inner ***/
3581
0
  ti2 = proto_tree_add_item(tree, hf_osdmap_osd, tvb, off, -1, ENC_NA);
3582
0
  subtree = proto_item_add_subtree(ti2, ett_osd_map_osd);
3583
0
  off = c_dissect_encoded(subtree, &enc2, 1, 1, tvb, off, data);
3584
0
  proto_item_set_len(ti2, enc2.size);
3585
3586
0
  i = tvb_get_letohl(tvb, off);
3587
0
  off += 4;
3588
0
  while (i--)
3589
0
  {
3590
0
    off = c_dissect_entityaddr(subtree, hf_osdmap_hbaddr_back, NULL,
3591
0
             tvb, data->pinfo, off);
3592
0
  }
3593
3594
0
  i = tvb_get_letohl(tvb, off);
3595
0
  off += 4;
3596
0
  while (i--)
3597
0
  {
3598
0
    off = c_dissect_osdinfo(subtree, hf_osdmap_osd_info, tvb, off, data);
3599
0
  }
3600
3601
0
  i = tvb_get_letohl(tvb, off);
3602
0
  off += 4;
3603
0
  while (i--)
3604
0
  {
3605
0
    proto_item *blti;
3606
0
    proto_tree *bltree;
3607
3608
0
    blti = proto_tree_add_item(subtree, hf_osdmap_blacklist,
3609
0
             tvb, off, -1, ENC_NA);
3610
0
    bltree = proto_item_add_subtree(blti, ett_osd_map_blacklist);
3611
3612
0
    off = c_dissect_entityaddr(bltree, hf_osdmap_blacklist_addr, NULL,
3613
0
             tvb, data->pinfo, off);
3614
3615
0
    proto_tree_add_item(bltree, hf_osdmap_blacklist_time,
3616
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3617
0
    off += 8;
3618
3619
0
    proto_item_set_end(blti, tvb, off);
3620
0
  }
3621
3622
0
  i = tvb_get_letohl(tvb, off);
3623
0
  off += 4;
3624
0
  while (i--)
3625
0
  {
3626
0
    off = c_dissect_entityaddr(subtree, hf_osdmap_cluster_addr, NULL,
3627
0
             tvb, data->pinfo, off);
3628
0
  }
3629
3630
0
  proto_tree_add_item(subtree, hf_osdmap_cluster_snapepoch,
3631
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3632
0
  off += 4;
3633
3634
0
  off = c_dissect_str(subtree, hf_osdmap_cluster_snap, NULL, tvb, data->pinfo, off);
3635
3636
0
  i = tvb_get_letohl(tvb, off);
3637
0
  off += 4;
3638
0
  while (i--)
3639
0
  {
3640
0
    proto_tree_add_item(subtree, hf_osdmap_osd_uuid,
3641
0
            tvb, off, 16, ENC_LITTLE_ENDIAN);
3642
0
    off += 16;
3643
0
  }
3644
3645
0
  i = tvb_get_letohl(tvb, off);
3646
0
  off += 4;
3647
0
  while (i--)
3648
0
  {
3649
0
    off = c_dissect_osd_xinfo(subtree, hf_osdmap_osd_xinfo, tvb, off, data);
3650
0
  }
3651
3652
0
  i = tvb_get_letohl(tvb, off);
3653
0
  off += 4;
3654
0
  while (i--)
3655
0
  {
3656
0
    off = c_dissect_entityaddr(subtree, hf_osdmap_hbaddr_front, NULL,
3657
0
             tvb, data->pinfo, off);
3658
0
  }
3659
3660
0
  c_warn_size(subtree, tvb, off, enc2.end, data);
3661
0
  off = enc2.end;
3662
  /*** End second inner ***/
3663
3664
0
  proto_item_append_text(ti, ", FSID: %s, Created: %s, Modified: %s",
3665
0
             fsid,
3666
0
             time_created, time_modified);
3667
3668
0
  c_warn_size(tree, tvb, off, end, data);
3669
0
  off = end;
3670
3671
0
  return off;
3672
0
}
3673
3674
/** Dissect an incremental OSDMap. */
3675
static
3676
unsigned c_dissect_osdmap_inc(proto_tree *root,
3677
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3678
0
{
3679
0
  proto_item *ti, *ti2;
3680
0
  proto_tree *tree, *subtree;
3681
0
  unsigned size, end;
3682
0
  c_encoded enc, enc2; /* There is an outer one, and multiple inner ones. */
3683
3684
  /** OSDMap::Incremental from ceph:/src/osd/OSDMap.cc */
3685
3686
0
  size = tvb_get_letohl(tvb, off);
3687
0
  end = off + 4 + size;
3688
3689
0
  ti   = proto_tree_add_item(root, hf_osdmap_inc, tvb, off, size, ENC_NA);
3690
0
  tree = proto_item_add_subtree(ti, ett_osd_map_inc);
3691
3692
0
  off += 4;
3693
3694
0
  off = c_dissect_encoded(tree, &enc, 7, 7, tvb, off, data);
3695
  /* Check the blob size and encoded size match. */
3696
0
  c_warn_size(tree, tvb, enc.end, end, data);
3697
3698
  /*** Start first inner ***/
3699
0
  ti2 = proto_tree_add_item(tree, hf_osdmap_inc_client, tvb, off, -1, ENC_NA);
3700
0
  subtree = proto_item_add_subtree(ti2, ett_osd_map_inc_client);
3701
3702
0
  off = c_dissect_encoded(subtree, &enc2, 1, 3, tvb, off, data);
3703
0
  proto_item_set_len(ti2, enc2.size);
3704
3705
0
  proto_tree_add_item(subtree, hf_osdmap_inc_fsid, tvb, off, 16, ENC_BIG_ENDIAN);
3706
0
  off += 16;
3707
3708
  /* @TODO: Dissect. */
3709
3710
0
  c_warn_size(subtree, tvb, off, enc2.end, data);
3711
0
  off = enc2.end;
3712
  /*** End first inner ***/
3713
3714
  /*** Start second inner ***/
3715
0
  ti2 = proto_tree_add_item(tree, hf_osdmap_inc_osd, tvb, off, -1, ENC_NA);
3716
0
  subtree = proto_item_add_subtree(ti2, ett_osd_map_inc_osd);
3717
0
  off = c_dissect_encoded(subtree, &enc2, 1, 1, tvb, off, data);
3718
0
  proto_item_set_len(ti2, enc2.size);
3719
3720
  /* @TODO: Dissect. */
3721
3722
0
  c_warn_size(subtree, tvb, off, enc2.end, data);
3723
0
  off = enc2.end;
3724
  /*** End second inner ***/
3725
3726
0
  c_warn_size(tree, tvb, off, end, data);
3727
0
  off = end;
3728
3729
0
  return off;
3730
0
}
3731
3732
typedef struct _c_osd_op {
3733
  c_osd_optype type;    /** The type of operation. */
3734
  const char *type_str; /** The type of operation as a string. */
3735
  uint32_t payload_size; /** The size of the operation payload. */
3736
} c_osd_op;
3737
3738
0
#define C_SIZE_OSD_OP_MIN 34
3739
3740
/** Dissect OSD Operation. */
3741
static
3742
unsigned c_dissect_osd_op(proto_tree *root, int hf, c_osd_op *out,
3743
           tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3744
0
{
3745
0
  proto_item *ti, *ti2;
3746
0
  proto_tree *tree;
3747
0
  c_osd_op d;
3748
3749
0
  uint64_t offset, size;
3750
0
  uint64_t trunc_size, trunc_seq;
3751
3752
  /* From ceph:/src/include/rados.h
3753
  struct ceph_osd_op {
3754
    __le16 op;       // CEPH_OSD_OP_*
3755
    __le32 flags;      // CEPH_OSD_FLAG_*
3756
    union {
3757
      struct {
3758
        __le64 offset, length;
3759
        __le64 truncate_size;
3760
        __le32 truncate_seq;
3761
      } __attribute__ ((packed)) extent;
3762
      struct {
3763
        __le32 name_len;
3764
        __le32 value_len;
3765
        __u8 cmp_op;     // CEPH_OSD_CMPXATTR_OP_*
3766
        __u8 cmp_mode;     // CEPH_OSD_CMPXATTR_MODE_*
3767
      } __attribute__ ((packed)) xattr;
3768
      struct {
3769
        __u8 class_len;
3770
        __u8 method_len;
3771
        __u8 argc;
3772
        __le32 indata_len;
3773
      } __attribute__ ((packed)) cls;
3774
      struct {
3775
        __le64 count;
3776
        __le32 start_epoch; // for the pgls sequence
3777
      } __attribute__ ((packed)) pgls;
3778
      struct {
3779
        __le64 snapid;
3780
      } __attribute__ ((packed)) snap;
3781
      struct {
3782
        __le64 cookie;
3783
        __le64 ver;
3784
        __u8 flag; // 0 = unwatch, 1 = watch
3785
      } __attribute__ ((packed)) watch;
3786
      struct {
3787
        __le64 unused;
3788
        __le64 ver;
3789
      } __attribute__ ((packed)) assert_ver;
3790
      struct {
3791
        __le64 offset, length;
3792
        __le64 src_offset;
3793
      } __attribute__ ((packed)) clonerange;
3794
      struct {
3795
        __le64 max; // max data in reply
3796
      } __attribute__ ((packed)) copy_get;
3797
      struct {
3798
        __le64 snapid;
3799
        __le64 src_version;
3800
        __u8 flags;
3801
      } __attribute__ ((packed)) copy_from;
3802
      struct {
3803
        struct ceph_timespec stamp;
3804
      } __attribute__ ((packed)) hit_set_get;
3805
      struct {
3806
        __u8 flags;
3807
      } __attribute__ ((packed)) tmap2omap;
3808
      struct {
3809
        __le64 expected_object_size;
3810
        __le64 expected_write_size;
3811
      } __attribute__ ((packed)) alloc_hint;
3812
    };
3813
    __le32 payload_size;
3814
  } __attribute__ ((packed));
3815
  */
3816
3817
0
  d.type = (c_osd_optype)tvb_get_letohs(tvb, off);
3818
3819
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
3820
0
  tree = proto_item_add_subtree(ti, ett_osd_op);
3821
3822
0
  d.type_str = c_osd_optype_string(d.type, data->pinfo->pool);
3823
0
  proto_item_append_text(ti, ", Type: %s", d.type_str);
3824
0
  proto_tree_add_item(tree, hf_osd_op_type, tvb, off, 2, ENC_LITTLE_ENDIAN);
3825
0
  off += 2;
3826
3827
0
  off = c_dissect_osd_flags(tree, tvb, off, data);
3828
3829
  /***
3830
    Stop moving off here.  The size of the individual message doesn't
3831
    matter, only the size of the largest, which is added below.
3832
  ***/
3833
3834
0
  switch (d.type)
3835
0
  {
3836
0
  case C_OSD_OP_WRITE:
3837
0
  case C_OSD_OP_WRITEFULL:
3838
0
  case C_OSD_OP_ZERO:
3839
0
  case C_OSD_OP_TRUNCATE:
3840
0
  case C_OSD_OP_DELETE:
3841
0
  case C_OSD_OP_READ:
3842
0
  case C_OSD_OP_STAT:
3843
0
    offset = tvb_get_letoh64(tvb, off);
3844
0
    proto_tree_add_item(tree, hf_osd_op_extent_off,
3845
0
            tvb, off,  8, ENC_LITTLE_ENDIAN);
3846
0
    size = tvb_get_letoh64(tvb, off+8);
3847
0
    proto_tree_add_item(tree, hf_osd_op_extent_size,
3848
0
            tvb, off+8,  8, ENC_LITTLE_ENDIAN);
3849
0
    trunc_size = tvb_get_letoh64(tvb, off+16);
3850
0
    proto_tree_add_item(tree, hf_osd_op_extent_trunc_size,
3851
0
            tvb, off+16, 8, ENC_LITTLE_ENDIAN);
3852
0
    trunc_seq = tvb_get_letohl(tvb, off+24);
3853
0
    proto_tree_add_item(tree, hf_osd_op_extent_trunc_seq,
3854
0
            tvb, off+24, 4, ENC_LITTLE_ENDIAN);
3855
3856
0
    proto_item_append_text(ti, ", Offset: %"PRIu64
3857
0
               ", Size: %"PRIu64,
3858
0
               offset, size);
3859
0
    if (trunc_seq)
3860
0
      proto_item_append_text(ti, ", Truncate To: %"PRIu64,
3861
0
                 trunc_size);
3862
0
    break;
3863
0
  default:
3864
0
    ti2 = proto_tree_add_item(tree, hf_osd_op_data, tvb, off, 28, ENC_NA);
3865
0
    expert_add_info(data->pinfo, ti2, &ei_union_unknown);
3866
0
  }
3867
3868
0
  off += 28;
3869
3870
0
  d.payload_size = tvb_get_letohl(tvb, off);
3871
0
  proto_item_append_text(ti, ", Data Length: %"PRId32,
3872
0
             d.payload_size);
3873
0
  proto_tree_add_item(tree, hf_osd_op_payload_size,
3874
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
3875
0
  off += 4;
3876
3877
0
  proto_item_set_end(ti, tvb, off);
3878
3879
0
  if (out) *out = d;
3880
0
  return off;
3881
0
}
3882
3883
/** Dissect a redirect. */
3884
static
3885
unsigned c_dissect_redirect(proto_tree *root, int hf,
3886
       tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3887
0
{
3888
0
  proto_item *ti;
3889
0
  proto_tree *tree;
3890
0
  c_encoded enc;
3891
3892
  /** request_redirect_t from ceph:/src/osd/osd_types.h */
3893
3894
0
  ti = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
3895
0
  tree = proto_item_add_subtree(ti, ett_redirect);
3896
3897
0
  off = c_dissect_encoded(tree, &enc, 1, 1, tvb, off, data);
3898
3899
0
  off = c_dissect_object_locator(tree, hf_osd_redirect_oloc, tvb, off, data);
3900
3901
0
  if (tvb_get_letohl(tvb, off))
3902
0
  {
3903
0
    off = c_dissect_str(tree, hf_osd_redirect_obj, NULL, tvb, data->pinfo, off);
3904
0
  }
3905
0
  else off += 4;
3906
3907
0
  off = c_dissect_blob(tree, hf_osd_redirect_osdinstr,
3908
0
           hf_osd_redirect_osdinstr_data, hf_osd_redirect_osdinstr_len,
3909
0
           tvb, data->pinfo, off);
3910
3911
0
  c_warn_size(tree, tvb, off, enc.end, data);
3912
0
  off = enc.end;
3913
3914
0
  proto_item_set_end(ti, tvb, off);
3915
0
  return off;
3916
0
}
3917
3918
/** Dissect a statsum object. */
3919
static
3920
unsigned c_dissect_statsum(proto_tree *tree,
3921
      tvbuff_t *tvb, unsigned off, c_pkt_data *data)
3922
0
{
3923
0
  c_encoded enc;
3924
3925
  /** object_stat_sum_t from ceph:/src/osd/osd_types.h */
3926
3927
0
  off = c_dissect_encoded(tree, &enc, 3, 9, tvb, off, data);
3928
3929
0
  proto_tree_add_item(tree, hf_statsum_bytes,
3930
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3931
0
  off += 8;
3932
0
  proto_tree_add_item(tree, hf_statsum_objects,
3933
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3934
0
  off += 8;
3935
0
  proto_tree_add_item(tree, hf_statsum_clones,
3936
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3937
0
  off += 8;
3938
0
  proto_tree_add_item(tree, hf_statsum_copies,
3939
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3940
0
  off += 8;
3941
0
  proto_tree_add_item(tree, hf_statsum_missing,
3942
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3943
0
  off += 8;
3944
0
  proto_tree_add_item(tree, hf_statsum_degraded,
3945
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3946
0
  off += 8;
3947
0
  proto_tree_add_item(tree, hf_statsum_unfound,
3948
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3949
0
  off += 8;
3950
0
  proto_tree_add_item(tree, hf_statsum_read_bytes,
3951
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3952
0
  off += 8;
3953
0
  proto_tree_add_item(tree, hf_statsum_read_kbytes,
3954
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3955
0
  off += 8;
3956
0
  proto_tree_add_item(tree, hf_statsum_written_bytes,
3957
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3958
0
  off += 8;
3959
0
  proto_tree_add_item(tree, hf_statsum_written_kbytes,
3960
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3961
0
  off += 8;
3962
0
  proto_tree_add_item(tree, hf_statsum_scrub_errors,
3963
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
3964
0
  off += 8;
3965
3966
0
  if (enc.version >= 5)
3967
0
  {
3968
0
    proto_tree_add_item(tree, hf_statsum_recovered,
3969
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3970
0
    off += 8;
3971
0
    proto_tree_add_item(tree, hf_statsum_bytes_recovered,
3972
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3973
0
    off += 8;
3974
0
    proto_tree_add_item(tree, hf_statsum_keys_recovered,
3975
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3976
0
    off += 8;
3977
0
  }
3978
0
  if (enc.version >= 6)
3979
0
  {
3980
0
    proto_tree_add_item(tree, hf_statsum_shallow_scrub_errors,
3981
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3982
0
    off += 8;
3983
0
    proto_tree_add_item(tree, hf_statsum_deep_scrub_errors,
3984
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3985
0
    off += 8;
3986
0
  }
3987
0
  if (enc.version >= 7)
3988
0
  {
3989
0
    proto_tree_add_item(tree, hf_statsum_dirty,
3990
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3991
0
    off += 8;
3992
0
    proto_tree_add_item(tree, hf_statsum_whiteouts,
3993
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
3994
0
    off += 8;
3995
0
  }
3996
0
  if (enc.version >= 8)
3997
0
  {
3998
0
    proto_tree_add_item(tree, hf_statsum_omap,
3999
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4000
0
    off += 8;
4001
0
  }
4002
0
  if (enc.version >= 9)
4003
0
  {
4004
0
    proto_tree_add_item(tree, hf_statsum_hitset_archive,
4005
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4006
0
    off += 8;
4007
0
  }
4008
4009
0
  c_warn_size(tree, tvb, off, enc.end, data);
4010
0
  off = enc.end;
4011
4012
0
  return off;
4013
0
}
4014
4015
/** Dissect a object_stat_collection_t object. */
4016
static
4017
unsigned c_dissect_statcollection(proto_tree *root, int key,
4018
             tvbuff_t *tvb, unsigned off, c_pkt_data *data)
4019
0
{
4020
0
  proto_item *ti;
4021
0
  proto_tree *tree;
4022
0
  c_encoded enc;
4023
0
  uint32_t i;
4024
4025
  /** object_stat_collection_t from ceph:/src/osd/osd_types.h */
4026
4027
0
  ti = proto_tree_add_item(root, hf_statcollection, tvb, off, -1, ENC_NA);
4028
0
  tree = proto_item_add_subtree(ti, ett_statcollection);
4029
4030
0
  off = c_dissect_encoded(tree, &enc, 2, 2, tvb, off, data);
4031
4032
0
  off = c_dissect_statsum(tree, tvb, off, data);
4033
0
  i = tvb_get_letohl(tvb, off);
4034
0
  off += 4;
4035
0
  while (i--)
4036
0
  {
4037
0
    off = c_dissect_str(tree, key, NULL, tvb, data->pinfo, off);
4038
0
    off = c_dissect_statsum(tree, tvb, off, data);
4039
0
  }
4040
4041
0
  c_warn_size(tree, tvb, off, enc.end, data);
4042
0
  off = enc.end;
4043
4044
0
  proto_item_set_end(ti, tvb, off);
4045
0
  return off;
4046
0
}
4047
4048
/** Dissect an pg_stat_t. */
4049
static
4050
unsigned c_dissect_pg_stats(proto_tree *root, int hf,
4051
       tvbuff_t *tvb, unsigned off, c_pkt_data *data)
4052
0
{
4053
0
  proto_item *ti;
4054
0
  proto_tree *tree;
4055
0
  c_encoded enc;
4056
0
  uint32_t i;
4057
4058
  /* pg_stat_t from ceph:/src/osd/osd_types.h */
4059
4060
0
  ti   = proto_tree_add_item(root, hf, tvb, off, -1, ENC_NA);
4061
0
  tree = proto_item_add_subtree(ti, ett_pg_stat);
4062
4063
0
  off = c_dissect_encoded(tree, &enc, 8, 17, tvb, off, data);
4064
4065
0
  off = c_dissect_eversion(tree, hf_pg_stat_ver, tvb, off, data);
4066
4067
0
  proto_tree_add_item(tree, hf_pg_stat_seq,
4068
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4069
0
  off += 8;
4070
4071
0
  proto_tree_add_item(tree, hf_pg_stat_epoch,
4072
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4073
0
  off += 4;
4074
4075
0
  proto_tree_add_item(tree, hf_pg_stat_state,
4076
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4077
0
  off += 4;
4078
4079
0
  off = c_dissect_eversion(tree, hf_pg_stat_logstart, tvb, off, data);
4080
0
  off = c_dissect_eversion(tree, hf_pg_stat_logstartondisk, tvb, off, data);
4081
4082
0
  proto_tree_add_item(tree, hf_pg_stat_created,
4083
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4084
0
  off += 4;
4085
4086
0
  proto_tree_add_item(tree, hf_pg_stat_lastepochclean,
4087
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4088
0
  off += 4;
4089
4090
0
  off = c_dissect_pg(tree, hf_pg_stat_parent, tvb, off, data);
4091
4092
0
  proto_tree_add_item(tree, hf_pg_stat_parent_splitbits,
4093
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4094
0
  off += 4;
4095
4096
0
  off = c_dissect_eversion(tree, hf_pg_stat_lastscrub, tvb, off, data);
4097
4098
0
  proto_tree_add_item(tree, hf_pg_stat_lastscrubstamp,
4099
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4100
0
  off += 8;
4101
4102
0
  off = c_dissect_statcollection(tree, hf_pg_stat_stats, tvb, off, data);
4103
4104
0
  proto_tree_add_item(tree, hf_pg_stat_logsize,
4105
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4106
0
  off += 8;
4107
4108
0
  proto_tree_add_item(tree, hf_pg_stat_logsizeondisk,
4109
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4110
0
  off += 8;
4111
4112
0
  i = tvb_get_letohl(tvb, off);
4113
0
  off += 4;
4114
0
  while (i--)
4115
0
  {
4116
0
    proto_tree_add_item(tree, hf_pg_stat_up,
4117
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
4118
0
    off += 4;
4119
0
  }
4120
4121
0
  i = tvb_get_letohl(tvb, off);
4122
0
  off += 4;
4123
0
  while (i--)
4124
0
  {
4125
0
    proto_tree_add_item(tree, hf_pg_stat_acting,
4126
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
4127
0
    off += 4;
4128
0
  }
4129
4130
0
  if (enc.version >= 9)
4131
0
  {
4132
0
    proto_tree_add_item(tree, hf_pg_stat_lastfresh,
4133
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4134
0
    off += 8;
4135
4136
0
    proto_tree_add_item(tree, hf_pg_stat_lastchange,
4137
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4138
0
    off += 8;
4139
4140
0
    proto_tree_add_item(tree, hf_pg_stat_lastactive,
4141
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4142
0
    off += 8;
4143
4144
0
    proto_tree_add_item(tree, hf_pg_stat_lastclean,
4145
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4146
0
    off += 8;
4147
4148
0
    proto_tree_add_item(tree, hf_pg_stat_lastunstale,
4149
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4150
0
    off += 8;
4151
4152
0
    proto_tree_add_item(tree, hf_pg_stat_mappingepoch,
4153
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
4154
0
    off += 4;
4155
0
  }
4156
0
  if (enc.version >= 10)
4157
0
  {
4158
0
    off = c_dissect_eversion(tree, hf_pg_stat_lastdeepscrub, tvb, off, data);
4159
4160
0
    proto_tree_add_item(tree, hf_pg_stat_lastdeepscrubstamp,
4161
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4162
0
    off += 8;
4163
0
  }
4164
0
  if (enc.version >= 11)
4165
0
  {
4166
0
    proto_tree_add_item(tree, hf_pg_stat_statsinvalid,
4167
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
4168
0
    off += 1;
4169
0
  }
4170
0
  if (enc.version >= 12)
4171
0
  {
4172
0
    proto_tree_add_item(tree, hf_pg_stat_lastcleanscrubstamp,
4173
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4174
0
    off += 8;
4175
0
  }
4176
0
  if (enc.version >= 13)
4177
0
  {
4178
0
    proto_tree_add_item(tree, hf_pg_stat_lastbecameactive,
4179
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4180
0
    off += 8;
4181
0
  }
4182
0
  if (enc.version >= 14)
4183
0
  {
4184
0
    proto_tree_add_item(tree, hf_pg_stat_dirtystatsinvalid,
4185
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
4186
0
    off += 1;
4187
0
  }
4188
0
  if (enc.version >= 15)
4189
0
  {
4190
0
    proto_tree_add_item(tree, hf_pg_stat_upprimary,
4191
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
4192
0
    off += 4;
4193
4194
0
    proto_tree_add_item(tree, hf_pg_stat_actingprimary,
4195
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
4196
0
    off += 4;
4197
0
  }
4198
0
  if (enc.version >= 16)
4199
0
  {
4200
0
    proto_tree_add_item(tree, hf_pg_stat_omapstatsinvalid,
4201
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
4202
0
    off += 1;
4203
0
  }
4204
0
  if (enc.version >= 17)
4205
0
  {
4206
0
    proto_tree_add_item(tree, hf_pg_stat_hitsetstatsinvalid,
4207
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
4208
0
    off += 1;
4209
0
  }
4210
4211
0
  c_warn_size(tree, tvb, off, enc.end, data);
4212
0
  off = enc.end;
4213
4214
0
  proto_item_set_end(ti, tvb, off);
4215
0
  return off;
4216
0
}
4217
4218
0
#define C_SIZE_PAXOS 18
4219
4220
/** Dissect a Paxos Service Message */
4221
static
4222
unsigned c_dissect_paxos(proto_tree *root,
4223
          tvbuff_t *tvb, unsigned off, c_pkt_data *data _U_)
4224
0
{
4225
0
  proto_item *ti;
4226
0
  proto_tree *tree;
4227
4228
  /** ceph:/src/messages/PaxosServiceMessage.h */
4229
4230
0
  ti = proto_tree_add_item(root, hf_paxos, tvb, off, C_SIZE_PAXOS, ENC_NA);
4231
0
  tree = proto_item_add_subtree(ti, ett_paxos);
4232
4233
0
  proto_tree_add_item(tree, hf_paxos_ver,
4234
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4235
0
  off += 8;
4236
0
  proto_tree_add_item(tree, hf_paxos_mon,
4237
0
          tvb, off, 2, ENC_LITTLE_ENDIAN);
4238
0
  off += 2;
4239
0
  proto_tree_add_item(tree, hf_paxos_mon_tid,
4240
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4241
0
  off += 8;
4242
4243
0
  return off;
4244
0
}
4245
4246
4247
/*** Message Dissectors ***/
4248
4249
/** Used to handle unknown messages.
4250
 *
4251
 * Simply displays the front, middle and data portions as binary strings.
4252
 */
4253
static
4254
unsigned c_dissect_msg_unknown(proto_tree *tree,
4255
          tvbuff_t *tvb,
4256
          unsigned front_len, unsigned middle_len, unsigned data_len,
4257
          c_pkt_data *data)
4258
17
{
4259
17
  unsigned off = 0;
4260
4261
17
  c_set_type(data, c_msg_type_string(data->header.type, data->pinfo->pool));
4262
17
  proto_item_append_text(data->item_root,
4263
17
             ", Type: %s, Front Len: %u, Middle Len: %u, Data Len %u",
4264
17
             c_msg_type_string(data->header.type, data->pinfo->pool),
4265
17
             front_len, middle_len, data_len);
4266
17
  expert_add_info(data->pinfo, tree, &ei_msg_unknown);
4267
4268
17
  if (front_len)
4269
4
  {
4270
4
    proto_tree_add_item(tree, hf_msg_front, tvb, off, front_len, ENC_NA);
4271
4
    off += front_len;
4272
4
  }
4273
17
  if (middle_len)
4274
4
  {
4275
4
    proto_tree_add_item(tree, hf_msg_middle, tvb, off, middle_len, ENC_NA);
4276
4
    off += middle_len;
4277
4
  }
4278
17
  if (data_len)
4279
2
  {
4280
2
    proto_tree_add_item(tree, hf_msg_data, tvb, off, data_len, ENC_NA);
4281
2
    off += data_len;
4282
2
  }
4283
4284
17
  return off;
4285
17
}
4286
4287
/** Dissect ping 0x0002 */
4288
static
4289
unsigned c_dissect_msg_ping(proto_tree *root _U_,
4290
       tvbuff_t *tvb _U_,
4291
       unsigned front_len _U_, unsigned middle_len _U_, unsigned data_len _U_,
4292
       c_pkt_data *data)
4293
0
{
4294
  /* ceph:/src/messages/MPing.h */
4295
0
  c_set_type(data, "Ping");
4296
0
  return 0;
4297
0
}
4298
4299
/** Dissect monmap message 0x0004 */
4300
static
4301
unsigned c_dissect_msg_mon_map(proto_tree *root,
4302
          tvbuff_t *tvb,
4303
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4304
          c_pkt_data *data)
4305
1
{
4306
1
  proto_item *ti;
4307
1
  proto_tree *tree;
4308
4309
  /* ceph:/src/messages/MMonMap.h */
4310
4311
1
  c_set_type(data, "Mon Map");
4312
4313
1
  ti = proto_tree_add_item(root, hf_msg_mon_map, tvb, 0, front_len, ENC_NA);
4314
1
  tree = proto_item_add_subtree(ti, ett_msg_mon_map);
4315
4316
1
  return c_dissect_monmap(tree, tvb, 0, data);
4317
1
}
4318
4319
/** Stat FS 0x000D */
4320
static
4321
unsigned c_dissect_msg_statfs(proto_tree *root,
4322
         tvbuff_t *tvb,
4323
         unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4324
         c_pkt_data *data)
4325
0
{
4326
0
  proto_item *ti;
4327
0
  proto_tree *tree;
4328
0
  unsigned off = 0;
4329
4330
  /* ceph:/src/messages/MStatfs.h */
4331
4332
0
  c_set_type(data, "Stat FS");
4333
4334
0
  off = c_dissect_paxos(root, tvb, off, data);
4335
4336
0
  ti = proto_tree_add_item(root, hf_msg_statfs, tvb, off, front_len, ENC_NA);
4337
0
  tree = proto_item_add_subtree(ti, ett_msg_statfs);
4338
4339
0
  proto_tree_add_item(tree, hf_msg_statfs_fsid,
4340
0
          tvb, off, 16, ENC_BIG_ENDIAN);
4341
0
  off += 16;
4342
4343
0
  return off;
4344
0
}
4345
4346
/** Stat FS Reply 0x000E */
4347
static
4348
unsigned c_dissect_msg_statfsreply(proto_tree *root,
4349
        tvbuff_t *tvb,
4350
        unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4351
        c_pkt_data *data)
4352
0
{
4353
0
  proto_item *ti;
4354
0
  proto_tree *tree;
4355
0
  unsigned off = 0;
4356
4357
  /* ceph:/src/messages/MStatfsReply.h */
4358
4359
0
  c_set_type(data, "Stat FS Reply");
4360
4361
0
  ti = proto_tree_add_item(root, hf_msg_statfsreply, tvb, off, front_len, ENC_NA);
4362
0
  tree = proto_item_add_subtree(ti, ett_msg_statfsreply);
4363
4364
0
  proto_tree_add_item(tree, hf_msg_statfsreply_fsid,
4365
0
          tvb, off, 16, ENC_BIG_ENDIAN);
4366
0
  off += 16;
4367
4368
0
  proto_tree_add_item(tree, hf_msg_statfsreply_ver,
4369
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4370
0
  off += 8;
4371
4372
0
  proto_tree_add_item(tree, hf_msg_statfsreply_kb,
4373
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4374
0
  off += 8;
4375
4376
0
  proto_tree_add_item(tree, hf_msg_statfsreply_kbused,
4377
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4378
0
  off += 8;
4379
4380
0
  proto_tree_add_item(tree, hf_msg_statfsreply_kbavail,
4381
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4382
0
  off += 8;
4383
4384
0
  proto_tree_add_item(tree, hf_msg_statfsreply_obj,
4385
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4386
0
  off += 8;
4387
4388
0
  return off;
4389
0
}
4390
4391
/** Mon subscribe message 0x000F */
4392
static
4393
unsigned c_dissect_msg_mon_sub(proto_tree *root,
4394
          tvbuff_t *tvb,
4395
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4396
          c_pkt_data *data)
4397
0
{
4398
0
  proto_item *ti, *subti, *subti2;
4399
0
  proto_tree *tree, *subtree;
4400
0
  unsigned off = 0;
4401
0
  unsigned len;
4402
0
  c_str str;
4403
4404
  /* ceph:/src/messages/MMonSubscribe.h */
4405
4406
0
  c_set_type(data, "Mon Subscribe");
4407
4408
0
  ti = proto_tree_add_item(root, hf_msg_mon_sub, tvb, off, front_len, ENC_NA);
4409
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_sub);
4410
4411
0
  c_append_text(data, ti, ", To: ");
4412
4413
0
  len = tvb_get_letohl(tvb, off);
4414
0
  proto_tree_add_item(tree, hf_msg_mon_sub_item_len,
4415
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4416
0
  off += 4;
4417
0
  while (len--)
4418
0
  {
4419
    /* From ceph:/src/include/ceph_fs.h
4420
    struct ceph_mon_subscribe_item {
4421
      __le64 start;
4422
      __u8 flags;
4423
    } __attribute__ ((packed))
4424
    */
4425
4426
0
    subti = proto_tree_add_item(tree, hf_msg_mon_sub_item,
4427
0
            tvb, off, -1, ENC_NA);
4428
0
    subtree = proto_item_add_subtree(subti, ett_msg_mon_sub_item);
4429
4430
0
    off = c_dissect_str(subtree, hf_msg_mon_sub_what, &str, tvb, data->pinfo, off);
4431
4432
0
    c_append_text(data, ti, "%s%s", str.str, len? ",":"");
4433
4434
0
    proto_item_append_text(subti, " What: %s, Starting: %"PRIu64,
4435
0
               str.str,
4436
0
               tvb_get_letoh64(tvb, off));
4437
4438
0
    proto_tree_add_item(subtree, hf_msg_mon_sub_start,
4439
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4440
0
    off += 8;
4441
4442
    /* Flags */
4443
0
    subti2 = proto_tree_add_item(subtree, hf_msg_mon_sub_flags,
4444
0
               tvb, off, 1, ENC_LITTLE_ENDIAN);
4445
    /* Reuse subtree variable for flags. */
4446
0
    subtree = proto_item_add_subtree(subti2, ett_msg_mon_sub_flags);
4447
0
    proto_tree_add_item(subtree, hf_msg_mon_sub_flags_onetime,
4448
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
4449
0
    off += 1;
4450
4451
0
    proto_item_set_end(ti, tvb, off);
4452
0
  }
4453
4454
0
  return off;
4455
0
}
4456
4457
/** Mon subscription ack 0x0010 */
4458
static
4459
unsigned c_dissect_msg_mon_sub_ack(proto_tree *root,
4460
        tvbuff_t *tvb,
4461
        unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4462
        c_pkt_data *data)
4463
0
{
4464
0
  proto_item *ti;
4465
0
  proto_tree *tree;
4466
0
  unsigned off = 0;
4467
4468
  /* ceph:/src/messages/MMonSubscribeAck.h */
4469
4470
0
  c_set_type(data, "Mon Subscribe Ack");
4471
4472
0
  ti = proto_tree_add_item(root, hf_msg_mon_sub_ack, tvb, off, front_len, ENC_NA);
4473
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_sub_ack);
4474
4475
0
  proto_tree_add_item(tree, hf_msg_mon_sub_ack_interval,
4476
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4477
0
  off += 4;
4478
0
  proto_tree_add_item(tree, hf_msg_mon_sub_ack_fsid,
4479
0
          tvb, off, 16, ENC_BIG_ENDIAN);
4480
0
  off += 16;
4481
4482
0
  return off;
4483
0
}
4484
4485
/** Authentication Request 0x0011. */
4486
static
4487
unsigned c_dissect_msg_auth(proto_tree *root,
4488
       tvbuff_t *tvb,
4489
       unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4490
       c_pkt_data *data)
4491
0
{
4492
0
  proto_item *ti, *ti2;
4493
0
  proto_tree *tree, *subtree;
4494
0
  unsigned off = 0, expectedoff;
4495
0
  uint8_t ver;
4496
0
  uint32_t i, len;
4497
0
  c_auth_proto proto;
4498
4499
  /* ceph:/src/messages/MAuth.h */
4500
4501
0
  c_set_type(data, "Auth");
4502
4503
0
  off = c_dissect_paxos(root, tvb, off, data);
4504
4505
0
  ti = proto_tree_add_item(root, hf_msg_auth, tvb, off, front_len-off, ENC_NA);
4506
0
  tree = proto_item_add_subtree(ti, ett_msg_auth);
4507
4508
0
  proto = (c_auth_proto)tvb_get_letohl(tvb, off);
4509
0
  proto_tree_add_item(tree, hf_msg_auth_proto,
4510
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4511
0
  off += 4;
4512
4513
0
  expectedoff = off + 4 + tvb_get_letohl(tvb, off);
4514
0
  off += 4;
4515
4516
0
  switch (proto)
4517
0
  {
4518
0
  case C_AUTH_PROTO_UNKNOWN:
4519
    /* auth_payload is a set of supported protocols. */
4520
0
    ti2 = proto_tree_add_item(tree, hf_msg_auth_supportedproto,
4521
0
            tvb, off, -1, ENC_NA);
4522
0
    subtree = proto_item_add_subtree(ti2, ett_msg_auth_supportedproto);
4523
4524
0
    ver = tvb_get_uint8(tvb, off);
4525
    /* XXX - should we quit if this doesn't return 0? */
4526
0
    c_warn_ver(ti2, ver, 1, 1, data);
4527
0
    proto_tree_add_item(tree, hf_msg_auth_supportedproto_ver,
4528
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
4529
0
    off += 1;
4530
4531
0
    len = tvb_get_letohl(tvb, off);
4532
0
    off += 4;
4533
0
    for (i = 0; i < len; i++)
4534
0
    {
4535
0
      c_auth_proto sp;
4536
0
      sp = (c_auth_proto)tvb_get_letohl(tvb, off);
4537
0
      proto_item_append_text(ti2, i?",%s":": %s", c_auth_proto_string(sp, data->pinfo->pool));
4538
0
      proto_tree_add_item(subtree, hf_msg_auth_supportedproto_proto,
4539
0
              tvb, off, 4, ENC_LITTLE_ENDIAN);
4540
0
      off += 4;
4541
0
    }
4542
4543
0
    off = c_dissect_EntityName(subtree, tvb, off, data);
4544
4545
0
    proto_tree_add_item(subtree, hf_msg_auth_supportedproto_gid,
4546
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4547
0
    off += 8;
4548
0
    break;
4549
0
  case C_AUTH_PROTO_CEPHX:
4550
0
  {
4551
0
    c_cephx_req_type type;
4552
4553
0
    ti2 = proto_tree_add_item(tree, hf_msg_auth_cephx, tvb, off, -1, ENC_NA);
4554
0
    subtree = proto_item_add_subtree(ti2, ett_msg_auth_cephx);
4555
4556
0
    type = (c_cephx_req_type)tvb_get_letohs(tvb, off);
4557
0
    proto_tree_add_item(subtree, hf_msg_auth_cephx_req_type,
4558
0
            tvb, off, 2, ENC_LITTLE_ENDIAN);
4559
0
    off += 2;
4560
4561
0
    switch (type)
4562
0
    {
4563
0
    default:
4564
0
      expert_add_info(data->pinfo, ti2, &ei_union_unknown);
4565
0
    }
4566
4567
0
    proto_item_append_text(ti2, ", Request Type: %s",
4568
0
               c_cephx_req_type_string(type, data->pinfo->pool));
4569
0
    break;
4570
0
  }
4571
0
  default:
4572
0
    expert_add_info(data->pinfo, ti, &ei_union_unknown);
4573
0
  }
4574
4575
0
  c_warn_size(tree, tvb, off, expectedoff, data);
4576
0
  off = expectedoff;
4577
4578
0
  if (off+4 == front_len) { /* If there is an epoch. */
4579
0
    proto_tree_add_item(tree, hf_msg_auth_monmap_epoch,
4580
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
4581
0
    off += 4;
4582
0
  }
4583
4584
0
  c_append_text(data, ti, ", Proto: %s", c_auth_proto_string(proto, data->pinfo->pool));
4585
4586
0
  return off;
4587
0
}
4588
4589
/** Authentication response. 0x0012 */
4590
static
4591
unsigned c_dissect_msg_auth_reply(proto_tree *root,
4592
             tvbuff_t *tvb,
4593
             unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4594
             c_pkt_data *data)
4595
0
{
4596
0
  proto_item *ti;
4597
0
  proto_tree *tree;
4598
0
  unsigned off = 0, expectedoff;
4599
0
  c_auth_proto proto;
4600
4601
  /* ceph:/src/messages/MAuthReply.h */
4602
4603
0
  c_set_type(data, "Auth Reply");
4604
4605
0
  ti = proto_tree_add_item(root, hf_msg_auth_reply, tvb, off, front_len, ENC_NA);
4606
0
  tree = proto_item_add_subtree(ti, ett_msg_authreply);
4607
4608
0
  proto = (c_auth_proto)tvb_get_letohl(tvb, off);
4609
0
  proto_tree_add_item(tree, hf_msg_auth_reply_proto,
4610
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4611
0
  off += 4;
4612
0
  proto_tree_add_item(tree, hf_msg_auth_reply_result,
4613
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4614
0
  off += 4;
4615
0
  proto_tree_add_item(tree, hf_msg_auth_reply_global_id,
4616
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4617
0
  off += 8;
4618
4619
0
  expectedoff = off + 4 + tvb_get_letohl(tvb, off);
4620
0
  off += 4;
4621
4622
0
  switch (proto)
4623
0
  {
4624
0
  default:
4625
0
    expert_add_info(data->pinfo, ti, &ei_union_unknown);
4626
0
  }
4627
4628
0
  c_warn_size(tree, tvb, off, expectedoff, data);
4629
0
  off = expectedoff;
4630
4631
0
  off = c_dissect_str(tree, hf_msg_auth_reply_msg, NULL, tvb, data->pinfo, off);
4632
4633
0
  c_append_text(data, ti, ", Proto: %s", c_auth_proto_string(proto, data->pinfo->pool));
4634
4635
0
  return off;
4636
0
}
4637
4638
/** Get map versions. 0x0013 */
4639
static
4640
unsigned c_dissect_msg_mon_getversion(proto_tree *root,
4641
           tvbuff_t *tvb,
4642
           unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4643
           c_pkt_data *data)
4644
0
{
4645
0
  proto_item *ti;
4646
0
  proto_tree *tree;
4647
0
  unsigned off = 0;
4648
0
  uint64_t tid;
4649
0
  c_str what;
4650
4651
  /* ceph:/src/messages/MMonGetVersion.h */
4652
4653
0
  c_set_type(data, "Monitor Get Version");
4654
4655
0
  ti = proto_tree_add_item(root, hf_msg_mon_getversion, tvb, off, front_len, ENC_NA);
4656
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_getversion);
4657
4658
0
  tid = tvb_get_letoh64(tvb, off);
4659
0
  proto_tree_add_item(tree, hf_msg_mon_getversion_tid,
4660
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4661
0
  off += 8;
4662
4663
0
  off = c_dissect_str(tree, hf_msg_mon_getversion_what, &what, tvb, data->pinfo, off);
4664
4665
4666
0
  c_append_text(data, ti, ", TID: %"PRIu64", What: %s",
4667
0
          tid, what.str);
4668
4669
0
  return off;
4670
0
}
4671
4672
4673
/** Get map versions response. 0x0014 */
4674
static
4675
unsigned c_dissect_msg_mon_getversionreply(proto_tree *root,
4676
          tvbuff_t *tvb,
4677
          unsigned front_len,
4678
          unsigned middle_len _U_,
4679
          unsigned data_len _U_,
4680
          c_pkt_data *data)
4681
0
{
4682
0
  proto_item *ti;
4683
0
  proto_tree *tree;
4684
0
  unsigned off = 0;
4685
0
  uint64_t tid;
4686
0
  uint64_t ver, veroldest;
4687
4688
  /* ceph:/src/messages/MMonGetVersionReply.h */
4689
4690
0
  c_set_type(data, "Monitor Get Version Reply");
4691
4692
0
  ti = proto_tree_add_item(root, hf_msg_mon_getversionreply, tvb, off, front_len, ENC_NA);
4693
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_getversionreply);
4694
4695
0
  tid = tvb_get_letoh64(tvb, off);
4696
0
  proto_tree_add_item(tree, hf_msg_mon_getversionreply_tid,
4697
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4698
0
  off += 8;
4699
4700
0
  ver = tvb_get_letoh64(tvb, off);
4701
0
  proto_tree_add_item(tree, hf_msg_mon_getversionreply_ver,
4702
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4703
0
  off += 8;
4704
4705
0
  veroldest = tvb_get_letoh64(tvb, off);
4706
0
  proto_tree_add_item(tree, hf_msg_mon_getversionreply_veroldest,
4707
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4708
0
  off += 8;
4709
4710
0
  c_append_text(data, ti, ", TID: %"PRIu64
4711
0
          ", Version: %"PRIu64
4712
0
          ", Oldest Version: %"PRIu64,
4713
0
          tid, ver, veroldest);
4714
4715
0
  return off;
4716
0
}
4717
4718
/** MDS Map 0x0015 */
4719
static
4720
unsigned c_dissect_msg_mds_map(proto_tree *root,
4721
          tvbuff_t *tvb,
4722
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4723
          c_pkt_data *data)
4724
0
{
4725
0
  proto_item *ti;
4726
0
  proto_tree *tree;
4727
0
  unsigned off = 0;
4728
4729
  /* ceph:/src/messages/MMDSMap.h */
4730
4731
0
  c_set_type(data, "MDS Map");
4732
4733
0
  ti = proto_tree_add_item(root, hf_msg_mds_map, tvb, off, front_len, ENC_NA);
4734
0
  tree = proto_item_add_subtree(ti, ett_msg_mds_map);
4735
4736
0
  proto_tree_add_item(tree, hf_msg_mds_map_fsid,
4737
0
          tvb, off, 16, ENC_BIG_ENDIAN);
4738
0
  off += 16;
4739
4740
0
  proto_tree_add_item(tree, hf_msg_mds_map_epoch,
4741
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4742
0
  off += 4;
4743
4744
  /* @TODO: Dissect map data. */
4745
4746
0
  off = c_dissect_blob(tree, hf_msg_mds_map_datai,
4747
0
           hf_msg_mds_map_data, hf_msg_mds_map_data_size,
4748
0
           tvb, data->pinfo, off);
4749
4750
0
  return off;
4751
0
}
4752
4753
/** Client Session 0x0016 */
4754
static
4755
unsigned c_dissect_msg_client_sess(proto_tree *root,
4756
        tvbuff_t *tvb,
4757
        unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4758
        c_pkt_data *data)
4759
0
{
4760
0
  proto_item *ti;
4761
0
  proto_tree *tree;
4762
0
  unsigned off = 0;
4763
0
  c_session_op_type op;
4764
4765
  /* ceph:/src/messages/MClientSession.h */
4766
4767
0
  c_set_type(data, "Client Session");
4768
4769
0
  ti = proto_tree_add_item(root, hf_msg_client_sess, tvb, off, front_len, ENC_NA);
4770
0
  tree = proto_item_add_subtree(ti, ett_msg_client_sess);
4771
4772
0
  op = (c_session_op_type)tvb_get_letohl(tvb, off);
4773
0
  proto_tree_add_item(tree, hf_msg_client_sess_op,
4774
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4775
0
  off += 4;
4776
4777
0
  proto_tree_add_item(tree, hf_msg_client_sess_seq,
4778
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4779
0
  off += 8;
4780
4781
0
  proto_tree_add_item(tree, hf_msg_client_sess_time,
4782
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4783
0
  off += 8;
4784
4785
0
  proto_tree_add_item(tree, hf_msg_client_sess_caps_max,
4786
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4787
0
  off += 4;
4788
4789
0
  proto_tree_add_item(tree, hf_msg_client_sess_leases_max,
4790
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4791
0
  off += 4;
4792
4793
0
  c_append_text(data, ti, ", Operation: %s", c_session_op_type_string(op, data->pinfo->pool));
4794
4795
0
  return off;
4796
0
}
4797
4798
/** Client Request 0x0018 */
4799
static
4800
unsigned c_dissect_msg_client_req(proto_tree *root,
4801
             tvbuff_t *tvb,
4802
             unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4803
             c_pkt_data *data)
4804
0
{
4805
0
  proto_item *ti;
4806
0
  proto_tree *tree;
4807
0
  unsigned off = 0;
4808
0
  uint32_t i;
4809
0
  c_mds_op_type type;
4810
4811
  /* ceph:/src/messages/MClientRequest.h */
4812
4813
0
  c_set_type(data, "Client Request");
4814
4815
0
  ti = proto_tree_add_item(root, hf_msg_client_req, tvb, off, front_len, ENC_NA);
4816
0
  tree = proto_item_add_subtree(ti, ett_msg_client_req);
4817
4818
0
  proto_tree_add_item(tree, hf_msg_client_req_oldest_tid,
4819
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4820
0
  off += 8;
4821
4822
0
  proto_tree_add_item(tree, hf_msg_client_req_mdsmap_epoch,
4823
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4824
0
  off += 4;
4825
4826
0
  proto_tree_add_item(tree, hf_msg_client_req_flags,
4827
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4828
0
  off += 4;
4829
4830
0
  proto_tree_add_item(tree, hf_msg_client_req_retry,
4831
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
4832
0
  off += 1;
4833
4834
0
  proto_tree_add_item(tree, hf_msg_client_req_forward,
4835
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
4836
0
  off += 1;
4837
4838
0
  i = tvb_get_letohs(tvb, off);
4839
0
  proto_tree_add_item(tree, hf_msg_client_req_releases,
4840
0
          tvb, off, 2, ENC_LITTLE_ENDIAN);
4841
0
  off += 2;
4842
4843
0
  type = (c_mds_op_type)tvb_get_letohl(tvb, off);
4844
0
  proto_tree_add_item(tree, hf_msg_client_req_op,
4845
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4846
0
  off += 4;
4847
4848
0
  proto_tree_add_item(tree, hf_msg_client_req_caller_uid,
4849
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4850
0
  off += 4;
4851
4852
0
  proto_tree_add_item(tree, hf_msg_client_req_caller_gid,
4853
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4854
0
  off += 4;
4855
4856
0
  proto_tree_add_item(tree, hf_msg_client_req_inode,
4857
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
4858
0
  off += 8;
4859
4860
0
  off += 48; /* @TODO: Message specific data. */
4861
4862
0
  off = c_dissect_path(tree, hf_msg_client_req_path_src, tvb, off, data);
4863
0
  off = c_dissect_path(tree, hf_msg_client_req_path_dst, tvb, off, data);
4864
4865
0
  while (i--)
4866
0
  {
4867
0
    off = c_dissect_mds_release(tree, hf_msg_client_req_release,
4868
0
              tvb, off, data);
4869
0
  }
4870
4871
0
  if (data->header.ver >= 2)
4872
0
  {
4873
0
    proto_tree_add_item(tree, hf_msg_client_req_time,
4874
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
4875
0
    off += 8;
4876
0
  }
4877
4878
0
  c_append_text(data, ti, ", Operation: %s", c_mds_op_type_string(type, data->pinfo->pool));
4879
4880
0
  return off;
4881
0
}
4882
4883
/** Client Request Forward 0x0019 */
4884
static
4885
unsigned c_dissect_msg_client_reqfwd(proto_tree *root,
4886
          tvbuff_t *tvb,
4887
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4888
          c_pkt_data *data)
4889
0
{
4890
0
  proto_item *ti;
4891
0
  proto_tree *tree;
4892
0
  unsigned off = 0;
4893
0
  uint32_t to, fwd;
4894
0
  uint8_t resend;
4895
4896
  /* ceph:/src/messages/MClientRequestForward.h */
4897
4898
0
  c_set_type(data, "Client Request Forward");
4899
4900
0
  ti = proto_tree_add_item(root, hf_msg_client_reqfwd, tvb, off, front_len, ENC_NA);
4901
0
  tree = proto_item_add_subtree(ti, ett_msg_client_reqfwd);
4902
4903
0
  to = tvb_get_letohl(tvb, off);
4904
0
  proto_tree_add_item(tree, hf_msg_client_reqfwd_dst,
4905
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4906
0
  off += 4;
4907
4908
0
  fwd = tvb_get_letohl(tvb, off);
4909
0
  proto_tree_add_item(tree, hf_msg_client_reqfwd_fwd,
4910
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4911
0
  off += 4;
4912
4913
0
  resend = tvb_get_uint8(tvb, off);
4914
0
  proto_tree_add_item(tree, hf_msg_client_reqfwd_resend,
4915
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
4916
0
  off += 1;
4917
4918
0
  c_append_text(data, ti, ", To: mds%"PRIu32", Resend: %s, "
4919
0
          "Forwards: %"PRIu32,
4920
0
          to, resend? "True":"False", fwd);
4921
4922
0
  return off;
4923
0
}
4924
4925
/** Client Reply 0x001A */
4926
static
4927
unsigned c_dissect_msg_client_reply(proto_tree *root,
4928
         tvbuff_t *tvb,
4929
         unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4930
         c_pkt_data *data)
4931
0
{
4932
0
  proto_item *ti;
4933
0
  proto_tree *tree;
4934
0
  unsigned off = 0;
4935
0
  c_mds_op_type type;
4936
4937
  /* ceph:/src/messages/MClientReply.h */
4938
4939
0
  c_set_type(data, "Client Reply");
4940
4941
0
  ti = proto_tree_add_item(root, hf_msg_client_reply, tvb, off, front_len, ENC_NA);
4942
0
  tree = proto_item_add_subtree(ti, ett_msg_client_reply);
4943
4944
0
  type = (c_mds_op_type)tvb_get_letohl(tvb, off);
4945
0
  proto_tree_add_item(tree, hf_msg_client_reply_op,
4946
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4947
0
  off += 4;
4948
4949
0
  proto_tree_add_item(tree, hf_msg_client_reply_result,
4950
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4951
0
  off += 4;
4952
4953
0
  proto_tree_add_item(tree, hf_msg_client_reply_mdsmap_epoch,
4954
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
4955
0
  off += 4;
4956
4957
0
  proto_tree_add_item(tree, hf_msg_client_reply_safe,
4958
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
4959
0
  off += 1;
4960
4961
0
  proto_tree_add_item(tree, hf_msg_client_reply_isdentry,
4962
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
4963
0
  off += 1;
4964
4965
0
  proto_tree_add_item(tree, hf_msg_client_reply_istarget,
4966
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
4967
0
  off += 1;
4968
4969
  /* @TODO: Dissect these. */
4970
0
  off = c_dissect_data(tree, hf_msg_client_reply_trace, tvb, data->pinfo, off);
4971
0
  off = c_dissect_data(tree, hf_msg_client_reply_extra, tvb, data->pinfo, off);
4972
0
  off = c_dissect_data(tree, hf_msg_client_reply_snaps, tvb, data->pinfo, off);
4973
4974
0
  c_append_text(data, ti, ", Operation: %s", c_mds_op_type_string(type, data->pinfo->pool));
4975
4976
0
  return off;
4977
0
}
4978
4979
/** OSD Map 0x0029 */
4980
static
4981
unsigned c_dissect_msg_osd_map(proto_tree *root,
4982
          tvbuff_t *tvb,
4983
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
4984
          c_pkt_data *data)
4985
0
{
4986
0
  proto_item *ti, *ti2;
4987
0
  proto_tree *tree, *subtree;
4988
0
  unsigned off = 0;
4989
0
  uint32_t i;
4990
0
  uint32_t epoch;
4991
4992
  /* ceph:/src/messages/MOSDMap.h */
4993
4994
0
  c_set_type(data, "OSD Map");
4995
4996
0
  ti = proto_tree_add_item(root, hf_msg_osd_map, tvb, off, front_len, ENC_NA);
4997
0
  tree = proto_item_add_subtree(ti, ett_msg_osd_map);
4998
4999
0
  proto_tree_add_item(tree, hf_msg_osd_map_fsid,
5000
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5001
0
  off += 16;
5002
5003
  /*** Incremental Items ***/
5004
0
  i = tvb_get_letohl(tvb, off);
5005
0
  proto_tree_add_item(tree, hf_msg_osd_map_inc_len,
5006
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5007
0
  c_append_text(data, ti, ", Incremental Items: %u", i);
5008
5009
0
  off += 4;
5010
0
  while (i--)
5011
0
  {
5012
0
    ti2 = proto_tree_add_item(tree, hf_msg_osd_map_inc,
5013
0
            tvb, off, -1, ENC_NA);
5014
0
    subtree = proto_item_add_subtree(ti2, ett_msg_osd_map_inc);
5015
5016
0
    epoch = tvb_get_letohl(tvb, off);
5017
0
    proto_tree_add_item(subtree, hf_msg_osd_map_epoch,
5018
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5019
0
    off += 4;
5020
5021
0
    off = c_dissect_osdmap_inc(subtree, tvb, off, data);
5022
5023
0
    proto_item_append_text(ti2, ", For Epoch: %"PRIu32, epoch);
5024
0
    proto_item_set_end(ti2, tvb, off);
5025
0
  }
5026
5027
  /*** Non-incremental Items ***/
5028
0
  i = tvb_get_letohl(tvb, off);
5029
0
  proto_tree_add_item(tree, hf_msg_osd_map_map_len,
5030
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5031
0
  c_append_text(data, ti, ", Items: %u", i);
5032
0
  off += 4;
5033
0
  while (i--)
5034
0
  {
5035
0
    ti2 = proto_tree_add_item(tree, hf_msg_osd_map_map,
5036
0
            tvb, off, -1, ENC_NA);
5037
0
    subtree = proto_item_add_subtree(ti2, ett_msg_osd_map_full);
5038
5039
0
    epoch = tvb_get_letohl(tvb, off);
5040
0
    proto_tree_add_item(subtree, hf_msg_osd_map_epoch,
5041
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5042
0
    off += 4;
5043
5044
0
    off = c_dissect_osdmap(subtree, tvb, off, data);
5045
5046
0
    proto_item_append_text(ti2, ", For Epoch: %"PRIu32, epoch);
5047
0
    proto_item_set_end(ti2, tvb, off);
5048
0
  }
5049
5050
0
  if (data->header.ver >= 2)
5051
0
  {
5052
0
    proto_tree_add_item(tree, hf_msg_osd_map_oldest,
5053
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5054
0
    off += 4;
5055
0
    proto_tree_add_item(tree, hf_msg_osd_map_newest,
5056
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5057
0
    off += 4;
5058
0
  }
5059
5060
0
  return off;
5061
0
}
5062
5063
/** OSD Operation (0x002A)
5064
 */
5065
static
5066
unsigned c_dissect_msg_osd_op(proto_tree *root,
5067
         tvbuff_t *tvb,
5068
         unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5069
         c_pkt_data *data)
5070
0
{
5071
0
  proto_item *ti, *ti2;
5072
0
  proto_tree *tree;
5073
0
  unsigned off = 0;
5074
0
  uint16_t opslen, i;
5075
0
  c_osd_op *ops;
5076
0
  c_str str;
5077
5078
  /* ceph:/src/messages/MOSDOp.h */
5079
5080
0
  c_set_type(data, "OSD Operation");
5081
5082
0
  ti = proto_tree_add_item(root, hf_msg_osd_op, tvb, off, front_len, ENC_NA);
5083
0
  tree = proto_item_add_subtree(ti, ett_msg_osd_op);
5084
5085
0
  proto_tree_add_item(tree, hf_msg_osd_op_client_inc,
5086
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5087
0
  off += 4;
5088
5089
0
  proto_tree_add_item(tree, hf_msg_osd_op_osdmap_epoch,
5090
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5091
0
  off += 4;
5092
5093
0
  off = c_dissect_osd_flags(tree, tvb, off, data);
5094
5095
0
  proto_tree_add_item(tree, hf_msg_osd_op_mtime,
5096
0
          tvb, off, 8, ENC_TIME_SECS_NSECS|ENC_LITTLE_ENDIAN);
5097
0
  off += 8;
5098
5099
0
  off = c_dissect_eversion(tree, hf_msg_osd_op_reassert_version,
5100
0
         tvb, off, data);
5101
5102
0
  off = c_dissect_object_locator(tree, hf_msg_osd_op_oloc, tvb, off, data);
5103
5104
0
  off = c_dissect_pg(tree, hf_msg_osd_op_pgid, tvb, off, data);
5105
5106
0
  off = c_dissect_str(tree, hf_msg_osd_op_oid, &str, tvb, data->pinfo, off);
5107
5108
0
  opslen = tvb_get_letohs(tvb, off);
5109
0
  c_append_text(data, ti, ", Operations: %"PRId32, opslen);
5110
0
  ti2 = proto_tree_add_item(tree, hf_msg_osd_op_ops_len,
5111
0
          tvb, off, 2, ENC_LITTLE_ENDIAN);
5112
0
  off += 2;
5113
0
  if (opslen > (tvb_reported_length(tvb)-off)/C_SIZE_OSD_OP_MIN)
5114
0
  {
5115
    /*
5116
      If the size is huge (maybe it was mangled on the wire) we want to
5117
      avoid allocating massive amounts of memory to handle it.  So, if
5118
      it is larger than can possibly fit in the rest of the message, bail
5119
      out.
5120
    */
5121
0
    expert_add_info(data->pinfo, ti2, &ei_sizeillogical);
5122
0
    return off;
5123
0
  }
5124
0
  ops = wmem_alloc_array(data->pinfo->pool, c_osd_op, opslen);
5125
0
  for (i = 0; i < opslen; i++)
5126
0
  {
5127
0
    off = c_dissect_osd_op(tree, hf_msg_osd_op_op, &ops[i], tvb, off, data);
5128
0
  }
5129
5130
0
  proto_tree_add_item(tree, hf_msg_osd_op_snap_id,
5131
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5132
0
  off += 8;
5133
0
  proto_tree_add_item(tree, hf_msg_osd_op_snap_seq,
5134
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5135
0
  off += 8;
5136
5137
0
  i = tvb_get_letohl(tvb, off);
5138
0
  proto_tree_add_item(tree, hf_msg_osd_op_snaps_len,
5139
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5140
0
  off += 4;
5141
0
  while (i--)
5142
0
  {
5143
0
    proto_tree_add_item(tree, hf_msg_osd_op_snap,
5144
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5145
0
    off += 8;
5146
0
  }
5147
5148
0
  if (data->header.ver >= 4)
5149
0
  {
5150
0
    proto_tree_add_item(tree, hf_msg_osd_op_retry_attempt,
5151
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5152
0
    off += 4;
5153
0
  }
5154
5155
0
  c_warn_size(tree, tvb, off, front_len, data);
5156
5157
0
  for (i = 0; i < opslen; i++)
5158
0
  {
5159
0
    proto_tree_add_item(tree, hf_msg_osd_op_payload,
5160
0
            tvb, off, ops[i].payload_size, ENC_NA);
5161
0
    off += ops[i].payload_size;
5162
0
  }
5163
5164
0
  return off;
5165
0
}
5166
5167
/** OSD Operation Reply (0x002B)
5168
 */
5169
static
5170
unsigned c_dissect_msg_osd_opreply(proto_tree *root,
5171
        tvbuff_t *tvb,
5172
        unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5173
        c_pkt_data *data)
5174
0
{
5175
0
  proto_item *ti, *ti2;
5176
0
  proto_tree *tree;
5177
0
  unsigned off = 0;
5178
0
  c_str str;
5179
0
  uint32_t i;
5180
0
  uint32_t opslen;
5181
0
  c_osd_op *ops;
5182
5183
  /* ceph:/src/messages/MOSDOpReply.h */
5184
5185
0
  c_set_type(data, "OSD Operation Reply");
5186
5187
0
  ti = proto_tree_add_item(root, hf_msg_osd_opreply, tvb, off, front_len, ENC_NA);
5188
0
  tree = proto_item_add_subtree(ti, ett_msg_osd_opreply);
5189
5190
0
  off = c_dissect_str(tree, hf_msg_osd_opreply_oid, &str, tvb, data->pinfo, off);
5191
5192
0
  off = c_dissect_pg(tree, hf_msg_osd_opreply_pgid, tvb, off, data);
5193
5194
0
  off = c_dissect_osd_flags(tree, tvb, off, data);
5195
0
  off += 4; /* flags is 64 bit but the higher bits are ignored. */
5196
5197
0
  proto_tree_add_item(tree, hf_msg_osd_opreply_result,
5198
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5199
0
  off += 4;
5200
5201
0
  off = c_dissect_eversion(tree, hf_msg_osd_opreply_bad_replay_ver,
5202
0
         tvb, off, data);
5203
5204
0
  proto_tree_add_item(tree, hf_msg_osd_opreply_osdmap_epoch,
5205
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5206
0
  off += 4;
5207
5208
0
  opslen = tvb_get_letohl(tvb, off);
5209
0
  ti2 = proto_tree_add_item(tree, hf_msg_osd_opreply_ops_len,
5210
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5211
0
  off += 4;
5212
0
  if (opslen >= (tvb_reported_length(tvb)-off)/C_SIZE_OSD_OP_MIN)
5213
0
  {
5214
    /*
5215
      If the size is huge (maybe it was mangled on the wire) we want to
5216
      avoid allocating massive amounts of memory to handle it.  So, if
5217
      it is larger then can possible fit in the rest of the message bail
5218
      out.
5219
    */
5220
0
    expert_add_info(data->pinfo, ti2, &ei_sizeillogical);
5221
0
    return off;
5222
0
  }
5223
0
  ops = wmem_alloc_array(data->pinfo->pool, c_osd_op, opslen);
5224
0
  for (i = 0; i < opslen; i++)
5225
0
  {
5226
0
    off = c_dissect_osd_op(tree, hf_msg_osd_opreply_op, &ops[i],
5227
0
               tvb, off, data);
5228
0
  }
5229
5230
0
  if (data->header.ver >= 3)
5231
0
  {
5232
0
    proto_tree_add_item(tree, hf_msg_osd_opreply_retry_attempt,
5233
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5234
0
    off += 4;
5235
0
  }
5236
5237
0
  if (data->header.ver >= 4)
5238
0
  {
5239
0
    for (i = 0; i < opslen; i++)
5240
0
    {
5241
0
      proto_tree_add_item(tree, hf_msg_osd_opreply_rval,
5242
0
              tvb, off, 4, ENC_LITTLE_ENDIAN);
5243
0
      off += 4;
5244
0
    }
5245
0
  }
5246
5247
0
  if (data->header.ver >= 5)
5248
0
  {
5249
0
    off = c_dissect_eversion(tree, hf_msg_osd_opreply_replay_ver,
5250
0
           tvb, off, data);
5251
0
    proto_tree_add_item(tree, hf_msg_osd_opreply_user_ver,
5252
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5253
0
    off += 8;
5254
0
  }
5255
5256
0
  if (data->header.ver >= 6)
5257
0
  {
5258
0
    off = c_dissect_redirect(tree, hf_msg_osd_opreply_redirect,
5259
0
           tvb, off, data);
5260
0
  }
5261
5262
0
  c_warn_size(tree, tvb, off, front_len, data);
5263
0
  off = front_len;
5264
5265
0
  if (data->header.ver >= 4)
5266
0
  {
5267
0
    for (i = 0; i < opslen; i++)
5268
0
    {
5269
0
      proto_tree_add_item(tree, hf_msg_osd_opreply_payload,
5270
0
              tvb, off, ops[i].payload_size, ENC_NA);
5271
0
      off += ops[i].payload_size;
5272
0
    }
5273
0
  }
5274
5275
0
  return off;
5276
0
}
5277
5278
/** Pool Op Reply 0x0030 */
5279
static
5280
unsigned c_dissect_msg_poolopreply(proto_tree *root,
5281
        tvbuff_t *tvb,
5282
        unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5283
        c_pkt_data *data)
5284
0
{
5285
0
  proto_item *ti;
5286
0
  proto_tree *tree;
5287
0
  unsigned off = 0;
5288
0
  int32_t code;
5289
0
  uint8_t b;
5290
5291
  /* ceph:/src/messages/MPoolOpReply.h */
5292
5293
0
  c_set_type(data, "Pool Operation Reply");
5294
5295
0
  off = c_dissect_paxos(root, tvb, off, data);
5296
5297
0
  ti = proto_tree_add_item(root, hf_msg_poolopreply, tvb, off, front_len, ENC_NA);
5298
0
  tree = proto_item_add_subtree(ti, ett_msg_poolopreply);
5299
5300
0
  proto_tree_add_item(tree, hf_msg_poolopreply_fsid,
5301
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5302
0
  off += 16;
5303
5304
0
  code = tvb_get_letohl(tvb, off);
5305
0
  proto_tree_add_item(tree, hf_msg_poolopreply_code,
5306
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5307
0
  off += 4;
5308
5309
0
  proto_tree_add_item(tree, hf_msg_poolopreply_epoch,
5310
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5311
0
  off += 4;
5312
5313
0
  b = tvb_get_uint8(tvb, off);
5314
0
  off += 1;
5315
0
  if (b)
5316
0
    off = c_dissect_blob(tree, hf_msg_poolopreply_datai,
5317
0
             hf_msg_poolopreply_data, hf_msg_poolopreply_data_size,
5318
0
             tvb, data->pinfo, off);
5319
5320
0
  c_append_text(data, ti, ", Response Code: %"PRIu32, code);
5321
5322
0
  return off;
5323
0
}
5324
5325
/** Pool Op 0x0031
5326
 * Why this is a higher value than the reply?  Who knows?
5327
 */
5328
static
5329
unsigned c_dissect_msg_poolop(proto_tree *root,
5330
         tvbuff_t *tvb,
5331
         unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5332
         c_pkt_data *data)
5333
0
{
5334
0
  proto_item *ti;
5335
0
  proto_tree *tree;
5336
0
  unsigned off = 0;
5337
0
  int32_t pool;
5338
0
  c_poolop_type type;
5339
0
  c_str name;
5340
5341
  /* ceph:/src/messages/MPoolOp.h */
5342
5343
0
  c_set_type(data, "Pool Operation");
5344
5345
0
  off = c_dissect_paxos(root, tvb, off, data);
5346
5347
0
  ti = proto_tree_add_item(root, hf_msg_poolop, tvb, off, front_len, ENC_NA);
5348
0
  tree = proto_item_add_subtree(ti, ett_msg_poolop);
5349
5350
0
  proto_tree_add_item(tree, hf_msg_poolop_fsid,
5351
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5352
0
  off += 16;
5353
5354
0
  pool = tvb_get_letohl(tvb, off);
5355
0
  proto_tree_add_item(tree, hf_msg_poolop_pool,
5356
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5357
0
  off += 4;
5358
5359
0
  if (data->header.ver < 2)
5360
0
    off = c_dissect_str(tree, hf_msg_poolop_name, &name, tvb, data->pinfo, off);
5361
5362
0
  type = (c_poolop_type)tvb_get_letohl(tvb, off);
5363
0
  proto_tree_add_item(tree, hf_msg_poolop_type,
5364
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5365
0
  off += 4;
5366
5367
0
  proto_tree_add_item(tree, hf_msg_poolop_auid,
5368
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5369
0
  off += 8;
5370
5371
0
  proto_tree_add_item(tree, hf_msg_poolop_snapid,
5372
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5373
0
  off += 8;
5374
5375
0
  if (data->header.ver >= 2)
5376
0
    off = c_dissect_str(tree, hf_msg_poolop_name, &name, tvb, data->pinfo, off);
5377
5378
0
  if (data->header.ver >= 4)
5379
0
  {
5380
0
    off += 1; /* Skip padding byte. */
5381
0
    proto_tree_add_item(tree, hf_msg_poolop_crush_rule,
5382
0
            tvb, off, 2, ENC_LITTLE_ENDIAN);
5383
0
    off += 2;
5384
0
  }
5385
0
  else if (data->header.ver == 3)
5386
0
  {
5387
0
    proto_tree_add_item(tree, hf_msg_poolop_crush_rule8,
5388
0
            tvb, off, 1, ENC_LITTLE_ENDIAN);
5389
0
    off += 1;
5390
0
  }
5391
5392
0
  c_append_text(data, ti,
5393
0
          ", Type: %s, Name: %s, Pool: %"PRId32,
5394
0
          c_poolop_type_string(type, data->pinfo->pool),
5395
0
          name.str,
5396
0
          pool);
5397
5398
0
  return off;
5399
0
}
5400
5401
/** Monitor Command 0x0032 */
5402
static
5403
unsigned c_dissect_msg_mon_cmd(proto_tree *root,
5404
          tvbuff_t *tvb,
5405
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5406
          c_pkt_data *data)
5407
0
{
5408
0
  proto_item *ti;
5409
0
  proto_tree *tree, *subtree;
5410
0
  unsigned off = 0;
5411
0
  uint32_t i;
5412
0
  c_str str;
5413
5414
  /* ceph:/src/messages/MMonCommand.h */
5415
5416
0
  c_set_type(data, "Mon Command");
5417
5418
0
  off = c_dissect_paxos(root, tvb, off, data);
5419
5420
0
  ti = proto_tree_add_item(root, hf_msg_mon_cmd, tvb, off, front_len, ENC_NA);
5421
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_cmd);
5422
5423
0
  proto_tree_add_item(tree, hf_msg_mon_cmd_fsid,
5424
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5425
0
  off += 16;
5426
5427
0
  i = tvb_get_letohl(tvb, off);
5428
0
  proto_tree_add_item(tree, hf_msg_mon_cmd_arg_len,
5429
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5430
0
  off += 4;
5431
0
  while (i--)
5432
0
  {
5433
0
    ti = proto_tree_add_item(tree, hf_msg_mon_cmd_arg,
5434
0
           tvb, off, -1, ENC_NA);
5435
0
    subtree = proto_item_add_subtree(ti, ett_msg_mon_cmd_arg);
5436
5437
0
    off = c_dissect_str(subtree, hf_msg_mon_cmd_str, &str, tvb, data->pinfo, off);
5438
5439
0
    c_append_text(data, ti, " %s", str.str);
5440
5441
0
    proto_item_set_end(ti, tvb, off);
5442
0
  }
5443
5444
0
  return off;
5445
0
}
5446
5447
/** Mon Command ACK 0x0033 */
5448
static
5449
unsigned c_dissect_msg_mon_cmd_ack(proto_tree *root,
5450
        tvbuff_t *tvb,
5451
        unsigned front_len, unsigned middle_len _U_, unsigned data_len,
5452
        c_pkt_data *data)
5453
0
{
5454
0
  proto_item *ti;
5455
0
  proto_tree *tree, *subtree;
5456
0
  unsigned off = 0;
5457
0
  uint32_t i;
5458
5459
  /* ceph:/src/messages/MMonCommandAck.h */
5460
5461
0
  c_set_type(data, "Mon Command Result");
5462
5463
0
  off = c_dissect_paxos(root, tvb, off, data);
5464
5465
0
  ti = proto_tree_add_item(root, hf_msg_mon_cmd_ack,
5466
0
         tvb, off, front_len+data_len, ENC_NA);
5467
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_cmdack);
5468
5469
0
  proto_tree_add_item(tree, hf_msg_mon_cmd_ack_code,
5470
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5471
0
  off += 4;
5472
0
  off = c_dissect_str(tree, hf_msg_mon_cmd_ack_res, NULL, tvb, data->pinfo, off);
5473
5474
0
  i = tvb_get_letohl(tvb, off);
5475
0
  proto_tree_add_item(tree, hf_msg_mon_cmd_ack_arg_len,
5476
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5477
0
  off += 4;
5478
0
  while (i--)
5479
0
  {
5480
0
    ti = proto_tree_add_item(tree, hf_msg_mon_cmd_ack_arg, tvb, off, -1, ENC_NA);
5481
0
    subtree = proto_item_add_subtree(ti, ett_msg_mon_cmdack_arg);
5482
5483
0
    off = c_dissect_str(subtree, hf_msg_mon_cmd_ack_arg_str, NULL,
5484
0
            tvb, data->pinfo, off);
5485
5486
0
    proto_item_set_end(ti, tvb, off);
5487
0
  }
5488
5489
0
  c_warn_size(tree, tvb, off, front_len, data);
5490
5491
0
  proto_tree_add_item(tree, hf_msg_mon_cmd_ack_data,
5492
0
          tvb, front_len, data_len, ENC_UTF_8);
5493
5494
0
  return front_len+data_len;
5495
0
}
5496
5497
/** Get Pool Stats 0x003A */
5498
static
5499
unsigned c_dissect_msg_poolstats(proto_tree *root,
5500
            tvbuff_t *tvb,
5501
            unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5502
            c_pkt_data *data)
5503
0
{
5504
0
  proto_item *ti;
5505
0
  proto_tree *tree;
5506
0
  unsigned off = 0;
5507
0
  uint32_t i;
5508
0
  c_str str;
5509
5510
  /* ceph:/src/messages/MGetPoolStats.h */
5511
5512
0
  c_set_type(data, "Pool Stats");
5513
5514
0
  off = c_dissect_paxos(root, tvb, off, data);
5515
5516
0
  ti = proto_tree_add_item(root, hf_msg_poolstats, tvb, off, front_len, ENC_NA);
5517
0
  tree = proto_item_add_subtree(ti, ett_msg_poolstats);
5518
5519
0
  c_append_text(data, ti, ", For: ");
5520
5521
0
  proto_tree_add_item(tree, hf_msg_poolstats_fsid,
5522
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5523
0
  off += 16;
5524
5525
0
  i = tvb_get_letohl(tvb, off);
5526
0
  off += 4;
5527
0
  while (i--)
5528
0
  {
5529
0
    off = c_dissect_str(tree, hf_msg_poolstats_pool, &str, tvb, data->pinfo, off);
5530
0
    c_append_text(data, ti, "%s%s", str.str, i? ",":" ");
5531
0
  }
5532
5533
0
  return off;
5534
0
}
5535
5536
/** Pool Stats Reply 0x003B */
5537
static
5538
unsigned c_dissect_msg_poolstatsreply(proto_tree *root,
5539
           tvbuff_t *tvb,
5540
           unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5541
           c_pkt_data *data)
5542
0
{
5543
0
  proto_item *ti, *ti2;
5544
0
  proto_tree *tree, *subtree;
5545
0
  unsigned off = 0;
5546
0
  uint32_t i;
5547
0
  c_str str;
5548
0
  c_encoded encstat;
5549
5550
  /* ceph:/src/messages/MGetPoolStatsReply.h */
5551
5552
0
  c_set_type(data, "Pool Stats Reply");
5553
5554
0
  off = c_dissect_paxos(root, tvb, off, data);
5555
5556
0
  ti = proto_tree_add_item(root, hf_msg_poolstatsreply, tvb, off, front_len, ENC_NA);
5557
0
  tree = proto_item_add_subtree(ti, ett_msg_poolstatsreply);
5558
5559
0
  c_append_text(data, ti, ", For: ");
5560
5561
0
  proto_tree_add_item(tree, hf_msg_poolstatsreply_fsid,
5562
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5563
0
  off += 16;
5564
5565
0
  i = tvb_get_letohl(tvb, off);
5566
0
  off += 4;
5567
0
  while (i--)
5568
0
  {
5569
0
    ti2 = proto_tree_add_item(tree, hf_msg_poolstatsreply_stat,
5570
0
            tvb, off, -1, ENC_NA);
5571
0
    subtree = proto_item_add_subtree(ti2, ett_msg_poolstatsreply_stat);
5572
5573
0
    off = c_dissect_str(subtree, hf_msg_poolstatsreply_pool, &str, tvb, data->pinfo, off);
5574
0
    c_append_text(data, ti, "%s%s", str.str, i? ",":" ");
5575
0
    proto_item_append_text(ti2, ", For: %s", str.str);
5576
5577
    /*** pool_stat_t from ceph:/src/osd/osd_types.h ***/
5578
0
    off = c_dissect_encoded(subtree, &encstat, 5, 5, tvb, off, data);
5579
5580
0
    off = c_dissect_statcollection(subtree, hf_msg_poolstatsreply_pool, tvb, off, data);
5581
5582
0
    proto_tree_add_item(subtree, hf_msg_poolstatsreply_log_size,
5583
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5584
0
    off += 8;
5585
0
    proto_tree_add_item(subtree, hf_msg_poolstatsreply_log_size_ondisk,
5586
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5587
0
    off += 8;
5588
    /*** END pool_stat_t ***/
5589
0
    c_warn_size(subtree, tvb, off, encstat.end, data);
5590
0
    off = encstat.end;
5591
0
  }
5592
5593
0
  return off;
5594
0
}
5595
5596
/** Monitor Global ID 0x003C */
5597
static
5598
unsigned c_dissect_msg_mon_globalid(proto_tree *root,
5599
         tvbuff_t *tvb,
5600
         unsigned front_len _U_, unsigned middle_len _U_, unsigned data_len _U_,
5601
         c_pkt_data *data)
5602
0
{
5603
0
  unsigned off = 0;
5604
5605
  /* ceph:/src/messages/MMonGlobalID.h */
5606
5607
0
  c_set_type(data, "Mon Global ID");
5608
5609
0
  off = c_dissect_paxos(root, tvb, off, data);
5610
0
  proto_tree_add_item(root, hf_msg_mon_globalid_max,
5611
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5612
0
  off += 8;
5613
5614
0
  return off;
5615
0
}
5616
5617
/** Monitor Election 0x0041 */
5618
static
5619
unsigned c_dissect_msg_mon_election(proto_tree *root,
5620
         tvbuff_t *tvb,
5621
         unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5622
         c_pkt_data *data)
5623
0
{
5624
0
  proto_item *ti;
5625
0
  proto_tree *tree;
5626
0
  unsigned off = 0;
5627
0
  uint32_t i;
5628
0
  c_mon_election_type type;
5629
5630
  /* ceph:/src/messages/MMonElection.h */
5631
5632
0
  c_set_type(data, "Mon Election");
5633
5634
0
  ti = proto_tree_add_item(root, hf_msg_mon_election,
5635
0
          tvb, off, front_len, ENC_NA);
5636
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_election);
5637
5638
0
  proto_tree_add_item(tree, hf_msg_mon_election_fsid,
5639
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5640
0
  off += 16;
5641
5642
0
  type = (c_mon_election_type)tvb_get_letohl(tvb, off);
5643
0
  proto_tree_add_item(tree, hf_msg_mon_election_op,
5644
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5645
0
  off += 4;
5646
5647
0
  proto_tree_add_item(tree, hf_msg_mon_election_epoch,
5648
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5649
0
  off += 4;
5650
5651
0
  off = c_dissect_monmap(tree, tvb, off, data);
5652
5653
0
  i = tvb_get_letohl(tvb, off);
5654
0
  off += 4;
5655
0
  while (i--)
5656
0
  {
5657
0
    proto_tree_add_item(tree, hf_msg_mon_election_quorum,
5658
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5659
0
    off += 4;
5660
0
  }
5661
5662
0
  proto_tree_add_item(tree, hf_msg_mon_election_quorum_features,
5663
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5664
0
  off += 8;
5665
5666
0
  proto_tree_add_item(tree, hf_msg_mon_election_defunct_one,
5667
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5668
0
  off += 8;
5669
0
  proto_tree_add_item(tree, hf_msg_mon_election_defunct_two,
5670
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5671
0
  off += 8;
5672
5673
0
  off = c_dissect_blob(tree, hf_msg_mon_election_sharing,
5674
0
           hf_msg_mon_election_sharing_data, hf_msg_mon_election_sharing_size,
5675
0
           tvb, data->pinfo, off);
5676
5677
0
  c_append_text(data, ti, ", Operation: %s", c_mon_election_type_string(type, data->pinfo->pool));
5678
5679
0
  return off;
5680
0
}
5681
5682
/** Monitor Paxos 0x0042 */
5683
static
5684
unsigned c_dissect_msg_mon_paxos(proto_tree *root,
5685
            tvbuff_t *tvb,
5686
            unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5687
            c_pkt_data *data)
5688
0
{
5689
0
  proto_item *ti;
5690
0
  proto_tree *tree;
5691
0
  unsigned off = 0;
5692
0
  uint32_t i;
5693
0
  uint64_t pn;
5694
0
  c_mon_paxos_op op;
5695
5696
  /* ceph:/src/messages/MMonPaxos.h */
5697
5698
0
  c_set_type(data, "Mon Paxos");
5699
5700
0
  ti = proto_tree_add_item(root, hf_msg_mon_paxos, tvb, off, front_len, ENC_NA);
5701
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_paxos);
5702
5703
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_epoch,
5704
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5705
0
  off += 4;
5706
5707
0
  op = (c_mon_paxos_op)tvb_get_letohl(tvb, off);
5708
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_op,
5709
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5710
0
  off += 4;
5711
5712
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_first,
5713
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5714
0
  off += 8;
5715
5716
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_last,
5717
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5718
0
  off += 8;
5719
5720
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_pnfrom,
5721
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5722
0
  off += 8;
5723
5724
0
  pn = tvb_get_letoh64(tvb, off);
5725
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_pn,
5726
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5727
0
  off += 8;
5728
5729
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_pnuncommitted,
5730
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5731
0
  off += 8;
5732
5733
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_lease,
5734
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5735
0
  off += 8;
5736
5737
0
  if (data->header.ver >= 1)
5738
0
  {
5739
0
    proto_tree_add_item(tree, hf_msg_mon_paxos_sent,
5740
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5741
0
    off += 8;
5742
0
  }
5743
5744
0
  proto_tree_add_item(tree, hf_msg_mon_paxos_latest_ver,
5745
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5746
0
  off += 8;
5747
5748
0
  off = c_dissect_blob(tree, hf_msg_mon_paxos_latest_val,
5749
0
           hf_msg_mon_paxos_latest_val_data,
5750
0
           hf_msg_mon_paxos_latest_val_size,
5751
0
           tvb, data->pinfo, off);
5752
5753
0
  i = tvb_get_letohl(tvb, off);
5754
0
  off += 4;
5755
0
  while (i--)
5756
0
  {
5757
0
    proto_item *ti2;
5758
0
    proto_tree *subtree;
5759
0
    uint64_t ver;
5760
5761
0
    ti2 = proto_tree_add_item(tree, hf_msg_mon_paxos_value, tvb, off, -1, ENC_NA);
5762
0
    subtree = proto_item_add_subtree(ti2, ett_msg_mon_paxos_value);
5763
5764
0
    ver = tvb_get_letoh64(tvb, off);
5765
0
    proto_tree_add_item(subtree, hf_msg_mon_paxos_ver,
5766
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5767
0
    off += 8;
5768
5769
0
    off = c_dissect_blob(subtree, hf_msg_mon_paxos_val,
5770
0
             hf_msg_mon_paxos_val_data, hf_msg_mon_paxos_val_size,
5771
0
             tvb, data->pinfo, off);
5772
5773
0
    proto_item_append_text(ti2, ", Version: %"PRIu64, ver);
5774
0
    proto_item_set_end(ti2, tvb, off);
5775
0
  }
5776
5777
0
  c_append_text(data, ti, ", Op: %s, Proposal Number: %"PRIu64,
5778
0
          c_mon_paxos_op_string(op, data->pinfo->pool), pn);
5779
5780
0
  return off;
5781
0
}
5782
5783
/** Monitor Probe 0x0043 */
5784
static
5785
unsigned c_dissect_msg_mon_probe(proto_tree *root,
5786
           tvbuff_t *tvb,
5787
           unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5788
           c_pkt_data *data)
5789
0
{
5790
0
  proto_item *ti;
5791
0
  proto_tree *tree;
5792
0
  unsigned off = 0;
5793
0
  uint32_t i;
5794
0
  c_mon_probe_type type;
5795
0
  c_str name;
5796
5797
  /* ceph:/src/messages/MMonProbe.h */
5798
5799
0
  c_set_type(data, "Mon Probe");
5800
5801
0
  ti = proto_tree_add_item(root, hf_msg_mon_probe, tvb, off, front_len, ENC_NA);
5802
0
  tree = proto_item_add_subtree(ti, ett_msg_mon_probe);
5803
5804
0
  proto_tree_add_item(tree, hf_msg_mon_probe_fsid,
5805
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5806
0
  off += 16;
5807
5808
0
  type = (c_mon_probe_type)tvb_get_letohl(tvb, off);
5809
0
  proto_tree_add_item(tree, hf_msg_mon_probe_type,
5810
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5811
0
  off += 4;
5812
5813
0
  off = c_dissect_str(tree, hf_msg_mon_probe_name, &name, tvb, data->pinfo, off);
5814
5815
0
  i = tvb_get_letohl(tvb, off);
5816
0
  off += 4;
5817
0
  while (i--)
5818
0
  {
5819
0
    proto_tree_add_item(tree, hf_msg_mon_probe_quorum,
5820
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5821
0
    off += 4;
5822
0
  }
5823
5824
0
  off = c_dissect_monmap(tree, tvb, off, data);
5825
5826
0
  proto_tree_add_item(tree, hf_msg_mon_probe_ever_joined,
5827
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
5828
0
  off += 1;
5829
0
  proto_tree_add_item(tree, hf_msg_mon_probe_paxos_first_ver,
5830
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5831
0
  off += 8;
5832
0
  proto_tree_add_item(tree, hf_msg_mon_probe_paxos_last_ver,
5833
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
5834
0
  off += 8;
5835
5836
0
  if (data->header.ver >= 6)
5837
0
  {
5838
0
    proto_tree_add_item(tree, hf_msg_mon_probe_req_features,
5839
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5840
0
    off += 8;
5841
0
  }
5842
5843
0
  c_append_text(data, ti, ", Type: %s, Name: %s",
5844
0
          c_mon_probe_type_string(type, data->pinfo->pool),
5845
0
          name.str);
5846
5847
0
  return off;
5848
0
}
5849
5850
/** OSD Ping (0x0046) */
5851
static
5852
unsigned c_dissect_msg_osd_ping(proto_tree *root,
5853
           tvbuff_t *tvb,
5854
           unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5855
           c_pkt_data *data)
5856
0
{
5857
0
  proto_item *ti;
5858
0
  proto_tree *tree;
5859
0
  unsigned off = 0;
5860
0
  c_osd_ping_op op;
5861
5862
  /* ceph:/src/messages/MOSDPing.h */
5863
5864
0
  c_set_type(data, "OSD Ping");
5865
5866
0
  ti = proto_tree_add_item(root, hf_msg_osd_ping, tvb, off, front_len, ENC_NA);
5867
0
  tree = proto_item_add_subtree(ti, ett_msg_osd_ping);
5868
5869
0
  proto_tree_add_item(tree, hf_msg_osd_ping_fsid,
5870
0
          tvb, off, 16, ENC_BIG_ENDIAN);
5871
0
  off += 16;
5872
5873
0
  proto_tree_add_item(tree, hf_msg_osd_ping_mapepoch,
5874
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5875
0
  off += 4;
5876
5877
0
  proto_tree_add_item(tree, hf_msg_osd_ping_peerepoch,
5878
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5879
0
  off += 4;
5880
5881
0
  op = (c_osd_ping_op)tvb_get_uint8(tvb, off);
5882
0
  proto_tree_add_item(tree, hf_msg_osd_ping_op,
5883
0
          tvb, off, 1, ENC_LITTLE_ENDIAN);
5884
0
  off += 1;
5885
5886
0
  off = c_dissect_osd_peerstat(tree, tvb, off, data);
5887
5888
0
  if (data->header.ver >= 2)
5889
0
  {
5890
0
    proto_tree_add_item(tree, hf_msg_osd_ping_time,
5891
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
5892
0
    off += 8;
5893
0
  }
5894
5895
0
  c_append_text(data, ti, ", Operation: %s", c_osd_ping_op_string(op, data->pinfo->pool));
5896
0
  return off;
5897
0
}
5898
5899
/** OSD Boot (0x0047) */
5900
static
5901
unsigned c_dissect_msg_osd_boot(proto_tree *root,
5902
           tvbuff_t *tvb,
5903
           unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5904
           c_pkt_data *data)
5905
0
{
5906
0
  proto_item *ti;
5907
0
  proto_tree *tree;
5908
0
  unsigned off = 0;
5909
0
  uint32_t i;
5910
5911
  /* ceph:/src/messages/MOSDBoot.h */
5912
5913
0
  c_set_type(data, "OSD Boot");
5914
5915
0
  off = c_dissect_paxos(root, tvb, off, data);
5916
5917
0
  ti = proto_tree_add_item(root, hf_msg_osd_boot, tvb, off, front_len, ENC_NA);
5918
0
  tree = proto_item_add_subtree(ti, ett_msg_osd_boot);
5919
5920
0
  off = c_dissect_osd_superblock(tree, tvb, off, data);
5921
5922
0
  off = c_dissect_entityaddr(tree, hf_msg_osd_boot_addr_back, NULL, tvb, data->pinfo, off);
5923
5924
0
  if (data->header.ver >= 2)
5925
0
  {
5926
0
    off = c_dissect_entityaddr(tree, hf_msg_osd_boot_addr_cluster, NULL, tvb, data->pinfo, off);
5927
0
  }
5928
0
  if (data->header.ver >= 3)
5929
0
  {
5930
0
    proto_tree_add_item(tree, hf_msg_osd_boot_epoch,
5931
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
5932
0
    off += 4;
5933
0
  }
5934
0
  if (data->header.ver >= 4)
5935
0
  {
5936
0
    off = c_dissect_entityaddr(tree, hf_msg_osd_boot_addr_front, NULL, tvb, data->pinfo, off);
5937
0
  }
5938
0
  if (data->header.ver >= 5)
5939
0
  {
5940
0
    i = tvb_get_letohl(tvb, off);
5941
0
    off += 4;
5942
0
    while (i--)
5943
0
    {
5944
0
      off = c_dissect_kv(tree, hf_msg_osd_boot_metadata,
5945
0
             hf_msg_osd_boot_metadata_k, hf_msg_osd_boot_metadata_v,
5946
0
             tvb, data->pinfo, off);
5947
0
    }
5948
0
  }
5949
5950
0
  return off;
5951
0
}
5952
5953
/** PG Stats (0x0057) */
5954
static
5955
unsigned c_dissect_msg_pgstats(proto_tree *root,
5956
          tvbuff_t *tvb,
5957
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
5958
          c_pkt_data *data)
5959
0
{
5960
0
  proto_item *ti;
5961
0
  proto_tree *tree;
5962
0
  unsigned off = 0;
5963
0
  uint32_t i;
5964
5965
  /* ceph:/src/messages/MPGStats.h */
5966
5967
0
  c_set_type(data, "PG Stats");
5968
5969
0
  off = c_dissect_paxos(root, tvb, off, data);
5970
5971
0
  ti = proto_tree_add_item(root, hf_msg_pgstats, tvb, off, front_len, ENC_NA);
5972
0
  tree = proto_item_add_subtree(ti, ett_msg_pgstats);
5973
5974
0
  proto_tree_add_item(tree, hf_msg_pgstats_fsid,
5975
0
          tvb, off, 16, ENC_LITTLE_ENDIAN);
5976
0
  off += 16;
5977
5978
0
  off = c_dissect_osd_stat(tree, tvb, off, data);
5979
5980
0
  i = tvb_get_letohl(tvb, off);
5981
0
  off += 4;
5982
0
  while (i--)
5983
0
  {
5984
0
    proto_item *ti2;
5985
0
    proto_tree *subtree;
5986
5987
0
    ti2 = proto_tree_add_item(tree, hf_msg_pgstats_pgstat, tvb, off, -1, ENC_NA);
5988
0
    subtree = proto_item_add_subtree(ti2, ett_msg_pgstats_pgstat);
5989
5990
0
    off = c_dissect_pg(subtree, hf_msg_pgstats_pgstat_pg, tvb, off, data);
5991
0
    off = c_dissect_pg_stats(subtree, hf_msg_pgstats_pgstat_stat, tvb, off, data);
5992
5993
0
    proto_item_set_end(ti2, tvb, off);
5994
0
  }
5995
5996
0
  proto_tree_add_item(tree, hf_msg_pgstats_epoch,
5997
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
5998
0
  off += 4;
5999
6000
0
  proto_tree_add_item(tree, hf_msg_pgstats_mapfor,
6001
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6002
0
  off += 8;
6003
6004
0
  return off;
6005
0
}
6006
6007
/** OSD PG Create (0x0059) */
6008
static
6009
unsigned c_dissect_msg_osd_pg_create(proto_tree *root,
6010
          tvbuff_t *tvb,
6011
          unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
6012
          c_pkt_data *data)
6013
0
{
6014
0
  proto_item *ti;
6015
0
  proto_tree *tree;
6016
0
  unsigned off = 0;
6017
0
  uint32_t i;
6018
6019
  /* ceph:/src/messages/MOSDPGCreate.h */
6020
6021
0
  c_set_type(data, "OSD PG Create");
6022
6023
0
  ti = proto_tree_add_item(root, hf_msg_osd_pg_create, tvb, off, front_len, ENC_NA);
6024
0
  tree = proto_item_add_subtree(ti, ett_msg_osd_pg_create);
6025
6026
0
  proto_tree_add_item(tree, hf_msg_osd_pg_create_epoch,
6027
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6028
0
  off += 8;
6029
6030
0
  i = tvb_get_letohl(tvb, off);
6031
0
  off += 4;
6032
0
  while (i--)
6033
0
  {
6034
0
    proto_item *ti2;
6035
0
    proto_tree *subtree;
6036
6037
0
    ti2 = proto_tree_add_item(tree, hf_msg_osd_pg_create_mkpg,
6038
0
            tvb, off, -1, ENC_NA);
6039
0
    subtree = proto_item_add_subtree(ti2, ett_msg_osd_pg_create_mkpg);
6040
6041
0
    off = c_dissect_pg(subtree, hf_msg_osd_pg_create_mkpg_pg, tvb, off, data);
6042
0
    off = c_dissect_pg_create(subtree, hf_msg_osd_pg_create_mkpg_create, tvb, off, data);
6043
6044
0
    proto_item_set_end(ti2, tvb, off);
6045
0
  }
6046
6047
0
  return off;
6048
0
}
6049
6050
/** Client Caps 0x0310 */
6051
static
6052
unsigned c_dissect_msg_client_caps(proto_tree *root,
6053
        tvbuff_t *tvb,
6054
        unsigned front_len, unsigned middle_len, unsigned data_len _U_,
6055
        c_pkt_data *data)
6056
0
{
6057
0
  proto_item *ti;
6058
0
  proto_tree *tree;
6059
0
  unsigned off = 0;
6060
0
  c_cap_op_type op;
6061
0
  uint64_t inode, relam;
6062
0
  uint32_t snap_trace_len, xattr_len;
6063
6064
  /* ceph:/src/messages/MClientCaps.h */
6065
6066
0
  c_set_type(data, "Client Capabilities");
6067
6068
0
  ti = proto_tree_add_item(root, hf_msg_client_caps, tvb, off, front_len, ENC_NA);
6069
0
  tree = proto_item_add_subtree(ti, ett_msg_client_caps);
6070
6071
0
  op = (c_cap_op_type)tvb_get_letohl(tvb, off);
6072
0
  proto_tree_add_item(tree, hf_msg_client_caps_op,
6073
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6074
0
  off += 4;
6075
6076
0
  inode = tvb_get_letoh64(tvb, off);
6077
0
  proto_tree_add_item(tree, hf_msg_client_caps_inode,
6078
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6079
0
  off += 8;
6080
6081
0
  relam = tvb_get_letoh64(tvb, off);
6082
0
  proto_tree_add_item(tree, hf_msg_client_caps_relam,
6083
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6084
0
  off += 8;
6085
6086
0
  proto_tree_add_item(tree, hf_msg_client_caps_cap_id,
6087
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6088
0
  off += 8;
6089
6090
0
  proto_tree_add_item(tree, hf_msg_client_caps_seq,
6091
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6092
0
  off += 4;
6093
6094
0
  proto_tree_add_item(tree, hf_msg_client_caps_seq_issue,
6095
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6096
0
  off += 4;
6097
6098
0
  proto_tree_add_item(tree, hf_msg_client_caps_new,
6099
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6100
0
  off += 4;
6101
6102
0
  proto_tree_add_item(tree, hf_msg_client_caps_wanted,
6103
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6104
0
  off += 4;
6105
6106
0
  proto_tree_add_item(tree, hf_msg_client_caps_dirty,
6107
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6108
0
  off += 4;
6109
6110
0
  proto_tree_add_item(tree, hf_msg_client_caps_seq_migrate,
6111
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6112
0
  off += 4;
6113
6114
0
  proto_tree_add_item(tree, hf_msg_client_caps_snap_follows,
6115
0
          tvb, off, 8, ENC_BIG_ENDIAN);
6116
0
  off += 8;
6117
6118
0
  snap_trace_len = tvb_get_letohl(tvb, off);
6119
0
  off += 4;
6120
6121
0
  proto_tree_add_item(tree, hf_msg_client_caps_uid,
6122
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6123
0
  off += 4;
6124
6125
0
  proto_tree_add_item(tree, hf_msg_client_caps_gid,
6126
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6127
0
  off += 4;
6128
6129
0
  proto_tree_add_item(tree, hf_msg_client_caps_mode,
6130
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6131
0
  off += 4;
6132
6133
0
  proto_tree_add_item(tree, hf_msg_client_caps_nlink,
6134
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6135
0
  off += 4;
6136
6137
0
  xattr_len = tvb_get_letohl(tvb, off);
6138
0
  off += 4;
6139
6140
0
  proto_tree_add_item(tree, hf_msg_client_caps_xattr_ver,
6141
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6142
0
  off += 8;
6143
6144
0
  off += 84; /* @TODO: Union. */
6145
6146
0
  proto_tree_add_item(tree, hf_msg_client_caps_snap,
6147
0
          tvb, off, snap_trace_len, ENC_NA);
6148
0
  off += snap_trace_len;
6149
6150
0
  if (data->header.ver >= 2)
6151
0
  {
6152
0
    off = c_dissect_data(tree, hf_msg_client_caps_flock, tvb, data->pinfo, off);
6153
0
  }
6154
6155
0
  if (data->header.ver >= 3 && op == C_CAP_OP_IMPORT)
6156
0
  {
6157
    /* ceph:/src/include/ceph_fs.h
6158
    struct ceph_mds_cap_peer {
6159
      __le64 cap_id;
6160
      __le32 seq;
6161
      __le32 mseq;
6162
      __le32 mds;
6163
      __u8   flags;
6164
    } __attribute__ ((packed));
6165
    */
6166
    /* @TODO: Parse this. */
6167
0
    off += 21;
6168
0
  }
6169
6170
0
  if (data->header.ver >= 4)
6171
0
  {
6172
0
    proto_tree_add_item(tree, hf_msg_client_caps_inline_ver,
6173
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6174
0
    off += 8;
6175
0
    off = c_dissect_data(tree, hf_msg_client_caps_inline_data, tvb, data->pinfo, off);
6176
0
  }
6177
6178
0
  c_warn_size(tree, tvb, off, front_len, data);
6179
0
  c_warn_size(tree, tvb, front_len+xattr_len, front_len+middle_len, data);
6180
6181
0
  proto_tree_add_item(tree, hf_msg_client_caps_xattr,
6182
0
          tvb, front_len, middle_len, ENC_NA);
6183
6184
0
  proto_item_append_text(ti, ", Op: %s"
6185
0
             ", Inode: 0x%016"PRIX64
6186
0
             ", Relam: 0x%"PRIX64,
6187
0
             c_cap_op_type_string(op, data->pinfo->pool),
6188
0
             inode, relam);
6189
6190
0
  return front_len+middle_len;
6191
0
}
6192
6193
/** Client Cap Release 0x0310 */
6194
static
6195
unsigned c_dissect_msg_client_caprel(proto_tree *root,
6196
          tvbuff_t *tvb,
6197
          unsigned front_len, unsigned middle_len, unsigned data_len _U_,
6198
          c_pkt_data *data)
6199
0
{
6200
0
  proto_item *ti;
6201
0
  proto_tree *tree, *subtree;
6202
0
  unsigned off = 0;
6203
0
  uint32_t i;
6204
6205
  /* ceph:/src/messages/MClientCapRelease.h */
6206
6207
0
  c_set_type(data, "Client Cap Release");
6208
6209
0
  ti = proto_tree_add_item(root, hf_msg_client_caprel, tvb, off, front_len, ENC_NA);
6210
0
  tree = proto_item_add_subtree(ti, ett_msg_client_caprel);
6211
6212
0
  i = (c_cap_op_type)tvb_get_letohl(tvb, off);
6213
0
  proto_item_append_text(ti, ", Caps: %"PRIu32, i);
6214
0
  off += 4;
6215
0
  while (i--)
6216
0
  {
6217
0
    ti = proto_tree_add_item(tree, hf_msg_client_caprel_cap, tvb, off, -1, ENC_NA);
6218
0
    subtree = proto_item_add_subtree(ti, ett_msg_client_caprel_cap);
6219
6220
0
    proto_tree_add_item(subtree, hf_msg_client_caprel_cap_inode,
6221
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6222
0
    off += 8;
6223
6224
0
    proto_tree_add_item(subtree, hf_msg_client_caprel_cap_id,
6225
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6226
0
    off += 8;
6227
6228
0
    proto_tree_add_item(subtree, hf_msg_client_caprel_cap_migrate,
6229
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
6230
0
    off += 4;
6231
6232
0
    proto_tree_add_item(subtree, hf_msg_client_caprel_cap_seq,
6233
0
            tvb, off, 4, ENC_LITTLE_ENDIAN);
6234
0
    off += 4;
6235
6236
0
    proto_item_set_end(ti, tvb, off);
6237
0
  }
6238
6239
0
  return front_len+middle_len;
6240
0
}
6241
6242
/** Time Check 0x0600 */
6243
static
6244
unsigned c_dissect_msg_timecheck(proto_tree *root,
6245
            tvbuff_t *tvb,
6246
            unsigned front_len, unsigned middle_len _U_, unsigned data_len _U_,
6247
            c_pkt_data *data)
6248
0
{
6249
0
  proto_item *ti;
6250
0
  proto_tree *tree;
6251
0
  unsigned off = 0;
6252
0
  uint32_t i;
6253
0
  c_timecheck_op op;
6254
0
  uint64_t epoch, round;
6255
6256
  /* ceph:/src/messages/MTimeCheck.h */
6257
6258
0
  c_set_type(data, "Time Check");
6259
6260
0
  ti = proto_tree_add_item(root, hf_msg_timecheck, tvb, off, front_len, ENC_NA);
6261
0
  tree = proto_item_add_subtree(ti, ett_msg_timecheck);
6262
6263
0
  op = (c_timecheck_op)tvb_get_letohl(tvb, off);
6264
0
  proto_tree_add_item(tree, hf_msg_timecheck_op,
6265
0
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6266
0
  off += 4;
6267
6268
0
  epoch = tvb_get_letoh64(tvb, off);
6269
0
  proto_tree_add_item(tree, hf_msg_timecheck_epoch,
6270
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6271
0
  off += 8;
6272
6273
0
  round = tvb_get_letoh64(tvb, off);
6274
0
  proto_tree_add_item(tree, hf_msg_timecheck_round,
6275
0
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6276
0
  off += 8;
6277
6278
0
  c_append_text(data, ti, ", Operation: %s, Epoch: %"PRIu64
6279
0
          ", Round: %"PRIu64,
6280
0
          c_timecheck_op_string(op, data->pinfo->pool),
6281
0
          epoch, round);
6282
6283
0
  if (op == C_TIMECHECK_OP_PONG)
6284
0
  {
6285
0
    c_append_text(data, ti, ", Time: %s", c_format_timespec(tvb, data->pinfo, off));
6286
0
    proto_tree_add_item(tree, hf_msg_timecheck_time,
6287
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6288
0
  }
6289
0
  off += 8; /* Still in the message, but zeroed and meaningless. */
6290
6291
0
  i = tvb_get_letohl(tvb, off);
6292
0
  off += 4;
6293
0
  while (i--)
6294
0
  {
6295
0
    proto_item *ti2;
6296
0
    proto_tree *subtree;
6297
0
    c_entityinst inst;
6298
0
    double skew;
6299
6300
0
    ti2 = proto_tree_add_item(tree, hf_msg_timecheck_skew, tvb, off, -1, ENC_NA);
6301
0
    subtree = proto_item_add_subtree(ti2, ett_msg_timecheck_skew);
6302
6303
0
    off = c_dissect_entityinst(subtree, hf_msg_timecheck_skew_node, &inst,
6304
0
             tvb, off, data);
6305
6306
0
    skew = tvb_get_letohieee_double(tvb, off);
6307
0
    proto_tree_add_item(subtree, hf_msg_timecheck_skew_skew,
6308
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6309
0
    off += 8;
6310
6311
0
    proto_item_append_text(ti2, ", Node: %s, Skew: %lf", inst.name.slug, skew);
6312
0
    proto_item_set_end(ti2, tvb, off);
6313
0
  }
6314
6315
0
  i = tvb_get_letohl(tvb, off);
6316
0
  off += 4;
6317
0
  while (i--)
6318
0
  {
6319
0
    proto_item *ti2;
6320
0
    proto_tree *subtree;
6321
0
    c_entityinst inst;
6322
0
    double ping;
6323
6324
0
    ti2 = proto_tree_add_item(tree, hf_msg_timecheck_latency, tvb, off, -1, ENC_NA);
6325
0
    subtree = proto_item_add_subtree(ti2, ett_msg_timecheck_latency);
6326
6327
0
    off = c_dissect_entityinst(subtree, hf_msg_timecheck_latency_node, &inst,
6328
0
             tvb, off, data);
6329
6330
0
    ping = tvb_get_letohieee_double(tvb, off);
6331
0
    proto_tree_add_item(subtree, hf_msg_timecheck_latency_latency,
6332
0
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6333
0
    off += 8;
6334
6335
0
    proto_item_append_text(ti2, ", Node: %s, Latency: %lf", inst.name.slug, ping);
6336
0
    proto_item_set_end(ti2, tvb, off);
6337
0
  }
6338
6339
0
  return off;
6340
0
}
6341
6342
/*** MSGR Dissectors ***/
6343
6344
#define C_OFF_HEAD0  0
6345
183
#define C_SIZE_HEAD0 ((64+64+16+16+16)/8)
6346
6347
183
#define C_OFF_HEAD1  C_SIZE_HEAD0
6348
63
#define C_SIZE_HEAD1 ((32+32+32+16)/8)
6349
6350
40
#define C_OFF_HEAD2  (C_OFF_HEAD1 + C_SIZE_HEAD1 + C_SIZE_ENTITY_NAME)
6351
40
#define C_SIZE_HEAD2 ((16+16+32)/8)
6352
6353
40
#define C_SIZE_HEAD  (C_OFF_HEAD2 + C_SIZE_HEAD2)
6354
6355
37
#define C_SIZE_FOOT  ((32+32+32+64+8)/8)
6356
6357
/** Dissect a MSG message.
6358
 *
6359
 * These are Ceph's business messages and are generally sent to specific
6360
 * node types.
6361
 */
6362
static
6363
unsigned c_dissect_msg(proto_tree *tree,
6364
        tvbuff_t *tvb, unsigned off, c_pkt_data *data)
6365
18
{
6366
18
  tvbuff_t *subtvb;
6367
18
  proto_item *ti;
6368
18
  proto_tree *subtree;
6369
18
  c_msg_type type;
6370
18
  uint32_t front_len, middle_len, data_len;
6371
18
  unsigned size, parsedsize;
6372
6373
18
  front_len  = tvb_get_letohl(tvb, off + C_OFF_HEAD1 + 0);
6374
18
  middle_len = tvb_get_letohl(tvb, off + C_OFF_HEAD1 + 4);
6375
18
  data_len   = tvb_get_letohl(tvb, off + C_OFF_HEAD1 + 8);
6376
6377
  /*** Header ***/
6378
6379
  /* From ceph:/src/include/msgr.h
6380
  struct ceph_msg_header {
6381
    __le64 seq;   // message seq# for this session
6382
    __le64 tid;   // transaction id
6383
    __le16 type;    // message type
6384
    __le16 priority;  // priority.  higher value == higher priority
6385
    __le16 version;   // version of message encoding
6386
6387
    __le32 front_len; // bytes in main payload
6388
    __le32 middle_len;// bytes in middle payload
6389
    __le32 data_len;  // bytes of data payload
6390
    __le16 data_off;  // sender: include full offset; receiver: mask against ~PAGE_MASK
6391
6392
    struct ceph_entity_name src;
6393
6394
    // oldest code we think can decode this.  unknown if zero.
6395
    __le16 compat_version;
6396
    __le16 reserved;
6397
    __le32 crc; // header crc32c
6398
  } __attribute__ ((packed));
6399
  */
6400
6401
18
  ti = proto_tree_add_item(tree, hf_head, tvb, off, C_SIZE_HEAD, ENC_NA);
6402
18
  subtree = proto_item_add_subtree(ti, ett_head);
6403
6404
18
  data->header.seq = tvb_get_letoh64(tvb, off);
6405
18
  proto_tree_add_item(subtree, hf_head_seq,
6406
18
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6407
18
  off += 8;
6408
18
  data->header.tid = tvb_get_letoh64(tvb, off);
6409
18
  proto_tree_add_item(subtree, hf_head_tid,
6410
18
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6411
18
  off += 8;
6412
6413
18
  data->header.type = type = (c_msg_type)tvb_get_letohs(tvb, off);
6414
18
  proto_tree_add_item(subtree, hf_head_type,
6415
18
          tvb, off, 2, ENC_LITTLE_ENDIAN);
6416
18
  off += 2;
6417
6418
18
  data->header.priority = tvb_get_letohs(tvb, off);
6419
18
  proto_tree_add_item(subtree, hf_head_priority,
6420
18
          tvb, off, 2, ENC_LITTLE_ENDIAN);
6421
18
  off += 2;
6422
18
  data->header.ver = tvb_get_letohs(tvb, off);
6423
18
  proto_tree_add_item(subtree, hf_head_version,
6424
18
          tvb, off, 2, ENC_LITTLE_ENDIAN);
6425
18
  off += 2;
6426
6427
18
  proto_tree_add_item(subtree, hf_head_front_size,
6428
18
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6429
18
  off += 4;
6430
18
  proto_tree_add_item(subtree, hf_head_middle_size,
6431
18
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6432
18
  off += 4;
6433
18
  proto_tree_add_item(subtree, hf_head_data_size,
6434
18
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6435
18
  off += 4;
6436
18
  proto_tree_add_item(subtree, hf_head_data_off,
6437
18
          tvb, off, 2, ENC_LITTLE_ENDIAN);
6438
18
  off += 2;
6439
6440
18
  off = c_dissect_entityname(subtree, hf_head_srcname, &data->header.src,
6441
18
           tvb, off, data);
6442
6443
  /*** Copy the data to the state structure. ***/
6444
6445
  /* Save memory by copying only if different, they are *usually* the same. */
6446
18
  if (!data->src->name.slug ||
6447
7
      strcmp(data->src->name.slug, data->header.src.slug) != 0)
6448
18
    data->src->name.slug = wmem_strdup(wmem_file_scope(),
6449
18
               data->header.src.slug);
6450
18
  if (!data->src->name.type_str ||
6451
7
      strcmp(data->src->name.type_str, data->header.src.type_str) != 0)
6452
18
    data->src->name.type_str = wmem_strdup(wmem_file_scope(),
6453
18
                   data->header.src.type_str);
6454
6455
18
  data->src->name.type = data->header.src.type;
6456
18
  data->src->name.id   = data->header.src.id;
6457
6458
18
  proto_tree_add_item(subtree, hf_head_compat_version,
6459
18
          tvb, off, 2, ENC_LITTLE_ENDIAN);
6460
18
  off += 2;
6461
18
  proto_tree_add_item(subtree, hf_head_reserved,
6462
18
          tvb, off, 2, ENC_LITTLE_ENDIAN);
6463
18
  off += 2;
6464
18
  proto_tree_add_item(subtree, hf_head_crc,
6465
18
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6466
18
  off += 4;
6467
6468
18
  proto_item_append_text(ti, ", Type: %s, From: %s",
6469
18
             c_msg_type_string(type, data->pinfo->pool),
6470
18
             data->header.src.slug);
6471
18
  if (front_len ) proto_item_append_text(ti, ", Front Len: %d", front_len);
6472
18
  if (middle_len) proto_item_append_text(ti, ", Mid Len: %d",   middle_len);
6473
18
  if (data_len  ) proto_item_append_text(ti, ", Data Len: %d",  data_len);
6474
6475
  /*** Body ***/
6476
6477
18
  subtvb = tvb_new_subset_length(tvb, off, front_len+middle_len+data_len);
6478
6479
18
  switch (type)
6480
18
  {
6481
18
#define C_CALL(name) name(tree, subtvb, front_len, middle_len, data_len, data)
6482
1
#define C_HANDLE(tag, name) case tag: parsedsize = C_CALL(name); break;
6483
6484
0
  C_HANDLE(C_CEPH_MSG_PING,       c_dissect_msg_ping)
6485
1
  C_HANDLE(C_CEPH_MSG_MON_MAP,        c_dissect_msg_mon_map)
6486
0
  C_HANDLE(C_CEPH_MSG_STATFS,       c_dissect_msg_statfs)
6487
0
  C_HANDLE(C_CEPH_MSG_STATFS_REPLY,     c_dissect_msg_statfsreply)
6488
0
  C_HANDLE(C_CEPH_MSG_MON_SUBSCRIBE,      c_dissect_msg_mon_sub)
6489
0
  C_HANDLE(C_CEPH_MSG_MON_SUBSCRIBE_ACK,      c_dissect_msg_mon_sub_ack)
6490
0
  C_HANDLE(C_CEPH_MSG_AUTH,       c_dissect_msg_auth)
6491
0
  C_HANDLE(C_CEPH_MSG_AUTH_REPLY,       c_dissect_msg_auth_reply)
6492
0
  C_HANDLE(C_CEPH_MSG_MON_GET_VERSION,      c_dissect_msg_mon_getversion)
6493
0
  C_HANDLE(C_CEPH_MSG_MON_GET_VERSION_REPLY,  c_dissect_msg_mon_getversionreply)
6494
0
  C_HANDLE(C_CEPH_MSG_MDS_MAP,        c_dissect_msg_mds_map)
6495
0
  C_HANDLE(C_CEPH_MSG_CLIENT_SESSION,     c_dissect_msg_client_sess)
6496
0
  C_HANDLE(C_CEPH_MSG_CLIENT_REQUEST,     c_dissect_msg_client_req)
6497
0
  C_HANDLE(C_CEPH_MSG_CLIENT_REQUEST_FORWARD, c_dissect_msg_client_reqfwd)
6498
0
  C_HANDLE(C_CEPH_MSG_CLIENT_REPLY,     c_dissect_msg_client_reply)
6499
0
  C_HANDLE(C_CEPH_MSG_OSD_MAP,        c_dissect_msg_osd_map)
6500
0
  C_HANDLE(C_CEPH_MSG_OSD_OP,       c_dissect_msg_osd_op)
6501
0
  C_HANDLE(C_CEPH_MSG_OSD_OPREPLY,      c_dissect_msg_osd_opreply)
6502
0
  C_HANDLE(C_MSG_POOLOPREPLY,       c_dissect_msg_poolopreply)
6503
0
  C_HANDLE(C_MSG_POOLOP,          c_dissect_msg_poolop)
6504
0
  C_HANDLE(C_MSG_MON_COMMAND,       c_dissect_msg_mon_cmd)
6505
0
  C_HANDLE(C_MSG_MON_COMMAND_ACK,       c_dissect_msg_mon_cmd_ack)
6506
0
  C_HANDLE(C_MSG_GETPOOLSTATS,        c_dissect_msg_poolstats)
6507
0
  C_HANDLE(C_MSG_GETPOOLSTATSREPLY,     c_dissect_msg_poolstatsreply)
6508
0
  C_HANDLE(C_MSG_MON_GLOBAL_ID,       c_dissect_msg_mon_globalid)
6509
0
  C_HANDLE(C_MSG_MON_ELECTION,        c_dissect_msg_mon_election)
6510
0
  C_HANDLE(C_MSG_MON_PAXOS,       c_dissect_msg_mon_paxos)
6511
0
  C_HANDLE(C_MSG_MON_PROBE,       c_dissect_msg_mon_probe)
6512
0
  C_HANDLE(C_MSG_OSD_PING,        c_dissect_msg_osd_ping)
6513
0
  C_HANDLE(C_MSG_OSD_BOOT,        c_dissect_msg_osd_boot)
6514
0
  C_HANDLE(C_MSG_PGSTATS,         c_dissect_msg_pgstats)
6515
0
  C_HANDLE(C_MSG_OSD_PG_CREATE,       c_dissect_msg_osd_pg_create)
6516
0
  C_HANDLE(C_CEPH_MSG_CLIENT_CAPS,      c_dissect_msg_client_caps)
6517
0
  C_HANDLE(C_CEPH_MSG_CLIENT_CAPRELEASE,      c_dissect_msg_client_caprel)
6518
0
  C_HANDLE(C_MSG_TIMECHECK,       c_dissect_msg_timecheck)
6519
6520
17
  default:
6521
17
    parsedsize = C_CALL(c_dissect_msg_unknown);
6522
18
#undef C_CALL
6523
18
#undef C_HANDLE
6524
18
  }
6525
6526
15
  size = front_len + middle_len + data_len;
6527
6528
  /* Did the message dissector use all the data? */
6529
15
  c_warn_size(tree, tvb, off+parsedsize, off+size, data);
6530
6531
15
  off += size;
6532
6533
  /*** Footer ***/
6534
6535
  /* From ceph:/src/include/msgr.h
6536
  struct ceph_msg_footer {
6537
    __le32 front_crc, middle_crc, data_crc;
6538
    // sig holds the 64 bits of the digital signature for the message PLR
6539
    __le64  sig;
6540
    __u8 flags;
6541
  } __attribute__ ((packed));
6542
  */
6543
6544
15
  ti = proto_tree_add_item(tree, hf_foot, tvb, off, C_SIZE_FOOT, ENC_NA);
6545
15
  subtree = proto_item_add_subtree(ti, ett_foot);
6546
6547
15
  proto_tree_add_item(subtree, hf_foot_front_crc,
6548
15
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6549
15
  off += 4;
6550
15
  proto_tree_add_item(subtree, hf_foot_middle_crc,
6551
15
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6552
15
  off += 4;
6553
15
  proto_tree_add_item(subtree, hf_foot_data_crc,
6554
15
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6555
15
  off += 4;
6556
6557
15
  proto_tree_add_item(subtree, hf_foot_signature,
6558
15
          tvb, off, 8, ENC_LITTLE_ENDIAN);
6559
15
  off += 8;
6560
15
  off = c_dissect_flags(subtree, tvb, off, data);
6561
6562
15
  return off;
6563
18
}
6564
6565
169
#define C_SIZE_CONNECT          33
6566
304
#define C_SIZE_CONNECT_REPLY    25
6567
493
#define C_CONNECT_REPLY_OFF_OFFLEN 20
6568
11
#define C_SIZE_HELLO_S          (2*C_SIZE_ENTITY_ADDR)
6569
95
#define C_SIZE_HELLO_C          (C_SIZE_ENTITY_ADDR + C_SIZE_CONNECT)
6570
197
#define C_HELLO_OFF_AUTHLEN     (C_SIZE_ENTITY_ADDR + 28)
6571
6572
/** Dissect a connection request. */
6573
static
6574
unsigned c_dissect_connect(proto_tree *root,
6575
      tvbuff_t *tvb, unsigned off, c_pkt_data *data)
6576
74
{
6577
  /* From ceph:/src/include/msgr.h
6578
  struct ceph_msg_connect {
6579
    __le64 features;
6580
    __le32 host_type;
6581
    __le32 global_seq;
6582
    __le32 connect_seq;
6583
    __le32 protocol_version;
6584
    __le32 authorizer_protocol;
6585
    __le32 authorizer_len;
6586
    __u8  flags;
6587
  } __attribute__(packed);
6588
  */
6589
6590
74
  proto_item *ti;
6591
74
  proto_tree *tree;
6592
74
  uint32_t authsize;
6593
6594
74
  authsize = tvb_get_letohl(tvb, off+28);
6595
6596
74
  ti = proto_tree_add_item(root, hf_connect, tvb, off, C_SIZE_CONNECT, ENC_NA);
6597
74
  tree = proto_item_add_subtree(ti, ett_connect);
6598
6599
74
  off = c_dissect_features(tree, tvb, off, data);
6600
6601
74
  proto_tree_add_item(tree, hf_connect_host_type,
6602
74
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6603
74
  off += 4;
6604
74
  proto_tree_add_item(tree, hf_connect_seq_global,
6605
74
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6606
74
  off += 4;
6607
74
  proto_tree_add_item(tree, hf_connect_seq,
6608
74
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6609
74
  off += 4;
6610
74
  proto_tree_add_item(tree, hf_connect_proto_ver,
6611
74
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6612
74
  off += 4;
6613
74
  proto_tree_add_item(tree, hf_connect_auth_proto,
6614
74
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6615
74
  off += 4;
6616
74
  proto_tree_add_item(tree, hf_connect_auth_size,
6617
74
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6618
74
  off += 4;
6619
6620
74
  off = c_dissect_flags(tree, tvb, off, data);
6621
6622
  /* @TODO: Parse auth. */
6623
74
  proto_tree_add_item(tree, hf_connect_auth,
6624
74
          tvb, off, authsize, ENC_NA);
6625
74
  off += authsize;
6626
6627
74
  return off;
6628
74
}
6629
6630
/** Dissect a connection reply. */
6631
static
6632
unsigned c_dissect_connect_reply(proto_tree *root,
6633
            tvbuff_t *tvb, unsigned off, c_pkt_data *data)
6634
131
{
6635
  /* From ceph:/src/include/msgr.h
6636
  struct ceph_msg_connect_reply {
6637
    __u8 tag; // Handled outside.
6638
    __le64 features;
6639
    __le32 global_seq;
6640
    __le32 connect_seq;
6641
    __le32 protocol_version;
6642
    __le32 authorizer_len;
6643
    __u8 flags;
6644
  } __attribute__ ((packed));
6645
  */
6646
6647
131
  proto_item *ti;
6648
131
  proto_tree *tree;
6649
131
  uint32_t authsize;
6650
6651
131
  authsize = tvb_get_letohl(tvb, off+C_CONNECT_REPLY_OFF_OFFLEN);
6652
6653
131
  c_set_type(data, "Connect Reply");
6654
6655
131
  ti = proto_tree_add_item(root, hf_connect_reply,
6656
131
         tvb, off, C_SIZE_CONNECT_REPLY, ENC_NA);
6657
131
  tree = proto_item_add_subtree(ti, ett_connect_reply);
6658
6659
131
  off = c_dissect_features(tree, tvb, off, data);
6660
6661
131
  proto_tree_add_item(tree, hf_connect_seq_global,
6662
131
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6663
131
  off += 4;
6664
131
  proto_tree_add_item(tree, hf_connect_seq,
6665
131
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6666
131
  off += 4;
6667
131
  proto_tree_add_item(tree, hf_connect_proto_ver,
6668
131
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6669
131
  off += 4;
6670
131
  proto_tree_add_item(tree, hf_connect_auth_size,
6671
131
          tvb, off, 4, ENC_LITTLE_ENDIAN);
6672
131
  off += 4;
6673
6674
131
  off = c_dissect_flags(tree, tvb, off, data);
6675
6676
  /* @TODO: Parse auth. */
6677
131
  proto_tree_add_item(tree, hf_connect_auth,
6678
131
          tvb, off, authsize, ENC_NA);
6679
131
  off += authsize;
6680
6681
131
  return off;
6682
131
}
6683
6684
/** Do the connection initiation dance.
6685
 *
6686
 * This handles the data that is sent before the protocol is actually started.
6687
 */
6688
static
6689
unsigned c_dissect_new(proto_tree *tree,
6690
        tvbuff_t *tvb, unsigned off, c_pkt_data *data)
6691
89
{
6692
89
  int bansize;
6693
6694
  /*
6695
    Since the packet is larger than the max banner length we can read it
6696
    all in safely.
6697
  */
6698
89
  G_STATIC_ASSERT(C_BANNER_SIZE+1 <= C_BANNER_SIZE_MIN+C_SIZE_HELLO_C);
6699
89
  G_STATIC_ASSERT(C_BANNER_SIZE+1 <= C_BANNER_SIZE_MIN+C_SIZE_HELLO_S);
6700
6701
89
  if (tvb_memeql(tvb, off, C_BANNER, C_BANNER_SIZE_MIN) != 0)
6702
3
    return C_INVALID;
6703
6704
86
  bansize = tvb_strnlen(tvb, off, C_BANNER_SIZE+1);
6705
86
  if (bansize != C_BANNER_SIZE) /* Note -1 != C_BANNER_SIZE */
6706
3
    return C_INVALID;
6707
6708
83
  proto_tree_add_item(tree, hf_banner, tvb, off, bansize, ENC_ASCII);
6709
83
  off += bansize;
6710
6711
83
  c_set_type(data, "Connect");
6712
6713
83
  if (c_from_server(data))
6714
9
    off = c_dissect_entityaddr(tree, hf_server_info, NULL, tvb, data->pinfo, off);
6715
6716
83
  off = c_dissect_entityaddr(tree, hf_client_info, NULL, tvb, data->pinfo, off);
6717
6718
83
  if (c_from_client(data))
6719
74
    off = c_dissect_connect(tree, tvb, off, data);
6720
6721
83
  data->src->state = C_STATE_OPEN;
6722
6723
83
  return off;
6724
86
}
6725
6726
static
6727
bool c_unknowntagnext(tvbuff_t *tvb, unsigned off)
6728
19.2k
{
6729
19.2k
  if (!tvb_bytes_exist(tvb, off, 1)) return false;
6730
6731
19.2k
  return (try_val_to_str_ext(tvb_get_uint8(tvb, off), &c_tag_strings_ext) == NULL);
6732
19.2k
}
6733
6734
/* Dissect a MSGR message.
6735
 *
6736
 * MSGR is Ceph's outer message protocol.
6737
 */
6738
static
6739
unsigned c_dissect_msgr(proto_tree *tree,
6740
         tvbuff_t *tvb, unsigned off, c_pkt_data *data)
6741
764
{
6742
764
  proto_item *ti;
6743
764
  c_tag tag;
6744
764
  unsigned unknowntagcount = 1;
6745
6746
764
  tag = (c_tag)tvb_get_uint8(tvb, off);
6747
764
  ti = proto_tree_add_item(tree, hf_tag, tvb, off, 1, ENC_LITTLE_ENDIAN);
6748
764
  off += 1;
6749
6750
764
  switch (tag)
6751
764
  {
6752
28
  case C_TAG_READY:
6753
52
  case C_TAG_RESETSESSION:
6754
70
  case C_TAG_WAIT:
6755
85
  case C_TAG_RETRY_SESSION:
6756
95
  case C_TAG_RETRY_GLOBAL:
6757
106
  case C_TAG_BADPROTOVER:
6758
118
  case C_TAG_BADAUTHORIZER:
6759
124
  case C_TAG_FEATURES:
6760
124
    off = c_dissect_connect_reply(tree, tvb, off, data);
6761
124
    break;
6762
7
  case C_TAG_SEQ:
6763
7
    off = c_dissect_connect_reply(tree, tvb, off, data);
6764
7
    proto_tree_add_item(tree, hf_seq_existing,
6765
7
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6766
7
    off += 8;
6767
6768
7
    data->dst->state = C_STATE_SEQ;
6769
7
    break;
6770
7
  case C_TAG_CLOSE:
6771
7
    c_set_type(data, "CLOSE");
6772
7
    data->src->state = C_STATE_NEW;
6773
7
    break;
6774
18
  case C_TAG_MSG:
6775
18
    off = c_dissect_msg(tree, tvb, off, data);
6776
18
    break;
6777
71
  case C_TAG_ACK:
6778
71
    c_set_type(data, "ACK");
6779
71
    proto_item_append_text(data->item_root, ", Seq: %u",
6780
71
               tvb_get_letohl(tvb, off));
6781
71
    proto_tree_add_item(tree, hf_ack,
6782
71
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6783
71
    off += 8;
6784
71
    break;
6785
161
  case C_TAG_KEEPALIVE:
6786
161
    c_set_type(data, "KEEPALIVE");
6787
    /* No data. */
6788
161
    break;
6789
25
  case C_TAG_KEEPALIVE2:
6790
56
  case C_TAG_KEEPALIVE2_ACK:
6791
56
    c_set_type(data, "KEEPALIVE2");
6792
56
    proto_tree_add_item(tree, hf_keepalive_time,
6793
56
            tvb, off, 8, ENC_LITTLE_ENDIAN);
6794
56
    off += 8;
6795
56
    break;
6796
320
  default:
6797
    /*
6798
      The default is to do nothing.  We have no way of knowing how
6799
      long an unknown message will be.  Our best bet is to read
6800
      just the tag (which we did above) and try to interpret the
6801
      next byte as a message.  In the best case we step through
6802
      the unknown message and when we hit the next known message
6803
      we can continue.
6804
6805
      Stepping through byte-by-byte is slow, and creates a lot of
6806
      "Unknown Tag" items (where only the first one is really
6807
      meaningful) but we don't want to miss the next message if we
6808
      can help it.
6809
6810
      Worst case is the message contains a byte that we think is a
6811
      message.  In this case we will interpret garbage from there
6812
      creating bogus items in the dissection results.  After we
6813
      "dissect" that "PDU" we go back to the start and hope we get
6814
      lucky and find ourselves realigned.
6815
    */
6816
6817
    /* Batch multiple unknowns together. */
6818
9.64k
    while (c_unknowntagnext(tvb, off)) {
6819
9.32k
      off++;
6820
9.32k
      unknowntagcount++;
6821
9.32k
    }
6822
6823
320
    c_set_type(data, wmem_strdup_printf(data->pinfo->pool,
6824
320
                "UNKNOWN x%u",
6825
320
                unknowntagcount));
6826
320
    expert_add_info(data->pinfo, ti, &ei_tag_unknown);
6827
764
  }
6828
6829
758
  return off;
6830
764
}
6831
6832
/* Dissect a Protocol Data Unit
6833
 */
6834
static
6835
unsigned c_dissect_pdu(proto_tree *root,
6836
        tvbuff_t *tvb, unsigned off, c_pkt_data *data)
6837
853
{
6838
853
  proto_item *ti, *tif;
6839
853
  proto_tree *tree, *tree_filter;
6840
6841
853
  ti = proto_tree_add_item(root, proto_ceph, tvb, off, -1, ENC_NA);
6842
853
  tree = proto_item_add_subtree(ti, ett_ceph);
6843
6844
853
  data->item_root = ti;
6845
6846
853
  tif = proto_tree_add_item(tree, hf_filter_data, tvb, off, -1, ENC_NA);
6847
853
  tree_filter = proto_item_add_subtree(tif, ett_filter_data);
6848
6849
853
  switch (data->src->state)
6850
853
  {
6851
89
    case C_STATE_NEW:
6852
89
      off = c_dissect_new(tree, tvb, off, data);
6853
89
      break;
6854
0
    case C_STATE_SEQ:
6855
0
      c_set_type(data, "Sequence Number");
6856
0
      proto_item_append_text(data->item_root, ", Seq: %"PRIu64,
6857
0
                 tvb_get_letoh64(tvb, off));
6858
0
      proto_tree_add_item(tree, hf_seq_new, tvb, off, 8, ENC_LITTLE_ENDIAN);
6859
0
      off += 8;
6860
0
      data->src->state = C_STATE_OPEN;
6861
0
      break;
6862
764
    default:
6863
764
      off = c_dissect_msgr(tree, tvb, off, data);
6864
853
  }
6865
6866
847
  if (tree_filter) {
6867
847
    proto_item *fi;
6868
847
    const char *srcn, *dstn;
6869
6870
    /* Provide readable defaults. */
6871
847
    srcn = data->src->name.slug? data->src->name.slug : "Unknown";
6872
847
    dstn = data->dst->name.slug? data->dst->name.slug : "Unknown";
6873
6874
    /*** General Filter Data ***/
6875
847
    fi = proto_tree_add_string(tree_filter, hf_src_slug,
6876
847
             NULL, 0, 0, srcn);
6877
847
    proto_item_set_generated(fi);
6878
847
    fi = proto_tree_add_uint(tree_filter, hf_src_type,
6879
847
           NULL, 0, 0, data->src->name.type);
6880
847
    proto_item_set_generated(fi);
6881
847
    fi = proto_tree_add_string(tree_filter, hf_dst_slug,
6882
847
             NULL, 0, 0, dstn);
6883
847
    proto_item_set_generated(fi);
6884
847
    fi = proto_tree_add_uint(tree_filter, hf_dst_type,
6885
847
           NULL, 0, 0, data->dst->name.type);
6886
847
    proto_item_set_generated(fi);
6887
6888
847
    proto_item_set_end(tif, tvb, off);
6889
847
  }
6890
6891
847
  proto_item_set_end(ti,  tvb, off);
6892
6893
847
  return off;
6894
853
}
6895
6896
static
6897
unsigned c_pdu_end(tvbuff_t *tvb, packet_info *pinfo, unsigned off, c_pkt_data *data)
6898
961
{
6899
961
  c_inet  af;
6900
6901
  /*
6902
   * If we don't already know, then figure out which end of the
6903
   * connection is the client. It's icky, but the only way to know is to
6904
   * see whether the info after the first entity_addr_t looks like
6905
   * another entity_addr_t.
6906
   */
6907
961
  if (data->convd->client.port == 0xFFFF) {
6908
166
    if (!tvb_bytes_exist(tvb, off, C_BANNER_SIZE + C_SIZE_ENTITY_ADDR + 8 + 2))
6909
18
      return C_NEEDMORE;
6910
6911
    /* We have enough to determine client vs. server */
6912
148
    af = (c_inet)tvb_get_ntohs(tvb, off + C_BANNER_SIZE + C_SIZE_ENTITY_ADDR + 8);
6913
148
    if (af != C_IPv4 && af != C_IPv6) {
6914
      /* Client */
6915
138
      copy_address_wmem(wmem_file_scope(), &data->convd->client.addr, &pinfo->src);
6916
138
      data->convd->client.port = pinfo->srcport;
6917
138
      copy_address_wmem(wmem_file_scope(), &data->convd->server.addr, &pinfo->dst);
6918
138
      data->convd->server.port = pinfo->destport;
6919
138
      data->src = &data->convd->client;
6920
138
      data->dst = &data->convd->server;
6921
138
    } else {
6922
      /* Server */
6923
10
      copy_address_wmem(wmem_file_scope(), &data->convd->server.addr, &pinfo->src);
6924
10
      data->convd->server.port = pinfo->srcport;
6925
10
      copy_address_wmem(wmem_file_scope(), &data->convd->client.addr, &pinfo->dst);
6926
10
      data->convd->client.port = pinfo->destport;
6927
10
      data->src = &data->convd->server;
6928
10
      data->dst = &data->convd->client;
6929
10
    }
6930
148
  }
6931
6932
943
  switch (data->src->state)
6933
943
  {
6934
113
  case C_STATE_NEW:
6935
113
    if (c_from_client(data))
6936
102
    {
6937
102
      if (!tvb_bytes_exist(tvb, off+C_BANNER_SIZE+C_HELLO_OFF_AUTHLEN, 4))
6938
7
        return C_NEEDMORE;
6939
95
      return off + C_BANNER_SIZE + C_SIZE_HELLO_C
6940
95
           + tvb_get_letohl(tvb, off+C_BANNER_SIZE+C_HELLO_OFF_AUTHLEN);
6941
102
    }
6942
11
    else
6943
11
      return off + C_BANNER_SIZE + C_SIZE_HELLO_S;
6944
0
  case C_STATE_SEQ:
6945
0
    return off + 8;
6946
830
  default:
6947
830
    switch ((c_tag)tvb_get_uint8(tvb, off++))
6948
830
    {
6949
40
    case C_TAG_READY:
6950
85
    case C_TAG_RESETSESSION:
6951
107
    case C_TAG_WAIT:
6952
122
    case C_TAG_RETRY_SESSION:
6953
134
    case C_TAG_RETRY_GLOBAL:
6954
154
    case C_TAG_BADPROTOVER:
6955
169
    case C_TAG_BADAUTHORIZER:
6956
176
    case C_TAG_FEATURES:
6957
176
      if (!tvb_bytes_exist(tvb, off+C_CONNECT_REPLY_OFF_OFFLEN, 4))
6958
13
        return C_NEEDMORE;
6959
163
      return off + C_SIZE_CONNECT_REPLY
6960
163
           + tvb_get_letohl(tvb, off+C_CONNECT_REPLY_OFF_OFFLEN);
6961
13
    case C_TAG_SEQ:
6962
13
      if (!tvb_bytes_exist(tvb, off+C_CONNECT_REPLY_OFF_OFFLEN, 4))
6963
3
        return C_NEEDMORE;
6964
10
      return off + C_SIZE_CONNECT_REPLY + 8
6965
10
           + tvb_get_letohl(tvb, off+C_CONNECT_REPLY_OFF_OFFLEN);
6966
7
    case C_TAG_CLOSE:
6967
7
      return off;
6968
23
    case C_TAG_MSG:
6969
23
    {
6970
23
      uint32_t front_len, middle_len, data_len;
6971
6972
23
      if (!tvb_bytes_exist(tvb, off+C_OFF_HEAD1, C_SIZE_HEAD1))
6973
1
        return C_NEEDMORE;
6974
6975
22
      front_len  = tvb_get_letohl(tvb, off + C_OFF_HEAD1 + 0);
6976
22
      middle_len = tvb_get_letohl(tvb, off + C_OFF_HEAD1 + 4);
6977
22
      data_len   = tvb_get_letohl(tvb, off + C_OFF_HEAD1 + 8);
6978
6979
22
      return off + C_SIZE_HEAD+front_len+middle_len+data_len+C_SIZE_FOOT;
6980
23
    }
6981
74
    case C_TAG_ACK:
6982
74
      return off + 8;
6983
161
    case C_TAG_KEEPALIVE:
6984
161
      return off;
6985
25
    case C_TAG_KEEPALIVE2:
6986
56
    case C_TAG_KEEPALIVE2_ACK:
6987
56
      return off+C_SIZE_TIMESPEC;
6988
320
    default:
6989
9.64k
      while (c_unknowntagnext(tvb, off))
6990
9.32k
        off++;
6991
6992
320
      return off;
6993
830
    }
6994
943
  }
6995
943
}
6996
6997
static
6998
int dissect_ceph(tvbuff_t *tvb, packet_info *pinfo,
6999
     proto_tree *tree, void *pdata _U_)
7000
134
{
7001
134
  unsigned off, offt, offt2;
7002
134
  c_pkt_data data;
7003
7004
134
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "Ceph");
7005
134
  col_clear(pinfo->cinfo, COL_INFO);
7006
7007
134
  off = 0;
7008
983
  while (off < tvb_reported_length(tvb))
7009
961
  {
7010
961
    c_pkt_data_init(&data, pinfo, off);
7011
7012
    /* Save snapshot before dissection changes it. */
7013
    /*
7014
      If some data has already been dissected in this frame we *must*
7015
      save the state so we can remember that the rest of the frame is
7016
      an incomplete PDU.
7017
    */
7018
961
    if (off)
7019
827
      c_pkt_data_save(&data, pinfo, off);
7020
7021
961
    offt = c_pdu_end(tvb, pinfo, off, &data);
7022
961
    if (offt == C_INVALID)
7023
0
    {
7024
0
      return 0;
7025
0
    }
7026
961
    if (offt == C_NEEDMORE) /* Need more data to determine PDU length. */
7027
43
    {
7028
43
      pinfo->desegment_offset = off;
7029
43
      pinfo->desegment_len  = DESEGMENT_ONE_MORE_SEGMENT;
7030
43
      return 1;
7031
43
    }
7032
918
    if (offt > tvb_reported_length(tvb)) /* Know PDU length, get rest */
7033
65
    {
7034
65
      pinfo->desegment_offset = off;
7035
65
      pinfo->desegment_len  = offt - tvb_reported_length(tvb);
7036
65
      return 1;
7037
65
    }
7038
7039
    /*
7040
      If we didn't save above, save now.  This is a complete PDU so
7041
      we need to save the state.
7042
    */
7043
853
    if (!off)
7044
100
      c_pkt_data_save(&data, pinfo, off);
7045
7046
853
    col_append_sep_str(pinfo->cinfo, COL_INFO, " | ", "");
7047
853
    col_set_fence(pinfo->cinfo, COL_INFO);
7048
7049
853
    offt2 = c_dissect_pdu(tree, tvb, off, &data);
7050
853
    if (!offt2) return 0;
7051
849
    DISSECTOR_ASSERT_CMPINT(offt2, ==, offt);
7052
7053
849
    off = offt;
7054
849
  }
7055
7056
22
  return off; /* Perfect Fit. */
7057
134
}
7058
7059
/** An old style dissector proxy.
7060
 *
7061
 * Proxies the old style dissector interface to the new style.
7062
 */
7063
static
7064
int dissect_ceph_old(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
7065
26
{
7066
26
  dissect_ceph(tvb, pinfo, tree, data);
7067
26
  return tvb_captured_length(tvb);
7068
26
}
7069
7070
static
7071
bool dissect_ceph_heur(tvbuff_t *tvb, packet_info *pinfo,
7072
         proto_tree *tree, void *data)
7073
4.05k
{
7074
4.05k
  conversation_t *conv;
7075
7076
4.05k
  if (tvb_memeql(tvb, 0, C_BANNER, C_BANNER_SIZE_MIN) != 0) return false;
7077
7078
  /*** It's ours! ***/
7079
7080
108
  conv = find_or_create_conversation(pinfo);
7081
  /* Mark it as ours. */
7082
108
  conversation_set_dissector(conv, ceph_handle);
7083
7084
108
  dissect_ceph(tvb, pinfo, tree, data);
7085
108
  return true;
7086
4.05k
}
7087
7088
/* Register the protocol with Wireshark.
7089
 */
7090
void
7091
proto_register_ceph(void)
7092
14
{
7093
14
  expert_module_t *expert_ceph;
7094
7095
14
  static hf_register_info hf[] = {
7096
14
    { &hf_filter_data, {
7097
14
      "Filter Data", "ceph.filter",
7098
14
      FT_NONE, BASE_NONE, NULL, 0,
7099
14
      "A bunch of properties for convenient filtering.", HFILL
7100
14
    } },
7101
14
    { &hf_node_id, {
7102
14
      "ID", "ceph.node_id",
7103
14
      FT_UINT64, BASE_DEC, NULL, 0,
7104
14
      "The numeric ID of the node.", HFILL
7105
14
    } },
7106
14
    { &hf_node_type, {
7107
14
      "Source Node Type", "ceph.node_type",
7108
14
      FT_UINT32, BASE_HEX, VALS(c_node_type_strings), 0,
7109
14
      "The type of source node.", HFILL
7110
14
    } },
7111
14
    { &hf_node_nonce, {
7112
14
      "Nonce", "ceph.node_nonce",
7113
14
      FT_UINT32, BASE_HEX, NULL, 0,
7114
14
      "Meaningless number to differentiate between nodes on "
7115
14
      "the same system.", HFILL
7116
14
    } },
7117
14
    { &hf_entityinst_name, {
7118
14
      "Name", "ceph.entityinst.name",
7119
14
      FT_NONE, BASE_NONE, NULL, 0,
7120
14
      NULL, HFILL
7121
14
    } },
7122
14
    { &hf_entityinst_addr, {
7123
14
      "Address", "ceph.entityinst.addr",
7124
14
      FT_NONE, BASE_NONE, NULL, 0,
7125
14
      NULL, HFILL
7126
14
    } },
7127
14
    { &hf_EntityName, {
7128
14
      "Entity Name", "ceph.EntityName",
7129
14
      FT_NONE, BASE_NONE, NULL, 0,
7130
14
      NULL, HFILL
7131
14
    } },
7132
14
    { &hf_EntityName_type, {
7133
14
      "Type", "ceph.EntityName.type",
7134
14
      FT_UINT32, BASE_HEX, NULL, 0,
7135
14
      NULL, HFILL
7136
14
    } },
7137
14
    { &hf_EntityName_id, {
7138
14
      "ID", "ceph.EntityName.id",
7139
14
      FT_STRING, BASE_NONE, NULL, 0,
7140
14
      NULL, HFILL
7141
14
    } },
7142
14
    { &hf_src_slug, {
7143
14
      "Source Node Name", "ceph.src",
7144
14
      FT_STRING, BASE_NONE, NULL, 0,
7145
14
      NULL, HFILL
7146
14
    } },
7147
14
    { &hf_src_type, {
7148
14
      "Source Node Type", "ceph.src.type",
7149
14
      FT_UINT8, BASE_HEX, VALS(c_node_type_abbr_strings), 0,
7150
14
      NULL, HFILL
7151
14
    } },
7152
14
    { &hf_dst_slug, {
7153
14
      "Destination Node Name", "ceph.dst",
7154
14
      FT_STRING, BASE_NONE, NULL, 0,
7155
14
      NULL, HFILL
7156
14
    } },
7157
14
    { &hf_dst_type, {
7158
14
      "Destination Node Type", "ceph.dst.type",
7159
14
      FT_UINT8, BASE_HEX, VALS(c_node_type_abbr_strings), 0,
7160
14
      NULL, HFILL
7161
14
    } },
7162
14
    { &hf_banner, {
7163
14
      "Version", "ceph.ver",
7164
14
      FT_STRINGZ, BASE_NONE, NULL, 0,
7165
14
      "The protocol version string.", HFILL
7166
14
    } },
7167
14
    { &hf_client_info, {
7168
14
      "Client's Identity", "ceph.client_info",
7169
14
      FT_NONE, BASE_NONE, NULL, 0,
7170
14
      NULL, HFILL
7171
14
    } },
7172
14
    { &hf_server_info, {
7173
14
      "Server's Identity", "ceph.server_info",
7174
14
      FT_NONE, BASE_NONE, NULL, 0,
7175
14
      NULL, HFILL
7176
14
    } },
7177
14
    { &hf_sockaddr, {
7178
14
      "Network Address", "ceph.sockaddr",
7179
14
      FT_NONE, BASE_NONE, NULL, 0,
7180
14
      NULL, HFILL
7181
14
    } },
7182
14
    { &hf_inet_family, {
7183
14
      "Address Family", "ceph.af",
7184
14
      FT_UINT16, BASE_HEX, VALS(c_inet_strings), 0,
7185
14
      "The address family of the client as seen by the server.", HFILL
7186
14
    } },
7187
14
    { &hf_port, {
7188
14
      "Port", "ceph.client.port",
7189
14
      FT_UINT16, BASE_DEC, NULL, 0,
7190
14
      "The port of the client as seen by the server.", HFILL
7191
14
    } },
7192
14
    { &hf_addr_ipv4, {
7193
14
      "IPv4 Address", "ceph.client.ip4",
7194
14
      FT_IPv4, BASE_NONE, NULL, 0,
7195
14
      "The IP address of the client as seen by the server.", HFILL
7196
14
    } },
7197
14
    { &hf_addr_ipv6, {
7198
14
      "IPv6 Address", "ceph.client.ipv6",
7199
14
      FT_IPv6, BASE_NONE, NULL, 0,
7200
14
      "The IP address of the client as seen by the server.", HFILL
7201
14
    } },
7202
14
    { &hf_data_data, {
7203
14
      "Data", "ceph.data.data",
7204
14
      FT_BYTES, BASE_NONE, NULL, 0,
7205
14
      NULL, HFILL
7206
14
    } },
7207
14
    { &hf_data_size, {
7208
14
      "Size", "ceph.data.size",
7209
14
      FT_UINT32, BASE_DEC, NULL, 0,
7210
14
      NULL, HFILL
7211
14
    } },
7212
14
    { &hf_string_data, {
7213
14
      "Data", "ceph.string.data",
7214
14
      FT_STRING, BASE_NONE, NULL, 0,
7215
14
      NULL, HFILL
7216
14
    } },
7217
14
    { &hf_string_size, {
7218
14
      "Size", "ceph.string.size",
7219
14
      FT_UINT32, BASE_DEC, NULL, 0,
7220
14
      NULL, HFILL
7221
14
    } },
7222
14
    { &hf_keepalive_time, {
7223
14
      "Timestamp", "ceph.keepalive.time",
7224
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7225
14
      NULL, HFILL
7226
14
    } },
7227
14
    { &hf_encoded_ver, {
7228
14
      "Encoding Version", "ceph.enc.ver",
7229
14
      FT_UINT8, BASE_DEC, NULL, 0,
7230
14
      NULL, HFILL
7231
14
    } },
7232
14
    { &hf_encoded_compat, {
7233
14
      "Minimum compatible version", "ceph.enc.compat",
7234
14
      FT_UINT8, BASE_DEC, NULL, 0,
7235
14
      NULL, HFILL
7236
14
    } },
7237
14
    { &hf_encoded_size, {
7238
14
      "Size", "ceph.nanoseconds",
7239
14
      FT_UINT32, BASE_DEC, NULL, 0,
7240
14
      "Size of encoded message.", HFILL
7241
14
    } },
7242
14
    { &hf_version, {
7243
14
      "Version", "ceph.version",
7244
14
      FT_UINT64, BASE_DEC, NULL, 0,
7245
14
      NULL, HFILL
7246
14
    } },
7247
14
    { &hf_epoch, {
7248
14
      "Epoch", "ceph.epoch",
7249
14
      FT_UINT32, BASE_DEC, NULL, 0,
7250
14
      NULL, HFILL
7251
14
    } },
7252
14
    { &hf_pool, {
7253
14
      "Pool", "ceph.pool",
7254
14
      FT_INT64, BASE_DEC, NULL, 0,
7255
14
      NULL, HFILL
7256
14
    } },
7257
14
    { &hf_key, {
7258
14
      "Object Key", "ceph.key",
7259
14
      FT_STRING, BASE_NONE, NULL, 0,
7260
14
      NULL, HFILL
7261
14
    } },
7262
14
    { &hf_namespace, {
7263
14
      "Namespace", "ceph.namespace",
7264
14
      FT_STRING, BASE_NONE, NULL, 0,
7265
14
      NULL, HFILL
7266
14
    } },
7267
14
    { &hf_hash, {
7268
14
      "Object Hash", "ceph.hash",
7269
14
      FT_INT64, BASE_DEC, NULL, 0,
7270
14
      NULL, HFILL
7271
14
    } },
7272
14
    { &hf_pgid_ver, {
7273
14
      "Placement Group Version", "ceph.pg.ver",
7274
14
      FT_UINT8, BASE_DEC, NULL, 0,
7275
14
      NULL, HFILL
7276
14
    } },
7277
14
    { &hf_pgid_pool, {
7278
14
      "Pool", "ceph.pg.pool",
7279
14
      FT_UINT64, BASE_HEX, NULL, 0,
7280
14
      NULL, HFILL
7281
14
    } },
7282
14
    { &hf_pgid_seed, {
7283
14
      "Seed", "ceph.pg.seed",
7284
14
      FT_UINT32, BASE_HEX, NULL, 0,
7285
14
      NULL, HFILL
7286
14
    } },
7287
14
    { &hf_pgid_preferred, {
7288
14
      "Preferred", "ceph.pg.preferred",
7289
14
      FT_INT32, BASE_DEC, NULL, 0,
7290
14
      NULL, HFILL
7291
14
    } },
7292
14
    { &hf_pg_create_epoch, {
7293
14
      "Epoch Created", "ceph.pg_create.epoch",
7294
14
      FT_UINT32, BASE_DEC, NULL, 0,
7295
14
      NULL, HFILL
7296
14
    } },
7297
14
    { &hf_pg_create_parent, {
7298
14
      "Parent", "ceph.pg_create.parent",
7299
14
      FT_NONE, BASE_NONE, NULL, 0,
7300
14
      NULL, HFILL
7301
14
    } },
7302
14
    { &hf_pg_create_splitbits, {
7303
14
      "Split Bits", "ceph.pg_create.splitbits",
7304
14
      FT_INT32, BASE_DEC, NULL, 0,
7305
14
      NULL, HFILL
7306
14
    } },
7307
14
    { &hf_path_ver, {
7308
14
      "Encoding Version", "ceph.path.ver",
7309
14
      FT_UINT8, BASE_HEX, NULL, 0,
7310
14
      NULL, HFILL
7311
14
    } },
7312
14
    { &hf_path_inode, {
7313
14
      "Inode", "ceph.path.inode",
7314
14
      FT_UINT64, BASE_HEX, NULL, 0,
7315
14
      NULL, HFILL
7316
14
    } },
7317
14
    { &hf_path_rel, {
7318
14
      "Relative component", "ceph.path.rel",
7319
14
      FT_STRING, BASE_NONE, NULL, 0,
7320
14
      NULL, HFILL
7321
14
    } },
7322
14
    { &hf_mds_release_inode, {
7323
14
      "Inode", "ceph.mds_release.inode",
7324
14
      FT_UINT64, BASE_HEX, NULL, 0,
7325
14
      NULL, HFILL
7326
14
    } },
7327
14
    { &hf_mds_release_capid, {
7328
14
      "Capability ID", "ceph.mds_release.capid",
7329
14
      FT_UINT64, BASE_HEX, NULL, 0,
7330
14
      NULL, HFILL
7331
14
    } },
7332
14
    { &hf_mds_release_new, {
7333
14
      "New Capabilities", "ceph.mds_release.new",
7334
14
      FT_UINT32, BASE_HEX, NULL, 0,
7335
14
      NULL, HFILL
7336
14
    } },
7337
14
    { &hf_mds_release_wanted, {
7338
14
      "Wanted Capabilities", "ceph.mds_release.wanted",
7339
14
      FT_UINT32, BASE_HEX, NULL, 0,
7340
14
      NULL, HFILL
7341
14
    } },
7342
14
    { &hf_mds_release_seq, {
7343
14
      "Seq", "ceph.mds_release.seq",
7344
14
      FT_UINT32, BASE_HEX, NULL, 0,
7345
14
      NULL, HFILL
7346
14
    } },
7347
14
    { &hf_mds_release_seq_issue, {
7348
14
      "Seq Issue", "ceph.mds_release.seq_issue",
7349
14
      FT_UINT32, BASE_HEX, NULL, 0,
7350
14
      NULL, HFILL
7351
14
    } },
7352
14
    { &hf_mds_release_mseq, {
7353
14
      "Migration Sequence", "ceph.mds_release.mseq",
7354
14
      FT_UINT32, BASE_HEX, NULL, 0,
7355
14
      NULL, HFILL
7356
14
    } },
7357
14
    { &hf_mds_release_dname_seq, {
7358
14
      "DName Seq", "ceph.mds_release.dname_seq",
7359
14
      FT_UINT32, BASE_HEX, NULL, 0,
7360
14
      NULL, HFILL
7361
14
    } },
7362
14
    { &hf_mds_release_dname, {
7363
14
      "DName", "ceph.mds_release.dname",
7364
14
      FT_STRING, BASE_NONE, NULL, 0,
7365
14
      NULL, HFILL
7366
14
    } },
7367
14
    { &hf_hitset_params, {
7368
14
      "HitSet Parameters", "ceph.hitset_params",
7369
14
      FT_NONE, BASE_NONE, NULL, 0,
7370
14
      NULL, HFILL
7371
14
    } },
7372
14
    { &hf_hitset_params_type, {
7373
14
      "Type", "ceph.hitset_params.type",
7374
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &c_hitset_params_type_strings_ext, 0,
7375
14
      NULL, HFILL
7376
14
    } },
7377
14
    { &hf_hitset_params_exphash_count, {
7378
14
      "Count", "ceph.hitset_params.exphash.count",
7379
14
      FT_UINT64, BASE_DEC, NULL, 0,
7380
14
      NULL, HFILL
7381
14
    } },
7382
14
    { &hf_hitset_params_exphash_hit, {
7383
14
      "Hit", "ceph.hitset_params.exphash.hit",
7384
14
      FT_UINT32, BASE_DEC, NULL, 0,
7385
14
      NULL, HFILL
7386
14
    } },
7387
14
    { &hf_snapinfo, {
7388
14
      "Snapshot Info", "ceph.snapinfo",
7389
14
      FT_NONE, BASE_NONE, NULL, 0,
7390
14
      NULL, HFILL
7391
14
    } },
7392
14
    { &hf_snapinfo_id, {
7393
14
      "ID", "ceph.snapinfo.id",
7394
14
      FT_UINT64, BASE_HEX, NULL, 0,
7395
14
      NULL, HFILL
7396
14
    } },
7397
14
    { &hf_snapinfo_time, {
7398
14
      "Timestamp", "ceph.snapinfo.timestamp",
7399
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7400
14
      NULL, HFILL
7401
14
    } },
7402
14
    { &hf_snapinfo_name, {
7403
14
      "Name", "ceph.snapinfo.name",
7404
14
      FT_STRING, BASE_NONE, NULL, 0,
7405
14
      NULL, HFILL
7406
14
    } },
7407
14
    { &hf_pgpool, {
7408
14
      "Placement Group Pool", "ceph.pgpool",
7409
14
      FT_NONE, BASE_NONE, NULL, 0,
7410
14
      NULL, HFILL
7411
14
    } },
7412
14
    { &hf_pgpool_type, {
7413
14
      "Type", "ceph.pgpool.type",
7414
14
      FT_UINT8, BASE_HEX, VALS(c_pgpool_type_strings), 0,
7415
14
      NULL, HFILL
7416
14
    } },
7417
14
    { &hf_pgpool_size, {
7418
14
      "Size", "ceph.pgpool.size",
7419
14
      FT_UINT8, BASE_DEC, NULL, 0,
7420
14
      NULL, HFILL
7421
14
    } },
7422
14
    { &hf_pgpool_crush_ruleset, {
7423
14
      "CRUSH Ruleset", "ceph.pgpool.crush_ruleset",
7424
14
      FT_UINT8, BASE_DEC, NULL, 0,
7425
14
      NULL, HFILL
7426
14
    } },
7427
14
    { &hf_pgpool_hash, {
7428
14
      "Object Hash", "ceph.pgpool.hash",
7429
14
      FT_UINT8, BASE_HEX, NULL, 0,
7430
14
      NULL, HFILL
7431
14
    } },
7432
14
    { &hf_pgpool_pgnum, {
7433
14
      "PG Count", "ceph.pgpool.pgnum",
7434
14
      FT_UINT32, BASE_DEC, NULL, 0,
7435
14
      NULL, HFILL
7436
14
    } },
7437
14
    { &hf_pgpool_pgpnum, {
7438
14
      "PGP Count", "ceph.pgpool.pgpnum",
7439
14
      FT_UINT32, BASE_DEC, NULL, 0,
7440
14
      NULL, HFILL
7441
14
    } },
7442
14
    { &hf_pgpool_changed, {
7443
14
      "Last Changed", "ceph.pgpool.changed",
7444
14
      FT_UINT32, BASE_DEC, NULL, 0,
7445
14
      NULL, HFILL
7446
14
    } },
7447
14
    { &hf_pgpool_snapseq, {
7448
14
      "Snap Sequence", "ceph.pgpool.snapseq",
7449
14
      FT_UINT64, BASE_HEX, NULL, 0,
7450
14
      NULL, HFILL
7451
14
    } },
7452
14
    { &hf_pgpool_snapepoch, {
7453
14
      "Epoch", "ceph.pgpool.snapepoch",
7454
14
      FT_UINT32, BASE_DEC, NULL, 0,
7455
14
      NULL, HFILL
7456
14
    } },
7457
14
    { &hf_pgpool_snap, {
7458
14
      "Snapshot", "ceph.pgpool.snap",
7459
14
      FT_NONE, BASE_NONE, NULL, 0,
7460
14
      NULL, HFILL
7461
14
    } },
7462
14
    { &hf_pgpool_snap_id, {
7463
14
      "ID", "ceph.pgpool.snap.id",
7464
14
      FT_UINT64, BASE_HEX, NULL, 0,
7465
14
      NULL, HFILL
7466
14
    } },
7467
14
    { &hf_pgpool_snapdel, {
7468
14
      "Deleted Snapshots", "ceph.pgpool.snapdel",
7469
14
      FT_NONE, BASE_NONE, NULL, 0,
7470
14
      NULL, HFILL
7471
14
    } },
7472
14
    { &hf_pgpool_snapdel_from, {
7473
14
      "From", "ceph.pgpool.snapdel.from",
7474
14
      FT_UINT64, BASE_HEX, NULL, 0,
7475
14
      NULL, HFILL
7476
14
    } },
7477
14
    { &hf_pgpool_snapdel_to, {
7478
14
      "To", "ceph.pgpool.snapdel.to",
7479
14
      FT_UINT64, BASE_HEX, NULL, 0,
7480
14
      NULL, HFILL
7481
14
    } },
7482
14
    { &hf_pgpool_uid, {
7483
14
      "User ID", "ceph.pgpool.uid",
7484
14
      FT_UINT64, BASE_DEC, NULL, 0,
7485
14
      NULL, HFILL
7486
14
    } },
7487
14
    { &hf_pgpool_flags_low, {
7488
14
      "Flags", "ceph.pgpool.flags",
7489
14
      FT_UINT32, BASE_HEX, NULL, 0,
7490
14
      NULL, HFILL
7491
14
    } },
7492
14
    { &hf_pgpool_flags_high, {
7493
14
      "Flags", "ceph.pgpool.flags",
7494
14
      FT_UINT32, BASE_HEX, NULL, 0,
7495
14
      NULL, HFILL
7496
14
    } },
7497
14
    { &hf_pgpool_crash_reply_interval, {
7498
14
      "Crash Replay Interval", "ceph.pgpool.crash_reply_interval",
7499
14
      FT_UINT32, BASE_DEC, NULL, 0,
7500
14
      "Seconds to allow clients to replay ACKed but "
7501
14
      "unCOMMITted requests.", HFILL
7502
14
    } },
7503
14
    { &hf_pgpool_min_size, {
7504
14
      "Minimum number of OSDs", "ceph.pgpool.min_size",
7505
14
      FT_UINT8, BASE_DEC, NULL, 0,
7506
14
      NULL, HFILL
7507
14
    } },
7508
14
    { &hf_pgpool_quota_bytes, {
7509
14
      "Maximum number of bytes", "ceph.pgpool.quota_bytes",
7510
14
      FT_UINT64, BASE_DEC, NULL, 0,
7511
14
      NULL, HFILL
7512
14
    } },
7513
14
    { &hf_pgpool_quota_objects, {
7514
14
      "Maximum number of objects", "ceph.pgpool.quota_objects",
7515
14
      FT_UINT64, BASE_DEC, NULL, 0,
7516
14
      NULL, HFILL
7517
14
    } },
7518
14
    { &hf_pgpool_tier, {
7519
14
      "Tier", "ceph.msg.tier",
7520
14
      FT_UINT64, BASE_HEX, NULL, 0,
7521
14
      "A pool that is a tier of this tier.", HFILL
7522
14
    } },
7523
14
    { &hf_pgpool_tierof, {
7524
14
      "Tier of", "ceph.pgpool.tierof",
7525
14
      FT_UINT64, BASE_HEX, NULL, 0,
7526
14
      "The pool that this pool is a tier of.", HFILL
7527
14
    } },
7528
14
    { &hf_pgpool_cachemode, {
7529
14
      "Cache Mode", "ceph.pgpool.cache_mode",
7530
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &c_pgpool_cachemode_strings_ext, 0,
7531
14
      NULL, HFILL
7532
14
    } },
7533
14
    { &hf_pgpool_readtier, {
7534
14
      "Read Tier", "ceph.pgpool.read_tier",
7535
14
      FT_UINT64, BASE_HEX, NULL, 0,
7536
14
      NULL, HFILL
7537
14
    } },
7538
14
    { &hf_pgpool_writetier, {
7539
14
      "Write Tier", "ceph.pgpool.write_tier",
7540
14
      FT_UINT64, BASE_HEX, NULL, 0,
7541
14
      NULL, HFILL
7542
14
    } },
7543
14
    { &hf_pgpool_property, {
7544
14
      "Property", "ceph.pgpool.property",
7545
14
      FT_NONE, BASE_NONE, NULL, 0,
7546
14
      NULL, HFILL
7547
14
    } },
7548
14
    { &hf_pgpool_property_key, {
7549
14
      "Key", "ceph.pgpool.property.key",
7550
14
      FT_STRING, BASE_NONE, NULL, 0,
7551
14
      NULL, HFILL
7552
14
    } },
7553
14
    { &hf_pgpool_property_val, {
7554
14
      "Value", "ceph.pgpool.property.val",
7555
14
      FT_STRING, BASE_NONE, NULL, 0,
7556
14
      NULL, HFILL
7557
14
    } },
7558
14
    { &hf_pgpool_hitset_period, {
7559
14
      "HitSet Period", "ceph.hitset_period",
7560
14
      FT_UINT32, BASE_DEC, NULL, 0,
7561
14
      "The period of HitSet segments in seconds.", HFILL
7562
14
    } },
7563
14
    { &hf_pgpool_hitset_count, {
7564
14
      "HitSet count", "ceph.pgpool.hitset_count",
7565
14
      FT_UINT32, BASE_DEC, NULL, 0,
7566
14
      "The number of HitSet periods to retain.", HFILL
7567
14
    } },
7568
14
    { &hf_pgpool_stripewidth, {
7569
14
      "Stripe Width", "ceph.pgpool.stripewidth",
7570
14
      FT_UINT32, BASE_DEC, NULL, 0,
7571
14
      NULL, HFILL
7572
14
    } },
7573
14
    { &hf_pgpool_targetmaxsize, {
7574
14
      "Target Maximum Bytes", "ceph.pgpool.targetmaxsize",
7575
14
      FT_UINT64, BASE_DEC, NULL, 0,
7576
14
      NULL, HFILL
7577
14
    } },
7578
14
    { &hf_pgpool_targetmaxobj, {
7579
14
      "Target Maximum Objects", "ceph.pgpool.targetmaxobj",
7580
14
      FT_UINT64, BASE_DEC, NULL, 0,
7581
14
      NULL, HFILL
7582
14
    } },
7583
14
    { &hf_pgpool_cache_targetdirtyratio, {
7584
14
      "Cache Target Dirty Ratio", "ceph.pgpool.cache.targetdirtyratio",
7585
14
      FT_UINT32, BASE_DEC, NULL, 0,
7586
14
      "Fraction of cache to leave dirty.", HFILL
7587
14
    } },
7588
14
    { &hf_pgpool_cache_targetfullratio, {
7589
14
      "Cache Target Full Ratio", "ceph.msg.targetfullratio",
7590
14
      FT_UINT32, BASE_DEC, NULL, 0,
7591
14
      "Fraction of target to fill before evicting in earnest.", HFILL
7592
14
    } },
7593
14
    { &hf_pgpool_cache_flushage_min, {
7594
14
      "Cache Minimum Flush Age", "ceph.pgpool.cache.flushage_min",
7595
14
      FT_UINT32, BASE_DEC, NULL, 0,
7596
14
      NULL, HFILL
7597
14
    } },
7598
14
    { &hf_pgpool_cache_evictage_min, {
7599
14
      "Cache Minimum Evict Age", "ceph.pgpool.cache.evictage_min",
7600
14
      FT_UINT32, BASE_DEC, NULL, 0,
7601
14
      NULL, HFILL
7602
14
    } },
7603
14
    { &hf_pgpool_erasurecode_profile, {
7604
14
      "Erasure Code Profile", "ceph.pgpool.erasurecode_profile",
7605
14
      FT_STRING, BASE_NONE, NULL, 0,
7606
14
      NULL, HFILL
7607
14
    } },
7608
14
    { &hf_pgpool_lastforceresend, {
7609
14
      "Last Force Resend", "ceph.pgpool.lastforceresend",
7610
14
      FT_UINT32, BASE_DEC, NULL, 0,
7611
14
      "Last epoch that forced clients to resend.", HFILL
7612
14
    } },
7613
14
    { &hf_pgpool_flag_hashpool, {
7614
14
      "Hash Seed and Pool Together", "ceph.pgpool.flag.hashpool",
7615
14
      FT_BOOLEAN, 32, NULL, C_PGPOOL_FLAG_HASHPSPOOL,
7616
14
      NULL, HFILL
7617
14
    } },
7618
14
    { &hf_pgpool_flag_full, {
7619
14
      "Pool Full", "ceph.pgpool.flag.full",
7620
14
      FT_BOOLEAN, 32, NULL, C_PGPOOL_FLAG_FULL,
7621
14
      NULL, HFILL
7622
14
    } },
7623
14
    { &hf_pgpool_flag_fake_ec_pool, {
7624
14
      "Fake Erasure-Coded Pool", "ceph.pgpool.flag.fake_ec_pool",
7625
14
      FT_BOOLEAN, 32, NULL, C_PGPOOL_FLAG_FAKE_EC_POOL,
7626
14
      NULL, HFILL
7627
14
    } },
7628
14
    { &hf_monmap, {
7629
14
      "Monmap", "ceph.monmap.data",
7630
14
      FT_NONE, BASE_NONE, NULL, 0,
7631
14
      NULL, HFILL
7632
14
    } },
7633
14
    { &hf_monmap_fsid, {
7634
14
      "FSID", "ceph.monmap.fsid",
7635
14
      FT_GUID, BASE_NONE, NULL, 0,
7636
14
      NULL, HFILL
7637
14
    } },
7638
14
    { &hf_monmap_epoch, {
7639
14
      "Epoch", "ceph.monmap.epoch",
7640
14
      FT_UINT32, BASE_DEC, NULL, 0,
7641
14
      NULL, HFILL
7642
14
    } },
7643
14
    { &hf_monmap_address, {
7644
14
      "Monitor Address", "ceph.monmap.address",
7645
14
      FT_NONE, BASE_NONE, NULL, 0,
7646
14
      NULL, HFILL
7647
14
    } },
7648
14
    { &hf_monmap_address_name, {
7649
14
      "Name", "ceph.monmap.address.name",
7650
14
      FT_STRING, BASE_NONE, NULL, 0,
7651
14
      NULL, HFILL
7652
14
    } },
7653
14
    { &hf_monmap_address_addr, {
7654
14
      "Address", "ceph.monmap.address.addr",
7655
14
      FT_NONE, BASE_NONE, NULL, 0,
7656
14
      NULL, HFILL
7657
14
    } },
7658
14
    { &hf_monmap_changed, {
7659
14
      "Last Changed", "ceph.monmap.changed",
7660
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7661
14
      NULL, HFILL
7662
14
    } },
7663
14
    { &hf_monmap_created, {
7664
14
      "Time Created", "ceph.monmap.created",
7665
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7666
14
      NULL, HFILL
7667
14
    } },
7668
14
    { &hf_pg_stat_ver, {
7669
14
      "Version", "ceph.pg_stat.ver",
7670
14
      FT_NONE, BASE_NONE, NULL, 0,
7671
14
      NULL, HFILL
7672
14
    } },
7673
14
    { &hf_pg_stat_seq, {
7674
14
      "Reported Sequence Number", "ceph.pg_stat.seq",
7675
14
      FT_UINT64, BASE_DEC, NULL, 0,
7676
14
      NULL, HFILL
7677
14
    } },
7678
14
    { &hf_pg_stat_epoch, {
7679
14
      "Reported Epoch", "ceph.pg_stat.epoch",
7680
14
      FT_UINT32, BASE_DEC, NULL, 0,
7681
14
      NULL, HFILL
7682
14
    } },
7683
14
    { &hf_pg_stat_state, {
7684
14
      "State", "ceph.pg_stat.state",
7685
14
      FT_UINT32, BASE_DEC, NULL, 0,
7686
14
      NULL, HFILL
7687
14
    } },
7688
14
    { &hf_pg_stat_logstart, {
7689
14
      "Log Start", "ceph.pg_stat.logstart",
7690
14
      FT_NONE, BASE_NONE, NULL, 0,
7691
14
      NULL, HFILL
7692
14
    } },
7693
14
    { &hf_pg_stat_logstartondisk, {
7694
14
      "On-disk Log Start", "ceph.pg_stat.logstartondisk",
7695
14
      FT_NONE, BASE_NONE, NULL, 0,
7696
14
      NULL, HFILL
7697
14
    } },
7698
14
    { &hf_pg_stat_created, {
7699
14
      "Created", "ceph.pg_stat.created",
7700
14
      FT_UINT32, BASE_DEC, NULL, 0,
7701
14
      NULL, HFILL
7702
14
    } },
7703
14
    { &hf_pg_stat_lastepochclean, {
7704
14
      "Last Epoch Clean", "ceph.pg_stat.lastepochclean",
7705
14
      FT_UINT32, BASE_DEC, NULL, 0,
7706
14
      NULL, HFILL
7707
14
    } },
7708
14
    { &hf_pg_stat_parent, {
7709
14
      "Parent", "ceph.pg_stat.parent",
7710
14
      FT_NONE, BASE_NONE, NULL, 0,
7711
14
      NULL, HFILL
7712
14
    } },
7713
14
    { &hf_pg_stat_parent_splitbits, {
7714
14
      "Parent Split Bits", "ceph.pg_stat.parent_splitbits",
7715
14
      FT_UINT32, BASE_HEX, NULL, 0,
7716
14
      NULL, HFILL
7717
14
    } },
7718
14
    { &hf_pg_stat_lastscrub, {
7719
14
      "Last Scrub", "ceph.pg_stat.lastscrub",
7720
14
      FT_NONE, BASE_NONE, NULL, 0,
7721
14
      NULL, HFILL
7722
14
    } },
7723
14
    { &hf_pg_stat_lastscrubstamp, {
7724
14
      "Last Scrub Timestamp", "ceph.pg_stat.lastscrubstamp",
7725
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7726
14
      NULL, HFILL
7727
14
    } },
7728
14
    { &hf_pg_stat_stats, {
7729
14
      "Stats", "ceph.pg_stat.stats",
7730
14
      FT_NONE, BASE_NONE, NULL, 0,
7731
14
      NULL, HFILL
7732
14
    } },
7733
14
    { &hf_pg_stat_logsize, {
7734
14
      "Log Size", "ceph.pg_stat.logsize",
7735
14
      FT_UINT64, BASE_DEC, NULL, 0,
7736
14
      NULL, HFILL
7737
14
    } },
7738
14
    { &hf_pg_stat_logsizeondisk, {
7739
14
      "Log Size On-disk", "ceph.pg_stat.logsizeondisk",
7740
14
      FT_UINT64, BASE_DEC, NULL, 0,
7741
14
      NULL, HFILL
7742
14
    } },
7743
14
    { &hf_pg_stat_up, {
7744
14
      "Up", "ceph.pg_stat.up",
7745
14
      FT_UINT32, BASE_DEC, NULL, 0,
7746
14
      NULL, HFILL
7747
14
    } },
7748
14
    { &hf_pg_stat_acting, {
7749
14
      "Acting", "ceph.pg_stat.acting",
7750
14
      FT_UINT32, BASE_DEC, NULL, 0,
7751
14
      NULL, HFILL
7752
14
    } },
7753
14
    { &hf_pg_stat_lastfresh, {
7754
14
      "Last Fresh", "ceph.pg_stat.lastfresh",
7755
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7756
14
      NULL, HFILL
7757
14
    } },
7758
14
    { &hf_pg_stat_lastchange, {
7759
14
      "Last Change", "ceph.pg_stat.lastchange",
7760
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7761
14
      NULL, HFILL
7762
14
    } },
7763
14
    { &hf_pg_stat_lastactive, {
7764
14
      "Last Active", "ceph.pg_stat.lastactive",
7765
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7766
14
      NULL, HFILL
7767
14
    } },
7768
14
    { &hf_pg_stat_lastclean, {
7769
14
      "Last Clean", "ceph.pg_stat.lastclean",
7770
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7771
14
      NULL, HFILL
7772
14
    } },
7773
14
    { &hf_pg_stat_lastunstale, {
7774
14
      "Last Not Stale", "ceph.pg_stat.lastunstale",
7775
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7776
14
      NULL, HFILL
7777
14
    } },
7778
14
    { &hf_pg_stat_mappingepoch, {
7779
14
      "Mapping Epoch", "ceph.pg_stat.mappingepoch",
7780
14
      FT_UINT32, BASE_DEC, NULL, 0,
7781
14
      NULL, HFILL
7782
14
    } },
7783
14
    { &hf_pg_stat_lastdeepscrub, {
7784
14
      "Last Deep Scrub", "ceph.pg_stat.lastdeepscrub",
7785
14
      FT_NONE, BASE_NONE, NULL, 0,
7786
14
      NULL, HFILL
7787
14
    } },
7788
14
    { &hf_pg_stat_lastdeepscrubstamp, {
7789
14
      "Time of Last Deep Scrub", "ceph.pg_stat.lastdeepscrubstamp",
7790
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7791
14
      NULL, HFILL
7792
14
    } },
7793
14
    { &hf_pg_stat_statsinvalid, {
7794
14
      "Stats Invalid", "ceph.pg_stat.statsinvalid",
7795
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
7796
14
      NULL, HFILL
7797
14
    } },
7798
14
    { &hf_pg_stat_lastcleanscrubstamp, {
7799
14
      "Time of Last Clean Scrub", "ceph.pg_stat.lastcleanscrubstamp",
7800
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7801
14
      NULL, HFILL
7802
14
    } },
7803
14
    { &hf_pg_stat_lastbecameactive, {
7804
14
      "Last Became Active", "ceph.pg_stat.lastbecameactive",
7805
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7806
14
      NULL, HFILL
7807
14
    } },
7808
14
    { &hf_pg_stat_dirtystatsinvalid, {
7809
14
      "Dirty Stats Invalid", "ceph.pg_stat.dirtystatusinvalid",
7810
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
7811
14
      NULL, HFILL
7812
14
    } },
7813
14
    { &hf_pg_stat_upprimary, {
7814
14
      "Up Primary", "ceph.pg_stat.upprimary",
7815
14
      FT_INT32, BASE_DEC, NULL, 0,
7816
14
      NULL, HFILL
7817
14
    } },
7818
14
    { &hf_pg_stat_actingprimary, {
7819
14
      "Acting Primary", "ceph.pg_stat.actingprimary",
7820
14
      FT_INT32, BASE_DEC, NULL, 0,
7821
14
      NULL, HFILL
7822
14
    } },
7823
14
    { &hf_pg_stat_omapstatsinvalid, {
7824
14
      "OMap Stats Invalid", "ceph.pg_stat.omapstatsinvalid",
7825
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
7826
14
      NULL, HFILL
7827
14
    } },
7828
14
    { &hf_pg_stat_hitsetstatsinvalid, {
7829
14
      "HitSet Stats Invalid", "ceph.pg_stat.hitsetstatsinvalid",
7830
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
7831
14
      NULL, HFILL
7832
14
    } },
7833
14
    { &hf_osd_superblock, {
7834
14
      "Superblock", "ceph.osd_superblock",
7835
14
      FT_NONE, BASE_NONE, NULL, 0,
7836
14
      NULL, HFILL
7837
14
    } },
7838
14
    { &hf_osd_superblock_clusterfsid, {
7839
14
      "Cluster FSID", "ceph.osd_superblock.fsid",
7840
14
      FT_GUID, BASE_NONE, NULL, 0,
7841
14
      NULL, HFILL
7842
14
    } },
7843
14
    { &hf_osd_superblock_role, {
7844
14
      "Role", "ceph.osd_superblock.role",
7845
14
      FT_INT32, BASE_DEC, NULL, 0,
7846
14
      NULL, HFILL
7847
14
    } },
7848
14
    { &hf_osd_superblock_epoch, {
7849
14
      "Epoch", "ceph.osd_superblock.epoch",
7850
14
      FT_UINT32, BASE_DEC, NULL, 0,
7851
14
      NULL, HFILL
7852
14
    } },
7853
14
    { &hf_osd_superblock_map_old, {
7854
14
      "Oldest Map", "ceph.osd_superblock.map_old",
7855
14
      FT_UINT32, BASE_DEC, NULL, 0,
7856
14
      NULL, HFILL
7857
14
    } },
7858
14
    { &hf_osd_superblock_map_new, {
7859
14
      "Newest Map", "ceph.osd_superblock.map_new",
7860
14
      FT_UINT32, BASE_DEC, NULL, 0,
7861
14
      NULL, HFILL
7862
14
    } },
7863
14
    { &hf_osd_superblock_weight, {
7864
14
      "Weight", "ceph.osd_superblock.weight",
7865
14
      FT_DOUBLE, BASE_NONE, NULL, 0,
7866
14
      NULL, HFILL
7867
14
    } },
7868
14
    { &hf_osd_superblock_mounted, {
7869
14
      "Mounted", "ceph.osd_superblock.mounted",
7870
14
      FT_UINT32, BASE_DEC, NULL, 0,
7871
14
      "Last epoch mounted.", HFILL
7872
14
    } },
7873
14
    { &hf_osd_superblock_osdfsid, {
7874
14
      "OSD FSID", "ceph.osd_superblock.osdfsid",
7875
14
      FT_GUID, BASE_NONE, NULL, 0,
7876
14
      NULL, HFILL
7877
14
    } },
7878
14
    { &hf_osd_superblock_clean, {
7879
14
      "Clean Through", "ceph.osd_superblock.clean",
7880
14
      FT_UINT32, BASE_DEC, NULL, 0,
7881
14
      "Last epoch active and clean.", HFILL
7882
14
    } },
7883
14
    { &hf_osd_superblock_full, {
7884
14
      "Last Marked Full", "ceph.osd_superblock.full",
7885
14
      FT_UINT32, BASE_DEC, NULL, 0,
7886
14
      "Last epoch OSDMap was marked full.", HFILL
7887
14
    } },
7888
14
    { &hf_osdinfo_ver, {
7889
14
      "Encoding Version", "ceph.osdinfo.ver",
7890
14
      FT_UINT8, BASE_DEC, NULL, 0,
7891
14
      NULL, HFILL
7892
14
    } },
7893
14
    { &hf_osdinfo_lastclean_begin, {
7894
14
      "Last Clean Begin", "ceph.osdinfo.lastclean.begin",
7895
14
      FT_UINT32, BASE_DEC, NULL, 0,
7896
14
      "The start of the last interval that ended with "
7897
14
      "a clean shutdown.", HFILL
7898
14
    } },
7899
14
    { &hf_osdinfo_lastclean_end, {
7900
14
      "Last Clean End", "ceph.osdinfo.lastclean.end",
7901
14
      FT_UINT32, BASE_DEC, NULL, 0,
7902
14
      "The end of the last interval that ended with a "
7903
14
      "clean shutdown.", HFILL
7904
14
    } },
7905
14
    { &hf_osdinfo_up_from, {
7906
14
      "Up From", "ceph.osdinfo.up.from",
7907
14
      FT_UINT32, BASE_DEC, NULL, 0,
7908
14
      "Epoch OSD was marked up.", HFILL
7909
14
    } },
7910
14
    { &hf_osdinfo_up_through, {
7911
14
      "Up Through", "ceph.osdinfo.up.through",
7912
14
      FT_UINT32, BASE_DEC, NULL, 0,
7913
14
      "Last epoch before OSD died.", HFILL
7914
14
    } },
7915
14
    { &hf_osdinfo_downat, {
7916
14
      "Down At", "ceph.osdinfo.downat",
7917
14
      FT_UINT32, BASE_DEC, NULL, 0,
7918
14
      "First epoch after OSD died.", HFILL
7919
14
    } },
7920
14
    { &hf_osdinfo_lostat, {
7921
14
      "Lost At", "ceph.osdinfo.lostat",
7922
14
      FT_UINT32, BASE_DEC, NULL, 0,
7923
14
      "Last epoch where the data was decided \"lost\".", HFILL
7924
14
    } },
7925
14
    { &hf_osdxinfo_down, {
7926
14
      "Down At", "ceph.osdxinfo.downat",
7927
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
7928
14
      "Time when OSD was last marked down.", HFILL
7929
14
    } },
7930
14
    { &hf_osdxinfo_laggy_probability, {
7931
14
      "Laggy Probability", "ceph.osdxinfo.laggy.probability",
7932
14
      FT_UINT32, BASE_DEC, NULL, 0,
7933
14
      "Probability that the OSD is laggy. (out of 0xFFFFFFFF)", HFILL
7934
14
    } },
7935
14
    { &hf_osdxinfo_laggy_interval, {
7936
14
      "Laggy Interval", "ceph.osdxinfo.laggy.interval",
7937
14
      FT_UINT32, BASE_DEC, NULL, 0,
7938
14
      "Average interval between being marked laggy and recovering.", HFILL
7939
14
    } },
7940
14
    { &hf_osdxinfo_oldweight, {
7941
14
      "Old Weight", "ceph.osdxinfo.oldweight",
7942
14
      FT_UINT32, BASE_DEC, NULL, 0,
7943
14
      NULL, HFILL
7944
14
    } },
7945
14
    { &hf_perfstat_commitlatency, {
7946
14
      "Commit Latency", "ceph.perfstat.commitlatency",
7947
14
      FT_UINT32, BASE_DEC, NULL, 0,
7948
14
      NULL, HFILL
7949
14
    } },
7950
14
    { &hf_perfstat_applylatency, {
7951
14
      "Apply Latency", "ceph.perfstat.applylatency",
7952
14
      FT_UINT32, BASE_DEC, NULL, 0,
7953
14
      NULL, HFILL
7954
14
    } },
7955
14
    { &hf_osdstat, {
7956
14
      "OSD Stats", "ceph.osdstat",
7957
14
      FT_NONE, BASE_NONE, NULL, 0,
7958
14
      NULL, HFILL
7959
14
    } },
7960
14
    { &hf_osdstat_kb, {
7961
14
      "KiB", "ceph.osdstat.kb",
7962
14
      FT_UINT64, BASE_DEC, NULL, 0,
7963
14
      NULL, HFILL
7964
14
    } },
7965
14
    { &hf_osdstat_kbused, {
7966
14
      "KiB Used", "ceph.osdstat.kbused",
7967
14
      FT_UINT64, BASE_DEC, NULL, 0,
7968
14
      NULL, HFILL
7969
14
    } },
7970
14
    { &hf_osdstat_kbavail, {
7971
14
      "KiB Available", "ceph.osdstat.kbavail",
7972
14
      FT_UINT64, BASE_DEC, NULL, 0,
7973
14
      NULL, HFILL
7974
14
    } },
7975
14
    { &hf_osdstat_trimqueue, {
7976
14
      "Trim Queue", "ceph.osdstat.trimqueue",
7977
14
      FT_UINT32, BASE_DEC, NULL, 0,
7978
14
      NULL, HFILL
7979
14
    } },
7980
14
    { &hf_osdstat_hbin, {
7981
14
      "Heartbeats In", "ceph.osdstat.hbin",
7982
14
      FT_UINT32, BASE_DEC, NULL, 0,
7983
14
      NULL, HFILL
7984
14
    } },
7985
14
    { &hf_osdstat_hbout, {
7986
14
      "Heartbeats Out", "ceph.osdstat.hbout",
7987
14
      FT_UINT32, BASE_DEC, NULL, 0,
7988
14
      NULL, HFILL
7989
14
    } },
7990
14
    { &hf_osdstat_opqueue, {
7991
14
      "Op Queue", "ceph.osdstat.opqueue",
7992
14
      FT_UINT32, BASE_DEC, NULL, 0,
7993
14
      NULL, HFILL
7994
14
    } },
7995
14
    { &hf_osdstat_fsperf, {
7996
14
      "Filesystem Performance", "ceph.osdstat.fsperf",
7997
14
      FT_NONE, BASE_NONE, NULL, 0,
7998
14
      NULL, HFILL
7999
14
    } },
8000
14
    { &hf_osdstat_trimming, {
8001
14
      "Number Trimming", "ceph.osdstat.trimming",
8002
14
      FT_UINT32, BASE_DEC, NULL, 0,
8003
14
      NULL, HFILL
8004
14
    } },
8005
14
    { &hf_osdmap, {
8006
14
      "OSD Map", "ceph.osdmap",
8007
14
      FT_NONE, BASE_NONE, NULL, 0,
8008
14
      NULL, HFILL
8009
14
    } },
8010
14
    { &hf_osdmap_client, {
8011
14
      "Client-Usable Data", "ceph.osdmap.client",
8012
14
      FT_NONE, BASE_NONE, NULL, 0,
8013
14
      NULL, HFILL
8014
14
    } },
8015
14
    { &hf_osdmap_fsid, {
8016
14
      "FSID", "ceph.osdmap.fsid",
8017
14
      FT_GUID, BASE_NONE, NULL, 0,
8018
14
      NULL, HFILL
8019
14
    } },
8020
14
    { &hf_osdmap_epoch, {
8021
14
      "Epoch", "ceph.osdmap.epoch",
8022
14
      FT_UINT32, BASE_DEC, NULL, 0,
8023
14
      NULL, HFILL
8024
14
    } },
8025
14
    { &hf_osdmap_created, {
8026
14
      "Time Created", "ceph.osdmap.created",
8027
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
8028
14
      NULL, HFILL
8029
14
    } },
8030
14
    { &hf_osdmap_modified, {
8031
14
      "Last Modified", "ceph.osdmap.modified",
8032
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
8033
14
      NULL, HFILL
8034
14
    } },
8035
14
    { &hf_osdmap_pool, {
8036
14
      "Pool", "ceph.osdmap.pool",
8037
14
      FT_NONE, BASE_NONE, NULL, 0,
8038
14
      NULL, HFILL
8039
14
    } },
8040
14
    { &hf_osdmap_pool_id, {
8041
14
      "ID", "ceph.osdmap.pool.id",
8042
14
      FT_UINT64, BASE_HEX, NULL, 0,
8043
14
      NULL, HFILL
8044
14
    } },
8045
14
    { &hf_osdmap_poolname_item, {
8046
14
      "Pool Name", "ceph.osdmap.poolname.item",
8047
14
      FT_NONE, BASE_NONE, NULL, 0,
8048
14
      NULL, HFILL
8049
14
    } },
8050
14
    { &hf_osdmap_poolname, {
8051
14
      "Name", "ceph.osdmap.poolname",
8052
14
      FT_STRING, BASE_NONE, NULL, 0,
8053
14
      NULL, HFILL
8054
14
    } },
8055
14
    { &hf_osdmap_poolmax, {
8056
14
      "Highest Pool ID", "ceph.osdmap.poolmax",
8057
14
      FT_INT32, BASE_DEC, NULL, 0,
8058
14
      NULL, HFILL
8059
14
    } },
8060
14
    { &hf_osdmap_flags, {
8061
14
      "Flags", "ceph.osdmap.flags",
8062
14
      FT_UINT32, BASE_HEX, NULL, 0,
8063
14
      NULL, HFILL
8064
14
    } },
8065
14
    { &hf_osdmap_osdmax, {
8066
14
      "Highest OSD Number", "ceph.osdmap.osdmax",
8067
14
      FT_INT32, BASE_DEC, NULL, 0,
8068
14
      NULL, HFILL
8069
14
    } },
8070
14
    { &hf_osdmap_osd_state, {
8071
14
      "OSD State", "ceph.osdmap.osd.state",
8072
14
      FT_UINT8, BASE_HEX, NULL, 0,
8073
14
      NULL, HFILL
8074
14
    } },
8075
14
    { &hf_osdmap_osd_weight, {
8076
14
      "OSD Weight", "ceph.osdmap.osd.weight",
8077
14
      FT_UINT32, BASE_DEC, NULL, 0,
8078
14
      NULL, HFILL
8079
14
    } },
8080
14
    { &hf_osdmap_osd_addr, {
8081
14
      "OSD Address", "ceph.osdmap.address",
8082
14
      FT_NONE, BASE_NONE, NULL, 0,
8083
14
      NULL, HFILL
8084
14
    } },
8085
14
    { &hf_osdmap_pgtmp, {
8086
14
      "Temporary Placement Group Mapping", "ceph.osdmap.pgtmp",
8087
14
      FT_NONE, BASE_NONE, NULL, 0,
8088
14
      NULL, HFILL
8089
14
    } },
8090
14
    { &hf_osdmap_pgtmp_pg, {
8091
14
      "Placement Group", "ceph.osdmap.pgtmp.pg",
8092
14
      FT_NONE, BASE_NONE, NULL, 0,
8093
14
      NULL, HFILL
8094
14
    } },
8095
14
    { &hf_osdmap_pgtmp_val, {
8096
14
      "Value", "ceph.osdmap.pgtmp.val",
8097
14
      FT_UINT32, BASE_DEC, NULL, 0,
8098
14
      NULL, HFILL
8099
14
    } },
8100
14
    { &hf_osdmap_primarytmp, {
8101
14
      "Temporary Primary Mapping", "ceph.osdmap.primarytmp",
8102
14
      FT_NONE, BASE_NONE, NULL, 0,
8103
14
      NULL, HFILL
8104
14
    } },
8105
14
    { &hf_osdmap_primarytmp_pg, {
8106
14
      "Placement Group", "ceph.osdmap.primarytmp.pg",
8107
14
      FT_NONE, BASE_NONE, NULL, 0,
8108
14
      NULL, HFILL
8109
14
    } },
8110
14
    { &hf_osdmap_primarytmp_val, {
8111
14
      "Value", "ceph.osdmap.primarytmp.val",
8112
14
      FT_UINT32, BASE_DEC, NULL, 0,
8113
14
      NULL, HFILL
8114
14
    } },
8115
14
    { &hf_osdmap_osd_primaryaffinity, {
8116
14
      "Primary Affinity", "ceph.osdmap.osd.primaryaffinity",
8117
14
      FT_UINT32, BASE_DEC, NULL, 0,
8118
14
      NULL, HFILL
8119
14
    } },
8120
14
    { &hf_crush, {
8121
14
      "CRUSH Rules", "ceph.crush",
8122
14
      FT_NONE, BASE_NONE, NULL, 0,
8123
14
      NULL, HFILL
8124
14
    } },
8125
14
    { &hf_osd_peerstat, {
8126
14
      "Peer Stat", "ceph.osd.peerstat",
8127
14
      FT_NONE, BASE_NONE, NULL, 0,
8128
14
      NULL, HFILL
8129
14
    } },
8130
14
    { &hf_osd_peerstat_timestamp, {
8131
14
      "Timestamp", "ceph.osd.peerstat.timestamp",
8132
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
8133
14
      NULL, HFILL
8134
14
    } },
8135
14
    { &hf_featureset_mask, {
8136
14
      "Feature Mask", "ceph.featureset.mask",
8137
14
      FT_UINT64, BASE_DEC, NULL, 0,
8138
14
      NULL, HFILL
8139
14
    } },
8140
14
    { &hf_featureset_name, {
8141
14
      "Name", "ceph.featureset.name",
8142
14
      FT_NONE, BASE_NONE, NULL, 0,
8143
14
      NULL, HFILL
8144
14
    } },
8145
14
    { &hf_featureset_name_val, {
8146
14
      "Value", "ceph.featureset.name.val",
8147
14
      FT_UINT64, BASE_DEC, NULL, 0,
8148
14
      NULL, HFILL
8149
14
    } },
8150
14
    { &hf_featureset_name_name, {
8151
14
      "Name", "ceph.featureset.name.name",
8152
14
      FT_STRING, BASE_NONE, NULL, 0,
8153
14
      NULL, HFILL
8154
14
    } },
8155
14
    { &hf_compatset, {
8156
14
      "Compat Set", "ceph.compatset",
8157
14
      FT_NONE, BASE_NONE, NULL, 0,
8158
14
      NULL, HFILL
8159
14
    } },
8160
14
    { &hf_compatset_compat, {
8161
14
      "Compatible", "ceph.compatset.compat",
8162
14
      FT_NONE, BASE_NONE, NULL, 0,
8163
14
      NULL, HFILL
8164
14
    } },
8165
14
    { &hf_compatset_compatro, {
8166
14
      "Read-Only Compatible", "ceph.compatset.rocompat",
8167
14
      FT_NONE, BASE_NONE, NULL, 0,
8168
14
      NULL, HFILL
8169
14
    } },
8170
14
    { &hf_compatset_incompat, {
8171
14
      "Incompatible", "ceph.compatset.incompat",
8172
14
      FT_NONE, BASE_NONE, NULL, 0,
8173
14
      NULL, HFILL
8174
14
    } },
8175
14
    { &hf_osdmap_erasurecodeprofile, {
8176
14
      "Erasure Code Profile", "ceph.osdmap.erasurecodeprofile",
8177
14
      FT_NONE, BASE_NONE, NULL, 0,
8178
14
      NULL, HFILL
8179
14
    } },
8180
14
    { &hf_osdmap_erasurecodeprofile_name, {
8181
14
      "Profile Name", "ceph.osdmap.erasurecodeprofile.name",
8182
14
      FT_STRING, BASE_NONE, NULL, 0,
8183
14
      NULL, HFILL
8184
14
    } },
8185
14
    { &hf_osdmap_erasurecodeprofile_prop, {
8186
14
      "Property", "ceph.osdmap.erasurecodeprofile.prop",
8187
14
      FT_NONE, BASE_NONE, NULL, 0,
8188
14
      NULL, HFILL
8189
14
    } },
8190
14
    { &hf_osdmap_erasurecodeprofile_k, {
8191
14
      "Key", "ceph.osdmap.erasurecodeprofile.key",
8192
14
      FT_STRING, BASE_NONE, NULL, 0,
8193
14
      NULL, HFILL
8194
14
    } },
8195
14
    { &hf_osdmap_erasurecodeprofile_v, {
8196
14
      "Value", "ceph.osdmap.erasurecodeprofile.value",
8197
14
      FT_STRING, BASE_NONE, NULL, 0,
8198
14
      NULL, HFILL
8199
14
    } },
8200
14
    { &hf_osdmap_osd, {
8201
14
      "OSD-Only Data", "ceph.osdmap.osd",
8202
14
      FT_NONE, BASE_NONE, NULL, 0,
8203
14
      NULL, HFILL
8204
14
    } },
8205
14
    { &hf_osdmap_hbaddr_back, {
8206
14
      "Cluster-side Heartbeat Address", "ceph.osdmap.nbbackaddr",
8207
14
      FT_NONE, BASE_NONE, NULL, 0,
8208
14
      "The address checked to ensure the OSD is reachable by "
8209
14
      "the cluster.", HFILL
8210
14
    } },
8211
14
    { &hf_osdmap_osd_info, {
8212
14
      "OSD Info", "ceph.osdmap.osd.info",
8213
14
      FT_NONE, BASE_NONE, NULL, 0,
8214
14
      NULL, HFILL
8215
14
    } },
8216
14
    { &hf_osdmap_blacklist, {
8217
14
      "Blacklist", "ceph.osdmap.blacklist",
8218
14
      FT_NONE, BASE_NONE, NULL, 0,
8219
14
      NULL, HFILL
8220
14
    } },
8221
14
    { &hf_osdmap_blacklist_addr, {
8222
14
      "Address", "ceph.osdmap.blacklist.addr",
8223
14
      FT_NONE, BASE_NONE, NULL, 0,
8224
14
      NULL, HFILL
8225
14
    } },
8226
14
    { &hf_osdmap_blacklist_time, {
8227
14
      "Time", "ceph.osdmap.blacklist.time",
8228
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
8229
14
      NULL, HFILL
8230
14
    } },
8231
14
    { &hf_osdmap_cluster_addr, {
8232
14
      "Cluster Address", "ceph.osdmap.cluster.addr",
8233
14
      FT_NONE, BASE_NONE, NULL, 0,
8234
14
      NULL, HFILL
8235
14
    } },
8236
14
    { &hf_osdmap_cluster_snapepoch, {
8237
14
      "Cluster Snapshot Epoch", "ceph.osdmap.cluster.snapepoch",
8238
14
      FT_UINT32, BASE_DEC, NULL, 0,
8239
14
      NULL, HFILL
8240
14
    } },
8241
14
    { &hf_osdmap_cluster_snap, {
8242
14
      "Cluster Snapshot", "ceph.osdmap.cluster.snap",
8243
14
      FT_STRING, BASE_NONE, NULL, 0,
8244
14
      NULL, HFILL
8245
14
    } },
8246
14
    { &hf_osdmap_osd_uuid, {
8247
14
      "OSD UUID", "ceph.osdmap.osd.uuid",
8248
14
      FT_GUID, BASE_NONE, NULL, 0,
8249
14
      NULL, HFILL
8250
14
    } },
8251
14
    { &hf_osdmap_osd_xinfo, {
8252
14
      "OSD xinfo", "ceph.osdmap.osd.xinfo",
8253
14
      FT_NONE, BASE_NONE, NULL, 0,
8254
14
      NULL, HFILL
8255
14
    } },
8256
14
    { &hf_osdmap_hbaddr_front, {
8257
14
      "Client-side Heartbeat Address", "ceph.osdmap.hbfrontaddr",
8258
14
      FT_NONE, BASE_NONE, NULL, 0,
8259
14
      "The address checked to ensure the OSD is reachable "
8260
14
      "by the client.", HFILL
8261
14
    } },
8262
14
    { &hf_osdmap_inc, {
8263
14
      "Incremental OSD Map", "ceph.osdmap_inc",
8264
14
      FT_NONE, BASE_NONE, NULL, 0,
8265
14
      NULL, HFILL
8266
14
    } },
8267
14
    { &hf_osdmap_inc_client, {
8268
14
      "Client-Usable Data", "ceph.osdmap_inc.client",
8269
14
      FT_NONE, BASE_NONE, NULL, 0,
8270
14
      NULL, HFILL
8271
14
    } },
8272
14
    { &hf_osdmap_inc_fsid, {
8273
14
      "FSID", "ceph.osdmap_inc.fsid",
8274
14
      FT_GUID, BASE_NONE, NULL, 0,
8275
14
      NULL, HFILL
8276
14
    } },
8277
14
    { &hf_osdmap_inc_osd, {
8278
14
      "OSD-Only Data", "ceph.osdmap_inc.osd",
8279
14
      FT_NONE, BASE_NONE, NULL, 0,
8280
14
      NULL, HFILL
8281
14
    } },
8282
14
    { &hf_connect, {
8283
14
      "Connection Negotiation", "ceph.connect",
8284
14
      FT_NONE, BASE_NONE, NULL, 0,
8285
14
      NULL, HFILL
8286
14
    } },
8287
14
    { &hf_features_low, {
8288
14
      "Features", "ceph.connect.features.low",
8289
14
      FT_UINT32, BASE_HEX, NULL, 0,
8290
14
      NULL, HFILL
8291
14
    } },
8292
14
    { &hf_features_high, {
8293
14
      "Features", "ceph.connect.features.high",
8294
14
      FT_UINT32, BASE_HEX, NULL, 0,
8295
14
      NULL, HFILL
8296
14
    } },
8297
14
    { &hf_feature_uid, {
8298
14
      "UID", "ceph.features.uid",
8299
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_UID,
8300
14
      NULL, HFILL
8301
14
    } },
8302
14
    { &hf_feature_nosrcaddr, {
8303
14
      "NOSRCADDR", "ceph.features.nosrcaddr",
8304
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_NOSRCADDR,
8305
14
      NULL, HFILL
8306
14
    } },
8307
14
    { &hf_feature_monclockcheck, {
8308
14
      "MONCLOCKCHECK", "ceph.features.monclockcheck",
8309
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MONCLOCKCHECK,
8310
14
      NULL, HFILL
8311
14
    } },
8312
14
    { &hf_feature_flock, {
8313
14
      "FLOCK", "ceph.features.flock",
8314
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_FLOCK,
8315
14
      NULL, HFILL
8316
14
    } },
8317
14
    { &hf_feature_subscribe2, {
8318
14
      "SUBSCRIBE2", "ceph.features.subscribe2",
8319
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_SUBSCRIBE2,
8320
14
      NULL, HFILL
8321
14
    } },
8322
14
    { &hf_feature_monnames, {
8323
14
      "MONNAMES", "ceph.features.monnames",
8324
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MONNAMES,
8325
14
      NULL, HFILL
8326
14
    } },
8327
14
    { &hf_feature_reconnect_seq, {
8328
14
      "RECONNECT_SEQ", "ceph.features.reconnect_seq",
8329
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_RECONNECT_SEQ,
8330
14
      NULL, HFILL
8331
14
    } },
8332
14
    { &hf_feature_dirlayouthash, {
8333
14
      "DIRLAYOUTHASH", "ceph.features.dirlayouthash",
8334
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_DIRLAYOUTHASH,
8335
14
      NULL, HFILL
8336
14
    } },
8337
14
    { &hf_feature_objectlocator, {
8338
14
      "OBJECTLOCATOR", "ceph.features.objectlocator",
8339
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OBJECTLOCATOR,
8340
14
      NULL, HFILL
8341
14
    } },
8342
14
    { &hf_feature_pgid64, {
8343
14
      "PGID64", "ceph.features.pgid64",
8344
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_PGID64,
8345
14
      NULL, HFILL
8346
14
    } },
8347
14
    { &hf_feature_incsubosdmap, {
8348
14
      "INCSUBOSDMAP", "ceph.features.incsubosdmap",
8349
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_INCSUBOSDMAP,
8350
14
      NULL, HFILL
8351
14
    } },
8352
14
    { &hf_feature_pgpool3, {
8353
14
      "PGPOOL3", "ceph.features.pgpool3",
8354
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_PGPOOL3,
8355
14
      NULL, HFILL
8356
14
    } },
8357
14
    { &hf_feature_osdreplymux, {
8358
14
      "OSDREPLYMUX", "ceph.features.osdreplymux",
8359
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSDREPLYMUX,
8360
14
      NULL, HFILL
8361
14
    } },
8362
14
    { &hf_feature_osdenc, {
8363
14
      "OSDENC", "ceph.features.osdenc",
8364
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSDENC,
8365
14
      NULL, HFILL
8366
14
    } },
8367
14
    { &hf_feature_omap, {
8368
14
      "OMAP", "ceph.features.omap",
8369
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OMAP,
8370
14
      NULL, HFILL
8371
14
    } },
8372
14
    { &hf_feature_monenc, {
8373
14
      "MONENC", "ceph.features.monenc",
8374
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MONENC,
8375
14
      NULL, HFILL
8376
14
    } },
8377
14
    { &hf_feature_query_t, {
8378
14
      "QUERY_T", "ceph.features.query_t",
8379
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_QUERY_T,
8380
14
      NULL, HFILL
8381
14
    } },
8382
14
    { &hf_feature_indep_pg_map, {
8383
14
      "INDEP_PG_MAP", "ceph.features.indep_pg_map",
8384
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_INDEP_PG_MAP,
8385
14
      NULL, HFILL
8386
14
    } },
8387
14
    { &hf_feature_crush_tunables, {
8388
14
      "CRUSH_TUNABLES", "ceph.features.crush_tunables",
8389
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_CRUSH_TUNABLES,
8390
14
      NULL, HFILL
8391
14
    } },
8392
14
    { &hf_feature_chunky_scrub, {
8393
14
      "CHUNKY_SCRUB", "ceph.features.chunky_scrub",
8394
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_CHUNKY_SCRUB,
8395
14
      NULL, HFILL
8396
14
    } },
8397
14
    { &hf_feature_mon_nullroute, {
8398
14
      "MON_NULLROUTE", "ceph.features.mon_nullroute",
8399
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MON_NULLROUTE,
8400
14
      NULL, HFILL
8401
14
    } },
8402
14
    { &hf_feature_mon_gv, {
8403
14
      "MON_GV", "ceph.features.mon_gv",
8404
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MON_GV,
8405
14
      NULL, HFILL
8406
14
    } },
8407
14
    { &hf_feature_backfill_reservation, {
8408
14
      "BACKFILL_RESERVATION", "ceph.features.backfill_reservation",
8409
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_BACKFILL_RESERVATION,
8410
14
      NULL, HFILL
8411
14
    } },
8412
14
    { &hf_feature_msg_auth, {
8413
14
      "MSG_AUTH", "ceph.features.msg_auth",
8414
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MSG_AUTH,
8415
14
      NULL, HFILL
8416
14
    } },
8417
14
    { &hf_feature_recovery_reservation, {
8418
14
      "RECOVERY_RESERVATION", "ceph.features.recovery_reservation",
8419
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_RECOVERY_RESERVATION,
8420
14
      NULL, HFILL
8421
14
    } },
8422
14
    { &hf_feature_crush_tunables2, {
8423
14
      "CRUSH_TUNABLES2", "ceph.features.crush_tunables2",
8424
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_CRUSH_TUNABLES2,
8425
14
      NULL, HFILL
8426
14
    } },
8427
14
    { &hf_feature_createpoolid, {
8428
14
      "CREATEPOOLID", "ceph.features.createpoolid",
8429
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_CREATEPOOLID,
8430
14
      NULL, HFILL
8431
14
    } },
8432
14
    { &hf_feature_reply_create_inode, {
8433
14
      "REPLY_CREATE_INODE", "ceph.features.reply_create_inode",
8434
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_REPLY_CREATE_INODE,
8435
14
      NULL, HFILL
8436
14
    } },
8437
14
    { &hf_feature_osd_hbmsgs, {
8438
14
      "OSD_HBMSGS", "ceph.features.osd_hbmsgs",
8439
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_HBMSGS,
8440
14
      NULL, HFILL
8441
14
    } },
8442
14
    { &hf_feature_mdsenc, {
8443
14
      "MDSENC", "ceph.features.mdsenc",
8444
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MDSENC,
8445
14
      NULL, HFILL
8446
14
    } },
8447
14
    { &hf_feature_osdhashpspool, {
8448
14
      "OSDHASHPSPOOL", "ceph.features.osdhashpspool",
8449
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSDHASHPSPOOL,
8450
14
      NULL, HFILL
8451
14
    } },
8452
14
    { &hf_feature_mon_single_paxos, {
8453
14
      "MON_SINGLE_PAXOS", "ceph.features.mon_single_paxos",
8454
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MON_SINGLE_PAXOS,
8455
14
      NULL, HFILL
8456
14
    } },
8457
14
    { &hf_feature_osd_snapmapper, {
8458
14
      "OSD_SNAPMAPPER", "ceph.features.osd_snapmapper",
8459
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_SNAPMAPPER,
8460
14
      NULL, HFILL
8461
14
    } },
8462
14
    { &hf_feature_mon_scrub, {
8463
14
      "MON_SCRUB", "ceph.features.mon_scrub",
8464
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MON_SCRUB,
8465
14
      NULL, HFILL
8466
14
    } },
8467
14
    { &hf_feature_osd_packed_recovery, {
8468
14
      "OSD_PACKED_RECOVERY", "ceph.features.osd_packed_recovery",
8469
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_PACKED_RECOVERY,
8470
14
      NULL, HFILL
8471
14
    } },
8472
14
    { &hf_feature_osd_cachepool, {
8473
14
      "OSD_CACHEPOOL", "ceph.features.osd_cachepool",
8474
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_CACHEPOOL,
8475
14
      NULL, HFILL
8476
14
    } },
8477
14
    { &hf_feature_crush_v2, {
8478
14
      "CRUSH_V2", "ceph.features.crush_v2",
8479
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_CRUSH_V2,
8480
14
      NULL, HFILL
8481
14
    } },
8482
14
    { &hf_feature_export_peer, {
8483
14
      "EXPORT_PEER", "ceph.features.export_peer",
8484
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_EXPORT_PEER,
8485
14
      NULL, HFILL
8486
14
    } },
8487
14
    { &hf_feature_osd_erasure_codes, {
8488
14
      "OSD_ERASURE_CODES", "ceph.features.osd_erasure_codes",
8489
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_ERASURE_CODES,
8490
14
      NULL, HFILL
8491
14
    } },
8492
14
    { &hf_feature_osd_tmap2omap, {
8493
14
      "OSD_TMAP2OMAP", "ceph.features.osd_tmap2omap",
8494
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_TMAP2OMAP,
8495
14
      NULL, HFILL
8496
14
    } },
8497
14
    { &hf_feature_osdmap_enc, {
8498
14
      "OSDMAP_ENC", "ceph.features.osdmap_enc",
8499
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSDMAP_ENC,
8500
14
      NULL, HFILL
8501
14
    } },
8502
14
    { &hf_feature_mds_inline_data, {
8503
14
      "MDS_INLINE_DATA", "ceph.features.mds_inline_data",
8504
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MDS_INLINE_DATA,
8505
14
      NULL, HFILL
8506
14
    } },
8507
14
    { &hf_feature_crush_tunables3, {
8508
14
      "CRUSH_TUNABLES3", "ceph.features.crush_tunables3",
8509
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_CRUSH_TUNABLES3,
8510
14
      NULL, HFILL
8511
14
    } },
8512
14
    { &hf_feature_osd_primary_affinity, {
8513
14
      "OSD_PRIMARY_AFFINITY", "ceph.features.osd_primary_affinity",
8514
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_OSD_PRIMARY_AFFINITY,
8515
14
      NULL, HFILL
8516
14
    } },
8517
14
    { &hf_feature_msgr_keepalive2, {
8518
14
      "MSGR_KEEPALIVE2", "ceph.features.msgr_keepalive2",
8519
14
      FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), C_FEATURE_MSGR_KEEPALIVE2,
8520
14
      NULL, HFILL
8521
14
    } },
8522
14
    { &hf_feature_reserved, {
8523
14
      "RESERVED", "ceph.features.reserved",
8524
14
      FT_BOOLEAN, 32, TFS(&tfs_set_notset), C_FEATURE_RESERVED,
8525
14
      NULL, HFILL
8526
14
    } },
8527
14
    { &hf_connect_host_type, {
8528
14
      "Host Type", "ceph.connect.host",
8529
14
      FT_UINT32, BASE_HEX, VALS(c_node_type_strings), 0,
8530
14
      "The type of host.", HFILL
8531
14
    } },
8532
14
    { &hf_connect_seq_global, {
8533
14
      "Global Sequence Number", "ceph.connect.global_seq",
8534
14
      FT_UINT32, BASE_DEC, NULL, 0,
8535
14
      "The number of connections initiated by this host.", HFILL
8536
14
    } },
8537
14
    { &hf_connect_seq, {
8538
14
      "Sequence Number", "ceph.connect.seq",
8539
14
      FT_UINT32, BASE_DEC, NULL, 0,
8540
14
      "The number of connections initiated this session.", HFILL
8541
14
    } },
8542
14
    { &hf_connect_proto_ver, {
8543
14
      "Protocol Version", "ceph.connect.ver",
8544
14
      FT_UINT32, BASE_DEC, NULL, 0,
8545
14
      "The protocol version to use.", HFILL
8546
14
    } },
8547
14
    { &hf_connect_auth_proto, {
8548
14
      "Authentication Protocol", "ceph.connect.auth.proto",
8549
14
      FT_UINT32, BASE_DEC, NULL, 0,
8550
14
      "The authentication protocol to use.", HFILL
8551
14
    } },
8552
14
    { &hf_connect_auth_size, {
8553
14
      "Authentication Size", "ceph.connect.auth.size",
8554
14
      FT_UINT32, BASE_DEC, NULL, 0,
8555
14
      "The size of the authentication.", HFILL
8556
14
    } },
8557
14
    { &hf_connect_auth, {
8558
14
      "Authentication", "ceph.connect.auth",
8559
14
      FT_BYTES, BASE_NONE, NULL, 0,
8560
14
      "Authentication data.", HFILL
8561
14
    } },
8562
14
    { &hf_flags, {
8563
14
      "Flags", "ceph.connect.flags",
8564
14
      FT_UINT8, BASE_HEX, NULL, 0,
8565
14
      NULL, HFILL
8566
14
    } },
8567
14
    { &hf_flag_lossy, {
8568
14
      "Lossy", "ceph.flags.lossy",
8569
14
      FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), C_FLAG_LOSSY,
8570
14
      "Messages may be safely dropped.", HFILL
8571
14
    } },
8572
14
    { &hf_osd_flags, {
8573
14
      "OSD Flags", "ceph.osd_flags",
8574
14
      FT_UINT32, BASE_HEX, NULL, 0,
8575
14
      NULL, HFILL
8576
14
    } },
8577
14
    { &hf_osd_flag_ack, {
8578
14
      "ACK", "ceph.osd_flags.ack",
8579
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_ACK,
8580
14
      "want (or is) \"ack\" ack", HFILL
8581
14
    } },
8582
14
    { &hf_osd_flag_onnvram, {
8583
14
      "ACK on NVRAM", "ceph.osd_flags.onnvram",
8584
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_ONNVRAM,
8585
14
      "want (or is) \"onnvram\" ack", HFILL
8586
14
    } },
8587
14
    { &hf_osd_flag_ondisk, {
8588
14
      "ACK on DISK", "ceph.osd_flags.ondisk",
8589
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_ONDISK,
8590
14
      "want (or is) \"ondisk\" ack", HFILL
8591
14
    } },
8592
14
    { &hf_osd_flag_retry, {
8593
14
      "Retry", "ceph.osd_flags.retry",
8594
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_RETRY,
8595
14
      "resend attempt", HFILL
8596
14
    } },
8597
14
    { &hf_osd_flag_read, {
8598
14
      "Read", "ceph.osd_flags.read",
8599
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_READ,
8600
14
      "op may read", HFILL
8601
14
    } },
8602
14
    { &hf_osd_flag_write, {
8603
14
      "Write", "ceph.osd_flags.write",
8604
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_WRITE,
8605
14
      "op may write", HFILL
8606
14
    } },
8607
14
    { &hf_osd_flag_ordersnap, {
8608
14
      "ORDERSNAP", "ceph.osd_flags.ordersnap",
8609
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_ORDERSNAP,
8610
14
      "EOLDSNAP if snapc is out of order", HFILL
8611
14
    } },
8612
14
    { &hf_osd_flag_peerstat_old, {
8613
14
      "PEERSTAT_OLD", "ceph.osd_flags.peerstat_old",
8614
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_PEERSTAT_OLD,
8615
14
      "DEPRECATED msg includes osd_peer_stat", HFILL
8616
14
    } },
8617
14
    { &hf_osd_flag_balance_reads, {
8618
14
      "BALANCE_READS", "ceph.osd_flags.balance_reads",
8619
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_BALANCE_READS,
8620
14
      NULL, HFILL
8621
14
    } },
8622
14
    { &hf_osd_flag_parallelexec, {
8623
14
      "PARALLELEXEC", "ceph.osd_flags.parallelexec",
8624
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_PARALLELEXEC,
8625
14
      "execute op in parallel", HFILL
8626
14
    } },
8627
14
    { &hf_osd_flag_pgop, {
8628
14
      "PGOP", "ceph.osd_flags.pgop",
8629
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_PGOP,
8630
14
      "pg op, no object", HFILL
8631
14
    } },
8632
14
    { &hf_osd_flag_exec, {
8633
14
      "EXEC", "ceph.osd_flags.exec",
8634
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_EXEC,
8635
14
      "op may exec", HFILL
8636
14
    } },
8637
14
    { &hf_osd_flag_exec_public, {
8638
14
      "EXEC_PUBLIC", "ceph.osd_flags.exec_public",
8639
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_EXEC_PUBLIC,
8640
14
      "DEPRECATED op may exec (public)", HFILL
8641
14
    } },
8642
14
    { &hf_osd_flag_localize_reads, {
8643
14
      "LOCALIZE_READS", "ceph.osd_flags.localize_reads",
8644
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_LOCALIZE_READS,
8645
14
      "read from nearby replica, if any", HFILL
8646
14
    } },
8647
14
    { &hf_osd_flag_rwordered, {
8648
14
      "RWORDERED", "ceph.osd_flags.rwordered",
8649
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_RWORDERED,
8650
14
      "order wrt concurrent reads", HFILL
8651
14
    } },
8652
14
    { &hf_osd_flag_ignore_cache, {
8653
14
      "IGNORE_CACHE", "ceph.osd_flags.ignore_cache",
8654
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_IGNORE_CACHE,
8655
14
      "ignore cache logic", HFILL
8656
14
    } },
8657
14
    { &hf_osd_flag_skiprwlocks, {
8658
14
      "SKIPRWLOCKS", "ceph.osd_flags.skiprwlocks",
8659
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_SKIPRWLOCKS,
8660
14
      "skip rw locks", HFILL
8661
14
    } },
8662
14
    { &hf_osd_flag_ignore_overlay, {
8663
14
      "IGNORE_OVERLAY", "ceph.osd_flags.ignore_overlay",
8664
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_IGNORE_OVERLAY,
8665
14
      "ignore pool overlay", HFILL
8666
14
    } },
8667
14
    { &hf_osd_flag_flush, {
8668
14
      "FLUSH", "ceph.osd_flags.flush",
8669
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_FLUSH,
8670
14
      "this is part of flush", HFILL
8671
14
    } },
8672
14
    { &hf_osd_flag_map_snap_clone, {
8673
14
      "MAP_SNAP_CLONE", "ceph.osd_flags.map_snap_clone",
8674
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_MAP_SNAP_CLONE,
8675
14
      "map snap direct to clone id", HFILL
8676
14
    } },
8677
14
    { &hf_osd_flag_enforce_snapc, {
8678
14
      "ENFORCE_SNAPC", "ceph.osd_flags.enforce_snapc",
8679
14
      FT_BOOLEAN, 32, TFS(&tfs_yes_no), C_OSD_FLAG_ENFORCE_SNAPC,
8680
14
      "use snapc provided even if pool uses pool snaps", HFILL
8681
14
    } },
8682
14
    { &hf_osd_op_type, {
8683
14
      "Operation", "ceph.osd_op.op",
8684
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &c_osd_optype_strings_ext, 0,
8685
14
      NULL, HFILL
8686
14
    } },
8687
14
    { &hf_osd_op_data, {
8688
14
      "Operation Specific Data", "ceph.osd_op.data",
8689
14
      FT_BYTES, BASE_NONE, NULL, 0,
8690
14
      NULL, HFILL
8691
14
    } },
8692
14
    { &hf_osd_op_extent_off, {
8693
14
      "Offset", "ceph.osd_op.extent.offset",
8694
14
      FT_UINT64, BASE_DEC, NULL, 0,
8695
14
      NULL, HFILL
8696
14
    } },
8697
14
    { &hf_osd_op_extent_size, {
8698
14
      "Size", "ceph.osd_op.extent.size",
8699
14
      FT_UINT64, BASE_DEC, NULL, 0,
8700
14
      NULL, HFILL
8701
14
    } },
8702
14
    { &hf_osd_op_extent_trunc_size, {
8703
14
      "Truncate Size", "ceph.osd_op.extent.trunc_size",
8704
14
      FT_UINT64, BASE_DEC, NULL, 0,
8705
14
      NULL, HFILL
8706
14
    } },
8707
14
    { &hf_osd_op_extent_trunc_seq, {
8708
14
      "Truncate Sequence", "ceph.osd_op.extent.trunc_seq",
8709
14
      FT_UINT64, BASE_DEC, NULL, 0,
8710
14
      NULL, HFILL
8711
14
    } },
8712
14
    { &hf_osd_op_payload_size, {
8713
14
      "Payload Size", "ceph.osd_op.payload_size",
8714
14
      FT_UINT32, BASE_DEC, NULL, 0,
8715
14
      NULL, HFILL
8716
14
    } },
8717
14
    { &hf_osd_redirect_oloc, {
8718
14
      "Object Locater", "ceph.osd_redirect.oloc",
8719
14
      FT_NONE, BASE_NONE, NULL, 0,
8720
14
      NULL, HFILL
8721
14
    } },
8722
14
    { &hf_osd_redirect_obj, {
8723
14
      "Object Name", "ceph.osd_redirect.obj",
8724
14
      FT_BYTES, BASE_NONE, NULL, 0,
8725
14
      "Redirect to this object.", HFILL
8726
14
    } },
8727
14
    { &hf_osd_redirect_osdinstr, {
8728
14
      "OSD Instructions", "ceph.osd_redirect.osd_instructions",
8729
14
      FT_NONE, BASE_NONE, NULL, 0,
8730
14
      "Instructions to pass to the new target.", HFILL
8731
14
    } },
8732
14
    { &hf_osd_redirect_osdinstr_data, {
8733
14
      "Data", "ceph.osd_redirect.osd_instructions_data",
8734
14
      FT_BYTES, BASE_NONE, NULL, 0,
8735
14
      NULL, HFILL
8736
14
    } },
8737
14
    { &hf_osd_redirect_osdinstr_len, {
8738
14
      "Length", "ceph.osd_redirect.osd_instructions_len",
8739
14
      FT_UINT32, BASE_DEC, NULL, 0,
8740
14
      NULL, HFILL
8741
14
    } },
8742
14
    { &hf_statsum_bytes, {
8743
14
      "Bytes", "ceph.statsum.bytes",
8744
14
      FT_UINT64, BASE_DEC, NULL, 0,
8745
14
      "The space used in bytes.", HFILL
8746
14
    } },
8747
14
    { &hf_statsum_objects, {
8748
14
      "Objects", "ceph.statsum.objects",
8749
14
      FT_UINT64, BASE_DEC, NULL, 0,
8750
14
      "The number of logical objects.", HFILL
8751
14
    } },
8752
14
    { &hf_statsum_clones, {
8753
14
      "Clones", "ceph.statsum.clones",
8754
14
      FT_UINT64, BASE_DEC, NULL, 0,
8755
14
      NULL, HFILL
8756
14
    } },
8757
14
    { &hf_statsum_copies, {
8758
14
      "Copies", "ceph.statsum.copies",
8759
14
      FT_UINT64, BASE_DEC, NULL, 0,
8760
14
      "The total number of objects including redundant "
8761
14
      "copies (objects*replicas).", HFILL
8762
14
    } },
8763
14
    { &hf_statsum_missing, {
8764
14
      "Missing Objects", "ceph.statsum.missing",
8765
14
      FT_UINT64, BASE_DEC, NULL, 0,
8766
14
      NULL, HFILL
8767
14
    } },
8768
14
    { &hf_statsum_degraded, {
8769
14
      "Degraded Objects", "ceph.statsum.degraded",
8770
14
      FT_UINT64, BASE_DEC, NULL, 0,
8771
14
      "Number of objects that are on at least one OSD but "
8772
14
      "less then they should be.", HFILL
8773
14
    } },
8774
14
    { &hf_statsum_unfound, {
8775
14
      "Unfound Objects", "ceph.statsum.unfound",
8776
14
      FT_UINT64, BASE_DEC, NULL, 0,
8777
14
      "Number of objects with no copies.", HFILL
8778
14
    } },
8779
14
    { &hf_statsum_read_bytes, {
8780
14
      "Bytes Read", "ceph.statsum.read_bytes",
8781
14
      FT_UINT64, BASE_DEC, NULL, 0,
8782
14
      NULL, HFILL
8783
14
    } },
8784
14
    { &hf_statsum_read_kbytes, {
8785
14
      "Kibibytes Read", "ceph.statsum.read_kbytes",
8786
14
      FT_UINT64, BASE_DEC, NULL, 0,
8787
14
      "The number of KiB (2^10) read.", HFILL
8788
14
    } },
8789
14
    { &hf_statsum_written_bytes, {
8790
14
      "Bytes Written", "ceph.statsum.written_bytes",
8791
14
      FT_UINT64, BASE_DEC, NULL, 0,
8792
14
      NULL, HFILL
8793
14
    } },
8794
14
    { &hf_statsum_written_kbytes, {
8795
14
      "Kibibytes Written", "ceph.statsum.written_kbytes",
8796
14
      FT_UINT64, BASE_DEC, NULL, 0,
8797
14
      "The number of KiB (2^10) written.", HFILL
8798
14
    } },
8799
14
    { &hf_statsum_scrub_errors, {
8800
14
      "Scrub Errors", "ceph.statsum.scrub_errors",
8801
14
      FT_UINT64, BASE_DEC, NULL, 0,
8802
14
      "Total scrub errors. (shallow+deep)", HFILL
8803
14
    } },
8804
14
    { &hf_statsum_recovered, {
8805
14
      "Recovered Objects", "ceph.statsum.recovered",
8806
14
      FT_UINT64, BASE_DEC, NULL, 0,
8807
14
      NULL, HFILL
8808
14
    } },
8809
14
    { &hf_statsum_bytes_recovered, {
8810
14
      "Recovered Bytes", "ceph.statsum.bytes_recovered",
8811
14
      FT_UINT64, BASE_DEC, NULL, 0,
8812
14
      NULL, HFILL
8813
14
    } },
8814
14
    { &hf_statsum_keys_recovered, {
8815
14
      "Keys Recovered", "ceph.statsum.keys_recovered",
8816
14
      FT_UINT64, BASE_DEC, NULL, 0,
8817
14
      NULL, HFILL
8818
14
    } },
8819
14
    { &hf_statsum_shallow_scrub_errors, {
8820
14
      "Shallow Scrub Errors", "ceph.statsum.shallow_scrub_errors",
8821
14
      FT_UINT64, BASE_DEC, NULL, 0,
8822
14
      NULL, HFILL
8823
14
    } },
8824
14
    { &hf_statsum_deep_scrub_errors, {
8825
14
      "Deep Scrub Errors", "ceph.statsum.deep_scrub_errors",
8826
14
      FT_UINT64, BASE_DEC, NULL, 0,
8827
14
      NULL, HFILL
8828
14
    } },
8829
14
    { &hf_statsum_dirty, {
8830
14
      "Dirty Objects", "ceph.statsum.dirty",
8831
14
      FT_UINT64, BASE_DEC, NULL, 0,
8832
14
      NULL, HFILL
8833
14
    } },
8834
14
    { &hf_statsum_whiteouts, {
8835
14
      "Whiteouts", "ceph.statsum.whiteouts",
8836
14
      FT_UINT64, BASE_DEC, NULL, 0,
8837
14
      NULL, HFILL
8838
14
    } },
8839
14
    { &hf_statsum_omap, {
8840
14
      "OMAP Objects", "ceph.statsum.omap",
8841
14
      FT_UINT64, BASE_DEC, NULL, 0,
8842
14
      NULL, HFILL
8843
14
    } },
8844
14
    { &hf_statsum_hitset_archive, {
8845
14
      "Hit Set Archive", "ceph.statsum.hitset_archive",
8846
14
      FT_UINT64, BASE_DEC, NULL, 0,
8847
14
      NULL, HFILL
8848
14
    } },
8849
14
    { &hf_connect_reply, {
8850
14
      "Connection Negotiation Reply", "ceph.connect_reply",
8851
14
      FT_NONE, BASE_NONE, NULL, 0,
8852
14
      NULL, HFILL
8853
14
    } },
8854
14
    { &hf_tag, {
8855
14
      "Tag", "ceph.tag",
8856
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &c_tag_strings_ext, 0,
8857
14
      NULL, HFILL
8858
14
    } },
8859
14
    { &hf_ack, {
8860
14
      "Acknowledgment", "ceph.ack",
8861
14
      FT_UINT64, BASE_DEC, NULL, 0,
8862
14
      NULL, HFILL
8863
14
    } },
8864
14
    { &hf_seq_existing, {
8865
14
      "Existing Sequence Number", "ceph.seq_existing",
8866
14
      FT_UINT64, BASE_DEC, NULL, 0,
8867
14
      NULL, HFILL
8868
14
    } },
8869
14
    { &hf_seq_new, {
8870
14
      "Newly Acknowledged Sequence Number", "ceph.seq_new",
8871
14
      FT_UINT64, BASE_DEC, NULL, 0,
8872
14
      NULL, HFILL
8873
14
    } },
8874
14
    { &hf_head, {
8875
14
      "Message Header", "ceph.head",
8876
14
      FT_NONE, BASE_NONE, NULL, 0,
8877
14
      NULL, HFILL
8878
14
    } },
8879
14
    { &hf_head_seq, {
8880
14
      "Sequence Number", "ceph.seq",
8881
14
      FT_UINT64, BASE_DEC, NULL, 0,
8882
14
      NULL, HFILL
8883
14
    } },
8884
14
    { &hf_head_tid, {
8885
14
      "Transaction ID", "ceph.tid",
8886
14
      FT_UINT64, BASE_DEC, NULL, 0,
8887
14
      NULL, HFILL
8888
14
    } },
8889
14
    { &hf_head_type, {
8890
14
      "Type", "ceph.type",
8891
14
      FT_UINT16, BASE_HEX|BASE_EXT_STRING, &c_msg_type_strings_ext, 0,
8892
14
      "Message type.", HFILL
8893
14
    } },
8894
14
    { &hf_head_priority, {
8895
14
      "Priority", "ceph.priority",
8896
14
      FT_UINT16, BASE_DEC, NULL, 0,
8897
14
      "The priority of this message, higher the more urgent.", HFILL
8898
14
    } },
8899
14
    { &hf_head_version, {
8900
14
      "Version", "ceph.head_version",
8901
14
      FT_UINT16, BASE_DEC, NULL, 0,
8902
14
      NULL, HFILL
8903
14
    } },
8904
14
    { &hf_head_front_size, {
8905
14
      "Front Size", "ceph.front_size",
8906
14
      FT_UINT32, BASE_DEC, NULL, 0,
8907
14
      NULL, HFILL
8908
14
    } },
8909
14
    { &hf_head_middle_size, {
8910
14
      "Middle Size", "ceph.middle_size",
8911
14
      FT_UINT32, BASE_DEC, NULL, 0,
8912
14
      NULL, HFILL
8913
14
    } },
8914
14
    { &hf_head_data_size, {
8915
14
      "Data Size", "ceph.data_size",
8916
14
      FT_UINT32, BASE_DEC, NULL, 0,
8917
14
      NULL, HFILL
8918
14
    } },
8919
14
    { &hf_head_data_off, {
8920
14
      "Data Offset", "ceph.data_off",
8921
14
      FT_UINT16, BASE_DEC, NULL, 0,
8922
14
      NULL, HFILL
8923
14
    } },
8924
14
    { &hf_head_srcname, {
8925
14
      "Source Name", "ceph.node",
8926
14
      FT_NONE, BASE_NONE, NULL, 0,
8927
14
      NULL, HFILL
8928
14
    } },
8929
14
    { &hf_head_compat_version, {
8930
14
      "Compatibility Version", "ceph.compat_version",
8931
14
      FT_UINT64, BASE_DEC, NULL, 0,
8932
14
      "The oldest code that can probably decode this message.", HFILL
8933
14
    } },
8934
14
    { &hf_head_reserved, {
8935
14
      "Reserved", "ceph.reserved",
8936
14
      FT_UINT16, BASE_HEX, NULL, 0,
8937
14
      NULL, HFILL
8938
14
    } },
8939
14
    { &hf_head_crc, {
8940
14
      "CRC Checksum", "ceph.crc",
8941
14
      FT_UINT32, BASE_HEX, NULL, 0,
8942
14
      NULL, HFILL
8943
14
    } },
8944
14
    { &hf_foot, {
8945
14
      "Message Footer", "ceph.foot",
8946
14
      FT_NONE, BASE_NONE, NULL, 0,
8947
14
      NULL, HFILL
8948
14
    } },
8949
14
    { &hf_foot_front_crc, {
8950
14
      "Front Checksum", "ceph.foot.front_crc",
8951
14
      FT_UINT32, BASE_HEX, NULL, 0,
8952
14
      NULL, HFILL
8953
14
    } },
8954
14
    { &hf_foot_middle_crc, {
8955
14
      "Middle Checksum", "ceph.foot.middle_crc",
8956
14
      FT_UINT32, BASE_HEX, NULL, 0,
8957
14
      NULL, HFILL
8958
14
    } },
8959
14
    { &hf_foot_data_crc, {
8960
14
      "Data Checksum", "ceph.foot.data_crc",
8961
14
      FT_UINT32, BASE_HEX, NULL, 0,
8962
14
      NULL, HFILL
8963
14
    } },
8964
14
    { &hf_foot_signature, {
8965
14
      "Signature", "ceph.foot.signature",
8966
14
      FT_UINT64, BASE_HEX, NULL, 0,
8967
14
      NULL, HFILL
8968
14
    } },
8969
14
    { &hf_msg_front, {
8970
14
      "Front", "ceph.front",
8971
14
      FT_BYTES, BASE_NONE, NULL, 0,
8972
14
      NULL, HFILL
8973
14
    } },
8974
14
    { &hf_msg_middle, {
8975
14
      "Middle", "ceph.mid",
8976
14
      FT_BYTES, BASE_NONE, NULL, 0,
8977
14
      NULL, HFILL
8978
14
    } },
8979
14
    { &hf_msg_data, {
8980
14
      "Data", "ceph.data",
8981
14
      FT_BYTES, BASE_NONE, NULL, 0,
8982
14
      NULL, HFILL
8983
14
    } },
8984
14
    { &hf_statcollection, {
8985
14
      "Stats", "ceph.statcollection",
8986
14
      FT_NONE, BASE_NONE, NULL, 0,
8987
14
      NULL, HFILL
8988
14
    } },
8989
14
    { &hf_paxos, {
8990
14
      "Paxos Message", "ceph.paxos",
8991
14
      FT_NONE, BASE_NONE, NULL, 0,
8992
14
      NULL, HFILL
8993
14
    } },
8994
14
    { &hf_paxos_ver, {
8995
14
      "Paxos Version", "ceph.paxos.ver",
8996
14
      FT_UINT64, BASE_DEC, NULL, 0,
8997
14
      NULL, HFILL
8998
14
    } },
8999
14
    { &hf_paxos_mon, {
9000
14
      "Mon", "ceph.paxos.mon",
9001
14
      FT_INT16, BASE_DEC, NULL, 0,
9002
14
      NULL, HFILL
9003
14
    } },
9004
14
    { &hf_paxos_mon_tid, {
9005
14
      "Mon Transaction ID", "ceph.paxos.tid",
9006
14
      FT_UINT64, BASE_DEC, NULL, 0,
9007
14
      NULL, HFILL
9008
14
    } },
9009
14
    { &hf_msg_mon_map, {
9010
14
      "Mon Map Message", "ceph.msg.mon_map",
9011
14
      FT_NONE, BASE_NONE, NULL, 0,
9012
14
      NULL, HFILL
9013
14
    } },
9014
14
    { &hf_msg_statfs, {
9015
14
      "Stat Filesystem", "ceph.msg.statfs",
9016
14
      FT_NONE, BASE_NONE, NULL, 0,
9017
14
      NULL, HFILL
9018
14
    } },
9019
14
    { &hf_msg_statfs_fsid, {
9020
14
      "FSID", "ceph.msg.statfs.fsid",
9021
14
      FT_GUID, BASE_NONE, NULL, 0,
9022
14
      NULL, HFILL
9023
14
    } },
9024
14
    { &hf_msg_statfsreply, {
9025
14
      "Stat Filesystem Reply", "ceph.msg.statfsreply",
9026
14
      FT_NONE, BASE_NONE, NULL, 0,
9027
14
      NULL, HFILL
9028
14
    } },
9029
14
    { &hf_msg_statfsreply_fsid, {
9030
14
      "FSID", "ceph.msg.statfsreply.fsid",
9031
14
      FT_GUID, BASE_NONE, NULL, 0,
9032
14
      NULL, HFILL
9033
14
    } },
9034
14
    { &hf_msg_statfsreply_ver, {
9035
14
      "Version", "ceph.msg.statfsreply.ver",
9036
14
      FT_UINT64, BASE_DEC, NULL, 0,
9037
14
      NULL, HFILL
9038
14
    } },
9039
14
    { &hf_msg_statfsreply_kb, {
9040
14
      "Kibibytes", "ceph.msg.statfsreply.kb",
9041
14
      FT_UINT64, BASE_DEC, NULL, 0,
9042
14
      NULL, HFILL
9043
14
    } },
9044
14
    { &hf_msg_statfsreply_kbused, {
9045
14
      "Kibibytes Used", "ceph.msg.statfsreply.kbused",
9046
14
      FT_UINT64, BASE_DEC, NULL, 0,
9047
14
      NULL, HFILL
9048
14
    } },
9049
14
    { &hf_msg_statfsreply_kbavail, {
9050
14
      "Kibibytes Available", "ceph.msg.statfsreply.kbavail",
9051
14
      FT_UINT64, BASE_DEC, NULL, 0,
9052
14
      NULL, HFILL
9053
14
    } },
9054
14
    { &hf_msg_statfsreply_obj, {
9055
14
      "Number of Objects", "ceph.msg.statfsreply.obj",
9056
14
      FT_UINT64, BASE_DEC, NULL, 0,
9057
14
      NULL, HFILL
9058
14
    } },
9059
14
    { &hf_msg_mon_sub, {
9060
14
      "Mon Subscribe Message", "ceph.msg.mon_sub",
9061
14
      FT_NONE, BASE_NONE, NULL, 0,
9062
14
      NULL, HFILL
9063
14
    } },
9064
14
    { &hf_msg_mon_sub_item, {
9065
14
      "Subscription Item", "ceph.msg.mon_sub.item",
9066
14
      FT_NONE, BASE_NONE, NULL, 0,
9067
14
      NULL, HFILL
9068
14
    } },
9069
14
    { &hf_msg_mon_sub_item_len, {
9070
14
      "Number of items", "ceph.msg.mon_sub.item_len",
9071
14
      FT_UINT32, BASE_DEC, NULL, 0,
9072
14
      NULL, HFILL
9073
14
    } },
9074
14
    { &hf_msg_mon_sub_what, {
9075
14
      "What", "ceph.msg.mon_sub.what",
9076
14
      FT_STRING, BASE_NONE, NULL, 0,
9077
14
      "What to subscribe to.", HFILL
9078
14
    } },
9079
14
    { &hf_msg_mon_sub_start, {
9080
14
      "Start Time", "ceph.msg.mon_sub.start",
9081
14
      FT_UINT64, BASE_DEC, NULL, 0,
9082
14
      NULL, HFILL
9083
14
    } },
9084
14
    { &hf_msg_mon_sub_flags, {
9085
14
      "Flags", "ceph.msg.mon_sub.flags",
9086
14
      FT_UINT8, BASE_HEX, NULL, 0,
9087
14
      NULL, HFILL
9088
14
    } },
9089
14
    { &hf_msg_mon_sub_flags_onetime, {
9090
14
      "One Time", "ceph.msg.mon_sub.flags.onetime",
9091
14
      FT_BOOLEAN, 8, TFS(&tfs_yes_no), C_MON_SUB_FLAG_ONETIME,
9092
14
      NULL, HFILL
9093
14
    } },
9094
14
    { &hf_msg_mon_sub_ack, {
9095
14
      "Subscription Acknowledgment", "ceph.msg.mon_sub_ack",
9096
14
      FT_NONE, BASE_NONE, NULL, 0,
9097
14
      NULL, HFILL
9098
14
    } },
9099
14
    { &hf_msg_mon_sub_ack_interval, {
9100
14
      "Interval", "ceph.msg.mon_sub_ack.interval",
9101
14
      FT_UINT32, BASE_DEC, NULL, 0,
9102
14
      NULL, HFILL
9103
14
    } },
9104
14
    { &hf_msg_mon_sub_ack_fsid, {
9105
14
      "FSID", "ceph.msg.mon_sub_ack.fsid",
9106
14
      FT_GUID, BASE_NONE, NULL, 0,
9107
14
      NULL, HFILL
9108
14
    } },
9109
14
    { &hf_msg_auth, {
9110
14
      "Auth Message", "ceph.msg.auth",
9111
14
      FT_NONE, BASE_NONE, NULL, 0,
9112
14
      NULL, HFILL
9113
14
    } },
9114
14
    { &hf_msg_auth_proto, {
9115
14
      "Protocol", "ceph.msg.auth.proto",
9116
14
      FT_UINT32, BASE_HEX, VALS(c_auth_proto_strings), 0,
9117
14
      NULL, HFILL
9118
14
    } },
9119
14
    { &hf_msg_auth_supportedproto, {
9120
14
      "Supported Protocols", "ceph.msg.auth.supportedproto",
9121
14
      FT_NONE, BASE_NONE, NULL, 0,
9122
14
      NULL, HFILL
9123
14
    } },
9124
14
    { &hf_msg_auth_supportedproto_ver, {
9125
14
      "Encoding Version", "ceph.msg.auth.supportedproto.ver",
9126
14
      FT_UINT8, BASE_DEC, NULL, 0,
9127
14
      NULL, HFILL
9128
14
    } },
9129
14
    { &hf_msg_auth_supportedproto_proto, {
9130
14
      "Supported Protocol", "ceph.msg.auth.supportedproto.proto",
9131
14
      FT_UINT32, BASE_HEX, VALS(c_auth_proto_strings), 0,
9132
14
      NULL, HFILL
9133
14
    } },
9134
14
    { &hf_msg_auth_supportedproto_gid, {
9135
14
      "Global ID", "ceph.msg.auth.supportedproto.gid",
9136
14
      FT_UINT64, BASE_HEX, NULL, 0,
9137
14
      NULL, HFILL
9138
14
    } },
9139
14
    { &hf_msg_auth_cephx, {
9140
14
      "CephX", "ceph.msg.auth.cephx",
9141
14
      FT_NONE, BASE_NONE, NULL, 0,
9142
14
      NULL, HFILL
9143
14
    } },
9144
14
    { &hf_msg_auth_cephx_req_type, {
9145
14
      "Type", "ceph.msg.auth.cephx.req.type",
9146
14
      FT_UINT16, BASE_HEX, VALS(c_cephx_req_type_strings), 0,
9147
14
      NULL, HFILL
9148
14
    } },
9149
14
    { &hf_msg_auth_monmap_epoch, {
9150
14
      "Monmap epoch", "ceph.msg.auth.monmap_epoch",
9151
14
      FT_UINT32, BASE_DEC, NULL, 0,
9152
14
      NULL, HFILL
9153
14
    } },
9154
14
    { &hf_msg_auth_reply, {
9155
14
      "Auth Reply Message", "ceph.msg.auth_reply",
9156
14
      FT_NONE, BASE_NONE, NULL, 0,
9157
14
      NULL, HFILL
9158
14
    } },
9159
14
    { &hf_msg_auth_reply_proto, {
9160
14
      "Protocol", "ceph.msg.auth_reply.proto",
9161
14
      FT_UINT32, BASE_HEX, VALS(c_auth_proto_strings), 0,
9162
14
      NULL, HFILL
9163
14
    } },
9164
14
    { &hf_msg_auth_reply_result, {
9165
14
      "Result", "ceph.msg.auth_reply.result",
9166
14
      FT_INT32, BASE_DEC, NULL, 0,
9167
14
      NULL, HFILL
9168
14
    } },
9169
14
    { &hf_msg_auth_reply_global_id, {
9170
14
      "Global ID", "ceph.msg.auth_reply.id",
9171
14
      FT_UINT64, BASE_HEX, NULL, 0,
9172
14
      NULL, HFILL
9173
14
    } },
9174
14
    { &hf_msg_auth_reply_msg, {
9175
14
      "Message", "ceph.msg.auth_reply.msg",
9176
14
      FT_STRING, BASE_NONE, NULL, 0,
9177
14
      NULL, HFILL
9178
14
    } },
9179
14
    { &hf_msg_mon_getversion, {
9180
14
      "Get Version", "ceph.msg.mon.getversion",
9181
14
      FT_NONE, BASE_NONE, NULL, 0,
9182
14
      NULL, HFILL
9183
14
    } },
9184
14
    { &hf_msg_mon_getversion_tid, {
9185
14
      "Transaction ID", "ceph.msg.mon.getversion.tid",
9186
14
      FT_UINT64, BASE_DEC, NULL, 0,
9187
14
      NULL, HFILL
9188
14
    } },
9189
14
    { &hf_msg_mon_getversion_what, {
9190
14
      "What", "ceph.msg.mon.getversion.what",
9191
14
      FT_STRING, BASE_NONE, NULL, 0,
9192
14
      NULL, HFILL
9193
14
    } },
9194
14
    { &hf_msg_mon_getversionreply, {
9195
14
      "Get Version Reply", "ceph.msg.mon.getversionreply",
9196
14
      FT_NONE, BASE_NONE, NULL, 0,
9197
14
      NULL, HFILL
9198
14
    } },
9199
14
    { &hf_msg_mon_getversionreply_tid, {
9200
14
      "Transaction ID", "ceph.msg.mon.getversionreply.tid",
9201
14
      FT_UINT64, BASE_DEC, NULL, 0,
9202
14
      NULL, HFILL
9203
14
    } },
9204
14
    { &hf_msg_mon_getversionreply_ver, {
9205
14
      "Version", "ceph.msg.mon.getversionreply.ver",
9206
14
      FT_UINT64, BASE_DEC, NULL, 0,
9207
14
      NULL, HFILL
9208
14
    } },
9209
14
    { &hf_msg_mon_getversionreply_veroldest, {
9210
14
      "Oldest Version", "ceph.msg.mon.getversionreply.veroldest",
9211
14
      FT_UINT64, BASE_DEC, NULL, 0,
9212
14
      NULL, HFILL
9213
14
    } },
9214
14
    { &hf_msg_mds_map, {
9215
14
      "OSD Map Message", "ceph.msg.osd_map",
9216
14
      FT_NONE, BASE_NONE, NULL, 0,
9217
14
      NULL, HFILL
9218
14
    } },
9219
14
    { &hf_msg_mds_map_fsid, {
9220
14
      "FSID", "ceph.msg.osd_map.fsid",
9221
14
      FT_GUID, BASE_NONE, NULL, 0,
9222
14
      NULL, HFILL
9223
14
    } },
9224
14
    { &hf_msg_mds_map_epoch, {
9225
14
      "Epoch", "ceph.msg.osd_map.epoch",
9226
14
      FT_UINT32, BASE_DEC, NULL, 0,
9227
14
      NULL, HFILL
9228
14
    } },
9229
14
    { &hf_msg_mds_map_datai, {
9230
14
      "OSD Map Data", "ceph.msg.osd_map.datai",
9231
14
      FT_NONE, BASE_NONE, NULL, 0,
9232
14
      NULL, HFILL
9233
14
    } },
9234
14
    { &hf_msg_mds_map_data, {
9235
14
      "Data", "ceph.msg.osd_map.data",
9236
14
      FT_BYTES, BASE_NONE, NULL, 0,
9237
14
      NULL, HFILL
9238
14
    } },
9239
14
    { &hf_msg_mds_map_data_size, {
9240
14
      "Size", "ceph.msg.osd_map.size",
9241
14
      FT_UINT32, BASE_DEC, NULL, 0,
9242
14
      NULL, HFILL
9243
14
    } },
9244
14
    { &hf_msg_client_sess, {
9245
14
      "Client Session", "ceph.msg.client_sess",
9246
14
      FT_NONE, BASE_NONE, NULL, 0,
9247
14
      NULL, HFILL
9248
14
    } },
9249
14
    { &hf_msg_client_sess_op, {
9250
14
      "Operation", "ceph.msg.client_sess.op",
9251
14
      FT_UINT32, BASE_HEX|BASE_EXT_STRING, &c_session_op_type_strings_ext, 0,
9252
14
      NULL, HFILL
9253
14
    } },
9254
14
    { &hf_msg_client_sess_seq, {
9255
14
      "Sequence Number", "ceph.msg.client_sess.seq",
9256
14
      FT_UINT64, BASE_DEC, NULL, 0,
9257
14
      NULL, HFILL
9258
14
    } },
9259
14
    { &hf_msg_client_sess_time, {
9260
14
      "Timestamp", "ceph.msg.client_sess.time",
9261
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
9262
14
      NULL, HFILL
9263
14
    } },
9264
14
    { &hf_msg_client_sess_caps_max, {
9265
14
      "Maximum Capabilities", "ceph.msg.client_sess.caps_max",
9266
14
      FT_UINT32, BASE_DEC, NULL, 0,
9267
14
      NULL, HFILL
9268
14
    } },
9269
14
    { &hf_msg_client_sess_leases_max, {
9270
14
      "Maximum Leases", "ceph.msg.client_sess.leases_max",
9271
14
      FT_UINT32, BASE_DEC, NULL, 0,
9272
14
      NULL, HFILL
9273
14
    } },
9274
14
    { &hf_msg_client_req, {
9275
14
      "Client Request", "ceph.msg.client_req",
9276
14
      FT_NONE, BASE_NONE, NULL, 0,
9277
14
      NULL, HFILL
9278
14
    } },
9279
14
    { &hf_msg_client_req_oldest_tid, {
9280
14
      "Oldest TID", "ceph.msg.client_req.oldest_tid",
9281
14
      FT_UINT64, BASE_DEC, NULL, 0,
9282
14
      NULL, HFILL
9283
14
    } },
9284
14
    { &hf_msg_client_req_mdsmap_epoch, {
9285
14
      "MDS Map Epoch", "ceph.msg.client_req.mdsmap_epoch",
9286
14
      FT_UINT32, BASE_DEC, NULL, 0,
9287
14
      NULL, HFILL
9288
14
    } },
9289
14
    { &hf_msg_client_req_flags, {
9290
14
      "Flags", "ceph.msg.client_req.flags",
9291
14
      FT_UINT32, BASE_HEX, NULL, 0,
9292
14
      NULL, HFILL
9293
14
    } },
9294
14
    { &hf_msg_client_req_retry, {
9295
14
      "Number of Retries", "ceph.msg.client_req.retry",
9296
14
      FT_UINT8, BASE_DEC, NULL, 0,
9297
14
      NULL, HFILL
9298
14
    } },
9299
14
    { &hf_msg_client_req_forward, {
9300
14
      "Number of Forwards", "ceph.msg.client_req.forward",
9301
14
      FT_UINT8, BASE_DEC, NULL, 0,
9302
14
      NULL, HFILL
9303
14
    } },
9304
14
    { &hf_msg_client_req_releases, {
9305
14
      "Number of Releases", "ceph.msg.client_req.releases",
9306
14
      FT_UINT16, BASE_DEC, NULL, 0,
9307
14
      NULL, HFILL
9308
14
    } },
9309
14
    { &hf_msg_client_req_op, {
9310
14
      "Operation", "ceph.msg.client_req.op",
9311
14
      FT_UINT32, BASE_HEX|BASE_EXT_STRING, &c_mds_op_type_strings_ext, 0,
9312
14
      NULL, HFILL
9313
14
    } },
9314
14
    { &hf_msg_client_req_caller_uid, {
9315
14
      "Caller User ID", "ceph.msg.client_req.caller_uid",
9316
14
      FT_UINT32, BASE_DEC, NULL, 0,
9317
14
      NULL, HFILL
9318
14
    } },
9319
14
    { &hf_msg_client_req_caller_gid, {
9320
14
      "Caller Group ID", "ceph.msg.client_req.caller_gid",
9321
14
      FT_UINT32, BASE_DEC, NULL, 0,
9322
14
      NULL, HFILL
9323
14
    } },
9324
14
    { &hf_msg_client_req_inode, {
9325
14
      "Inode", "ceph.msg.client_req.inode",
9326
14
      FT_UINT64, BASE_DEC, NULL, 0,
9327
14
      NULL, HFILL
9328
14
    } },
9329
14
    { &hf_msg_client_req_path_src, {
9330
14
      "Path", "ceph.msg.client_req.path_src",
9331
14
      FT_NONE, BASE_NONE, NULL, 0,
9332
14
      NULL, HFILL
9333
14
    } },
9334
14
    { &hf_msg_client_req_path_dst, {
9335
14
      "Second Path", "ceph.msg.client_req.path_dst",
9336
14
      FT_NONE, BASE_NONE, NULL, 0,
9337
14
      NULL, HFILL
9338
14
    } },
9339
14
    { &hf_msg_client_req_release, {
9340
14
      "Release", "ceph.msg.client_req.release",
9341
14
      FT_NONE, BASE_NONE, NULL, 0,
9342
14
      NULL, HFILL
9343
14
    } },
9344
14
    { &hf_msg_client_req_time, {
9345
14
      "Timestamp", "ceph.msg.client_req.time",
9346
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
9347
14
      NULL, HFILL
9348
14
    } },
9349
14
    { &hf_msg_client_reqfwd, {
9350
14
      "Client Request Forward", "ceph.msg.client_reqfwd",
9351
14
      FT_NONE, BASE_NONE, NULL, 0,
9352
14
      NULL, HFILL
9353
14
    } },
9354
14
    { &hf_msg_client_reqfwd_dst, {
9355
14
      "Destination MDS", "ceph.msg.client_reqfwd.dst",
9356
14
      FT_UINT32, BASE_DEC, NULL, 0,
9357
14
      NULL, HFILL
9358
14
    } },
9359
14
    { &hf_msg_client_reqfwd_fwd, {
9360
14
      "Number of Forwards", "ceph.msg.client_reqfwd.fwd",
9361
14
      FT_UINT32, BASE_DEC, NULL, 0,
9362
14
      NULL, HFILL
9363
14
    } },
9364
14
    { &hf_msg_client_reqfwd_resend, {
9365
14
      "Resend", "ceph.msg.client_reqfwd.resend",
9366
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
9367
14
      "Does the client have to resend the request?", HFILL
9368
14
    } },
9369
14
    { &hf_msg_client_reply, {
9370
14
      "Client Reply", "ceph.msg.client_reply",
9371
14
      FT_NONE, BASE_NONE, NULL, 0,
9372
14
      NULL, HFILL
9373
14
    } },
9374
14
    { &hf_msg_client_reply_op, {
9375
14
      "Operation", "ceph.msg.client_reply.op",
9376
14
      FT_UINT32, BASE_DEC|BASE_EXT_STRING, &c_mds_op_type_strings_ext, 0,
9377
14
      NULL, HFILL
9378
14
    } },
9379
14
    { &hf_msg_client_reply_result, {
9380
14
      "Result", "ceph.msg.client_reply.result",
9381
14
      FT_UINT32, BASE_DEC, NULL, 0,
9382
14
      NULL, HFILL
9383
14
    } },
9384
14
    { &hf_msg_client_reply_mdsmap_epoch, {
9385
14
      "MDS Map Epoch", "ceph.msg.client_reply.mdsmap_epoch",
9386
14
      FT_UINT32, BASE_DEC, NULL, 0,
9387
14
      NULL, HFILL
9388
14
    } },
9389
14
    { &hf_msg_client_reply_isdentry, {
9390
14
      "Is Dentry", "ceph.msg.client_reply.isdentry",
9391
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
9392
14
      NULL, HFILL
9393
14
    } },
9394
14
    { &hf_msg_client_reply_istarget, {
9395
14
      "Is Target", "ceph.msg.client_reply.istarget",
9396
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
9397
14
      NULL, HFILL
9398
14
    } },
9399
14
    { &hf_msg_client_reply_trace, {
9400
14
      "Trace", "ceph.msg.client_reply.trace",
9401
14
      FT_NONE, BASE_NONE, NULL, 0,
9402
14
      NULL, HFILL
9403
14
    } },
9404
14
    { &hf_msg_client_reply_extra, {
9405
14
      "Extra", "ceph.msg.client_reply.extra",
9406
14
      FT_NONE, BASE_NONE, NULL, 0,
9407
14
      NULL, HFILL
9408
14
    } },
9409
14
    { &hf_msg_client_reply_snaps, {
9410
14
      "Snapshots", "ceph.msg.client_reply.snaps",
9411
14
      FT_NONE, BASE_NONE, NULL, 0,
9412
14
      NULL, HFILL
9413
14
    } },
9414
14
    { &hf_msg_client_reply_safe, {
9415
14
      "Committed to Permanent Storage", "ceph.msg.client_reply.safe",
9416
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
9417
14
      NULL, HFILL
9418
14
    } },
9419
14
    { &hf_msg_osd_map, {
9420
14
      "OSD Map Message", "ceph.msg.osd_map",
9421
14
      FT_NONE, BASE_NONE, NULL, 0,
9422
14
      NULL, HFILL
9423
14
    } },
9424
14
    { &hf_msg_osd_map_fsid, {
9425
14
      "FSID", "ceph.msg.osd_map.fsid",
9426
14
      FT_GUID, BASE_NONE, NULL, 0,
9427
14
      NULL, HFILL
9428
14
    } },
9429
14
    { &hf_msg_osd_map_inc, {
9430
14
      "Incremental Map", "ceph.msg.osd_map.inc",
9431
14
      FT_NONE, BASE_NONE, NULL, 0,
9432
14
      NULL, HFILL
9433
14
    } },
9434
14
    { &hf_msg_osd_map_inc_len, {
9435
14
      "Incremental Map Count", "ceph.msg.osd_map.inc_len",
9436
14
      FT_UINT32, BASE_DEC, NULL, 0,
9437
14
      NULL, HFILL
9438
14
    } },
9439
14
    { &hf_msg_osd_map_map, {
9440
14
      "Map", "ceph.msg.osd_map.map",
9441
14
      FT_NONE, BASE_NONE, NULL, 0,
9442
14
      NULL, HFILL
9443
14
    } },
9444
14
    { &hf_msg_osd_map_map_len, {
9445
14
      "Map Count", "ceph.msg.osd_map.map_size",
9446
14
      FT_UINT32, BASE_DEC, NULL, 0,
9447
14
      NULL, HFILL
9448
14
    } },
9449
14
    { &hf_msg_osd_map_epoch, {
9450
14
      "Epoch", "ceph.msg.osd_map.epoch",
9451
14
      FT_UINT32, BASE_DEC, NULL, 0,
9452
14
      NULL, HFILL
9453
14
    } },
9454
14
    { &hf_msg_osd_map_oldest, {
9455
14
      "Oldest Map", "ceph.msg.osd_map.oldest",
9456
14
      FT_UINT32, BASE_DEC, NULL, 0,
9457
14
      NULL, HFILL
9458
14
    } },
9459
14
    { &hf_msg_osd_map_newest, {
9460
14
      "Newest Map", "ceph.msg.osd_map.newest",
9461
14
      FT_UINT32, BASE_DEC, NULL, 0,
9462
14
      NULL, HFILL
9463
14
    } },
9464
14
    { &hf_msg_osd_op, {
9465
14
      "OSD Operation", "ceph.msg.osd_op",
9466
14
      FT_NONE, BASE_NONE, NULL, 0,
9467
14
      NULL, HFILL
9468
14
    } },
9469
14
    { &hf_msg_osd_op_client_inc, {
9470
14
      "Client Inc", "ceph.msg.osd_op.client_inc",
9471
14
      FT_UINT32, BASE_DEC, NULL, 0,
9472
14
      NULL, HFILL
9473
14
    } },
9474
14
    { &hf_msg_osd_op_osdmap_epoch, {
9475
14
      "OSD Map Epoch", "ceph.msg.osd_op.osdmap_epoch",
9476
14
      FT_UINT32, BASE_DEC, NULL, 0,
9477
14
      NULL, HFILL
9478
14
    } },
9479
14
    { &hf_msg_osd_op_mtime, {
9480
14
      "Modification Time", "ceph.msg.osd_op.mtime",
9481
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
9482
14
      NULL, HFILL
9483
14
    } },
9484
14
    { &hf_msg_osd_op_reassert_version, {
9485
14
      "Reassert Version", "ceph.msg.osd_op.reassert_version",
9486
14
      FT_NONE, BASE_NONE, NULL, 0,
9487
14
      NULL, HFILL
9488
14
    } },
9489
14
    { &hf_msg_osd_op_oloc, {
9490
14
      "Object Locater", "ceph.msg.osd_op.oloc",
9491
14
      FT_NONE, BASE_NONE, NULL, 0,
9492
14
      NULL, HFILL
9493
14
    } },
9494
14
    { &hf_msg_osd_op_pgid, {
9495
14
      "Placement Group ID", "ceph.msg.osd_op.pgid",
9496
14
      FT_NONE, BASE_NONE, NULL, 0,
9497
14
      NULL, HFILL
9498
14
    } },
9499
14
    { &hf_msg_osd_op_oid, {
9500
14
      "Object ID", "ceph.msg.osd_op.oid",
9501
14
      FT_STRING, BASE_NONE, NULL, 0,
9502
14
      NULL, HFILL
9503
14
    } },
9504
14
    { &hf_msg_osd_op_ops_len, {
9505
14
      "Operation Count", "ceph.msg.osd_op.ops_len",
9506
14
      FT_UINT16, BASE_DEC, NULL, 0,
9507
14
      NULL, HFILL
9508
14
    } },
9509
14
    { &hf_msg_osd_op_op, {
9510
14
      "Operation", "ceph.msg.osd_op.op",
9511
14
      FT_NONE, BASE_NONE, NULL, 0,
9512
14
      NULL, HFILL
9513
14
    } },
9514
14
    { &hf_msg_osd_op_snap_id, {
9515
14
      "Snapshot ID", "ceph.msg.osd_op.snap_id",
9516
14
      FT_UINT64, BASE_DEC, NULL, 0,
9517
14
      NULL, HFILL
9518
14
    } },
9519
14
    { &hf_msg_osd_op_snap_seq, {
9520
14
      "Snapshot Sequence", "ceph.msg.osd_op.snap_seq",
9521
14
      FT_UINT64, BASE_DEC, NULL, 0,
9522
14
      NULL, HFILL
9523
14
    } },
9524
14
    { &hf_msg_osd_op_snaps_len, {
9525
14
      "Snapshot Count", "ceph.msg.osd_op.snaps_len",
9526
14
      FT_UINT32, BASE_DEC, NULL, 0,
9527
14
      NULL, HFILL
9528
14
    } },
9529
14
    { &hf_msg_osd_op_snap, {
9530
14
      "Snapshot", "ceph.msg.osd_op.snaps",
9531
14
      FT_UINT64, BASE_DEC, NULL, 0,
9532
14
      NULL, HFILL
9533
14
    } },
9534
14
    { &hf_msg_osd_op_retry_attempt, {
9535
14
      "Retry Attempt", "ceph.msg.osd_op.retry",
9536
14
      FT_INT32, BASE_DEC, NULL, 0,
9537
14
      NULL, HFILL
9538
14
    } },
9539
14
    { &hf_msg_osd_op_payload, {
9540
14
      "Operation Payload", "ceph.msg.osd_op.op_payload",
9541
14
      FT_BYTES, BASE_NONE, NULL, 0,
9542
14
      NULL, HFILL
9543
14
    } },
9544
14
    { &hf_msg_osd_opreply, {
9545
14
      "OSD Operation Reply", "ceph.msg.osd_opreply",
9546
14
      FT_NONE, BASE_NONE, NULL, 0,
9547
14
      NULL, HFILL
9548
14
    } },
9549
14
    { &hf_msg_osd_opreply_oid, {
9550
14
      "Object ID", "ceph.msg.osd_opreply.oid",
9551
14
      FT_STRING, BASE_NONE, NULL, 0,
9552
14
      NULL, HFILL
9553
14
    } },
9554
14
    { &hf_msg_osd_opreply_pgid, {
9555
14
      "Placement Group ID", "ceph.msg.osd_opreply.pgid",
9556
14
      FT_NONE, BASE_NONE, NULL, 0,
9557
14
      NULL, HFILL
9558
14
    } },
9559
14
    { &hf_msg_osd_opreply_result, {
9560
14
      "Result", "ceph.msg.osd_opreply.result",
9561
14
      FT_INT32, BASE_DEC, NULL, 0,
9562
14
      NULL, HFILL
9563
14
    } },
9564
14
    { &hf_msg_osd_opreply_bad_replay_ver, {
9565
14
      "Bad Replay Version", "ceph.msg.osd_opreply.bad_replay_ver",
9566
14
      FT_NONE, BASE_NONE, NULL, 0,
9567
14
      NULL, HFILL
9568
14
    } },
9569
14
    { &hf_msg_osd_opreply_replay_ver, {
9570
14
      "Replay Version", "ceph.msg.osd_opreply.replay_ver",
9571
14
      FT_NONE, BASE_NONE, NULL, 0,
9572
14
      NULL, HFILL
9573
14
    } },
9574
14
    { &hf_msg_osd_opreply_user_ver, {
9575
14
      "User Version", "ceph.msg.osd_opreply.user_ver",
9576
14
      FT_UINT64, BASE_DEC, NULL, 0,
9577
14
      NULL, HFILL
9578
14
    } },
9579
14
    { &hf_msg_osd_opreply_redirect, {
9580
14
      "Redirect", "ceph.msg.osd_opreply.redirect",
9581
14
      FT_NONE, BASE_NONE, NULL, 0,
9582
14
      NULL, HFILL
9583
14
    } },
9584
14
    { &hf_msg_osd_opreply_osdmap_epoch, {
9585
14
      "OSD Map Epoch", "ceph.msg.osd_opreply.osdmap_epoch",
9586
14
      FT_UINT32, BASE_DEC, NULL, 0,
9587
14
      NULL, HFILL
9588
14
    } },
9589
14
    { &hf_msg_osd_opreply_ops_len, {
9590
14
      "Operation Count", "ceph.msg.osd_opreply.ops_len",
9591
14
      FT_UINT32, BASE_DEC, NULL, 0,
9592
14
      NULL, HFILL
9593
14
    } },
9594
14
    { &hf_msg_osd_opreply_op, {
9595
14
      "Operation", "ceph.msg.osd_opreply.op",
9596
14
      FT_NONE, BASE_NONE, NULL, 0,
9597
14
      NULL, HFILL
9598
14
    } },
9599
14
    { &hf_msg_osd_opreply_retry_attempt, {
9600
14
      "Retry Attempt", "ceph.msg.osd_opreply.retry",
9601
14
      FT_INT32, BASE_DEC, NULL, 0,
9602
14
      NULL, HFILL
9603
14
    } },
9604
14
    { &hf_msg_osd_opreply_rval, {
9605
14
      "Operation Return Value", "ceph.msg.osd_opreply.rval",
9606
14
      FT_INT32, BASE_DEC, NULL, 0,
9607
14
      NULL, HFILL
9608
14
    } },
9609
14
    { &hf_msg_osd_opreply_payload, {
9610
14
      "Operation Result", "ceph.msg.osd_opreply.payload",
9611
14
      FT_BYTES, BASE_NONE, NULL, 0,
9612
14
      NULL, HFILL
9613
14
    } },
9614
14
    { &hf_msg_poolopreply, {
9615
14
      "Pool Operation", "ceph.msg.poolopreply",
9616
14
      FT_NONE, BASE_NONE, NULL, 0,
9617
14
      NULL, HFILL
9618
14
    } },
9619
14
    { &hf_msg_poolopreply_fsid, {
9620
14
      "FSID", "ceph.msg.poolopreply.fsid",
9621
14
      FT_GUID, BASE_NONE, NULL, 0,
9622
14
      NULL, HFILL
9623
14
    } },
9624
14
    { &hf_msg_poolopreply_code, {
9625
14
      "Response Code", "ceph.msg.poolopreply.code",
9626
14
      FT_UINT32, BASE_DEC, NULL, 0,
9627
14
      NULL, HFILL
9628
14
    } },
9629
14
    { &hf_msg_poolopreply_epoch, {
9630
14
      "Epoch", "ceph.msg.poolopreply.epoch",
9631
14
      FT_UINT32, BASE_DEC, NULL, 0,
9632
14
      NULL, HFILL
9633
14
    } },
9634
14
    { &hf_msg_poolopreply_datai, {
9635
14
      "Data", "ceph.msg.poolopreply.datai",
9636
14
      FT_UINT32, BASE_DEC, NULL, 0,
9637
14
      NULL, HFILL
9638
14
    } },
9639
14
    { &hf_msg_poolopreply_data, {
9640
14
      "Data", "ceph.msg.poolopreply.data",
9641
14
      FT_BYTES, BASE_NONE, NULL, 0,
9642
14
      NULL, HFILL
9643
14
    } },
9644
14
    { &hf_msg_poolopreply_data_size, {
9645
14
      "Size", "ceph.msg.poolopreply.data_size",
9646
14
      FT_UINT32, BASE_DEC, NULL, 0,
9647
14
      NULL, HFILL
9648
14
    } },
9649
14
    { &hf_msg_poolop, {
9650
14
      "Pool Operation", "ceph.msg.poolop",
9651
14
      FT_NONE, BASE_NONE, NULL, 0,
9652
14
      NULL, HFILL
9653
14
    } },
9654
14
    { &hf_msg_poolop_fsid, {
9655
14
      "FSID", "ceph.msg.poolop.fsid",
9656
14
      FT_GUID, BASE_NONE, NULL, 0,
9657
14
      NULL, HFILL
9658
14
    } },
9659
14
    { &hf_msg_poolop_pool, {
9660
14
      "Pool", "ceph.msg.poolop.pool",
9661
14
      FT_UINT32, BASE_DEC, NULL, 0,
9662
14
      NULL, HFILL
9663
14
    } },
9664
14
    { &hf_msg_poolop_type, {
9665
14
      "Type", "ceph.msg.poolop.type",
9666
14
      FT_UINT32, BASE_HEX, VALS(c_poolop_type_strings), 0,
9667
14
      NULL, HFILL
9668
14
    } },
9669
14
    { &hf_msg_poolop_auid, {
9670
14
      "AUID", "ceph.msg.poolop.auid",
9671
14
      FT_UINT64, BASE_DEC, NULL, 0,
9672
14
      NULL, HFILL
9673
14
    } },
9674
14
    { &hf_msg_poolop_snapid, {
9675
14
      "Snapshot ID", "ceph.msg.poolop.snap",
9676
14
      FT_UINT64, BASE_DEC, NULL, 0,
9677
14
      NULL, HFILL
9678
14
    } },
9679
14
    { &hf_msg_poolop_name, {
9680
14
      "Name", "ceph.msg.poolop.name",
9681
14
      FT_STRING, BASE_NONE, NULL, 0,
9682
14
      NULL, HFILL
9683
14
    } },
9684
14
    { &hf_msg_poolop_crush_rule, {
9685
14
      "Crush Rule", "ceph.msg.poolop.crush_rule",
9686
14
      FT_UINT16, BASE_DEC, NULL, 0,
9687
14
      NULL, HFILL
9688
14
    } },
9689
14
    { &hf_msg_poolop_crush_rule8, {
9690
14
      "Crush Rule", "ceph.msg.poolop.crush_rule",
9691
14
      FT_UINT8, BASE_DEC, NULL, 0,
9692
14
      NULL, HFILL
9693
14
    } },
9694
14
    { &hf_msg_mon_cmd, {
9695
14
      "Mon Command", "ceph.msg.mon_cmd",
9696
14
      FT_NONE, BASE_NONE, NULL, 0,
9697
14
      NULL, HFILL
9698
14
    } },
9699
14
    { &hf_msg_mon_cmd_fsid, {
9700
14
      "FSID", "ceph.msg.mon_cmd.fsid",
9701
14
      FT_GUID, BASE_NONE, NULL, 0,
9702
14
      NULL, HFILL
9703
14
    } },
9704
14
    { &hf_msg_mon_cmd_arg, {
9705
14
      "Argument", "ceph.msg.mon_cmd.arg",
9706
14
      FT_NONE, BASE_NONE, NULL, 0,
9707
14
      NULL, HFILL
9708
14
    } },
9709
14
    { &hf_msg_mon_cmd_arg_len, {
9710
14
      "Argument Count", "ceph.msg.mon_cmd.arg_len",
9711
14
      FT_UINT32, BASE_DEC, NULL, 0,
9712
14
      NULL, HFILL
9713
14
    } },
9714
14
    { &hf_msg_mon_cmd_str, {
9715
14
      "String", "ceph.msg.mon_cmd.str",
9716
14
      FT_STRING, BASE_NONE, NULL, 0,
9717
14
      NULL, HFILL
9718
14
    } },
9719
14
    { &hf_msg_mon_cmd_ack, {
9720
14
      "Mon Command Result", "ceph.msg.mon_cmd_ack",
9721
14
      FT_NONE, BASE_NONE, NULL, 0,
9722
14
      NULL, HFILL
9723
14
    } },
9724
14
    { &hf_msg_mon_cmd_ack_code, {
9725
14
      "Result Code", "ceph.msg.mon_cmd_ack.code",
9726
14
      FT_INT32, BASE_DEC, NULL, 0,
9727
14
      NULL, HFILL
9728
14
    } },
9729
14
    { &hf_msg_mon_cmd_ack_res, {
9730
14
      "Result String", "ceph.msg.mon_cmd_ack.result",
9731
14
      FT_STRING, BASE_NONE, NULL, 0,
9732
14
      NULL, HFILL
9733
14
    } },
9734
14
    { &hf_msg_mon_cmd_ack_arg, {
9735
14
      "Argument", "ceph.msg.mon_cmd_ack.arg",
9736
14
      FT_NONE, BASE_NONE, NULL, 0,
9737
14
      NULL, HFILL
9738
14
    } },
9739
14
    { &hf_msg_mon_cmd_ack_arg_len, {
9740
14
      "Argument Count", "ceph.msg.mon_cmd_ack.arg_len",
9741
14
      FT_UINT32, BASE_DEC, NULL, 0,
9742
14
      NULL, HFILL
9743
14
    } },
9744
14
    { &hf_msg_mon_cmd_ack_arg_str, {
9745
14
      "String", "ceph.msg.mon_cmd_ack.str",
9746
14
      FT_STRING, BASE_NONE, NULL, 0,
9747
14
      NULL, HFILL
9748
14
    } },
9749
14
    { &hf_msg_mon_cmd_ack_data, {
9750
14
      "Data", "ceph.msg.mon_cmd_ack.data",
9751
14
      FT_STRING, BASE_NONE, NULL, 0,
9752
14
      NULL, HFILL
9753
14
    } },
9754
14
    { &hf_msg_poolstats, {
9755
14
      "Pool Stats", "ceph.msg.poolstats",
9756
14
      FT_NONE, BASE_NONE, NULL, 0,
9757
14
      NULL, HFILL
9758
14
    } },
9759
14
    { &hf_msg_poolstats_fsid, {
9760
14
      "FSID", "ceph.msg.poolstats.fsid",
9761
14
      FT_GUID, BASE_NONE, NULL, 0,
9762
14
      NULL, HFILL
9763
14
    } },
9764
14
    { &hf_msg_poolstats_pool, {
9765
14
      "Pool", "ceph.msg.poolstats.pool",
9766
14
      FT_STRING, BASE_NONE, NULL, 0,
9767
14
      NULL, HFILL
9768
14
    } },
9769
14
    { &hf_msg_poolstatsreply, {
9770
14
      "Pool Stats", "ceph.msg.poolstatsreply",
9771
14
      FT_NONE, BASE_NONE, NULL, 0,
9772
14
      NULL, HFILL
9773
14
    } },
9774
14
    { &hf_msg_poolstatsreply_fsid, {
9775
14
      "FSID", "ceph.msg.poolstatsreply.fsid",
9776
14
      FT_GUID, BASE_NONE, NULL, 0,
9777
14
      NULL, HFILL
9778
14
    } },
9779
14
    { &hf_msg_poolstatsreply_stat, {
9780
14
      "Stats", "ceph.msg.poolstatsreply.pool.stat",
9781
14
      FT_NONE, BASE_NONE, NULL, 0,
9782
14
      NULL, HFILL
9783
14
    } },
9784
14
    { &hf_msg_poolstatsreply_pool, {
9785
14
      "Pool", "ceph.msg.poolstatsreply.pool",
9786
14
      FT_STRING, BASE_NONE, NULL, 0,
9787
14
      NULL, HFILL
9788
14
    } },
9789
14
    { &hf_msg_poolstatsreply_log_size, {
9790
14
      "Log Size", "ceph.msg.poolstatsreply.log_size",
9791
14
      FT_INT64, BASE_DEC, NULL, 0,
9792
14
      NULL, HFILL
9793
14
    } },
9794
14
    { &hf_msg_poolstatsreply_log_size_ondisk, {
9795
14
      "On-Disk Log Size", "ceph.msg.poolstatsreply.log_size_ondisk",
9796
14
      FT_INT64, BASE_DEC, NULL, 0,
9797
14
      NULL, HFILL
9798
14
    } },
9799
14
    { &hf_msg_mon_globalid_max, {
9800
14
      "Old Max ID", "ceph.msg.mon.globalid.max",
9801
14
      FT_UINT64, BASE_HEX, NULL, 0,
9802
14
      NULL, HFILL
9803
14
    } },
9804
14
    { &hf_msg_mon_election, {
9805
14
      "Monitor Election", "ceph.msg.mon_election",
9806
14
      FT_NONE, BASE_NONE, NULL, 0,
9807
14
      NULL, HFILL
9808
14
    } },
9809
14
    { &hf_msg_mon_election_fsid, {
9810
14
      "FSID", "ceph.msg.mon_election.fsid",
9811
14
      FT_GUID, BASE_NONE, NULL, 0,
9812
14
      NULL, HFILL
9813
14
    } },
9814
14
    { &hf_msg_mon_election_op, {
9815
14
      "Type", "ceph.msg.mon_election.op",
9816
14
      FT_INT32, BASE_DEC|BASE_EXT_STRING, &c_mon_election_type_strings_ext, 0,
9817
14
      NULL, HFILL
9818
14
    } },
9819
14
    { &hf_msg_mon_election_epoch, {
9820
14
      "Epoch", "ceph.msg.mon_election.epoch",
9821
14
      FT_UINT32, BASE_DEC, NULL, 0,
9822
14
      NULL, HFILL
9823
14
    } },
9824
14
    { &hf_msg_mon_election_quorum, {
9825
14
      "Quorum", "ceph.msg.mon_election.quorum",
9826
14
      FT_INT64, BASE_DEC, NULL, 0,
9827
14
      NULL, HFILL
9828
14
    } },
9829
14
    { &hf_msg_mon_election_quorum_features, {
9830
14
      "Epoch", "ceph.msg.mon_election.quorum_features",
9831
14
      FT_UINT64, BASE_HEX, NULL, 0,
9832
14
      NULL, HFILL
9833
14
    } },
9834
14
    { &hf_msg_mon_election_defunct_one, {
9835
14
      "Defunct One", "ceph.msg.mon_election.defunct_one",
9836
14
      FT_UINT64, BASE_DEC, NULL, 0,
9837
14
      NULL, HFILL
9838
14
    } },
9839
14
    { &hf_msg_mon_election_defunct_two, {
9840
14
      "Defunct Two", "ceph.msg.mon_election.defunct_two",
9841
14
      FT_UINT64, BASE_DEC, NULL, 0,
9842
14
      NULL, HFILL
9843
14
    } },
9844
14
    { &hf_msg_mon_election_sharing, {
9845
14
      "Sharing", "ceph.msg.mon_election.sharing",
9846
14
      FT_NONE, BASE_NONE, NULL, 0,
9847
14
      NULL, HFILL
9848
14
    } },
9849
14
    { &hf_msg_mon_election_sharing_data, {
9850
14
      "Data", "ceph.msg.mon_election.sharing_data",
9851
14
      FT_BYTES, BASE_NONE, NULL, 0,
9852
14
      NULL, HFILL
9853
14
    } },
9854
14
    { &hf_msg_mon_election_sharing_size, {
9855
14
      "Size", "ceph.msg.mon_election.sharing_size",
9856
14
      FT_UINT32, BASE_DEC, NULL, 0,
9857
14
      NULL, HFILL
9858
14
    } },
9859
14
    { &hf_msg_mon_paxos, {
9860
14
      "Paxos", "ceph.msg.mon_paxos",
9861
14
      FT_NONE, BASE_NONE, NULL, 0,
9862
14
      NULL, HFILL
9863
14
    } },
9864
14
    { &hf_msg_mon_paxos_epoch, {
9865
14
      "Epoch", "ceph.msg.mon_paxos.epoch",
9866
14
      FT_UINT32, BASE_DEC, NULL, 0,
9867
14
      NULL, HFILL
9868
14
    } },
9869
14
    { &hf_msg_mon_paxos_op, {
9870
14
      "Op", "ceph.msg.mon_paxos.op",
9871
14
      FT_INT32, BASE_DEC|BASE_EXT_STRING, &c_mon_paxos_op_strings_ext, 0,
9872
14
      NULL, HFILL
9873
14
    } },
9874
14
    { &hf_msg_mon_paxos_first, {
9875
14
      "First Committed", "ceph.msg.mon_paxos.first",
9876
14
      FT_UINT64, BASE_DEC, NULL, 0,
9877
14
      NULL, HFILL
9878
14
    } },
9879
14
    { &hf_msg_mon_paxos_last, {
9880
14
      "Last Committed", "ceph.msg.mon_paxos.last",
9881
14
      FT_UINT64, BASE_DEC, NULL, 0,
9882
14
      NULL, HFILL
9883
14
    } },
9884
14
    { &hf_msg_mon_paxos_pnfrom, {
9885
14
      "Greatest Seen Proposal Number", "ceph.msg.mon_paxos.pnfrom",
9886
14
      FT_UINT64, BASE_DEC, NULL, 0,
9887
14
      NULL, HFILL
9888
14
    } },
9889
14
    { &hf_msg_mon_paxos_pn, {
9890
14
      "Proposal Number", "ceph.msg.mon_paxos.pn",
9891
14
      FT_UINT64, BASE_DEC, NULL, 0,
9892
14
      NULL, HFILL
9893
14
    } },
9894
14
    { &hf_msg_mon_paxos_pnuncommitted, {
9895
14
      "Previous Proposal Number", "ceph.msg.mon_paxos.pnuncommitted",
9896
14
      FT_UINT64, BASE_DEC, NULL, 0,
9897
14
      NULL, HFILL
9898
14
    } },
9899
14
    { &hf_msg_mon_paxos_lease, {
9900
14
      "Lease Timestamp", "ceph.msg.mon_paxos.lease",
9901
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
9902
14
      NULL, HFILL
9903
14
    } },
9904
14
    { &hf_msg_mon_paxos_sent, {
9905
14
      "Sent Timestamp", "ceph.msg.mon_paxos.sent",
9906
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
9907
14
      NULL, HFILL
9908
14
    } },
9909
14
    { &hf_msg_mon_paxos_latest_ver, {
9910
14
      "Latest Version", "ceph.msg.mon_paxos.latest_ver",
9911
14
      FT_UINT64, BASE_DEC, NULL, 0,
9912
14
      NULL, HFILL
9913
14
    } },
9914
14
    { &hf_msg_mon_paxos_latest_val, {
9915
14
      "Latest Value", "ceph.msg.mon_paxos.latest_val",
9916
14
      FT_NONE, BASE_NONE, NULL, 0,
9917
14
      NULL, HFILL
9918
14
    } },
9919
14
    { &hf_msg_mon_paxos_latest_val_data, {
9920
14
      "Data", "ceph.msg.mon_paxos.latest_val.data",
9921
14
      FT_BYTES, BASE_NONE, NULL, 0,
9922
14
      NULL, HFILL
9923
14
    } },
9924
14
    { &hf_msg_mon_paxos_latest_val_size, {
9925
14
      "Size", "ceph.msg.mon_paxos.latest_val.size",
9926
14
      FT_UINT32, BASE_DEC, NULL, 0,
9927
14
      NULL, HFILL
9928
14
    } },
9929
14
    { &hf_msg_mon_paxos_value, {
9930
14
      "Proposal", "ceph.msg.mon_paxos.value",
9931
14
      FT_NONE, BASE_NONE, NULL, 0,
9932
14
      NULL, HFILL
9933
14
    } },
9934
14
    { &hf_msg_mon_paxos_ver, {
9935
14
      "Version", "ceph.msg.mon_paxos.ver",
9936
14
      FT_UINT64, BASE_DEC, NULL, 0,
9937
14
      NULL, HFILL
9938
14
    } },
9939
14
    { &hf_msg_mon_paxos_val, {
9940
14
      "Value", "ceph.msg.mon_paxos.val",
9941
14
      FT_NONE, BASE_NONE, NULL, 0,
9942
14
      NULL, HFILL
9943
14
    } },
9944
14
    { &hf_msg_mon_paxos_val_data, {
9945
14
      "Data", "ceph.msg.mon_paxos.val.data",
9946
14
      FT_BYTES, BASE_NONE, NULL, 0,
9947
14
      NULL, HFILL
9948
14
    } },
9949
14
    { &hf_msg_mon_paxos_val_size, {
9950
14
      "Size", "ceph.msg.mon_paxos.val.size",
9951
14
      FT_UINT32, BASE_DEC, NULL, 0,
9952
14
      NULL, HFILL
9953
14
    } },
9954
14
    { &hf_msg_mon_probe, {
9955
14
      "Monitor Probe", "ceph.msg.mon_probe",
9956
14
      FT_NONE, BASE_NONE, NULL, 0,
9957
14
      NULL, HFILL
9958
14
    } },
9959
14
    { &hf_msg_mon_probe_fsid, {
9960
14
      "FSID", "ceph.msg.mon_probe.fsid",
9961
14
      FT_GUID, BASE_NONE, NULL, 0,
9962
14
      NULL, HFILL
9963
14
    } },
9964
14
    { &hf_msg_mon_probe_type, {
9965
14
      "Type", "ceph.msg.mon_probe.type",
9966
14
      FT_INT32, BASE_DEC|BASE_EXT_STRING, &c_mon_probe_type_strings_ext, 0,
9967
14
      NULL, HFILL
9968
14
    } },
9969
14
    { &hf_msg_mon_probe_name, {
9970
14
      "Name", "ceph.msg.mon_probe.name",
9971
14
      FT_STRING, BASE_NONE, NULL, 0,
9972
14
      NULL, HFILL
9973
14
    } },
9974
14
    { &hf_msg_mon_probe_quorum, {
9975
14
      "Quorum", "ceph.msg.mon_probe.quorum",
9976
14
      FT_INT32, BASE_DEC, NULL, 0,
9977
14
      NULL, HFILL
9978
14
    } },
9979
14
    { &hf_msg_mon_probe_paxos_first_ver, {
9980
14
      "Paxos First Version", "ceph.msg.mon_probe.paxos_first_ver",
9981
14
      FT_UINT64, BASE_DEC, NULL, 0,
9982
14
      NULL, HFILL
9983
14
    } },
9984
14
    { &hf_msg_mon_probe_paxos_last_ver, {
9985
14
      "Paxos Last Version", "ceph.msg.mon_probe.paxos_last_ver",
9986
14
      FT_UINT64, BASE_DEC, NULL, 0,
9987
14
      NULL, HFILL
9988
14
    } },
9989
14
    { &hf_msg_mon_probe_ever_joined, {
9990
14
      "Has Ever Joined?", "ceph.msg.mon_probe.has_ever_joined",
9991
14
      FT_BOOLEAN, BASE_NONE, NULL, 0,
9992
14
      NULL, HFILL
9993
14
    } },
9994
14
    { &hf_msg_mon_probe_req_features, {
9995
14
      "Required Features", "ceph.msg.mon_probe.required_features",
9996
14
      FT_UINT64, BASE_HEX, NULL, 0,
9997
14
      NULL, HFILL
9998
14
    } },
9999
14
    { &hf_msg_osd_ping, {
10000
14
      "OSD Ping", "ceph.msg.osd.ping",
10001
14
      FT_NONE, BASE_NONE, NULL, 0,
10002
14
      NULL, HFILL
10003
14
    } },
10004
14
    { &hf_msg_osd_ping_fsid, {
10005
14
      "FSID", "ceph.msg.osd.ping.fsid",
10006
14
      FT_GUID, BASE_NONE, NULL, 0,
10007
14
      NULL, HFILL
10008
14
    } },
10009
14
    { &hf_msg_osd_ping_mapepoch, {
10010
14
      "OSD Map Epoch", "ceph.msg.osd.ping.mapepoch",
10011
14
      FT_UINT32, BASE_DEC, NULL, 0,
10012
14
      NULL, HFILL
10013
14
    } },
10014
14
    { &hf_msg_osd_ping_peerepoch, {
10015
14
      "Peer as of Epoch", "ceph.msg.osd.ping.peerepoch",
10016
14
      FT_UINT32, BASE_DEC, NULL, 0,
10017
14
      NULL, HFILL
10018
14
    } },
10019
14
    { &hf_msg_osd_ping_op, {
10020
14
      "Operation", "ceph.msg.osd.ping.op",
10021
14
      FT_UINT8, BASE_HEX|BASE_EXT_STRING, &c_osd_ping_op_strings_ext, 0,
10022
14
      NULL, HFILL
10023
14
    } },
10024
14
    { &hf_msg_osd_ping_time, {
10025
14
      "Timestamp", "ceph.msg.osd.ping.time",
10026
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
10027
14
      NULL, HFILL
10028
14
    } },
10029
14
    { &hf_msg_osd_boot, {
10030
14
      "OSD Boot", "ceph.msg.osd_boot",
10031
14
      FT_NONE, BASE_NONE, NULL, 0,
10032
14
      NULL, HFILL
10033
14
    } },
10034
14
    { &hf_msg_osd_boot_addr_back, {
10035
14
      "Back Address", "ceph.msg.osd_boot.addr.back",
10036
14
      FT_NONE, BASE_NONE, NULL, 0,
10037
14
      NULL, HFILL
10038
14
    } },
10039
14
    { &hf_msg_osd_boot_addr_cluster, {
10040
14
      "Cluster Address", "ceph.msg.osd_boot.addr.cluster",
10041
14
      FT_NONE, BASE_NONE, NULL, 0,
10042
14
      NULL, HFILL
10043
14
    } },
10044
14
    { &hf_msg_osd_boot_epoch, {
10045
14
      "Boot Epoch", "ceph.msg.osd_boot.epoch",
10046
14
      FT_UINT32, BASE_DEC, NULL, 0,
10047
14
      NULL, HFILL
10048
14
    } },
10049
14
    { &hf_msg_osd_boot_addr_front, {
10050
14
      "Front Address", "ceph.msg.osd_boot.addr.front",
10051
14
      FT_NONE, BASE_NONE, NULL, 0,
10052
14
      NULL, HFILL
10053
14
    } },
10054
14
    { &hf_msg_osd_boot_metadata, {
10055
14
      "Metadata", "ceph.msg.osd_boot.metadata",
10056
14
      FT_NONE, BASE_NONE, NULL, 0,
10057
14
      NULL, HFILL
10058
14
    } },
10059
14
    { &hf_msg_osd_boot_metadata_k, {
10060
14
      "Key", "ceph.msg.osd_boot.metadata.k",
10061
14
      FT_STRING, BASE_NONE, NULL, 0,
10062
14
      NULL, HFILL
10063
14
    } },
10064
14
    { &hf_msg_osd_boot_metadata_v, {
10065
14
      "Value", "ceph.msg.osd_boot.metadata.v",
10066
14
      FT_STRING, BASE_NONE, NULL, 0,
10067
14
      NULL, HFILL
10068
14
    } },
10069
14
    { &hf_msg_pgstats, {
10070
14
      "Placement Group Stats", "ceph.msg.pgstats",
10071
14
      FT_NONE, BASE_NONE, NULL, 0,
10072
14
      NULL, HFILL
10073
14
    } },
10074
14
    { &hf_msg_pgstats_fsid, {
10075
14
      "FSID", "ceph.msg.pgstats.fsid",
10076
14
      FT_GUID, BASE_NONE, NULL, 0,
10077
14
      NULL, HFILL
10078
14
    } },
10079
14
    { &hf_msg_pgstats_pgstat, {
10080
14
      "PG Stats", "ceph.msg.pgstats.pgstat",
10081
14
      FT_NONE, BASE_NONE, NULL, 0,
10082
14
      NULL, HFILL
10083
14
    } },
10084
14
    { &hf_msg_pgstats_pgstat_pg, {
10085
14
      "Placement Group", "ceph.msg.pgstats.pgstat.pg",
10086
14
      FT_NONE, BASE_NONE, NULL, 0,
10087
14
      NULL, HFILL
10088
14
    } },
10089
14
    { &hf_msg_pgstats_pgstat_stat, {
10090
14
      "Stats", "ceph.msg.pgstats.pgstat.stat",
10091
14
      FT_NONE, BASE_NONE, NULL, 0,
10092
14
      NULL, HFILL
10093
14
    } },
10094
14
    { &hf_msg_pgstats_epoch, {
10095
14
      "Epoch", "ceph.msg.pgstats.epoch",
10096
14
      FT_UINT32, BASE_DEC, NULL, 0,
10097
14
      NULL, HFILL
10098
14
    } },
10099
14
    { &hf_msg_pgstats_mapfor, {
10100
14
      "Has Map For", "ceph.msg.pgstats.mapfor",
10101
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
10102
14
      NULL, HFILL
10103
14
    } },
10104
14
    { &hf_msg_osd_pg_create, {
10105
14
      "PG Create", "ceph.msg.osd.pg.create",
10106
14
      FT_NONE, BASE_NONE, NULL, 0,
10107
14
      NULL, HFILL
10108
14
    } },
10109
14
    { &hf_msg_osd_pg_create_epoch, {
10110
14
      "Epoch", "ceph.msg.osd.pg.create.epoch",
10111
14
      FT_UINT64, BASE_DEC, NULL, 0,
10112
14
      NULL, HFILL
10113
14
    } },
10114
14
    { &hf_msg_osd_pg_create_mkpg, {
10115
14
      "Creation Request", "ceph.msg.osd.pg.create.mkpg",
10116
14
      FT_NONE, BASE_NONE, NULL, 0,
10117
14
      NULL, HFILL
10118
14
    } },
10119
14
    { &hf_msg_osd_pg_create_mkpg_pg, {
10120
14
      "PG", "ceph.msg.osd.pg.create.mkpg.pg",
10121
14
      FT_NONE, BASE_NONE, NULL, 0,
10122
14
      NULL, HFILL
10123
14
    } },
10124
14
    { &hf_msg_osd_pg_create_mkpg_create, {
10125
14
      "Creation Options", "ceph.msg.osd.pg.create.mkpg.create",
10126
14
      FT_NONE, BASE_NONE, NULL, 0,
10127
14
      NULL, HFILL
10128
14
    } },
10129
14
    { &hf_msg_client_caps, {
10130
14
      "Client Caps", "ceph.msg.client_caps",
10131
14
      FT_NONE, BASE_NONE, NULL, 0,
10132
14
      NULL, HFILL
10133
14
    } },
10134
14
    { &hf_msg_client_caps_op, {
10135
14
      "Operation", "ceph.msg.client_caps.op",
10136
14
      FT_UINT32, BASE_HEX|BASE_EXT_STRING, &c_cap_op_type_strings_ext, 0,
10137
14
      NULL, HFILL
10138
14
    } },
10139
14
    { &hf_msg_client_caps_inode, {
10140
14
      "Inode", "ceph.msg.client_caps.inode",
10141
14
      FT_UINT64, BASE_HEX, NULL, 0,
10142
14
      NULL, HFILL
10143
14
    } },
10144
14
    { &hf_msg_client_caps_relam, {
10145
14
      "Relam", "ceph.msg.client_caps.relam",
10146
14
      FT_UINT64, BASE_DEC, NULL, 0,
10147
14
      NULL, HFILL
10148
14
    } },
10149
14
    { &hf_msg_client_caps_cap_id, {
10150
14
      "Cap ID", "ceph.msg.client_caps.cap_id",
10151
14
      FT_UINT64, BASE_HEX, NULL, 0,
10152
14
      NULL, HFILL
10153
14
    } },
10154
14
    { &hf_msg_client_caps_seq, {
10155
14
      "Sequence", "ceph.msg.client_caps.seq",
10156
14
      FT_UINT32, BASE_DEC, NULL, 0,
10157
14
      NULL, HFILL
10158
14
    } },
10159
14
    { &hf_msg_client_caps_seq_issue, {
10160
14
      "Issue Sequence", "ceph.msg.client_caps.seq_issue",
10161
14
      FT_UINT32, BASE_DEC, NULL, 0,
10162
14
      NULL, HFILL
10163
14
    } },
10164
14
    { &hf_msg_client_caps_new, {
10165
14
      "New Capabilities", "ceph.msg.client_caps.new",
10166
14
      FT_UINT32, BASE_HEX, NULL, 0,
10167
14
      NULL, HFILL
10168
14
    } },
10169
14
    { &hf_msg_client_caps_wanted, {
10170
14
      "Wanted Capabilities", "ceph.msg.client_caps.wanted",
10171
14
      FT_UINT32, BASE_DEC, NULL, 0,
10172
14
      NULL, HFILL
10173
14
    } },
10174
14
    { &hf_msg_client_caps_dirty, {
10175
14
      "Dirty Capabilities", "ceph.msg.client_caps.dirty",
10176
14
      FT_UINT32, BASE_DEC, NULL, 0,
10177
14
      NULL, HFILL
10178
14
    } },
10179
14
    { &hf_msg_client_caps_seq_migrate, {
10180
14
      "Migrate Sequence", "ceph.msg.client_caps_seq.migrate",
10181
14
      FT_UINT32, BASE_DEC, NULL, 0,
10182
14
      NULL, HFILL
10183
14
    } },
10184
14
    { &hf_msg_client_caps_snap_follows, {
10185
14
      "Snapshot Follows", "ceph.msg.client_caps.snap_follows",
10186
14
      FT_UINT64, BASE_DEC, NULL, 0,
10187
14
      NULL, HFILL
10188
14
    } },
10189
14
    { &hf_msg_client_caps_uid, {
10190
14
      "User ID", "ceph.msg.client_caps.uid",
10191
14
      FT_UINT32, BASE_DEC, NULL, 0,
10192
14
      NULL, HFILL
10193
14
    } },
10194
14
    { &hf_msg_client_caps_gid, {
10195
14
      "Group ID", "ceph.msg.client_caps.gid",
10196
14
      FT_UINT32, BASE_DEC, NULL, 0,
10197
14
      NULL, HFILL
10198
14
    } },
10199
14
    { &hf_msg_client_caps_mode, {
10200
14
      "Mode", "ceph.msg.client_caps.mode",
10201
14
      FT_UINT32, BASE_DEC, NULL, 0,
10202
14
      NULL, HFILL
10203
14
    } },
10204
14
    { &hf_msg_client_caps_nlink, {
10205
14
      "Number of Links", "ceph.msg.client_caps.nlink",
10206
14
      FT_UINT32, BASE_DEC, NULL, 0,
10207
14
      NULL, HFILL
10208
14
    } },
10209
14
    { &hf_msg_client_caps_xattr_ver, {
10210
14
      "Xattr Version", "ceph.msg.client_caps.xattr_ver",
10211
14
      FT_UINT64, BASE_DEC, NULL, 0,
10212
14
      NULL, HFILL
10213
14
    } },
10214
14
    { &hf_msg_client_caps_snap, {
10215
14
      "Snapshot Data", "ceph.msg.client_caps.snap",
10216
14
      FT_BYTES, BASE_NONE, NULL, 0,
10217
14
      NULL, HFILL
10218
14
    } },
10219
14
    { &hf_msg_client_caps_flock, {
10220
14
      "Flock", "ceph.msg.client_caps.flock",
10221
14
      FT_NONE, BASE_NONE, NULL, 0,
10222
14
      NULL, HFILL
10223
14
    } },
10224
14
    { &hf_msg_client_caps_inline_ver, {
10225
14
      "Inline Version", "ceph.msg.client_caps.inline_ver",
10226
14
      FT_UINT64, BASE_DEC, NULL, 0,
10227
14
      NULL, HFILL
10228
14
    } },
10229
14
    { &hf_msg_client_caps_inline_data, {
10230
14
      "Inline Data", "ceph.msg.client_caps.inline_data",
10231
14
      FT_NONE, BASE_NONE, NULL, 0,
10232
14
      NULL, HFILL
10233
14
    } },
10234
14
    { &hf_msg_client_caps_xattr, {
10235
14
      "Xattr", "ceph.msg.client_caps.xattr",
10236
14
      FT_BYTES, BASE_NONE, NULL, 0,
10237
14
      NULL, HFILL
10238
14
    } },
10239
14
    { &hf_msg_client_caprel, {
10240
14
      "Capability Release", "ceph.msg.client_caprel",
10241
14
      FT_NONE, BASE_NONE, NULL, 0,
10242
14
      NULL, HFILL
10243
14
    } },
10244
14
    { &hf_msg_client_caprel_cap, {
10245
14
      "Capability", "ceph.msg.client_caprel.cap",
10246
14
      FT_NONE, BASE_NONE, NULL, 0,
10247
14
      NULL, HFILL
10248
14
    } },
10249
14
    { &hf_msg_client_caprel_cap_inode, {
10250
14
      "Inode", "ceph.msg.client_caprel.cap.inode",
10251
14
      FT_UINT64, BASE_HEX, NULL, 0,
10252
14
      NULL, HFILL
10253
14
    } },
10254
14
    { &hf_msg_client_caprel_cap_id, {
10255
14
      "Capability ID", "ceph.msg.client_caprel.cap.id",
10256
14
      FT_UINT64, BASE_HEX, NULL, 0,
10257
14
      NULL, HFILL
10258
14
    } },
10259
14
    { &hf_msg_client_caprel_cap_migrate, {
10260
14
      "Migrate Sequence", "ceph.msg.client_caprel_cap.migrate",
10261
14
      FT_UINT32, BASE_DEC, NULL, 0,
10262
14
      NULL, HFILL
10263
14
    } },
10264
14
    { &hf_msg_client_caprel_cap_seq, {
10265
14
      "Sequence", "ceph.msg.client_caprel_cap.seq",
10266
14
      FT_UINT32, BASE_DEC, NULL, 0,
10267
14
      NULL, HFILL
10268
14
    } },
10269
14
    { &hf_msg_timecheck, {
10270
14
      "Timecheck", "ceph.msg.timecheck",
10271
14
      FT_NONE, BASE_NONE, NULL, 0,
10272
14
      NULL, HFILL
10273
14
    } },
10274
14
    { &hf_msg_timecheck_op, {
10275
14
      "Operation", "ceph.msg.timecheck.op",
10276
14
      FT_UINT32, BASE_HEX|BASE_EXT_STRING, &c_timecheck_op_strings_ext, 0,
10277
14
      NULL, HFILL
10278
14
    } },
10279
14
    { &hf_msg_timecheck_epoch, {
10280
14
      "Epoch", "ceph.msg.timecheck.epoch",
10281
14
      FT_UINT64, BASE_DEC, NULL, 0,
10282
14
      NULL, HFILL
10283
14
    } },
10284
14
    { &hf_msg_timecheck_round, {
10285
14
      "Round", "ceph.msg.timecheck.round",
10286
14
      FT_UINT64, BASE_DEC, NULL, 0,
10287
14
      NULL, HFILL
10288
14
    } },
10289
14
    { &hf_msg_timecheck_time, {
10290
14
      "Time", "ceph.msg.timecheck.time",
10291
14
      FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
10292
14
      NULL, HFILL
10293
14
    } },
10294
14
    { &hf_msg_timecheck_skew, {
10295
14
      "Skew", "ceph.msg.timecheck.skew",
10296
14
      FT_NONE, BASE_NONE, NULL, 0,
10297
14
      NULL, HFILL
10298
14
    } },
10299
14
    { &hf_msg_timecheck_skew_node, {
10300
14
      "Node", "ceph.msg.timecheck.skew.node",
10301
14
      FT_NONE, BASE_NONE, NULL, 0,
10302
14
      NULL, HFILL
10303
14
    } },
10304
14
    { &hf_msg_timecheck_skew_skew, {
10305
14
      "Skew", "ceph.msg.timecheck.skew.skew",
10306
14
      FT_DOUBLE, BASE_NONE, NULL, 0,
10307
14
      NULL, HFILL
10308
14
    } },
10309
14
    { &hf_msg_timecheck_latency, {
10310
14
      "Latency", "ceph.msg.timecheck.latency",
10311
14
      FT_NONE, BASE_NONE, NULL, 0,
10312
14
      NULL, HFILL
10313
14
    } },
10314
14
    { &hf_msg_timecheck_latency_node, {
10315
14
      "Node", "ceph.msg.timecheck.latency.node",
10316
14
      FT_NONE, BASE_NONE, NULL, 0,
10317
14
      NULL, HFILL
10318
14
    } },
10319
14
    { &hf_msg_timecheck_latency_latency, {
10320
14
      "Latency", "ceph.msg.timecheck.latency.latency",
10321
14
      FT_DOUBLE, BASE_NONE, NULL, 0,
10322
14
      NULL, HFILL
10323
14
    } },
10324
14
  };
10325
10326
  /* Setup protocol subtree array */
10327
14
  static int *ett[] = {
10328
14
    &ett_ceph,
10329
14
    &ett_data,
10330
14
    &ett_str,
10331
14
    &ett_blob,
10332
14
    &ett_sockaddr,
10333
14
    &ett_entityaddr,
10334
14
    &ett_entityname,
10335
14
    &ett_EntityName,
10336
14
    &ett_entityinst,
10337
14
    &ett_kv,
10338
14
    &ett_eversion,
10339
14
    &ett_objectlocator,
10340
14
    &ett_pg,
10341
14
    &ett_pg_create,
10342
14
    &ett_filepath,
10343
14
    &ett_mds_release,
10344
14
    &ett_hitset_params,
10345
14
    &ett_snapinfo,
10346
14
    &ett_pgpool,
10347
14
    &ett_pgpool_snap,
10348
14
    &ett_pgpool_snapdel,
10349
14
    &ett_pgpool_property,
10350
14
    &ett_mon_map,
10351
14
    &ett_mon_map_address,
10352
14
    &ett_osd_peerstat,
10353
14
    &ett_featureset,
10354
14
    &ett_featureset_name,
10355
14
    &ett_compatset,
10356
14
    &ett_osd_superblock,
10357
14
    &ett_osd_info,
10358
14
    &ett_osd_xinfo,
10359
14
    &ett_perfstat,
10360
14
    &ett_osdstat,
10361
14
    &ett_pg_stat,
10362
14
    &ett_osd_map,
10363
14
    &ett_osd_map_client,
10364
14
    &ett_osd_map_pool,
10365
14
    &ett_osd_map_poolname,
10366
14
    &ett_osd_map_pgtmp,
10367
14
    &ett_osd_map_primarytmp,
10368
14
    &ett_osd_map_erasurecodeprofile,
10369
14
    &ett_osd_map_osd,
10370
14
    &ett_osd_map_blacklist,
10371
14
    &ett_osd_map_inc,
10372
14
    &ett_osd_map_inc_client,
10373
14
    &ett_osd_map_inc_osd,
10374
14
    &ett_osd_op,
10375
14
    &ett_redirect,
10376
14
    &ett_statcollection,
10377
14
    &ett_paxos,
10378
14
    &ett_msg_mon_map,
10379
14
    &ett_msg_statfs,
10380
14
    &ett_msg_statfsreply,
10381
14
    &ett_msg_mon_sub,
10382
14
    &ett_msg_mon_sub_item,
10383
14
    &ett_msg_mon_sub_flags,
10384
14
    &ett_msg_mon_sub_ack,
10385
14
    &ett_msg_auth,
10386
14
    &ett_msg_auth_supportedproto,
10387
14
    &ett_msg_auth_cephx,
10388
14
    &ett_msg_authreply,
10389
14
    &ett_msg_mon_getversion,
10390
14
    &ett_msg_mon_getversionreply,
10391
14
    &ett_msg_mds_map,
10392
14
    &ett_msg_client_sess,
10393
14
    &ett_msg_client_req,
10394
14
    &ett_msg_client_reqfwd,
10395
14
    &ett_msg_client_reply,
10396
14
    &ett_msg_osd_map,
10397
14
    &ett_msg_osd_map_inc,
10398
14
    &ett_msg_osd_map_full,
10399
14
    &ett_msg_osd_op,
10400
14
    &ett_msg_osd_opreply,
10401
14
    &ett_msg_poolopreply,
10402
14
    &ett_msg_poolop,
10403
14
    &ett_msg_mon_cmd,
10404
14
    &ett_msg_mon_cmd_arg,
10405
14
    &ett_msg_mon_cmdack,
10406
14
    &ett_msg_mon_cmdack_arg,
10407
14
    &ett_msg_poolstats,
10408
14
    &ett_msg_poolstatsreply,
10409
14
    &ett_msg_poolstatsreply_stat,
10410
14
    &ett_msg_mon_election,
10411
14
    &ett_msg_mon_paxos,
10412
14
    &ett_msg_mon_paxos_value,
10413
14
    &ett_msg_mon_probe,
10414
14
    &ett_msg_osd_ping,
10415
14
    &ett_msg_osd_boot,
10416
14
    &ett_msg_pgstats,
10417
14
    &ett_msg_pgstats_pgstat,
10418
14
    &ett_msg_osd_pg_create,
10419
14
    &ett_msg_osd_pg_create_mkpg,
10420
14
    &ett_msg_client_caps,
10421
14
    &ett_msg_client_caprel,
10422
14
    &ett_msg_client_caprel_cap,
10423
14
    &ett_msg_timecheck,
10424
14
    &ett_msg_timecheck_skew,
10425
14
    &ett_msg_timecheck_latency,
10426
14
    &ett_head,
10427
14
    &ett_foot,
10428
14
    &ett_connect,
10429
14
    &ett_connect_reply,
10430
14
    &ett_filter_data,
10431
14
  };
10432
10433
  /* Expert info items. */
10434
14
  static ei_register_info ei[] = {
10435
14
    { &ei_unused, {
10436
14
      "ceph.unused", PI_UNDECODED, PI_WARN,
10437
14
      "Unused data in message. This usually indicates an error by the "
10438
14
      "sender or a bug in the dissector.", EXPFILL
10439
14
    } },
10440
14
    { &ei_overrun, {
10441
14
      "ceph.overrun", PI_UNDECODED, PI_WARN,
10442
14
      "There was less data then expected. This usually indicates an "
10443
14
      "error by the sender or a bug in the dissector.", EXPFILL
10444
14
    } },
10445
14
    { &ei_tag_unknown, {
10446
14
      "ceph.tag_unknown", PI_UNDECODED, PI_ERROR,
10447
14
      "Unknown tag. This is either an error by the sender or an "
10448
14
      "indication that the dissector is out of date.", EXPFILL
10449
14
    } },
10450
14
    { &ei_msg_unknown, {
10451
14
      "ceph.msg_unknown", PI_UNDECODED, PI_WARN,
10452
14
      "Unknown message type. This most likely means that the dissector "
10453
14
      "is out of date. However, it could also be an error by the "
10454
14
      "sender.", EXPFILL
10455
14
    } },
10456
14
    { &ei_union_unknown, {
10457
14
      "ceph.union_unknown", PI_UNDECODED, PI_WARN,
10458
14
      "This data's meaning depends on other information in the message "
10459
14
      "but the dissector doesn't know what type it is.", EXPFILL
10460
14
    } },
10461
14
    { &ei_ver_tooold, {
10462
14
      "ceph.ver.tooold", PI_UNDECODED, PI_WARN,
10463
14
      "This data is in an older format that is not supported by the "
10464
14
      "dissector.", EXPFILL
10465
14
    } },
10466
14
    { &ei_ver_toonew, {
10467
14
      "ceph.ver.toonew", PI_UNDECODED, PI_WARN,
10468
14
      "This data is in a newer format that is not supported by the "
10469
14
      "dissector.", EXPFILL
10470
14
    } },
10471
14
    { &ei_oloc_both, {
10472
14
      "ceph.oloc.both", PI_MALFORMED, PI_ERROR,
10473
14
      "Only one of the key or hash should be present, however both are.",
10474
14
      EXPFILL
10475
14
    } },
10476
#if 0
10477
    { &ei_banner_invalid, {
10478
      "ceph.banner.invalid", PI_MALFORMED, PI_ERROR,
10479
      "Banner was invalid.", EXPFILL
10480
    } },
10481
#endif
10482
14
    { &ei_sizeillogical, {
10483
14
      "ceph.sizeillogical", PI_MALFORMED, PI_ERROR,
10484
14
      "The claimed size is impossible.", EXPFILL
10485
14
    } },
10486
14
  };
10487
10488
  /* Register the protocol name and description */
10489
14
  proto_ceph = proto_register_protocol("Ceph", "Ceph", "ceph");
10490
10491
  /* Required function calls to register the header fields and subtrees */
10492
14
  proto_register_field_array(proto_ceph, hf, array_length(hf));
10493
14
  proto_register_subtree_array(ett, array_length(ett));
10494
14
  expert_ceph = expert_register_protocol(proto_ceph);
10495
14
  expert_register_field_array(expert_ceph, ei, array_length(ei));
10496
10497
14
  ceph_handle = register_dissector("ceph", dissect_ceph_old, proto_ceph);
10498
14
}
10499
10500
void
10501
proto_reg_handoff_ceph(void)
10502
14
{
10503
14
  heur_dissector_add("tcp", dissect_ceph_heur, "Ceph over TCP", "ceph_tcp", proto_ceph, HEURISTIC_ENABLE);
10504
14
}
10505
10506
/*
10507
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
10508
 *
10509
 * Local variables:
10510
 * c-basic-offset: 8
10511
 * tab-width: 8
10512
 * indent-tabs-mode: t
10513
 * End:
10514
 *
10515
 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
10516
 * :indentSize=8:tabSize=8:noTabs=false:
10517
 */