Add some extra (optional) physical layer attributes to logged MAC frames.

svn path=/trunk/; revision=32190
This commit is contained in:
Martin Mathieson 2010-03-14 17:56:37 +00:00
parent 0d8a56ef72
commit b3a29fcb32
3 changed files with 428 additions and 75 deletions

View File

@ -697,8 +697,8 @@ static void dissect_rrc_lte(tvbuff_t *tvb, gint offset,
tvb, offset, 1, FALSE); tvb, offset, 1, FALSE);
logicalChannelType = (LogicalChannelType)tvb_get_guint8(tvb, offset++); logicalChannelType = (LogicalChannelType)tvb_get_guint8(tvb, offset++);
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
val_to_str(logicalChannelType, rlc_logical_channel_vals, val_to_str_const(logicalChannelType, rlc_logical_channel_vals,
"UNKNOWN-CHANNEL")); "UNKNOWN-CHANNEL"));
switch (logicalChannelType) { switch (logicalChannelType) {
case Channel_BCCH: case Channel_BCCH:
@ -977,8 +977,8 @@ static void dissect_pdcp_lte(tvbuff_t *tvb, gint offset,
tvb, offset, 1, FALSE); tvb, offset, 1, FALSE);
p_pdcp_lte_info->channelType = tvb_get_guint8(tvb, offset++); p_pdcp_lte_info->channelType = tvb_get_guint8(tvb, offset++);
col_append_fstr(pinfo->cinfo, COL_INFO, " %s", col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
val_to_str(p_pdcp_lte_info->channelType, rlc_logical_channel_vals, val_to_str_const(p_pdcp_lte_info->channelType, rlc_logical_channel_vals,
"UNKNOWN-CHANNEL")); "UNKNOWN-CHANNEL"));
switch (p_pdcp_lte_info->channelType) { switch (p_pdcp_lte_info->channelType) {
case Channel_BCCH: case Channel_BCCH:
@ -1366,11 +1366,19 @@ static void attach_mac_lte_info(packet_info *pinfo)
p_mac_lte_info = se_alloc0(sizeof(struct mac_lte_info)); p_mac_lte_info = se_alloc0(sizeof(struct mac_lte_info));
/* Populate the struct from outhdr values */ /* Populate the struct from outhdr values */
p_mac_lte_info->crcStatusValid = FALSE; p_mac_lte_info->crcStatusValid = FALSE; /* not set yet */
p_mac_lte_info->radioType = outhdr_values[i++] + 1; p_mac_lte_info->radioType = outhdr_values[i++] + 1;
p_mac_lte_info->rntiType = outhdr_values[i++]; p_mac_lte_info->rntiType = outhdr_values[i++];
p_mac_lte_info->direction = outhdr_values[i++]; p_mac_lte_info->direction = outhdr_values[i++];
/* Set these extra PHY present flags to FALSE by default */
if (p_mac_lte_info->direction == DIRECTION_UPLINK) {
p_mac_lte_info->detailed_phy_info.ul_info.present = FALSE;
}
else {
p_mac_lte_info->detailed_phy_info.dl_info.present = FALSE;
}
p_mac_lte_info->subframeNumber = outhdr_values[i++]; p_mac_lte_info->subframeNumber = outhdr_values[i++];
p_mac_lte_info->isPredefinedData = outhdr_values[i++]; p_mac_lte_info->isPredefinedData = outhdr_values[i++];
p_mac_lte_info->rnti = outhdr_values[i++]; p_mac_lte_info->rnti = outhdr_values[i++];
@ -1379,17 +1387,40 @@ static void attach_mac_lte_info(packet_info *pinfo)
if (outhdr_values_found > 8) { if (outhdr_values_found > 8) {
p_mac_lte_info->reTxCount = outhdr_values[i++]; p_mac_lte_info->reTxCount = outhdr_values[i++];
} }
if (outhdr_values_found > 9) { if (outhdr_values_found == 10) {
/* CRC only valid for Downlink */ /* CRC only valid for Downlink */
if (p_mac_lte_info->direction == DIRECTION_DOWNLINK) { if (p_mac_lte_info->direction == DIRECTION_DOWNLINK) {
p_mac_lte_info->crcStatusValid = TRUE; p_mac_lte_info->crcStatusValid = TRUE;
p_mac_lte_info->crcStatus = outhdr_values[i++]; p_mac_lte_info->detailed_phy_info.dl_info.crc_status = outhdr_values[i++];
} }
else { else {
i++; i++;
} }
} }
if (outhdr_values_found > 10) {
/* Extra PHY parameters */
if (p_mac_lte_info->direction == DIRECTION_DOWNLINK) {
p_mac_lte_info->detailed_phy_info.dl_info.present = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.dci_format = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.mcs_index = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.retx = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length = outhdr_values[i++];
p_mac_lte_info->crcStatusValid = TRUE;
p_mac_lte_info->detailed_phy_info.dl_info.crc_status = outhdr_values[i++];
}
else {
p_mac_lte_info->detailed_phy_info.ul_info.present = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.ul_info.modulation_type = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.ul_info.tbs_index = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length = outhdr_values[i++];
p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start = outhdr_values[i++];
}
}
/* Store info in packet */ /* Store info in packet */
p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info); p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info);
} }

