aboutsummaryrefslogtreecommitdiffstats
path: root/net/dccp/ccids/ccid3.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/dccp/ccids/ccid3.c')
-rw-r--r--net/dccp/ccids/ccid3.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index d654264c5108..d77d3e664b7e 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -136,17 +136,18 @@ static void ccid3_hc_tx_update_x(struct sock *sk, ktime_t *stamp)
136} 136}
137 137
138/* 138/*
139 * Track the mean packet size `s' (cf. RFC 4342, 5.3 and RFC 3448, 4.1) 139 * ccid3_hc_tx_measure_packet_size - Measuring the packet size `s' (sec 4.1)
140 * @len: DCCP packet payload size in bytes 140 * @new_len: DCCP payload size in bytes (not used by all methods)
141 */ 141 */
142static inline void ccid3_hc_tx_update_s(struct ccid3_hc_tx_sock *hctx, int len) 142static u32 ccid3_hc_tx_measure_packet_size(struct sock *sk, const u16 new_len)
143{ 143{
144 const u16 old_s = hctx->s; 144#if defined(CONFIG_IP_DCCP_CCID3_MEASURE_S_AS_AVG)
145 145 return tfrc_ewma(ccid3_hc_tx_sk(sk)->s, new_len, 9);
146 hctx->s = tfrc_ewma(hctx->s, len, 9); 146#elif defined(CONFIG_IP_DCCP_CCID3_MEASURE_S_AS_MAX)
147 147 return max(ccid3_hc_tx_sk(sk)->s, new_len);
148 if (hctx->s != old_s) 148#else /* CONFIG_IP_DCCP_CCID3_MEASURE_S_AS_MPS */
149 ccid3_update_send_interval(hctx); 149 return dccp_sk(sk)->dccps_mss_cache;
150#endif
150} 151}
151 152
152/* 153/*
@@ -271,8 +272,6 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
271 /* Set t_0 for initial packet */ 272 /* Set t_0 for initial packet */
272 hctx->t_nom = now; 273 hctx->t_nom = now;
273 274
274 hctx->s = skb->len;
275
276 /* 275 /*
277 * Use initial RTT sample when available: recommended by erratum 276 * Use initial RTT sample when available: recommended by erratum
278 * to RFC 4342. This implements the initialisation procedure of 277 * to RFC 4342. This implements the initialisation procedure of
@@ -294,6 +293,9 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
294 hctx->x = dp->dccps_mss_cache; 293 hctx->x = dp->dccps_mss_cache;
295 hctx->x <<= 6; 294 hctx->x <<= 6;
296 } 295 }
296
297 /* Compute t_ipi = s / X */
298 hctx->s = ccid3_hc_tx_measure_packet_size(sk, skb->len);
297 ccid3_update_send_interval(hctx); 299 ccid3_update_send_interval(hctx);
298 300
299 } else { 301 } else {
@@ -326,7 +328,8 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, unsigned int len)
326{ 328{
327 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 329 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
328 330
329 ccid3_hc_tx_update_s(hctx, len); 331 /* Changes to s will become effective the next time X is computed */
332 hctx->s = ccid3_hc_tx_measure_packet_size(sk, len);
330 333
331 if (tfrc_tx_hist_add(&hctx->hist, dccp_sk(sk)->dccps_gss)) 334 if (tfrc_tx_hist_add(&hctx->hist, dccp_sk(sk)->dccps_gss))
332 DCCP_CRIT("packet history - out of memory!"); 335 DCCP_CRIT("packet history - out of memory!");