ccid3.c 36.5 KB
Newer Older
1 2 3 4
/*
 *  net/dccp/ccids/ccid3.c
 *
 *  Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand.
5
 *  Copyright (c) 2005-6 Ian McDonald <ian.mcdonald@jandi.co.nz>
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 *
 *  An implementation of the DCCP protocol
 *
 *  This code has been developed by the University of Waikato WAND
 *  research group. For further information please see http://www.wand.net.nz/
 *
 *  This code also uses code from Lulea University, rereleased as GPL by its
 *  authors:
 *  Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon
 *
 *  Changes to meet Linux coding standards, to make it meet latest ccid3 draft
 *  and to make it work as a loadable module in the DCCP stack written by
 *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>.
 *
 *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#include "../ccid.h"
#include "../dccp.h"
38
#include "lib/packet_history.h"
39
#include "lib/loss_interval.h"
40
#include "lib/tfrc.h"
41 42
#include "ccid3.h"

43 44 45
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG
static int ccid3_debug;
#define ccid3_pr_debug(format, a...)	DCCP_PR_DEBUG(ccid3_debug, format, ##a)
46 47 48 49
#else
#define ccid3_pr_debug(format, a...)
#endif

50 51
static struct dccp_tx_hist *ccid3_tx_hist;
static struct dccp_rx_hist *ccid3_rx_hist;
52
static struct dccp_li_hist *ccid3_li_hist;
53

54 55 56
/*
 *	Transmitter Half-Connection Routines
 */
57
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG
58 59 60 61 62 63 64 65 66 67 68 69 70
static const char *ccid3_tx_state_name(enum ccid3_hc_tx_states state)
{
	static char *ccid3_state_names[] = {
	[TFRC_SSTATE_NO_SENT]  = "NO_SENT",
	[TFRC_SSTATE_NO_FBACK] = "NO_FBACK",
	[TFRC_SSTATE_FBACK]    = "FBACK",
	[TFRC_SSTATE_TERM]     = "TERM",
	};

	return ccid3_state_names[state];
}
#endif

71 72
static void ccid3_hc_tx_set_state(struct sock *sk,
				  enum ccid3_hc_tx_states state)
73
{
74
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
75 76 77
	enum ccid3_hc_tx_states oldstate = hctx->ccid3hctx_state;

	ccid3_pr_debug("%s(%p) %-8.8s -> %s\n",
78 79
		       dccp_role(sk), sk, ccid3_tx_state_name(oldstate),
		       ccid3_tx_state_name(state));
80 81 82 83
	WARN_ON(state == oldstate);
	hctx->ccid3hctx_state = state;
}

84 85 86 87 88
/*
 * Recalculate scheduled nominal send time t_nom, inter-packet interval
 * t_ipi, and delta value. Should be called after each change to X.
 */
static inline void ccid3_update_send_time(struct ccid3_hc_tx_sock *hctx)
89
{
90 91
	timeval_sub_usecs(&hctx->ccid3hctx_t_nom, hctx->ccid3hctx_t_ipi);

92 93 94
	/* Calculate new t_ipi = s / X_inst (X_inst is in 64 * bytes/second) */
	hctx->ccid3hctx_t_ipi = scaled_div(hctx->ccid3hctx_s,
					   hctx->ccid3hctx_x >> 6);
95

96 97 98 99
	/* Update nominal send time with regard to the new t_ipi */
	timeval_add_usecs(&hctx->ccid3hctx_t_nom, hctx->ccid3hctx_t_ipi);

	/* Calculate new delta by delta = min(t_ipi / 2, t_gran / 2) */
100 101
	hctx->ccid3hctx_delta = min_t(u32, hctx->ccid3hctx_t_ipi / 2,
					   TFRC_OPSYS_HALF_TIME_GRAN);
102 103 104 105
}
/*
 * Update X by
 *    If (p > 0)
106
 *       X_calc = calcX(s, R, p);
107 108 109 110 111
 *       X = max(min(X_calc, 2 * X_recv), s / t_mbi);
 *    Else
 *       If (now - tld >= R)
 *          X = max(min(2 * X, 2 * X_recv), s / R);
 *          tld = now;
112
 *
113 114 115 116
 * Note: X and X_recv are both stored in units of 64 * bytes/second, to support
 *       fine-grained resolution of sending rates. This requires scaling by 2^6
 *       throughout the code. Only X_calc is unscaled (in bytes/second).
 *
117 118
 * If X has changed, we also update the scheduled send time t_now,
 * the inter-packet interval t_ipi, and the delta value.
119
 */
120 121
static void ccid3_hc_tx_update_x(struct sock *sk, struct timeval *now)

122
{
123
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
124
	const  __u64 old_x = hctx->ccid3hctx_x;
125

126
	if (hctx->ccid3hctx_p > 0) {
127

128
		hctx->ccid3hctx_x = min(((__u64)hctx->ccid3hctx_x_calc) << 6,
129
					hctx->ccid3hctx_x_recv * 2);
130 131
		hctx->ccid3hctx_x = max(hctx->ccid3hctx_x,
					(((__u64)hctx->ccid3hctx_s) << 6) /
132
								TFRC_T_MBI);
133

G
Gerrit Renker 已提交
134
	} else if (timeval_delta(now, &hctx->ccid3hctx_t_ld) -
135
			(suseconds_t)hctx->ccid3hctx_rtt >= 0) {
136

137 138 139
		hctx->ccid3hctx_x =
			max(2 * min(hctx->ccid3hctx_x, hctx->ccid3hctx_x_recv),
			    scaled_div(((__u64)hctx->ccid3hctx_s) << 6,
140
				       hctx->ccid3hctx_rtt));
141
		hctx->ccid3hctx_t_ld = *now;
142
	}
143

144 145
	if (hctx->ccid3hctx_x != old_x)
		ccid3_update_send_time(hctx);
146 147
}

148
/*
149 150
 *	Track the mean packet size `s' (cf. RFC 4342, 5.3 and  RFC 3448, 4.1)
 *	@len: DCCP packet payload size in bytes
151 152 153
 */
static inline void ccid3_hc_tx_update_s(struct ccid3_hc_tx_sock *hctx, int len)
{
154 155
	hctx->ccid3hctx_s = hctx->ccid3hctx_s == 0 ? len :
			    (9 * hctx->ccid3hctx_s + len) / 10;
156 157 158 159 160 161 162 163
	/*
	 * Note: We could do a potential optimisation here - when `s' changes,
	 *	 recalculate sending rate and consequently t_ipi, t_delta, and
	 *	 t_now. This is however non-standard, and the benefits are not
	 *	 clear, so it is currently left out.
	 */
}

164
/*
165 166
 *	Update Window Counter using the algorithm from [RFC 4342, 8.1].
 *	The algorithm is not applicable if RTT < 4 microseconds.
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
 */
static inline void ccid3_hc_tx_update_win_count(struct ccid3_hc_tx_sock *hctx,
						struct timeval *now)
{
	suseconds_t delta;
	u32 quarter_rtts;

	if (unlikely(hctx->ccid3hctx_rtt < 4))	/* avoid divide-by-zero */
		return;

	delta = timeval_delta(now, &hctx->ccid3hctx_t_last_win_count);
	DCCP_BUG_ON(delta < 0);

	quarter_rtts = (u32)delta / (hctx->ccid3hctx_rtt / 4);

	if (quarter_rtts > 0) {
		hctx->ccid3hctx_t_last_win_count = *now;
		hctx->ccid3hctx_last_win_count	+= min_t(u32, quarter_rtts, 5);
		hctx->ccid3hctx_last_win_count	&= 0xF;		/* mod 16 */

		ccid3_pr_debug("now at %#X\n", hctx->ccid3hctx_last_win_count);
	}
}

191 192 193
static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
{
	struct sock *sk = (struct sock *)data;
194
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
195
	unsigned long t_nfb = USEC_PER_SEC / 5;
196 197 198 199 200

	bh_lock_sock(sk);
	if (sock_owned_by_user(sk)) {
		/* Try again later. */
		/* XXX: set some sensible MIB */
201
		goto restart_timer;
202 203
	}

204
	ccid3_pr_debug("%s(%p, state=%s) - entry \n", dccp_role(sk), sk,
205
		       ccid3_tx_state_name(hctx->ccid3hctx_state));
206

207 208
	switch (hctx->ccid3hctx_state) {
	case TFRC_SSTATE_NO_FBACK:
209
		/* RFC 3448, 4.4: Halve send rate directly */
210 211 212
		hctx->ccid3hctx_x = max(hctx->ccid3hctx_x / 2,
					(((__u64)hctx->ccid3hctx_s) << 6) /
								    TFRC_T_MBI);
213

214 215
		ccid3_pr_debug("%s(%p, state=%s), updated tx rate to %u "
			       "bytes/s\n", dccp_role(sk), sk,
216
			       ccid3_tx_state_name(hctx->ccid3hctx_state),
217
			       (unsigned)(hctx->ccid3hctx_x >> 6));
218 219
		/* The value of R is still undefined and so we can not recompute
		 * the timout value. Keep initial value as per [RFC 4342, 5]. */
220
		t_nfb = TFRC_INITIAL_TIMEOUT;
221
		ccid3_update_send_time(hctx);
222 223
		break;
	case TFRC_SSTATE_FBACK:
224 225
		/*
		 * Check if IDLE since last timeout and recv rate is less than
226
		 * 4 packets (in units of 64*bytes/sec) per RTT
227 228
		 */
		if (!hctx->ccid3hctx_idle ||
229
		    (hctx->ccid3hctx_x_recv >= 4 *
230 231
		     scaled_div(((__u64)hctx->ccid3hctx_s) << 6,
				hctx->ccid3hctx_rtt))) {
232 233
			struct timeval now;

234
			ccid3_pr_debug("%s(%p, state=%s), not idle\n",
235
				       dccp_role(sk), sk,
236
				   ccid3_tx_state_name(hctx->ccid3hctx_state));
237

238 239 240 241
			/*
			 *  Modify the cached value of X_recv [RFC 3448, 4.4]
			 *
			 *  If (p == 0 || X_calc > 2 * X_recv)
242 243 244
			 *    X_recv = max(X_recv / 2, s / (2 * t_mbi));
			 *  Else
			 *    X_recv = X_calc / 4;
245 246
			 *
			 *  Note that X_recv is scaled by 2^6 while X_calc is not
247
			 */
248
			BUG_ON(hctx->ccid3hctx_p && !hctx->ccid3hctx_x_calc);
249

250
			if (hctx->ccid3hctx_p  == 0 ||
251 252
			    (hctx->ccid3hctx_x_calc >
			     (hctx->ccid3hctx_x_recv >> 5))) {
253 254

				hctx->ccid3hctx_x_recv =
255 256
					max(hctx->ccid3hctx_x_recv / 2,
					    (((__u64)hctx->ccid3hctx_s) << 6) /
257
							  (2 * TFRC_T_MBI));
258

259 260
				if (hctx->ccid3hctx_p == 0)
					dccp_timestamp(sk, &now);
261 262 263 264
			} else {
				hctx->ccid3hctx_x_recv = hctx->ccid3hctx_x_calc;
				hctx->ccid3hctx_x_recv <<= 4;
			}
265
			/* Now recalculate X [RFC 3448, 4.3, step (4)] */
266
			ccid3_hc_tx_update_x(sk, &now);
267
		}
268 269
		/*
		 * Schedule no feedback timer to expire in
270 271
		 * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
		 * See comments in packet_recv() regarding the value of t_RTO.
272
		 */
273
		t_nfb = max(hctx->ccid3hctx_t_rto, 2 * hctx->ccid3hctx_t_ipi);
274
		break;
275
	case TFRC_SSTATE_NO_SENT:
276
		DCCP_BUG("%s(%p) - Illegal state NO_SENT", dccp_role(sk), sk);
277 278
		/* fall through */
	case TFRC_SSTATE_TERM:
279 280 281 282
		goto out;
	}

	hctx->ccid3hctx_idle = 1;
283 284 285

restart_timer:
	sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
286
			   jiffies + usecs_to_jiffies(t_nfb));
287 288 289 290 291
out:
	bh_unlock_sock(sk);
	sock_put(sk);
}

292 293 294 295 296 297
/*
 * returns
 *   > 0: delay (in msecs) that should pass before actually sending
 *   = 0: can send immediately
 *   < 0: error condition; do not send packet
 */
298
static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
299 300
{
	struct dccp_sock *dp = dccp_sk(sk);
301
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
302
	struct timeval now;
G
Gerrit Renker 已提交
303
	suseconds_t delay;
304

305
	BUG_ON(hctx == NULL);
306

307
	/*
308 309 310
	 * This function is called only for Data and DataAck packets. Sending
	 * zero-sized Data(Ack)s is theoretically possible, but for congestion
	 * control this case is pathological - ignore it.
311
	 */
312
	if (unlikely(skb->len == 0))
313
		return -EBADMSG;
314

315
	dccp_timestamp(sk, &now);
316 317 318

	switch (hctx->ccid3hctx_state) {
	case TFRC_SSTATE_NO_SENT:
319
		sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
320
			       (jiffies +
321
				usecs_to_jiffies(TFRC_INITIAL_TIMEOUT)));
322 323 324 325
		hctx->ccid3hctx_last_win_count	 = 0;
		hctx->ccid3hctx_t_last_win_count = now;
		ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK);

326
		/* Set initial sending rate X/s to 1pps (X is scaled by 2^6) */
327
		ccid3_hc_tx_update_s(hctx, skb->len);
328 329
		hctx->ccid3hctx_x = hctx->ccid3hctx_s;
		hctx->ccid3hctx_x <<= 6;
330

331 332 333 334 335 336
		/* First timeout, according to [RFC 3448, 4.2], is 1 second */
		hctx->ccid3hctx_t_ipi = USEC_PER_SEC;
		/* Initial delta: minimum of 0.5 sec and t_gran/2 */
		hctx->ccid3hctx_delta = TFRC_OPSYS_HALF_TIME_GRAN;

		/* Set t_0 for initial packet */
337 338 339 340
		hctx->ccid3hctx_t_nom = now;
		break;
	case TFRC_SSTATE_NO_FBACK:
	case TFRC_SSTATE_FBACK:
341 342
		delay = timeval_delta(&hctx->ccid3hctx_t_nom, &now);
		/*
343
		 *	Scheduling of packet transmissions [RFC 3448, 4.6]
344 345 346 347 348 349
		 *
		 * if (t_now > t_nom - delta)
		 *       // send the packet now
		 * else
		 *       // send the packet in (t_nom - t_now) milliseconds.
		 */
G
Gerrit Renker 已提交
350
		if (delay - (suseconds_t)hctx->ccid3hctx_delta >= 0)
351
			return delay / 1000L;
352 353

		ccid3_hc_tx_update_win_count(hctx, &now);
354
		break;
355
	case TFRC_SSTATE_TERM:
356
		DCCP_BUG("%s(%p) - Illegal state TERM", dccp_role(sk), sk);
357
		return -EINVAL;
358 359
	}

360 361
	/* prepare to send now (add options etc.) */
	dp->dccps_hc_tx_insert_options = 1;
362 363 364
	DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count;

	/* set the nominal send time for the next following packet */
365 366 367
	timeval_add_usecs(&hctx->ccid3hctx_t_nom, hctx->ccid3hctx_t_ipi);

	return 0;
368 369
}

370 371
static void ccid3_hc_tx_packet_sent(struct sock *sk, int more,
				    unsigned int len)
372
{
373
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
374
	struct timeval now;
375
	struct dccp_tx_hist_entry *packet;
376

377
	BUG_ON(hctx == NULL);
378

379
	ccid3_hc_tx_update_s(hctx, len);
380

381
	packet = dccp_tx_hist_entry_new(ccid3_tx_hist, GFP_ATOMIC);
382
	if (unlikely(packet == NULL)) {
383
		DCCP_CRIT("packet history - out of memory!");
384 385
		return;
	}
386 387 388
	dccp_tx_hist_add_entry(&hctx->ccid3hctx_hist, packet);

	dccp_timestamp(sk, &now);
389
	packet->dccphtx_tstamp = now;
390 391 392 393
	packet->dccphtx_seqno  = dccp_sk(sk)->dccps_gss;
	packet->dccphtx_rtt    = hctx->ccid3hctx_rtt;
	packet->dccphtx_sent   = 1;
	hctx->ccid3hctx_idle   = 0;
394 395 396 397
}

static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
{
398 399
	const struct dccp_sock *dp = dccp_sk(sk);
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
400
	struct ccid3_options_received *opt_recv;
401
	struct dccp_tx_hist_entry *packet;
402
	struct timeval now;
403
	unsigned long t_nfb;
404
	u32 pinv;
405
	suseconds_t r_sample, t_elapsed;
406

407
	BUG_ON(hctx == NULL);
408 409 410 411 412 413 414 415 416 417 418

	/* we are only interested in ACKs */
	if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK ||
	      DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_DATAACK))
		return;

	opt_recv = &hctx->ccid3hctx_options_received;

	switch (hctx->ccid3hctx_state) {
	case TFRC_SSTATE_NO_FBACK:
	case TFRC_SSTATE_FBACK:
419
		/* get packet from history to look up t_recvdata */
420
		packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist,
421
					      DCCP_SKB_CB(skb)->dccpd_ack_seq);
422
		if (unlikely(packet == NULL)) {
423
			DCCP_WARN("%s(%p), seqno %llu(%s) doesn't exist "
424
				  "in history!\n",  dccp_role(sk), sk,
425
			    (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq,
426
				dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type));
427 428 429
			return;
		}

430
		/* Update receive rate in units of 64 * bytes/second */
431 432
		hctx->ccid3hctx_x_recv = opt_recv->ccid3or_receive_rate;
		hctx->ccid3hctx_x_recv <<= 6;
433 434 435

		/* Update loss event rate */
		pinv = opt_recv->ccid3or_loss_event_rate;
436
		if (pinv == ~0U || pinv == 0)	       /* see RFC 4342, 8.5   */
437
			hctx->ccid3hctx_p = 0;
438
		else				       /* can not exceed 100% */
439
			hctx->ccid3hctx_p = 1000000 / pinv;
440

441
		dccp_timestamp(sk, &now);
442 443 444

		/*
		 * Calculate new round trip sample as per [RFC 3448, 4.3] by
445
		 *	R_sample  =  (now - t_recvdata) - t_elapsed
446 447 448 449
		 */
		r_sample  = timeval_delta(&now, &packet->dccphtx_tstamp);
		t_elapsed = dp->dccps_options_received.dccpor_elapsed_time * 10;

G
Gerrit Renker 已提交
450 451
		DCCP_BUG_ON(r_sample < 0);
		if (unlikely(r_sample <= t_elapsed))
452 453
			DCCP_WARN("WARNING: r_sample=%dus <= t_elapsed=%dus\n",
				  (int)r_sample, (int)t_elapsed);
454 455
		else
			r_sample -= t_elapsed;
456
		CCID3_RTT_SANITY_CHECK(r_sample);
457

458
		/* Update RTT estimate by
459 460 461 462 463 464 465 466
		 * If (No feedback recv)
		 *    R = R_sample;
		 * Else
		 *    R = q * R + (1 - q) * R_sample;
		 *
		 * q is a constant, RFC 3448 recomments 0.9
		 */
		if (hctx->ccid3hctx_state == TFRC_SSTATE_NO_FBACK) {
467 468 469
			/*
			 * Larger Initial Windows [RFC 4342, sec. 5]
			 */
470 471
			__u32 w_init = min(4 * dp->dccps_mss_cache,
					   max(2 * dp->dccps_mss_cache, 4380U));
472
			hctx->ccid3hctx_rtt  = r_sample;
473
			hctx->ccid3hctx_x    = scaled_div(w_init << 6, r_sample);
474 475 476
			hctx->ccid3hctx_t_ld = now;

			ccid3_update_send_time(hctx);
477

478
			ccid3_pr_debug("%s(%p), s=%u, MSS=%u, w_init=%u, "
479
				       "R_sample=%dus, X=%u\n", dccp_role(sk),
A
Andrew Morton 已提交
480
				       sk, hctx->ccid3hctx_s,
481 482
				       dp->dccps_mss_cache,
				       w_init,
483
				       (int)r_sample,
484
				       (unsigned)(hctx->ccid3hctx_x >> 6));
485

486 487 488
			ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK);
		} else {
			hctx->ccid3hctx_rtt = (9 * hctx->ccid3hctx_rtt +
489
						   (u32)r_sample) / 10;
490

491 492 493 494 495 496
			/* Update sending rate (step 4 of [RFC 3448, 4.3]) */
			if (hctx->ccid3hctx_p > 0)
				hctx->ccid3hctx_x_calc =
					tfrc_calc_x(hctx->ccid3hctx_s,
						    hctx->ccid3hctx_rtt,
						    hctx->ccid3hctx_p);
497
			ccid3_hc_tx_update_x(sk, &now);
498

499
			ccid3_pr_debug("%s(%p), RTT=%uus (sample=%dus), s=%u, "
500 501
				       "p=%u, X_calc=%u, X_recv=%u, X=%u\n",
				       dccp_role(sk),
502
				       sk, hctx->ccid3hctx_rtt, (int)r_sample,
503 504
				       hctx->ccid3hctx_s, hctx->ccid3hctx_p,
				       hctx->ccid3hctx_x_calc,
505
				       (unsigned)(hctx->ccid3hctx_x_recv >> 6),
506
				       (unsigned)(hctx->ccid3hctx_x >> 6));
507 508 509 510 511 512
		}

		/* unschedule no feedback timer */
		sk_stop_timer(sk, &hctx->ccid3hctx_no_feedback_timer);

		/* remove all packets older than the one acked from history */
