TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags
[wireshark-sm.git] / epan / dissectors / packet-msnlb.c
blob3b2bb46e51010298b1046fd7e53b9fe2dd1ad7a2
1 /* packet-msnlb.c
2 * Routines for MS NLB dissection
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
11 #include "config.h"
13 #include <epan/packet.h>
14 #include <epan/etypes.h>
15 #include <epan/to_str.h>
16 #include <epan/tfs.h>
17 #include <wsutil/array.h>
18 #include "packet-smb-common.h"
20 void proto_register_msnlb(void);
21 void proto_reg_handoff_msnlb(void);
23 static dissector_handle_t msnlb_handle;
25 /* Initialize the protocol and registered fields */
26 static int proto_msnlb;
28 static int hf_msnlb_signature;
29 static int hf_msnlb_version;
30 static int hf_msnlb_uniquehostid;
31 static int hf_msnlb_clusterip;
32 static int hf_msnlb_dedicatedip;
33 static int hf_msnlb_signature_data;
35 static int hf_msnlb_myhostid;
36 static int hf_msnlb_defaulthostid;
37 static int hf_msnlb_convergencestate;
38 static int hf_msnlb_numberofportrules;
39 static int hf_msnlb_uniquehostcode;
40 static int hf_msnlb_packetshandled;
41 static int hf_msnlb_teamingcfg;
42 static int hf_msnlb_teamingcfg_reserved;
43 static int hf_msnlb_teamingcfg_xorclusterip;
44 static int hf_msnlb_teamingcfg_numberofparticipants;
45 static int hf_msnlb_teamingcfg_hashing;
46 static int hf_msnlb_teamingcfg_master;
47 static int hf_msnlb_teamingcfg_active;
48 static int hf_msnlb_reserved;
49 static int hf_msnlb_portruleconfiguration;
50 static int hf_msnlb_portruleconfiguration_data;
51 static int hf_msnlb_currentmap;
52 static int hf_msnlb_currentmap_data;
53 static int hf_msnlb_newmap;
54 static int hf_msnlb_newmap_data;
55 static int hf_msnlb_idlemap;
56 static int hf_msnlb_idlemap_data;
57 static int hf_msnlb_readymap;
58 static int hf_msnlb_readymap_data;
59 static int hf_msnlb_loadweights;
60 static int hf_msnlb_loadweights_data;
61 static int hf_msnlb_reserved2;
62 static int hf_msnlb_reserved2_data;
64 static int hf_msnlb_extended_hb;
65 static int hf_msnlb_extended_hb_type;
66 static int hf_msnlb_length;
67 static int hf_msnlb_address_family;
68 static int hf_msnlb_host_name;
69 static int hf_msnlb_host_ipv4;
70 static int hf_msnlb_host_ipv6;
71 static int hf_msnlb_host_unknown;
72 static int hf_msnlb_padding;
73 static int hf_msnlb_extended_hb_unknown;
75 static int ett_msnlb;
76 static int ett_msnlb_signature;
77 static int ett_msnlb_teamingcfg;
78 static int ett_msnlb_portruleconfiguration;
79 static int ett_msnlb_currentmap;
80 static int ett_msnlb_newmap;
81 static int ett_msnlb_idlemap;
82 static int ett_msnlb_readymap;
83 static int ett_msnlb_loadweights;
84 static int ett_msnlb_reserved;
85 static int ett_msnlb_extended_hb;
87 #define NLB_CLUSTER_MEMBERSHIP_HB 0xC0DE01BF
88 #define NLB_EXTENDED_HB 0xC0DE01C0
89 #define NLB_RELIABLE_PROTOCOL 0xC0DE01DE
91 static const value_string nlb_signature_vals[] = {
92 { NLB_CLUSTER_MEMBERSHIP_HB, "NLB Cluster Membership HeartBeat" },
93 { NLB_EXTENDED_HB, "NLB Extended HeartBeat" },
94 { NLB_RELIABLE_PROTOCOL, "NLB Reliable Protocol" },
95 { 0, NULL }
98 static const value_string nlb_extended_hb_type_vals[] = {
99 { 1, "Host name" },
100 { 2, "IP Address" },
101 { 0, NULL }
104 static const value_string nlb_address_family_vals[] = {
105 { 0x2, "IPv4" },
106 { 0x17, "IPv6" },
107 { 0, NULL }
110 static true_false_string tfs_reverse_normal = { "Reverse", "Normal" };
112 static void
113 version_base_custom(char *result, uint32_t version)
115 snprintf(result, ITEM_LABEL_LENGTH, "%d.%d", (version >> 8) & 0xFF, (version & 0xFF));
118 static int
119 dissect_msnlb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
121 proto_item *ti;
122 proto_tree *msnlb_tree = NULL, *msnlb_subtree;
123 uint16_t offset = 0;
124 uint32_t signature;
126 col_set_str(pinfo->cinfo, COL_PROTOCOL, "MS NLB");
128 col_set_str(pinfo->cinfo, COL_INFO, "MS NLB heartbeat");
130 if (tree) {
131 ti = proto_tree_add_item(tree, proto_msnlb, tvb, 0, -1, ENC_NA);
132 msnlb_tree = proto_item_add_subtree(ti, ett_msnlb);
135 proto_tree_add_item(msnlb_tree, hf_msnlb_signature, tvb, offset, 4, ENC_LITTLE_ENDIAN);
136 signature = tvb_get_letohl(tvb, offset);
137 offset += 4;
139 proto_tree_add_item(msnlb_tree, hf_msnlb_version, tvb, offset, 4, ENC_LITTLE_ENDIAN);
140 offset += 4;
142 proto_tree_add_item(msnlb_tree, hf_msnlb_uniquehostid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
143 offset += 4;
145 proto_tree_add_item(msnlb_tree, hf_msnlb_clusterip, tvb, offset, 4, ENC_BIG_ENDIAN);
146 offset += 4;
148 proto_tree_add_item(msnlb_tree, hf_msnlb_dedicatedip, tvb, offset, 4, ENC_BIG_ENDIAN);
149 offset += 4;
151 ti = proto_tree_add_item(msnlb_tree, hf_msnlb_signature_data, tvb, offset, -1, ENC_NA);
152 proto_item_append_text(ti, " - %s", val_to_str(signature, nlb_signature_vals, "Unknown (%u)"));
153 col_append_fstr(pinfo->cinfo, COL_INFO, " - %s", val_to_str(signature, nlb_signature_vals, "Unknown (%u)"));
154 msnlb_subtree = proto_item_add_subtree(ti, ett_msnlb_signature);
156 switch(signature){
157 case NLB_CLUSTER_MEMBERSHIP_HB:{
158 uint32_t i;
159 proto_tree *teamingcfg_tree, *subtree;
161 proto_tree_add_item(msnlb_subtree, hf_msnlb_myhostid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
162 offset += 2;
164 proto_tree_add_item(msnlb_subtree, hf_msnlb_defaulthostid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
165 offset += 2;
167 proto_tree_add_item(msnlb_subtree, hf_msnlb_convergencestate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
168 offset += 2;
170 proto_tree_add_item(msnlb_subtree, hf_msnlb_numberofportrules, tvb, offset, 2, ENC_LITTLE_ENDIAN);
171 offset += 2;
173 proto_tree_add_item(msnlb_subtree, hf_msnlb_uniquehostcode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
174 offset += 4;
176 proto_tree_add_item(msnlb_subtree, hf_msnlb_packetshandled, tvb, offset, 4, ENC_LITTLE_ENDIAN);
177 offset += 4;
179 /* Teaming configuration/state code, which is of the form:
181 -------------------------------------
182 |XXXXXXXX|PPPPPPPP|PPPPPPPP|NNNNNHMA|
183 -------------------------------------
185 X: Reserved
186 P: XOR of the least significant 16 bits of each participant's cluster IP address
187 N: Number of participants
188 H: Hashing (Reverse=1, Normal=0)
189 M: Master (Yes=1, No=0)
190 A: Teaming active (Yes=1, No=0)
193 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_teamingcfg, tvb, offset, 4, ENC_LITTLE_ENDIAN);
194 teamingcfg_tree = proto_item_add_subtree(ti, ett_msnlb_teamingcfg);
195 proto_tree_add_item(teamingcfg_tree, hf_msnlb_teamingcfg_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
196 proto_tree_add_item(teamingcfg_tree, hf_msnlb_teamingcfg_xorclusterip, tvb, offset, 4, ENC_LITTLE_ENDIAN);
197 proto_tree_add_item(teamingcfg_tree, hf_msnlb_teamingcfg_numberofparticipants, tvb, offset, 4, ENC_LITTLE_ENDIAN);
198 proto_tree_add_item(teamingcfg_tree, hf_msnlb_teamingcfg_hashing, tvb, offset, 4, ENC_LITTLE_ENDIAN);
199 proto_tree_add_item(teamingcfg_tree, hf_msnlb_teamingcfg_master, tvb, offset, 4, ENC_LITTLE_ENDIAN);
200 proto_tree_add_item(teamingcfg_tree, hf_msnlb_teamingcfg_active, tvb, offset, 4, ENC_LITTLE_ENDIAN);
201 offset += 4;
203 proto_tree_add_item(msnlb_subtree, hf_msnlb_reserved, tvb, offset, 4, ENC_NA);
204 offset += 4;
206 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_portruleconfiguration, tvb, offset, 4*33, ENC_NA);
207 subtree = proto_item_add_subtree(ti, ett_msnlb_portruleconfiguration);
208 for(i = 1; i <= 33; i++){
209 proto_tree_add_item(subtree, hf_msnlb_portruleconfiguration_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
210 offset += 4;
213 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_currentmap, tvb, offset, 8*33, ENC_NA);
214 subtree = proto_item_add_subtree(ti, ett_msnlb_currentmap);
215 for(i = 1; i <= 33; i++){
216 proto_tree_add_item(subtree, hf_msnlb_currentmap_data, tvb, offset, 8, ENC_LITTLE_ENDIAN);
217 offset += 8;
220 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_newmap, tvb, offset, 8*33, ENC_NA);
221 subtree = proto_item_add_subtree(ti, ett_msnlb_newmap);
222 for(i = 1; i <= 33; i++){
223 proto_tree_add_item(subtree, hf_msnlb_newmap_data, tvb, offset, 8, ENC_LITTLE_ENDIAN);
224 offset += 8;
227 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_idlemap, tvb, offset, 8*33, ENC_NA);
228 subtree = proto_item_add_subtree(ti, ett_msnlb_idlemap);
229 for(i = 1; i <= 33; i++){
230 proto_tree_add_item(subtree, hf_msnlb_idlemap_data, tvb, offset, 8, ENC_LITTLE_ENDIAN);
231 offset += 8;
234 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_readymap, tvb, offset, 8*33, ENC_NA);
235 subtree = proto_item_add_subtree(ti, ett_msnlb_readymap);
236 for(i = 1; i <= 33; i++){
237 proto_tree_add_item(subtree, hf_msnlb_readymap_data, tvb, offset, 8, ENC_LITTLE_ENDIAN);
238 offset += 8;
241 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_loadweights, tvb, offset, 4*33, ENC_NA);
242 subtree = proto_item_add_subtree(ti, ett_msnlb_loadweights);
243 for(i = 1; i <= 33; i++){
244 proto_tree_add_item(subtree, hf_msnlb_loadweights_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
245 offset += 4;
248 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_reserved2, tvb, offset, 4*33, ENC_NA);
249 subtree = proto_item_add_subtree(ti, ett_msnlb_reserved);
250 for(i = 1; i <= 33; i++){
251 proto_tree_add_item(subtree, hf_msnlb_reserved2_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
252 offset += 4;
255 break;
256 case NLB_EXTENDED_HB:{
257 uint8_t hb_type;
258 proto_tree *hb_tree;
259 while (tvb_reported_length_remaining(tvb, offset) > 0) {
260 ti = proto_tree_add_item(msnlb_subtree, hf_msnlb_extended_hb, tvb, offset, -1, ENC_NA);
261 hb_tree = proto_item_add_subtree(ti, ett_msnlb_extended_hb);
263 proto_tree_add_item(hb_tree, hf_msnlb_extended_hb_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
264 hb_type = tvb_get_uint8(tvb, offset);
265 proto_item_append_text(ti, " - %s", val_to_str(hb_type, nlb_extended_hb_type_vals, "Unknown (%u)"));
266 offset += 1;
268 switch(hb_type){
269 case 1:{ /* FQDN */
270 char *fqdn = NULL;
271 proto_tree_add_item(hb_tree, hf_msnlb_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
272 offset += 1;
273 proto_tree_add_item(hb_tree, hf_msnlb_reserved, tvb, offset, 2, ENC_NA);
274 offset += 2;
275 proto_tree_add_item(hb_tree, hf_msnlb_reserved, tvb, offset, 4, ENC_NA);
276 offset += 4;
277 offset = display_unicode_string(tvb, pinfo, hb_tree, offset, hf_msnlb_host_name, &fqdn);
278 offset += 6;
279 proto_item_append_text(ti, ": %s", fqdn);
281 break;
282 case 2:{ /* IP */
283 uint16_t address_family;
284 proto_tree_add_item(hb_tree, hf_msnlb_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
285 offset += 1;
286 proto_tree_add_item(hb_tree, hf_msnlb_reserved, tvb, offset, 2, ENC_NA);
287 offset += 2;
288 proto_tree_add_item(hb_tree, hf_msnlb_reserved, tvb, offset, 4, ENC_NA);
289 offset += 4;
290 proto_tree_add_item(hb_tree, hf_msnlb_address_family, tvb, offset, 2, ENC_LITTLE_ENDIAN);
291 address_family = tvb_get_letohs(tvb, offset);
292 offset += 2;
293 switch(address_family){
294 case 0x2: /* IPv4 */
295 proto_tree_add_item(hb_tree, hf_msnlb_host_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
296 proto_item_append_text(ti, ": %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
297 offset += 4;
298 break;
299 case 0x17: /* IPv6 */
300 proto_tree_add_item(hb_tree, hf_msnlb_host_ipv6, tvb, offset, 16, ENC_NA);
301 proto_item_append_text(ti, ": %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
302 offset += 16;
303 break;
304 default: /* Unknown */
305 proto_tree_add_item(hb_tree, hf_msnlb_host_unknown, tvb, offset, -1, ENC_NA);
306 offset += tvb_reported_length_remaining(tvb, offset);
307 break;
309 proto_tree_add_item(hb_tree, hf_msnlb_padding, tvb, offset, -1, ENC_NA);
310 offset += tvb_reported_length_remaining(tvb, offset);
312 break;
313 default: /* default ?! */
314 proto_tree_add_item(hb_tree, hf_msnlb_extended_hb_unknown, tvb, offset, -1, ENC_NA);
315 offset += tvb_reported_length_remaining(tvb, offset);
316 break;
322 break;
324 default:
325 break;
328 return tvb_captured_length(tvb);
331 void
332 proto_register_msnlb(void)
334 static hf_register_info hf[] = {
335 { &hf_msnlb_signature,
336 { "Signature", "msnlb.signature",
337 FT_UINT32, BASE_HEX,
338 VALS(nlb_signature_vals), 0,
339 NULL, HFILL }
341 { &hf_msnlb_version,
342 { "Version", "msnlb.version",
343 FT_UINT32, BASE_CUSTOM,
344 CF_FUNC(version_base_custom), 0,
345 NULL, HFILL }
347 { &hf_msnlb_uniquehostid,
348 { "Unique Host ID", "msnlb.unique_host_id",
349 FT_UINT32, BASE_DEC,
350 NULL, 0,
351 NULL, HFILL }
353 { &hf_msnlb_clusterip,
354 { "Cluster IP", "msnlb.cluster_ip",
355 FT_IPv4, BASE_NONE,
356 NULL, 0,
357 NULL, HFILL }
359 { &hf_msnlb_dedicatedip,
360 { "Host IP", "msnlb.host_ip",
361 FT_IPv4, BASE_NONE,
362 NULL, 0,
363 NULL, HFILL }
365 { &hf_msnlb_signature_data,
366 { "Signature Data", "msnlb.signature_data",
367 FT_NONE, BASE_NONE,
368 NULL, 0,
369 NULL, HFILL }
371 { &hf_msnlb_myhostid,
372 { "My Host id", "msnlb.my_host_ip",
373 FT_UINT16, BASE_DEC,
374 NULL, 0,
375 NULL, HFILL }
377 { &hf_msnlb_defaulthostid,
378 { "Default Host id", "msnlb.default_host_ip",
379 FT_UINT16, BASE_DEC,
380 NULL, 0,
381 NULL, HFILL }
383 { &hf_msnlb_convergencestate,
384 { "Convergence State", "msnlb.convergence_state",
385 FT_UINT16, BASE_DEC,
386 NULL, 0,
387 NULL, HFILL }
389 { &hf_msnlb_numberofportrules,
390 { "Number of Port Rules", "msnlb.number_of_port_rules",
391 FT_UINT16, BASE_DEC,
392 NULL, 0,
393 NULL, HFILL }
395 { &hf_msnlb_uniquehostcode,
396 { "Unique Host Code", "msnlb.unique_host_code",
397 FT_UINT32, BASE_DEC,
398 NULL, 0,
399 NULL, HFILL }
401 { &hf_msnlb_packetshandled,
402 { "Packets Handled", "msnlb.packets_handled",
403 FT_UINT32, BASE_DEC,
404 NULL, 0,
405 NULL, HFILL }
407 { &hf_msnlb_teamingcfg,
408 { "Teaming Configuration", "msnlb.teamincfg",
409 FT_UINT32, BASE_HEX,
410 NULL, 0,
411 NULL, HFILL }
413 { &hf_msnlb_teamingcfg_reserved,
414 { "Reserved", "msnlb.teamincfg.reserved",
415 FT_UINT32, BASE_HEX,
416 NULL, 0xFF000000,
417 "Must be zero", HFILL }
419 { &hf_msnlb_teamingcfg_xorclusterip,
420 { "XOR of the least significant 16 bits of each participant's cluster IP address", "msnlb.teamingcfg.xorclusterip",
421 FT_UINT32, BASE_HEX,
422 NULL, 0x00FFFF00,
423 NULL, HFILL }
425 { &hf_msnlb_teamingcfg_numberofparticipants,
426 { "Number of Participants", "msnlb.teamingcfg.number_of_participants",
427 FT_UINT32, BASE_HEX,
428 NULL, 0x000000F8,
429 NULL, HFILL }
431 { &hf_msnlb_teamingcfg_hashing,
432 { "Hashing", "msnlb.teamingcfg.hashing",
433 FT_BOOLEAN, 32,
434 TFS(&tfs_reverse_normal), 0x00000004,
435 NULL, HFILL }
437 { &hf_msnlb_teamingcfg_master,
438 { "Master", "msnlb.teamingcfg.master",
439 FT_BOOLEAN, 32,
440 NULL, 0x00000002,
441 NULL, HFILL }
443 { &hf_msnlb_teamingcfg_active,
444 { "Active", "msnlb.teamingcfg.active",
445 FT_BOOLEAN, 32,
446 NULL, 0x00000001,
447 NULL, HFILL }
449 { &hf_msnlb_reserved,
450 { "Reserved", "msnlb.reserved",
451 FT_BYTES, BASE_NONE,
452 NULL, 0,
453 NULL, HFILL }
455 { &hf_msnlb_portruleconfiguration,
456 { "Port Rule Configuration", "msnlb.portruleconfiguration",
457 FT_NONE, BASE_NONE,
458 NULL, 0,
459 NULL, HFILL }
461 { &hf_msnlb_portruleconfiguration_data,
462 { "Port Rule Configuration Data", "msnlb.portruleconfiguration.data",
463 FT_UINT32, BASE_DEC_HEX,
464 NULL, 0,
465 NULL, HFILL }
467 { &hf_msnlb_currentmap,
468 { "Current Map", "msnlb.currentmap",
469 FT_NONE, BASE_NONE,
470 NULL, 0,
471 NULL, HFILL }
473 { &hf_msnlb_currentmap_data,
474 { "Current Map Data", "msnlb.currentmap.data",
475 FT_UINT64, BASE_DEC_HEX,
476 NULL, 0,
477 NULL, HFILL }
479 { &hf_msnlb_newmap,
480 { "New Map", "msnlb.newmap",
481 FT_NONE, BASE_NONE,
482 NULL, 0,
483 NULL, HFILL }
485 { &hf_msnlb_newmap_data,
486 { "New Map Data", "msnlb.newmap.data",
487 FT_UINT64, BASE_DEC_HEX,
488 NULL, 0,
489 NULL, HFILL }
491 { &hf_msnlb_idlemap,
492 { "Idle Map", "msnlb.idlemap",
493 FT_NONE, BASE_NONE,
494 NULL, 0,
495 NULL, HFILL }
497 { &hf_msnlb_idlemap_data,
498 { "Idle Map Data", "msnlb.idlemap.data",
499 FT_UINT64, BASE_DEC_HEX,
500 NULL, 0,
501 NULL, HFILL }
503 { &hf_msnlb_readymap,
504 { "Ready Map", "msnlb.readymap",
505 FT_NONE, BASE_NONE,
506 NULL, 0,
507 NULL, HFILL }
509 { &hf_msnlb_readymap_data,
510 { "Ready Map Data", "msnlb.readymap.data",
511 FT_UINT64, BASE_DEC_HEX,
512 NULL, 0,
513 NULL, HFILL }
515 { &hf_msnlb_loadweights,
516 { "Load Weights", "msnlb.loadweights",
517 FT_NONE, BASE_NONE,
518 NULL, 0,
519 NULL, HFILL }
521 { &hf_msnlb_loadweights_data,
522 { "Load Weights Data", "msnlb.loadweights.data",
523 FT_UINT32, BASE_DEC_HEX,
524 NULL, 0,
525 NULL, HFILL }
527 { &hf_msnlb_reserved2,
528 { "Reserved", "msnlb.reserved2",
529 FT_NONE, BASE_NONE,
530 NULL, 0,
531 NULL, HFILL }
533 { &hf_msnlb_reserved2_data,
534 { "Reserved Data", "msnlb.reserved2.data",
535 FT_UINT32, BASE_DEC_HEX,
536 NULL, 0,
537 NULL, HFILL }
540 { &hf_msnlb_extended_hb,
541 { "Extended HB", "msnlb.extended_hb",
542 FT_NONE, BASE_NONE,
543 NULL, 0,
544 NULL, HFILL }
547 { &hf_msnlb_extended_hb_type,
548 { "Type", "msnlb.extended_hb.type",
549 FT_UINT8, BASE_DEC,
550 VALS(nlb_extended_hb_type_vals), 0,
551 NULL, HFILL }
553 { &hf_msnlb_length,
554 { "Length", "msnlb.length",
555 FT_UINT8, BASE_DEC,
556 NULL, 0,
557 NULL, HFILL }
559 { &hf_msnlb_address_family,
560 { "Address Family", "msnlb.address_family",
561 FT_UINT16, BASE_HEX_DEC,
562 VALS(nlb_address_family_vals), 0,
563 NULL, HFILL }
565 { &hf_msnlb_host_name,
566 { "Host name", "msnlb.host_name",
567 FT_STRING, BASE_NONE,
568 NULL, 0,
569 NULL, HFILL }
571 { &hf_msnlb_host_ipv4,
572 { "Host IPv4", "msnlb.host_ipv4",
573 FT_IPv4, BASE_NONE,
574 NULL, 0,
575 NULL, HFILL }
577 { &hf_msnlb_host_ipv6,
578 { "Host IPv6", "msnlb.host_ipv6",
579 FT_IPv6, BASE_NONE,
580 NULL, 0,
581 NULL, HFILL }
583 { &hf_msnlb_host_unknown,
584 { "Host Unknown", "msnlb.host_unknown",
585 FT_BYTES, BASE_NONE,
586 NULL, 0,
587 NULL, HFILL }
589 { &hf_msnlb_padding,
590 { "Padding", "msnlb.padding",
591 FT_BYTES, BASE_NONE,
592 NULL, 0,
593 NULL, HFILL }
595 { &hf_msnlb_extended_hb_unknown,
596 { "Unknown HB Data", "msnlb.extended_hb.unknown",
597 FT_BYTES, BASE_NONE,
598 NULL, 0,
599 NULL, HFILL }
603 static int *ett[] = {
604 &ett_msnlb,
605 &ett_msnlb_signature,
606 &ett_msnlb_teamingcfg,
607 &ett_msnlb_portruleconfiguration,
608 &ett_msnlb_currentmap,
609 &ett_msnlb_newmap,
610 &ett_msnlb_idlemap,
611 &ett_msnlb_readymap,
612 &ett_msnlb_loadweights,
613 &ett_msnlb_reserved,
614 &ett_msnlb_extended_hb
617 proto_msnlb = proto_register_protocol("MS Network Load Balancing", "MS NLB", "msnlb");
618 proto_register_field_array(proto_msnlb, hf, array_length(hf));
619 proto_register_subtree_array(ett, array_length(ett));
621 msnlb_handle = register_dissector("msnlb", dissect_msnlb, proto_msnlb);
624 void
625 proto_reg_handoff_msnlb(void)
627 dissector_add_uint("ethertype", ETHERTYPE_MS_NLB_HEARTBEAT, msnlb_handle);
631 * Editor modelines
633 * Local Variables:
634 * c-basic-offset: 2
635 * tab-width: 8
636 * indent-tabs-mode: nil
637 * End:
639 * ex: set shiftwidth=2 tabstop=8 expandtab:
640 * :indentSize=2:tabSize=8:noTabs=true: