aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rlc-lte.c
diff options
context:
space:
mode:
authorMartin Mathieson <martin.r.mathieson@googlemail.com>2012-01-22 02:55:47 +0000
committerMartin Mathieson <martin.r.mathieson@googlemail.com>2012-01-22 02:55:47 +0000
commit02e8a91a35c847cb41ae4a49e8d3683ed4f963c5 (patch)
treefd2f4d5d107ef1239eaaae2708814e4cac454896 /epan/dissectors/packet-rlc-lte.c
parent3751e782dd161807dbb3a1ee82ba859b01e6a175 (diff)
Various small tweaks to sequence analysis/re-assembly, plus implement
function to check for a frame being a retx as used by pdcp. svn path=/trunk/; revision=40648
Diffstat (limited to 'epan/dissectors/packet-rlc-lte.c')
-rw-r--r--epan/dissectors/packet-rlc-lte.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/epan/dissectors/packet-rlc-lte.c b/epan/dissectors/packet-rlc-lte.c
index e381ae2c24..c165a58a17 100644
--- a/epan/dissectors/packet-rlc-lte.c
+++ b/epan/dissectors/packet-rlc-lte.c
@@ -875,6 +875,7 @@ static void addChannelSequenceInfo(state_sequence_analysis_report_in_frame *p,
val_to_str_const(p_rlc_lte_info->direction, direction_vals, "Unknown"),
p_rlc_lte_info->ueid,
p->firstSN);
+ proto_item_append_text(seqnum_ti, " - MAC retx of SN %u", p->firstSN);
break;
case SN_Retx:
@@ -912,8 +913,7 @@ static void addChannelSequenceInfo(state_sequence_analysis_report_in_frame *p,
p->firstSN,
val_to_str_const(p_rlc_lte_info->direction, direction_vals, "Unknown"),
p_rlc_lte_info->ueid);
- proto_item_append_text(seqnum_ti, "- SN %u Repeated",
- p->firstSN);
+ proto_item_append_text(seqnum_ti, "- SN %u Repeated", p->firstSN);
break;
case SN_Missing:
@@ -943,8 +943,7 @@ static void addChannelSequenceInfo(state_sequence_analysis_report_in_frame *p,
p->firstSN,
val_to_str_const(p_rlc_lte_info->direction, direction_vals, "Unknown"),
p_rlc_lte_info->ueid);
- proto_item_append_text(seqnum_ti, " - SN missing (%u)",
- p->firstSN);
+ proto_item_append_text(seqnum_ti, " - SN missing (%u)", p->firstSN);
tap_info->missingSNs = 1;
}
break;
@@ -1155,10 +1154,8 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
tap_info, pinfo, tree, tvb);
return;
}
- else {
- /* Give up - we must have tried already... */
- return;
- }
+
+ /* Don't just give up here... */
}
@@ -1190,6 +1187,8 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
/* Create space for frame state_report */
p_report_in_frame = se_alloc(sizeof(state_sequence_analysis_report_in_frame));
+
+ /* Deal with according to channel mode */
switch (p_channel_status->rlcMode) {
case RLC_UM_MODE:
@@ -1299,6 +1298,10 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
if (!createdChannel) {
expectedSequenceNumber = (p_channel_status->previousSequenceNumber + 1) % 1024;
}
+ else {
+ /* Whatever we got is fine.. */
+ expectedSequenceNumber = sequenceNumber;
+ }
/* For AM, may be:
- expected Sequence number OR
@@ -1318,7 +1321,10 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
}
if (sequenceNumber != expectedSequenceNumber) {
- reassembly_destroy(p_channel_status);
+ /* Don't trash reassembly info if this looks like a close retx... */
+ if (((1024 + sequenceNumber - expectedSequenceNumber) % 1024) < 50) {
+ reassembly_destroy(p_channel_status);
+ }
}
/* Expected? */
@@ -1356,7 +1362,6 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
((number_of_segments > 1) || first_includes_start)) {
guint16 lastSegmentLength = tvb_length(tvb)-lastSegmentOffset;
-
if (global_rlc_lte_reassembly) {
reassembly_reset(p_channel_status);
reassembly_add_segment(p_channel_status, sequenceNumber,
@@ -1398,17 +1403,11 @@ static void checkChannelSequenceInfo(packet_info *pinfo, tvbuff_t *tvb,
}
else {
- if (!createdChannel) {
- /* Ahead of expected SN. Assume frames have been missed */
- p_report_in_frame->state = SN_Missing;
+ /* Ahead of expected SN. Assume frames have been missed */
+ p_report_in_frame->state = SN_Missing;
- p_report_in_frame->firstSN = expectedSequenceNumber;
- p_report_in_frame->lastSN = (1024 + sequenceNumber-1) % 1024;
- }
- else {
- /* The log may not contain the very first SNs for this channel, so be forgiving... */
- p_report_in_frame->state = SN_OK;
- }
+ p_report_in_frame->firstSN = expectedSequenceNumber;
+ p_report_in_frame->lastSN = (1024 + sequenceNumber-1) % 1024;
/* Update channel state - forget about missed SNs */
p_report_in_frame->sequenceExpected = expectedSequenceNumber;
@@ -2426,6 +2425,21 @@ static gboolean dissect_rlc_lte_heur(tvbuff_t *tvb, packet_info *pinfo,
return TRUE;
}
+/* Return TRUE if the given packet is thought to be a retx */
+int is_rlc_lte_frame_retx(packet_info *pinfo, guint8 direction)
+{
+ if (is_mac_lte_frame_retx(pinfo, direction)) {
+ return TRUE;
+ }
+ else {
+ state_sequence_analysis_report_in_frame *p_report =
+ (state_sequence_analysis_report_in_frame*)g_hash_table_lookup(rlc_lte_frame_sequence_analysis_report_hash,
+ &pinfo->fd->num);
+ return (p_report->state != SN_OK);
+ }
+}
+
+
/*****************************/
/* Main dissection function. */