513 514
		dccp_tx_hist_purge_older(ccid3_tx_hist,
					 &hctx->ccid3hctx_hist, packet);
515
		/*
516 517
		 * As we have calculated new ipi, delta, t_nom it is possible
		 * that we now can send a packet, so wake up dccp_wait_for_ccid
518 519
		 */
		sk->sk_write_space(sk);
520

521 522 523
		/*
		 * Update timeout interval for the nofeedback timer.
		 * We use a configuration option to increase the lower bound.
524 525
		 * This can help avoid triggering the nofeedback timer too
		 * often ('spinning') on LANs with small RTTs.
526
		 */
527
		hctx->ccid3hctx_t_rto = max_t(u32, 4 * hctx->ccid3hctx_rtt,
528
						   CONFIG_IP_DCCP_CCID3_RTO *
529
						   (USEC_PER_SEC/1000));
530 531
		/*
		 * Schedule no feedback timer to expire in
532
		 * max(t_RTO, 2 * s/X)  =  max(t_RTO, 2 * t_ipi)
533
		 */
534
		t_nfb = max(hctx->ccid3hctx_t_rto, 2 * hctx->ccid3hctx_t_ipi);
535

536
		ccid3_pr_debug("%s(%p), Scheduled no feedback timer to "
537 538
			       "expire in %lu jiffies (%luus)\n",
			       dccp_role(sk),
539 540 541
			       sk, usecs_to_jiffies(t_nfb), t_nfb);

		sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
542
				   jiffies + usecs_to_jiffies(t_nfb));
543 544

		/* set idle flag */
545
		hctx->ccid3hctx_idle = 1;
546
		break;
547
	case TFRC_SSTATE_NO_SENT:	/* fall through */
G
Gerrit Renker 已提交
548
	case TFRC_SSTATE_TERM:		/* ignore feedback when closing */
549 550 551 552 553
		break;
	}
}

static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
554 555
				     unsigned char len, u16 idx,
				     unsigned char *value)
556 557
{
	int rc = 0;
558 559
	const struct dccp_sock *dp = dccp_sk(sk);
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
560 561
	struct ccid3_options_received *opt_recv;

562
	BUG_ON(hctx == NULL);
563 564 565 566 567 568 569 570 571 572 573 574 575

	opt_recv = &hctx->ccid3hctx_options_received;

	if (opt_recv->ccid3or_seqno != dp->dccps_gsr) {
		opt_recv->ccid3or_seqno		     = dp->dccps_gsr;
		opt_recv->ccid3or_loss_event_rate    = ~0;
		opt_recv->ccid3or_loss_intervals_idx = 0;
		opt_recv->ccid3or_loss_intervals_len = 0;
		opt_recv->ccid3or_receive_rate	     = 0;
	}

	switch (option) {
	case TFRC_OPT_LOSS_EVENT_RATE:
576
		if (unlikely(len != 4)) {
577
			DCCP_WARN("%s(%p), invalid len %d "
578 579
				  "for TFRC_OPT_LOSS_EVENT_RATE\n",
				  dccp_role(sk), sk, len);
580 581
			rc = -EINVAL;
		} else {
582 583
			opt_recv->ccid3or_loss_event_rate =
						ntohl(*(__be32 *)value);
584
			ccid3_pr_debug("%s(%p), LOSS_EVENT_RATE=%u\n",
585 586 587 588 589 590 591
				       dccp_role(sk), sk,
				       opt_recv->ccid3or_loss_event_rate);
		}
		break;
	case TFRC_OPT_LOSS_INTERVALS:
		opt_recv->ccid3or_loss_intervals_idx = idx;
		opt_recv->ccid3or_loss_intervals_len = len;
592
		ccid3_pr_debug("%s(%p), LOSS_INTERVALS=(%u, %u)\n",
593 594 595 596 597
			       dccp_role(sk), sk,
			       opt_recv->ccid3or_loss_intervals_idx,
			       opt_recv->ccid3or_loss_intervals_len);
		break;
	case TFRC_OPT_RECEIVE_RATE:
598
		if (unlikely(len != 4)) {
599
			DCCP_WARN("%s(%p), invalid len %d "
600 601
				  "for TFRC_OPT_RECEIVE_RATE\n",
				  dccp_role(sk), sk, len);
602 603
			rc = -EINVAL;
		} else {
604 605
			opt_recv->ccid3or_receive_rate =
						ntohl(*(__be32 *)value);
606
			ccid3_pr_debug("%s(%p), RECEIVE_RATE=%u\n",
607 608 609 610 611 612 613 614 615
				       dccp_role(sk), sk,
				       opt_recv->ccid3or_receive_rate);
		}
		break;
	}

	return rc;
}

616
static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
617
{
618
	struct ccid3_hc_tx_sock *hctx = ccid_priv(ccid);
619

620
	hctx->ccid3hctx_s     = 0;
621
	hctx->ccid3hctx_rtt   = 0;
622 623
	hctx->ccid3hctx_state = TFRC_SSTATE_NO_SENT;
	INIT_LIST_HEAD(&hctx->ccid3hctx_hist);
624

625 626
	hctx->ccid3hctx_no_feedback_timer.function =
				ccid3_hc_tx_no_feedback_timer;
627
	hctx->ccid3hctx_no_feedback_timer.data     = (unsigned long)sk;
628 629 630 631 632 633 634
	init_timer(&hctx->ccid3hctx_no_feedback_timer);

	return 0;
}

static void ccid3_hc_tx_exit(struct sock *sk)
{
635
	struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
636 637 638 639 640 641 642

	BUG_ON(hctx == NULL);

	ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM);
	sk_stop_timer(sk, &hctx->ccid3hctx_no_feedback_timer);

	/* Empty packet history */
643
	dccp_tx_hist_purge(ccid3_tx_hist, &hctx->ccid3hctx_hist);
644 645
}

646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686
static void ccid3_hc_tx_get_info(struct sock *sk, struct tcp_info *info)
{
	const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);

	/* Listen socks doesn't have a private CCID block */
	if (sk->sk_state == DCCP_LISTEN)
		return;

	BUG_ON(hctx == NULL);

	info->tcpi_rto = hctx->ccid3hctx_t_rto;
	info->tcpi_rtt = hctx->ccid3hctx_rtt;
}