View File

@ -69,6 +69,24 @@ static int hf_mac_lte_context_crc_status = -1;
static int hf_mac_lte_context_rapid = -1; static int hf_mac_lte_context_rapid = -1;
static int hf_mac_lte_context_rach_attempt_number = -1; static int hf_mac_lte_context_rach_attempt_number = -1;
/* Extra PHY context */
static int hf_mac_lte_context_phy_ul = -1;
static int hf_mac_lte_context_phy_ul_modulation_type = -1;
static int hf_mac_lte_context_phy_ul_tbs_index = -1;
static int hf_mac_lte_context_phy_ul_resource_block_length = -1;
static int hf_mac_lte_context_phy_ul_resource_block_start = -1;
static int hf_mac_lte_context_phy_dl = -1;
static int hf_mac_lte_context_phy_dl_dci_format = -1;
static int hf_mac_lte_context_phy_dl_resource_allocation_type = -1;
static int hf_mac_lte_context_phy_dl_aggregation_level = -1;
static int hf_mac_lte_context_phy_dl_mcs_index = -1;
static int hf_mac_lte_context_phy_dl_redundancy_version_index = -1;
static int hf_mac_lte_context_phy_dl_retx = -1;
static int hf_mac_lte_context_phy_dl_resource_block_length = -1;
static int hf_mac_lte_context_phy_dl_crc_status = -1;
/* Out-of-band events */ /* Out-of-band events */
static int hf_mac_lte_oob_send_preamble = -1; static int hf_mac_lte_oob_send_preamble = -1;
static int hf_mac_lte_oob_send_sr = -1; static int hf_mac_lte_oob_send_sr = -1;
@ -159,6 +177,7 @@ static int hf_mac_lte_sr_time_until_answer = -1;
/* Subtrees. */ /* Subtrees. */
static int ett_mac_lte = -1; static int ett_mac_lte = -1;
static int ett_mac_lte_context = -1; static int ett_mac_lte_context = -1;
static int ett_mac_lte_phy_context = -1;
static int ett_mac_lte_ulsch_header = -1; static int ett_mac_lte_ulsch_header = -1;
static int ett_mac_lte_dlsch_header = -1; static int ett_mac_lte_dlsch_header = -1;
static int ett_mac_lte_sch_subheader = -1; static int ett_mac_lte_sch_subheader = -1;
@ -212,12 +231,43 @@ static const value_string bch_transport_channel_vals[] =
static const value_string crc_status_vals[] = static const value_string crc_status_vals[] =
{ {
{ 0, "CRC Status Failed"}, { 0, "Failed"},
{ 1, "CRC Status OK"}, { 1, "OK"},
{ 0, NULL } { 0, NULL }
}; };
static const value_string dci_format_vals[] =
{
{ 0, "0"},
{ 1, "1"},
{ 2, "1A"},
{ 3, "1B"},
{ 4, "1C"},
{ 5, "1D"},
{ 6, "2"},
{ 7, "2A"},
{ 8, "3/3A"},
{ 0, NULL }
};
static const value_string aggregation_level_vals[] =
{
{ 0, "1"},
{ 1, "2"},
{ 2, "4"},
{ 3, "8"},
{ 0, NULL }
};
static const value_string modulation_type_vals[] =
{
{ 2, "QPSK"},
{ 4, "QAM16"},
{ 6, "QAM64"},
{ 0, NULL }
};
#define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 0x1c #define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 0x1c
#define TIMING_ADVANCE_LCID 0x1d #define TIMING_ADVANCE_LCID 0x1d
@ -476,7 +526,7 @@ static gboolean global_mac_lte_attempt_rrc_decode = TRUE;
static gboolean global_mac_lte_dissect_crc_failures = FALSE; static gboolean global_mac_lte_dissect_crc_failures = FALSE;
/* Whether should attempt to decode lcid 1&2 SDUs as srb1/2 (i.e. AM RLC) */ /* Whether should attempt to decode lcid 1&2 SDUs as srb1/2 (i.e. AM RLC) */
static gboolean global_mac_lte_attempt_srb_decode = FALSE; static gboolean global_mac_lte_attempt_srb_decode = TRUE;
/* Whether should attempt to detect and flag DL HARQ resends */ /* Whether should attempt to detect and flag DL HARQ resends */
static gboolean global_mac_lte_attempt_dl_harq_resend_detect = TRUE; static gboolean global_mac_lte_attempt_dl_harq_resend_detect = TRUE;
@ -490,8 +540,12 @@ static gint global_mac_lte_bsr_warn_threshold = 50; /* default is 19325 -> 22624
/* Whether or not to track SRs and related frames */ /* Whether or not to track SRs and related frames */
static gboolean global_mac_lte_track_sr = TRUE; static gboolean global_mac_lte_track_sr = TRUE;
/* Whether or not to show RLC PDU info in info column */ /* Which layer info to show in the info column */
static gboolean global_mac_lte_show_rlc_info_column = FALSE; enum layer_to_show {
ShowPHYLayer, ShowMACLayer, ShowRLCLayer
};
static gint global_mac_lte_layer_to_show = (gint)ShowRLCLayer;
static guint8 s_number_of_rlc_pdus_shown = 0; static guint8 s_number_of_rlc_pdus_shown = 0;
@ -805,6 +859,15 @@ static gboolean dissect_mac_lte_heur(tvbuff_t *tvb, packet_info *pinfo,
/* Read fixed fields */ /* Read fixed fields */
p_mac_lte_info->radioType = tvb_get_guint8(tvb, offset++); p_mac_lte_info->radioType = tvb_get_guint8(tvb, offset++);
p_mac_lte_info->direction = tvb_get_guint8(tvb, offset++); p_mac_lte_info->direction = tvb_get_guint8(tvb, offset++);
/* TODO: add this info to framing protocol */
if (p_mac_lte_info->direction == DIRECTION_UPLINK) {
p_mac_lte_info->detailed_phy_info.ul_info.present = FALSE;
}
else {
p_mac_lte_info->detailed_phy_info.dl_info.present = FALSE;
}
p_mac_lte_info->rntiType = tvb_get_guint8(tvb, offset++); p_mac_lte_info->rntiType = tvb_get_guint8(tvb, offset++);
/* Read optional fields */ /* Read optional fields */
@ -834,7 +897,7 @@ static gboolean dissect_mac_lte_heur(tvbuff_t *tvb, packet_info *pinfo,
break; break;
case MAC_LTE_CRC_STATUS_TAG: case MAC_LTE_CRC_STATUS_TAG:
p_mac_lte_info->crcStatusValid = TRUE; p_mac_lte_info->crcStatusValid = TRUE;
p_mac_lte_info->crcStatus = tvb_get_guint8(tvb, offset); p_mac_lte_info->detailed_phy_info.dl_info.crc_status = tvb_get_guint8(tvb, offset);
offset++; offset++;
break; break;
@ -865,10 +928,10 @@ static gboolean dissect_mac_lte_heur(tvbuff_t *tvb, packet_info *pinfo,
/* Write the given formatted text to: /* Write the given formatted text to:
- the info column - the info column (if pinfo != NULL)
- the top-level MAC PDU item - 1 or 2 other labels (optional)
- another subtree item (if supplied) */ */
static void write_pdu_label_and_info(proto_item *pdu_ti, proto_item *sub_ti, static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2,
packet_info *pinfo, const char *format, ...) packet_info *pinfo, const char *format, ...)
{ {
#define MAX_INFO_BUFFER 256 #define MAX_INFO_BUFFER 256
@ -881,13 +944,150 @@ static void write_pdu_label_and_info(proto_item *pdu_ti, proto_item *sub_ti,
va_end(ap); va_end(ap);
/* Add to indicated places */ /* Add to indicated places */
col_append_str(pinfo->cinfo, COL_INFO, info_buffer); if (pinfo != NULL) {
proto_item_append_text(pdu_ti, "%s", info_buffer); col_append_str(pinfo->cinfo, COL_INFO, info_buffer);
if (sub_ti != NULL) { }
proto_item_append_text(sub_ti, "%s", info_buffer); if (ti1 != NULL) {
proto_item_append_text(ti1, "%s", info_buffer);
}
if (ti2 != NULL) {
proto_item_append_text(ti2, "%s", info_buffer);
} }
} }
/* Show extra PHY parameters (if present) */
static void show_extra_phy_parameters(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree,
struct mac_lte_info *p_mac_lte_info)
{
proto_item *phy_ti;
proto_tree *phy_tree;
proto_item *ti;
if (p_mac_lte_info->direction == DIRECTION_UPLINK) {
if (p_mac_lte_info->detailed_phy_info.ul_info.present) {
/* Create root */
phy_ti = proto_tree_add_string_format(tree, hf_mac_lte_context_phy_ul,
tvb, 0, 0, "", "UL PHY Context");
phy_tree = proto_item_add_subtree(phy_ti, ett_mac_lte_phy_context);
PROTO_ITEM_SET_GENERATED(phy_ti);
/* Add items */
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_modulation_type,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.ul_info.modulation_type);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_tbs_index,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.ul_info.tbs_index);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_resource_block_length,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_resource_block_start,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start);
PROTO_ITEM_SET_GENERATED(ti);
proto_item_append_text(phy_ti, " (");
write_pdu_label_and_info(phy_ti, NULL,
(global_mac_lte_layer_to_show == ShowPHYLayer) ? pinfo : NULL,
"%s Tbs_Index=%u RB_len=%u RB_start=%u)",
val_to_str_const(p_mac_lte_info->detailed_phy_info.ul_info.modulation_type,
modulation_type_vals, "Unknown"),
p_mac_lte_info->detailed_phy_info.ul_info.tbs_index,
p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length,
p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start);
proto_item_append_text(phy_ti, ")");
/* Don't want columns to be replaced now */
if (global_mac_lte_layer_to_show == ShowPHYLayer) {
col_set_writable(pinfo->cinfo, FALSE);
}
}
}
else {
if (p_mac_lte_info->detailed_phy_info.dl_info.present) {
/* Create root */
phy_ti = proto_tree_add_string_format(tree, hf_mac_lte_context_phy_dl,
tvb, 0, 0, "", "DL PHY Context");
phy_tree = proto_item_add_subtree(phy_ti, ett_mac_lte_phy_context);
PROTO_ITEM_SET_GENERATED(phy_ti);
/* Add items */
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_dci_format,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.dci_format);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_resource_allocation_type,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_aggregation_level,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_mcs_index,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.mcs_index);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_redundancy_version_index,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_boolean(phy_tree, hf_mac_lte_context_phy_dl_retx,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.retx);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_resource_block_length,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length);
PROTO_ITEM_SET_GENERATED(ti);
ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_crc_status,
tvb, 0, 0,
p_mac_lte_info->detailed_phy_info.dl_info.crc_status);
PROTO_ITEM_SET_GENERATED(ti);
proto_item_append_text(phy_ti, " (");
write_pdu_label_and_info(phy_ti, NULL,
(global_mac_lte_layer_to_show == ShowPHYLayer) ? pinfo : NULL,
"DCI_Format=%s Res_Alloc=%u Aggr_Level=%s MCS=%u RV=%u ReTx=%u "
"Res_Block_len=%u CRC_status=%s",
val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.dci_format,
dci_format_vals, "Unknown"),
p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type,
val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level,
aggregation_level_vals, "Unknown"),
p_mac_lte_info->detailed_phy_info.dl_info.mcs_index,
p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index,
p_mac_lte_info->detailed_phy_info.dl_info.retx,
p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length,
val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status,
crc_status_vals, "Unknown"));
proto_item_append_text(phy_ti, ")");
/* Don't want columns to be replaced now */
if (global_mac_lte_layer_to_show == ShowPHYLayer) {
col_set_writable(pinfo->cinfo, FALSE);
}
}
}
}
/* Dissect a single Random Access Reponse body */ /* Dissect a single Random Access Reponse body */
@ -1061,7 +1261,7 @@ static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro
write_pdu_label_and_info(pdu_ti, rar_header_ti, pinfo, write_pdu_label_and_info(pdu_ti, rar_header_ti, pinfo,
"(Backoff Indicator=%sms)", "(Backoff Indicator=%sms)",
val_to_str(backoff_indicator, rar_bi_vals, "Illegal-value ")); val_to_str_const(backoff_indicator, rar_bi_vals, "Illegal-value "));
/* If present, it must be the first subheader */ /* If present, it must be the first subheader */
if (number_of_rars > 0) { if (number_of_rars > 0) {
@ -1092,7 +1292,7 @@ static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pro
proto_item_append_text(rar_headers_ti, " (%u RARs", number_of_rars); proto_item_append_text(rar_headers_ti, " (%u RARs", number_of_rars);
if (backoff_indicator_seen) { if (backoff_indicator_seen) {
proto_item_append_text(rar_headers_ti, ", BI=%sms)", proto_item_append_text(rar_headers_ti, ", BI=%sms)",
val_to_str(backoff_indicator, rar_bi_vals, "Illegal-value ")); val_to_str_const(backoff_indicator, rar_bi_vals, "Illegal-value "));
} }
else { else {
proto_item_append_text(rar_headers_ti, ")"); proto_item_append_text(rar_headers_ti, ")");
@ -1130,9 +1330,9 @@ static void dissect_bch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
write_pdu_label_and_info(pdu_ti, NULL, pinfo, write_pdu_label_and_info(pdu_ti, NULL, pinfo,
"BCH PDU (%u bytes, on %s transport) ", "BCH PDU (%u bytes, on %s transport) ",
tvb_length_remaining(tvb, offset), tvb_length_remaining(tvb, offset),
val_to_str(p_mac_lte_info->rntiType, val_to_str_const(p_mac_lte_info->rntiType,
bch_transport_channel_vals, bch_transport_channel_vals,
"Unknown")); "Unknown"));
/* Show which transport layer it came in on (inferred from RNTI type) */ /* Show which transport layer it came in on (inferred from RNTI type) */
@ -1301,7 +1501,7 @@ static void call_rlc_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
/* Store info in packet */ /* Store info in packet */
p_add_proto_data(pinfo->fd, proto_rlc_lte, p_rlc_lte_info); p_add_proto_data(pinfo->fd, proto_rlc_lte, p_rlc_lte_info);
if (!global_mac_lte_show_rlc_info_column) { if (global_mac_lte_layer_to_show != ShowRLCLayer) {
/* Don't want these columns replaced */ /* Don't want these columns replaced */
col_set_writable(pinfo->cinfo, FALSE); col_set_writable(pinfo->cinfo, FALSE);
} }
@ -1740,13 +1940,13 @@ static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree _U_,
case InvalidSREvent: case InvalidSREvent:
ti = proto_tree_add_none_format(tree, hf_mac_lte_sr_invalid_event, ti = proto_tree_add_none_format(tree, hf_mac_lte_sr_invalid_event,
tvb, 0, 0, "Invalid SR event - state=(%s), event=(%s)", tvb, 0, 0, "Invalid SR event - state=(%s), event=(%s)",
val_to_str(result->status, sr_status_vals, "Unknown"), val_to_str_const(result->status, sr_status_vals, "Unknown"),
val_to_str(result->event, sr_event_vals, "Unknown")); val_to_str_const(result->event, sr_event_vals, "Unknown"));
PROTO_ITEM_SET_GENERATED(ti); PROTO_ITEM_SET_GENERATED(ti);
expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_ERROR, expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_ERROR,
"Invalid SR event - state=(%s), event=(%s)", "Invalid SR event - state=(%s), event=(%s)",
val_to_str(result->status, sr_status_vals, "Unknown"), val_to_str_const(result->status, sr_status_vals, "Unknown"),
val_to_str(result->event, sr_event_vals, "Unknown")); val_to_str_const(result->event, sr_event_vals, "Unknown"));
break; break;
} }
@ -1877,16 +2077,16 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
tvb, offset, 1, FALSE); tvb, offset, 1, FALSE);
write_pdu_label_and_info(pdu_ti, NULL, pinfo, write_pdu_label_and_info(pdu_ti, NULL, pinfo,
"(%s", "(%s",
val_to_str(lcids[number_of_headers], val_to_str_const(lcids[number_of_headers],
ulsch_lcid_vals, "(Unknown LCID)")); ulsch_lcid_vals, "(Unknown LCID)"));
} }
else { else {
lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_dlsch_lcid, lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_dlsch_lcid,
tvb, offset, 1, FALSE); tvb, offset, 1, FALSE);
write_pdu_label_and_info(pdu_ti, NULL, pinfo, write_pdu_label_and_info(pdu_ti, NULL, pinfo,
"(%s", "(%s",
val_to_str(lcids[number_of_headers], val_to_str_const(lcids[number_of_headers],
dlsch_lcid_vals, "(Unknown LCID)")); dlsch_lcid_vals, "(Unknown LCID)"));
} }
offset++; offset++;
@ -1974,11 +2174,11 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
/* Append summary to subheader root */ /* Append summary to subheader root */
proto_item_append_text(pdu_subheader_ti, " (lcid=%s", proto_item_append_text(pdu_subheader_ti, " (lcid=%s",
val_to_str(lcids[number_of_headers], val_to_str_const(lcids[number_of_headers],
(direction == DIRECTION_UPLINK) ? (direction == DIRECTION_UPLINK) ?
ulsch_lcid_vals : ulsch_lcid_vals :
dlsch_lcid_vals, dlsch_lcid_vals,
"Unknown")); "Unknown"));
switch (pdu_lengths[number_of_headers]) { switch (pdu_lengths[number_of_headers]) {
case -1: case -1:
@ -1995,11 +2195,8 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
/* Flag unknown lcid values in expert info */ /* Flag unknown lcid values in expert info */
if (strncmp(val_to_str(lcids[number_of_headers], if (match_strval(lcids[number_of_headers],
(direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals) == NULL) {
"Unknown"),
"Unknown",
sizeof("Unknown")) == 0) {
expert_add_info_format(pinfo, pdu_subheader_ti, PI_MALFORMED, PI_ERROR, expert_add_info_format(pinfo, pdu_subheader_ti, PI_MALFORMED, PI_ERROR,
"Unexpected LCID received (%u)", lcids[number_of_headers]); "Unexpected LCID received (%u)", lcids[number_of_headers]);
} }
@ -2207,7 +2404,8 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
tvb, offset, 1, FALSE); tvb, offset, 1, FALSE);
/* Show value in root label */ /* Show value in root label */
proto_item_append_text(phr_ti, " (%s)", val_to_str(level, power_headroom_size_vals, "Unknown")); proto_item_append_text(phr_ti, " (%s)",
val_to_str_const(level, power_headroom_size_vals, "Unknown"));
offset++; offset++;
} }
@ -2248,13 +2446,13 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
"UE %u - BSR for LCG %u exceeds threshold: %u (%s)", "UE %u - BSR for LCG %u exceeds threshold: %u (%s)",
p_mac_lte_info->ueid, p_mac_lte_info->ueid,
lcgid, lcgid,
buffer_size, val_to_str(buffer_size, buffer_size_vals, "Unknown")); buffer_size, val_to_str_const(buffer_size, buffer_size_vals, "Unknown"));
} }
proto_item_append_text(bsr_ti, " (lcgid=%u %s)", proto_item_append_text(bsr_ti, " (lcgid=%u %s)",
lcgid, lcgid,
val_to_str(buffer_size, buffer_size_vals, "Unknown")); val_to_str_const(buffer_size, buffer_size_vals, "Unknown"));
} }
break; break;
case LONG_BSR_LCID: case LONG_BSR_LCID:
@ -2278,7 +2476,7 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN,
"UE %u - BSR for LCG 0 exceeds threshold: %u (%s)", "UE %u - BSR for LCG 0 exceeds threshold: %u (%s)",
p_mac_lte_info->ueid, p_mac_lte_info->ueid,
buffer_size[0], val_to_str(buffer_size[0], buffer_size_vals, "Unknown")); buffer_size[0], val_to_str_const(buffer_size[0], buffer_size_vals, "Unknown"));
} }
/* LCID Group 1 */ /* LCID Group 1 */
@ -2290,7 +2488,7 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN,
"UE %u - BSR for LCG 1 exceeds threshold: %u (%s)", "UE %u - BSR for LCG 1 exceeds threshold: %u (%s)",
p_mac_lte_info->ueid, p_mac_lte_info->ueid,
buffer_size[1], val_to_str(buffer_size[1], buffer_size_vals, "Unknown")); buffer_size[1], val_to_str_const(buffer_size[1], buffer_size_vals, "Unknown"));
} }
/* LCID Group 2 */ /* LCID Group 2 */
@ -2303,7 +2501,7 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN,
"UE %u - BSR for LCG 2 exceeds threshold: %u (%s)", "UE %u - BSR for LCG 2 exceeds threshold: %u (%s)",
p_mac_lte_info->ueid, p_mac_lte_info->ueid,
buffer_size[2], val_to_str(buffer_size[2], buffer_size_vals, "Unknown")); buffer_size[2], val_to_str_const(buffer_size[2], buffer_size_vals, "Unknown"));
} }
/* LCID Group 3 */ /* LCID Group 3 */
@ -2315,15 +2513,15 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN,
"UE %u - BSR for LCG 3 exceeds threshold: %u (%s)", "UE %u - BSR for LCG 3 exceeds threshold: %u (%s)",
p_mac_lte_info->ueid, p_mac_lte_info->ueid,
buffer_size[3], val_to_str(buffer_size[3], buffer_size_vals, "Unknown")); buffer_size[3], val_to_str_const(buffer_size[3], buffer_size_vals, "Unknown"));
} }
/* Append summary to parent */ /* Append summary to parent */
proto_item_append_text(bsr_ti, " 0:(%s) 1:(%s) 2:(%s) 3:(%s)", proto_item_append_text(bsr_ti, " 0:(%s) 1:(%s) 2:(%s) 3:(%s)",
val_to_str(buffer_size[0], buffer_size_vals, "Unknown"), val_to_str_const(buffer_size[0], buffer_size_vals, "Unknown"),
val_to_str(buffer_size[1], buffer_size_vals, "Unknown"), val_to_str_const(buffer_size[1], buffer_size_vals, "Unknown"),
val_to_str(buffer_size[2], buffer_size_vals, "Unknown"), val_to_str_const(buffer_size[2], buffer_size_vals, "Unknown"),
val_to_str(buffer_size[3], buffer_size_vals, "Unknown")); val_to_str_const(buffer_size[3], buffer_size_vals, "Unknown"));
} }
break; break;
case PADDING_LCID: case PADDING_LCID:
@ -2377,11 +2575,11 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
sdu_ti = proto_tree_add_bytes_format(tree, hf_mac_lte_sch_sdu, tvb, offset, pdu_lengths[n], sdu_ti = proto_tree_add_bytes_format(tree, hf_mac_lte_sch_sdu, tvb, offset, pdu_lengths[n],
tvb_get_ptr(tvb, offset, pdu_lengths[n]), tvb_get_ptr(tvb, offset, pdu_lengths[n]),
"SDU (%s, length=%u bytes): ", "SDU (%s, length=%u bytes): ",
val_to_str(lcids[n], val_to_str_const(lcids[n],
(direction == DIRECTION_UPLINK) ? (direction == DIRECTION_UPLINK) ?
ulsch_lcid_vals : ulsch_lcid_vals :
dlsch_lcid_vals, dlsch_lcid_vals,
"Unknown"), "Unknown"),
data_length); data_length);
/* Show bytes too. There must be a nicer way of doing this! */ /* Show bytes too. There must be a nicer way of doing this! */
pdu_data = tvb_get_ptr(tvb, offset, pdu_lengths[n]); pdu_data = tvb_get_ptr(tvb, offset, pdu_lengths[n]);
@ -2552,8 +2750,8 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree
if (!is_truncated && (offset < p_mac_lte_info->length)) { if (!is_truncated && (offset < p_mac_lte_info->length)) {
/* There is a problem if we haven't used all of the PDU */ /* There is a problem if we haven't used all of the PDU */
expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR,
"MAC PDU is shorter than reported length (reported=%u, actual=%u)", "DL PDU for UE %u is shorter than reported length (reported=%u, actual=%u)",
p_mac_lte_info->length, offset); p_mac_lte_info->ueid, p_mac_lte_info->length, offset);
} }
} }
@ -2761,9 +2959,9 @@ void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (p_mac_lte_info->crcStatusValid) { if (p_mac_lte_info->crcStatusValid) {
ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_crc_status, ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_crc_status,
tvb, 0, 0, p_mac_lte_info->crcStatus); tvb, 0, 0, p_mac_lte_info->detailed_phy_info.dl_info.crc_status);
PROTO_ITEM_SET_GENERATED(ti); PROTO_ITEM_SET_GENERATED(ti);
if (p_mac_lte_info->crcStatus != TRUE) { if (p_mac_lte_info->detailed_phy_info.dl_info.crc_status != TRUE) {
expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
"%s Frame has CRC error", "%s Frame has CRC error",
(p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL"); (p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL");
@ -2771,12 +2969,16 @@ void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
"%s: <CRC FAILURE> UEId=%u %s=%u ", "%s: <CRC FAILURE> UEId=%u %s=%u ",
(p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL", (p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL",
p_mac_lte_info->ueid, p_mac_lte_info->ueid,
val_to_str(p_mac_lte_info->rntiType, rnti_type_vals, val_to_str_const(p_mac_lte_info->rntiType, rnti_type_vals,
"Unknown RNTI type"), "Unknown RNTI type"),
p_mac_lte_info->rnti); p_mac_lte_info->rnti);
} }
} }
/* May also have extra Physical layer attributes set for this frame */
show_extra_phy_parameters(pinfo, tvb, mac_lte_tree, p_mac_lte_info);
/* Set context-info parts of tap struct */ /* Set context-info parts of tap struct */
tap_info.rnti = p_mac_lte_info->rnti; tap_info.rnti = p_mac_lte_info->rnti;
tap_info.ueid = p_mac_lte_info->ueid; tap_info.ueid = p_mac_lte_info->ueid;
@ -2784,7 +2986,7 @@ void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
tap_info.isPredefinedData = p_mac_lte_info->isPredefinedData; tap_info.isPredefinedData = p_mac_lte_info->isPredefinedData;
tap_info.isULRetx = (p_mac_lte_info->reTxCount >= 1); tap_info.isULRetx = (p_mac_lte_info->reTxCount >= 1);
tap_info.crcStatusValid = p_mac_lte_info->crcStatusValid; tap_info.crcStatusValid = p_mac_lte_info->crcStatusValid;
tap_info.crcStatus = p_mac_lte_info->crcStatus; tap_info.crcStatus = p_mac_lte_info->detailed_phy_info.dl_info.crc_status;
tap_info.direction = p_mac_lte_info->direction; tap_info.direction = p_mac_lte_info->direction;
/* Also set total number of bytes (won't be used for UL/DL-SCH) */ /* Also set total number of bytes (won't be used for UL/DL-SCH) */
@ -2807,7 +3009,7 @@ void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* IF CRC status failed, just do decode as raw bytes */ /* IF CRC status failed, just do decode as raw bytes */
if (!global_mac_lte_dissect_crc_failures && if (!global_mac_lte_dissect_crc_failures &&
(p_mac_lte_info->crcStatusValid && !p_mac_lte_info->crcStatus)) { (p_mac_lte_info->crcStatusValid && !p_mac_lte_info->detailed_phy_info.dl_info.crc_status)) {
proto_tree_add_item(mac_lte_tree, hf_mac_lte_raw_pdu, tvb, offset, -1, FALSE); proto_tree_add_item(mac_lte_tree, hf_mac_lte_raw_pdu, tvb, offset, -1, FALSE);
write_pdu_label_and_info(pdu_ti, NULL, pinfo, "Raw data (%u bytes)", tvb_length_remaining(tvb, offset)); write_pdu_label_and_info(pdu_ti, NULL, pinfo, "Raw data (%u bytes)", tvb_length_remaining(tvb, offset));
@ -3027,6 +3229,94 @@ void proto_register_mac_lte(void)
} }
}, },
/* Extra PHY context */
{ &hf_mac_lte_context_phy_ul,
{ "UL PHY attributes",
"mac-lte.ul-phy", FT_STRING, BASE_NONE, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_ul_modulation_type,
{ "Modulation type",
"mac-lte.ul-phy.modulation-type", FT_UINT8, BASE_DEC, VALS(modulation_type_vals), 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_ul_tbs_index,
{ "TBs Index",
"mac-lte.ul-phy.tbs-index", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_ul_resource_block_length,
{ "Resource Block Length",
"mac-lte.ul-phy.resource-block-length", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_ul_resource_block_start,
{ "Resource Block Start",
"mac-lte.ul-phy.resource-block-start", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl,
{ "DL PHY attributes",
"mac-lte.dl-phy", FT_STRING, BASE_NONE, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_dci_format,
{ "DCI format",
"mac-lte.dl-phy.dci-format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_resource_allocation_type,
{ "Resource Allocation Type",
"mac-lte.dl-phy.resource-allocation-type", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_aggregation_level,
{ "Aggregation Level",
"mac-lte.dl-phy.aggregation-level", FT_UINT8, BASE_DEC, VALS(aggregation_level_vals), 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_mcs_index,
{ "MCS Index",
"mac-lte.dl-phy.mcs-index", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_redundancy_version_index,
{ "RV Index",
"mac-lte.dl-phy.rv-index", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_retx,
{ "DL Retx",
"mac-lte.dl-phy.retx", FT_BOOLEAN, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_resource_block_length,
{ "RB Length",
"mac-lte.dl-phy.rb-length", FT_UINT8, BASE_DEC, 0, 0x0,
NULL, HFILL
}
},
{ &hf_mac_lte_context_phy_dl_crc_status,
{ "CRC Status",
"mac-lte.dl-phy.crc-status", FT_UINT8, BASE_DEC, VALS(crc_status_vals), 0x0,
NULL, HFILL
}
},
/* Out-of-band events */ /* Out-of-band events */
{ &hf_mac_lte_oob_send_preamble, { &hf_mac_lte_oob_send_preamble,
{ "RACH Preamble sent", { "RACH Preamble sent",
@ -3476,6 +3766,7 @@ void proto_register_mac_lte(void)
{ {
&ett_mac_lte, &ett_mac_lte,
&ett_mac_lte_context, &ett_mac_lte_context,
&ett_mac_lte_phy_context,
&ett_mac_lte_rar_headers, &ett_mac_lte_rar_headers,
&ett_mac_lte_rar_header, &ett_mac_lte_rar_header,
&ett_mac_lte_rar_body, &ett_mac_lte_rar_body,
@ -3490,6 +3781,13 @@ void proto_register_mac_lte(void)
&ett_mac_lte_power_headroom &ett_mac_lte_power_headroom
}; };
static enum_val_t show_info_col_vals[] = {
{"show-phy", "PHY Info", ShowPHYLayer},
{"show-mac", "MAC Info", ShowMACLayer},
{"show-rlc", "RLC Info", ShowRLCLayer},
{NULL, NULL, -1}
};
module_t *mac_lte_module; module_t *mac_lte_module;
static uat_field_t lcid_drb_mapping_flds[] = { static uat_field_t lcid_drb_mapping_flds[] = {
@ -3517,7 +3815,8 @@ void proto_register_mac_lte(void)
prefs_register_obsolete_preference(mac_lte_module, "single_rar"); prefs_register_obsolete_preference(mac_lte_module, "single_rar");
prefs_register_obsolete_preference(mac_lte_module, "check_reserved_bits"); prefs_register_obsolete_preference(mac_lte_module, "check_reserved_bits");
prefs_register_obsolete_preference(mac_lte_module, "decode_rar_ul_grant"); prefs_register_obsolete_preference(mac_lte_module, "decode_rar_ul_grant");
prefs_register_obsolete_preference(mac_lte_module, "show_rlc_info_column");
prefs_register_uint_preference(mac_lte_module, "retx_count_warn", prefs_register_uint_preference(mac_lte_module, "retx_count_warn",
"Number of Re-Transmits before expert warning triggered", "Number of Re-Transmits before expert warning triggered",
"Number of Re-Transmits before expert warning triggered", "Number of Re-Transmits before expert warning triggered",
@ -3584,10 +3883,10 @@ void proto_register_mac_lte(void)
"Track status of SRs, providing links between requests, failure indications and grants", "Track status of SRs, providing links between requests, failure indications and grants",
&global_mac_lte_track_sr); &global_mac_lte_track_sr);
prefs_register_bool_preference(mac_lte_module, "show_rlc_info_column", prefs_register_enum_preference(mac_lte_module, "layer_to_show",
"Show RLC PDUs in Info column", "Which layer info to show in Info column",
"When enabled, show RLC PDU info in info column, instead of MAC PDU info", "Can show PHY, MAC or RLC layer info in Info column",
&global_mac_lte_show_rlc_info_column); &global_mac_lte_layer_to_show, show_info_col_vals, FALSE);
register_init_routine(&mac_lte_init_protocol); register_init_routine(&mac_lte_init_protocol);
} }

View File

@ -87,8 +87,31 @@ typedef struct mac_lte_info
guint16 length; guint16 length;
guint8 reTxCount; guint8 reTxCount;
guint8 crcStatusValid; guint8 crcStatusValid;
guint8 crcStatus;
/* More Physical layer info (direction-specific) */
union {
struct mac_lte_ul_phy_info
{
guint8 present;
guint8 modulation_type;
guint8 tbs_index;
guint8 resource_block_length;
guint8 resource_block_start;
} ul_info;
struct mac_lte_dl_phy_info
{
guint8 present;
guint8 dci_format;
guint8 resource_allocation_type;
guint8 aggregation_level;
guint8 mcs_index;
guint8 redundancy_version_index;
guint8 retx;
guint8 resource_block_length;
guint8 crc_status;
} dl_info;
} detailed_phy_info;
/* Relating to out-of-band events */ /* Relating to out-of-band events */
mac_lte_oob_event oob_event; mac_lte_oob_event oob_event;
guint8 rapid; guint8 rapid;