Skip to content

Commit

Permalink
[DCCP] ccid3: Set NoFeedback Timeout according to RFC 3448
Browse files Browse the repository at this point in the history
This corrects the setting of the nofeedback timer with regard to RFC
3448 - previously it was not set to max(4*R, 2*s/X) as specified. Using
the maximum of 1 second as upper bound (as it was done before) can have
detrimental effects, especially if R is small.

Signed-off-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
  • Loading branch information
Gerrit Renker authored and David S. Miller committed Dec 3, 2006
1 parent 4384260 commit 2a1fda6
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions net/dccp/ccids/ccid3.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
{
struct sock *sk = (struct sock *)data;
struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
unsigned long next_tmout = USEC_PER_SEC / 5;
unsigned long t_nfb = USEC_PER_SEC / 5;

bh_lock_sock(sk);
if (sock_owned_by_user(sk)) {
Expand Down Expand Up @@ -191,7 +191,7 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
hctx->ccid3hctx_x);
/* The value of R is still undefined and so we can not recompute
* the timout value. Keep initial value as per [RFC 4342, 5]. */
next_tmout = TFRC_INITIAL_TIMEOUT;
t_nfb = TFRC_INITIAL_TIMEOUT;
ccid3_update_send_time(hctx);
break;
case TFRC_SSTATE_FBACK:
Expand Down Expand Up @@ -228,10 +228,9 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
}
/*
* Schedule no feedback timer to expire in
* max(4 * t_RTO, 2 * s/X) = max(4 * t_RTO, 2 * t_ipi)
* XXX This is non-standard, RFC 3448, 4.3 uses 4 * R
* max(4 * R, 2 * s/X) = max(4 * R, 2 * t_ipi)
*/
next_tmout = max(hctx->ccid3hctx_t_rto, 2*hctx->ccid3hctx_t_ipi);
t_nfb = max(4 * hctx->ccid3hctx_rtt, 2 * hctx->ccid3hctx_t_ipi);
break;
case TFRC_SSTATE_NO_SENT:
DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk);
Expand All @@ -244,7 +243,7 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)

restart_timer:
sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
jiffies + usecs_to_jiffies(next_tmout));
jiffies + usecs_to_jiffies(t_nfb));
out:
bh_unlock_sock(sk);
sock_put(sk);
Expand Down Expand Up @@ -396,7 +395,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
struct ccid3_options_received *opt_recv;
struct dccp_tx_hist_entry *packet;
struct timeval now;
unsigned long next_tmout;
unsigned long t_nfb;
u32 t_elapsed;
u32 pinv;
u32 x_recv;
Expand Down Expand Up @@ -498,18 +497,17 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
USEC_PER_SEC );
/*
* Schedule no feedback timer to expire in
* max(4 * t_RTO, 2 * s/X) = max(4 * t_RTO, 2 * t_ipi)
* XXX This is non-standard, RFC 3448, 4.3 uses 4 * R
* max(4 * R, 2 * s/X) = max(4 * R, 2 * t_ipi)
*/
next_tmout = max(hctx->ccid3hctx_t_rto, 2*hctx->ccid3hctx_t_ipi);
t_nfb = max(4 * hctx->ccid3hctx_rtt, 2 * hctx->ccid3hctx_t_ipi);

ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to "
"expire in %lu jiffies (%luus)\n",
dccp_role(sk), sk,
usecs_to_jiffies(next_tmout), next_tmout);
usecs_to_jiffies(t_nfb), t_nfb);

sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
jiffies + usecs_to_jiffies(next_tmout));
jiffies + usecs_to_jiffies(t_nfb));

/* set idle flag */
hctx->ccid3hctx_idle = 1;
Expand Down

0 comments on commit 2a1fda6

Please sign in to comment.