static int ccid3_hc_tx_getsockopt(struct sock *sk, const int optname, int len,
				  u32 __user *optval, int __user *optlen)
{
	const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
	const void *val;

	/* Listen socks doesn't have a private CCID block */
	if (sk->sk_state == DCCP_LISTEN)
		return -EINVAL;

	switch (optname) {
	case DCCP_SOCKOPT_CCID_TX_INFO:
		if (len < sizeof(hctx->ccid3hctx_tfrc))
			return -EINVAL;
		len = sizeof(hctx->ccid3hctx_tfrc);
		val = &hctx->ccid3hctx_tfrc;
		break;
	default:
		return -ENOPROTOOPT;
	}

	if (put_user(len, optlen) || copy_to_user(optval, val, len))
		return -EFAULT;

	return 0;
}

687
/*
688
 *	Receiver Half-Connection Routines
689
 */
690
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG
691 692 693 694 695 696 697 698 699 700 701 702
static const char *ccid3_rx_state_name(enum ccid3_hc_rx_states state)
{
	static char *ccid3_rx_state_names[] = {
	[TFRC_RSTATE_NO_DATA] = "NO_DATA",
	[TFRC_RSTATE_DATA]    = "DATA",
	[TFRC_RSTATE_TERM]    = "TERM",
	};

	return ccid3_rx_state_names[state];
}
#endif

703 704
static void ccid3_hc_rx_set_state(struct sock *sk,
				  enum ccid3_hc_rx_states state)
705
{
706
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
707 708 709
	enum ccid3_hc_rx_states oldstate = hcrx->ccid3hcrx_state;

	ccid3_pr_debug("%s(%p) %-8.8s -> %s\n",
710 711
		       dccp_role(sk), sk, ccid3_rx_state_name(oldstate),
		       ccid3_rx_state_name(state));
712 713 714 715
	WARN_ON(state == oldstate);
	hcrx->ccid3hcrx_state = state;
}

716 717 718 719 720 721 722 723 724
static inline void ccid3_hc_rx_update_s(struct ccid3_hc_rx_sock *hcrx, int len)
{
	if (unlikely(len == 0))	/* don't update on empty packets (e.g. ACKs) */
		ccid3_pr_debug("Packet payload length is 0 - not updating\n");
	else
		hcrx->ccid3hcrx_s = hcrx->ccid3hcrx_s == 0 ? len :
				    (9 * hcrx->ccid3hcrx_s + len) / 10;
}

725 726
static void ccid3_hc_rx_send_feedback(struct sock *sk)
{
727
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
728
	struct dccp_sock *dp = dccp_sk(sk);
729
	struct dccp_rx_hist_entry *packet;
730
	struct timeval now;
G
Gerrit Renker 已提交
731
	suseconds_t delta;
732

733
	ccid3_pr_debug("%s(%p) - entry \n", dccp_role(sk), sk);
734

735
	dccp_timestamp(sk, &now);
736

737 738 739 740
	switch (hcrx->ccid3hcrx_state) {
	case TFRC_RSTATE_NO_DATA:
		hcrx->ccid3hcrx_x_recv = 0;
		break;
G
Gerrit Renker 已提交
741 742 743 744
	case TFRC_RSTATE_DATA:
		delta = timeval_delta(&now,
				      &hcrx->ccid3hcrx_tstamp_last_feedback);
		DCCP_BUG_ON(delta < 0);
745 746
		hcrx->ccid3hcrx_x_recv =
			scaled_div32(hcrx->ccid3hcrx_bytes_recv, delta);
747
		break;
748
	case TFRC_RSTATE_TERM:
749
		DCCP_BUG("%s(%p) - Illegal state TERM", dccp_role(sk), sk);
750 751 752
		return;
	}

753
	packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist);
754
	if (unlikely(packet == NULL)) {
755
		DCCP_WARN("%s(%p), no data packet in history!\n",
756
			  dccp_role(sk), sk);
757 758 759
		return;
	}

760
	hcrx->ccid3hcrx_tstamp_last_feedback = now;
I
Ian McDonald 已提交
761
	hcrx->ccid3hcrx_ccval_last_counter   = packet->dccphrx_ccval;
762 763
	hcrx->ccid3hcrx_bytes_recv	     = 0;

G
Gerrit Renker 已提交
764 765 766 767
	/* Elapsed time information [RFC 4340, 13.2] in units of 10 * usecs */
	delta = timeval_delta(&now, &packet->dccphrx_tstamp);
	DCCP_BUG_ON(delta < 0);
	hcrx->ccid3hcrx_elapsed_time = delta / 10;
768

769
	if (hcrx->ccid3hcrx_p == 0)
770 771 772 773 774
		hcrx->ccid3hcrx_pinv = ~0U;	/* see RFC 4342, 8.5 */
	else if (hcrx->ccid3hcrx_p > 1000000) {
		DCCP_WARN("p (%u) > 100%%\n", hcrx->ccid3hcrx_p);
		hcrx->ccid3hcrx_pinv = 1;	/* use 100% in this case */
	} else
775
		hcrx->ccid3hcrx_pinv = 1000000 / hcrx->ccid3hcrx_p;
776

777
	dp->dccps_hc_rx_insert_options = 1;
778 779 780
	dccp_send_ack(sk);
}

781
static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
782
{
783
	const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
784
	__be32 x_recv, pinv;
785

786 787 788
	BUG_ON(hcrx == NULL);

	if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN))
789
		return 0;
790

I
Ian McDonald 已提交
791
	DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_ccval_last_counter;
792 793

	if (dccp_packet_without_ack(skb))
794 795
		return 0;

796 797
	x_recv = htonl(hcrx->ccid3hcrx_x_recv);
	pinv   = htonl(hcrx->ccid3hcrx_pinv);
798 799 800 801 802 803

	if ((hcrx->ccid3hcrx_elapsed_time != 0 &&
	     dccp_insert_option_elapsed_time(sk, skb,
					     hcrx->ccid3hcrx_elapsed_time)) ||
	    dccp_insert_option_timestamp(sk, skb) ||
	    dccp_insert_option(sk, skb, TFRC_OPT_LOSS_EVENT_RATE,
804
			       &pinv, sizeof(pinv)) ||
805
	    dccp_insert_option(sk, skb, TFRC_OPT_RECEIVE_RATE,
806
			       &x_recv, sizeof(x_recv)))
807 808 809
		return -1;

	return 0;
810 811 812 813 814 815 816 817
}

/* calculate first loss interval
 *
 * returns estimated loss interval in usecs */

