aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ccids/ccid3.c
diff options
context:
space:
mode:
authorGerrit Renker <gerrit@erg.abdn.ac.uk>2010-09-19 14:10:52 -0400
committerGerrit Renker <gerrit@erg.abdn.ac.uk>2010-09-21 06:14:26 -0400
commit792e6d3389061ad449429b9ba228eb758c247ea0 (patch)
tree31a238fb2fc28e465e95b7d98b5e0698461cdadf /net/dccp/ccids/ccid3.c
parent80763dfbac4ed1e6dfe6ec08ef748e0e9aec3260 (diff)
dccp tfrc/ccid-3: computing the loss rate from the Loss Event Rate
This adds a function to take care of the following, separate cases occurring in the computation of the Loss Rate p: * 1/(2^32-1) is mapped into 0% as per RFC 4342, 8.5; * 1/0 is mapped into 100%, the maximum; * to avoid that p = 1/x is rounded down to 0 when x is very large, since this means accidentally re-entering slow-start indicated by p == 0, the minimum resolution value of p is now returned instead; * a bug in ccid3_hc_rx_getsockopt is fixed: 1/0 was mapped into ~0U. Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Diffstat (limited to 'net/dccp/ccids/ccid3.c')
-rw-r--r--net/dccp/ccids/ccid3.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index 90bc0a7da8e4..9715eebf1551 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -400,10 +400,10 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
400 400
401 /* Update loss event rate (which is scaled by 1e6) */ 401 /* Update loss event rate (which is scaled by 1e6) */
402 pinv = opt_recv->ccid3or_loss_event_rate; 402 pinv = opt_recv->ccid3or_loss_event_rate;
403 if (pinv == ~0U || pinv == 0) /* see RFC 4342, 8.5 */ 403 if (pinv == 0)
404 hc->tx_p = 0; 404 hc->tx_p = 0;
405 else /* can not exceed 100% */ 405 else
406 hc->tx_p = scaled_div(1, pinv); 406 hc->tx_p = tfrc_invert_loss_event_rate(pinv);
407 407
408 /* 408 /*
409 * Update allowed sending rate X as per draft rfc3448bis-00, 4.2/3 409 * Update allowed sending rate X as per draft rfc3448bis-00, 4.2/3
@@ -834,8 +834,7 @@ static int ccid3_hc_rx_getsockopt(struct sock *sk, const int optname, int len,
834 return -EINVAL; 834 return -EINVAL;
835 rx_info.tfrcrx_x_recv = hc->rx_x_recv; 835 rx_info.tfrcrx_x_recv = hc->rx_x_recv;
836 rx_info.tfrcrx_rtt = hc->rx_rtt; 836 rx_info.tfrcrx_rtt = hc->rx_rtt;
837 rx_info.tfrcrx_p = hc->rx_pinv == 0 ? ~0U : 837 rx_info.tfrcrx_p = tfrc_invert_loss_event_rate(hc->rx_pinv);
838 scaled_div(1, hc->rx_pinv);
839 len = sizeof(rx_info); 838 len = sizeof(rx_info);
840 val = &rx_info; 839 val = &rx_info;
841 break; 840 break;