From 5492ca2d6a4ef04412ef5f1fdd71de8db56d6a38 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 26 Nov 2020 13:59:51 +0100 Subject: WIP: rlcmac: Support dissecting LLC frames in rlcmac data blocks --- epan/dissectors/packet-gsm_rlcmac.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/epan/dissectors/packet-gsm_rlcmac.c b/epan/dissectors/packet-gsm_rlcmac.c index c05a267a84..64ef67197c 100644 --- a/epan/dissectors/packet-gsm_rlcmac.c +++ b/epan/dissectors/packet-gsm_rlcmac.c @@ -49,6 +49,7 @@ void proto_reg_handoff_gsm_rlcmac(void); static dissector_handle_t lte_rrc_dl_dcch_handle = NULL; static dissector_handle_t rrc_irat_ho_to_utran_cmd_handle = NULL; +static dissector_handle_t llc_handle = NULL; /* private typedefs */ typedef struct @@ -8585,6 +8586,7 @@ static guint8 dissect_gprs_data_segments(tvbuff_t *tvb, packet_info *pinfo, prot data_tvb = tvb_new_subset_length(tvb, octet_offset, blk_length - octet_offset); call_data_dissector(data_tvb, pinfo, subtree); octet_offset = blk_length; + /* TODO: here store data_tvb for later */ break; case 63: @@ -8611,7 +8613,14 @@ static guint8 dissect_gprs_data_segments(tvbuff_t *tvb, packet_info *pinfo, prot "data segment: LI[%d]=%d indicates: (Last segment of) LLC frame (%d octets)", i, li, li); data_tvb = tvb_new_subset_length(tvb, octet_offset, li); - call_data_dissector(data_tvb, pinfo, subtree); + if(data_tvb) { + if (llc_handle) { + /* TODO: here used data_tvb previously stored and append current data_tvb to it. */ + call_dissector(llc_handle, data_tvb, pinfo, subtree); + } else { + call_data_dissector(data_tvb, pinfo, subtree); + } + } octet_offset += li; break; } @@ -8628,6 +8637,7 @@ static guint8 dissect_gprs_data_segments(tvbuff_t *tvb, packet_info *pinfo, prot "data segment: LI not present: \n The Upper Layer PDU in the current RLC data block either fills the current RLC data block precisely \nor continues in the following in-sequence RLC data block"); data_tvb = tvb_new_subset_length(tvb, octet_offset, blk_length - octet_offset); call_data_dissector(data_tvb, pinfo, subtree); + /* TODO: here store data_tvb for later */ } else { proto_tree_add_bytes_item(tree, hf_padding, tvb, octet_offset, blk_length - octet_offset, ENC_BIG_ENDIAN, NULL, NULL, NULL); } @@ -8730,7 +8740,14 @@ static guint16 dissect_egprs_data_segments(tvbuff_t *tvb, packet_info *pinfo, pr "data segment: LI[%d]=%d indicates: (Last segment of) LLC frame (%d octets)", i, li, li); data_tvb = tvb_new_subset_length(tvb, octet_offset, li); - call_data_dissector(data_tvb, pinfo, subtree); + if(data_tvb) { + if (llc_handle) { + /* TODO: here used data_tvb previously stored and append current data_tvb to it. */ + call_dissector(llc_handle, data_tvb, pinfo, subtree); + } else { + call_data_dissector(data_tvb, pinfo, subtree); + } + } octet_offset += li; break; } @@ -18630,6 +18647,7 @@ void proto_reg_handoff_gsm_rlcmac(void) { lte_rrc_dl_dcch_handle = find_dissector("lte_rrc.dl_dcch"); rrc_irat_ho_to_utran_cmd_handle = find_dissector("rrc.irat.ho_to_utran_cmd"); + llc_handle = find_dissector("llcgprs"); } /* -- cgit v1.2.3