HACK: Hand GPRS RLC payload to GPRS LLC dissector

this is an ugly hack, as there is no code for packet re-assembly
in betwween, i.e. we only get proper dissection if the LLC message
was fitting entirely into one RLC block.  Nevertheless, sufficient to
see things like RAU, ATTACH, IDENTITY procedures.

Change-Id: I1fc488aa58353e5f4264b940f9f4c18987148a7d
This commit is contained in:
Harald Welte 2016-10-26 22:38:20 +02:00 committed by Harald Welte
parent a329db7dd2
commit 43968887ba
1 changed files with 6 additions and 4 deletions

View File

@ -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
@ -8613,7 +8614,7 @@ 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);
call_dissector(llc_handle, data_tvb, pinfo, subtree);
octet_offset += li;
break;
}
@ -8629,7 +8630,7 @@ static guint8 dissect_gprs_data_segments(tvbuff_t *tvb, packet_info *pinfo, prot
subtree = proto_tree_add_subtree_format(tree, tvb, octet_offset, blk_length - octet_offset, ett_data_segments, NULL,
"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);
call_dissector(llc_handle, data_tvb, pinfo, subtree);
} else {
proto_tree_add_bytes_item(tree, hf_padding, tvb, octet_offset, blk_length - octet_offset, ENC_BIG_ENDIAN, NULL, NULL, NULL);
}
@ -8732,7 +8733,7 @@ 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);
call_dissector(llc_handle, data_tvb, pinfo, subtree);
octet_offset += li;
break;
}
@ -8745,7 +8746,7 @@ static guint16 dissect_egprs_data_segments(tvbuff_t *tvb, packet_info *pinfo, pr
subtree = proto_tree_add_subtree(tree, tvb, octet_offset, octet_length - octet_offset, ett_data_segments, NULL,
"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, octet_length - octet_offset);
call_data_dissector(data_tvb, pinfo, subtree);
call_dissector(llc_handle, data_tvb, pinfo, subtree);
octet_offset = octet_length;
}
return (octet_offset - initial_offset);
@ -18632,6 +18633,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");
}
/*