aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp')
-rw-r--r--net/dccp/ccids/ccid3.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index d23af7b475a0..6bc77ff20908 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -123,18 +123,19 @@ static void ccid3_hc_tx_update_x(struct sock *sk, struct timeval *now)
123 123
124 if (hctx->ccid3hctx_p > 0) { 124 if (hctx->ccid3hctx_p > 0) {
125 125
126 hctx->ccid3hctx_x = min_t(u64, hctx->ccid3hctx_x_calc << 6, 126 hctx->ccid3hctx_x = min(((__u64)hctx->ccid3hctx_x_calc) << 6,
127 hctx->ccid3hctx_x_recv * 2 ); 127 hctx->ccid3hctx_x_recv * 2 );
128 hctx->ccid3hctx_x = max_t(u64, hctx->ccid3hctx_x, 128 hctx->ccid3hctx_x = max(hctx->ccid3hctx_x,
129 (hctx->ccid3hctx_s << 6)/TFRC_T_MBI); 129 (((__u64)hctx->ccid3hctx_s) << 6) /
130 TFRC_T_MBI);
130 131
131 } else if (timeval_delta(now, &hctx->ccid3hctx_t_ld) - 132 } else if (timeval_delta(now, &hctx->ccid3hctx_t_ld) -
132 (suseconds_t)hctx->ccid3hctx_rtt >= 0 ) { 133 (suseconds_t)hctx->ccid3hctx_rtt >= 0 ) {
133 134
134 hctx->ccid3hctx_x = max(2 * min(hctx->ccid3hctx_x, 135 hctx->ccid3hctx_x =
135 hctx->ccid3hctx_x_recv), 136 max(2 * min(hctx->ccid3hctx_x, hctx->ccid3hctx_x_recv),
136 scaled_div(hctx->ccid3hctx_s << 6, 137 scaled_div(((__u64)hctx->ccid3hctx_s) << 6,
137 hctx->ccid3hctx_rtt )); 138 hctx->ccid3hctx_rtt ) );
138 hctx->ccid3hctx_t_ld = *now; 139 hctx->ccid3hctx_t_ld = *now;
139 } 140 }
140 141
@@ -207,8 +208,9 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
207 switch (hctx->ccid3hctx_state) { 208 switch (hctx->ccid3hctx_state) {
208 case TFRC_SSTATE_NO_FBACK: 209 case TFRC_SSTATE_NO_FBACK:
209 /* RFC 3448, 4.4: Halve send rate directly */ 210 /* RFC 3448, 4.4: Halve send rate directly */
210 hctx->ccid3hctx_x = max_t(u32, hctx->ccid3hctx_x / 2, 211 hctx->ccid3hctx_x = max(hctx->ccid3hctx_x / 2,
211 (hctx->ccid3hctx_s << 6)/TFRC_T_MBI); 212 (((__u64)hctx->ccid3hctx_s) << 6) /
213 TFRC_T_MBI);
212 214
213 ccid3_pr_debug("%s(%p, state=%s), updated tx rate to %u " 215 ccid3_pr_debug("%s(%p, state=%s), updated tx rate to %u "
214 "bytes/s\n", dccp_role(sk), sk, 216 "bytes/s\n", dccp_role(sk), sk,
@@ -226,7 +228,7 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
226 */ 228 */
227 if (!hctx->ccid3hctx_idle || 229 if (!hctx->ccid3hctx_idle ||
228 (hctx->ccid3hctx_x_recv >= 4 * 230 (hctx->ccid3hctx_x_recv >= 4 *
229 scaled_div(hctx->ccid3hctx_s << 6, hctx->ccid3hctx_rtt))) { 231 scaled_div(((__u64)hctx->ccid3hctx_s) << 6, hctx->ccid3hctx_rtt))) {
230 struct timeval now; 232 struct timeval now;
231 233
232 ccid3_pr_debug("%s(%p, state=%s), not idle\n", 234 ccid3_pr_debug("%s(%p, state=%s), not idle\n",
@@ -249,15 +251,16 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
249 hctx->ccid3hctx_x_calc > (hctx->ccid3hctx_x_recv >> 5)) { 251 hctx->ccid3hctx_x_calc > (hctx->ccid3hctx_x_recv >> 5)) {
250 252
251 hctx->ccid3hctx_x_recv = 253 hctx->ccid3hctx_x_recv =
252 max_t(u64, hctx->ccid3hctx_x_recv / 2, 254 max(hctx->ccid3hctx_x_recv / 2,
253 (hctx->ccid3hctx_s << 6) / 255 (((__u64)hctx->ccid3hctx_s) << 6) /
254 (2*TFRC_T_MBI)); 256 (2*TFRC_T_MBI));
255 257
256 if (hctx->ccid3hctx_p == 0) 258 if (hctx->ccid3hctx_p == 0)
257 dccp_timestamp(sk, &now); 259 dccp_timestamp(sk, &now);
258 } else 260 } else {
259 hctx->ccid3hctx_x_recv = hctx->ccid3hctx_x_calc << 4; 261 hctx->ccid3hctx_x_recv = hctx->ccid3hctx_x_calc;
260 262 hctx->ccid3hctx_x_recv <<= 4;
263 }
261 /* Now recalculate X [RFC 3448, 4.3, step (4)] */ 264 /* Now recalculate X [RFC 3448, 4.3, step (4)] */
262 ccid3_hc_tx_update_x(sk, &now); 265 ccid3_hc_tx_update_x(sk, &now);
263 } 266 }
@@ -320,7 +323,8 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
320 323
321 /* Set initial sending rate X/s to 1pps (X is scaled by 2^6) */ 324 /* Set initial sending rate X/s to 1pps (X is scaled by 2^6) */
322 ccid3_hc_tx_update_s(hctx, skb->len); 325 ccid3_hc_tx_update_s(hctx, skb->len);
323 hctx->ccid3hctx_x = hctx->ccid3hctx_s << 6; 326 hctx->ccid3hctx_x = hctx->ccid3hctx_s;
327 hctx->ccid3hctx_x <<= 6;
324 328
325 /* First timeout, according to [RFC 3448, 4.2], is 1 second */ 329 /* First timeout, according to [RFC 3448, 4.2], is 1 second */
326 hctx->ccid3hctx_t_ipi = USEC_PER_SEC; 330 hctx->ccid3hctx_t_ipi = USEC_PER_SEC;
@@ -421,7 +425,8 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
421 } 425 }
422 426
423 /* Update receive rate in units of 64 * bytes/second */ 427 /* Update receive rate in units of 64 * bytes/second */
424 hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate << 6; 428 hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate;
429 hctx->ccid3hctx_x_recv <<= 6;
425 430
426 /* Update loss event rate */ 431 /* Update loss event rate */
427 pinv = opt_recv->ccid3or_loss_event_rate; 432 pinv = opt_recv->ccid3or_loss_event_rate;
@@ -460,15 +465,15 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
460 * Larger Initial Windows [RFC 4342, sec. 5] 465 * Larger Initial Windows [RFC 4342, sec. 5]
461 * We deviate in that we use `s' instead of `MSS'. 466 * We deviate in that we use `s' instead of `MSS'.
462 */ 467 */
463 u16 w_init = min( 4 * hctx->ccid3hctx_s, 468 __u64 w_init = min( 4 * hctx->ccid3hctx_s,
464 max(2 * hctx->ccid3hctx_s, 4380)); 469 max(2 * hctx->ccid3hctx_s, 4380));
465 hctx->ccid3hctx_rtt = r_sample; 470 hctx->ccid3hctx_rtt = r_sample;
466 hctx->ccid3hctx_x = scaled_div(w_init<< 6, r_sample); 471 hctx->ccid3hctx_x = scaled_div(w_init << 6, r_sample);
467 hctx->ccid3hctx_t_ld = now; 472 hctx->ccid3hctx_t_ld = now;
468 473
469 ccid3_update_send_time(hctx); 474 ccid3_update_send_time(hctx);
470 475
471 ccid3_pr_debug("%s(%p), s=%u, w_init=%u, " 476 ccid3_pr_debug("%s(%p), s=%u, w_init=%llu, "
472 "R_sample=%ldus, X=%u\n", dccp_role(sk), 477 "R_sample=%ldus, X=%u\n", dccp_role(sk),
473 sk, hctx->ccid3hctx_s, w_init, r_sample, 478 sk, hctx->ccid3hctx_s, w_init, r_sample,
474 (unsigned)(hctx->ccid3hctx_x >> 6)); 479 (unsigned)(hctx->ccid3hctx_x >> 6));
@@ -487,11 +492,12 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
487 ccid3_hc_tx_update_x(sk, &now); 492 ccid3_hc_tx_update_x(sk, &now);
488 493
489 ccid3_pr_debug("%s(%p), RTT=%uus (sample=%ldus), s=%u, " 494 ccid3_pr_debug("%s(%p), RTT=%uus (sample=%ldus), s=%u, "
490 "p=%u, X_calc=%u, X=%u\n", dccp_role(sk), 495 "p=%u, X_calc=%u, X_recv=%u, X=%u\n", dccp_role(sk),
491 sk, hctx->ccid3hctx_rtt, r_sample, 496 sk, hctx->ccid3hctx_rtt, r_sample,
492 hctx->ccid3hctx_s, hctx->ccid3hctx_p, 497 hctx->ccid3hctx_s, hctx->ccid3hctx_p,
493 hctx->ccid3hctx_x_calc, 498 hctx->ccid3hctx_x_calc,
494 (unsigned)(hctx->ccid3hctx_x >> 6)); 499 (unsigned)(hctx->ccid3hctx_x_recv >> 6),
500 (unsigned)(hctx->ccid3hctx_x >> 6) );
495 } 501 }
496 502
497 /* unschedule no feedback timer */ 503 /* unschedule no feedback timer */