diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2006-11-27 17:32:37 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-12-03 00:30:52 -0500 |
commit | 5d0dbc4a9b2d325458dcbf9a8329bd1d2cc7bd7e (patch) | |
tree | 43aeec866470135e0b16420587ae04b7c41d43eb /net | |
parent | 17893bc1a632e195574dc0dd9751243f0d5993d2 (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.c | 29 |
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 | ||