Fixed
Created: Feb 12, 2014
Updated: Dec 3, 2018
Resolved Date: Mar 16, 2014
Previous ID: LIN5-17993
Found In Version: 6.0
Fix Version: 6.0.0.11
Severity: Severe
Applicable for: Wind River Linux 6
Component/s: Networking
After association is up and many data packets are exchanged RTO used is RTO.Initial.
Attached is the pcap of the issue.
In this association we have used,
RTO.Max = 10,000 milli sec
RTO.Min = 500 milli sec
RTO.Initial = 5,000 milli sec
Before the sending packet 21, path to destination 10.63.20.124 is broken, Its getting re-transmitted to secondary path after 5 seconds with is RTO.Initial. If we calculate the RTO, it should come around 500 milli sec.
We further continued the analysis and found the issue in the code.
In the function sctp_packet_transmit, variable chunk->resent is getting set for the first when the chunk is sent, instead it should be set for first re-transmission.
Below is the snippet of the code.
File: output.c
Function : sctp_packet_transmit
if (!tp->rto_pending) {
chunk->rtt_in_progress = 1;
tp->rto_pending = 1;
}
chunk->resent = 1;
}
If chunk->resent variable is set, In function sctp_check_transmitted, sctp_transport_update_rto function is never called.
Below is the code snippet.
File: outqueue.c
function: sctp_check_transmitted
if (!tchunk->tsn_gap_acked &&
!tchunk->resent &&
tchunk->rtt_in_progress) {
tchunk->rtt_in_progress = 0;
rtt = jiffies - tchunk->sent_at;
sctp_transport_update_rto(transport,
rtt);
}