aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2020-06-30 20:11:39 +0200
committerStig Bjørlykke <stig@bjorlykke.org>2020-06-30 21:09:38 +0000
commit40f3c393c3e5bf257a40d6b217ea5999746ccf14 (patch)
tree20161ceb454a562d04dabcfdafa8af6361b2d276 /epan
parent90d63ba07596f686cd3c2f90a6176cedde14c3c8 (diff)
coap: Move dissection of payload before state tracking
Change-Id: Icd8bce0a12167cc3edb3cb70fad5dd696af0b796 Reviewed-on: https://code.wireshark.org/review/37623 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-coap.c101
1 files changed, 47 insertions, 54 deletions
diff --git a/epan/dissectors/packet-coap.c b/epan/dissectors/packet-coap.c
index 39a130f791..79acb28151 100644
--- a/epan/dissectors/packet-coap.c
+++ b/epan/dissectors/packet-coap.c
@@ -1335,6 +1335,30 @@ dissect_coap_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
}
}
+ /* dissect the payload */
+ if (coap_length > offset) {
+ if (coinfo->block_number == DEFAULT_COAP_BLOCK_NUMBER) {
+ dissect_coap_payload(tvb, pinfo, coap_tree, parent_tree, offset, coap_length,
+ code_class, coinfo, &dissect_coap_hf, FALSE);
+ } else {
+ proto_tree_add_bytes_format(coap_tree, hf_block_payload, tvb, offset,
+ coap_length - offset, NULL, "Block Payload");
+ pi = proto_tree_add_uint(coap_tree, hf_block_length, tvb, offset, 0, coap_length - offset);
+ proto_item_set_generated(pi);
+
+ fragment_head *frag_msg = fragment_add_seq_check(&coap_block_reassembly_table, tvb, offset,
+ pinfo, 0, NULL, coinfo->block_number,
+ coap_length - offset, coinfo->block_mflag);
+ tvbuff_t *frag_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled CoAP blocks",
+ frag_msg, &coap_block_frag_items, NULL, coap_tree);
+
+ if (frag_tvb) {
+ dissect_coap_payload(frag_tvb, pinfo, coap_tree, parent_tree, 0, tvb_reported_length(frag_tvb),
+ code_class, coinfo, &dissect_coap_hf, FALSE);
+ }
+ }
+ }
+
/* add informations to the packet list */
if (coap_token_str != NULL)
col_append_fstr(pinfo->cinfo, COL_INFO, ", TKN:%s", coap_token_str);
@@ -1355,39 +1379,36 @@ dissect_coap_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
if (code_class == 0) {
/* This is a request */
if (coap_req_rsp->rsp_frame) {
- proto_item *it;
-
- it = proto_tree_add_uint(coap_tree, hf_coap_response_in,
- tvb, 0, 0, coap_req_rsp->rsp_frame);
- proto_item_set_generated(it);
+ pi = proto_tree_add_uint(coap_tree, hf_coap_response_in,
+ tvb, 0, 0, coap_req_rsp->rsp_frame);
+ proto_item_set_generated(pi);
}
if (coap_req_rsp->req_frame != pinfo->num) {
col_append_str(pinfo->cinfo, COL_INFO, " [Retransmission]");
- proto_item *it = proto_tree_add_uint(coap_tree, hf_coap_request_resend_in,
- tvb, 0, 0, coap_req_rsp->req_frame);
- proto_item_set_generated(it);
- expert_add_info(pinfo, it, &ei_retransmitted);
+ pi = proto_tree_add_uint(coap_tree, hf_coap_request_resend_in,
+ tvb, 0, 0, coap_req_rsp->req_frame);
+ proto_item_set_generated(pi);
+ expert_add_info(pinfo, pi, &ei_retransmitted);
}
} else if ((code_class >= 2) && (code_class <= 5)) {
/* This is a reply */
if (coap_req_rsp->req_frame) {
- proto_item *it;
nstime_t ns;
- it = proto_tree_add_uint(coap_tree, hf_coap_response_to,
- tvb, 0, 0, coap_req_rsp->req_frame);
- proto_item_set_generated(it);
+ pi = proto_tree_add_uint(coap_tree, hf_coap_response_to,
+ tvb, 0, 0, coap_req_rsp->req_frame);
+ proto_item_set_generated(pi);
nstime_delta(&ns, &pinfo->abs_ts, &coap_req_rsp->req_time);
- it = proto_tree_add_time(coap_tree, hf_coap_response_time, tvb, 0, 0, &ns);
- proto_item_set_generated(it);
+ pi = proto_tree_add_time(coap_tree, hf_coap_response_time, tvb, 0, 0, &ns);
+ proto_item_set_generated(pi);
}
if (coap_req_rsp->rsp_frame != pinfo->num) {
col_append_str(pinfo->cinfo, COL_INFO, " [Retransmission]");
- proto_item *it = proto_tree_add_uint(coap_tree, hf_coap_response_resend_in,
- tvb, 0, 0, coap_req_rsp->rsp_frame);
- proto_item_set_generated(it);
- expert_add_info(pinfo, it, &ei_retransmitted);
+ pi = proto_tree_add_uint(coap_tree, hf_coap_response_resend_in,
+ tvb, 0, 0, coap_req_rsp->rsp_frame);
+ proto_item_set_generated(pi);
+ expert_add_info(pinfo, pi, &ei_retransmitted);
}
}
}
@@ -1396,46 +1417,18 @@ dissect_coap_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
if ((code_class >= 2) && (code_class <= 5)) {
/* This is a reply */
if (coinfo->object_security && coap_trans->oscore_info) {
- proto_item *it;
-
- it = proto_tree_add_bytes(coap_tree, hf_coap_oscore_kid, tvb, 0, coap_trans->oscore_info->kid_len, coap_trans->oscore_info->kid);
- proto_item_set_generated(it);
+ pi = proto_tree_add_bytes(coap_tree, hf_coap_oscore_kid, tvb, 0, coap_trans->oscore_info->kid_len, coap_trans->oscore_info->kid);
+ proto_item_set_generated(pi);
- it = proto_tree_add_bytes(coap_tree, hf_coap_oscore_kid_context, tvb, 0, coap_trans->oscore_info->kid_context_len, coap_trans->oscore_info->kid_context);
- proto_item_set_generated(it);
+ pi = proto_tree_add_bytes(coap_tree, hf_coap_oscore_kid_context, tvb, 0, coap_trans->oscore_info->kid_context_len, coap_trans->oscore_info->kid_context);
+ proto_item_set_generated(pi);
if (coinfo->oscore_info->piv_len) {
- it = proto_tree_add_bytes(coap_tree, hf_coap_oscore_piv, tvb, 0, coinfo->oscore_info->piv_len, coinfo->oscore_info->piv);
+ pi = proto_tree_add_bytes(coap_tree, hf_coap_oscore_piv, tvb, 0, coinfo->oscore_info->piv_len, coinfo->oscore_info->piv);
} else {
- it = proto_tree_add_bytes(coap_tree, hf_coap_oscore_piv, tvb, 0, coinfo->oscore_info->request_piv_len, coinfo->oscore_info->request_piv);
+ pi = proto_tree_add_bytes(coap_tree, hf_coap_oscore_piv, tvb, 0, coinfo->oscore_info->request_piv_len, coinfo->oscore_info->request_piv);
}
- proto_item_set_generated(it);
- }
- }
- }
-
- /* dissect the payload */
- if (coap_length > offset) {
- if (coinfo->block_number == DEFAULT_COAP_BLOCK_NUMBER) {
- dissect_coap_payload(tvb, pinfo, coap_tree, parent_tree, offset, coap_length,
- code_class, coinfo, &dissect_coap_hf, FALSE);
- } else {
- proto_item *it;
-
- proto_tree_add_bytes_format(coap_tree, hf_block_payload, tvb, offset,
- coap_length - offset, NULL, "Block Payload");
- it = proto_tree_add_uint(coap_tree, hf_block_length, tvb, offset, 0, coap_length - offset);
- proto_item_set_generated(it);
-
- fragment_head *frag_msg = fragment_add_seq_check(&coap_block_reassembly_table, tvb, offset,
- pinfo, 0, NULL, coinfo->block_number,
- coap_length - offset, coinfo->block_mflag);
- tvbuff_t *frag_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled CoAP blocks",
- frag_msg, &coap_block_frag_items, NULL, coap_tree);
-
- if (frag_tvb) {
- dissect_coap_payload(frag_tvb, pinfo, coap_tree, parent_tree, 0, tvb_reported_length(frag_tvb),
- code_class, coinfo, &dissect_coap_hf, FALSE);
+ proto_item_set_generated(pi);
}
}
}