options.c 17.1 KB
Newer Older
1 2 3 4
/*
 *  net/dccp/options.c
 *
 *  An implementation of the DCCP protocol
I
Ian McDonald 已提交
5 6
 *  Copyright (c) 2005 Aristeu Sergio Rozanski Filho <aris@cathedrallabs.org>
 *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
7
 *  Copyright (c) 2005 Ian McDonald <ian.mcdonald@jandi.co.nz>
8 9 10 11 12 13 14 15 16
 *
 *      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.
 */
#include <linux/dccp.h>
#include <linux/module.h>
#include <linux/types.h>
G
Gerrit Renker 已提交
17
#include <asm/unaligned.h>
18 19 20
#include <linux/kernel.h>
#include <linux/skbuff.h>

21
#include "ackvec.h"
22 23
#include "ccid.h"
#include "dccp.h"
24
#include "feat.h"
25

26
u64 dccp_decode_value_var(const u8 *bf, const u8 len)
27
{
28
	u64 value = 0;
29

30 31 32 33
	if (len >= DCCP_OPTVAL_MAXLEN)
		value += ((u64)*bf++) << 40;
	if (len > 4)
		value += ((u64)*bf++) << 32;
34
	if (len > 3)
35
		value += ((u64)*bf++) << 24;
36
	if (len > 2)
37
		value += ((u64)*bf++) << 16;
38
	if (len > 1)
39
		value += ((u64)*bf++) << 8;
40 41 42 43 44 45
	if (len > 0)
		value += *bf;

	return value;
}

46 47 48 49 50 51 52
/**
 * dccp_parse_options  -  Parse DCCP options present in @skb
 * @sk: client|server|listening dccp socket (when @dreq != NULL)
 * @dreq: request socket to use during connection setup, or NULL
 */
int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
		       struct sk_buff *skb)
