BT-DHT: add IPv6 support for find_node responses

Change-Id: I4ce38892b6c287c2dc51f438a12a5be5920197b6
Reviewed-on: https://code.wireshark.org/review/20323
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Florian Adamsky 2017-02-28 21:19:48 +01:00 committed by Anders Broman
parent 8f35d6ff90
commit bc56801319
1 changed files with 42 additions and 11 deletions

View File

@ -62,6 +62,7 @@ static int hf_bt_dht_node = -1;
static int hf_bt_dht_id = -1;
static int hf_ip = -1;
static int hf_ip6 = -1;
static int hf_port = -1;
static int hf_truncated_data = -1;
@ -311,7 +312,7 @@ dissect_bt_dht_values(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
}
static int
dissect_bt_dht_nodes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, const char **result, const char *label )
dissect_bt_dht_nodes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, const char **result, const char *label, gboolean is_ipv6 )
{
proto_item *ti;
proto_tree *sub_tree;
@ -320,6 +321,7 @@ dissect_bt_dht_nodes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
guint node_index;
guint string_len;
guint node_byte_length;
string_len = bencoded_string_length(tvb, &offset);
@ -327,30 +329,51 @@ dissect_bt_dht_nodes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint
sub_tree = proto_item_add_subtree( ti, ett_bt_dht_nodes);
node_index = 0;
/* 20 bytes id, 4 bytes ip, 2 bytes port */
for( ; string_len>=26; string_len-=26, offset+=26 )
/* 26 bytes = 20 bytes id + 4 bytes ipv4 address + 2 bytes port */
node_byte_length = 26;
if ( is_ipv6 )
{
/* 38 bytes = 20 bytes id + 16 bytes ipv6 address + 2 bytes port */
node_byte_length = 38;
}
for( ; string_len>=node_byte_length; string_len-=node_byte_length, offset+=node_byte_length )
{
node_index += 1;
node_ti = proto_tree_add_item( sub_tree, hf_bt_dht_node, tvb, offset, 26, ENC_NA);
node_ti = proto_tree_add_item( sub_tree, hf_bt_dht_node, tvb, offset, node_byte_length, ENC_NA);
proto_item_append_text(node_ti, " %d", node_index);
node_tree = proto_item_add_subtree( node_ti, ett_bt_dht_peers);
proto_tree_add_item( node_tree, hf_bt_dht_id, tvb, offset, 20, ENC_NA);
proto_item_append_text(node_ti, " (id: %s", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, 20));
proto_tree_add_item( node_tree, hf_ip, tvb, offset+20, 4, ENC_BIG_ENDIAN);
proto_item_append_text(node_ti, ", IP/Port: %s", tvb_ip_to_str(tvb, offset+20));
proto_tree_add_item( node_tree, hf_port, tvb, offset+24, 2, ENC_BIG_ENDIAN);
proto_item_append_text(node_ti, ":%u)", tvb_get_ntohs( tvb, offset+24 ));
if ( is_ipv6 )
{
proto_tree_add_item( node_tree, hf_ip6, tvb, offset+20, 16, ENC_NA);
proto_item_append_text(node_ti, ", IPv6/Port: [%s]", tvb_ip6_to_str(tvb, offset+20));
proto_tree_add_item( node_tree, hf_port, tvb, offset+36, 2, ENC_BIG_ENDIAN);
proto_item_append_text(node_ti, ":%u)", tvb_get_ntohs( tvb, offset+36 ));
}
else
{
proto_tree_add_item( node_tree, hf_ip, tvb, offset+20, 4, ENC_BIG_ENDIAN);
proto_item_append_text(node_ti, ", IPv4/Port: %s", tvb_ip_to_str(tvb, offset+20));
proto_tree_add_item( node_tree, hf_port, tvb, offset+24, 2, ENC_BIG_ENDIAN);
proto_item_append_text(node_ti, ":%u)", tvb_get_ntohs( tvb, offset+24 ));
}
}
if( string_len>0 )
{
proto_tree_add_item( tree, hf_truncated_data, tvb, offset, string_len, ENC_NA );
offset += string_len;
}
proto_item_set_text( ti, "%s: %d nodes", label, node_index );
col_append_fstr( pinfo->cinfo, COL_INFO, "reply=%d nodes ", node_index );
col_append_fstr( pinfo->cinfo, COL_INFO, " reply=%d nodes ", node_index );
*result = wmem_strdup_printf(wmem_packet_scope(), "%d", node_index);
return offset;
@ -407,7 +430,11 @@ dissect_bencoded_dict_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* special process */
if( strcmp(key,"nodes")==0 )
{
offset = dissect_bt_dht_nodes( tvb, pinfo, sub_tree, offset, &val, "Value" );
offset = dissect_bt_dht_nodes( tvb, pinfo, sub_tree, offset, &val, "Value", 0 );
}
else if( strcmp(key,"nodes6")==0 )
{
offset = dissect_bt_dht_nodes( tvb, pinfo, sub_tree, offset, &val, "Value", 1 );
}
else if( strcmp(key,"ip")==0 )
{
@ -591,6 +618,10 @@ proto_register_bt_dht(void)
{ "IP", "bt-dht.ip",
FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }
},
{ &hf_ip6,
{ "IP", "bt-dht.ip6",
FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }
},
{ &hf_port,
{ "Port", "bt-dht.port",
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }