aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ccids
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/ccids')
-rw-r--r--net/dccp/ccids/ccid3.c42
-rw-r--r--net/dccp/ccids/ccid3.h10
2 files changed, 11 insertions, 41 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 35123c19a08f..f4097ddf2504 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -414,8 +414,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
414 struct dccp_tx_hist_entry *packet; 414 struct dccp_tx_hist_entry *packet;
415 struct timeval now; 415 struct timeval now;
416 unsigned long t_nfb; 416 unsigned long t_nfb;
417 u32 pinv; 417 u32 pinv, r_sample;
418 suseconds_t r_sample, t_elapsed;
419 418
420 BUG_ON(hctx == NULL); 419 BUG_ON(hctx == NULL);
421 420
@@ -457,18 +456,10 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
457 * Calculate new round trip sample as per [RFC 3448, 4.3] by 456 * Calculate new round trip sample as per [RFC 3448, 4.3] by
458 * R_sample = (now - t_recvdata) - t_elapsed 457 * R_sample = (now - t_recvdata) - t_elapsed
459 */ 458 */
460 r_sample = timeval_delta(&now, &packet->dccphtx_tstamp); 459 r_sample = dccp_sample_rtt(sk, &now, &packet->dccphtx_tstamp);
461 t_elapsed = dp->dccps_options_received.dccpor_elapsed_time * 10;
462 460
463 DCCP_BUG_ON(r_sample < 0); 461 /*
464 if (unlikely(r_sample <= t_elapsed)) 462 * Update RTT estimate by
465 DCCP_WARN("WARNING: r_sample=%dus <= t_elapsed=%dus\n",
466 (int)r_sample, (int)t_elapsed);
467 else
468 r_sample -= t_elapsed;
469 CCID3_RTT_SANITY_CHECK(r_sample);
470
471 /* Update RTT estimate by
472 * If (No feedback recv) 463 * If (No feedback recv)
473 * R = R_sample; 464 * R = R_sample;
474 * Else 465 * Else
@@ -487,15 +478,15 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
487 ccid3_update_send_interval(hctx); 478 ccid3_update_send_interval(hctx);
488 479
489 ccid3_pr_debug("%s(%p), s=%u, MSS=%u, " 480 ccid3_pr_debug("%s(%p), s=%u, MSS=%u, "
490 "R_sample=%dus, X=%u\n", dccp_role(sk), 481 "R_sample=%uus, X=%u\n", dccp_role(sk),
491 sk, hctx->ccid3hctx_s, 482 sk, hctx->ccid3hctx_s,
492 dp->dccps_mss_cache, (int)r_sample, 483 dp->dccps_mss_cache, r_sample,
493 (unsigned)(hctx->ccid3hctx_x >> 6)); 484 (unsigned)(hctx->ccid3hctx_x >> 6));
494 485
495 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK); 486 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK);
496 } else { 487 } else {
497 hctx->ccid3hctx_rtt = (9 * hctx->ccid3hctx_rtt + 488 hctx->ccid3hctx_rtt = (9 * hctx->ccid3hctx_rtt +
498 (u32)r_sample) / 10; 489 r_sample) / 10;
499 490
500 /* Update sending rate (step 4 of [RFC 3448, 4.3]) */ 491 /* Update sending rate (step 4 of [RFC 3448, 4.3]) */
501 if (hctx->ccid3hctx_p > 0) 492 if (hctx->ccid3hctx_p > 0)
@@ -505,10 +496,10 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
505 hctx->ccid3hctx_p); 496 hctx->ccid3hctx_p);
506 ccid3_hc_tx_update_x(sk, &now); 497 ccid3_hc_tx_update_x(sk, &now);
507 498
508 ccid3_pr_debug("%s(%p), RTT=%uus (sample=%dus), s=%u, " 499 ccid3_pr_debug("%s(%p), RTT=%uus (sample=%uus), s=%u, "
509 "p=%u, X_calc=%u, X_recv=%u, X=%u\n", 500 "p=%u, X_calc=%u, X_recv=%u, X=%u\n",
510 dccp_role(sk), 501 dccp_role(sk),
511 sk, hctx->ccid3hctx_rtt, (int)r_sample, 502 sk, hctx->ccid3hctx_rtt, r_sample,
512 hctx->ccid3hctx_s, hctx->ccid3hctx_p, 503 hctx->ccid3hctx_s, hctx->ccid3hctx_p,
513 hctx->ccid3hctx_x_calc, 504 hctx->ccid3hctx_x_calc,
514 (unsigned)(hctx->ccid3hctx_x_recv >> 6), 505 (unsigned)(hctx->ccid3hctx_x_recv >> 6),
@@ -1025,8 +1016,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
1025 const struct dccp_options_received *opt_recv; 1016 const struct dccp_options_received *opt_recv;
1026 struct dccp_rx_hist_entry *packet; 1017 struct dccp_rx_hist_entry *packet;
1027 struct timeval now; 1018 struct timeval now;
1028 u32 p_prev, rtt_prev; 1019 u32 p_prev, r_sample, rtt_prev;
1029 suseconds_t r_sample, t_elapsed;
1030 int loss, payload_size; 1020 int loss, payload_size;
1031 1021
1032 BUG_ON(hcrx == NULL); 1022 BUG_ON(hcrx == NULL);
@@ -1042,17 +1032,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
1042 break; 1032 break;
1043 rtt_prev = hcrx->ccid3hcrx_rtt; 1033 rtt_prev = hcrx->ccid3hcrx_rtt;
1044 dccp_timestamp(sk, &now); 1034 dccp_timestamp(sk, &now);
1045 timeval_sub_usecs(&now, opt_recv->dccpor_timestamp_echo * 10); 1035 r_sample = dccp_sample_rtt(sk, &now, NULL);
1046 r_sample = timeval_usecs(&now);
1047 t_elapsed = opt_recv->dccpor_elapsed_time * 10;
1048
1049 DCCP_BUG_ON(r_sample < 0);
1050 if (unlikely(r_sample <= t_elapsed))
1051 DCCP_WARN("r_sample=%ldus, t_elapsed=%ldus\n",
1052 (long)r_sample, (long)t_elapsed);
1053 else
1054 r_sample -= t_elapsed;
1055 CCID3_RTT_SANITY_CHECK(r_sample);
1056 1036
1057 if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA) 1037 if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
1058 hcrx->ccid3hcrx_rtt = r_sample; 1038 hcrx->ccid3hcrx_rtt = r_sample;
diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h
index 15776a88c090..8d31b389c19c 100644
--- a/net/dccp/ccids/ccid3.h
+++ b/net/dccp/ccids/ccid3.h
@@ -51,16 +51,6 @@
51/* Parameter t_mbi from [RFC 3448, 4.3]: backoff interval in seconds */ 51/* Parameter t_mbi from [RFC 3448, 4.3]: backoff interval in seconds */
52#define TFRC_T_MBI 64 52#define TFRC_T_MBI 64
53 53
54/* What we think is a reasonable upper limit on RTT values */
55#define CCID3_SANE_RTT_MAX ((suseconds_t)(4 * USEC_PER_SEC))
56
57#define CCID3_RTT_SANITY_CHECK(rtt) do { \
58 if (rtt > CCID3_SANE_RTT_MAX) { \
59 DCCP_CRIT("RTT (%d) too large, substituting %d", \
60 (int)rtt, (int)CCID3_SANE_RTT_MAX); \
61 rtt = CCID3_SANE_RTT_MAX; \
62 } } while (0)
63
64enum ccid3_options { 54enum ccid3_options {
65 TFRC_OPT_LOSS_EVENT_RATE = 192, 55 TFRC_OPT_LOSS_EVENT_RATE = 192,
66 TFRC_OPT_LOSS_INTERVALS = 193, 56 TFRC_OPT_LOSS_INTERVALS = 193,