btle: Add support for CTE Info field in Data Physical Channel PDUs

Add support for the optional CTE Info field in the Data Physical Channel
PDU header.

Signed-off-by: Joakim Andersson <joakim.andersson@nordicsemi.no>
This commit is contained in:
Joakim Andersson 2021-08-27 16:41:15 +02:00 committed by Wireshark GitLab Utility
parent 994bf73f46
commit 5c46e0eac3
1 changed files with 60 additions and 8 deletions

View File

@ -71,7 +71,7 @@ static int hf_extended_advertising_mode = -1;
static int hf_extended_advertising_flags = -1;
static int hf_extended_advertising_flags_adva = -1;
static int hf_extended_advertising_flags_targeta = -1;
static int hf_extended_advertising_flags_cteinfo = -1;
static int hf_extended_advertising_flags_cte_info = -1;
static int hf_extended_advertising_flags_advdatainfo = -1;
static int hf_extended_advertising_flags_aux_ptr = -1;
static int hf_extended_advertising_flags_sync_info = -1;
@ -111,6 +111,7 @@ static int hf_data_header_llid = -1;
static int hf_data_header_llid_connectediso = -1;
static int hf_data_header_llid_broadcastiso = -1;
static int hf_data_header_more_data = -1;
static int hf_data_header_cte_info_present = -1;
static int hf_data_header_sequence_number = -1;
static int hf_data_header_next_expected_sequence_number = -1;
static int hf_data_header_rfu_57 = -1;
@ -119,6 +120,10 @@ static int hf_data_header_close_isochronous_event = -1;
static int hf_data_header_null_pdu_indicator = -1;
static int hf_data_header_control_subevent_sequence_number = -1;
static int hf_data_header_control_subevent_transmission_flag = -1;
static int hf_data_header_cte_info = -1;
static int hf_data_header_cte_info_time = -1;
static int hf_data_header_cte_info_rfu = -1;
static int hf_data_header_cte_info_type = -1;
static int hf_control_opcode = -1;
static int hf_l2cap_index = -1;
static int hf_l2cap_fragment = -1;
@ -291,6 +296,7 @@ static gint ett_btle = -1;
static gint ett_advertising_header = -1;
static gint ett_link_layer_data = -1;
static gint ett_data_header = -1;
static gint ett_data_header_cte_info = -1;
static gint ett_features = -1;
static gint ett_tx_phys = -1;
static gint ett_rx_phys = -1;
@ -317,7 +323,7 @@ static gint ett_extended_advertising_acad = -1;
static int * const hfx_extended_advertising_flags[] = {
&hf_extended_advertising_flags_adva,
&hf_extended_advertising_flags_targeta,
&hf_extended_advertising_flags_cteinfo,
&hf_extended_advertising_flags_cte_info,
&hf_extended_advertising_flags_advdatainfo,
&hf_extended_advertising_flags_aux_ptr,
&hf_extended_advertising_flags_sync_info,
@ -2310,6 +2316,7 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
gboolean add_l2cap_index = FALSE;
gboolean retransmit = FALSE;
gboolean cte_info_present = FALSE;
/* Holds the last initiated control procedures for a given direction. */
control_proc_info_t *last_control_proc[3] = {0};
@ -2446,7 +2453,12 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
if (btle_frame_info == NULL) {
btle_frame_info = &empty_btle_frame_info;
}
data_header_item = proto_tree_add_item(btle_tree, hf_data_header, tvb, offset, 2, ENC_LITTLE_ENDIAN);
if (btle_pdu_type == BTLE_PDU_TYPE_DATA) {
cte_info_present = (oct & 0x20) != 0;
}
data_header_item = proto_tree_add_item(btle_tree, hf_data_header, tvb, offset, 2 + cte_info_present, ENC_NA);
data_header_tree = proto_item_add_subtree(data_header_item, ett_data_header);
proto_tree_add_item(data_header_tree, (btle_pdu_type == BTLE_PDU_TYPE_CONNECTEDISO) ? hf_data_header_llid_connectediso :hf_data_header_llid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@ -2478,7 +2490,7 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
}
}
llid = tvb_get_guint8(tvb, offset) & 0x03;
llid = oct & 0x03;
if (btle_pdu_type == BTLE_PDU_TYPE_CONNECTEDISO) {
proto_tree_add_item(data_header_tree, hf_data_header_close_isochronous_event, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(data_header_tree, hf_data_header_null_pdu_indicator, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@ -2486,6 +2498,7 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
llid |= 0x04;
} else {
proto_tree_add_item(data_header_tree, hf_data_header_more_data, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(data_header_tree, hf_data_header_cte_info_present, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(data_header_tree, hf_data_header_rfu, tvb, offset, 1, ENC_LITTLE_ENDIAN);
}
offset += 1;
@ -2495,6 +2508,19 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
proto_item_set_hidden(item);
offset += 1;
if (cte_info_present) {
guint32 cte_time;
sub_item = proto_tree_add_item(data_header_tree, hf_data_header_cte_info, tvb, offset, 1, ENC_NA);
sub_tree = proto_item_add_subtree(sub_item, ett_data_header_cte_info);
item = proto_tree_add_item_ret_uint(sub_tree, hf_data_header_cte_info_time, tvb, offset, 1, ENC_LITTLE_ENDIAN, &cte_time);
proto_item_append_text(item, " (%u usec)", cte_time * 8);
proto_tree_add_item(sub_tree, hf_data_header_cte_info_rfu, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(sub_tree, hf_data_header_cte_info_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
switch (llid) {
case 0x01: /* Continuation fragment of an L2CAP message, or an Empty PDU */
if (length > 0) {
@ -3740,7 +3766,7 @@ dissect_btle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
copy_address_shallow(&pinfo->dl_dst, &pinfo->net_dst);
copy_address_shallow(&pinfo->dst, &pinfo->net_dst);
data_header_item = proto_tree_add_item(btle_tree, hf_data_header, tvb, offset, 2, ENC_LITTLE_ENDIAN);
data_header_item = proto_tree_add_item(btle_tree, hf_data_header, tvb, offset, 2, ENC_NA);
data_header_tree = proto_item_add_subtree(data_header_item, ett_data_header);
proto_tree_add_item(data_header_tree, hf_data_header_llid_broadcastiso, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@ -4026,7 +4052,7 @@ proto_register_btle(void)
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
},
{ &hf_extended_advertising_flags_cteinfo,
{ &hf_extended_advertising_flags_cte_info,
{ "CTE Info", "btle.extended_advertising_header.flags.cte_info",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
NULL, HFILL }
@ -4193,7 +4219,7 @@ proto_register_btle(void)
},
{ &hf_data_header,
{ "Data Header", "btle.data_header",
FT_UINT16, BASE_HEX, NULL, 0x0,
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_data_header_llid,
@ -4226,14 +4252,39 @@ proto_register_btle(void)
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }
},
{ &hf_data_header_cte_info_present,
{ "CTE Info", "btle.data_header.cte_info_present",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
NULL, HFILL }
},
{ &hf_data_header_length,
{ "Length", "btle.data_header.length",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_data_header_cte_info,
{ "CTE Info", "btle.data_header.cte_info",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_data_header_cte_info_time,
{ "CTE Time", "btle.data_header.cte_info.time",
FT_UINT8, BASE_HEX, NULL, 0x1F,
NULL, HFILL }
},
{ &hf_data_header_cte_info_rfu,
{ "RFU", "btle.data_header.cte_info.rfu",
FT_UINT8, BASE_HEX, NULL, 0x20,
NULL, HFILL }
},
{ &hf_data_header_cte_info_type,
{ "CTE Type", "btle.data_header.cte_info.type",
FT_UINT8, BASE_HEX, VALS(le_cte_type_vals), 0xC0,
NULL, HFILL }
},
{ &hf_data_header_rfu,
{ "RFU", "btle.data_header.rfu",
FT_UINT8, BASE_DEC, NULL, 0xE0,
FT_UINT8, BASE_DEC, NULL, 0xC0,
"Reserved for Future Use", HFILL }
},
{ &hf_data_header_rfu_67,
@ -5142,6 +5193,7 @@ proto_register_btle(void)
&ett_extended_advertising_sync_info,
&ett_extended_advertising_acad,
&ett_data_header,
&ett_data_header_cte_info,
&ett_features,
&ett_tx_phys,
&ett_rx_phys,