From: Wei Yongjun <yjwei@cn.fujitsu.com>
To: linux-sctp@vger.kernel.org
Subject: Re: [PATCH] sctp: Fix broken RTO-doubling for data retransmits
Date: Fri, 20 Feb 2009 01:18:18 +0000 [thread overview]
Message-ID: <499E04DA.3070806@cn.fujitsu.com> (raw)
In-Reply-To: <1235063487-9470-1-git-send-email-vladislav.yasevich@hp.com>
Vlad Yasevich wrote:
> Commit faee47cdbfe8d74a1573c2f81ea6dbb08d735be6
> (sctp: Fix the RTO-doubling on idle-link heartbeats)
> broke the RTO doubling for data retransmits. If the
> heartbeat was sent before the data T3-rtx time, the
> the RTO will not double upon the T3-rtx expiration.
> Distingish between the operations by passing an argument
> to the function.
>
Hi Vlad
I think we should talk about what the SCTP_CMD_TRANSPORT_RESET and
SCTP_CMD_HB_TIMER_UPDATE command do.
SCTP_CMD_TRANSPORT_RESET
--> sctp_cmd_transport_reset()
--> sctp_transport_lower_cwnd()
... transport->cwnd = XXX if timer expire
... partial_bytes_acked = 0;
--> sctp_do_8_2_transport_strike()
... asoc->overall_error_count++;
... transport->rto = XXX if not send HB
SCTP_CMD_HB_TIMER_UPDATE
--> sctp_cmd_hb_timer_update()
... mod_timer(&t->hb_timer, sctp_transport_timeout(t))
In sctp_sf_do_prm_requestheartbeat(), it used
SCTP_CMD_TRANSPORT_RESET command, not SCTP_CMD_HB_TIMER_UPDATE,
so if user request to send HB, the partial_bytes_acked will be clear,
and the overall_error_count be increased. And the heartbeat primitive
may not send HB, but only mark the transport state to SCTP_INACTIVE.
We user request to send HB immediately:
- the HB timer will be update, so HB will expires after
(HB_INTERVAL + RTO +/- 50% * RTO).
- the overall_error_count should not be increased. Because this is not
a idle-link heartbeat.
- the cwnd and partial_bytes_acked should not be changed.
Is this correct?
And after the patch I sent, used SCTP_CMD_HB_TIMER_UPDATE instead of
SCTP_CMD_TRANSPORT_RESET command. The action of idle-link heartbeat
and user initiated heartbeat are like this.
idle-link heartbeat:
Endpoint A Endpoint B
|
| idle
|
HEARTBEAT ----------->
| lower cwnd
| overall_error_count++
| RTO = RTO * 2
| expires HB_INTERVAL + RTO +/- 50% * RTO
HEARTBEAT ----------->
| lower cwnd
| overall_error_count++
| RTO = RTO * 2
| expires HB_INTERVAL + RTO +/- 50% * RTO
user initiated heartbeat
Endpoint A Endpoint B
|
|
|
HEARTBEAT -----------> (*) first HB
|
| reset hb_timer, not update RTO
|
HEARTBEAT ----------->
| lower cwnd
| overall_error_count++
| RTO = RTO * 2
| expires HB_INTERVAL + RTO +/- 50% * RTO
The different between two is that only reset the HB timer, the
other increased overall_error_count and lower cwnd. I agree with
reset the HB timer.
Regards.
> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
> ---
> net/sctp/sm_sideeffect.c | 10 ++++++----
> 1 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
> index 0146cfb..4ac6163 100644
> --- a/net/sctp/sm_sideeffect.c
> +++ b/net/sctp/sm_sideeffect.c
> @@ -434,7 +434,8 @@ sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES] = {
> *
> */
> static void sctp_do_8_2_transport_strike(struct sctp_association *asoc,
> - struct sctp_transport *transport)
> + struct sctp_transport *transport,
> + int is_hb)
> {
> /* The check for association's overall error counter exceeding the
> * threshold is done in the state function.
> @@ -466,7 +467,7 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc,
> * The first unacknowleged HB triggers it. We do this with a flag
> * that indicates that we have an outstanding HB.
> */
> - if (transport->hb_sent) {
> + if (!is_hb || transport->hb_sent) {
> transport->last_rto = transport->rto;
> transport->rto = min((transport->rto * 2), transport->asoc->rto_max);
> }
> @@ -667,7 +668,7 @@ static void sctp_cmd_transport_reset(sctp_cmd_seq_t *cmds,
> sctp_transport_lower_cwnd(t, SCTP_LOWER_CWND_INACTIVE);
>
> /* Mark one strike against a transport. */
> - sctp_do_8_2_transport_strike(asoc, t);
> + sctp_do_8_2_transport_strike(asoc, t, 1);
>
> t->hb_sent = 1;
> }
> @@ -1459,7 +1460,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
>
> case SCTP_CMD_STRIKE:
> /* Mark one strike against a transport. */
> - sctp_do_8_2_transport_strike(asoc, cmd->obj.transport);
> + sctp_do_8_2_transport_strike(asoc, cmd->obj.transport,
> + 0);
> break;
>
> case SCTP_CMD_TRANSPORT_RESET:
>
next prev parent reply other threads:[~2009-02-20 1:18 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-19 17:11 [PATCH] sctp: Fix broken RTO-doubling for data retransmits Vlad Yasevich
2009-02-20 1:18 ` Wei Yongjun [this message]
2009-02-20 2:39 ` Vlad Yasevich
2009-02-20 2:43 ` Vlad Yasevich
2009-02-23 19:15 ` Vlad Yasevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=499E04DA.3070806@cn.fujitsu.com \
--to=yjwei@cn.fujitsu.com \
--cc=linux-sctp@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.