1 /* packet-gluster_hndsk.c
2 * Routines for GlusterFS Handshake dissection
3 * Copyright 2012, Niels de Vos <ndevos@redhat.com>
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
9 * SPDX-License-Identifier: GPL-2.0-or-later
12 * References to source files point in general to the glusterfs sources.
13 * There is currently no RFC or other document where the protocol is
14 * completely described. The glusterfs sources can be found at:
15 * - http://git.gluster.com/?p=glusterfs.git
16 * - https://github.com/gluster/glusterfs
18 * The coding-style is roughly the same as the one use in the Linux kernel,
19 * see http://www.kernel.org/doc/Documentation/CodingStyle.
24 #include <epan/packet.h>
27 #include "packet-rpc.h"
28 #include "packet-gluster.h"
30 void proto_register_gluster_hndsk(void);
31 void proto_reg_handoff_gluster_hndsk(void);
32 void proto_register_gluster_cbk(void);
33 void proto_reg_handoff_gluster_cbk(void);
35 /* Initialize the protocol and registered fields */
36 static int proto_gluster_cbk
;
37 static int proto_gluster_hndsk
;
39 /* programs and procedures */
40 static int hf_gluster_cbk_proc
;
41 static int hf_gluster_hndsk_proc
;
42 static int hf_gluster_hndsk_dict
;
43 static int hf_gluster_hndsk_spec
; /* GETSPEC Reply */
44 static int hf_gluster_hndsk_key
; /* GETSPEC Call */
45 static int hf_gluster_hndsk_event_op
; /* EVENT NOTIFY call */
46 static int hf_gluster_hndsk_uid
; /* LOCK VERSION*/
47 static int hf_gluster_hndsk_op_errstr
; /* GETVOLUMEINFO */
48 static int hf_gluster_hndsk_lk_ver
;
49 static int hf_gluster_hndsk_flags
;
51 /* Initialize the subtree pointers */
52 static int ett_gluster_cbk
;
53 static int ett_gluster_cbk_flags
;
54 static int ett_gluster_hndsk
;
56 /* upcall, used for cache-invalidation etc. */
57 static int hf_gluster_cbk_gfid
;
58 static int hf_gluster_cbk_upcall_event_type
;
59 static int hf_gluster_cbk_ci_flags
;
60 static int hf_gluster_cbk_ci_expire_time_attr
;
61 static int hf_gluster_cbk_ci_stat
;
62 static int hf_gluster_cbk_ci_parent_stat
;
63 static int hf_gluster_cbk_ci_oldparent_stat
;
64 static int hf_gluster_cbk_xdata
;
66 /* flags for upcall */
67 static int hf_gluster_cbk_upcall_flag_nlink
;
68 static int hf_gluster_cbk_upcall_flag_mode
;
69 static int hf_gluster_cbk_upcall_flag_own
;
70 static int hf_gluster_cbk_upcall_flag_size
;
71 static int hf_gluster_cbk_upcall_flag_times
;
72 static int hf_gluster_cbk_upcall_flag_atime
;
73 static int hf_gluster_cbk_upcall_flag_perm
;
74 static int hf_gluster_cbk_upcall_flag_rename
;
75 static int hf_gluster_cbk_upcall_flag_forget
;
76 static int hf_gluster_cbk_upcall_flag_parent_times
;
77 static int hf_gluster_cbk_upcall_flag_xattr
;
78 static int hf_gluster_cbk_upcall_flag_xattr_rm
;
80 /* procedures for GLUSTER_HNDSK_PROGRAM */
82 gluster_hndsk_setvolume_reply(tvbuff_t
*tvb
, packet_info
*pinfo
,
83 proto_tree
*tree
, void* data
)
86 offset
= gluster_dissect_common_reply(tvb
, offset
, pinfo
, tree
, data
);
87 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
93 gluster_hndsk_setvolume_call(tvbuff_t
*tvb
,
94 packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
96 return gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
, 0);
100 gluster_hndsk_2_setvolume_reply(tvbuff_t
*tvb
, packet_info
*pinfo
,
101 proto_tree
*tree
, void* data
)
104 offset
= gluster_dissect_common_reply(tvb
, offset
, pinfo
, tree
, data
);
105 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
111 gluster_hndsk_2_setvolume_call(tvbuff_t
*tvb
,
112 packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
114 return gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
, 0);
118 gluster_hndsk_2_getspec_reply(tvbuff_t
*tvb
, packet_info
*pinfo
,
119 proto_tree
*tree
, void* data
)
122 offset
= gluster_dissect_common_reply(tvb
, offset
, pinfo
, tree
, data
);
123 offset
= dissect_rpc_string(tvb
, tree
, hf_gluster_hndsk_spec
, offset
,
125 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
131 gluster_hndsk_2_getspec_call(tvbuff_t
*tvb
,
132 packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
136 proto_tree_add_item(tree
, hf_gluster_hndsk_flags
, tvb
, offset
,
139 offset
= dissect_rpc_string(tvb
, tree
, hf_gluster_hndsk_key
, offset
,
141 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
147 gluster_hndsk_2_set_lk_ver_reply(tvbuff_t
*tvb
, packet_info
*pinfo
,
148 proto_tree
*tree
, void* data
)
151 offset
= gluster_dissect_common_reply(tvb
, offset
, pinfo
, tree
, data
);
152 offset
= dissect_rpc_uint32(tvb
, tree
,hf_gluster_hndsk_lk_ver
, offset
);
157 gluster_hndsk_2_set_lk_ver_call(tvbuff_t
*tvb
,
158 packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
162 offset
= dissect_rpc_string(tvb
, tree
, hf_gluster_hndsk_uid
, offset
,
164 offset
= dissect_rpc_uint32(tvb
, tree
,hf_gluster_hndsk_lk_ver
, offset
);
169 gluster_hndsk_2_event_notify_call(tvbuff_t
*tvb
,
170 packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
174 offset
= dissect_rpc_uint32(tvb
, tree
, hf_gluster_hndsk_event_op
,
176 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
181 /* In rpc/xdr/src/glusterfs3-xdr.c. xdr_gf_event_notify_rsp */
184 gluster_hndsk_2_event_notify_reply(tvbuff_t
*tvb
,
185 packet_info
*pinfo
, proto_tree
*tree
, void* data
)
188 offset
= gluster_dissect_common_reply(tvb
, offset
, pinfo
, tree
, data
);
189 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
195 gluster_hndsk_2_get_volume_info_call(tvbuff_t
*tvb
, packet_info
*pinfo _U_
,
196 proto_tree
*tree
, void* data _U_
)
198 return gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
, 0);
202 gluster_hndsk_2_get_volume_info_reply(tvbuff_t
*tvb
, packet_info
*pinfo
,
203 proto_tree
*tree
, void* data
)
206 offset
= gluster_dissect_common_reply(tvb
, offset
, pinfo
, tree
, data
);
207 offset
= dissect_rpc_string(tvb
, tree
, hf_gluster_hndsk_op_errstr
, offset
,
209 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_hndsk_dict
,
215 glusterfs_rpc_dissect_upcall_flags(proto_tree
*tree
, tvbuff_t
*tvb
, int offset
)
217 static int * const flag_bits
[] = {
218 &hf_gluster_cbk_upcall_flag_nlink
,
219 &hf_gluster_cbk_upcall_flag_mode
,
220 &hf_gluster_cbk_upcall_flag_own
,
221 &hf_gluster_cbk_upcall_flag_size
,
222 &hf_gluster_cbk_upcall_flag_times
,
223 &hf_gluster_cbk_upcall_flag_atime
,
224 &hf_gluster_cbk_upcall_flag_perm
,
225 &hf_gluster_cbk_upcall_flag_rename
,
226 &hf_gluster_cbk_upcall_flag_forget
,
227 &hf_gluster_cbk_upcall_flag_parent_times
,
228 &hf_gluster_cbk_upcall_flag_xattr
,
229 &hf_gluster_cbk_upcall_flag_xattr_rm
,
234 proto_tree_add_bitmask(tree
, tvb
, offset
,
235 hf_gluster_cbk_ci_flags
, ett_gluster_cbk_flags
,
236 flag_bits
, ENC_BIG_ENDIAN
);
242 /* In rpc/xdr/src/glusterfs3-xdr.c. xdr_gfs3_cbk_cache_invalidation_req */
244 gluster_cbk_cache_invalidation_call(tvbuff_t
*tvb
,
245 packet_info
*pinfo _U_
, proto_tree
*tree
, void* data _U_
)
249 offset
= dissect_rpc_string(tvb
, tree
, hf_gluster_cbk_gfid
, offset
, NULL
);
250 offset
= dissect_rpc_uint32(tvb
, tree
, hf_gluster_cbk_upcall_event_type
, offset
);
251 offset
= glusterfs_rpc_dissect_upcall_flags(tree
, tvb
, offset
);
252 offset
= dissect_rpc_uint32(tvb
, tree
, hf_gluster_cbk_ci_expire_time_attr
, offset
);
253 offset
= glusterfs_rpc_dissect_gf_iatt(tree
, tvb
,
254 hf_gluster_cbk_ci_stat
, offset
);
255 offset
= glusterfs_rpc_dissect_gf_iatt(tree
, tvb
,
256 hf_gluster_cbk_ci_parent_stat
, offset
);
257 offset
= glusterfs_rpc_dissect_gf_iatt(tree
, tvb
,
258 hf_gluster_cbk_ci_oldparent_stat
, offset
);
259 offset
= gluster_rpc_dissect_dict(tree
, tvb
, hf_gluster_cbk_xdata
, offset
);
264 gluster_hndsk_dissect_common_reply(tvbuff_t
*tvb
,
265 packet_info
*pinfo
, proto_tree
*tree
, void* data
)
267 return gluster_dissect_common_reply(tvb
, 0, pinfo
, tree
, data
);
270 static const vsff gluster_hndsk_proc
[] = {
272 GF_HNDSK_NULL
, "NULL",
273 dissect_rpc_void
, dissect_rpc_void
276 GF_HNDSK_SETVOLUME
, "SETVOLUME",
277 gluster_hndsk_setvolume_call
, gluster_hndsk_setvolume_reply
279 { GF_HNDSK_GETSPEC
, "GETSPEC", dissect_rpc_unknown
, dissect_rpc_unknown
},
281 GF_HNDSK_PING
, "PING",
282 dissect_rpc_void
, gluster_hndsk_dissect_common_reply
284 { 0, NULL
, NULL
, NULL
}
287 static const vsff gluster_hndsk_2_proc
[] = {
289 GF_HNDSK_NULL
, "NULL",
290 dissect_rpc_void
, dissect_rpc_void
293 GF_HNDSK_SETVOLUME
, "SETVOLUME",
294 gluster_hndsk_2_setvolume_call
, gluster_hndsk_2_setvolume_reply
297 GF_HNDSK_GETSPEC
, "GETSPEC",
298 gluster_hndsk_2_getspec_call
, gluster_hndsk_2_getspec_reply
301 GF_HNDSK_PING
, "PING",
302 dissect_rpc_void
, glusterfs_gfs3_3_op_common_reply
305 GF_HNDSK_SET_LK_VER
,"LOCK VERSION",
306 gluster_hndsk_2_set_lk_ver_call
, gluster_hndsk_2_set_lk_ver_reply
309 GF_HNDSK_EVENT_NOTIFY
, "EVENTNOTIFY",
310 gluster_hndsk_2_event_notify_call
,
311 gluster_hndsk_2_event_notify_reply
314 GF_HNDSK_GET_VOLUME_INFO
, "GETVOLUMEINFO",
315 gluster_hndsk_2_get_volume_info_call
,
316 gluster_hndsk_2_get_volume_info_reply
318 { 0, NULL
, NULL
, NULL
}
322 static const rpc_prog_vers_info gluster_hndsk_vers_info
[] = {
323 { 1, gluster_hndsk_proc
, &hf_gluster_hndsk_proc
},
324 { 2, gluster_hndsk_2_proc
, &hf_gluster_hndsk_proc
},
328 static const value_string gluster_hndsk_proc_vals
[] = {
329 { GF_HNDSK_NULL
, "NULL" },
330 { GF_HNDSK_SETVOLUME
, "DUMP" },
331 { GF_HNDSK_GETSPEC
, "GETSPEC" },
332 { GF_HNDSK_PING
, "PING" },
333 { GF_HNDSK_SET_LK_VER
, "LOCK VERSION" },
334 { GF_HNDSK_EVENT_NOTIFY
, "EVENTNOTIFY" },
335 { GF_HNDSK_GET_VOLUME_INFO
, "GETVOLUMEINFO" },
340 proto_register_gluster_hndsk(void)
342 static hf_register_info hf
[] = {
343 { &hf_gluster_hndsk_proc
,
344 { "GlusterFS Handshake", "glusterfs.hndsk.proc",
346 VALS(gluster_hndsk_proc_vals
), 0, NULL
, HFILL
}
348 /* fields used by Gluster Handshake */
349 { &hf_gluster_hndsk_dict
,
350 { "Dict", "glusterfs.hndsk.dict", FT_STRING
, BASE_NONE
,
351 NULL
, 0, NULL
, HFILL
}
353 /* For Gluster handshake event notify */
354 { &hf_gluster_hndsk_event_op
,
355 { "Event Op", "glusterfs.hndsk.event_notify_op",
356 FT_UINT32
, BASE_DEC
, NULL
, 0, NULL
, HFILL
}
358 { &hf_gluster_hndsk_key
,
359 { "Key", "glusterfs.hndsk.getspec.key", FT_STRING
,
360 BASE_NONE
, NULL
, 0, NULL
, HFILL
}
362 { &hf_gluster_hndsk_spec
,
363 /* FIXME: rename spec to something clearer */
364 { "Spec", "glusterfs.hndsk.getspec", FT_STRING
,
365 BASE_NONE
, NULL
, 0, NULL
, HFILL
}
367 /* For hand shake set_lk_ver */
368 { &hf_gluster_hndsk_uid
,
369 { "Name", "glusterfs.hndsk.uid", FT_STRING
, BASE_NONE
,
370 NULL
, 0, NULL
, HFILL
}
372 { &hf_gluster_hndsk_lk_ver
,
373 { "Event Op", "glusterfs.hndsk.lk_ver", FT_UINT32
,
374 BASE_DEC
, NULL
, 0, NULL
, HFILL
}
376 { &hf_gluster_hndsk_flags
,
377 { "Flags", "glusterfs.hndsk.flags", FT_UINT32
, BASE_OCT
,
378 NULL
, 0, NULL
, HFILL
}
380 /* For handshake getvolumeinfo */
381 { &hf_gluster_hndsk_op_errstr
,
382 { "Op Errstr", "glusterfs.hndsk.getvolumeinfo.op_errstr", FT_STRING
,
383 BASE_NONE
, NULL
, 0, NULL
, HFILL
}
387 /* Setup protocol subtree array */
388 static int *ett
[] = {
392 /* Register the protocol name and description */
393 proto_gluster_hndsk
= proto_register_protocol("GlusterFS Handshake",
394 "GlusterFS Handshake",
396 proto_register_subtree_array(ett
, array_length(ett
));
397 proto_register_field_array(proto_gluster_hndsk
, hf
, array_length(hf
));
402 proto_reg_handoff_gluster_hndsk(void)
404 rpc_init_prog(proto_gluster_hndsk
, GLUSTER_HNDSK_PROGRAM
,
406 G_N_ELEMENTS(gluster_hndsk_vers_info
), gluster_hndsk_vers_info
);
409 /* Legacy GlusterFS Callback procedures, they don't contain any data. */
410 static const vsff gluster_cbk_proc
[] = {
411 { GF_CBK_NULL
, "NULL", dissect_rpc_void
, dissect_rpc_void
},
412 { GF_CBK_FETCHSPEC
, "FETCHSPEC", dissect_rpc_unknown
, dissect_rpc_unknown
},
413 { GF_CBK_INO_FLUSH
, "INO_FLUSH", dissect_rpc_unknown
, dissect_rpc_unknown
},
414 { GF_CBK_EVENT_NOTIFY
, "EVENTNOTIFY", dissect_rpc_unknown
, dissect_rpc_unknown
},
415 { GF_CBK_GET_SNAPS
, "GETSNAPS", dissect_rpc_unknown
, dissect_rpc_unknown
},
416 { GF_CBK_CACHE_INVALIDATION
, "CACHE_INVALIDATION",
417 gluster_cbk_cache_invalidation_call
, dissect_rpc_unknown
},
418 { 0, NULL
, NULL
, NULL
}
420 static const rpc_prog_vers_info gluster_cbk_vers_info
[] = {
421 { 1, gluster_cbk_proc
, &hf_gluster_cbk_proc
},
423 static const value_string gluster_cbk_proc_vals
[] = {
424 { GF_CBK_NULL
, "NULL" },
425 { GF_CBK_FETCHSPEC
, "FETCHSPEC" },
426 { GF_CBK_INO_FLUSH
, "INO_FLUSH" },
427 { GF_CBK_EVENT_NOTIFY
, "EVENTNOTIFY" },
428 { GF_CBK_GET_SNAPS
, "GETSNAPS" },
429 { GF_CBK_CACHE_INVALIDATION
, "CACHE_INVALIDATION" },
433 static const value_string gluster_cbk_upcall_event_type
[] = {
434 { GF_UPCALL_EVENT_NULL
, "NULL" },
435 { GF_UPCALL_CACHE_INVALIDATION
, "CACHE_INVALIDATION" },
438 static value_string_ext gluster_cbk_upcall_event_type_ext
= VALUE_STRING_EXT_INIT(gluster_cbk_upcall_event_type
);
441 proto_register_gluster_cbk(void)
443 /* Setup list of header fields See Section 1.6.1 for details */
444 static hf_register_info hf
[] = {
446 { &hf_gluster_cbk_proc
,
447 { "GlusterFS Callback", "glusterfs.cbk.proc",
449 VALS(gluster_cbk_proc_vals
), 0, NULL
, HFILL
}
451 { &hf_gluster_cbk_gfid
,
452 { "GFID", "glusterfs.cbk.gfid", FT_STRING
, BASE_NONE
,
453 NULL
, 0, NULL
, HFILL
}
455 { &hf_gluster_cbk_upcall_event_type
,
456 { "Event Type", "glusterfs.cbk.upcall.event_type", FT_UINT32
, BASE_DEC
| BASE_EXT_STRING
,
457 &gluster_cbk_upcall_event_type_ext
, 0, NULL
, HFILL
}
459 { &hf_gluster_cbk_ci_flags
,
460 { "Flags", "glusterfs.cbk.cache_invalidation.flags", FT_UINT32
, BASE_DEC_HEX
,
461 NULL
, 0, NULL
, HFILL
}
463 { &hf_gluster_cbk_ci_expire_time_attr
,
464 { "Expire Time Attr", "glusterfs.cbk.cache_invalidation.expire_time_attr",
465 FT_UINT32
, BASE_DEC
, NULL
, 0, NULL
, HFILL
}
467 { &hf_gluster_cbk_ci_stat
,
468 { "Stat", "glusterfs.cbk.cache_invalidation.stat", FT_NONE
, BASE_NONE
, NULL
,
471 { &hf_gluster_cbk_ci_parent_stat
,
472 { "Parent Stat", "glusterfs.cbk.cache_invalidation.parent.stat", FT_NONE
, BASE_NONE
, NULL
,
475 { &hf_gluster_cbk_ci_oldparent_stat
,
476 { "Old Parent Stat", "glusterfs.cbk.cache_invalidation.oldparent.stat",
477 FT_NONE
, BASE_NONE
, NULL
, 0, NULL
, HFILL
}
479 { &hf_gluster_cbk_xdata
,
480 { "Xdata", "glusterfs.cbk.xdata", FT_STRING
, BASE_NONE
,
481 NULL
, 0, NULL
, HFILL
}
484 /* upcall flags from libglusterfs/src/upcall-utils.h */
485 { &hf_gluster_cbk_upcall_flag_nlink
,
486 { "NLINK", "glusterfs.cbk.cache_invalidation.flag.nlink",
487 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000001,
490 { &hf_gluster_cbk_upcall_flag_mode
,
491 { "MODE", "glusterfs.cbk.cache_invalidation.flag.mode",
492 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000002,
495 { &hf_gluster_cbk_upcall_flag_own
,
496 { "OWN", "glusterfs.cbk.cache_invalidation.flag.own",
497 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000004,
500 { &hf_gluster_cbk_upcall_flag_size
,
501 { "SIZE", "glusterfs.cbk.cache_invalidation.flag.size",
502 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000008,
505 { &hf_gluster_cbk_upcall_flag_times
,
506 { "TIMES", "glusterfs.cbk.cache_invalidation.flag.times",
507 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000010,
510 { &hf_gluster_cbk_upcall_flag_atime
,
511 { "ATIME", "glusterfs.cbk.cache_invalidation.flag.atime",
512 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000020,
515 { &hf_gluster_cbk_upcall_flag_perm
,
516 { "PERM", "glusterfs.cbk.cache_invalidation.flag.perm",
517 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000040,
520 { &hf_gluster_cbk_upcall_flag_rename
,
521 { "RENAME", "glusterfs.cbk.cache_invalidation.flag.rename",
522 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000080,
525 { &hf_gluster_cbk_upcall_flag_forget
,
526 { "FORGET", "glusterfs.cbk.cache_invalidation.flag.forget",
527 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000100,
530 { &hf_gluster_cbk_upcall_flag_parent_times
,
531 { "PARENT_TIMES", "glusterfs.cbk.cache_invalidation.flag.parent_times",
532 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000200,
535 { &hf_gluster_cbk_upcall_flag_xattr
,
536 { "XATTR", "glusterfs.cbk.cache_invalidation.flag.xattr",
537 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000400,
540 { &hf_gluster_cbk_upcall_flag_xattr_rm
,
541 { "XATTR_RM", "glusterfs.cbk.cache_invalidation.flag.xattr_rm",
542 FT_BOOLEAN
, 32, TFS(&tfs_set_notset
), 0x00000800,
547 /* Setup protocol subtree array */
548 static int *ett
[] = {
550 &ett_gluster_cbk_flags
553 /* Register the protocol name and description */
554 proto_gluster_cbk
= proto_register_protocol("GlusterFS Callback",
555 "GlusterFS Callback", "glusterfs.cbk");
556 proto_register_subtree_array(ett
, array_length(ett
));
557 proto_register_field_array(proto_gluster_cbk
, hf
, array_length(hf
));
561 proto_reg_handoff_gluster_cbk(void)
563 rpc_init_prog(proto_gluster_cbk
, GLUSTER_CBK_PROGRAM
, ett_gluster_cbk
,
564 G_N_ELEMENTS(gluster_cbk_vers_info
), gluster_cbk_vers_info
);
568 * Editor modelines - https://www.wireshark.org/tools/modelines.html
573 * indent-tabs-mode: t
576 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
577 * :indentSize=8:tabSize=8:noTabs=false: