diff options
| -rw-r--r-- | net/dccp/ccids/lib/tfrc_equation.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/net/dccp/ccids/lib/tfrc_equation.c b/net/dccp/ccids/lib/tfrc_equation.c index 78bdf3489162..ef3233d45a61 100644 --- a/net/dccp/ccids/lib/tfrc_equation.c +++ b/net/dccp/ccids/lib/tfrc_equation.c | |||
| @@ -608,22 +608,19 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p) | |||
| 608 | u32 f; | 608 | u32 f; |
| 609 | u64 tmp1, tmp2; | 609 | u64 tmp1, tmp2; |
| 610 | 610 | ||
| 611 | /* check against invalid parameters and divide-by-zero */ | ||
| 612 | BUG_ON(p > 1000000); /* p must not exceed 100% */ | ||
| 613 | BUG_ON(p == 0); /* f(0) = 0, divide by zero */ | ||
| 614 | if (R == 0) { /* possible divide by zero */ | ||
| 615 | DCCP_CRIT("WARNING: RTT is 0, returning maximum X_calc."); | ||
| 616 | return ~0U; | ||
| 617 | } | ||
| 618 | |||
| 611 | if (p < TFRC_CALC_X_SPLIT) /* 0 <= p < 0.05 */ | 619 | if (p < TFRC_CALC_X_SPLIT) /* 0 <= p < 0.05 */ |
| 612 | index = (p / (TFRC_CALC_X_SPLIT / TFRC_CALC_X_ARRSIZE)) - 1; | 620 | index = (p / (TFRC_CALC_X_SPLIT / TFRC_CALC_X_ARRSIZE)) - 1; |
| 613 | else /* 0.05 <= p <= 1.00 */ | 621 | else /* 0.05 <= p <= 1.00 */ |
| 614 | index = (p / (1000000 / TFRC_CALC_X_ARRSIZE)) - 1; | 622 | index = (p / (1000000 / TFRC_CALC_X_ARRSIZE)) - 1; |
| 615 | 623 | ||
| 616 | if (index < 0) | ||
| 617 | /* p should be 0 unless there is a bug in my code */ | ||
| 618 | index = 0; | ||
| 619 | |||
| 620 | if (R == 0) { | ||
| 621 | DCCP_WARN("RTT==0, setting to 1\n"); | ||
| 622 | R = 1; /* RTT can't be zero or else divide by zero */ | ||
| 623 | } | ||
| 624 | |||
| 625 | BUG_ON(index >= TFRC_CALC_X_ARRSIZE); | ||
| 626 | |||
| 627 | if (p >= TFRC_CALC_X_SPLIT) | 624 | if (p >= TFRC_CALC_X_SPLIT) |
| 628 | f = tfrc_calc_x_lookup[index][0]; | 625 | f = tfrc_calc_x_lookup[index][0]; |
| 629 | else | 626 | else |
| @@ -653,13 +650,21 @@ u32 tfrc_calc_x_reverse_lookup(u32 fvalue) | |||
| 653 | int ctr = 0; | 650 | int ctr = 0; |
| 654 | int small; | 651 | int small; |
| 655 | 652 | ||
| 656 | if (fvalue < tfrc_calc_x_lookup[0][1]) | 653 | if (fvalue == 0) /* f(p) = 0 whenever p = 0 */ |
| 657 | return 0; | 654 | return 0; |
| 658 | 655 | ||
| 656 | /* Error cases. */ | ||
| 657 | if (fvalue < tfrc_calc_x_lookup[0][1]) { | ||
| 658 | DCCP_WARN("fvalue %d smaller than resolution\n", fvalue); | ||
| 659 | return tfrc_calc_x_lookup[0][1]; | ||
| 660 | } | ||
| 661 | if (fvalue > tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][0]) { | ||
| 662 | DCCP_WARN("fvalue %d exceeds bounds!\n", fvalue); | ||
| 663 | return 1000000; | ||
| 664 | } | ||
| 665 | |||
| 659 | if (fvalue <= tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][1]) | 666 | if (fvalue <= tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][1]) |
| 660 | small = 1; | 667 | small = 1; |
| 661 | else if (fvalue > tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][0]) | ||
| 662 | return 1000000; | ||
| 663 | else | 668 | else |
| 664 | small = 0; | 669 | small = 0; |
| 665 | 670 | ||
