Enhance Bluetooth LE commands parsing

This patch adds parsing to some missing LE commands
Change-Id: Ia22197a7855505e96021536a333b401a45480145
Reviewed-on: https://code.wireshark.org/review/16995
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Piotr Pawłowski 2016-08-10 20:31:05 +02:00 committed by Anders Broman
parent 91abbb3dd8
commit ba71ac07cc
1 changed files with 171 additions and 6 deletions

View File

@ -342,6 +342,16 @@ static int hf_response_in_frame = -1;
static int hf_command_response_time_delta = -1;
static int hf_pending_in_frame = -1;
static int hf_command_pending_time_delta = -1;
static int hf_bthci_cmd_le_tx_octets = -1;
static int hf_bthci_cmd_le_tx_time = -1;
static int hf_bthci_cmd_le_suggested_max_tx_octets = -1;
static int hf_bthci_cmd_le_suggested_max_tx_time = -1;
static int hf_bthci_cmd_le_remote_p_256_public_key = -1;
static int hf_bthci_cmd_le_peer_irk = -1;
static int hf_bthci_cmd_le_local_irk = -1;
static int hf_bthci_cmd_le_address_resolution_enable = -1;
static int hf_bthci_cmd_le_rpa_timeout = -1;
static const int *hfx_bthci_cmd_le_event_mask[] = {
&hf_bthci_cmd_le_event_mask_le_reserved,
@ -1265,12 +1275,18 @@ const value_string bthci_cmd_oob_data_present_vals[] = {
};
static const value_string bthci_cmd_auth_req_vals[] = {
{0x00, "MITM Protection Not Required - No Bonding. Numeric Comparison, Automatic Accept Allowed" },
{0x01, "MITM Protection Required - No Bonding. Use IO Capabilty To Determine Procedure" },
{0x02, "MITM Protection Not Required - Dedicated Bonding. Numeric Comparison, Automatic Accept Allowed" },
{0x03, "MITM Protection Required - Dedicated Bonding. Use IO Capabilty To Determine Procedure" },
{0x04, "MITM Protection Not Required - General Bonding. Numeric Comparison, Automatic Accept Allowed" },
{0x05, "MITM Protection Required - General Bonding. Use IO Capabilty To Determine Procedure" },
{0x00, "MITM Protection Not Required - No Bonding. Numeric Comparison, Automatic Accept Allowed, No Secure Connection" },
{0x01, "MITM Protection Required - No Bonding. Use IO Capabilty To Determine Procedure, No Secure Connection" },
{0x02, "MITM Protection Not Required - Dedicated Bonding. Numeric Comparison, Automatic Accept Allowed, No Secure Connection" },
{0x03, "MITM Protection Required - Dedicated Bonding. Use IO Capabilty To Determine Procedure, No Secure Connection" },
{0x04, "MITM Protection Not Required - General Bonding. Numeric Comparison, Automatic Accept Allowed, No Secure Connection" },
{0x05, "MITM Protection Required - General Bonding. Use IO Capabilty To Determine Procedure, No Secure Connection" },
{0x08, "MITM Protection Not Required - No Bonding. Numeric Comparison, Automatic Accept Allowed, Secure Connection" },
{0x09, "MITM Protection Required - No Bonding. Use IO Capabilty To Determine Procedure, Secure Connection" },
{0x0A, "MITM Protection Not Required - Dedicated Bonding. Numeric Comparison, Automatic Accept Allowed, Secure Connection" },
{0x0B, "MITM Protection Required - Dedicated Bonding. Use IO Capabilty To Determine Procedure, Secure Connection " },
{0x0C, "MITM Protection Not Required - General Bonding. Numeric Comparison, Automatic Accept Allowed, Secure Connection" },
{0x0D, "MITM Protection Required - General Bonding. Use IO Capabilty To Determine Procedure, Secure Connection" },
{ 0, NULL }
};
value_string_ext bthci_cmd_auth_req_vals_ext = VALUE_STRING_EXT_INIT(bthci_cmd_auth_req_vals);
@ -1574,6 +1590,12 @@ static const value_string cmd_le_test_pkt_payload[] = {
{ 0, NULL }
};
static const value_string cmd_le_address_resolution_enable[] = {
{ 0x00, "Address Resolution in controller disabled (default)" },
{ 0x01, "Address Resolution in controller enabled" },
{ 0, NULL }
};
static const value_string le_role_vals[] = {
{ 0x00, "Only Peripheral Role Supported" },
{ 0x01, "Only Central Role Supported" },
@ -3216,6 +3238,98 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
proto_tree_add_item(tree, hf_bthci_cmd_test_packet_payload, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset++;
break;
case 0x0020: /*LE Remote Connection Parameter Request Reply */
proto_tree_add_item(tree, hf_bthci_cmd_connection_handle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_cmd_le_con_interval_min, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*1.25);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_cmd_le_con_interval_max, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*1.25);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_cmd_le_con_latency, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (number events)");
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;
item = proto_tree_add_item(tree, hf_bthci_cmd_le_min_ce_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset+=2;
item = proto_tree_add_item(tree, hf_bthci_cmd_le_max_ce_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_item_append_text(item, " (%g msec)", tvb_get_letohs(tvb, offset)*0.625);
offset+=2;
break;
case 0x0021: /* LE Remote Connection Parameter Request Negative Reply */
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_reason, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset++;
break;
case 0x0022: /* LE Set Data Length */
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_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));
offset+=2;
break;
case 0x0024: /* LE Write Suggested Default Data Length */
proto_tree_add_item(tree, hf_bthci_cmd_le_suggested_max_tx_octets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset+=2;
proto_tree_add_item(tree, hf_bthci_cmd_le_suggested_max_tx_time, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset+=2;
break;
case 0x0026: /* LE Generate DHKey */
proto_tree_add_item(tree, hf_bthci_cmd_le_remote_p_256_public_key, tvb, offset, 64, ENC_NA);
offset+=64;
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);
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);
offset+=16;
proto_tree_add_item(tree, hf_bthci_cmd_le_local_irk, tvb, offset, 16, ENC_NA);
offset+=16;
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);
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);
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);
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 0x002D: /* Set Address Resolution Enable */
proto_tree_add_item(tree, hf_bthci_cmd_le_address_resolution_enable, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset++;
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));
offset+=2;
break;
case 0x002: /* LE Read Buffer Size */
case 0x003: /* LE Read Local Supported Features */
case 0x007: /* LE Read Advertising Channel Tx Power */
@ -3225,6 +3339,12 @@ dissect_le_cmd(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
case 0x018: /* LE Rand */
case 0x01C: /* LE Read Supported States */
case 0x01F: /* LE Test End */
case 0x023: /* LE Read Suggested Default Data Length */
case 0x025: /* LE Read Local P-256 Public Key */
case 0x029: /* LE Clear Resolving List */
case 0x02A: /* LE Read Resolving List Size */
case 0x02F: /* LE Read Maximum Data Length */
/* NOTE: No parameters */
break;
@ -4976,6 +5096,51 @@ proto_register_bthci_cmd(void)
FT_DOUBLE, BASE_NONE, NULL, 0x00,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_tx_octets,
{ "TxOctets", "bthci_cmd.le_tx_octets",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_tx_time,
{ "TxTime", "bthci_cmd.le_tx_time",
FT_UINT16, BASE_HEX, NULL, 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,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_suggested_max_tx_time,
{ "SuggestedMaxTxTime", "bthci_cmd.le_suggested_max_tx_time",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_remote_p_256_public_key,
{ "Remote_P-256_Public_Key", "bthci_cmd.le_remote_p_256_public_key",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_peer_irk,
{ "Peer IRK", "bthci_cmd.le_peer_irk",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_local_irk,
{ "Local IRK", "bthci_cmd.le_local_irk",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_address_resolution_enable,
{ "Address Resolution Enable", "bthci_cmd.le_address_resolution_enable",
FT_UINT8, BASE_HEX, VALS(cmd_le_address_resolution_enable), 0x0,
NULL, HFILL }
},
{ &hf_bthci_cmd_le_rpa_timeout,
{ "RPA Timeout", "bthci_cmd.le_rpa_timeout",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
};
static ei_register_info ei[] = {