static u32 ccid3_hc_rx_calc_first_li(struct sock *sk)
{
818
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
819
	struct dccp_rx_hist_entry *entry, *next, *tail = NULL;
G
Gerrit Renker 已提交
820 821
	u32 x_recv, p;
	suseconds_t rtt, delta;
822
	struct timeval tstamp = { 0, };
823 824 825
	int interval = 0;
	int win_count = 0;
	int step = 0;
826
	u64 fval;
827

828 829 830
	list_for_each_entry_safe(entry, next, &hcrx->ccid3hcrx_hist,
				 dccphrx_node) {
		if (dccp_rx_hist_entry_data_packet(entry)) {
831 832 833 834
			tail = entry;

			switch (step) {
			case 0:
835
				tstamp	  = entry->dccphrx_tstamp;
836
				win_count = entry->dccphrx_ccval;
837 838 839
				step = 1;
				break;
			case 1:
840
				interval = win_count - entry->dccphrx_ccval;
841 842 843 844 845 846 847 848 849
				if (interval < 0)
					interval += TFRC_WIN_COUNT_LIMIT;
				if (interval > 4)
					goto found;
				break;
			}
		}
	}

850
	if (unlikely(step == 0)) {
851
		DCCP_WARN("%s(%p), packet history has no data packets!\n",
852
			  dccp_role(sk), sk);
853 854 855
		return ~0;
	}

856
	if (unlikely(interval == 0)) {
857
		DCCP_WARN("%s(%p), Could not find a win_count interval > 0."
858
			  "Defaulting to 1\n", dccp_role(sk), sk);
859 860 861
		interval = 1;
	}
found:
I
Ian McDonald 已提交
862
	if (!tail) {
863
		DCCP_CRIT("tail is null\n");
I
Ian McDonald 已提交
864 865
		return ~0;
	}
G
Gerrit Renker 已提交
866 867 868 869 870

	delta = timeval_delta(&tstamp, &tail->dccphrx_tstamp);
	DCCP_BUG_ON(delta < 0);

	rtt = delta * 4 / interval;
871 872
	ccid3_pr_debug("%s(%p), approximated RTT to %dus\n",
		       dccp_role(sk), sk, (int)rtt);
873

874 875 876
	/*
	 * Determine the length of the first loss interval via inverse lookup.
	 * Assume that X_recv can be computed by the throughput equation
877 878 879
	 *		    s
	 *	X_recv = --------
	 *		 R * fval
880 881 882
	 * Find some p such that f(p) = fval; return 1/p [RFC 3448, 6.3.1].
	 */
	if (rtt == 0) {			/* would result in divide-by-zero */
883 884
		DCCP_WARN("RTT==0\n");
		return ~0;
885
	}
886

887 888
	dccp_timestamp(sk, &tstamp);
	delta = timeval_delta(&tstamp, &hcrx->ccid3hcrx_tstamp_last_feedback);
G
Gerrit Renker 已提交
889
	DCCP_BUG_ON(delta <= 0);
890

G
Gerrit Renker 已提交
891
	x_recv = scaled_div32(hcrx->ccid3hcrx_bytes_recv, delta);
892 893 894 895
	if (x_recv == 0) {		/* would also trigger divide-by-zero */
		DCCP_WARN("X_recv==0\n");
		if ((x_recv = hcrx->ccid3hcrx_x_recv) == 0) {
			DCCP_BUG("stored value of X_recv is zero");
896
			return ~0;
897
		}
I
Ian McDonald 已提交
898 899
	}

900 901
	fval = scaled_div(hcrx->ccid3hcrx_s, rtt);
	fval = scaled_div32(fval, x_recv);
902
	p = tfrc_calc_x_reverse_lookup(fval);
903

904
	ccid3_pr_debug("%s(%p), receive rate=%u bytes/s, implied "
905
		       "loss rate=%u\n", dccp_role(sk), sk, x_recv, p);
906 907 908 909

	if (p == 0)
		return ~0;
	else
910
		return 1000000 / p;
911 912 913 914
}

static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss)
{
915
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
916
	struct dccp_li_hist_entry *head;
I
Ian McDonald 已提交
917
	u64 seq_temp;
918

I
Ian McDonald 已提交
919 920 921 922
	if (list_empty(&hcrx->ccid3hcrx_li_hist)) {
		if (!dccp_li_hist_interval_new(ccid3_li_hist,
		   &hcrx->ccid3hcrx_li_hist, seq_loss, win_loss))
			return;
923

924 925 926
		head = list_entry(hcrx->ccid3hcrx_li_hist.next,
		   struct dccp_li_hist_entry, dccplih_node);
		head->dccplih_interval = ccid3_hc_rx_calc_first_li(sk);
I
Ian McDonald 已提交
927 928 929 930
	} else {
		struct dccp_li_hist_entry *entry;
		struct list_head *tail;

931 932
		head = list_entry(hcrx->ccid3hcrx_li_hist.next,
		   struct dccp_li_hist_entry, dccplih_node);
I
Ian McDonald 已提交
933 934 935 936 937 938 939
		/* FIXME win count check removed as was wrong */
		/* should make this check with receive history */
		/* and compare there as per section 10.2 of RFC4342 */

		/* new loss event detected */
		/* calculate last interval length */
		seq_temp = dccp_delta_seqno(head->dccplih_seqno, seq_loss);
940
		entry = dccp_li_hist_entry_new(ccid3_li_hist, GFP_ATOMIC);
I
Ian McDonald 已提交
941 942

		if (entry == NULL) {
943
			DCCP_BUG("out of memory - can not allocate entry");
944
			return;
I
Ian McDonald 已提交
945 946 947 948 949 950 951 952 953 954 955 956 957
		}

		list_add(&entry->dccplih_node, &hcrx->ccid3hcrx_li_hist);

		tail = hcrx->ccid3hcrx_li_hist.prev;
		list_del(tail);
		kmem_cache_free(ccid3_li_hist->dccplih_slab, tail);

		/* Create the newest interval */
		entry->dccplih_seqno = seq_loss;
		entry->dccplih_interval = seq_temp;
		entry->dccplih_win_count = win_loss;
	}
958 959
}

I
Ian McDonald 已提交
960
static int ccid3_hc_rx_detect_loss(struct sock *sk,
961
				    struct dccp_rx_hist_entry *packet)
962
{
963
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
964 965
	struct dccp_rx_hist_entry *rx_hist =
				dccp_rx_hist_head(&hcrx->ccid3hcrx_hist);
I
Ian McDonald 已提交
966 967 968 969 970 971 972 973 974 975 976 977 978 979 980
	u64 seqno = packet->dccphrx_seqno;
	u64 tmp_seqno;
	int loss = 0;
	u8 ccval;


	tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss;

	if (!rx_hist ||
	   follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) {
		hcrx->ccid3hcrx_seqno_nonloss = seqno;
		hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval;
		goto detect_out;
	}

981

I
Ian McDonald 已提交
982 983 984 985 986 987 988 989 990 991 992
	while (dccp_delta_seqno(hcrx->ccid3hcrx_seqno_nonloss, seqno)
	   > TFRC_RECV_NUM_LATE_LOSS) {
		loss = 1;
		ccid3_hc_rx_update_li(sk, hcrx->ccid3hcrx_seqno_nonloss,
		   hcrx->ccid3hcrx_ccval_nonloss);
		tmp_seqno = hcrx->ccid3hcrx_seqno_nonloss;
		dccp_inc_seqno(&tmp_seqno);
		hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno;
		dccp_inc_seqno(&tmp_seqno);
		while (dccp_rx_hist_find_entry(&hcrx->ccid3hcrx_hist,
		   tmp_seqno, &ccval)) {
993
			hcrx->ccid3hcrx_seqno_nonloss = tmp_seqno;
I
Ian McDonald 已提交
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
			hcrx->ccid3hcrx_ccval_nonloss = ccval;
			dccp_inc_seqno(&tmp_seqno);
		}
	}

	/* FIXME - this code could be simplified with above while */
	/* but works at moment */
	if (follows48(packet->dccphrx_seqno, hcrx->ccid3hcrx_seqno_nonloss)) {
		hcrx->ccid3hcrx_seqno_nonloss = seqno;
		hcrx->ccid3hcrx_ccval_nonloss = packet->dccphrx_ccval;
	}

detect_out:
	dccp_rx_hist_add_packet(ccid3_rx_hist, &hcrx->ccid3hcrx_hist,
		   &hcrx->ccid3hcrx_li_hist, packet,
		   hcrx->ccid3hcrx_seqno_nonloss);
	return loss;
1011 1012 1013 1014
}