53 54 55 56 57 58
{
	struct dccp_sock *dp = dccp_sk(sk);
	const struct dccp_hdr *dh = dccp_hdr(skb);
	const u8 pkt_type = DCCP_SKB_CB(skb)->dccpd_type;
	unsigned char *options = (unsigned char *)dh + dccp_hdr_len(skb);
	unsigned char *opt_ptr = options;
59 60
	const unsigned char *opt_end = (unsigned char *)dh +
					(dh->dccph_doff * 4);
61 62 63
	struct dccp_options_received *opt_recv = &dp->dccps_options_received;
	unsigned char opt, len;
	unsigned char *value;
64
	u32 elapsed_time;
G
Gerrit Renker 已提交
65
	__be32 opt_val;
66 67
	int rc;
	int mandatory = 0;
68 69 70

	memset(opt_recv, 0, sizeof(*opt_recv));

71
	opt = len = 0;
72 73 74 75 76 77 78 79
	while (opt_ptr != opt_end) {
		opt   = *opt_ptr++;
		len   = 0;
		value = NULL;

		/* Check if this isn't a single byte option */
		if (opt > DCCPO_MAX_RESERVED) {
			if (opt_ptr == opt_end)
80
				goto out_nonsensical_length;
81 82

			len = *opt_ptr++;
83 84
			if (len < 2)
				goto out_nonsensical_length;
85 86 87 88 89 90 91 92 93
			/*
			 * Remove the type and len fields, leaving
			 * just the value size
			 */
			len	-= 2;
			value	= opt_ptr;
			opt_ptr += len;

			if (opt_ptr > opt_end)
94
				goto out_nonsensical_length;
95 96
		}

97 98 99
		/*
		 * CCID-specific options are ignored during connection setup, as
		 * negotiation may still be in progress (see RFC 4340, 10.3).
100
		 * The same applies to Ack Vectors, as these depend on the CCID.
101
		 */
102
		if (dreq != NULL && (opt >= DCCPO_MIN_RX_CCID_SPECIFIC ||
103
		    opt == DCCPO_ACK_VECTOR_0 || opt == DCCPO_ACK_VECTOR_1))
104 105
			goto ignore_option;

106 107 108
		switch (opt) {
		case DCCPO_PADDING:
			break;
109 110 111
		case DCCPO_MANDATORY:
			if (mandatory)
				goto out_invalid_option;
112 113
			if (pkt_type != DCCP_PKT_DATA)
				mandatory = 1;
114
			break;
115
		case DCCPO_NDP_COUNT:
116
			if (len > 6)
117 118 119
				goto out_invalid_option;

			opt_recv->dccpor_ndp = dccp_decode_value_var(value, len);
120 121
			dccp_pr_debug("%s opt: NDP count=%llu\n", dccp_role(sk),
				      (unsigned long long)opt_recv->dccpor_ndp);
122
			break;
G
Gerrit Renker 已提交
123 124
		case DCCPO_CHANGE_L ... DCCPO_CONFIRM_R:
			if (pkt_type == DCCP_PKT_DATA)      /* RFC 4340, 6 */
125
				break;
126 127 128 129
			rc = dccp_feat_parse_options(sk, dreq, mandatory, opt,
						    *value, value + 1, len - 1);
			if (rc)
				goto out_featneg_failed;
130
			break;
131 132 133
		case DCCPO_TIMESTAMP:
			if (len != 4)
				goto out_invalid_option;
134 135 136 137 138
			/*
			 * RFC 4340 13.1: "The precise time corresponding to
			 * Timestamp Value zero is not specified". We use
			 * zero to indicate absence of a meaningful timestamp.
			 */
G
Gerrit Renker 已提交
139
			opt_val = get_unaligned((__be32 *)value);
140 141 142 143
			if (unlikely(opt_val == 0)) {
				DCCP_WARN("Timestamp with zero value\n");
				break;
			}
144

145 146 147 148 149 150 151 152
			if (dreq != NULL) {
				dreq->dreq_timestamp_echo = ntohl(opt_val);
				dreq->dreq_timestamp_time = dccp_timestamp();
			} else {
				opt_recv->dccpor_timestamp =
					dp->dccps_timestamp_echo = ntohl(opt_val);
				dp->dccps_timestamp_time = dccp_timestamp();
			}
153
			dccp_pr_debug("%s rx opt: TIMESTAMP=%u, ackno=%llu\n",
154
				      dccp_role(sk), ntohl(opt_val),
155
				      (unsigned long long)
156
				      DCCP_SKB_CB(skb)->dccpd_ack_seq);
157 158
			/* schedule an Ack in case this sender is quiescent */
			inet_csk_schedule_ack(sk);
159 160
			break;
		case DCCPO_TIMESTAMP_ECHO:
I
Ian McDonald 已提交
161
			if (len != 4 && len != 6 && len != 8)
162 163
				goto out_invalid_option;

G
Gerrit Renker 已提交
164 165
			opt_val = get_unaligned((__be32 *)value);
			opt_recv->dccpor_timestamp_echo = ntohl(opt_val);
166

167
			dccp_pr_debug("%s rx opt: TIMESTAMP_ECHO=%u, len=%d, "
168
				      "ackno=%llu", dccp_role(sk),
169
				      opt_recv->dccpor_timestamp_echo,
170 171
				      len + 2,
				      (unsigned long long)
I
Ian McDonald 已提交
172 173
				      DCCP_SKB_CB(skb)->dccpd_ack_seq);

G
Gerrit Renker 已提交
174
			value += 4;
I
Ian McDonald 已提交
175

G
Gerrit Renker 已提交
176
			if (len == 4) {		/* no elapsed time included */
177
				dccp_pr_debug_cat("\n");
178
				break;
179
			}
180

G
Gerrit Renker 已提交
181 182 183 184 185 186 187
			if (len == 6) {		/* 2-byte elapsed time */
				__be16 opt_val2 = get_unaligned((__be16 *)value);
				elapsed_time = ntohs(opt_val2);
			} else {		/* 4-byte elapsed time */
				opt_val = get_unaligned((__be32 *)value);
				elapsed_time = ntohl(opt_val);
			}
188

G
Gerrit Renker 已提交
189
			dccp_pr_debug_cat(", ELAPSED_TIME=%u\n", elapsed_time);
190

191 192 193
			/* Give precedence to the biggest ELAPSED_TIME */
			if (elapsed_time > opt_recv->dccpor_elapsed_time)
				opt_recv->dccpor_elapsed_time = elapsed_time;
194 195
			break;
		case DCCPO_ELAPSED_TIME:
196 197
			if (dccp_packet_without_ack(skb))   /* RFC 4340, 13.2 */
				break;
I
Ian McDonald 已提交
198

G
Gerrit Renker 已提交
199 200 201
			if (len == 2) {
				__be16 opt_val2 = get_unaligned((__be16 *)value);
				elapsed_time = ntohs(opt_val2);
202
			} else if (len == 4) {
G
Gerrit Renker 已提交
203 204
				opt_val = get_unaligned((__be32 *)value);
				elapsed_time = ntohl(opt_val);
205 206
			} else {
				goto out_invalid_option;
G
Gerrit Renker 已提交
207
			}
208 209 210

			if (elapsed_time > opt_recv->dccpor_elapsed_time)
				opt_recv->dccpor_elapsed_time = elapsed_time;
I
Ian McDonald 已提交
211

212 213
			dccp_pr_debug("%s rx opt: ELAPSED_TIME=%d\n",
				      dccp_role(sk), elapsed_time);
214
			break;
215
		case DCCPO_MIN_RX_CCID_SPECIFIC ... DCCPO_MAX_RX_CCID_SPECIFIC:
216
			if (ccid_hc_rx_parse_options(dp->dccps_hc_rx_ccid, sk,
217
						     pkt_type, opt, value, len))
218 219
				goto out_invalid_option;
			break;
220 221 222 223 224 225 226 227 228 229
		case DCCPO_ACK_VECTOR_0:
		case DCCPO_ACK_VECTOR_1:
			if (dccp_packet_without_ack(skb))   /* RFC 4340, 11.4 */
				break;
			/*
			 * Ack vectors are processed by the TX CCID if it is
			 * interested. The RX CCID need not parse Ack Vectors,
			 * since it is only interested in clearing old state.
			 * Fall through.
			 */
230
		case DCCPO_MIN_TX_CCID_SPECIFIC ... DCCPO_MAX_TX_CCID_SPECIFIC:
231
			if (ccid_hc_tx_parse_options(dp->dccps_hc_tx_ccid, sk,
232
						     pkt_type, opt, value, len))
233 234 235
				goto out_invalid_option;
			break;
		default:
236 237
			DCCP_CRIT("DCCP(%p): option %d(len=%d) not "
				  "implemented, ignoring", sk, opt, len);
238
			break;
239
		}
240
ignore_option:
241 242
		if (opt != DCCPO_MANDATORY)
			mandatory = 0;
243 244
	}

245 246 247 248
	/* mandatory was the last byte in option list -> reset connection */
	if (mandatory)
		goto out_invalid_option;

249 250
out_nonsensical_length:
	/* RFC 4340, 5.8: ignore option and all remaining option space */
251 252 253 254
	return 0;

out_invalid_option:
	DCCP_INC_STATS_BH(DCCP_MIB_INVALIDOPT);
255 256 257 258
	rc = DCCP_RESET_CODE_OPTION_ERROR;
out_featneg_failed:
	DCCP_WARN("DCCP(%p): Option %d (len=%d) error=%u\n", sk, opt, len, rc);
	DCCP_SKB_CB(skb)->dccpd_reset_code = rc;
259 260 261
	DCCP_SKB_CB(skb)->dccpd_reset_data[0] = opt;
	DCCP_SKB_CB(skb)->dccpd_reset_data[1] = len > 0 ? value[0] : 0;
	DCCP_SKB_CB(skb)->dccpd_reset_data[2] = len > 1 ? value[1] : 0;
262 263 264
	return -1;
}

