aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gsm_rlcmac.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-gsm_rlcmac.c')
-rw-r--r--epan/dissectors/packet-gsm_rlcmac.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/epan/dissectors/packet-gsm_rlcmac.c b/epan/dissectors/packet-gsm_rlcmac.c
index c5b6a4c0b5..d5d7410341 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
@@ -8587,6 +8588,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:
@@ -8613,7 +8615,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;
}
@@ -8630,6 +8639,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);
}
@@ -8732,7 +8742,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;
}
@@ -18627,6 +18644,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");
}
/*