aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-11-26 13:59:51 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2021-10-20 17:25:24 +0200
commit5492ca2d6a4ef04412ef5f1fdd71de8db56d6a38 (patch)
tree971c2e1a3b2691d7822e5990422d445b8c3e5f5b
parentffdc5622d1be97af10987c2d8677b0456ae04e88 (diff)
WIP: rlcmac: Support dissecting LLC frames in rlcmac data blockspespin/rlcmac
-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 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");
}
/*