265 266
EXPORT_SYMBOL_GPL(dccp_parse_options);

267
void dccp_encode_value_var(const u64 value, u8 *to, const u8 len)
268
{
269 270 271 272
	if (len >= DCCP_OPTVAL_MAXLEN)
		*to++ = (value & 0xFF0000000000ull) >> 40;
	if (len > 4)
		*to++ = (value & 0xFF00000000ull) >> 32;
273 274 275 276 277 278 279 280 281 282
	if (len > 3)
		*to++ = (value & 0xFF000000) >> 24;
	if (len > 2)
		*to++ = (value & 0xFF0000) >> 16;
	if (len > 1)
		*to++ = (value & 0xFF00) >> 8;
	if (len > 0)
		*to++ = (value & 0xFF);
}

283
static inline u8 dccp_ndp_len(const u64 ndp)
284
{
285 286 287
	if (likely(ndp <= 0xFF))
		return 1;
	return likely(ndp <= USHORT_MAX) ? 2 : (ndp <= UINT_MAX ? 4 : 6);
288 289
}

290
int dccp_insert_option(struct sock *sk, struct sk_buff *skb,
291 292 293 294 295
			const unsigned char option,
			const void *value, const unsigned char len)
{
	unsigned char *to;

296 297
	if (DCCP_SKB_CB(skb)->dccpd_opt_len + len + 2 > DCCP_MAX_OPT_LEN)
		return -1;
298 299 300 301 302 303 304 305

	DCCP_SKB_CB(skb)->dccpd_opt_len += len + 2;

	to    = skb_push(skb, len + 2);
	*to++ = option;
	*to++ = len + 2;

	memcpy(to, value, len);
306
	return 0;
307 308 309 310
}

