aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2006-11-27 17:32:37 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-12-03 00:30:52 -0500
commit5d0dbc4a9b2d325458dcbf9a8329bd1d2cc7bd7e (patch)
tree43aeec866470135e0b16420587ae04b7c41d43eb /net
parent17893bc1a632e195574dc0dd9751243f0d5993d2 (diff)
[DCCP] ccid3: Consolidate handling of t_RTO
This patch * removes setting t_RTO in ccid3_hc_tx_init (per [RFC 3448, 4.2], t_RTO is undefined until feedback has been received); * makes some trivial changes (updates of comments); * performs a small optimisation by exploiting that the feedback timeout uses the value of t_ipi. The way it is done is safe, because the timeouts appear after the changes to t_ipi, ensuring that up-to-date values are used; * in ccid3_hc_tx_packet_recv, moves the t_rto statement closer to the calculation of the next_tmout. This makes the code clearer to read and is also safe, since t_rto is not updated until the next call of ccid3_hc_tx_packet_recv, and is not read by the functions called via ccid_wait_for_ccid(); * removes a `max' statement in sk_reset_timer, this is not needed since the timeout value is always greater than 1E6 microseconds. * adds `XXX'es to highlight that currently the nofeedback timer is set in a non-standard way Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Diffstat (limited to 'net')
-rw-r--r--net/dccp/ccids/ccid3.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 4342caf53251..f0ed67c84a55 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -228,11 +228,10 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
228 } 228 }
229 /* 229 /*
230 * Schedule no feedback timer to expire in 230 * Schedule no feedback timer to expire in
231 * max(4 * R, 2 * s / X) 231 * max(4 * t_RTO, 2 * s/X) = max(4 * t_RTO, 2 * t_ipi)
232 * XXX This is non-standard, RFC 3448, 4.3 uses 4 * R
232 */ 233 */
233 next_tmout = max_t(u32, hctx->ccid3hctx_t_rto, 234 next_tmout = max(hctx->ccid3hctx_t_rto, 2*hctx->ccid3hctx_t_ipi);
234 2 * usecs_div(hctx->ccid3hctx_s,
235 hctx->ccid3hctx_x));
236 break; 235 break;
237 case TFRC_SSTATE_NO_SENT: 236 case TFRC_SSTATE_NO_SENT:
238 DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk); 237 DCCP_BUG("Illegal %s state NO_SENT, sk=%p", dccp_role(sk), sk);
@@ -460,10 +459,6 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
460 "r_sample=%us\n", dccp_role(sk), sk, 459 "r_sample=%us\n", dccp_role(sk), sk,
461 hctx->ccid3hctx_rtt, r_sample); 460 hctx->ccid3hctx_rtt, r_sample);
462 461
463 /* Update timeout interval */
464 hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
465 USEC_PER_SEC);
466
467 /* Update receive rate */ 462 /* Update receive rate */
468 hctx->ccid3hctx_x_recv = x_recv;/* X_recv in bytes per sec */ 463 hctx->ccid3hctx_x_recv = x_recv;/* X_recv in bytes per sec */
469 464
@@ -491,17 +486,22 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
491 &hctx->ccid3hctx_hist, packet); 486 &hctx->ccid3hctx_hist, packet);
492 /* 487 /*
493 * As we have calculated new ipi, delta, t_nom it is possible that 488 * As we have calculated new ipi, delta, t_nom it is possible that
494 * we now can send a packet, so wake up dccp_wait_for_ccids. 489 * we now can send a packet, so wake up dccp_wait_for_ccid
495 */ 490 */
496 sk->sk_write_space(sk); 491 sk->sk_write_space(sk);
497 492
493
494 /* Update timeout interval. We use the alternative variant of
495 * [RFC 3448, 3.1] which sets the upper bound of t_rto to one
496 * second, as it is suggested for TCP (see RFC 2988, 2.4). */
497 hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
498 USEC_PER_SEC );
498 /* 499 /*
499 * Schedule no feedback timer to expire in 500 * Schedule no feedback timer to expire in
500 * max(4 * R, 2 * s / X) 501 * max(4 * t_RTO, 2 * s/X) = max(4 * t_RTO, 2 * t_ipi)
502 * XXX This is non-standard, RFC 3448, 4.3 uses 4 * R
501 */ 503 */
502 next_tmout = max(hctx->ccid3hctx_t_rto, 504 next_tmout = max(hctx->ccid3hctx_t_rto, 2*hctx->ccid3hctx_t_ipi);
503 2 * usecs_div(hctx->ccid3hctx_s,
504 hctx->ccid3hctx_x));
505 505
506 ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to " 506 ccid3_pr_debug("%s, sk=%p, Scheduled no feedback timer to "
507 "expire in %lu jiffies (%luus)\n", 507 "expire in %lu jiffies (%luus)\n",
@@ -509,7 +509,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
509 usecs_to_jiffies(next_tmout), next_tmout); 509 usecs_to_jiffies(next_tmout), next_tmout);
510 510
511 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer, 511 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
512 jiffies + max_t(u32, 1, usecs_to_jiffies(next_tmout))); 512 jiffies + usecs_to_jiffies(next_tmout));
513 513
514 /* set idle flag */ 514 /* set idle flag */
515 hctx->ccid3hctx_idle = 1; 515 hctx->ccid3hctx_idle = 1;
@@ -607,7 +607,6 @@ static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
607 607
608 /* Set transmission rate to 1 packet per second */ 608 /* Set transmission rate to 1 packet per second */
609 hctx->ccid3hctx_x = hctx->ccid3hctx_s; 609 hctx->ccid3hctx_x = hctx->ccid3hctx_s;
610 hctx->ccid3hctx_t_rto = USEC_PER_SEC;
611 hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT; 610 hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
612 INIT_LIST_HEAD(&hctx->ccid3hctx_hist); 611 INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
613 612