diff options
author | Gerrit Renker <gerrit@erg.abdn.ac.uk> | 2006-12-09 21:02:12 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-12-11 17:34:42 -0500 |
commit | 1a21e49a8d60f588c1276f765198b14d5688a778 (patch) | |
tree | 4b8770be71047437f30da694649719948977b189 /net/dccp/ccids/ccid3.h | |
parent | 179ebc9f92da88e15ea86d7d27308c92712d8ee9 (diff) |
[DCCP] ccid3: Finer-grained resolution of sending rates
This patch
* resolves a bug where packets smaller than 32/64 bytes resulted in sending rates of 0
* supports all sending rates from 1/64 bytes/second up to 4Gbyte/second
* simplifies the present overflow problems in calculations
Current sending rate X and the cached value X_recv of the receiver-estimated
sending rate are both scaled by 64 (2^6) in order to
* cope with low sending rates (minimally 1 byte/second)
* allow upgrading to use a packets-per-second implementation of CCID 3
* avoid calculation errors due to integer arithmetic cut-off
The patch implements a revised strategy from
http://www.mail-archive.com/dccp@vger.kernel.org/msg01040.html
The only difference with regard to that strategy is that t_ipi is already
used in the calculation of the nofeedback timeout, which saves one division.
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Diffstat (limited to 'net/dccp/ccids/ccid3.h')
-rw-r--r-- | net/dccp/ccids/ccid3.h | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h index 07596d704ef9..cd4fc542f73e 100644 --- a/net/dccp/ccids/ccid3.h +++ b/net/dccp/ccids/ccid3.h | |||
@@ -75,14 +75,14 @@ enum ccid3_hc_tx_states { | |||
75 | 75 | ||
76 | /** struct ccid3_hc_tx_sock - CCID3 sender half-connection socket | 76 | /** struct ccid3_hc_tx_sock - CCID3 sender half-connection socket |
77 | * | 77 | * |
78 | * @ccid3hctx_x - Current sending rate | 78 | * @ccid3hctx_x - Current sending rate in 64 * bytes per second |
79 | * @ccid3hctx_x_recv - Receive rate | 79 | * @ccid3hctx_x_recv - Receive rate in 64 * bytes per second |
80 | * @ccid3hctx_x_calc - Calculated send rate (RFC 3448, 3.1) | 80 | * @ccid3hctx_x_calc - Calculated rate in bytes per second |
81 | * @ccid3hctx_rtt - Estimate of current round trip time in usecs | 81 | * @ccid3hctx_rtt - Estimate of current round trip time in usecs |
82 | * @ccid3hctx_p - Current loss event rate (0-1) scaled by 1000000 | 82 | * @ccid3hctx_p - Current loss event rate (0-1) scaled by 1000000 |
83 | * @ccid3hctx_s - Packet size | 83 | * @ccid3hctx_s - Packet size in bytes |
84 | * @ccid3hctx_t_rto - Retransmission Timeout (RFC 3448, 3.1) | 84 | * @ccid3hctx_t_rto - Nofeedback Timer setting in usecs |
85 | * @ccid3hctx_t_ipi - Interpacket (send) interval (RFC 3448, 4.6) | 85 | * @ccid3hctx_t_ipi - Interpacket (send) interval (RFC 3448, 4.6) in usecs |
86 | * @ccid3hctx_state - Sender state, one of %ccid3_hc_tx_states | 86 | * @ccid3hctx_state - Sender state, one of %ccid3_hc_tx_states |
87 | * @ccid3hctx_last_win_count - Last window counter sent | 87 | * @ccid3hctx_last_win_count - Last window counter sent |
88 | * @ccid3hctx_t_last_win_count - Timestamp of earliest packet | 88 | * @ccid3hctx_t_last_win_count - Timestamp of earliest packet |
@@ -91,7 +91,7 @@ enum ccid3_hc_tx_states { | |||
91 | * @ccid3hctx_idle - Flag indicating that sender is idling | 91 | * @ccid3hctx_idle - Flag indicating that sender is idling |
92 | * @ccid3hctx_t_ld - Time last doubled during slow start | 92 | * @ccid3hctx_t_ld - Time last doubled during slow start |
93 | * @ccid3hctx_t_nom - Nominal send time of next packet | 93 | * @ccid3hctx_t_nom - Nominal send time of next packet |
94 | * @ccid3hctx_delta - Send timer delta | 94 | * @ccid3hctx_delta - Send timer delta (RFC 3448, 4.6) in usecs |
95 | * @ccid3hctx_hist - Packet history | 95 | * @ccid3hctx_hist - Packet history |
96 | * @ccid3hctx_options_received - Parsed set of retrieved options | 96 | * @ccid3hctx_options_received - Parsed set of retrieved options |
97 | */ | 97 | */ |
@@ -171,4 +171,23 @@ static inline struct ccid3_hc_rx_sock *ccid3_hc_rx_sk(const struct sock *sk) | |||
171 | return ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid); | 171 | return ccid_priv(dccp_sk(sk)->dccps_hc_rx_ccid); |
172 | } | 172 | } |
173 | 173 | ||
174 | static inline u64 scaled_div(u64 a, u32 b) | ||
175 | { | ||
176 | BUG_ON(b==0); | ||
177 | a *= 1000000; | ||
178 | do_div(a, b); | ||
179 | return a; | ||
180 | } | ||
181 | |||
182 | static inline u32 scaled_div32(u64 a, u32 b) | ||
183 | { | ||
184 | u64 result = scaled_div(a, b); | ||
185 | |||
186 | if (result > UINT_MAX) { | ||
187 | DCCP_CRIT("Overflow: a(%llu)/b(%u) > ~0U", | ||
188 | (unsigned long long)a, b); | ||
189 | return UINT_MAX; | ||
190 | } | ||
191 | return result; | ||
192 | } | ||
174 | #endif /* _DCCP_CCID3_H_ */ | 193 | #endif /* _DCCP_CCID3_H_ */ |