From b88b7ce7983b64541a1172be2fe671a4cf608553 Mon Sep 17 00:00:00 2001 From: John Thacker Date: Mon, 31 Jan 2022 20:57:21 -0500 Subject: [PATCH] SCTP: Fix relative sequence number calculation first pass Calculate the relative sequence number correctly for the first data chunk of an association in the first pass. This fixes tshark display and fixes calculation of retransmissions if the first data chunk of an association is retransmitted. Fix #17917. --- epan/dissectors/packet-sctp.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/epan/dissectors/packet-sctp.c b/epan/dissectors/packet-sctp.c index 5f105d8425..13a7b58055 100644 --- a/epan/dissectors/packet-sctp.c +++ b/epan/dissectors/packet-sctp.c @@ -3332,7 +3332,7 @@ dissect_data_chunk(tvbuff_t *chunk_tvb, proto_tree *flags_tree; guint8 oct, e_bit, b_bit, u_bit; guint16 stream_id; - guint32 tsn, ppid, stream_seq_num = 0; + guint32 tsn, rawtsn, ppid, stream_seq_num = 0; proto_item *tsn_item = NULL; gboolean call_subdissector = FALSE; gboolean is_retransmission; @@ -3376,9 +3376,13 @@ dissect_data_chunk(tvbuff_t *chunk_tvb, b_bit = oct & SCTP_DATA_CHUNK_B_BIT; u_bit = oct & SCTP_DATA_CHUNK_U_BIT; - tsn = tvb_get_ntohl(chunk_tvb, DATA_CHUNK_TSN_OFFSET); - if((show_relative_tsns) && (ha)) { - tsn -= ha->first_tsn; + tsn = rawtsn = tvb_get_ntohl(chunk_tvb, DATA_CHUNK_TSN_OFFSET); + if ((show_relative_tsns) && (ha)) { + if (!ha->started) { + ha->first_tsn = tsn; + ha->started = TRUE; + } + tsn -= ha->first_tsn; } col_append_fstr(pinfo->cinfo, COL_INFO, "(TSN=%" PRIu32 ") ", tsn); @@ -3446,7 +3450,7 @@ dissect_data_chunk(tvbuff_t *chunk_tvb, chunk_length - DATA_CHUNK_HEADER_LENGTH, plurality(chunk_length - DATA_CHUNK_HEADER_LENGTH, "", "s")); } - is_retransmission = sctp_tsn(pinfo, chunk_tvb, tsn_item, ha, tsn); + is_retransmission = sctp_tsn(pinfo, chunk_tvb, tsn_item, ha, rawtsn); if (is_idata) { header_length = I_DATA_CHUNK_HEADER_LENGTH;