static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
{
1015
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1016
	const struct dccp_options_received *opt_recv;
1017
	struct dccp_rx_hist_entry *packet;
1018
	struct timeval now;
G
Gerrit Renker 已提交
1019 1020
	u32 p_prev, rtt_prev;
	suseconds_t r_sample, t_elapsed;
1021
	int loss, payload_size;
1022

1023
	BUG_ON(hcrx == NULL);
1024

1025
	opt_recv = &dccp_sk(sk)->dccps_options_received;
1026

1027 1028 1029 1030 1031
	switch (DCCP_SKB_CB(skb)->dccpd_type) {
	case DCCP_PKT_ACK:
		if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
			return;
	case DCCP_PKT_DATAACK:
1032
		if (opt_recv->dccpor_timestamp_echo == 0)
1033
			break;
I
Ian McDonald 已提交
1034
		rtt_prev = hcrx->ccid3hcrx_rtt;
1035
		dccp_timestamp(sk, &now);
1036 1037 1038 1039
		timeval_sub_usecs(&now, opt_recv->dccpor_timestamp_echo * 10);
		r_sample = timeval_usecs(&now);
		t_elapsed = opt_recv->dccpor_elapsed_time * 10;

G
Gerrit Renker 已提交
1040
		DCCP_BUG_ON(r_sample < 0);
1041
		if (unlikely(r_sample <= t_elapsed))
G
Gerrit Renker 已提交
1042
			DCCP_WARN("r_sample=%ldus, t_elapsed=%ldus\n",
A
Andrew Morton 已提交
1043
				  (long)r_sample, (long)t_elapsed);
1044 1045
		else
			r_sample -= t_elapsed;
1046
		CCID3_RTT_SANITY_CHECK(r_sample);
1047 1048 1049 1050 1051 1052 1053

		if (hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA)
			hcrx->ccid3hcrx_rtt = r_sample;
		else
			hcrx->ccid3hcrx_rtt = (hcrx->ccid3hcrx_rtt * 9) / 10 +
					      r_sample / 10;

I
Ian McDonald 已提交
1054
		if (rtt_prev != hcrx->ccid3hcrx_rtt)
1055 1056
			ccid3_pr_debug("%s(%p), New RTT=%uus, elapsed time=%u\n",
				       dccp_role(sk), sk, hcrx->ccid3hcrx_rtt,
1057
				       opt_recv->dccpor_elapsed_time);
1058 1059 1060
		break;
	case DCCP_PKT_DATA:
		break;
1061
	default: /* We're not interested in other packet types, move along */
1062 1063 1064
		return;
	}

1065
	packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp,
1066
					skb, GFP_ATOMIC);
1067
	if (unlikely(packet == NULL)) {
1068
		DCCP_WARN("%s(%p), Not enough mem to add rx packet "
1069
			  "to history, consider it lost!\n", dccp_role(sk), sk);
1070 1071 1072
		return;
	}

I
Ian McDonald 已提交
1073
	loss = ccid3_hc_rx_detect_loss(sk, packet);
1074 1075 1076 1077

	if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK)
		return;

1078 1079 1080
	payload_size = skb->len - dccp_hdr(skb)->dccph_doff * 4;
	ccid3_hc_rx_update_s(hcrx, payload_size);

1081 1082
	switch (hcrx->ccid3hcrx_state) {
	case TFRC_RSTATE_NO_DATA:
1083 1084
		ccid3_pr_debug("%s(%p, state=%s), skb=%p, sending initial "
			       "feedback\n", dccp_role(sk), sk,
1085
			       dccp_state_name(sk->sk_state), skb);
1086 1087 1088 1089
		ccid3_hc_rx_send_feedback(sk);
		ccid3_hc_rx_set_state(sk, TFRC_RSTATE_DATA);
		return;
	case TFRC_RSTATE_DATA:
1090
		hcrx->ccid3hcrx_bytes_recv += payload_size;
I
Ian McDonald 已提交
1091
		if (loss)
1092 1093
			break;

1094
		dccp_timestamp(sk, &now);
1095 1096
		if ((timeval_delta(&now, &hcrx->ccid3hcrx_tstamp_last_ack) -
		     (suseconds_t)hcrx->ccid3hcrx_rtt) >= 0) {
1097 1098
			hcrx->ccid3hcrx_tstamp_last_ack = now;
			ccid3_hc_rx_send_feedback(sk);
1099
		}
1100
		return;
1101
	case TFRC_RSTATE_TERM:
1102
		DCCP_BUG("%s(%p) - Illegal state TERM", dccp_role(sk), sk);
1103 1104 1105 1106
		return;
	}

	/* Dealing with packet loss */
1107
	ccid3_pr_debug("%s(%p, state=%s), data loss! Reacting...\n",
1108
		       dccp_role(sk), sk, dccp_state_name(sk->sk_state));
1109 1110

	p_prev = hcrx->ccid3hcrx_p;
1111

1112
	/* Calculate loss event rate */
I
Ian McDonald 已提交
1113 1114 1115
	if (!list_empty(&hcrx->ccid3hcrx_li_hist)) {
		u32 i_mean = dccp_li_hist_calc_i_mean(&hcrx->ccid3hcrx_li_hist);

1116
		/* Scaling up by 1000000 as fixed decimal */
I
Ian McDonald 已提交
1117 1118
		if (i_mean != 0)
			hcrx->ccid3hcrx_p = 1000000 / i_mean;
1119 1120
	} else
		DCCP_BUG("empty loss history");
1121 1122 1123 1124 1125 1126 1127

	if (hcrx->ccid3hcrx_p > p_prev) {
		ccid3_hc_rx_send_feedback(sk);
		return;
	}
}

