Qt/Bluetooth: Add Devices dialogue
Please found it under Bluetooth menu. It shows all devices found in logs, not only connected, all that its address can be found in logs. Show if device is local (in most cases: capturing on it side) and manufacturer and LMP version what should answer the question what version of Bluetooth is used by Bluetooth device chip. Also firmware version. Change-Id: I32e3b7100cdebcaa850b6541de0ab89dff41c0e1 Reviewed-on: https://code.wireshark.org/review/8901 Petri-Dish: Michal Labedzki <michal.labedzki@tieto.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Tested-by: Michal Labedzki <michal.labedzki@tieto.com> Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
This commit is contained in:
parent
9fb6ec6c89
commit
7102a06811
|
@ -70,10 +70,13 @@ libwireshark.so.0 libwireshark0 #MINVER#
|
|||
ber_decode_as@Base 1.9.1
|
||||
ber_decode_as_foreach@Base 1.9.1
|
||||
ber_set_filename@Base 1.9.1
|
||||
bluetooth_company_id_vals_ext@Base 1.99.6
|
||||
bluetooth_uuid_custom@Base 1.99.2
|
||||
bluetooth_uuid_vals@Base 1.99.2
|
||||
bluetooth_uuid_vals_ext@Base 1.99.2
|
||||
bluetooth_uuid_custom@Base 1.99.2
|
||||
bssgp_cause_vals_ext@Base 1.9.1
|
||||
bthci_evt_hci_version@Base 1.99.6
|
||||
bthci_evt_lmp_version@Base 1.99.6
|
||||
build_column_format_array@Base 1.9.1
|
||||
build_follow_conv_filter@Base 1.12.0~rc1
|
||||
build_follow_index_filter@Base 1.12.0~rc1
|
||||
|
|
|
@ -21,6 +21,13 @@ used for troubleshooting, analysis, development and education.
|
|||
|
||||
=== New and Updated Features
|
||||
|
||||
The following features are new (or have been significantly updated)
|
||||
since version 1.99.6:
|
||||
|
||||
* Qt port:
|
||||
|
||||
** The Bluetooth Devices dialog has been added.
|
||||
|
||||
The following features are new (or have been significantly updated)
|
||||
since version 1.99.4 and 1.99.5:
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@ static wmem_tree_t *localhost_bdaddr = NULL;
|
|||
static wmem_tree_t *hci_vendors = NULL;
|
||||
|
||||
static int bluetooth_tap = -1;
|
||||
int bluetooth_device_tap = -1;
|
||||
|
||||
const value_string bluetooth_uuid_vals[] = {
|
||||
/* Protocol Identifiers - https://www.bluetooth.org/en-us/specification/assigned-numbers/service-discovery */
|
||||
|
@ -1025,7 +1026,9 @@ void proto_reg_handoff_bluetooth(void);
|
|||
|
||||
|
||||
gint
|
||||
dissect_bd_addr(gint hf_bd_addr, proto_tree *tree, tvbuff_t *tvb, gint offset, guint8 *bdaddr)
|
||||
dissect_bd_addr(gint hf_bd_addr, packet_info *pinfo, proto_tree *tree,
|
||||
tvbuff_t *tvb, gint offset, gboolean is_local_bd_addr,
|
||||
guint32 interface_id, guint32 adapter_id, guint8 *bdaddr)
|
||||
{
|
||||
guint8 bd_addr[6];
|
||||
|
||||
|
@ -1039,6 +1042,19 @@ dissect_bd_addr(gint hf_bd_addr, proto_tree *tree, tvbuff_t *tvb, gint offset, g
|
|||
proto_tree_add_ether(tree, hf_bd_addr, tvb, offset, 6, bd_addr);
|
||||
offset += 6;
|
||||
|
||||
if (have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
tap_device->interface_id = interface_id;
|
||||
tap_device->adapter_id = adapter_id;
|
||||
memcpy(tap_device->bd_addr, bd_addr, 6);
|
||||
tap_device->has_bd_addr = TRUE;
|
||||
tap_device->is_local = is_local_bd_addr;
|
||||
tap_device->type = BLUETOOTH_DEVICE_BD_ADDR;
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
|
||||
if (bdaddr)
|
||||
memcpy(bdaddr, bd_addr, 6);
|
||||
|
||||
|
@ -1403,6 +1419,7 @@ proto_register_bluetooth(void)
|
|||
hci_vendor_table = register_dissector_table("bluetooth.vendor", "HCI Vendor", FT_UINT16, BASE_HEX);
|
||||
|
||||
bluetooth_tap = register_tap("bluetooth");
|
||||
bluetooth_device_tap = register_tap("bluetooth.device");
|
||||
|
||||
register_conversation_table(proto_bluetooth, TRUE, bluetooth_conversation_packet, bluetooth_hostlist_packet);
|
||||
}
|
||||
|
|
|
@ -183,15 +183,51 @@ typedef struct _bluetooth_uuid_custom {
|
|||
const gchar *name;
|
||||
} bluetooth_uuid_custom_t;
|
||||
|
||||
enum bluetooth_device_type {
|
||||
BLUETOOTH_DEVICE_BD_ADDR,
|
||||
BLUETOOTH_DEVICE_NAME,
|
||||
BLUETOOTH_DEVICE_LOCAL_ADAPTER,
|
||||
BLUETOOTH_DEVICE_LOCAL_VERSION,
|
||||
BLUETOOTH_DEVICE_REMOTE_VERSION
|
||||
};
|
||||
|
||||
typedef struct _bluetooth_device_tap_t {
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
|
||||
gboolean is_local;
|
||||
gboolean has_bd_addr;
|
||||
guint8 bd_addr[6];
|
||||
enum bluetooth_device_type type;
|
||||
union {
|
||||
char *name;
|
||||
struct {
|
||||
guint8 hci_version;
|
||||
guint16 hci_revision;
|
||||
guint8 lmp_version;
|
||||
guint16 lmp_subversion;
|
||||
guint16 manufacturer;
|
||||
} local_version;
|
||||
struct {
|
||||
guint8 lmp_version;
|
||||
guint16 lmp_subversion;
|
||||
guint16 manufacturer;
|
||||
} remote_version;
|
||||
} data;
|
||||
} bluetooth_device_tap_t;
|
||||
|
||||
extern int bluetooth_device_tap;
|
||||
|
||||
WS_DLL_PUBLIC const value_string bluetooth_uuid_vals[];
|
||||
WS_DLL_PUBLIC const bluetooth_uuid_custom_t bluetooth_uuid_custom[];
|
||||
|
||||
WS_DLL_PUBLIC value_string_ext bluetooth_uuid_vals_ext;
|
||||
extern value_string_ext bluetooth_company_id_vals_ext;
|
||||
WS_DLL_PUBLIC value_string_ext bluetooth_company_id_vals_ext;
|
||||
extern guint32 max_disconnect_in_frame;
|
||||
|
||||
extern gint dissect_bd_addr(gint hf_bd_addr, proto_tree *tree, tvbuff_t *tvb,
|
||||
gint offset, guint8 *bdaddr);
|
||||
extern gint dissect_bd_addr(gint hf_bd_addr, packet_info *pinfo, proto_tree *tree,
|
||||
tvbuff_t *tvb, gint offset, gboolean is_local_bd_addr,
|
||||
guint32 interface_id, guint32 adapter_id, guint8 *bdaddr);
|
||||
|
||||
extern bluetooth_uuid_t get_uuid(tvbuff_t *tvb, gint offset, gint size);
|
||||
extern gchar *print_uuid(bluetooth_uuid_t *uuid);
|
||||
|
|
|
@ -2012,7 +2012,7 @@ dissect_attribute_value(proto_tree *tree, proto_item *patron_item, packet_info *
|
|||
|
||||
break;
|
||||
case 0x2A03: /* Reconnection Address */
|
||||
offset = dissect_bd_addr(hf_btatt_reconnection_address, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_btatt_reconnection_address, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
break;
|
||||
case 0x2A04: /* Peripheral Preferred Connection Parameters */
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <epan/expert.h>
|
||||
#include <epan/prefs.h>
|
||||
#include <epan/decode_as.h>
|
||||
#include <epan/tap.h>
|
||||
|
||||
#include "packet-bluetooth.h"
|
||||
#include "packet-bthci_cmd.h"
|
||||
|
@ -1572,7 +1573,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
{
|
||||
guint8 bd_addr[6];
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_packet_type_2dh1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_packet_type_3dh1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
|
@ -1657,14 +1658,14 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x0008: /* Create Connection Cancel Request */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x0009: /* Accept Connection Request */ {
|
||||
guint8 bd_addr[6];
|
||||
guint8 role;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
role = tvb_get_guint8(tvb, offset);
|
||||
|
@ -1713,25 +1714,25 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x000a: /* Reject Connection Request */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
break;
|
||||
|
||||
case 0x000b: /* Link Key Request Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_link_key, tvb, offset, 16, ENC_NA);
|
||||
offset+=16;
|
||||
break;
|
||||
|
||||
case 0x000c: /* Link Key Request Negative Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x000d: /* PIN Code Request Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_pin_code_length ,tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -1740,7 +1741,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x000e: /* PIN Code Request Negative Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x000f: /* Change Connection Packet Type */
|
||||
|
@ -1779,7 +1780,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x0019: /* Remote Name Request */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -1795,7 +1796,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x001a: /* Remote Name Request Cancel */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x001c: /* Read Remote Extended Features */
|
||||
|
@ -1811,7 +1812,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
offset+=2;
|
||||
} else {
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
}
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_transmit_bandwidth, tvb, offset, 4, ENC_LITTLE_ENDIAN);
|
||||
|
@ -1847,7 +1848,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
offset+=2;
|
||||
break;
|
||||
case 0x002a: /* Reject Synchronous Connection Request */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -1863,7 +1864,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x002b: /* IO Capability Response */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_io_capability, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -1874,7 +1875,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
break;
|
||||
|
||||
case 0x0034: /* IO Capability Request Negative Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
break;
|
||||
|
@ -1883,18 +1884,18 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
case 0x002d: /* User Confirmation Request Negative Reply */
|
||||
case 0x002f: /* User Passkey Request Negative Reply */
|
||||
case 0x0033: /* Remote OOB Data Request Negative Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x002e: /* User Passkey Request Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_passkey, tvb, offset, 4, ENC_LITTLE_ENDIAN);
|
||||
offset+=4;
|
||||
break;
|
||||
|
||||
case 0x0030: /* Remote OOB Data Request Reply */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_hash_c, tvb, offset, 16, ENC_NA);
|
||||
offset+=16;
|
||||
|
@ -1975,7 +1976,7 @@ dissect_link_control_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_link_policy_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint16 cmd_ocf)
|
||||
dissect_link_policy_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint16 cmd_ocf, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
proto_item *item;
|
||||
guint16 timeout;
|
||||
|
@ -2047,7 +2048,7 @@ dissect_link_policy_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto
|
|||
break;
|
||||
|
||||
case 0x000b: /* Switch Role */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -2121,7 +2122,8 @@ dissect_link_policy_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto
|
|||
|
||||
static int
|
||||
dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
||||
proto_tree *tree, guint16 cmd_ocf, bluetooth_data_t *bluetooth_data)
|
||||
proto_tree *tree, guint16 cmd_ocf, bluetooth_data_t *bluetooth_data,
|
||||
bthci_cmd_data_t *bthci_cmd_data)
|
||||
{
|
||||
proto_item *item;
|
||||
guint16 timeout;
|
||||
|
@ -2214,7 +2216,7 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
break;
|
||||
|
||||
case 0x02:
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2245,7 +2247,7 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
break;
|
||||
|
||||
case 0x02:
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_auto_acc_flag, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -2269,7 +2271,7 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
break;
|
||||
|
||||
case 0x000d: /* Read Stored Link Key */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_read_all_flag, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -2281,14 +2283,14 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
offset += 1;
|
||||
|
||||
for (i = 0; i < num8; i++) {
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_link_key, tvb, offset, 16, ENC_NA);
|
||||
offset += 16;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0012: /* Delete Stored Link Key */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_delete_all_flag, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -2296,35 +2298,8 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
|
||||
case 0x0013: /* Change Local Name */
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_device_name, tvb, offset, 248, ENC_UTF_8 | ENC_NA);
|
||||
if (!pinfo->fd->flags.visited) {
|
||||
wmem_tree_key_t key[4];
|
||||
guint32 k_interface_id;
|
||||
guint32 k_adapter_id;
|
||||
guint32 k_frame_number;
|
||||
gchar *name;
|
||||
localhost_name_entry_t *localhost_name_entry;
|
||||
|
||||
k_interface_id = bluetooth_data->interface_id;
|
||||
k_adapter_id = bluetooth_data->adapter_id;
|
||||
k_frame_number = pinfo->fd->num;
|
||||
|
||||
name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 248, ENC_UTF_8);
|
||||
|
||||
key[0].length = 1;
|
||||
key[0].key = &k_interface_id;
|
||||
key[1].length = 1;
|
||||
key[1].key = &k_adapter_id;
|
||||
key[2].length = 1;
|
||||
key[2].key = &k_frame_number;
|
||||
key[3].length = 0;
|
||||
key[3].key = NULL;
|
||||
|
||||
localhost_name_entry = (localhost_name_entry_t *) wmem_new(wmem_file_scope(), localhost_name_entry_t);
|
||||
localhost_name_entry->interface_id = k_interface_id;
|
||||
localhost_name_entry->adapter_id = k_adapter_id;
|
||||
localhost_name_entry->name = wmem_strdup(wmem_file_scope(), name);
|
||||
|
||||
wmem_tree_insert32_array(bluetooth_data->localhost_name, key, localhost_name_entry);
|
||||
if (!pinfo->fd->flags.visited && bthci_cmd_data) {
|
||||
bthci_cmd_data->data.name = tvb_get_string_enc(wmem_file_scope(), tvb, offset, 248, ENC_UTF_8);
|
||||
}
|
||||
offset += 248;
|
||||
break;
|
||||
|
@ -2550,7 +2525,7 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
proto_tree_add_item(tree, hf_bthci_cmd_fec_required, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
||||
call_dissector(btcommon_eir_handle, tvb_new_subset_length(tvb, offset, 240), pinfo, tree);
|
||||
call_dissector_with_data(btcommon_eir_handle, tvb_new_subset_length(tvb, offset, 240), pinfo, tree, bluetooth_data);
|
||||
save_local_device_name_from_eir_ad(tvb, offset, pinfo, 240, bluetooth_data);
|
||||
offset += 240;
|
||||
break;
|
||||
|
@ -2583,7 +2558,7 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin
|
|||
break;
|
||||
|
||||
case 0x0060: /* Send Keypress Notification */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_notification_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
@ -2875,7 +2850,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
|
|||
break;
|
||||
|
||||
case 0x0005: /* LE Set Random Address */
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x0006: /* LE Set Advertising Parameters */
|
||||
|
@ -2891,7 +2866,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
|
|||
offset++;
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_direct_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_advts_channel_map_1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_advts_channel_map_2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_advts_channel_map_3, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
|
@ -2905,7 +2880,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
|
|||
proto_tree_add_item(tree, hf_bthci_cmd_le_data_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
|
||||
call_dissector(btcommon_ad_handle, tvb_new_subset_length(tvb, offset, 31), pinfo, tree);
|
||||
call_dissector_with_data(btcommon_ad_handle, tvb_new_subset_length(tvb, offset, 31), pinfo, tree, bluetooth_data);
|
||||
save_local_device_name_from_eir_ad(tvb, offset, pinfo, 31, bluetooth_data);
|
||||
offset += 31;
|
||||
break;
|
||||
|
@ -2948,7 +2923,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
|
|||
offset++;
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_own_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
item = proto_tree_add_item(tree, hf_bthci_cmd_le_con_interval_min, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
|
@ -2975,7 +2950,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
|
|||
case 0x0012: /* LE Remove Device From White List */
|
||||
proto_tree_add_item(tree, hf_bthci_cmd_le_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset++;
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x0013: /* LE Connection Update */
|
||||
|
@ -3096,7 +3071,7 @@ dissect_bthci_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
guint32 adapter_id;
|
||||
guint32 frame_number;
|
||||
wmem_tree_key_t key[5];
|
||||
bthci_cmd_data_t *bthci_cmd_data;
|
||||
bthci_cmd_data_t *bthci_cmd_data = NULL;
|
||||
proto_tree *sub_item;
|
||||
wmem_tree_t *subtree;
|
||||
|
||||
|
@ -3147,6 +3122,17 @@ dissect_bthci_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
ocf = opcode & 0x03ff;
|
||||
ogf = (guint8) (opcode >> 10);
|
||||
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data) {
|
||||
bthci_cmd_data = (bthci_cmd_data_t *) wmem_new(wmem_file_scope(), bthci_cmd_data_t);
|
||||
bthci_cmd_data->opcode = opcode;
|
||||
bthci_cmd_data->command_in_frame = frame_number;
|
||||
bthci_cmd_data->command_abs_ts = pinfo->fd->abs_ts;
|
||||
bthci_cmd_data->pending_in_frame = max_disconnect_in_frame;
|
||||
bthci_cmd_data->pending_abs_ts = pinfo->fd->abs_ts;
|
||||
bthci_cmd_data->response_in_frame = max_disconnect_in_frame;
|
||||
bthci_cmd_data->response_abs_ts = pinfo->fd->abs_ts;
|
||||
}
|
||||
|
||||
if (ogf == HCI_OGF_VENDOR_SPECIFIC)
|
||||
proto_item_append_text(ti_cmd," - %s", val_to_str_ext(opcode, &bthci_cmd_opcode_vals_ext, "Vendor Command 0x%04x"));
|
||||
else
|
||||
|
@ -3215,11 +3201,11 @@ dissect_bthci_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case HCI_OGF_LINK_POLICY:
|
||||
offset = dissect_link_policy_cmd(tvb, offset, pinfo, bthci_cmd_tree, ocf);
|
||||
offset = dissect_link_policy_cmd(tvb, offset, pinfo, bthci_cmd_tree, ocf, bluetooth_data);
|
||||
break;
|
||||
|
||||
case HCI_OGF_HOST_CONTROLLER:
|
||||
offset = dissect_host_controller_baseband_cmd(tvb, offset, pinfo, bthci_cmd_tree, ocf, bluetooth_data);
|
||||
offset = dissect_host_controller_baseband_cmd(tvb, offset, pinfo, bthci_cmd_tree, ocf, bluetooth_data, bthci_cmd_data);
|
||||
break;
|
||||
|
||||
case HCI_OGF_INFORMATIONAL:
|
||||
|
@ -3245,7 +3231,7 @@ dissect_bthci_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
}
|
||||
}
|
||||
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data) {
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data && bthci_cmd_data) {
|
||||
key[0].length = 1;
|
||||
key[0].key = &interface_id;
|
||||
key[1].length = 1;
|
||||
|
@ -3257,15 +3243,6 @@ dissect_bthci_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
key[4].length = 0;
|
||||
key[4].key = NULL;
|
||||
|
||||
bthci_cmd_data = (bthci_cmd_data_t *) wmem_new(wmem_file_scope(), bthci_cmd_data_t);
|
||||
bthci_cmd_data->opcode = opcode;
|
||||
bthci_cmd_data->command_in_frame = frame_number;
|
||||
bthci_cmd_data->command_abs_ts = pinfo->fd->abs_ts;
|
||||
bthci_cmd_data->pending_in_frame = max_disconnect_in_frame;
|
||||
bthci_cmd_data->pending_abs_ts = pinfo->fd->abs_ts;
|
||||
bthci_cmd_data->response_in_frame = max_disconnect_in_frame;
|
||||
bthci_cmd_data->response_abs_ts = pinfo->fd->abs_ts;
|
||||
|
||||
wmem_tree_insert32_array(bthci_cmds, key, bthci_cmd_data);
|
||||
}
|
||||
|
||||
|
@ -4883,7 +4860,7 @@ proto_reg_handoff_bthci_cmd(void)
|
|||
|
||||
|
||||
static gint
|
||||
dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
proto_item *entry_item;
|
||||
proto_tree *entry_tree;
|
||||
|
@ -4894,6 +4871,9 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
guint8 data_size;
|
||||
gint64 end_offset;
|
||||
guint i_uuid;
|
||||
gboolean has_bd_addr = FALSE;
|
||||
guint8 bd_addr[6];
|
||||
guint8 *name = NULL;
|
||||
|
||||
data_size = tvb_reported_length(tvb);
|
||||
|
||||
|
@ -5002,8 +4982,10 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
|
||||
case 0x08: /* Device Name (shortened) */
|
||||
case 0x09: /* Device Name */
|
||||
proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_name, tvb, offset, length, ENC_ASCII | ENC_NA);
|
||||
proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_name, tvb, offset, length, ENC_UTF_8 | ENC_NA);
|
||||
proto_item_append_text(entry_item, ": %s", tvb_format_text(tvb,offset, length));
|
||||
if (!name || type == 0x09)
|
||||
name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_UTF_8);
|
||||
offset += length;
|
||||
|
||||
break;
|
||||
|
@ -5061,8 +5043,8 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
break;
|
||||
case 0x0C: /* BD_ADDR */
|
||||
/* From CSS v3.pdf */
|
||||
offset = dissect_bd_addr(hf_btcommon_eir_ad_bd_addr, tree, tvb, offset, NULL);
|
||||
|
||||
offset = dissect_bd_addr(hf_btcommon_eir_ad_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
has_bd_addr = TRUE;
|
||||
break;
|
||||
|
||||
case 0x0D: /* Class Of Device */
|
||||
|
@ -5176,7 +5158,7 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
case 0x18: /* Random Target Address */
|
||||
end_offset = offset + length;
|
||||
while (offset < end_offset) {
|
||||
offset = dissect_bd_addr(hf_btcommon_eir_ad_bd_addr, entry_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_btcommon_eir_ad_bd_addr, pinfo, entry_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -5198,7 +5180,7 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_le_bd_addr_type, tvb, offset, 1, ENC_NA);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_btcommon_eir_ad_bd_addr, entry_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_btcommon_eir_ad_bd_addr, pinfo, entry_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
break;
|
||||
case 0x1C: /* LE Role */
|
||||
|
@ -5267,6 +5249,25 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
offset = tvb_reported_length(tvb);
|
||||
}
|
||||
|
||||
if (has_bd_addr && name && have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
if (bluetooth_data) {
|
||||
tap_device->interface_id = bluetooth_data->interface_id;
|
||||
tap_device->adapter_id = bluetooth_data->adapter_id;
|
||||
} else {
|
||||
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
|
||||
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
memcpy(tap_device->bd_addr, bd_addr, 6);
|
||||
tap_device->has_bd_addr = TRUE;
|
||||
tap_device->is_local = FALSE;
|
||||
tap_device->type = BLUETOOTH_DEVICE_NAME;
|
||||
tap_device->data.name = name;
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
|
||||
return offset + data_size;
|
||||
}
|
||||
|
||||
|
@ -5375,7 +5376,7 @@ dissect_btcommon_cod(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, vo
|
|||
}
|
||||
|
||||
static gint
|
||||
dissect_btcommon_ad(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
|
||||
dissect_btcommon_ad(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
||||
{
|
||||
proto_item *main_item;
|
||||
proto_tree *main_tree;
|
||||
|
@ -5383,11 +5384,11 @@ dissect_btcommon_ad(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *d
|
|||
main_item = proto_tree_add_item(tree, hf_btcommon_eir_ad_advertising_data, tvb, 0, -1, ENC_NA);
|
||||
main_tree = proto_item_add_subtree(main_item, ett_eir_ad);
|
||||
|
||||
return dissect_eir_ad_data(tvb, pinfo, main_tree);
|
||||
return dissect_eir_ad_data(tvb, pinfo, main_tree, (bluetooth_data_t *) data);
|
||||
}
|
||||
|
||||
static gint
|
||||
dissect_btcommon_eir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
|
||||
dissect_btcommon_eir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
||||
{
|
||||
proto_item *main_item;
|
||||
proto_tree *main_tree;
|
||||
|
@ -5395,7 +5396,7 @@ dissect_btcommon_eir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *
|
|||
main_item = proto_tree_add_item(tree, hf_btcommon_eir_ad_extended_inquiry_response_data, tvb, 0, -1, ENC_NA);
|
||||
main_tree = proto_item_add_subtree(main_item, ett_eir_ad);
|
||||
|
||||
return dissect_eir_ad_data(tvb, pinfo, main_tree);
|
||||
return dissect_eir_ad_data(tvb, pinfo, main_tree, (bluetooth_data_t *) data);
|
||||
}
|
||||
|
||||
static gint
|
||||
|
|
|
@ -59,6 +59,10 @@ typedef struct _bthci_cmd_data_t {
|
|||
nstime_t pending_abs_ts;
|
||||
guint32 response_in_frame;
|
||||
nstime_t response_abs_ts;
|
||||
|
||||
union {
|
||||
gchar *name;
|
||||
} data;
|
||||
} bthci_cmd_data_t;
|
||||
|
||||
extern wmem_tree_t *bthci_cmds;
|
||||
|
|
|
@ -37,10 +37,12 @@
|
|||
#include <epan/expert.h>
|
||||
#include <epan/prefs.h>
|
||||
#include <epan/decode_as.h>
|
||||
#include <epan/tap.h>
|
||||
|
||||
#include "packet-bluetooth.h"
|
||||
#include "packet-bthci_sco.h"
|
||||
#include "packet-bthci_cmd.h"
|
||||
#include "packet-bthci_evt.h"
|
||||
|
||||
static dissector_handle_t bthci_cmd_handle;
|
||||
static dissector_handle_t bthci_evt_handle;
|
||||
|
@ -79,7 +81,7 @@ static int hf_bthci_evt_remote_name = -1;
|
|||
static int hf_bthci_evt_encryption_enable = -1;
|
||||
static int hf_bthci_evt_key_flag = -1;
|
||||
static int hf_bthci_evt_vers_nr = -1;
|
||||
static int hf_bthci_evt_hci_vers_nr = -1;
|
||||
static int hf_bthci_bthci_evt_hci_version = -1;
|
||||
static int hf_bthci_evt_hci_revision = -1;
|
||||
static int hf_bthci_evt_comp_id = -1;
|
||||
static int hf_bthci_evt_sub_vers_nr = -1;
|
||||
|
@ -510,7 +512,7 @@ static const value_string evt_key_flag[] = {
|
|||
};
|
||||
|
||||
/* Taken from https://www.bluetooth.org/Technical/AssignedNumbers/link_manager.htm */
|
||||
static const value_string evt_lmp_vers_nr[] = {
|
||||
const value_string bthci_evt_lmp_version[] = {
|
||||
{0x00, "1.0b"},
|
||||
{0x01, "1.1"},
|
||||
{0x02, "1.2"},
|
||||
|
@ -526,7 +528,7 @@ static const value_string evt_lmp_vers_nr[] = {
|
|||
/* Taken from https://www.bluetooth.org/Technical/AssignedNumbers/hci.htm
|
||||
* (requires a login/password)
|
||||
*/
|
||||
static const value_string evt_hci_vers_nr[] = {
|
||||
const value_string bthci_evt_hci_version[] = {
|
||||
{0x00, "1.0b"},
|
||||
{0x01, "1.1"},
|
||||
{0x02, "1.2"},
|
||||
|
@ -833,7 +835,7 @@ dissect_bthci_evt_connect_complete(tvbuff_t *tvb, int offset, packet_info *pinfo
|
|||
proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
offset += 2;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data != NULL && status == 0x00) {
|
||||
wmem_tree_key_t key[5];
|
||||
guint32 k_interface_id;
|
||||
|
@ -890,9 +892,9 @@ dissect_bthci_evt_connect_complete(tvbuff_t *tvb, int offset, packet_info *pinfo
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_connect_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
|
||||
dissect_bthci_evt_connect_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
call_dissector(btcommon_cod_handle, tvb_new_subset_length(tvb, offset, 3), pinfo, tree);
|
||||
offset += 3;
|
||||
|
@ -1076,25 +1078,25 @@ dissect_bthci_evt_lmp_features(tvbuff_t *tvb, int offset, packet_info *pinfo _U_
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_pin_code_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_pin_code_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_link_key_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_link_key_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_link_key_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_link_key_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_link_key, tvb, offset, 16, ENC_NA);
|
||||
offset += 16;
|
||||
|
@ -1106,7 +1108,7 @@ dissect_bthci_evt_link_key_notification(tvbuff_t *tvb, int offset, packet_info *
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_return_link_keys(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_return_link_keys(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
guint8 evt_num_keys;
|
||||
|
||||
|
@ -1115,7 +1117,7 @@ dissect_bthci_evt_return_link_keys(tvbuff_t *tvb, int offset, packet_info *pinfo
|
|||
offset += 1;
|
||||
|
||||
while (evt_num_keys--) {
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_link_key, tvb, offset, 16, ENC_NA);
|
||||
offset += 16;
|
||||
|
@ -1148,7 +1150,7 @@ dissect_bthci_evt_remote_name_req_complete(tvbuff_t *tvb, int offset,
|
|||
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_remote_name, tvb, offset, 248, ENC_UTF_8|ENC_NA);
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data != NULL) {
|
||||
|
@ -1188,13 +1190,33 @@ dissect_bthci_evt_remote_name_req_complete(tvbuff_t *tvb, int offset,
|
|||
|
||||
wmem_tree_insert32_array(bluetooth_data->bdaddr_to_name, key, device_name);
|
||||
}
|
||||
|
||||
if (have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
if (bluetooth_data) {
|
||||
tap_device->interface_id = bluetooth_data->interface_id;
|
||||
tap_device->adapter_id = bluetooth_data->adapter_id;
|
||||
} else {
|
||||
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
|
||||
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
memcpy(tap_device->bd_addr, bd_addr, 6);
|
||||
tap_device->has_bd_addr = TRUE;
|
||||
tap_device->is_local = FALSE;
|
||||
tap_device->type = BLUETOOTH_DEVICE_NAME;
|
||||
tap_device->data.name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 248, ENC_UTF_8);
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
|
||||
offset += 248;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_read_remote_version_information_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_read_remote_version_information_complete(tvbuff_t *tvb, int offset, packet_info *pinfo, bluetooth_data_t *bluetooth_data, proto_tree *tree)
|
||||
{
|
||||
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -1211,6 +1233,61 @@ dissect_bthci_evt_read_remote_version_information_complete(tvbuff_t *tvb, int of
|
|||
proto_tree_add_item(tree, hf_bthci_evt_sub_vers_nr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
offset += 2;
|
||||
|
||||
if (have_tap_listener(bluetooth_device_tap)) {
|
||||
wmem_tree_t *subtree;
|
||||
wmem_tree_key_t key[4];
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
guint32 connection_handle;
|
||||
remote_bdaddr_t *remote_bdaddr;
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
guint8 lmp_version;
|
||||
guint16 lmp_subversion;
|
||||
guint16 manufacturer;
|
||||
|
||||
lmp_version = tvb_get_guint8(tvb, offset - 5);
|
||||
manufacturer = tvb_get_letohs(tvb, offset - 4);
|
||||
lmp_subversion = tvb_get_letohs(tvb, offset - 2);
|
||||
|
||||
interface_id = bluetooth_data->interface_id;
|
||||
adapter_id = bluetooth_data->adapter_id;
|
||||
connection_handle = tvb_get_guint16(tvb, offset - 7, ENC_LITTLE_ENDIAN) & 0x0fff;
|
||||
|
||||
key[0].length = 1;
|
||||
key[0].key = &interface_id;
|
||||
key[1].length = 1;
|
||||
key[1].key = &adapter_id;
|
||||
key[2].length = 1;
|
||||
key[2].key = &connection_handle;
|
||||
key[3].length = 0;
|
||||
key[3].key = NULL;
|
||||
|
||||
subtree = (wmem_tree_t *) wmem_tree_lookup32_array(bluetooth_data->chandle_to_bdaddr, key);
|
||||
remote_bdaddr = (subtree) ? (remote_bdaddr_t *) wmem_tree_lookup32_le(subtree, pinfo->fd->num) : NULL;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
tap_device->type = BLUETOOTH_DEVICE_REMOTE_VERSION;
|
||||
if (bluetooth_data) {
|
||||
tap_device->interface_id = bluetooth_data->interface_id;
|
||||
tap_device->adapter_id = bluetooth_data->adapter_id;
|
||||
} else {
|
||||
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
|
||||
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
|
||||
if (remote_bdaddr) {
|
||||
tap_device->has_bd_addr = TRUE;
|
||||
memcpy(tap_device->bd_addr, remote_bdaddr->bd_addr, 6);
|
||||
} else {
|
||||
tap_device->has_bd_addr = FALSE;
|
||||
}
|
||||
tap_device->is_local = FALSE;
|
||||
tap_device->data.remote_version.lmp_version = lmp_version;
|
||||
tap_device->data.remote_version.lmp_subversion = lmp_subversion;
|
||||
tap_device->data.remote_version.manufacturer = manufacturer;
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
@ -1302,7 +1379,7 @@ dissect_bthci_evt_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_role_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
|
||||
dissect_bthci_evt_role_change(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
||||
proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
guint8 bd_addr[6];
|
||||
|
@ -1313,7 +1390,7 @@ dissect_bthci_evt_role_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
|
|||
status = tvb_get_guint8(tvb, offset);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_role, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
role = tvb_get_guint8(tvb, offset);
|
||||
|
@ -1600,9 +1677,9 @@ dissect_bthci_evt_command_status(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_page_scan_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_page_scan_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_page_scan_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -1611,9 +1688,9 @@ dissect_bthci_evt_page_scan_mode_change(tvbuff_t *tvb, int offset, packet_info *
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_page_scan_repetition_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_page_scan_repetition_mode_change(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -1623,7 +1700,7 @@ dissect_bthci_evt_page_scan_repetition_mode_change(tvbuff_t *tvb, int offset, pa
|
|||
|
||||
static int
|
||||
dissect_bthci_evt_inquire_result_with_rssi(tvbuff_t *tvb, int offset,
|
||||
packet_info *pinfo, proto_tree *tree, guint8 *bd_addr)
|
||||
packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data, guint8 *bd_addr)
|
||||
{
|
||||
guint8 num, evt_num_responses;
|
||||
|
||||
|
@ -1632,7 +1709,7 @@ dissect_bthci_evt_inquire_result_with_rssi(tvbuff_t *tvb, int offset,
|
|||
offset += 1;
|
||||
|
||||
for (num = 0; num < evt_num_responses; num++) {
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, (num == 0) ? bd_addr : NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, (num == 0) ? bd_addr : NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -1655,17 +1732,17 @@ dissect_bthci_evt_inquire_result_with_rssi(tvbuff_t *tvb, int offset,
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_io_capability_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_io_capability_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_io_capability_response(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_io_capability_response(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_io_capability, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -1680,9 +1757,9 @@ dissect_bthci_evt_io_capability_response(tvbuff_t *tvb, int offset, packet_info
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_user_confirmation_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_user_confirmation_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_numeric_value, tvb, offset, 4, ENC_LITTLE_ENDIAN);
|
||||
offset += 4;
|
||||
|
@ -1691,36 +1768,36 @@ dissect_bthci_evt_user_confirmation_request(tvbuff_t *tvb, int offset, packet_in
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_user_passkey_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_user_passkey_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_remote_oob_data_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_remote_oob_data_request(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_simple_pairing_complete(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_simple_pairing_complete(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_user_passkey_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_user_passkey_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_passkey, tvb, offset, 4, ENC_LITTLE_ENDIAN);
|
||||
offset += 4;
|
||||
|
@ -1729,9 +1806,9 @@ dissect_bthci_evt_user_passkey_notification(tvbuff_t *tvb, int offset, packet_in
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_keypress_notification(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree)
|
||||
dissect_bthci_evt_keypress_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_notification_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -1740,9 +1817,9 @@ dissect_bthci_evt_keypress_notification(tvbuff_t *tvb, int offset, packet_info *
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_remote_host_sup_feat_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
|
||||
dissect_bthci_evt_remote_host_sup_feat_notification(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
offset = dissect_bthci_evt_lmp_features(tvb, offset, pinfo, tree, 0);
|
||||
|
||||
return offset;
|
||||
|
@ -1781,7 +1858,7 @@ dissect_bthci_evt_le_meta(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
item = proto_tree_add_item(tree, hf_bthci_evt_le_con_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*1.25);
|
||||
|
@ -1852,7 +1929,7 @@ dissect_bthci_evt_le_meta(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
offset += 1;
|
||||
proto_tree_add_item(tree, hf_bthci_evt_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
length = tvb_get_guint8(tvb, offset);
|
||||
proto_tree_add_item(tree, hf_bthci_evt_data_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -2071,7 +2148,7 @@ dissect_bthci_evt_amp_status_change(tvbuff_t *tvb, int offset, packet_info *pinf
|
|||
static int
|
||||
dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
||||
packet_info *pinfo, proto_tree *main_tree, proto_tree *tree,
|
||||
wmem_list_t *opcode_list, bluetooth_data_t *bluetooth_data)
|
||||
wmem_list_t *opcode_list, bluetooth_data_t *bluetooth_data, guint32 *out_opcode)
|
||||
{
|
||||
proto_item *ti_opcode;
|
||||
proto_tree *opcode_tree;
|
||||
|
@ -2096,6 +2173,8 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
|
||||
opcode = tvb_get_letohs(tvb, offset);
|
||||
ogf = opcode >> 10;
|
||||
if (out_opcode)
|
||||
*out_opcode = opcode;
|
||||
|
||||
interface_id = bluetooth_data->interface_id;
|
||||
adapter_id = bluetooth_data->adapter_id;
|
||||
|
@ -2230,6 +2309,7 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
/* This is a list of Commands that all return status and BD_ADDR */
|
||||
case 0x1009: /* Read BD_ADDR */
|
||||
local_addr = TRUE;
|
||||
|
||||
/* FALLTHROUGH */
|
||||
case 0x0408: /* Create Connection Cancel */
|
||||
case 0x040b: /* Link Key Request Reply */
|
||||
|
@ -2249,7 +2329,7 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, local_addr, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data != NULL && local_addr) {
|
||||
localhost_bdaddr_entry_t *localhost_bdaddr_entry;
|
||||
|
||||
|
@ -2273,6 +2353,24 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
wmem_tree_insert32_array(bluetooth_data->localhost_bdaddr, key, localhost_bdaddr_entry);
|
||||
}
|
||||
|
||||
if (local_addr && have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
if (bluetooth_data) {
|
||||
tap_device->interface_id = bluetooth_data->interface_id;
|
||||
tap_device->adapter_id = bluetooth_data->adapter_id;
|
||||
} else {
|
||||
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
|
||||
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
memcpy(tap_device->bd_addr, bd_addr, 6);
|
||||
tap_device->has_bd_addr = TRUE;
|
||||
tap_device->is_local = TRUE;
|
||||
tap_device->type = BLUETOOTH_DEVICE_LOCAL_ADAPTER;
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
/* This is a list of Commands that all return status and connection_handle */
|
||||
|
@ -2441,10 +2539,11 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
|
||||
case 0x0c14: /* Read Local Name */
|
||||
proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
status = tvb_get_guint8(tvb, offset);
|
||||
offset += 1;
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_device_name, tvb, offset, 248, ENC_UTF_8|ENC_NA);
|
||||
if (!pinfo->fd->flags.visited && bluetooth_data != NULL) {
|
||||
if (status == STATUS_SUCCESS && !pinfo->fd->flags.visited && bluetooth_data != NULL) {
|
||||
gchar *name;
|
||||
localhost_name_entry_t *localhost_name_entry;
|
||||
|
||||
|
@ -2466,6 +2565,24 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
|
||||
wmem_tree_insert32_array(bluetooth_data->localhost_name, key, localhost_name_entry);
|
||||
}
|
||||
|
||||
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
if (bluetooth_data) {
|
||||
tap_device->interface_id = bluetooth_data->interface_id;
|
||||
tap_device->adapter_id = bluetooth_data->adapter_id;
|
||||
} else {
|
||||
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
|
||||
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
tap_device->has_bd_addr = FALSE;
|
||||
tap_device->is_local = TRUE;
|
||||
tap_device->type = BLUETOOTH_DEVICE_NAME;
|
||||
tap_device->data.name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 248, ENC_UTF_8);
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
offset += 248;
|
||||
|
||||
break;
|
||||
|
@ -2737,7 +2854,7 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
status = tvb_get_guint8(tvb, offset);
|
||||
offset += 1;
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_hci_vers_nr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
proto_tree_add_item(tree, hf_bthci_bthci_evt_hci_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
||||
hci_revision_item = proto_tree_add_item(tree, hf_bthci_evt_hci_revision, tvb, offset, 2, ENC_LITTLE_ENDIAN);
|
||||
|
@ -2766,11 +2883,32 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset,
|
|||
key[2].key = NULL;
|
||||
|
||||
hci_vendor_data = (hci_vendor_data_t *) wmem_tree_lookup32_array(bluetooth_data->hci_vendors, key);
|
||||
|
||||
hci_revision = tvb_get_letohs(tvb, offset - 7);
|
||||
manufacturer = tvb_get_letohs(tvb, offset - 4);
|
||||
hci_revision = tvb_get_letohs(tvb, offset - 7);
|
||||
manufacturer = tvb_get_letohs(tvb, offset - 4);
|
||||
lmp_subversion = tvb_get_letohs(tvb, offset - 2);
|
||||
|
||||
if (have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
guint8 hci_version;
|
||||
guint8 lmp_version;
|
||||
|
||||
hci_version = tvb_get_guint8(tvb, offset - 8);
|
||||
lmp_version = tvb_get_guint8(tvb, offset - 5);
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
tap_device->type = BLUETOOTH_DEVICE_LOCAL_VERSION;
|
||||
tap_device->interface_id = interface_id;
|
||||
tap_device->adapter_id = adapter_id;
|
||||
tap_device->has_bd_addr = FALSE;
|
||||
tap_device->is_local = TRUE;
|
||||
tap_device->data.local_version.hci_version = hci_version;
|
||||
tap_device->data.local_version.hci_revision = hci_revision;
|
||||
tap_device->data.local_version.lmp_version = lmp_version;
|
||||
tap_device->data.local_version.lmp_subversion = lmp_subversion;
|
||||
tap_device->data.local_version.manufacturer = manufacturer;
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
|
||||
if (hci_vendor_data) {
|
||||
proto_tree *sub_tree;
|
||||
proto_item *sub_item;
|
||||
|
@ -3283,7 +3421,7 @@ dissect_bthci_evt_sync_connection_complete(tvbuff_t *tvb, int offset,
|
|||
connection_handle = tvb_get_letohs(tvb, offset) & 0x0FFF;
|
||||
offset += 2;
|
||||
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_sync_link_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -3494,7 +3632,7 @@ dissect_bthci_evt_link_supervision_timeout_changed(tvbuff_t *tvb, int offset, pa
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_bthci_evt_inquire_result(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
|
||||
dissect_bthci_evt_inquire_result(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, bluetooth_data_t *bluetooth_data)
|
||||
{
|
||||
guint8 num, evt_num_responses;
|
||||
|
||||
|
@ -3503,7 +3641,7 @@ dissect_bthci_evt_inquire_result(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
offset += 1;
|
||||
|
||||
for (num = 0; num < evt_num_responses; num++) {
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bthci_evt_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(tree, hf_bthci_evt_page_scan_repetition_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
|
||||
offset += 1;
|
||||
|
@ -3540,6 +3678,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
wmem_list_frame_t *opcode_list_frame;
|
||||
bthci_cmd_data_t *lastest_bthci_cmd_data = NULL;
|
||||
opcode_list_data_t *opcode_list_data;
|
||||
guint32 opcode = G_MAXUINT32;
|
||||
|
||||
/* Reject the packet if data is NULL */
|
||||
if (data == NULL)
|
||||
|
@ -3604,7 +3743,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x02: /* Inquiry result event */
|
||||
offset = dissect_bthci_evt_inquire_result(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_inquire_result(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x03: /* Connection Complete */
|
||||
|
@ -3616,7 +3755,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x04: /* Connection Request */
|
||||
offset = dissect_bthci_evt_connect_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_connect_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x05: /* Disconnection Complete */
|
||||
|
@ -3654,7 +3793,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x0c: /* Read Remote Version Information Complete */
|
||||
offset = dissect_bthci_evt_read_remote_version_information_complete(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_read_remote_version_information_complete(tvb, offset, pinfo, bluetooth_data, bthci_evt_tree);
|
||||
add_opcode(opcode_list, 0x41D, COMMAND_STATUS_NORMAL); /* Read Remote Version Information */
|
||||
break;
|
||||
|
||||
|
@ -3663,7 +3802,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x0e: /* Command Complete */
|
||||
offset = dissect_bthci_evt_command_complete(tvb, offset, pinfo, tree, bthci_evt_tree, opcode_list, bluetooth_data);
|
||||
offset = dissect_bthci_evt_command_complete(tvb, offset, pinfo, tree, bthci_evt_tree, opcode_list, bluetooth_data, &opcode);
|
||||
add_opcode(opcode_list, 0x0429, COMMAND_STATUS_NORMAL); /* Accept Synchronous Connection Request */
|
||||
break;
|
||||
|
||||
|
@ -3695,19 +3834,19 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x15: /* Return Link Keys */
|
||||
offset = dissect_bthci_evt_return_link_keys(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_return_link_keys(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x16: /* PIN Code Request */
|
||||
offset = dissect_bthci_evt_pin_code_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_pin_code_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x17: /* Link Key Request */
|
||||
offset = dissect_bthci_evt_link_key_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_link_key_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x18: /* Link Key Notification */
|
||||
offset = dissect_bthci_evt_link_key_notification(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_link_key_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x19: /* Loopback Command */
|
||||
|
@ -3736,11 +3875,11 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x1f: /* Page Scan Mode Change */
|
||||
offset = dissect_bthci_evt_page_scan_mode_change(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_page_scan_mode_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x20: /* Page Scan Repetition Mode Change */
|
||||
offset = dissect_bthci_evt_page_scan_repetition_mode_change(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_page_scan_repetition_mode_change(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x21: /* Flow Specification Complete */
|
||||
|
@ -3748,7 +3887,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x22: /* Inquiry Result with RSSI */
|
||||
offset = dissect_bthci_evt_inquire_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree, NULL);
|
||||
offset = dissect_bthci_evt_inquire_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data, NULL);
|
||||
break;
|
||||
|
||||
case 0x23: /* Read Remote Extended Features Complete */
|
||||
|
@ -3775,7 +3914,7 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
|
||||
case 0x2f: /* Extended Inquiry Result */
|
||||
previous_offset = offset;
|
||||
offset = dissect_bthci_evt_inquire_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree, bd_addr);
|
||||
offset = dissect_bthci_evt_inquire_result_with_rssi(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data, bd_addr);
|
||||
|
||||
call_dissector(btcommon_eir_handle, tvb_new_subset_length(tvb, offset, 240), pinfo, bthci_evt_tree);
|
||||
save_remote_device_name(tvb, offset, pinfo, 240, (offset - previous_offset <= 1) ? NULL : bd_addr, bluetooth_data);
|
||||
|
@ -3789,27 +3928,27 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x31: /* IO Capability Request */
|
||||
offset = dissect_bthci_evt_io_capability_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_io_capability_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x32: /* IO Capability Response */
|
||||
offset = dissect_bthci_evt_io_capability_response(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_io_capability_response(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x33: /* User Confirmation Request */
|
||||
offset = dissect_bthci_evt_user_confirmation_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_user_confirmation_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x34: /* User Passkey Request */
|
||||
offset = dissect_bthci_evt_user_passkey_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_user_passkey_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x35: /* Remote OOB Data Request */
|
||||
offset = dissect_bthci_evt_remote_oob_data_request(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_remote_oob_data_request(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x36: /* Simple Pairing Complete */
|
||||
offset = dissect_bthci_evt_simple_pairing_complete(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_simple_pairing_complete(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x38: /* Link Supervision Timeout Changed */
|
||||
|
@ -3821,15 +3960,15 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
break;
|
||||
|
||||
case 0x3b: /* Enhanced Flush Complete */
|
||||
offset = dissect_bthci_evt_user_passkey_notification(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_user_passkey_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x3c: /* Enhanced Flush Complete */
|
||||
offset = dissect_bthci_evt_keypress_notification(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_keypress_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x3d: /* Remote Host Supported Features Notification */
|
||||
offset = dissect_bthci_evt_remote_host_sup_feat_notification(tvb, offset, pinfo, bthci_evt_tree);
|
||||
offset = dissect_bthci_evt_remote_host_sup_feat_notification(tvb, offset, pinfo, bthci_evt_tree, bluetooth_data);
|
||||
break;
|
||||
|
||||
case 0x3e: /* LE Meta */
|
||||
|
@ -3934,7 +4073,6 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
offset += tvb_reported_length_remaining(tvb, offset);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
opcode_list_frame = wmem_list_head(opcode_list);
|
||||
|
@ -3943,7 +4081,6 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
wmem_tree_key_t key[4];
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
guint32 opcode;
|
||||
guint32 frame_number;
|
||||
bthci_cmd_data_t *bthci_cmd_data;
|
||||
wmem_tree_t *subtree;
|
||||
|
@ -4016,6 +4153,59 @@ dissect_bthci_evt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
|
|||
|
||||
frame_number = pinfo->fd->num;
|
||||
|
||||
if (opcode != G_MAXUINT32 && opcode >> 10 != HCI_OGF_VENDOR_SPECIFIC) {
|
||||
guint8 status;
|
||||
|
||||
switch(opcode) {
|
||||
case 0x0c13: /* Change Local Name */
|
||||
status = tvb_get_guint8(tvb, 5);
|
||||
|
||||
if (status == STATUS_SUCCESS && have_tap_listener(bluetooth_device_tap)) {
|
||||
bluetooth_device_tap_t *tap_device;
|
||||
|
||||
tap_device = wmem_new(wmem_packet_scope(), bluetooth_device_tap_t);
|
||||
if (bluetooth_data) {
|
||||
tap_device->interface_id = bluetooth_data->interface_id;
|
||||
tap_device->adapter_id = bluetooth_data->adapter_id;
|
||||
} else {
|
||||
tap_device->interface_id = HCI_INTERFACE_DEFAULT;
|
||||
tap_device->adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
tap_device->has_bd_addr = FALSE;
|
||||
tap_device->is_local = TRUE;
|
||||
tap_device->type = BLUETOOTH_DEVICE_NAME;
|
||||
tap_device->data.name = lastest_bthci_cmd_data->data.name;
|
||||
tap_queue_packet(bluetooth_device_tap, pinfo, tap_device);
|
||||
}
|
||||
if (status == STATUS_SUCCESS && !pinfo->fd->flags.visited && bluetooth_data) {
|
||||
localhost_name_entry_t *localhost_name_entry;
|
||||
wmem_tree_key_t key[4];
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
|
||||
interface_id = bluetooth_data->interface_id;
|
||||
adapter_id = bluetooth_data->adapter_id;
|
||||
|
||||
key[0].length = 1;
|
||||
key[0].key = &interface_id;
|
||||
key[1].length = 1;
|
||||
key[1].key = &adapter_id;
|
||||
key[2].length = 1;
|
||||
key[2].key = &frame_number;
|
||||
key[3].length = 0;
|
||||
key[3].key = NULL;
|
||||
|
||||
localhost_name_entry = (localhost_name_entry_t *) wmem_new(wmem_file_scope(), localhost_name_entry_t);
|
||||
localhost_name_entry->interface_id = interface_id;
|
||||
localhost_name_entry->adapter_id = adapter_id;
|
||||
localhost_name_entry->name = lastest_bthci_cmd_data->data.name;
|
||||
|
||||
wmem_tree_insert32_array(bluetooth_data->localhost_name, key, localhost_name_entry);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pinfo->fd->flags.visited && opcode_list_data->command_status == COMMAND_STATUS_PENDING &&
|
||||
lastest_bthci_cmd_data->pending_in_frame == max_disconnect_in_frame) {
|
||||
lastest_bthci_cmd_data->pending_in_frame = frame_number;
|
||||
|
@ -4231,12 +4421,12 @@ proto_register_bthci_evt(void)
|
|||
},
|
||||
{ &hf_bthci_evt_vers_nr,
|
||||
{ "LMP Version", "bthci_evt.lmp_vers_nr",
|
||||
FT_UINT8, BASE_HEX, VALS(evt_lmp_vers_nr), 0x0,
|
||||
FT_UINT8, BASE_HEX, VALS(bthci_evt_lmp_version), 0x0,
|
||||
"Version of the Current LMP", HFILL }
|
||||
},
|
||||
{ &hf_bthci_evt_hci_vers_nr,
|
||||
{ &hf_bthci_bthci_evt_hci_version,
|
||||
{ "HCI Version", "bthci_evt.hci_vers_nr",
|
||||
FT_UINT8, BASE_HEX, VALS(evt_hci_vers_nr), 0x0,
|
||||
FT_UINT8, BASE_HEX, VALS(bthci_evt_hci_version), 0x0,
|
||||
"Version of the Current HCI", HFILL }
|
||||
},
|
||||
{ &hf_bthci_evt_hci_revision,
|
||||
|
|
|
@ -24,6 +24,17 @@
|
|||
|
||||
extern value_string_ext bthci_evt_evt_code_vals_ext;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
WS_DLL_PUBLIC const value_string bthci_evt_lmp_version[];
|
||||
WS_DLL_PUBLIC const value_string bthci_evt_hci_version[];
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -401,7 +401,7 @@ dissect_bthci_vendor_broadcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
|
|||
|
||||
switch(ocf) {
|
||||
case 0x0001: /* Write BDADDR */
|
||||
offset = dissect_bd_addr(hf_bd_addr, main_tree, tvb, offset, bd_addr);
|
||||
offset = dissect_bd_addr(hf_bd_addr, pinfo, main_tree, tvb, offset, TRUE, bluetooth_data->interface_id, bluetooth_data->adapter_id, bd_addr);
|
||||
|
||||
/* TODO: This is command, but in respose (event Command Complete) there is a status for that,
|
||||
so write bdaddr can fail, but we store bdaddr as valid for now... */
|
||||
|
@ -582,12 +582,12 @@ dissect_bthci_vendor_broadcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
|
|||
proto_tree_add_item(main_tree, hf_le_multi_advertising_address_type, tvb, offset, 1, ENC_NA);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bd_addr, main_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bd_addr, pinfo, main_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(main_tree, hf_le_multi_advertising_address_type, tvb, offset, 1, ENC_NA);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bd_addr, main_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bd_addr, pinfo, main_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_bitmask(main_tree, tvb, offset, hf_le_multi_advertising_channel_map, ett_channel_map, hfx_le_multi_advertising_channel_map, ENC_NA);
|
||||
offset += 1;
|
||||
|
@ -613,7 +613,7 @@ dissect_bthci_vendor_broadcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
|
|||
|
||||
break;
|
||||
case 0x04: /* Set Random Address */
|
||||
offset = dissect_bd_addr(hf_bd_addr, main_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bd_addr, pinfo, main_tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(main_tree, hf_le_multi_advertising_instance_id, tvb, offset, 1, ENC_NA);
|
||||
offset += 1;
|
||||
|
|
|
@ -444,7 +444,7 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
case 0x00: /* ADV_IND */
|
||||
case 0x02: /* ADV_NONCONN_IND */
|
||||
case 0x06: /* ADV_SCAN_IND */
|
||||
offset = dissect_bd_addr(hf_advertising_address, btle_tree, tvb, offset, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, pinfo, btle_tree, tvb, offset, TRUE, interface_id, adapter_id, src_bd_addr);
|
||||
|
||||
SET_ADDRESS(&pinfo->net_src, AT_ETHER, 6, src_bd_addr);
|
||||
COPY_ADDRESS_SHALLOW(&pinfo->dl_src, &pinfo->net_src);
|
||||
|
@ -475,8 +475,8 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
|
||||
break;
|
||||
case 0x01: /* ADV_DIRECT_IND */
|
||||
offset = dissect_bd_addr(hf_advertising_address, btle_tree, tvb, offset, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_initiator_addresss, btle_tree, tvb, offset, dst_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, pinfo, btle_tree, tvb, offset, TRUE, interface_id, adapter_id, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_initiator_addresss, pinfo, btle_tree, tvb, offset, FALSE, interface_id, adapter_id, dst_bd_addr);
|
||||
|
||||
SET_ADDRESS(&pinfo->net_src, AT_ETHER, 6, src_bd_addr);
|
||||
COPY_ADDRESS_SHALLOW(&pinfo->dl_src, &pinfo->net_src);
|
||||
|
@ -500,8 +500,8 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
|
||||
break;
|
||||
case 0x03: /* SCAN_REQ */
|
||||
offset = dissect_bd_addr(hf_scanning_address, btle_tree, tvb, offset, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, btle_tree, tvb, offset, dst_bd_addr);
|
||||
offset = dissect_bd_addr(hf_scanning_address, pinfo, btle_tree, tvb, offset, TRUE, interface_id, adapter_id, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, pinfo, btle_tree, tvb, offset, FALSE, interface_id, adapter_id, dst_bd_addr);
|
||||
|
||||
SET_ADDRESS(&pinfo->net_src, AT_ETHER, 6, src_bd_addr);
|
||||
COPY_ADDRESS_SHALLOW(&pinfo->dl_src, &pinfo->net_src);
|
||||
|
@ -525,7 +525,7 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
|
||||
break;
|
||||
case 0x04: /* SCAN_RSP */
|
||||
offset = dissect_bd_addr(hf_advertising_address, btle_tree, tvb, offset, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, pinfo, btle_tree, tvb, offset, TRUE, interface_id, adapter_id, src_bd_addr);
|
||||
|
||||
SET_ADDRESS(&pinfo->net_src, AT_ETHER, 6, src_bd_addr);
|
||||
COPY_ADDRESS_SHALLOW(&pinfo->dl_src, &pinfo->net_src);
|
||||
|
@ -559,8 +559,8 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
|
||||
break;
|
||||
case 0x05: /* CONNECT_REQ */
|
||||
offset = dissect_bd_addr(hf_initiator_addresss, btle_tree, tvb, offset, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, btle_tree, tvb, offset, dst_bd_addr);
|
||||
offset = dissect_bd_addr(hf_initiator_addresss, pinfo, btle_tree, tvb, offset, FALSE, interface_id, adapter_id, src_bd_addr);
|
||||
offset = dissect_bd_addr(hf_advertising_address, pinfo, btle_tree, tvb, offset, TRUE, interface_id, adapter_id, dst_bd_addr);
|
||||
|
||||
SET_ADDRESS(&pinfo->net_src, AT_ETHER, 6, src_bd_addr);
|
||||
COPY_ADDRESS_SHALLOW(&pinfo->dl_src, &pinfo->net_src);
|
||||
|
|
|
@ -1778,6 +1778,28 @@ dissect_headers(proto_tree *tree, tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
guint32 value;
|
||||
guint8 tag;
|
||||
gchar *str = NULL;
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
guint32 chandle;
|
||||
guint32 channel;
|
||||
|
||||
if (is_obex_over_l2cap) {
|
||||
btl2cap_data_t *l2cap_data;
|
||||
|
||||
l2cap_data = (btl2cap_data_t *) data;
|
||||
interface_id = l2cap_data->interface_id;
|
||||
adapter_id = l2cap_data->adapter_id;
|
||||
chandle = l2cap_data->chandle;
|
||||
channel = l2cap_data->cid;
|
||||
} else {
|
||||
btrfcomm_data_t *rfcomm_data;
|
||||
|
||||
rfcomm_data = (btrfcomm_data_t *) data;
|
||||
interface_id = rfcomm_data->interface_id;
|
||||
adapter_id = rfcomm_data->adapter_id;
|
||||
chandle = rfcomm_data->chandle;
|
||||
channel = rfcomm_data->dlci >> 1;
|
||||
}
|
||||
|
||||
if (tvb_reported_length_remaining(tvb, offset) > 0) {
|
||||
proto_item *hdrs;
|
||||
|
@ -2017,10 +2039,7 @@ dissect_headers(proto_tree *tree, tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
col_append_fstr(pinfo->cinfo, COL_INFO, " - %s", target_vals[i].strptr);
|
||||
if (!pinfo->fd->flags.visited) {
|
||||
obex_profile_data_t *obex_profile_data;
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
guint32 chandle;
|
||||
guint32 channel;
|
||||
|
||||
wmem_tree_key_t key[6];
|
||||
guint32 k_interface_id;
|
||||
guint32 k_adapter_id;
|
||||
|
@ -2028,24 +2047,6 @@ dissect_headers(proto_tree *tree, tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
guint32 k_chandle;
|
||||
guint32 k_channel;
|
||||
|
||||
if (is_obex_over_l2cap) {
|
||||
btl2cap_data_t *l2cap_data;
|
||||
|
||||
l2cap_data = (btl2cap_data_t *) data;
|
||||
interface_id = l2cap_data->interface_id;
|
||||
adapter_id = l2cap_data->adapter_id;
|
||||
chandle = l2cap_data->chandle;
|
||||
channel = l2cap_data->cid;
|
||||
} else {
|
||||
btrfcomm_data_t *rfcomm_data;
|
||||
|
||||
rfcomm_data = (btrfcomm_data_t *) data;
|
||||
interface_id = rfcomm_data->interface_id;
|
||||
adapter_id = rfcomm_data->adapter_id;
|
||||
chandle = rfcomm_data->chandle;
|
||||
channel = rfcomm_data->dlci >> 1;
|
||||
}
|
||||
|
||||
k_interface_id = interface_id;
|
||||
k_adapter_id = adapter_id;
|
||||
k_chandle = chandle;
|
||||
|
@ -2129,7 +2130,7 @@ dissect_headers(proto_tree *tree, tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
switch (tag) {
|
||||
case 0x00: /* Device Address */
|
||||
if (sub_parameter_length == 6) {
|
||||
offset = dissect_bd_addr(hf_sender_bd_addr, parameter_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_sender_bd_addr, pinfo, parameter_tree, tvb, offset, FALSE, interface_id, adapter_id, NULL);
|
||||
} else {
|
||||
proto_tree_add_item(parameter_tree, hf_session_parameter_data, tvb, offset, sub_parameter_length, ENC_NA);
|
||||
|
||||
|
|
|
@ -180,12 +180,25 @@ dissect_btsmp_key_dist(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree
|
|||
}
|
||||
|
||||
static int
|
||||
dissect_btsmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
|
||||
dissect_btsmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
||||
{
|
||||
int offset = 0;
|
||||
proto_item *ti;
|
||||
proto_tree *st;
|
||||
guint8 opcode;
|
||||
btl2cap_data_t *l2cap_data;
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
|
||||
l2cap_data = (btl2cap_data_t *) data;
|
||||
|
||||
if (l2cap_data) {
|
||||
interface_id = l2cap_data->interface_id;
|
||||
adapter_id = l2cap_data->adapter_id;
|
||||
} else {
|
||||
interface_id = HCI_INTERFACE_DEFAULT;
|
||||
adapter_id = HCI_ADAPTER_DEFAULT;
|
||||
}
|
||||
|
||||
ti = proto_tree_add_item(tree, proto_btsmp, tvb, 0, tvb_captured_length(tvb), ENC_NA);
|
||||
st = proto_item_add_subtree(ti, ett_btsmp);
|
||||
|
@ -271,7 +284,7 @@ dissect_btsmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U
|
|||
proto_tree_add_item(st, hf_address_type, tvb, offset, 1, ENC_NA);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bd_addr, st, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bd_addr, pinfo, st, tvb, offset, FALSE, interface_id, adapter_id, NULL);
|
||||
break;
|
||||
|
||||
case 0x0a: /* Signing Information */
|
||||
|
|
|
@ -199,7 +199,7 @@ dissect_hci_mon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
proto_tree_add_item(hci_mon_tree, hf_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
||||
offset += 1;
|
||||
|
||||
offset = dissect_bd_addr(hf_bd_addr, hci_mon_tree, tvb, offset, NULL);
|
||||
offset = dissect_bd_addr(hf_bd_addr, pinfo, hci_mon_tree, tvb, offset, TRUE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL);
|
||||
|
||||
proto_tree_add_item(hci_mon_tree, hf_name, tvb, offset, 8, ENC_NA | ENC_ASCII);
|
||||
offset += 8;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
set(WIRESHARK_QT_HEADERS
|
||||
about_dialog.h
|
||||
bluetooth_att_server_attributes_dialog.h
|
||||
bluetooth_devices_dialog.h
|
||||
accordion_frame.h
|
||||
byte_view_tab.h
|
||||
byte_view_text.h
|
||||
|
@ -142,6 +143,7 @@ set(WIRESHARK_QT_SRC
|
|||
about_dialog.cpp
|
||||
accordion_frame.cpp
|
||||
bluetooth_att_server_attributes_dialog.cpp
|
||||
bluetooth_devices_dialog.cpp
|
||||
byte_view_tab.cpp
|
||||
byte_view_text.cpp
|
||||
capture_file.cpp
|
||||
|
@ -263,6 +265,7 @@ set(WIRESHARK_QT_FILES
|
|||
set(WIRESHARK_QT_UI
|
||||
about_dialog.ui
|
||||
bluetooth_att_server_attributes_dialog.ui
|
||||
bluetooth_devices_dialog.ui
|
||||
capture_file_properties_dialog.ui
|
||||
capture_interfaces_dialog.ui
|
||||
capture_preferences_frame.ui
|
||||
|
|
|
@ -124,6 +124,8 @@ about_dialog.cpp about_dialog.h: ui_about_dialog.h
|
|||
|
||||
bluetooth_att_server_attributes_dialog.cpp bluetooth_att_server_attributes_dialog.h: ui_bluetooth_att_server_attributes_dialog.h
|
||||
|
||||
bluetooth_devices_dialog.cpp bluetooth_devices_dialog.h: ui_bluetooth_devices_dialog.h
|
||||
|
||||
capture_file_properties_dialog.cpp capture_file_properties_dialog.h: ui_capture_file_properties_dialog.h
|
||||
|
||||
capture_interfaces_dialog.cpp capture_interfaces_dialog.h: ui_capture_interfaces_dialog.h
|
||||
|
|
|
@ -31,6 +31,7 @@ GENERATED_HEADER_FILES =
|
|||
NODIST_GENERATED_HEADER_FILES = \
|
||||
ui_about_dialog.h \
|
||||
ui_bluetooth_att_server_attributes_dialog.h \
|
||||
ui_bluetooth_devices_dialog.h \
|
||||
ui_capture_file_properties_dialog.h \
|
||||
ui_capture_interfaces_dialog.h \
|
||||
ui_capture_preferences_frame.h \
|
||||
|
@ -125,6 +126,7 @@ MOC_HDRS = \
|
|||
about_dialog.h \
|
||||
accordion_frame.h \
|
||||
bluetooth_att_server_attributes_dialog.h \
|
||||
bluetooth_devices_dialog.h \
|
||||
byte_view_tab.h \
|
||||
byte_view_text.h \
|
||||
capture_file.h \
|
||||
|
@ -225,6 +227,7 @@ MOC_HDRS = \
|
|||
UI_FILES = \
|
||||
about_dialog.ui \
|
||||
bluetooth_att_server_attributes_dialog.ui \
|
||||
bluetooth_devices_dialog.ui \
|
||||
capture_file_properties_dialog.ui \
|
||||
capture_interfaces_dialog.ui \
|
||||
capture_preferences_frame.ui \
|
||||
|
@ -335,6 +338,7 @@ WIRESHARK_QT_SRC = \
|
|||
about_dialog.cpp \
|
||||
accordion_frame.cpp \
|
||||
bluetooth_att_server_attributes_dialog.cpp \
|
||||
bluetooth_devices_dialog.cpp \
|
||||
byte_view_tab.cpp \
|
||||
byte_view_text.cpp \
|
||||
capture_file.cpp \
|
||||
|
|
|
@ -207,6 +207,7 @@ HEADERS_WS_C = \
|
|||
FORMS += \
|
||||
about_dialog.ui \
|
||||
bluetooth_att_server_attributes_dialog.ui \
|
||||
bluetooth_devices_dialog.ui \
|
||||
capture_file_properties_dialog.ui \
|
||||
capture_interfaces_dialog.ui \
|
||||
capture_preferences_frame.ui \
|
||||
|
@ -269,6 +270,7 @@ HEADERS += $$HEADERS_WS_C \
|
|||
about_dialog.h \
|
||||
accordion_frame.h \
|
||||
bluetooth_att_server_attributes_dialog.h \
|
||||
bluetooth_devices_dialog.h \
|
||||
capture_file_properties_dialog.h \
|
||||
capture_interfaces_dialog.h \
|
||||
capture_preferences_frame.h \
|
||||
|
@ -613,6 +615,7 @@ SOURCES += \
|
|||
about_dialog.cpp \
|
||||
accordion_frame.cpp \
|
||||
bluetooth_att_server_attributes_dialog.cpp \
|
||||
bluetooth_devices_dialog.cpp \
|
||||
byte_view_tab.cpp \
|
||||
byte_view_text.cpp \
|
||||
capture_file.cpp \
|
||||
|
|
|
@ -0,0 +1,412 @@
|
|||
/* bluetooth_devices_dialog.cpp
|
||||
*
|
||||
* Wireshark - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@wireshark.org>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "bluetooth_devices_dialog.h"
|
||||
#include "ui_bluetooth_devices_dialog.h"
|
||||
|
||||
#include "epan/epan.h"
|
||||
#include "epan/addr_resolv.h"
|
||||
#include "epan/to_str.h"
|
||||
#include "epan/epan_dissect.h"
|
||||
#include "epan/dissectors/packet-bluetooth.h"
|
||||
#include "epan/dissectors/packet-bthci_evt.h"
|
||||
|
||||
#include "ui/simple_dialog.h"
|
||||
|
||||
#include <QClipboard>
|
||||
#include <QContextMenuEvent>
|
||||
#include <QPushButton>
|
||||
#include <QTreeWidget>
|
||||
#include <QFileDialog>
|
||||
|
||||
static const int column_number_bd_addr = 0;
|
||||
static const int column_number_bd_addr_oui = 1;
|
||||
static const int column_number_name = 2;
|
||||
static const int column_number_lmp_version = 3;
|
||||
static const int column_number_lmp_subversion = 4;
|
||||
static const int column_number_manufacturer = 5;
|
||||
static const int column_number_hci_version = 6;
|
||||
static const int column_number_hci_revision = 7;
|
||||
static const int column_number_is_local_adapter = 8;
|
||||
|
||||
typedef struct _item_data_t {
|
||||
guint32 interface_id;
|
||||
guint32 adapter_id;
|
||||
guint32 frame_number;
|
||||
} item_data_t;
|
||||
|
||||
Q_DECLARE_METATYPE(item_data_t *)
|
||||
|
||||
static gboolean
|
||||
bluetooth_device_tap_packet(void *tapinfo_ptr, packet_info *pinfo, epan_dissect_t *edt, const void* data)
|
||||
{
|
||||
bluetooth_devices_tapinfo_t *tapinfo = (bluetooth_devices_tapinfo_t *) tapinfo_ptr;
|
||||
|
||||
if (tapinfo->tap_packet)
|
||||
tapinfo->tap_packet(tapinfo, pinfo, edt, data);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
bluetooth_device_tap_reset(void *tapinfo_ptr)
|
||||
{
|
||||
bluetooth_devices_tapinfo_t *tapinfo = (bluetooth_devices_tapinfo_t *) tapinfo_ptr;
|
||||
|
||||
if (tapinfo->tap_reset)
|
||||
tapinfo->tap_reset(tapinfo);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
bluetooth_devices_tap(void *data)
|
||||
{
|
||||
GString *error_string;
|
||||
|
||||
error_string = register_tap_listener("bluetooth.device", data, NULL,
|
||||
0,
|
||||
bluetooth_device_tap_reset,
|
||||
bluetooth_device_tap_packet,
|
||||
NULL
|
||||
);
|
||||
|
||||
if (error_string != NULL) {
|
||||
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
|
||||
"%s", error_string->str);
|
||||
g_string_free(error_string, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BluetoothDevicesDialog::BluetoothDevicesDialog(QWidget &parent, CaptureFile &cf) :
|
||||
WiresharkDialog(parent, cf),
|
||||
ui(new Ui::BluetoothDevicesDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
resize(parent.width() * 4 / 5, parent.height() * 2 / 3);
|
||||
|
||||
connect(ui->tableTreeWidget, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(tableContextMenu(const QPoint &)));
|
||||
connect(ui->interfaceComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(interfaceCurrentIndexChanged(int)));
|
||||
connect(ui->showInformationStepsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(showInformationStepsChanged(int)));
|
||||
|
||||
ui->tableTreeWidget->sortByColumn(column_number_bd_addr, Qt::AscendingOrder);
|
||||
|
||||
context_menu_.addActions(QList<QAction *>() << ui->actionCopy_Cell);
|
||||
context_menu_.addActions(QList<QAction *>() << ui->actionCopy_Rows);
|
||||
context_menu_.addActions(QList<QAction *>() << ui->actionCopy_All);
|
||||
context_menu_.addActions(QList<QAction *>() << ui->actionSave_as_image);
|
||||
|
||||
tapinfo_.tap_packet = tapPacket;
|
||||
tapinfo_.tap_reset = tapReset;
|
||||
tapinfo_.ui = this;
|
||||
|
||||
bluetooth_devices_tap(&tapinfo_);
|
||||
|
||||
cap_file_.retapPackets();
|
||||
}
|
||||
|
||||
|
||||
BluetoothDevicesDialog::~BluetoothDevicesDialog()
|
||||
{
|
||||
delete ui;
|
||||
|
||||
remove_tap_listener(&tapinfo_);
|
||||
}
|
||||
|
||||
|
||||
void BluetoothDevicesDialog::captureFileClosing()
|
||||
{
|
||||
remove_tap_listener(&tapinfo_);
|
||||
|
||||
ui->interfaceComboBox->setEnabled(FALSE);
|
||||
ui->showInformationStepsCheckBox->setEnabled(FALSE);
|
||||
|
||||
WiresharkDialog::captureFileClosing();
|
||||
}
|
||||
|
||||
|
||||
void BluetoothDevicesDialog::changeEvent(QEvent *event)
|
||||
{
|
||||
if (0 != event)
|
||||
{
|
||||
switch (event->type())
|
||||
{
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
QDialog::changeEvent(event);
|
||||
}
|
||||
|
||||
|
||||
void BluetoothDevicesDialog::tableContextMenu(const QPoint &pos)
|
||||
{
|
||||
context_menu_.exec(ui->tableTreeWidget->viewport()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
|
||||
void BluetoothDevicesDialog::on_actionCopy_Cell_triggered()
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
QString copy;
|
||||
|
||||
copy = QString(ui->tableTreeWidget->currentItem()->text(ui->tableTreeWidget->currentColumn()));
|
||||
|
||||
clipboard->setText(copy);
|
||||
}
|
||||
|
||||
|
||||
void BluetoothDevicesDialog::on_actionCopy_Rows_triggered()
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
QString copy;
|
||||
QList<QTreeWidgetItem *> items;
|
||||
QList<QTreeWidgetItem *>::iterator i_item;
|
||||
|
||||
items = ui->tableTreeWidget->selectedItems();
|
||||
|
||||
for (i_item = items.begin(); i_item != items.end(); ++i_item) {
|
||||
copy += QString("%1 %2 %3 %4 %5 %6 %7 %8 %9\n")
|
||||
.arg((*i_item)->text(column_number_bd_addr), -20)
|
||||
.arg((*i_item)->text(column_number_bd_addr_oui), -20)
|
||||
.arg((*i_item)->text(column_number_name), -30)
|
||||
.arg((*i_item)->text(column_number_lmp_version), -20)
|
||||
.arg((*i_item)->text(column_number_lmp_subversion), -20)
|
||||
.arg((*i_item)->text(column_number_manufacturer), -30)
|
||||
.arg((*i_item)->text(column_number_hci_version), -20)
|
||||
.arg((*i_item)->text(column_number_hci_revision), -20)
|
||||
.arg((*i_item)->text(column_number_is_local_adapter), -20);
|
||||
}
|
||||
|
||||
clipboard->setText(copy);
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::tapReset(void *tapinfo_ptr )
|
||||
{
|
||||
bluetooth_devices_tapinfo_t *tapinfo = (bluetooth_devices_tapinfo_t *) tapinfo_ptr;
|
||||
BluetoothDevicesDialog *bluetooth_devices_dialog = static_cast<BluetoothDevicesDialog *>(tapinfo->ui);
|
||||
|
||||
|
||||
bluetooth_devices_dialog->ui->tableTreeWidget->clear();
|
||||
}
|
||||
|
||||
gboolean BluetoothDevicesDialog::tapPacket(void *tapinfo_ptr, packet_info *pinfo, epan_dissect_t *, const void *data)
|
||||
{
|
||||
bluetooth_devices_tapinfo_t *tapinfo = static_cast<bluetooth_devices_tapinfo_t *>(tapinfo_ptr);
|
||||
BluetoothDevicesDialog *dialog = static_cast<BluetoothDevicesDialog *>(tapinfo->ui);
|
||||
bluetooth_device_tap_t *tap_device = static_cast<bluetooth_device_tap_t *>(const_cast<void *>(data));
|
||||
QString bd_addr;
|
||||
QString bd_addr_oui;
|
||||
QString name;
|
||||
const gchar *manuf;
|
||||
QTreeWidgetItem *item = NULL;
|
||||
|
||||
if (pinfo->phdr->presence_flags & WTAP_HAS_INTERFACE_ID) {
|
||||
gchar *interface;
|
||||
const char *interface_name;
|
||||
|
||||
interface_name = epan_get_interface_name(pinfo->epan, pinfo->phdr->interface_id);
|
||||
interface = wmem_strdup_printf(wmem_packet_scope(), "%u: %s", pinfo->phdr->interface_id, interface_name);
|
||||
|
||||
if (dialog->ui->interfaceComboBox->findText(interface) == -1)
|
||||
dialog->ui->interfaceComboBox->addItem(interface);
|
||||
|
||||
if (interface && dialog->ui->interfaceComboBox->currentIndex() > 0) {
|
||||
if (dialog->ui->interfaceComboBox->currentText() != interface)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (tap_device->has_bd_addr) {
|
||||
bd_addr.sprintf("%02x:%02x:%02x:%02x:%02x:%02x", tap_device->bd_addr[0], tap_device->bd_addr[1], tap_device->bd_addr[2], tap_device->bd_addr[3], tap_device->bd_addr[4], tap_device->bd_addr[5]);
|
||||
|
||||
manuf = get_ether_name(tap_device->bd_addr);
|
||||
if (manuf) {
|
||||
int pos;
|
||||
|
||||
bd_addr_oui = QString(manuf);
|
||||
pos = bd_addr_oui.indexOf('_');
|
||||
if (pos < 0) {
|
||||
manuf = NULL;
|
||||
} else {
|
||||
bd_addr_oui.remove(pos, bd_addr_oui.size());
|
||||
}
|
||||
}
|
||||
|
||||
if (!manuf)
|
||||
bd_addr_oui = "";
|
||||
}
|
||||
|
||||
if (dialog->ui->showInformationStepsCheckBox->checkState() != Qt::Checked) {
|
||||
QTreeWidgetItemIterator i_item(dialog->ui->tableTreeWidget);
|
||||
|
||||
while (*i_item) {
|
||||
QTreeWidgetItem *current_item = static_cast<QTreeWidgetItem*>(*i_item);
|
||||
item_data_t *item_data = current_item->data(0, Qt::UserRole).value<item_data_t *>();
|
||||
|
||||
if ((tap_device->has_bd_addr && current_item->text(column_number_bd_addr) == bd_addr) ||
|
||||
(tap_device->is_local &&
|
||||
item_data->interface_id == tap_device->interface_id &&
|
||||
item_data->adapter_id == tap_device->adapter_id &&
|
||||
!current_item->text(column_number_is_local_adapter).isEmpty())) {
|
||||
item = current_item;
|
||||
break;
|
||||
}
|
||||
i_item += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!item) {
|
||||
item = new QTreeWidgetItem(dialog->ui->tableTreeWidget);
|
||||
item->setText(column_number_bd_addr, bd_addr);
|
||||
item->setText(column_number_bd_addr_oui, bd_addr_oui);
|
||||
if (tap_device->is_local) {
|
||||
item->setText(column_number_is_local_adapter, tr("true"));
|
||||
}
|
||||
|
||||
item_data_t *item_data = wmem_new(wmem_file_scope(), item_data_t);
|
||||
item_data->interface_id = tap_device->interface_id;
|
||||
item_data->adapter_id = tap_device->adapter_id;
|
||||
item_data->frame_number = pinfo->fd->num;
|
||||
item->setData(0, Qt::UserRole, QVariant::fromValue<item_data_t *>(item_data));
|
||||
}
|
||||
|
||||
if (tap_device->type == BLUETOOTH_DEVICE_BD_ADDR) {
|
||||
item->setText(column_number_bd_addr, bd_addr);
|
||||
item->setText(column_number_bd_addr_oui, bd_addr_oui);
|
||||
}
|
||||
|
||||
if (tap_device->type == BLUETOOTH_DEVICE_NAME)
|
||||
item->setText(column_number_name, tap_device->data.name);
|
||||
|
||||
if (tap_device->type == BLUETOOTH_DEVICE_LOCAL_ADAPTER)
|
||||
item->setText(column_number_is_local_adapter, tr("true"));
|
||||
|
||||
if (tap_device->type == BLUETOOTH_DEVICE_LOCAL_VERSION) {
|
||||
item->setText(column_number_hci_version, val_to_str_const(tap_device->data.local_version.hci_version, bthci_evt_hci_version, "Unknown 0x%02x"));
|
||||
item->setText(column_number_hci_revision, QString("").sprintf("%u", tap_device->data.local_version.hci_revision));
|
||||
item->setText(column_number_lmp_version, val_to_str_const(tap_device->data.local_version.lmp_version, bthci_evt_lmp_version, "Unknown 0x%02x"));
|
||||
item->setText(column_number_lmp_subversion, QString("").sprintf("%u", tap_device->data.local_version.lmp_subversion));
|
||||
item->setText(column_number_manufacturer, val_to_str_ext_const(tap_device->data.local_version.manufacturer, &bluetooth_company_id_vals_ext, "Unknown 0x%04x"));
|
||||
}
|
||||
if (tap_device->type == BLUETOOTH_DEVICE_REMOTE_VERSION) {
|
||||
item->setText(column_number_lmp_version, val_to_str_const(tap_device->data.remote_version.lmp_version, bthci_evt_lmp_version, "Unknown 0x%02x"));
|
||||
item->setText(column_number_lmp_subversion, QString("").sprintf("%u", tap_device->data.remote_version.lmp_subversion));
|
||||
item->setText(column_number_manufacturer, val_to_str_ext_const(tap_device->data.remote_version.manufacturer, &bluetooth_company_id_vals_ext, "Unknown 0x%04x"));
|
||||
}
|
||||
|
||||
for (int i = 0; i < dialog->ui->tableTreeWidget->columnCount(); i++) {
|
||||
dialog->ui->tableTreeWidget->resizeColumnToContents(i);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::interfaceCurrentIndexChanged(int)
|
||||
{
|
||||
cap_file_.retapPackets();
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::showInformationStepsChanged(int)
|
||||
{
|
||||
cap_file_.retapPackets();
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::on_tableTreeWidget_itemActivated(QTreeWidgetItem *item, int)
|
||||
{
|
||||
if (!cap_file_.isValid())
|
||||
return;
|
||||
|
||||
item_data_t *item_data = item->data(0, Qt::UserRole).value<item_data_t *>();
|
||||
|
||||
emit goToPacket(item_data->frame_number);
|
||||
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::on_actionCopy_All_triggered()
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
QString copy;
|
||||
QTreeWidgetItemIterator i_item(ui->tableTreeWidget);
|
||||
|
||||
copy += QString("%1 %2 %3 %4 %5 %6 %7 %8 %9\n")
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_bd_addr), -20)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_bd_addr_oui), -20)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_name), -30)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_lmp_version), -20)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_lmp_subversion), -20)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_manufacturer), -30)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_hci_version), -20)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_hci_revision), -20)
|
||||
.arg(ui->tableTreeWidget->headerItem()->text(column_number_is_local_adapter), -20);
|
||||
|
||||
while (*i_item) {
|
||||
QTreeWidgetItem *item = static_cast<QTreeWidgetItem*>(*i_item);
|
||||
copy += QString("%1 %2 %3 %4 %5 %6 %7 %8 %9\n")
|
||||
.arg(item->text(column_number_bd_addr), -20)
|
||||
.arg(item->text(column_number_bd_addr_oui), -20)
|
||||
.arg(item->text(column_number_name), -30)
|
||||
.arg(item->text(column_number_lmp_version), -20)
|
||||
.arg(item->text(column_number_lmp_subversion), -20)
|
||||
.arg(item->text(column_number_manufacturer), -30)
|
||||
.arg(item->text(column_number_hci_version), -20)
|
||||
.arg(item->text(column_number_hci_revision), -20)
|
||||
.arg(item->text(column_number_is_local_adapter), -20);
|
||||
i_item += 1;
|
||||
}
|
||||
|
||||
clipboard->setText(copy);
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::on_actionSave_as_image_triggered()
|
||||
{
|
||||
QPixmap image;
|
||||
|
||||
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Table Image"),
|
||||
"bluetooth_devices_table.png",
|
||||
tr("PNG Image (*.png)"));
|
||||
|
||||
if (fileName.isEmpty()) return;
|
||||
|
||||
image = QPixmap::grabWidget(ui->tableTreeWidget);
|
||||
image.save(fileName, "PNG");
|
||||
}
|
||||
|
||||
void BluetoothDevicesDialog::on_buttonBox_clicked(QAbstractButton *button _U_)
|
||||
{
|
||||
/* if (button == foo_button_) */
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines
|
||||
*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* ex: set shiftwidth=4 tabstop=8 expandtab:
|
||||
* :indentSize=4:tabSize=8:noTabs=true:
|
||||
*/
|
|
@ -0,0 +1,105 @@
|
|||
/* bluetooth_devices_dialog.h
|
||||
*
|
||||
* Wireshark - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@wireshark.org>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef BLUETOOTH_DEVICES_DIALOG_H
|
||||
#define BLUETOOTH_DEVICES_DIALOG_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "wireshark_dialog.h"
|
||||
#include "cfile.h"
|
||||
|
||||
#include "epan/tap.h"
|
||||
|
||||
#include <QMenu>
|
||||
|
||||
class QAbstractButton;
|
||||
class QPushButton;
|
||||
class QTreeWidgetItem;
|
||||
|
||||
typedef struct _bluetooth_devices_tapinfo_t {
|
||||
tap_reset_cb tap_reset;
|
||||
tap_packet_cb tap_packet;
|
||||
void *ui;
|
||||
} bluetooth_devices_tapinfo_t;
|
||||
|
||||
namespace Ui {
|
||||
class BluetoothDevicesDialog;
|
||||
}
|
||||
|
||||
class BluetoothDevicesDialog : public WiresharkDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit BluetoothDevicesDialog(QWidget &parent, CaptureFile &cf);
|
||||
~BluetoothDevicesDialog();
|
||||
|
||||
public slots:
|
||||
|
||||
signals:
|
||||
void updateFilter(QString &filter, bool force = false);
|
||||
void captureFileChanged(capture_file *cf);
|
||||
void goToPacket(int packet_num);
|
||||
|
||||
protected:
|
||||
|
||||
protected slots:
|
||||
void changeEvent(QEvent* event);
|
||||
|
||||
private:
|
||||
Ui::BluetoothDevicesDialog *ui;
|
||||
|
||||
bluetooth_devices_tapinfo_t tapinfo_;
|
||||
QMenu context_menu_;
|
||||
|
||||
static void tapReset(void *tapinfo_ptr);
|
||||
static gboolean tapPacket(void *tapinfo_ptr, packet_info *pinfo, epan_dissect_t *, const void *data);
|
||||
|
||||
private slots:
|
||||
void captureFileClosing();
|
||||
void on_tableTreeWidget_itemActivated(QTreeWidgetItem *item, int);
|
||||
void on_buttonBox_clicked(QAbstractButton *button);
|
||||
void on_actionCopy_Cell_triggered();
|
||||
void on_actionCopy_Rows_triggered();
|
||||
void on_actionCopy_All_triggered();
|
||||
void on_actionSave_as_image_triggered();
|
||||
void tableContextMenu(const QPoint &pos);
|
||||
void interfaceCurrentIndexChanged(int index);
|
||||
void showInformationStepsChanged(int state);
|
||||
};
|
||||
|
||||
#endif // BLUETOOTH_DEVICES_DIALOG_H
|
||||
|
||||
/*
|
||||
* Editor modelines
|
||||
*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 8
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*
|
||||
* ex: set shiftwidth=4 tabstop=8 expandtab:
|
||||
* :indentSize=4:tabSize=8:noTabs=true:
|
||||
*/
|
|
@ -0,0 +1,210 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BluetoothDevicesDialog</class>
|
||||
<widget class="QDialog" name="BluetoothDevicesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>880</width>
|
||||
<height>477</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="baseSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Bluetooth Devices</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="tableTreeWidget">
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::CustomContextMenu</enum>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||
</property>
|
||||
<property name="textElideMode">
|
||||
<enum>Qt::ElideMiddle</enum>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="itemsExpandable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="headerCascadingSectionResizes">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="headerHighlightSections">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="headerShowSortIndicator" stdset="0">
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>BD_ADDR</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>OUI</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>LMP Version</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>LMP Subversion</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Manufacturer</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>HCI Version</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>HCI Revision</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Is Local Adapter</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0">
|
||||
<property name="spacing">
|
||||
<number>-1</number>
|
||||
</property>
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetDefaultConstraint</enum>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QComboBox" name="interfaceComboBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>350</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>All Interfaces</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="showInformationStepsCheckBox">
|
||||
<property name="text">
|
||||
<string>Show information steps</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<action name="actionCopy_Cell">
|
||||
<property name="text">
|
||||
<string>Copy Cell</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCopy_Rows">
|
||||
<property name="text">
|
||||
<string>Copy Rows</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCopy_All">
|
||||
<property name="text">
|
||||
<string>Copy All</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSave_as_image">
|
||||
<property name="text">
|
||||
<string>Save as image</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>BluetoothDevicesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>374</x>
|
||||
<y>407</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>374</x>
|
||||
<y>214</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>BluetoothDevicesDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>374</x>
|
||||
<y>407</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>374</x>
|
||||
<y>214</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
|
@ -485,6 +485,7 @@ private slots:
|
|||
void on_actionTelephonySipFlows_triggered();
|
||||
|
||||
void on_actionATT_Server_Attributes_triggered();
|
||||
void on_actionDevices_triggered();
|
||||
|
||||
void externalMenuItem_triggered();
|
||||
|
||||
|
|
|
@ -528,6 +528,7 @@
|
|||
<string>&Bluetooth</string>
|
||||
</property>
|
||||
<addaction name="actionATT_Server_Attributes"/>
|
||||
<addaction name="actionDevices"/>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuEdit"/>
|
||||
|
@ -2290,6 +2291,11 @@
|
|||
<string>Devices</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDevices">
|
||||
<property name="text">
|
||||
<string>Devices</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionServices">
|
||||
<property name="text">
|
||||
<string>Services</string>
|
||||
|
|
|
@ -75,6 +75,7 @@
|
|||
|
||||
#include "about_dialog.h"
|
||||
#include "bluetooth_att_server_attributes_dialog.h"
|
||||
#include "bluetooth_devices_dialog.h"
|
||||
#include "capture_file_dialog.h"
|
||||
#include "capture_file_properties_dialog.h"
|
||||
#include "coloring_rules_dialog.h"
|
||||
|
@ -2805,6 +2806,16 @@ void MainWindow::on_actionATT_Server_Attributes_triggered()
|
|||
bluetooth_att_sever_attributes_dialog->show();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionDevices_triggered()
|
||||
{
|
||||
BluetoothDevicesDialog *bluetooth_devices_dialog = new BluetoothDevicesDialog(*this, capture_file_);
|
||||
connect(bluetooth_devices_dialog, SIGNAL(goToPacket(int)),
|
||||
packet_list_, SLOT(goToPacket(int)));
|
||||
connect(bluetooth_devices_dialog, SIGNAL(updateFilter(QString&, bool)),
|
||||
this, SLOT(filterPackets(QString&, bool)));
|
||||
bluetooth_devices_dialog->show();
|
||||
}
|
||||
|
||||
// Help Menu
|
||||
void MainWindow::on_actionHelpContents_triggered() {
|
||||
|
||||
|
|
Loading…
Reference in New Issue