Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddc4bbee authored by Michio Honda's avatar Michio Honda Committed by David S. Miller
Browse files

sctp: fasthandoff with ASCONF at mobile-node



Fast retransmission after changing the last address
with ASCONF negotiation

Signed-off-by: default avatarMichio Honda <micchie@sfc.wide.ad.jp>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8ce120f1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+3 −1
Original line number Diff line number Diff line
@@ -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);
+16 −0
Original line number Diff line number Diff line
@@ -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;
}