From: Allan Møller Madsen Date: Sat, 16 Jun 2018 13:50:55 +0000 (+0200) Subject: Bluetooth HCI update X-Git-Url: http://git.samba.org/?p=metze%2Fwireshark%2Fwip.git;a=commitdiff_plain;h=5f67f274243ff30c43680a2ab697865048aff356 Bluetooth HCI update Add dissection of commands: - LE Periodic Advertising Create Sync - LE Periodic Advertising Terminate Sync - LE Add Device To Periodic Advertiser List - LE Remove Device From Periodic Advertiser List - LE Write RF Path Compensation - LE Set Privacy Mode Add dissection of command complete events: - LE Read Periodic Advertiser List Size - LE Read Transmit Power - LE Read RF Path Compensation Misc: - Corrected identity address type decoding in privacy related commands - Corrected PHY decoding in LE Set Ext Scan Parameter and LE Ext Create Connection commands - Added decoding of missing LE scan filter policy values - Units added for time parameters where missing Change-Id: I8d3fa4571f511df2e128877078609c8d112821dd Signed-off-by: Allan Møller Madsen Reviewed-on: https://code.wireshark.org/review/28302 Petri-Dish: Anders Broman Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- diff --git a/epan/dissectors/packet-bthci_cmd.c b/epan/dissectors/packet-bthci_cmd.c index 975b8de375..3d4affb297 100644 --- a/epan/dissectors/packet-bthci_cmd.c +++ b/epan/dissectors/packet-bthci_cmd.c @@ -324,6 +324,7 @@ static int hf_bthci_cmd_le_scan_window = -1; static int hf_bthci_cmd_le_scan_filter_policy = -1; static int hf_bthci_cmd_le_initiator_filter_policy = -1; static int hf_bthci_cmd_le_peer_address_type = -1; +static int hf_bthci_cmd_le_peer_identity_address_type = -1; static int hf_bthci_cmd_le_con_interval_min = -1; static int hf_bthci_cmd_le_con_interval_max = -1; static int hf_bthci_cmd_le_con_latency = -1; @@ -408,6 +409,12 @@ static int hf_bthci_cmd_le_phys_le_coded = -1; static int hf_bthci_cmd_le_phys_le_2m = -1; static int hf_bthci_cmd_le_phys_le_1m = -1; static int hf_bthci_cmd_le_init_phy_param = -1; +static int hf_bthci_cmd_le_privacy_mode = -1; +static int hf_bthci_cmd_sync_filter_policy = -1; +static int hf_bthci_cmd_skip = -1; +static int hf_bthci_cmd_rf_tx_path_compensation_value = -1; +static int hf_bthci_cmd_rf_rx_path_compensation_value = -1; +static int hf_bthci_cmd_sync_handle = -1; static int hf_bthci_cmd_triggered_clock_capture = -1; static int hf_bthci_cmd_lpo_allowed = -1; static int hf_bthci_cmd_number_of_clock_captures_to_filter = -1; @@ -1784,6 +1791,12 @@ const value_string bthci_cmd_address_types_vals[] = { { 0, NULL } }; +const value_string bthci_cmd_identity_address_types_vals[] = { + { 0x00, "Public Identity Address" }, + { 0x01, "Random (Static) Identity Address" }, + { 0, NULL } +}; + static const value_string cmd_role_vals[] = { {0x00, "Change own Role to Master for this BD_ADDR"}, {0x01, "Change own Role to Slave for this BD_ADDR"}, @@ -2060,8 +2073,10 @@ static const value_string cmd_le_scan_types[] = { }; static const value_string cmd_le_scan_filter_policy[] = { - { 0x00, "Accept all advertisements. Ignore directed advertisements not addressed to this device" }, - { 0x01, "Ignore advertisements from devices not in the white list only. Ignore directed advertisements not addressed to this device" }, + { 0x00, "Accept all advertisements, except directed advertisements not addressed to this device" }, + { 0x01, "Accept only advertisments from devices in the White List. Ignore directed advertisements not addressed to this device" }, + { 0x02, "Accept all advertisments, except directed advertisements not addressed to this device (but accept those with resolvable addresses that can not be resolved)" }, + { 0x03, "Accept only advertisments from devices in the White List. Ignore directed advertisements not addressed to this device (but accept those with resolvable addresses that can not be resolved)" }, { 0, NULL } }; @@ -2071,6 +2086,18 @@ static const value_string cmd_init_filter_policy[] = { { 0, NULL } }; +static const value_string cmd_sync_filter_policy[] = { + { 0x00, "Use Peer Address" }, + { 0x01, "Use Periodic Advertiser List. Ignore Peer Address" }, + { 0, NULL } +}; + +static const value_string cmd_privacy_mode[] = { + { 0x00, "Use Network Privacy Mode" }, + { 0x01, "Use Device Privacy Mode" }, + { 0, NULL } +}; + static const value_string cmd_le_test_pkt_payload[] = { { 0x00, "Pseudo-Random Sequence 9" }, { 0x01, "Pattern Of Alternating Bits '11110000'" }, @@ -3853,7 +3880,8 @@ dissect_host_controller_baseband_cmd(tvbuff_t *tvb, int offset, packet_info *pin proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; - proto_tree_add_item(tree, hf_bthci_cmd_authenticated_payload_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); + item = proto_tree_add_item(tree, hf_bthci_cmd_authenticated_payload_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g sec)", tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) * 0.01); offset += 2; break; @@ -4277,8 +4305,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, offset+=2; proto_tree_add_item(tree, hf_bthci_cmd_le_tx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset+=2; - sub_item = proto_tree_add_item(tree, hf_bthci_cmd_le_tx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN); - proto_item_append_text(sub_item, " (%d usec)", tvb_get_letohs(tvb, offset)); + proto_tree_add_item(tree, hf_bthci_cmd_le_tx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset+=2; break; @@ -4295,7 +4322,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, break; case 0x0027: /* LE Add Device to Resolving List */ - proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_identity_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; 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_peer_irk, tvb, offset, 16, ENC_NA); @@ -4305,19 +4332,19 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, break; case 0x0028: /* LE Remove Device From Resolving List */ - proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_identity_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; 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 0x002B: /* LE Read Peer Resolvable Address */ - proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_identity_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; 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 0x002C: /* LE Read Local Resolvable Address" */ - proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_identity_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; offset = dissect_bd_addr(hf_bthci_cmd_bd_addr, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL); break; @@ -4328,8 +4355,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, break; case 0x002E: /* LE Set Resolvable Private Address Timeout */ - item = proto_tree_add_item(tree, hf_bthci_cmd_le_rpa_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); - proto_item_append_text(item, " (%d sec)", tvb_get_letohs(tvb, offset)); + proto_tree_add_item(tree, hf_bthci_cmd_le_rpa_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset+=2; break; @@ -4517,17 +4543,19 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, case 0x0041: /* LE Set Extended Scan Parameters */ { + guint8 scanning_phys, phy = 0; proto_tree_add_item(tree, hf_bthci_cmd_le_own_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; proto_tree_add_item(tree, hf_bthci_cmd_le_scan_filter_policy, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; - guint8 scanning_phys = tvb_get_guint8(tvb, offset); + scanning_phys = tvb_get_guint8(tvb, offset); proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_scan_phys, ett_scan_init_phy_param, hfx_btcmd_le_scan_phys, ENC_NA); offset += 1; for (int i = 1; i < 0x08; i <<=1) { + phy++; if (scanning_phys & i) { sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_le_scan_phy_param, tvb, offset, 5, "Scanning PHY: %s", - val_to_str_const(i, cmd_le_phy_vals, "Unknown")); + val_to_str_const(phy, cmd_le_phy_vals, "Unknown")); sub_tree = proto_item_add_subtree(sub_item, ett_scan_init_phy_param); proto_tree_add_item(sub_tree, hf_bthci_cmd_le_scan_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; @@ -4557,6 +4585,7 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, case 0x0043: /* LE Extended Create Connection */ { + guint8 initiating_phys, phy = 0; proto_tree_add_item(tree, hf_bthci_cmd_le_initiator_filter_policy, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset++; proto_tree_add_item(tree, hf_bthci_cmd_le_own_address_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -4564,13 +4593,14 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, 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, pinfo, tree, tvb, offset, FALSE, bluetooth_data->interface_id, bluetooth_data->adapter_id, NULL); - guint8 initiating_phys = tvb_get_guint8(tvb, offset); + initiating_phys = tvb_get_guint8(tvb, offset); proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_init_phys, ett_scan_init_phy_param, hfx_btcmd_le_phys, ENC_NA); offset += 1; for (int i = 1; i < 0x08; i <<=1) { + phy++; if (initiating_phys & i) { sub_item = proto_tree_add_none_format(tree, hf_bthci_cmd_le_init_phy_param, tvb, offset, 16, "Initiating PHY: %s", - val_to_str_const(i, cmd_le_phy_vals, "Unknown")); + val_to_str_const(phy, cmd_le_phy_vals, "Unknown")); sub_tree = proto_item_add_subtree(sub_item, ett_scan_init_phy_param); item = proto_tree_add_item(sub_tree, hf_bthci_cmd_le_scan_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN); proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*0.625); @@ -4601,6 +4631,54 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, } break; + case 0x0044: /* LE Periodic Advertising Create Sync */ + proto_tree_add_item(tree, hf_bthci_cmd_sync_filter_policy, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_advertising_sid, tvb, offset, 1, ENC_NA); + offset++; + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_NA); + offset++; + 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_skip, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + item = proto_tree_add_item(tree, hf_bthci_cmd_le_supervision_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g sec)", tvb_get_letohs(tvb, offset)*0.01); + offset+=2; + /* 1 octet unused/RFU */ + offset++; + break; + + case 0x0046: /* LE Periodic Advertising Terminate Sync */ + proto_tree_add_item(tree, hf_bthci_cmd_sync_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset+=2; + break; + + case 0x0047: /* LE Add Device To Periodic Advertiser List */ + case 0x0048: /* LE Remove Device From Periodic Advertiser List */ + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_address_type, tvb, offset, 1, ENC_NA); + offset++; + 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_advertising_sid, tvb, offset, 1, ENC_NA); + offset++; + break; + + case 0x004D: /* LE Write RF Path Compensation */ + item = proto_tree_add_item(tree, hf_bthci_cmd_rf_tx_path_compensation_value, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g dB)", tvb_get_letohis(tvb, offset)*0.1); + offset+=2; + item = proto_tree_add_item(tree, hf_bthci_cmd_rf_rx_path_compensation_value, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g dB)", tvb_get_letohis(tvb, offset)*0.1); + offset+=2; + break; + + case 0x004E: /* LE Set Privacy Mode */ + proto_tree_add_item(tree, hf_bthci_cmd_le_peer_identity_address_type, tvb, offset, 1, ENC_NA); + offset++; + 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_privacy_mode, tvb, offset, 1, ENC_NA); + offset++; + break; + case 0x002: /* LE Read Buffer Size */ case 0x003: /* LE Read Local Supported Features */ case 0x007: /* LE Read Advertising Channel Tx Power */ @@ -6273,6 +6351,11 @@ proto_register_bthci_cmd(void) FT_UINT8, BASE_HEX, VALS(bthci_cmd_address_types_vals), 0x0, NULL, HFILL } }, + { &hf_bthci_cmd_le_peer_identity_address_type, + { "Peer Identity Address Type", "bthci_cmd.le_peer_identity_address_type", + FT_UINT8, BASE_HEX, VALS(bthci_cmd_identity_address_types_vals), 0x0, + NULL, HFILL } + }, { &hf_bthci_cmd_le_direct_address_type, { "Direct Address Type", "bthci_cmd.le_direct_address_type", FT_UINT8, BASE_HEX, VALS(bthci_cmd_address_types_vals), 0x0, @@ -6405,12 +6488,12 @@ proto_register_bthci_cmd(void) }, { &hf_bthci_cmd_rx_frequency, { "Rx Frequency", "bthci_cmd.rx_frequency", - FT_UINT8, BASE_HEX, NULL, 0x0, + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_tx_frequency, { "Tx Frequency", "bthci_cmd.tx_frequency", - FT_UINT8, BASE_HEX, NULL, 0x0, + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_test_data_length, @@ -6450,22 +6533,22 @@ proto_register_bthci_cmd(void) }, { &hf_bthci_cmd_le_tx_octets, { "TxOctets", "bthci_cmd.le_tx_octets", - FT_UINT16, BASE_HEX, NULL, 0x0, + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_le_tx_time, { "TxTime", "bthci_cmd.le_tx_time", - FT_UINT16, BASE_HEX, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_le_suggested_max_tx_octets, { "SuggestedMaxTxOctets", "bthci_cmd.le_suggested_max_tx_octets", - FT_UINT16, BASE_HEX, NULL, 0x0, + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_le_suggested_max_tx_time, { "SuggestedMaxTxTime", "bthci_cmd.le_suggested_max_tx_time", - FT_UINT16, BASE_HEX, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_le_remote_p_256_public_key, @@ -6490,7 +6573,7 @@ proto_register_bthci_cmd(void) }, { &hf_bthci_cmd_le_rpa_timeout, { "RPA Timeout", "bthci_cmd.le_rpa_timeout", - FT_UINT16, BASE_HEX, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_second_seconds, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_advertising_handle, @@ -6570,7 +6653,7 @@ proto_register_bthci_cmd(void) }, { &hf_bthci_cmd_sec_adv_max_skip, { "Secondary Advertising Max Skip", "bthci_cmd.secondary_advertising_max_skip", - FT_UINT8, BASE_HEX, NULL, 0x0, + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_bthci_cmd_secondary_advertising_phy, @@ -6758,6 +6841,36 @@ proto_register_bthci_cmd(void) FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + { &hf_bthci_cmd_le_privacy_mode, + { "Privacy Mode", "bthci_cmd.le_privacy_mode", + FT_UINT8, BASE_HEX, VALS(cmd_privacy_mode), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_sync_filter_policy, + { "Filter Policy", "bthci_cmd.le_sync_filter_policy", + FT_UINT8, BASE_HEX, VALS(cmd_sync_filter_policy), 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_skip, + { "Skip", "bthci_cmd.skip", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_sync_handle, + { "Sync Handle", "bthci_cmd.sync_handle", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_rf_tx_path_compensation_value, + { "RF Tx Path Compensation Value", "bthci_cmd.rf_tx_path_compensation_value", + FT_INT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_cmd_rf_rx_path_compensation_value, + { "RF Rx Path Compensation Value", "bthci_cmd.rf_rx_path_compensation_value", + FT_INT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, { &hf_bthci_cmd_triggered_clock_capture, { "Triggered Clock Capture", "bthci_cmd.triggered_clock_capture", FT_UINT8, BASE_HEX, VALS(disable_enable_vals), 0x0, diff --git a/epan/dissectors/packet-bthci_evt.c b/epan/dissectors/packet-bthci_evt.c index 83486a3c88..637be80f7d 100644 --- a/epan/dissectors/packet-bthci_evt.c +++ b/epan/dissectors/packet-bthci_evt.c @@ -474,6 +474,11 @@ static int hf_bthci_evt_num_compl_ext_advertising_events = -1; static int hf_bthci_evt_channel_selection_algorithm = -1; static int hf_bthci_evt_advertiser_clock_accuracy = -1; static int hf_bthci_evt_advertiser_phy = -1; +static int hf_bthci_evt_periodic_adv_list_size = -1; +static int hf_bthci_evt_min_tx_power = -1; +static int hf_bthci_evt_max_tx_power = -1; +static int hf_bthci_evt_rf_tx_path_compensation = -1; +static int hf_bthci_evt_rf_rx_path_compensation = -1; static int hf_bthci_evt_sync_handle = -1; static int hf_bthci_evt_data_status = -1; static int hf_bthci_evt_advertising_handle = -1; @@ -4746,7 +4751,8 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, proto_tree_add_item(tree, hf_bthci_evt_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; - proto_tree_add_item(tree, hf_bthci_evt_authenticated_payload_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); + item = proto_tree_add_item(tree, hf_bthci_evt_authenticated_payload_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g sec)", tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN) * 0.01); offset += 2; break; @@ -4826,6 +4832,41 @@ dissect_bthci_evt_command_complete(tvbuff_t *tvb, int offset, break; + case 0x204A: /* LE Read Periodic Advertiser List Size */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + + proto_tree_add_item(tree, hf_bthci_evt_periodic_adv_list_size, tvb, offset, 1, ENC_NA); + offset += 1; + + break; + case 0x204B: /* LE Read Transmit Power */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + + proto_tree_add_item(tree, hf_bthci_evt_min_tx_power, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(tree, hf_bthci_evt_max_tx_power, tvb, offset, 1, ENC_NA); + offset += 1; + + break; + case 0x204C: /* LE Read RF Path Compensation */ + proto_tree_add_item(tree, hf_bthci_evt_status, tvb, offset, 1, ENC_NA); + send_hci_summary_status_tap(tvb_get_guint8(tvb, offset), pinfo, bluetooth_data); + offset += 1; + + item = proto_tree_add_item(tree, hf_bthci_evt_rf_tx_path_compensation, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g dB)", tvb_get_letohis(tvb, offset)*0.1); + offset += 2; + + item = proto_tree_add_item(tree, hf_bthci_evt_rf_rx_path_compensation, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_item_append_text(item, " (%g dB)", tvb_get_letohis(tvb, offset)*0.1); + offset += 2; + + break; case 0x0401: /* Inquiry */ case 0x0405: /* Create Connection */ case 0x0406: /* Disconnect */ @@ -7614,7 +7655,7 @@ proto_register_bthci_evt(void) }, { &hf_bthci_evt_le_max_tx_time, { "Max TX Time", "bthci_evt.max_tx_time", - FT_UINT16, BASE_DEC, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, NULL, HFILL } }, { &hf_bthci_evt_le_max_rx_octets, @@ -7624,7 +7665,7 @@ proto_register_bthci_evt(void) }, { &hf_bthci_evt_le_max_rx_time, { "Max RX Time", "bthci_evt.max_rx_time", - FT_UINT16, BASE_DEC, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, NULL, HFILL } }, { &hf_bthci_evt_encrypted_diversifier, @@ -8299,7 +8340,7 @@ proto_register_bthci_evt(void) }, { &hf_bthci_evt_suggested_max_tx_time, { "Suggested Max Tx Time", "bthci_evt.suggested_max_tx_time", - FT_UINT16, BASE_DEC, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, NULL, HFILL } }, { &hf_bthci_evt_suggested_max_rx_octets, @@ -8309,7 +8350,7 @@ proto_register_bthci_evt(void) }, { &hf_bthci_evt_suggested_max_rx_time, { "Suggested Max Rx Time", "bthci_evt.suggested_max_rx_time", - FT_UINT16, BASE_DEC, NULL, 0x0, + FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_microseconds, 0x0, NULL, HFILL } }, { &hf_bthci_evt_resolving_list_size, @@ -8412,6 +8453,31 @@ proto_register_bthci_evt(void) FT_UINT8, BASE_HEX|BASE_EXT_STRING, &bthci_cmd_le_phy_vals_ext, 0x0, NULL, HFILL } }, + { &hf_bthci_evt_periodic_adv_list_size, + { "Periodic Advertiser List Size", "bthci_evt.le_periodic_adv_list_size", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_min_tx_power, + { "Minimum TX Power", "bthci_evt.min_tx_power", + FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_max_tx_power, + { "Maximum TX Power", "bthci_evt.max_tx_power", + FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_rf_tx_path_compensation, + { "RF Tx Path Compensation Value", "bthci_evt.rf_tx_path_compensation_value", + FT_INT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_bthci_evt_rf_rx_path_compensation, + { "RF Rx Path Compensation Value", "bthci_evt.rf_rx_path_compensation_value", + FT_INT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, }; static ei_register_info ei[] = {