raknet: re-structure raknet_dissect_system_address()

Create the subtree first. Increment *offset as we process the fields.

Change-Id: I03b6ba9a20541593b90ac7932aab5ac88538f640
Reviewed-on: https://code.wireshark.org/review/21167
Reviewed-by: Martin Kaiser <wireshark@kaiser.cx>
Petri-Dish: Martin Kaiser <wireshark@kaiser.cx>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
Martin Kaiser 2017-04-06 21:50:53 +02:00 committed by Michael Mann
parent e1e31ed1c9
commit 3fac48da68
1 changed files with 20 additions and 19 deletions

View File

@ -276,7 +276,13 @@ raknet_dissect_system_address(proto_tree *tree, int hf, tvbuff_t *tvb, gint *off
address addr;
gchar *addr_str;
/* XXX - does it really make sense to have a string hf that's set to
an empty string? */
ti = proto_tree_add_string(tree, hf, tvb, *offset, -1, "");
sub_tree = proto_item_add_subtree(ti, ett_raknet_system_address);
ip_version = tvb_get_guint8(tvb, *offset);
proto_tree_add_item(sub_tree, hf_raknet_ip_version, tvb, *offset, 1, ENC_NA);
(*offset)++;
switch (ip_version) {
case 4:
/*
@ -284,31 +290,26 @@ raknet_dissect_system_address(proto_tree *tree, int hf, tvbuff_t *tvb, gint *off
* changing them. See ..RakNet/Source/BitStream.h
* (BitStream::Write)
*/
v4_addr = ~tvb_get_ipv4(tvb, *offset + 1);
port = tvb_get_ntohs(tvb, *offset + 1 + 4);
v4_addr = ~tvb_get_ipv4(tvb, *offset);
set_address(&addr, AT_IPv4, sizeof(v4_addr), &v4_addr);
addr_str = address_to_display(wmem_packet_scope(), &addr);
ti = proto_tree_add_string_format_value(tree, hf, tvb, *offset, 1 + 4 + 2,
"", "%s:%" G_GUINT16_FORMAT, addr_str, port);
sub_tree = proto_item_add_subtree(ti, ett_raknet_system_address);
proto_tree_add_item(sub_tree, hf_raknet_ip_version, tvb, *offset, 1, ENC_NA);
proto_tree_add_ipv4(sub_tree, hf_raknet_ipv4_address, tvb, *offset + 1, 4, v4_addr);
proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset + 1 + 4, 2, ENC_BIG_ENDIAN);
*offset += 1 + 4 + 2;
*offset += 4;
port = tvb_get_ntohs(tvb, *offset);
proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset, 2, ENC_BIG_ENDIAN);
*offset += 2;
proto_item_set_len(ti, 1 + 4 + 2);
proto_item_append_text(ti, "%s:%" G_GUINT16_FORMAT, addr_str, port);
break;
case 6:
addr_str = tvb_ip6_to_str(tvb, *offset + 1);
port = tvb_get_ntohs(tvb, *offset + 1 + 16);
ti = proto_tree_add_string_format_value(tree, hf, tvb, *offset, 1 + 16 + 2,
"", "[%s]:%" G_GUINT16_FORMAT, addr_str, port);
sub_tree = proto_item_add_subtree(ti, ett_raknet_system_address);
proto_tree_add_item(sub_tree, hf_raknet_ip_version, tvb, *offset, 1, ENC_NA);
addr_str = tvb_ip6_to_str(tvb, *offset);
proto_tree_add_item(sub_tree, hf_raknet_ipv6_address, tvb, *offset + 1, 16, ENC_NA);
proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset + 1 + 16, 2, ENC_BIG_ENDIAN);
*offset += 1 + 16 + 2;
*offset += 16;
port = tvb_get_ntohs(tvb, *offset);
proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset, 2, ENC_BIG_ENDIAN);
*offset += 2;
proto_item_set_len(ti, 1 + 16 + 2);
proto_item_append_text(ti, "[%s]:%" G_GUINT16_FORMAT, addr_str, port);
break;
default:
THROW(ReportedBoundsError);