btmesh: More information displayed

In some cases the available information on packets were not displayed.
This change displays this information. Some code formatting and
variable renaming was also done.
This commit is contained in:
Piotr Winiarczyk 2022-05-09 09:08:03 +02:00 committed by A Wireshark GitLab Utility
parent fdf55aaa51
commit d5a0d390e8
2 changed files with 114 additions and 112 deletions

View File

@ -227,7 +227,7 @@ dissect_btmesh_proxy_configuration_msg(tvbuff_t *tvb, packet_info *pinfo, proto_
decry_off += 1;
/* Parameters */
switch(opcode) {
switch (opcode) {
case PROXY_SET_FILTER_TYPE:
proto_tree_add_item_ret_uint(cntrl_sub_tree, hf_btmesh_proxy_control_filter_type, de_cry_tvb, decry_off, 1, ENC_BIG_ENDIAN, &filter_type);
if (filter_type > 1) {
@ -297,9 +297,11 @@ dissect_btmesh_proxy_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
DISSECTOR_ASSERT(proxy_ctx->proxy_side < E_BTMESH_PROXY_SIDE_LAST);
if (pinfo->fd->visited && first_pass) {
first_pass=FALSE;
sequence_counter[proxy_ctx->proxy_side] = 0;
fragment_counter[proxy_ctx->proxy_side] = 0;
first_pass=FALSE;
for (int i=0; i< E_BTMESH_PROXY_SIDE_LAST; i++ ){
sequence_counter[i] = 0;
fragment_counter[i] = 0;
}
}
col_set_str(pinfo->cinfo, COL_PROTOCOL, "BT Mesh Proxy");
@ -315,35 +317,32 @@ dissect_btmesh_proxy_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
offset += 1;
guint32 length = tvb_reported_length(tvb) - offset;
gboolean packetReassembledOrComplete = FALSE;
gboolean packetComplete = FALSE;
gboolean packet_reassembled = FALSE;
gboolean packet_completed = FALSE;
col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(proxy_type, btmesh_proxy_type, "Unknown Proxy PDU"));
switch (proxy_sar){
case PROXY_COMPLETE_MESSAGE:
packetReassembledOrComplete = TRUE;
packetComplete = TRUE;
packet_completed = TRUE;
next_tvb = tvb_new_subset_length_caplen(tvb, offset, -1, tvb_captured_length(tvb) - offset);
col_append_str(pinfo->cinfo, COL_INFO," (Complete)");
break;
case PROXY_FIRST_SEGMENT:
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data_fragment, tvb, offset, length, ENC_NA);
sequence_counter[proxy_ctx->proxy_side]++;
if (!pinfo->fd->visited) {
sequence_counter[proxy_ctx->proxy_side]++;
fragment_counter[proxy_ctx->proxy_side]=0;
fragment_counter[proxy_ctx->proxy_side]=0;
fd_head = fragment_add_seq(&proxy_reassembly_table,
tvb, offset, pinfo,
sequence_counter[proxy_ctx->proxy_side], NULL,
fragment_counter[proxy_ctx->proxy_side],
tvb_captured_length_remaining(tvb, offset),
TRUE, 0);
fragment_add_seq(&proxy_reassembly_table,
tvb, offset, pinfo,
sequence_counter[proxy_ctx->proxy_side], NULL,
fragment_counter[proxy_ctx->proxy_side],
tvb_captured_length_remaining(tvb, offset),
TRUE, 0);
fragment_counter[proxy_ctx->proxy_side]++;
} else {
sequence_counter[proxy_ctx->proxy_side]++;
fragment_counter[proxy_ctx->proxy_side]++;
}
col_append_str(pinfo->cinfo, COL_INFO," (First Segment)");
@ -351,13 +350,13 @@ dissect_btmesh_proxy_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
case PROXY_CONTINUATION_SEGMENT:
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data_fragment, tvb, offset, length, ENC_NA);
if (!pinfo->fd->visited) {
fd_head = fragment_add_seq(&proxy_reassembly_table,
tvb, offset, pinfo,
sequence_counter[proxy_ctx->proxy_side], NULL,
fragment_counter[proxy_ctx->proxy_side],
tvb_captured_length_remaining(tvb, offset),
TRUE, 0);
fragment_counter[proxy_ctx->proxy_side]++;
fragment_add_seq(&proxy_reassembly_table,
tvb, offset, pinfo,
sequence_counter[proxy_ctx->proxy_side], NULL,
fragment_counter[proxy_ctx->proxy_side],
tvb_captured_length_remaining(tvb, offset),
TRUE, 0);
fragment_counter[proxy_ctx->proxy_side]++;
}
col_append_str(pinfo->cinfo, COL_INFO," (Continuation Segment)");
@ -366,110 +365,108 @@ dissect_btmesh_proxy_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data_fragment, tvb, offset, length, ENC_NA);
if (!pinfo->fd->visited) {
fragment_add_seq(&proxy_reassembly_table,
tvb, offset, pinfo,
sequence_counter[proxy_ctx->proxy_side], NULL,
fragment_counter[proxy_ctx->proxy_side],
tvb_captured_length_remaining(tvb, offset),
FALSE, 0);
fragment_counter[proxy_ctx->proxy_side]++;
//add mapping "pinfo->num" -> "sequence_counter"
storage = wmem_alloc0(pool, sizeof(sequence_counter[proxy_ctx->proxy_side]));
*((guint32 *)storage) = sequence_counter[proxy_ctx->proxy_side];
wmem_tree_insert32(connection_info_tree, pinfo->num, storage);
fd_head = fragment_get(&proxy_reassembly_table, pinfo, sequence_counter[proxy_ctx->proxy_side], NULL);
fragment_add_seq(&proxy_reassembly_table,
tvb, offset, pinfo,
sequence_counter[proxy_ctx->proxy_side], NULL,
fragment_counter[proxy_ctx->proxy_side],
tvb_captured_length_remaining(tvb, offset),
FALSE, 0);
fragment_counter[proxy_ctx->proxy_side]++;
//add mapping "pinfo->num" -> "sequence_counter"
storage = wmem_alloc0(pool, sizeof(sequence_counter[proxy_ctx->proxy_side]));
*((guint32 *)storage) = sequence_counter[proxy_ctx->proxy_side];
wmem_tree_insert32(connection_info_tree, pinfo->num, storage);
}
packetReassembledOrComplete = TRUE;
packet_reassembled = TRUE;
col_append_str(pinfo->cinfo, COL_INFO," (Last Segment)");
break;
//No default since this is 2 bit value
}
if (packetReassembledOrComplete && pinfo->fd->visited) {
if (next_tvb == NULL) {
sequence_counter_ptr = (guint32 *)wmem_tree_lookup32(connection_info_tree, pinfo->num);
if (packet_reassembled || packet_completed) {
if (next_tvb == NULL) {
sequence_counter_ptr = (guint32 *)wmem_tree_lookup32(connection_info_tree, pinfo->num);
if (sequence_counter_ptr != NULL) {
fd_head = fragment_get(&proxy_reassembly_table, pinfo, *sequence_counter_ptr, NULL);
if (sequence_counter_ptr != NULL) {
fd_head = fragment_get(&proxy_reassembly_table, pinfo, *sequence_counter_ptr, NULL);
if (fd_head) {
next_tvb = process_reassembled_data(tvb, offset, pinfo,
"Reassembled Message", fd_head, &btmesh_proxy_frag_items,
NULL, sub_tree);
col_append_str(pinfo->cinfo, COL_INFO, " (Message Reassembled)");
}
}
}
if (fd_head) {
next_tvb = process_reassembled_data(tvb, offset, pinfo,
"Reassembled Message", fd_head, &btmesh_proxy_frag_items,
NULL, sub_tree);
col_append_str(pinfo->cinfo, COL_INFO, " (Message Reassembled)");
if (next_tvb) {
offset = 0;
tr_ctx.transport = E_BTMESH_TR_PROXY;
if (packet_completed) {
tr_ctx.fragmented = FALSE;
} else {
tr_ctx.fragmented = TRUE;
}
tr_ctx.segment_index = 0;
switch (proxy_type) {
case PROXY_PDU_NETWORK:
if (btmesh_handle) {
call_dissector(btmesh_handle, next_tvb, pinfo, proto_tree_get_root(tree));
} else {
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
}
break;
case PROXY_PDU_MESH_BEACON:
if (btmesh_beacon_handle) {
call_dissector_with_data(btmesh_beacon_handle, next_tvb, pinfo, proto_tree_get_root(tree), &tr_ctx);
} else {
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
}
break;
case PROXY_PDU_CONFIGURATION:
dissect_btmesh_proxy_configuration_msg(next_tvb, pinfo, sub_tree, NULL);
break;
case PROXY_PDU_PROVISIONING:
if (btmesh_provisioning_handle) {
call_dissector_with_data(btmesh_provisioning_handle, next_tvb, pinfo, proto_tree_get_root(tree), &tr_ctx);
} else {
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
}
break;
default:
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
break;
}
}
}
}
if (next_tvb){
offset = 0;
tr_ctx.transport = E_BTMESH_TR_PROXY;
if (packetComplete) {
tr_ctx.fragmented = FALSE;
} else {
tr_ctx.fragmented = TRUE;
}
tr_ctx.segment_index = 0;
switch(proxy_type) {
case PROXY_PDU_NETWORK:
if (btmesh_handle) {
call_dissector(btmesh_handle, next_tvb, pinfo, proto_tree_get_root(tree));
} else {
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
}
break;
case PROXY_PDU_MESH_BEACON:
if (btmesh_beacon_handle) {
call_dissector_with_data(btmesh_beacon_handle, next_tvb, pinfo, proto_tree_get_root(tree), &tr_ctx);
} else {
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
}
break;
case PROXY_PDU_CONFIGURATION:
dissect_btmesh_proxy_configuration_msg(next_tvb, pinfo, sub_tree, NULL);
break;
case PROXY_PDU_PROVISIONING:
if (btmesh_provisioning_handle) {
call_dissector_with_data(btmesh_provisioning_handle, next_tvb, pinfo, proto_tree_get_root(tree), &tr_ctx);
} else {
proto_tree_add_item(sub_tree, hf_btmesh_proxy_data, next_tvb, offset, length, ENC_NA);
}
break;
//Default is not needed
}
}
}
return tvb_reported_length(tvb);
return tvb_reported_length(tvb);
}
static void
proxy_init_routine(void)
{
reassembly_table_register(&proxy_reassembly_table, &addresses_reassembly_table_functions);
for (int i=0; i< E_BTMESH_PROXY_SIDE_LAST; i++ ){
sequence_counter[i] = 0;
fragment_counter[i] = 0;
}
first_pass = TRUE;
pool = wmem_allocator_new(WMEM_ALLOCATOR_SIMPLE);
reassembly_table_register(&proxy_reassembly_table, &addresses_reassembly_table_functions);
for (int i=0; i< E_BTMESH_PROXY_SIDE_LAST; i++ ){
sequence_counter[i] = 0;
fragment_counter[i] = 0;
}
first_pass = TRUE;
pool = wmem_allocator_new(WMEM_ALLOCATOR_SIMPLE);
}
static void
proxy_cleanup_dissector(void)
{
wmem_destroy_allocator(pool);
pool = NULL;
wmem_destroy_allocator(pool);
pool = NULL;
}
void

View File

@ -4795,9 +4795,10 @@ dissect_btmesh_model_layer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* Vendor opcode */
proto_tree_add_item(sub_tree, hf_btmesh_model_layer_vendor_opcode, tvb, offset, 1, ENC_NA);
vendor = tvb_get_guint16(tvb, offset + 1, ENC_BIG_ENDIAN);
proto_tree_add_item(sub_tree, hf_btmesh_model_layer_vendor, tvb, offset + 1, 2, ENC_NA);
proto_tree_add_item(sub_tree, hf_btmesh_model_layer_vendor, tvb, offset + 1, 2, ENC_LITTLE_ENDIAN);
payload_tvb = tvb_new_subset_remaining(tvb, offset);
dissector_try_uint_new(btmesh_model_vendor_dissector_table, vendor, payload_tvb, pinfo, tree, TRUE, GUINT_TO_POINTER(vendor));
col_set_str(pinfo->cinfo, COL_INFO, "Access Message - Vendor Opcode");
offset+=3;
} else {
/* Two octet opcode */
@ -7805,6 +7806,7 @@ dissect_btmesh_transport_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
dissect_btmesh_transport_control_message(next_tvb, pinfo, tree, 0, opcode);
col_append_str(pinfo->cinfo, COL_INFO, " (Message Reassembled)");
} else {
col_clear(pinfo->cinfo, COL_INFO);
col_append_fstr(pinfo->cinfo, COL_INFO,"Control Message (fragment %u)", sego);
}
}
@ -7812,6 +7814,9 @@ dissect_btmesh_transport_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
}
} else {
if (opcode == 0) {
col_clear(pinfo->cinfo, COL_INFO);
col_append_fstr(pinfo->cinfo, COL_INFO, "%s",
val_to_str_const(opcode, btmesh_ctrl_opcode_vals, "Control Message Unknown"));
/* OBO 1 */
proto_tree_add_item(sub_tree, hf_btmesh_obo, tvb, offset, 2, ENC_BIG_ENDIAN);
/* SeqZero 13 */
@ -7909,7 +7914,8 @@ dissect_btmesh_transport_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
dissect_btmesh_transport_access_message(next_tvb, pinfo, tree, 0, dec_ctx);
col_append_str(pinfo->cinfo, COL_INFO, " (Message Reassembled)");
} else {
col_append_fstr(pinfo->cinfo, COL_INFO,"Access Message (fragment %u)", sego);
col_clear(pinfo->cinfo, COL_INFO);
col_append_fstr(pinfo->cinfo, COL_INFO, "Access Message (fragment %u)", sego);
}
}
}
@ -8039,7 +8045,6 @@ dissect_btmesh_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *da
network_decryption_ctx_t *dec_ctx;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "BT Mesh");
col_clear(pinfo->cinfo, COL_INFO);
item = proto_tree_add_item(tree, proto_btmesh, tvb, offset, -1, ENC_NA);
netw_tree = proto_item_add_subtree(item, ett_btmesh);
@ -8814,8 +8819,8 @@ proto_register_btmesh(void)
NULL, HFILL }
},
{ &hf_btmesh_model_layer_vendor,
{ "Opcode", "btmesh.model.vendor",
FT_UINT16, BASE_DEC, NULL, 0x0,
{ "Company ID", "btmesh.model.vendor",
FT_UINT16, BASE_HEX | BASE_EXT_STRING, &bluetooth_company_id_vals_ext, 0x0,
NULL, HFILL }
},
{ &hf_btmesh_model_layer_opcode,