sctp: fasthandoff with ASCONF at mobile-node
Fast retransmission after changing the last address with ASCONF negotiation Signed-off-by: Michio Honda <micchie@sfc.wide.ad.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8ce120f118
commit
ddc4bbee6e
|
@ -1085,6 +1085,7 @@ void sctp_transport_burst_reset(struct sctp_transport *);
|
||||||
unsigned long sctp_transport_timeout(struct sctp_transport *);
|
unsigned long sctp_transport_timeout(struct sctp_transport *);
|
||||||
void sctp_transport_reset(struct sctp_transport *);
|
void sctp_transport_reset(struct sctp_transport *);
|
||||||
void sctp_transport_update_pmtu(struct sctp_transport *, u32);
|
void sctp_transport_update_pmtu(struct sctp_transport *, u32);
|
||||||
|
void sctp_transport_immediate_rtx(struct sctp_transport *);
|
||||||
|
|
||||||
|
|
||||||
/* This is the structure we use to queue packets as they come into
|
/* This is the structure we use to queue packets as they come into
|
||||||
|
|
|
@ -3400,8 +3400,10 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
|
||||||
asconf_len -= length;
|
asconf_len -= length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (no_err && asoc->src_out_of_asoc_ok)
|
if (no_err && asoc->src_out_of_asoc_ok) {
|
||||||
asoc->src_out_of_asoc_ok = 0;
|
asoc->src_out_of_asoc_ok = 0;
|
||||||
|
sctp_transport_immediate_rtx(asoc->peer.primary_path);
|
||||||
|
}
|
||||||
|
|
||||||
/* Free the cached last sent asconf chunk. */
|
/* Free the cached last sent asconf chunk. */
|
||||||
list_del_init(&asconf->transmitted_list);
|
list_del_init(&asconf->transmitted_list);
|
||||||
|
|
|
@ -641,3 +641,19 @@ void sctp_transport_reset(struct sctp_transport *t)
|
||||||
t->cacc.next_tsn_at_change = 0;
|
t->cacc.next_tsn_at_change = 0;
|
||||||
t->cacc.cacc_saw_newack = 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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue