MAC NR: call NR RRC dissector for broadcast and common channels

Change-Id: I70b7356e15023400189a4ab57a41473da7363374
Reviewed-on: https://code.wireshark.org/review/30121
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Reviewed-by: Martin Mathieson <martin.r.mathieson@googlemail.com>
Tested-by: Petri Dish Buildbot
This commit is contained in:
Pascal Quantin 2018-10-10 18:38:31 +02:00
parent 093a0448fb
commit b804d0d5ee
1 changed files with 77 additions and 15 deletions

View File

@ -56,6 +56,7 @@ static int hf_mac_nr_dlsch_lcid = -1;
static int hf_mac_nr_dlsch_sdu = -1;
static int hf_mac_nr_ulsch_sdu = -1;
static int hf_mac_nr_bcch_pdu = -1;
static int hf_mac_nr_pcch_pdu = -1;
static int hf_mac_nr_control_crnti = -1;
static int hf_mac_nr_control_ue_contention_resolution_identity = -1;
@ -322,6 +323,11 @@ static expert_field ei_mac_nr_ul_sch_control_subheader_before_data_subheader = E
static dissector_handle_t nr_rrc_bcch_bch_handle;
static dissector_handle_t nr_rrc_bcch_dl_sch_handle;
static dissector_handle_t nr_rrc_pcch_handle;
static dissector_handle_t nr_rrc_dl_ccch_handle;
static dissector_handle_t nr_rrc_ul_ccch_handle;
static dissector_handle_t nr_rrc_ul_ccch1_handle;
/**************************************************************************/
@ -1147,8 +1153,7 @@ static void dissect_bcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
if (p_mac_nr_info->rntiType == NO_RNTI) {
protocol_handle = nr_rrc_bcch_bch_handle;
} else {
/* TODO: add handle once NR-RRC spec is updated */
protocol_handle = NULL;
protocol_handle = nr_rrc_bcch_dl_sch_handle;
}
/* Hide raw view of bytes */
@ -1158,6 +1163,36 @@ static void dissect_bcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
}
/* Dissect PCCH PDU */
static void dissect_pcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
proto_item *pdu_ti, int offset, mac_nr_info *p_mac_nr_info _U_)
{
proto_item *ti;
write_pdu_label_and_info(pdu_ti, NULL, pinfo,
"PCCH PDU (%u bytes) ",
tvb_reported_length_remaining(tvb, offset));
/****************************************/
/* Whole frame is PCCH data */
/* Always show as raw data */
ti = proto_tree_add_item(tree, hf_mac_nr_pcch_pdu,
tvb, offset, -1, ENC_NA);
if (global_mac_nr_attempt_rrc_decode) {
/* Attempt to decode payload using NR RRC dissector */
tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset);
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN(ti);
call_with_catch_all(nr_rrc_pcch_handle, rrc_tvb, pinfo, tree);
}
}
static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
proto_item *pdu_ti _U_, guint32 offset,
mac_nr_info *p_mac_nr_info _U_)
@ -1506,9 +1541,10 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
}
if (lcid <= 32 || (p_mac_nr_info->direction == DIRECTION_UPLINK && lcid == CCCH_48_BITS_LCID)) {
proto_item *sch_pdu_ti;
/* Note whether this sub-pdu gets dissected by RLC */
gboolean dissected_as_rlc = FALSE;
/* Note whether this sub-pdu gets dissected by RLC/RRC */
gboolean dissected_by_upper_layer = FALSE;
/* Add SDU, for now just as hex data */
if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
@ -1517,12 +1553,12 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
} else if (lcid == CCCH_48_BITS_LCID) {
SDU_length = 6;
}
proto_tree_add_item(subheader_tree, hf_mac_nr_ulsch_sdu,
tvb, offset, SDU_length, ENC_NA);
sch_pdu_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_ulsch_sdu,
tvb, offset, SDU_length, ENC_NA);
}
else {
proto_tree_add_item(subheader_tree, hf_mac_nr_dlsch_sdu,
tvb, offset, SDU_length, ENC_NA);
sch_pdu_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_dlsch_sdu,
tvb, offset, SDU_length, ENC_NA);
}
/* Call RLC if configured to do so for this SDU */
@ -1549,7 +1585,7 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
RLC_UM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
BEARER_TYPE_DRB, drb_id, seqnum_length,
priority);
dissected_as_rlc = TRUE;
dissected_by_upper_layer = TRUE;
break;
case rlcAM12:
case rlcAM18:
@ -1557,23 +1593,38 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
RLC_AM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
BEARER_TYPE_DRB, drb_id, seqnum_length,
priority);
dissected_as_rlc = TRUE;
dissected_by_upper_layer = TRUE;
break;
case rlcTM:
call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, SDU_length,
RLC_TM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
BEARER_TYPE_DRB, drb_id, 0,
priority);
dissected_as_rlc = TRUE;
dissected_by_upper_layer = TRUE;
break;
case rlcRaw:
/* Nothing to do! */
break;
}
} else if (lcid == 1 || lcid == 2) {
/* SRB, TODO: call RLC dissector */
} else if (global_mac_nr_attempt_rrc_decode) {
dissector_handle_t protocol_handle;
tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset);
if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
protocol_handle = (lcid == CCCH_LCID) ? nr_rrc_ul_ccch1_handle : nr_rrc_ul_ccch_handle;
} else {
protocol_handle = nr_rrc_dl_ccch_handle;
}
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN(sch_pdu_ti);
call_with_catch_all(protocol_handle, rrc_tvb, pinfo, tree);
dissected_by_upper_layer = TRUE;
}
/* Only write summary to Info column if didn't send to RLC dissector */
write_pdu_label_and_info(pdu_ti, subheader_ti, dissected_as_rlc ? NULL : pinfo,
/* Only write summary to Info column if didn't send to upper_layer dissector */
write_pdu_label_and_info(pdu_ti, subheader_ti, dissected_by_upper_layer ? NULL : pinfo,
"(LCID:%u %u bytes) ", lcid, SDU_length);
offset += SDU_length;
@ -2358,8 +2409,8 @@ static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo,
switch (p_mac_nr_info->rntiType) {
case P_RNTI:
/* PCH PDU */
// dissect_pch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info, tap_info);
/* PCCH PDU */
dissect_pcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info);
break;
case RA_RNTI:
@ -2641,6 +2692,12 @@ void proto_register_mac_nr(void)
NULL, HFILL
}
},
{ &hf_mac_nr_pcch_pdu,
{ "PCCH PDU",
"mac-nr.pcch.pdu", FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL
}
},
/*********************************/
@ -4191,6 +4248,11 @@ void proto_reg_handoff_mac_nr(void)
rlc_nr_handle = find_dissector_add_dependency("rlc-nr", proto_mac_nr);
nr_rrc_bcch_bch_handle = find_dissector_add_dependency("nr-rrc.bcch.bch", proto_mac_nr);
nr_rrc_bcch_dl_sch_handle = find_dissector_add_dependency("nr-rrc.bcch.dl.sch", proto_mac_nr);
nr_rrc_pcch_handle = find_dissector_add_dependency("nr-rrc.pcch", proto_mac_nr);
nr_rrc_dl_ccch_handle = find_dissector_add_dependency("nr-rrc.dl.ccch", proto_mac_nr);
nr_rrc_ul_ccch_handle = find_dissector_add_dependency("nr-rrc.ul.ccch", proto_mac_nr);
nr_rrc_ul_ccch1_handle = find_dissector_add_dependency("nr-rrc.ul.ccch1", proto_mac_nr);
}