1128
static int ccid3_hc_rx_init(struct ccid *ccid, struct sock *sk)
1129
{
1130
	struct ccid3_hc_rx_sock *hcrx = ccid_priv(ccid);
1131

1132
	ccid3_pr_debug("entry\n");
1133 1134 1135

	hcrx->ccid3hcrx_state = TFRC_RSTATE_NO_DATA;
	INIT_LIST_HEAD(&hcrx->ccid3hcrx_hist);
1136
	INIT_LIST_HEAD(&hcrx->ccid3hcrx_li_hist);
1137
	dccp_timestamp(sk, &hcrx->ccid3hcrx_tstamp_last_ack);
1138
	hcrx->ccid3hcrx_tstamp_last_feedback = hcrx->ccid3hcrx_tstamp_last_ack;
1139
	hcrx->ccid3hcrx_s   = 0;
1140
	hcrx->ccid3hcrx_rtt = 0;
1141 1142 1143 1144 1145
	return 0;
}

static void ccid3_hc_rx_exit(struct sock *sk)
{
1146
	struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1147

1148
	BUG_ON(hcrx == NULL);
1149 1150 1151 1152

	ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM);

	/* Empty packet history */
1153
	dccp_rx_hist_purge(ccid3_rx_hist, &hcrx->ccid3hcrx_hist);
1154 1155

	/* Empty loss interval history */
1156
	dccp_li_hist_purge(ccid3_li_hist, &hcrx->ccid3hcrx_li_hist);
1157 1158
}

1159 1160
static void ccid3_hc_rx_get_info(struct sock *sk, struct tcp_info *info)
{
1161
	const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1162

1163 1164 1165 1166
	/* Listen socks doesn't have a private CCID block */
	if (sk->sk_state == DCCP_LISTEN)
		return;

1167
	BUG_ON(hcrx == NULL);
1168

1169 1170 1171
	info->tcpi_ca_state = hcrx->ccid3hcrx_state;
	info->tcpi_options  |= TCPI_OPT_TIMESTAMPS;
	info->tcpi_rcv_rtt  = hcrx->ccid3hcrx_rtt;
1172 1173
}

1174 1175 1176 1177 1178
static int ccid3_hc_rx_getsockopt(struct sock *sk, const int optname, int len,
				  u32 __user *optval, int __user *optlen)
{
	const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
	const void *val;
1179

1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
	/* Listen socks doesn't have a private CCID block */
	if (sk->sk_state == DCCP_LISTEN)
		return -EINVAL;

	switch (optname) {
	case DCCP_SOCKOPT_CCID_RX_INFO:
		if (len < sizeof(hcrx->ccid3hcrx_tfrc))
			return -EINVAL;
		len = sizeof(hcrx->ccid3hcrx_tfrc);
		val = &hcrx->ccid3hcrx_tfrc;
		break;
	default:
		return -ENOPROTOOPT;
	}

	if (put_user(len, optlen) || copy_to_user(optval, val, len))
		return -EFAULT;

	return 0;
}

1201
static struct ccid_operations ccid3 = {
I
Ian McDonald 已提交
1202
	.ccid_id		   = DCCPC_CCID3,
1203 1204
	.ccid_name		   = "ccid3",
	.ccid_owner		   = THIS_MODULE,
1205
	.ccid_hc_tx_obj_size	   = sizeof(struct ccid3_hc_tx_sock),
1206 1207 1208 1209 1210 1211
	.ccid_hc_tx_init	   = ccid3_hc_tx_init,
	.ccid_hc_tx_exit	   = ccid3_hc_tx_exit,
	.ccid_hc_tx_send_packet	   = ccid3_hc_tx_send_packet,
	.ccid_hc_tx_packet_sent	   = ccid3_hc_tx_packet_sent,
	.ccid_hc_tx_packet_recv	   = ccid3_hc_tx_packet_recv,
	.ccid_hc_tx_parse_options  = ccid3_hc_tx_parse_options,
1212
	.ccid_hc_rx_obj_size	   = sizeof(struct ccid3_hc_rx_sock),
1213 1214 1215 1216
	.ccid_hc_rx_init	   = ccid3_hc_rx_init,
	.ccid_hc_rx_exit	   = ccid3_hc_rx_exit,
	.ccid_hc_rx_insert_options = ccid3_hc_rx_insert_options,
	.ccid_hc_rx_packet_recv	   = ccid3_hc_rx_packet_recv,
1217 1218
	.ccid_hc_rx_get_info	   = ccid3_hc_rx_get_info,
	.ccid_hc_tx_get_info	   = ccid3_hc_tx_get_info,
1219 1220
	.ccid_hc_rx_getsockopt	   = ccid3_hc_rx_getsockopt,
	.ccid_hc_tx_getsockopt	   = ccid3_hc_tx_getsockopt,
1221
};
1222

1223
#ifdef CONFIG_IP_DCCP_CCID3_DEBUG
1224 1225
module_param(ccid3_debug, int, 0444);
MODULE_PARM_DESC(ccid3_debug, "Enable debug messages");
1226
#endif
1227 1228 1229

static __init int ccid3_module_init(void)
{
1230
	int rc = -ENOBUFS;
1231

1232 1233
	ccid3_rx_hist = dccp_rx_hist_new("ccid3");
	if (ccid3_rx_hist == NULL)
1234 1235
		goto out;

1236 1237 1238
	ccid3_tx_hist = dccp_tx_hist_new("ccid3");
	if (ccid3_tx_hist == NULL)
		goto out_free_rx;
1239

1240 1241
	ccid3_li_hist = dccp_li_hist_new("ccid3");
	if (ccid3_li_hist == NULL)
1242
		goto out_free_tx;
1243 1244

	rc = ccid_register(&ccid3);
1245
	if (rc != 0)
1246 1247 1248
		goto out_free_loss_interval_history;
out:
	return rc;
1249

1250
out_free_loss_interval_history:
1251 1252
	dccp_li_hist_delete(ccid3_li_hist);
	ccid3_li_hist = NULL;
1253 1254 1255 1256 1257 1258
out_free_tx:
	dccp_tx_hist_delete(ccid3_tx_hist);
	ccid3_tx_hist = NULL;
out_free_rx:
	dccp_rx_hist_delete(ccid3_rx_hist);
	ccid3_rx_hist = NULL;
1259 1260 1261 1262 1263 1264 1265 1266
	goto out;
}
module_init(ccid3_module_init);

static __exit void ccid3_module_exit(void)
{
	ccid_unregister(&ccid3);

1267 1268 1269
	if (ccid3_tx_hist != NULL) {
		dccp_tx_hist_delete(ccid3_tx_hist);
		ccid3_tx_hist = NULL;
1270
	}
1271 1272 1273
	if (ccid3_rx_hist != NULL) {
		dccp_rx_hist_delete(ccid3_rx_hist);
		ccid3_rx_hist = NULL;
1274
	}
1275 1276 1277
	if (ccid3_li_hist != NULL) {
		dccp_li_hist_delete(ccid3_li_hist);
		ccid3_li_hist = NULL;
1278 1279 1280 1281
	}
}
module_exit(ccid3_module_exit);

1282
MODULE_AUTHOR("Ian McDonald <ian.mcdonald@jandi.co.nz>, "
1283
	      "Arnaldo Carvalho de Melo <acme@ghostprotocols.net>");
1284 1285 1286
MODULE_DESCRIPTION("DCCP TFRC CCID3 CCID");
MODULE_LICENSE("GPL");
MODULE_ALIAS("net-dccp-ccid-3");