Bug Summary

File:builds/wireshark/wireshark/epan/dissectors/packet-ath.c
Warning:line 97, column 15
Value stored to 'info_srcaddr' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-ath.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-22/lib/clang/22 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D CARES_NO_DEPRECATED -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-22/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-nonliteral -std=gnu17 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -fdwarf2-cfi-asm -o /builds/wireshark/wireshark/sbout/2026-10-29-100330-3661-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-ath.c
1/* packet-ath.c
2 * Routines for ATH (Apache Tribes Heartbeat) dissection
3 * Copyright 2015, Eugene Adell <[email protected]>
4 *
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <[email protected]>
7 * Copyright 1998 Gerald Combs
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12#include "config.h"
13
14#include <epan/packet.h>
15#include <epan/expert.h>
16#include <epan/to_str.h>
17
18void proto_register_ath(void);
19void proto_reg_handoff_ath(void);
20
21static dissector_handle_t ath_handle;
22
23/* IMPORTANT IMPLEMENTATION NOTES
24 *
25 * You need to be looking at:
26 *
27 * http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html
28 *
29 * Tomcat clustering uses two protocols :
30 *
31 * - UDP heartbeats to maintain a status of all the members of the cluster
32 *
33 * - TCP RMI to send data across members
34 *
35 * This dissector is about UDP heartbeats, that we will call ATH, standing for
36 * Apache Tribes Heartbeat. Tribes is the name of the clustering libraries
37 * package of Apache Tomcat.
38 *
39 */
40
41#define ATH_PORT45564 45564 /* Not IANA registered */
42
43static int proto_ath;
44
45static int hf_ath_begin;
46static int hf_ath_padding;
47static int hf_ath_length;
48static int hf_ath_alive;
49static int hf_ath_port;
50static int hf_ath_sport;
51static int hf_ath_uport;
52static int hf_ath_hlen;
53static int hf_ath_ipv4;
54static int hf_ath_ipv6;
55static int hf_ath_clen;
56static int hf_ath_comm;
57static int hf_ath_dlen;
58static int hf_ath_domain;
59static int hf_ath_unique;
60static int hf_ath_plen;
61static int hf_ath_payload;
62static int hf_ath_end;
63
64static int ett_ath;
65
66static expert_field ei_ath_hlen_invalid;
67static expert_field ei_ath_hmark_invalid;
68
69static bool_Bool
70test_ath(tvbuff_t *tvb)
71{
72 /* Apache Tribes packets start with "TRIBES-B" in ASCII.
73 * tvb_strneql returns -1 if there aren't enough bytes.
74 */
75 if (tvb_strneql(tvb, 0, "TRIBES-B", 8) != 0) {
76 return false0;
77 }
78
79 return true1;
80}
81
82static int
83dissect_ath(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U___attribute__((unused)))
84{
85 unsigned offset = 0;
86
87 /* various lengths as reported in the packet itself */
88 uint8_t hlen = 0;
89 int32_t clen = 0;
90 int32_t dlen = 0;
91 int32_t plen = 0;
92
93 /* detect the Tribes (Tomcat) version */
94 int tribes_version_mark;
95
96 /* store the info */
97 const char *info_srcaddr = "";
Value stored to 'info_srcaddr' during its initialization is never read
98 const char *info_domain = "";
99 const char *info_command = "";
100
101 proto_item *ti, *hlen_item;
102 proto_tree *ath_tree;
103
104 if (!test_ath(tvb)) {
105 return 0;
106 }
107
108 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ATH");
109
110 /* Clear out stuff in the info column */
111 col_clear(pinfo->cinfo,COL_INFO);
112
113 ti = proto_tree_add_item(tree, proto_ath, tvb, 0, -1, ENC_NA0x00000000);
114 ath_tree = proto_item_add_subtree(ti, ett_ath);
115
116 /* Determine the Tribes version, which means determining the Tomcat version.
117 * There are 2 versions : one for Tomcat 6, and one for Tomcat 7/8
118 * We know that Tomcat 6 packets end with "-E" (Ox2d 0x45 or 11589 in decimal)
119 * and Tomcat 7/8 packets end with "Ox01 0x00" (256 in decimal)
120 * This is why we read these 2 last bytes of the packet
121 */
122 tribes_version_mark = tvb_get_ntohs(tvb, tvb_reported_length(tvb) - 2);
123
124 /* dissecting a Tomcat 6 packet
125 */
126 if (tribes_version_mark == 11589) { /* "-E" */
127
128 /* BEGIN
129 */
130 proto_tree_add_item(ath_tree, hf_ath_begin, tvb, offset, 8, ENC_ASCII0x00000000);
131 offset += 8;
132
133 /* LENGTH
134 */
135 proto_tree_add_item(ath_tree, hf_ath_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
136 offset += 4;
137
138 /* ALIVE TIME
139 */
140 proto_tree_add_item(ath_tree, hf_ath_alive, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
141 offset += 8;
142
143 /* PORT
144 */
145 proto_tree_add_item(ath_tree, hf_ath_port, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
146 offset += 4;
147
148 /* SECURE PORT
149 */
150 proto_tree_add_item(ath_tree, hf_ath_sport, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
151 offset += 4;
152
153 /* HOST LENGTH
154 */
155 hlen_item = proto_tree_add_item_ret_uint8(ath_tree, hf_ath_hlen, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &hlen);
156 offset += 1;
157
158 /* HOST
159 */
160 if (hlen == 4) {
161 proto_tree_add_item(ath_tree, hf_ath_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
162 info_srcaddr = tvb_ip_to_str(pinfo->pool, tvb, offset)tvb_address_to_str(pinfo->pool, tvb, AT_IPv4, offset);
163 } else if (hlen == 16) {
164 proto_tree_add_item(ath_tree, hf_ath_ipv6, tvb, offset, 16, ENC_NA0x00000000);
165 info_srcaddr = tvb_ip6_to_str(pinfo->pool, tvb, offset)tvb_address_to_str(pinfo->pool, tvb, AT_IPv6, offset);
166 } else {
167 expert_add_info(pinfo, hlen_item, &ei_ath_hlen_invalid);
168 return tvb_captured_length(tvb);
169 }
170 offset += hlen;
171
172 /* COMMAND LENGTH
173 */
174 proto_tree_add_item_ret_int(ath_tree, hf_ath_clen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &clen);
175 offset += 4;
176
177 /* COMMAND
178 */
179 proto_tree_add_item(ath_tree, hf_ath_comm, tvb, offset, clen, ENC_ASCII0x00000000);
180 if (clen != -1)
181 info_command = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset, clen, ENC_ASCII0x00000000);
182 offset += clen;
183
184 /* DOMAIN LENGTH
185 */
186 proto_tree_add_item_ret_int(ath_tree, hf_ath_dlen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &dlen);
187 offset += 4;
188
189 /* DOMAIN
190 */
191 proto_tree_add_item(ath_tree, hf_ath_domain, tvb, offset, dlen, ENC_ASCII0x00000000);
192 if (dlen != 0)
193 info_domain = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset, dlen, ENC_ASCII0x00000000);
194 offset += dlen;
195
196 /* UNIQUEID
197 */
198 proto_tree_add_item(ath_tree, hf_ath_unique, tvb, offset, 16, ENC_NA0x00000000);
199 offset += 16;
200
201 /* PAYLOAD LENGTH
202 */
203 proto_tree_add_item_ret_int(ath_tree, hf_ath_plen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &plen);
204 offset += 4;
205
206 /* PAYLOAD
207 */
208 proto_tree_add_item(ath_tree, hf_ath_payload, tvb, offset, plen, ENC_ASCII0x00000000);
209 offset += plen;
210
211 /* END
212 */
213 proto_tree_add_item(ath_tree, hf_ath_end, tvb, offset, 8, ENC_ASCII0x00000000);
214 }
215
216 /* dissecting a Tomcat 7/8 packet
217 */
218 else if (tribes_version_mark == 256) {
219
220 /* BEGIN
221 */
222 proto_tree_add_item(ath_tree, hf_ath_begin, tvb, offset, 8, ENC_ASCII0x00000000);
223 offset += 8;
224
225 proto_tree_add_item(ath_tree, hf_ath_padding, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
226 offset += 2;
227
228 /* LENGTH
229 */
230 proto_tree_add_item(ath_tree, hf_ath_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
231 offset += 4;
232
233 /* ALIVE TIME
234 */
235 proto_tree_add_item(ath_tree, hf_ath_alive, tvb, offset, 8, ENC_BIG_ENDIAN0x00000000);
236 offset += 8;
237
238 /* PORT
239 */
240 proto_tree_add_item(ath_tree, hf_ath_port, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
241 offset += 4;
242
243 /* SECURE PORT
244 */
245 proto_tree_add_item(ath_tree, hf_ath_sport, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
246 offset += 4;
247
248 /* UDP PORT, only in Tomcat 7/8
249 */
250 proto_tree_add_item(ath_tree, hf_ath_uport, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
251 offset += 4;
252
253 /* HOST LENGTH
254 */
255 hlen_item = proto_tree_add_item_ret_uint8(ath_tree, hf_ath_hlen, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &hlen);
256 offset += 1;
257
258 /* HOST
259 */
260 if (hlen == 4) {
261 proto_tree_add_item(ath_tree, hf_ath_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
262 info_srcaddr = tvb_ip_to_str(pinfo->pool, tvb, offset)tvb_address_to_str(pinfo->pool, tvb, AT_IPv4, offset);
263 } else if (hlen == 16) {
264 proto_tree_add_item(ath_tree, hf_ath_ipv6, tvb, offset, 16, ENC_NA0x00000000);
265 info_srcaddr = tvb_ip6_to_str(pinfo->pool, tvb, offset)tvb_address_to_str(pinfo->pool, tvb, AT_IPv6, offset);
266 } else {
267 expert_add_info(pinfo, hlen_item, &ei_ath_hlen_invalid);
268 return tvb_captured_length(tvb);
269 }
270 offset += hlen;
271
272 /* COMMAND LENGTH
273 */
274 proto_tree_add_item_ret_int(ath_tree, hf_ath_clen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &clen);
275 offset += 4;
276
277 /* COMMAND
278 */
279 proto_tree_add_item(ath_tree, hf_ath_comm, tvb, offset, clen, ENC_ASCII0x00000000);
280 if (clen != -1)
281 info_command = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset, clen, ENC_ASCII0x00000000);
282 offset += clen;
283
284 /* DOMAIN LENGTH
285 */
286 proto_tree_add_item_ret_int(ath_tree, hf_ath_dlen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &dlen);
287 offset += 4;
288
289 /* DOMAIN
290 */
291 proto_tree_add_item(ath_tree, hf_ath_domain, tvb, offset, dlen, ENC_ASCII0x00000000);
292 if (dlen != 0)
293 info_domain = (char*)tvb_get_string_enc(pinfo->pool, tvb, offset, dlen, ENC_ASCII0x00000000);
294 offset += dlen;
295
296 /* UNIQUEID
297 */
298 proto_tree_add_item(ath_tree, hf_ath_unique, tvb, offset, 16, ENC_NA0x00000000);
299 offset += 16;
300
301 /* PAYLOAD LENGTH
302 */
303 proto_tree_add_item_ret_int(ath_tree, hf_ath_plen, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &plen);
304 offset += 4;
305
306 /* PAYLOAD
307 */
308 proto_tree_add_item(ath_tree, hf_ath_payload, tvb, offset, plen, ENC_ASCII0x00000000);
309 offset += plen;
310
311 /* END
312 */
313 proto_tree_add_item(ath_tree, hf_ath_end, tvb, offset, 8, ENC_ASCII0x00000000);
314
315 } else {
316 proto_tree_add_expert_remaining(tree, pinfo, &ei_ath_hmark_invalid, tvb, offset);
317 return tvb_captured_length(tvb);
318 }
319
320 /* set the INFO column, and we're done !
321 */
322 if (strcmp(info_command, "") != 0) {
323 if (strcmp(info_command, "BABY-ALEX") == 0) {
324 if (strcmp(info_domain, "") != 0) {
325 col_append_fstr(pinfo->cinfo, COL_INFO, "%s is leaving domain %s", info_srcaddr, info_domain);
326 } else {
327 col_append_fstr(pinfo->cinfo, COL_INFO, "%s is leaving default domain", info_srcaddr);
328 }
329 } else {
330 if (strcmp(info_domain, "") != 0) {
331 col_append_fstr(pinfo->cinfo, COL_INFO, "Heartbeat from %s to domain %s", info_srcaddr, info_domain);
332 } else {
333 col_append_fstr(pinfo->cinfo, COL_INFO, "Heartbeat from %s to default domain", info_srcaddr);
334 }
335 }
336 } else {
337 if (strcmp(info_domain, "") != 0) {
338 col_append_fstr(pinfo->cinfo, COL_INFO, "Heartbeat from %s to domain %s", info_srcaddr, info_domain);
339 } else {
340 col_append_fstr(pinfo->cinfo, COL_INFO, "Heartbeat from %s to default domain", info_srcaddr);
341 }
342 }
343
344 return tvb_captured_length(tvb);
345}
346
347void
348proto_register_ath(void)
349{
350
351 expert_module_t* expert_ath;
352
353 static hf_register_info hf[] = {
354 { &hf_ath_begin,
355 { "Begin", "ath.begin", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, "Begin mark",
356 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
357 },
358 { &hf_ath_padding,
359 { "Padding", "ath.padding", FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0),
360 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
361 },
362 { &hf_ath_length,
363 { "Length", "ath.length", FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, "Data Length",
364 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
365 },
366 { &hf_ath_alive,
367 { "Alive Time", "ath.alive", FT_UINT64, BASE_DEC, NULL((void*)0), 0x0, "Alive Time counter",
368 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
369 },
370 { &hf_ath_port,
371 { "Port", "ath.port", FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, "RMI Port",
372 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
373 },
374 { &hf_ath_sport,
375 { "Secure Port", "ath.sport", FT_INT32, BASE_DEC, NULL((void*)0), 0x0, "RMI Secure Port",
376 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
377 },
378 { &hf_ath_uport,
379 { "UDP Port", "ath.uport", FT_INT32, BASE_DEC, NULL((void*)0), 0x0, "RMI UDP Port",
380 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
381 },
382 { &hf_ath_hlen,
383 { "Host Length", "ath.hlen", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, "Host IP Length",
384 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
385 },
386 { &hf_ath_ipv4,
387 { "Host", "ath.ipv4", FT_IPv4, BASE_NONE, NULL((void*)0), 0x0, "IPv4 Host",
388 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
389 },
390 { &hf_ath_ipv6,
391 { "Host", "ath.ipv6", FT_IPv6, BASE_NONE, NULL((void*)0), 0x0, "IPv6 Host",
392 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
393 },
394 { &hf_ath_clen,
395 { "Command Length", "ath.clen", FT_INT32, BASE_DEC, NULL((void*)0), 0x0, "Command Length for members",
396 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
397 },
398 { &hf_ath_comm,
399 { "Command", "ath.comm", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, "Command for members",
400 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
401 },
402 { &hf_ath_dlen,
403 { "Domain Length", "ath.dlen", FT_INT32, BASE_DEC, NULL((void*)0), 0x0, "Cluster Domain Length",
404 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
405 },
406 { &hf_ath_domain,
407 { "Domain", "ath.domain", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, "Cluster Domain",
408 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
409 },
410 { &hf_ath_unique,
411 { "uniqueId", "ath.unique", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, "UniqueID identifier",
412 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
413 },
414 { &hf_ath_plen,
415 { "Payload Length", "ath.plen", FT_INT32, BASE_DEC, NULL((void*)0), 0x0, "Packet Payload Length",
416 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
417 },
418 { &hf_ath_payload,
419 { "Payload", "ath.payload", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, "Packet Payload",
420 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
421 },
422 { &hf_ath_end,
423 { "End", "ath.end", FT_STRING, BASE_NONE, NULL((void*)0), 0x0, "End mark",
424 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
425 },
426 };
427
428 static ei_register_info ei[] = {
429 { &ei_ath_hlen_invalid, { "ath.hlen.invalid", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Decode aborted: invalid IP length", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
430 { &ei_ath_hmark_invalid, { "ath.hmark.invalid", PI_MALFORMED0x07000000, PI_ERROR0x00800000, "Decode aborted: not an ATH packet", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
431 };
432
433 static int *ett[] = {
434 &ett_ath,
435 };
436
437 proto_ath = proto_register_protocol("Apache Tribes Heartbeat Protocol", "ATH", "ath");
438 proto_register_field_array(proto_ath, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
439 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
440 expert_ath = expert_register_protocol(proto_ath);
441 expert_register_field_array(expert_ath, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
442
443 ath_handle = register_dissector("ath", dissect_ath, proto_ath);
444}
445
446void
447proto_reg_handoff_ath(void)
448{
449 dissector_add_uint_with_preference("udp.port", ATH_PORT45564, ath_handle);
450}
451
452/*
453 * Editor modelines - https://www.wireshark.org/tools/modelines.html
454 *
455 * Local variables:
456 * c-basic-offset: 2
457 * tab-width: 8
458 * indent-tabs-mode: nil
459 * End:
460 *
461 * vi: set shiftwidth=2 tabstop=8 expandtab:
462 * :indentSize=2:tabSize=8:noTabs=true:
463 */