Skip to content

Commit

Permalink
sctp: fasthandoff with ASCONF at mobile-node
Browse files Browse the repository at this point in the history
Fast retransmission after changing the last address
with ASCONF negotiation

Signed-off-by: Michio Honda <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
micchie authored and davem330 committed Nov 8, 2011
1 parent 8ce120f commit ddc4bbe
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/net/sctp/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1085,6 +1085,7 @@ void sctp_transport_burst_reset(struct sctp_transport *);
unsigned long sctp_transport_timeout(struct sctp_transport *);
void sctp_transport_reset(struct sctp_transport *);
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
Expand Down
4 changes: 3 additions & 1 deletion net/sctp/sm_make_chunk.c
Original file line number Diff line number Diff line change
Expand Up @@ -3400,8 +3400,10 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
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;
sctp_transport_immediate_rtx(asoc->peer.primary_path);
}

/* Free the cached last sent asconf chunk. */
list_del_init(&asconf->transmitted_list);
Expand Down
16 changes: 16 additions & 0 deletions net/sctp/transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit ddc4bbe

Please sign in to comment.