| 2707 | } |
| 2708 | |
| 2709 | static void |
| 2710 | rack_decrease_bw_mul(struct tcp_rack *rack, int timely_says, uint32_t rtt, int32_t rtt_diff) |
| 2711 | { |
| 2712 | uint64_t logvar, logvar2, logvar3; |
| 2713 | uint32_t logged, new_per, ss_red, ca_red, rec_red, alt, val; |
| 2714 | |
| 2715 | if (rack->rc_gp_incr) { |
| 2716 | /* Turn off increment counting */ |
| 2717 | rack->rc_gp_incr = 0; |
| 2718 | rack->rc_gp_timely_inc_cnt = 0; |
| 2719 | } |
| 2720 | ss_red = ca_red = rec_red = 0; |
| 2721 | logged = 0; |
| 2722 | /* Calculate the reduction value */ |
| 2723 | if (rtt_diff < 0) { |
| 2724 | rtt_diff *= -1; |
| 2725 | } |
| 2726 | /* Must be at least 1% reduction */ |
| 2727 | if (rack->rc_gp_saw_rec && (rack->rc_gp_no_rec_chg == 0)) { |
| 2728 | /* We have been in recovery ding it too */ |
| 2729 | if (timely_says == 2) { |
| 2730 | new_per = rack_decrease_highrtt(rack, rack->r_ctl.rack_per_of_gp_rec, rtt); |
| 2731 | alt = rack_get_decrease(rack, rack->r_ctl.rack_per_of_gp_rec, rtt_diff); |
| 2732 | if (alt < new_per) |
| 2733 | val = alt; |
| 2734 | else |
| 2735 | val = new_per; |
| 2736 | } else |
| 2737 | val = new_per = alt = rack_get_decrease(rack, rack->r_ctl.rack_per_of_gp_rec, rtt_diff); |
| 2738 | if (rack->r_ctl.rack_per_of_gp_rec > val) { |
| 2739 | rec_red = (rack->r_ctl.rack_per_of_gp_rec - val); |
| 2740 | rack->r_ctl.rack_per_of_gp_rec = (uint16_t)val; |
| 2741 | } else { |
| 2742 | rack->r_ctl.rack_per_of_gp_rec = rack_per_lower_bound; |
| 2743 | rec_red = 0; |
| 2744 | } |
| 2745 | if (rack_per_lower_bound > rack->r_ctl.rack_per_of_gp_rec) |
| 2746 | rack->r_ctl.rack_per_of_gp_rec = rack_per_lower_bound; |
| 2747 | logged |= 1; |
| 2748 | } |
| 2749 | if (rack->rc_gp_saw_ss) { |
| 2750 | /* Sent in SS */ |
| 2751 | if (timely_says == 2) { |
| 2752 | new_per = rack_decrease_highrtt(rack, rack->r_ctl.rack_per_of_gp_ss, rtt); |
| 2753 | alt = rack_get_decrease(rack, rack->r_ctl.rack_per_of_gp_rec, rtt_diff); |
| 2754 | if (alt < new_per) |
| 2755 | val = alt; |
| 2756 | else |
| 2757 | val = new_per; |
| 2758 | } else |
| 2759 | val = new_per = alt = rack_get_decrease(rack, rack->r_ctl.rack_per_of_gp_ss, rtt_diff); |
| 2760 | if (rack->r_ctl.rack_per_of_gp_ss > new_per) { |
| 2761 | ss_red = rack->r_ctl.rack_per_of_gp_ss - val; |
| 2762 | rack->r_ctl.rack_per_of_gp_ss = (uint16_t)val; |
| 2763 | } else { |
| 2764 | ss_red = new_per; |
| 2765 | rack->r_ctl.rack_per_of_gp_ss = rack_per_lower_bound; |
| 2766 | logvar = new_per; |
no test coverage detected