EXPORT_SYMBOL_GPL(dccp_insert_option);

311
static int dccp_insert_option_ndp(struct sock *sk, struct sk_buff *skb)
312 313
{
	struct dccp_sock *dp = dccp_sk(sk);
314
	u64 ndp = dp->dccps_ndp_count;
315 316 317 318 319 320 321 322 323 324 325 326

	if (dccp_non_data_packet(skb))
		++dp->dccps_ndp_count;
	else
		dp->dccps_ndp_count = 0;

	if (ndp > 0) {
		unsigned char *ptr;
		const int ndp_len = dccp_ndp_len(ndp);
		const int len = ndp_len + 2;

		if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN)
327
			return -1;
328 329 330 331 332 333 334 335

		DCCP_SKB_CB(skb)->dccpd_opt_len += len;

		ptr = skb_push(skb, len);
		*ptr++ = DCCPO_NDP_COUNT;
		*ptr++ = len;
		dccp_encode_value_var(ndp, ptr, ndp_len);
	}
336 337

	return 0;
338 339 340 341
}

static inline int dccp_elapsed_time_len(const u32 elapsed_time)
{
342
	return elapsed_time == 0 ? 0 : elapsed_time <= 0xFFFF ? 2 : 4;
343 344
}

345 346
int dccp_insert_option_elapsed_time(struct sock *sk, struct sk_buff *skb,
				    u32 elapsed_time)
347 348 349 350 351
{
	const int elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
	const int len = 2 + elapsed_time_len;
	unsigned char *to;

I
Ian McDonald 已提交
352
	if (elapsed_time_len == 0)
353
		return 0;
354

355 356
	if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN)
		return -1;
357 358 359 360 361 362 363

	DCCP_SKB_CB(skb)->dccpd_opt_len += len;

	to    = skb_push(skb, len);
	*to++ = DCCPO_ELAPSED_TIME;
	*to++ = len;

I
Ian McDonald 已提交
364
	if (elapsed_time_len == 2) {
365
		const __be16 var16 = htons((u16)elapsed_time);
I
Ian McDonald 已提交
366 367
		memcpy(to, &var16, 2);
	} else {
368
		const __be32 var32 = htonl(elapsed_time);
I
Ian McDonald 已提交
369 370
		memcpy(to, &var32, 4);
	}
371

372
	return 0;
373 374
}

375
EXPORT_SYMBOL_GPL(dccp_insert_option_elapsed_time);
376

377
int dccp_insert_option_timestamp(struct sock *sk, struct sk_buff *skb)
378
{
379
	__be32 now = htonl(dccp_timestamp());
I
Ian McDonald 已提交
380 381 382
	/* yes this will overflow but that is the point as we want a
	 * 10 usec 32 bit timer which mean it wraps every 11.9 hours */

383
	return dccp_insert_option(sk, skb, DCCPO_TIMESTAMP, &now, sizeof(now));
384 385
}

386 387
EXPORT_SYMBOL_GPL(dccp_insert_option_timestamp);

388 389
static int dccp_insert_option_timestamp_echo(struct dccp_sock *dp,
					     struct dccp_request_sock *dreq,
390
					     struct sk_buff *skb)
391
{
392
	__be32 tstamp_echo;
393
	unsigned char *to;
394 395 396 397 398 399 400 401 402 403 404 405
	u32 elapsed_time, elapsed_time_len, len;

	if (dreq != NULL) {
		elapsed_time = dccp_timestamp() - dreq->dreq_timestamp_time;
		tstamp_echo  = htonl(dreq->dreq_timestamp_echo);
		dreq->dreq_timestamp_echo = 0;
	} else {
		elapsed_time = dccp_timestamp() - dp->dccps_timestamp_time;
		tstamp_echo  = htonl(dp->dccps_timestamp_echo);
		dp->dccps_timestamp_echo = 0;
	}

406 407 408
	elapsed_time_len = dccp_elapsed_time_len(elapsed_time);
	len = 6 + elapsed_time_len;

409 410
	if (DCCP_SKB_CB(skb)->dccpd_opt_len + len > DCCP_MAX_OPT_LEN)
		return -1;
411 412 413 414 415 416 417 418 419

	DCCP_SKB_CB(skb)->dccpd_opt_len += len;

	to    = skb_push(skb, len);
	*to++ = DCCPO_TIMESTAMP_ECHO;
	*to++ = len;

	memcpy(to, &tstamp_echo, 4);
	to += 4;
420

I
Ian McDonald 已提交
421
	if (elapsed_time_len == 2) {
422
		const __be16 var16 = htons((u16)elapsed_time);
I
Ian McDonald 已提交
423 424
		memcpy(to, &var16, 2);
	} else if (elapsed_time_len == 4) {
425
		const __be32 var32 = htonl(elapsed_time);
I
Ian McDonald 已提交
426 427
		memcpy(to, &var32, 4);
	}
428

429
	return 0;
430 431
}

432 433 434 435
static int dccp_insert_option_ackvec(struct sock *sk, struct sk_buff *skb)
{
	struct dccp_sock *dp = dccp_sk(sk);
	struct dccp_ackvec *av = dp->dccps_hc_rx_ackvec;
436
	struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
437
	const u16 buflen = dccp_ackvec_buflen(av);
438
	/* Figure out how many options do we need to represent the ackvec */
439 440
	const u8 nr_opts = DIV_ROUND_UP(buflen, DCCP_SINGLE_OPT_MAXLEN);
	u16 len = buflen + 2 * nr_opts;
441 442 443 444
	u8 i, nonce = 0;
	const unsigned char *tail, *from;
	unsigned char *to;

445 446 447
	if (dcb->dccpd_opt_len + len > DCCP_MAX_OPT_LEN) {
		DCCP_WARN("Lacking space for %u bytes on %s packet\n", len,
			  dccp_packet_name(dcb->dccpd_type));
448
		return -1;
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
	}
	/*
	 * Since Ack Vectors are variable-length, we can not always predict
	 * their size. To catch exception cases where the space is running out
	 * on the skb, a separate Sync is scheduled to carry the Ack Vector.
	 */
	if (len > DCCPAV_MIN_OPTLEN &&
	    len + dcb->dccpd_opt_len + skb->len > dp->dccps_mss_cache) {
		DCCP_WARN("No space left for Ack Vector (%u) on skb (%u+%u), "
			  "MPS=%u ==> reduce payload size?\n", len, skb->len,
			  dcb->dccpd_opt_len, dp->dccps_mss_cache);
		dp->dccps_sync_scheduled = 1;
		return 0;
	}
	dcb->dccpd_opt_len += len;
464 465

	to   = skb_push(skb, len);
466
	len  = buflen;
467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
	from = av->av_buf + av->av_buf_head;
	tail = av->av_buf + DCCPAV_MAX_ACKVEC_LEN;

	for (i = 0; i < nr_opts; ++i) {
		int copylen = len;

		if (len > DCCP_SINGLE_OPT_MAXLEN)
			copylen = DCCP_SINGLE_OPT_MAXLEN;

		/*
		 * RFC 4340, 12.2: Encode the Nonce Echo for this Ack Vector via
		 * its type; ack_nonce is the sum of all individual buf_nonce's.
		 */
		nonce ^= av->av_buf_nonce[i];

		*to++ = DCCPO_ACK_VECTOR_0 + av->av_buf_nonce[i];
		*to++ = copylen + 2;

		/* Check if buf_head wraps */
		if (from + copylen > tail) {
			const u16 tailsize = tail - from;

			memcpy(to, from, tailsize);
			to	+= tailsize;
			len	-= tailsize;
			copylen	-= tailsize;
			from	= av->av_buf;
		}

		memcpy(to, from, copylen);
		from += copylen;
		to   += copylen;
		len  -= copylen;
	}
	/*
	 * Each sent Ack Vector is recorded in the list, as per A.2 of RFC 4340.
	 */
504
	if (dccp_ackvec_update_records(av, dcb->dccpd_seq, nonce))
505 506 507 508
		return -ENOBUFS;
	return 0;
}

509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
/**
 * dccp_insert_option_mandatory  -  Mandatory option (5.8.2)
 * Note that since we are using skb_push, this function needs to be called
 * _after_ inserting the option it is supposed to influence (stack order).
 */
int dccp_insert_option_mandatory(struct sk_buff *skb)
{
	if (DCCP_SKB_CB(skb)->dccpd_opt_len >= DCCP_MAX_OPT_LEN)
		return -1;

	DCCP_SKB_CB(skb)->dccpd_opt_len++;
	*skb_push(skb, 1) = DCCPO_MANDATORY;
	return 0;
}

524 525 526 527 528 529 530 531 532 533 534 535 536 537
/**
 * dccp_insert_fn_opt  -  Insert single Feature-Negotiation option into @skb
 * @type: %DCCPO_CHANGE_L, %DCCPO_CHANGE_R, %DCCPO_CONFIRM_L, %DCCPO_CONFIRM_R
 * @feat: one out of %dccp_feature_numbers
 * @val: NN value or SP array (preferred element first) to copy
 * @len: true length of @val in bytes (excluding first element repetition)
 * @repeat_first: whether to copy the first element of @val twice
 * The last argument is used to construct Confirm options, where the preferred
 * value and the preference list appear separately (RFC 4340, 6.3.1). Preference
 * lists are kept such that the preferred entry is always first, so we only need
 * to copy twice, and avoid the overhead of cloning into a bigger array.
 */
int dccp_insert_fn_opt(struct sk_buff *skb, u8 type, u8 feat,
		       u8 *val, u8 len, bool repeat_first)
538
{
539
	u8 tot_len, *to;
540

541 542 543
	/* take the `Feature' field and possible repetition into account */
	if (len > (DCCP_SINGLE_OPT_MAXLEN - 2)) {
		DCCP_WARN("length %u for feature %u too large\n", len, feat);
544 545 546
		return -1;
	}

547 548 549 550 551 552 553 554 555
	if (unlikely(val == NULL || len == 0))
		len = repeat_first = 0;
	tot_len = 3 + repeat_first + len;

	if (DCCP_SKB_CB(skb)->dccpd_opt_len + tot_len > DCCP_MAX_OPT_LEN) {
		DCCP_WARN("packet too small for feature %d option!\n", feat);
		return -1;
	}
	DCCP_SKB_CB(skb)->dccpd_opt_len += tot_len;
556

557
	to    = skb_push(skb, tot_len);
558
	*to++ = type;
559
	*to++ = tot_len;
560 561
	*to++ = feat;

562 563
	if (repeat_first)
		*to++ = *val;
564 565 566 567 568
	if (len)
		memcpy(to, val, len);
	return 0;
}

569 570 571 572 573 574 575 576 577 578 579 580
/* The length of all options needs to be a multiple of 4 (5.8) */
static void dccp_insert_option_padding(struct sk_buff *skb)
{
	int padding = DCCP_SKB_CB(skb)->dccpd_opt_len % 4;

	if (padding != 0) {
		padding = 4 - padding;
		memset(skb_push(skb, padding), 0, padding);
		DCCP_SKB_CB(skb)->dccpd_opt_len += padding;
	}
}

581
int dccp_insert_options(struct sock *sk, struct sk_buff *skb)
582 583 584 585 586
{
	struct dccp_sock *dp = dccp_sk(sk);

	DCCP_SKB_CB(skb)->dccpd_opt_len = 0;

587
	if (dp->dccps_send_ndp_count && dccp_insert_option_ndp(sk, skb))
588
		return -1;
589

590 591 592 593
	if (DCCP_SKB_CB(skb)->dccpd_type != DCCP_PKT_DATA) {

		/* Feature Negotiation */
		if (dccp_feat_insert_opts(dp, NULL, skb))
594
			return -1;
595 596 597 598 599 600 601 602 603

		if (DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_REQUEST) {
			/*
			 * Obtain RTT sample from Request/Response exchange.
			 * This is currently used in CCID 3 initialisation.
			 */
			if (dccp_insert_option_timestamp(sk, skb))
				return -1;

604
		} else if (dccp_ackvec_pending(sk) &&
605 606 607
			   dccp_insert_option_ackvec(sk, skb)) {
				return -1;
		}
608 609
	}

610
	if (dp->dccps_hc_rx_insert_options) {
611 612
		if (ccid_hc_rx_insert_options(dp->dccps_hc_rx_ccid, sk, skb))
			return -1;
613 614
		dp->dccps_hc_rx_insert_options = 0;
	}
615

616 617 618 619
	if (dp->dccps_timestamp_echo != 0 &&
	    dccp_insert_option_timestamp_echo(dp, NULL, skb))
		return -1;

620 621 622
	dccp_insert_option_padding(skb);
	return 0;
}
623

624 625 626
int dccp_insert_options_rsk(struct dccp_request_sock *dreq, struct sk_buff *skb)
{
	DCCP_SKB_CB(skb)->dccpd_opt_len = 0;
627

628 629 630
	if (dccp_feat_insert_opts(NULL, dreq, skb))
		return -1;

631 632 633
	if (dreq->dreq_timestamp_echo != 0 &&
	    dccp_insert_option_timestamp_echo(NULL, dreq, skb))
		return -1;
634

635
	dccp_insert_option_padding(skb);
636
	return 0;
637
}