diff options
author | Gtker <wireshark@gtker.com> | 2021-05-28 13:58:59 +0200 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-06-09 05:53:52 +0000 |
commit | f5212ff5cb0d866e32b0f5c9fa8920139bad1724 (patch) | |
tree | c67f0ffd1ae7f41c9ec958a2bc9d32c64a073ef4 /epan/dissectors/packet-wow.c | |
parent | 5d6dcbcdd24883fead02b495e2efb8380b7791cf (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.c | 35 |
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, |