forked from osmocom/wireshark
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:
parent
fdf55aaa51
commit
d5a0d390e8
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue