aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-wow.c
diff options
context:
space:
mode:
authorGtker <wireshark@gtker.com>2021-05-28 13:58:59 +0200
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-06-09 05:53:52 +0000
commitf5212ff5cb0d866e32b0f5c9fa8920139bad1724 (patch)
treec67f0ffd1ae7f41c9ec958a2bc9d32c64a073ef4 /epan/dissectors/packet-wow.c
parent5d6dcbcdd24883fead02b495e2efb8380b7791cf (diff)
WOW: Add realmlist support for 2.4.3
Wiki: https://wowdev.wiki/CMD_REALM_LIST_Server C++ implementation: https://github.com/cmangos/mangos-tbc/blob/ee05ec5a40afcdac9c912cb647add9ee3ce92a9a/src/realmd/AuthSocket.cpp#L821
Diffstat (limited to 'epan/dissectors/packet-wow.c')
-rw-r--r--epan/dissectors/packet-wow.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/epan/dissectors/packet-wow.c b/epan/dissectors/packet-wow.c
index f6b043ca45..1e9ee5899a 100644
--- a/epan/dissectors/packet-wow.c
+++ b/epan/dissectors/packet-wow.c
@@ -168,6 +168,7 @@ static int hf_wow_client_checksum = -1;
/* Realm List Server to Client */
static int hf_wow_num_realms = -1;
static int hf_wow_realm_type = -1;
+static int hf_wow_realm_locked = -1;
static int hf_wow_realm_flags = -1;
static int hf_wow_realm_category = -1;
static int hf_wow_realm_name = -1;
@@ -298,7 +299,7 @@ parse_logon_proof_server_to_client(tvbuff_t *tvb, proto_tree *wow_tree, guint32
}
static void
parse_realm_list_server_to_client(tvbuff_t *tvb, proto_tree *wow_tree, guint32 offset) {
- guint8 num_realms, ii;
+ guint8 num_realms, ii, number_of_realms_field_size, realm_name_offset, realm_type_field_size;
gchar *string, *realm_name;
gint len;
proto_tree *wow_realms_tree;
@@ -309,14 +310,25 @@ parse_realm_list_server_to_client(tvbuff_t *tvb, proto_tree *wow_tree, guint32 o
offset += 4; /* Unknown field; always 0 */
+ if (version_is_at_or_above(2, 4, 3)) {
+ /* Possibly valid for versions starting at 2.0.0 as well */
+ number_of_realms_field_size = 2;
+ realm_name_offset = 3;
+ realm_type_field_size = 1;
+ } else {
+ number_of_realms_field_size = 1;
+ realm_name_offset = 5;
+ realm_type_field_size = 4;
+ }
+
proto_tree_add_item(wow_tree, hf_wow_num_realms,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ tvb, offset, number_of_realms_field_size, ENC_LITTLE_ENDIAN);
num_realms = tvb_get_guint8(tvb, offset);
- offset += 1;
+ offset += number_of_realms_field_size;
for(ii = 0; ii < num_realms; ii++) {
realm_name = tvb_get_stringz_enc(wmem_packet_scope(), tvb,
- offset + 5,
+ offset + realm_name_offset,
&len, ENC_ASCII);
wow_realms_tree = proto_tree_add_subtree(wow_tree, tvb,
@@ -324,8 +336,14 @@ parse_realm_list_server_to_client(tvbuff_t *tvb, proto_tree *wow_tree, guint32 o
ett_wow_realms, NULL,
realm_name);
- proto_tree_add_item(wow_realms_tree, hf_wow_realm_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(wow_realms_tree, hf_wow_realm_type, tvb, offset, realm_type_field_size, ENC_LITTLE_ENDIAN);
+ offset += realm_type_field_size;
+
+ if (version_is_at_or_above(2, 4, 3)) {
+ /* Possibly valid for versions starting at 2.0.0 as well */
+ proto_tree_add_item(wow_realms_tree, hf_wow_realm_locked, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
proto_tree_add_item(wow_realms_tree, hf_wow_realm_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
@@ -886,6 +904,11 @@ proto_register_wow(void)
FT_UINT8, BASE_DEC, VALS(realm_type_vs), 0,
"Also known as realm icon", HFILL }
},
+ { &hf_wow_realm_locked,
+ { "Locked", "wow.realm_locked",
+ FT_BOOLEAN, BASE_NONE, 0, 0,
+ "Realm appears as locked in client", HFILL }
+ },
{ &hf_wow_realm_flags,
{ "Status", "wow.realm_flags",
FT_UINT8, BASE_DEC, VALS(realm_flags_vs), 0,