|
@@ -641,3 +641,19 @@ void sctp_transport_reset(struct sctp_transport *t)
|
|
|
t->cacc.next_tsn_at_change = 0;
|
|
|
t->cacc.cacc_saw_newack = 0;
|
|
|
}
|
|
|
+
|
|
|
+/* Schedule retransmission on the given transport */
|
|
|
+void sctp_transport_immediate_rtx(struct sctp_transport *t)
|
|
|
+{
|
|
|
+ /* Stop pending T3_rtx_timer */
|
|
|
+ if (timer_pending(&t->T3_rtx_timer)) {
|
|
|
+ (void)del_timer(&t->T3_rtx_timer);
|
|
|
+ sctp_transport_put(t);
|
|
|
+ }
|
|
|
+ sctp_retransmit(&t->asoc->outqueue, t, SCTP_RTXR_T3_RTX);
|
|
|
+ if (!timer_pending(&t->T3_rtx_timer)) {
|
|
|
+ if (!mod_timer(&t->T3_rtx_timer, jiffies + t->rto))
|
|
|
+ sctp_transport_hold(t);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+}
|