output.c 23.5 KB
Newer Older
1
/* SCTP kernel implementation
L
Linus Torvalds 已提交
2 3 4 5
 * (C) Copyright IBM Corp. 2001, 2004
 * Copyright (c) 1999-2000 Cisco, Inc.
 * Copyright (c) 1999-2001 Motorola, Inc.
 *
6
 * This file is part of the SCTP kernel implementation
L
Linus Torvalds 已提交
7 8 9
 *
 * These functions handle output processing.
 *
10
 * This SCTP implementation is free software;
L
Linus Torvalds 已提交
11 12 13 14 15
 * 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, or (at your option)
 * any later version.
 *
16
 * This SCTP implementation is distributed in the hope that it
L
Linus Torvalds 已提交
17 18 19 20 21 22
 * 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
23 24
 * along with GNU CC; see the file COPYING.  If not, see
 * <http://www.gnu.org/licenses/>.
L
Linus Torvalds 已提交
25 26 27
 *
 * Please send any bug reports or fixes you make to the
 * email address(es):
28
 *    lksctp developers <linux-sctp@vger.kernel.org>
L
Linus Torvalds 已提交
29 30 31 32 33 34 35 36
 *
 * Written or modified by:
 *    La Monte H.P. Yarroll <piggy@acm.org>
 *    Karl Knutson          <karl@athena.chicago.il.us>
 *    Jon Grimm             <jgrimm@austin.ibm.com>
 *    Sridhar Samudrala     <sri@us.ibm.com>
 */

37 38
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
39 40 41 42 43 44 45
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/wait.h>
#include <linux/time.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/init.h>
46
#include <linux/slab.h>
L
Linus Torvalds 已提交
47
#include <net/inet_ecn.h>
V
Vlad Yasevich 已提交
48
#include <net/ip.h>
L
Linus Torvalds 已提交
49
#include <net/icmp.h>
50
#include <net/net_namespace.h>
L
Linus Torvalds 已提交
51 52 53 54 55 56

#include <linux/socket.h> /* for sa_family_t */
#include <net/sock.h>

#include <net/sctp/sctp.h>
#include <net/sctp/sm.h>
57
#include <net/sctp/checksum.h>
L
Linus Torvalds 已提交
58 59

/* Forward declarations for private helpers. */
X
Xin Long 已提交
60 61 62 63
static enum sctp_xmit __sctp_packet_append_chunk(struct sctp_packet *packet,
						 struct sctp_chunk *chunk);
static enum sctp_xmit sctp_packet_can_append_data(struct sctp_packet *packet,
						  struct sctp_chunk *chunk);
64
static void sctp_packet_append_data(struct sctp_packet *packet,
X
Xin Long 已提交
65 66 67 68
				    struct sctp_chunk *chunk);
static enum sctp_xmit sctp_packet_will_fit(struct sctp_packet *packet,
					   struct sctp_chunk *chunk,
					   u16 chunk_len);
L
Linus Torvalds 已提交
69

70 71
static void sctp_packet_reset(struct sctp_packet *packet)
{
R
Richard Haines 已提交
72 73 74
	/* sctp_packet_transmit() relies on this to reset size to the
	 * current overhead after sending packets.
	 */
75
	packet->size = packet->overhead;
R
Richard Haines 已提交
76

77 78 79 80 81 82 83 84
	packet->has_cookie_echo = 0;
	packet->has_sack = 0;
	packet->has_data = 0;
	packet->has_auth = 0;
	packet->ipfragok = 0;
	packet->auth = NULL;
}

L
Linus Torvalds 已提交
85 86 87
/* Config a packet.
 * This appears to be a followup set of initializations.
 */
88 89
void sctp_packet_config(struct sctp_packet *packet, __u32 vtag,
			int ecn_capable)
L
Linus Torvalds 已提交
90
{
M
Marcelo Ricardo Leitner 已提交
91 92
	struct sctp_transport *tp = packet->transport;
	struct sctp_association *asoc = tp->asoc;
93
	struct sctp_sock *sp = NULL;
94
	struct sock *sk;
L
Linus Torvalds 已提交
95

96
	pr_debug("%s: packet:%p vtag:0x%x\n", __func__, packet, vtag);
L
Linus Torvalds 已提交
97 98
	packet->vtag = vtag;

99 100 101
	/* do the following jobs only once for a flush schedule */
	if (!sctp_packet_empty(packet))
		return;
M
Marcelo Ricardo Leitner 已提交
102

R
Richard Haines 已提交
103
	/* set packet max_size with pathmtu, then calculate overhead */
104
	packet->max_size = tp->pathmtu;
105

R
Richard Haines 已提交
106
	if (asoc) {
107 108 109 110 111
		sk = asoc->base.sk;
		sp = sctp_sk(sk);
	}
	packet->overhead = sctp_mtu_payload(sp, 0, 0);
	packet->size = packet->overhead;
R
Richard Haines 已提交
112

113
	if (!asoc)
114
		return;
M
Marcelo Ricardo Leitner 已提交
115

116 117
	/* update dst or transport pathmtu if in need */
	if (!sctp_transport_dst_check(tp)) {
118
		sctp_transport_route(tp, NULL, sp);
119
		if (asoc->param_flags & SPP_PMTUD_ENABLE)
120
			sctp_assoc_sync_pmtu(asoc);
121 122 123
	} else if (!sctp_transport_pmtu_check(tp)) {
		if (asoc->param_flags & SPP_PMTUD_ENABLE)
			sctp_assoc_sync_pmtu(asoc);
M
Marcelo Ricardo Leitner 已提交
124 125
	}

126 127 128 129 130 131
	if (asoc->pmtu_pending) {
		if (asoc->param_flags & SPP_PMTUD_ENABLE)
			sctp_assoc_sync_pmtu(asoc);
		asoc->pmtu_pending = 0;
	}

132 133 134 135 136
	/* If there a is a prepend chunk stick it on the list before
	 * any other chunks get appended.
	 */
	if (ecn_capable) {
		struct sctp_chunk *chunk = sctp_get_ecne_prepend(asoc);
L
Linus Torvalds 已提交
137 138 139 140

		if (chunk)
			sctp_packet_append_chunk(packet, chunk);
	}
141 142 143 144 145 146 147 148 149 150 151 152 153

	if (!tp->dst)
		return;

	/* set packet max_size with gso_max_size if gso is enabled*/
	rcu_read_lock();
	if (__sk_dst_get(sk) != tp->dst) {
		dst_hold(tp->dst);
		sk_setup_caps(sk, tp->dst);
	}
	packet->max_size = sk_can_gso(sk) ? tp->dst->dev->gso_max_size
					  : asoc->pathmtu;
	rcu_read_unlock();
L
Linus Torvalds 已提交
154 155 156
}

/* Initialize the packet structure. */
157 158 159
void sctp_packet_init(struct sctp_packet *packet,
		      struct sctp_transport *transport,
		      __u16 sport, __u16 dport)
L
Linus Torvalds 已提交
160
{
161
	pr_debug("%s: packet:%p transport:%p\n", __func__, packet, transport);
L
Linus Torvalds 已提交
162 163 164 165

	packet->transport = transport;
	packet->source_port = sport;
	packet->destination_port = dport;
166
	INIT_LIST_HEAD(&packet->chunk_list);
R
Richard Haines 已提交
167 168
	/* The overhead will be calculated by sctp_packet_config() */
	packet->overhead = 0;
169
	sctp_packet_reset(packet);
L
Linus Torvalds 已提交
170 171 172 173 174 175
	packet->vtag = 0;
}

/* Free a packet.  */
void sctp_packet_free(struct sctp_packet *packet)
{
176
	struct sctp_chunk *chunk, *tmp;
L
Linus Torvalds 已提交
177

178
	pr_debug("%s: packet:%p\n", __func__, packet);
L
Linus Torvalds 已提交
179

180 181
	list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
		list_del_init(&chunk->list);
L
Linus Torvalds 已提交
182
		sctp_chunk_free(chunk);
183
	}
L
Linus Torvalds 已提交
184 185 186 187 188 189 190 191 192
}

/* This routine tries to append the chunk to the offered packet. If adding
 * the chunk causes the packet to exceed the path MTU and COOKIE_ECHO chunk
 * is not present in the packet, it transmits the input packet.
 * Data can be bundled with a packet containing a COOKIE_ECHO chunk as long
 * as it can fit in the packet, but any more data that does not fit in this
 * packet can be sent only after receiving the COOKIE_ACK.
 */
X
Xin Long 已提交
193 194 195
enum sctp_xmit sctp_packet_transmit_chunk(struct sctp_packet *packet,
					  struct sctp_chunk *chunk,
					  int one_packet, gfp_t gfp)
L
Linus Torvalds 已提交
196
{
X
Xin Long 已提交
197
	enum sctp_xmit retval;
L
Linus Torvalds 已提交
198

199
	pr_debug("%s: packet:%p size:%zu chunk:%p size:%d\n", __func__,
200
		 packet, packet->size, chunk, chunk->skb ? chunk->skb->len : -1);
L
Linus Torvalds 已提交
201 202 203 204

	switch ((retval = (sctp_packet_append_chunk(packet, chunk)))) {
	case SCTP_XMIT_PMTU_FULL:
		if (!packet->has_cookie_echo) {
205 206
			int error = 0;

207
			error = sctp_packet_transmit(packet, gfp);
L
Linus Torvalds 已提交
208 209 210 211 212 213
			if (error < 0)
				chunk->skb->sk->sk_err = -error;

			/* If we have an empty packet, then we can NOT ever
			 * return PMTU_FULL.
			 */
214 215 216
			if (!one_packet)
				retval = sctp_packet_append_chunk(packet,
								  chunk);
L
Linus Torvalds 已提交
217 218 219 220 221
		}
		break;

	case SCTP_XMIT_RWND_FULL:
	case SCTP_XMIT_OK:
222
	case SCTP_XMIT_DELAY:
L
Linus Torvalds 已提交
223
		break;
224
	}
L
Linus Torvalds 已提交
225 226 227 228

	return retval;
}

229
/* Try to bundle an auth chunk into the packet. */
X
Xin Long 已提交
230 231
static enum sctp_xmit sctp_packet_bundle_auth(struct sctp_packet *pkt,
					      struct sctp_chunk *chunk)
232 233
{
	struct sctp_association *asoc = pkt->transport->asoc;
X
Xin Long 已提交
234
	enum sctp_xmit retval = SCTP_XMIT_OK;
235 236 237 238 239 240 241 242 243
	struct sctp_chunk *auth;

	/* if we don't have an association, we can't do authentication */
	if (!asoc)
		return retval;

	/* See if this is an auth chunk we are bundling or if
	 * auth is already bundled.
	 */
244
	if (chunk->chunk_hdr->type == SCTP_CID_AUTH || pkt->has_auth)
245 246 247 248 249 250 251 252
		return retval;

	/* if the peer did not request this chunk to be authenticated,
	 * don't do it
	 */
	if (!chunk->auth)
		return retval;

X
Xin Long 已提交
253
	auth = sctp_make_auth(asoc, chunk->shkey->key_id);
254 255 256
	if (!auth)
		return retval;

X
Xin Long 已提交
257 258 259
	auth->shkey = chunk->shkey;
	sctp_auth_shkey_hold(auth->shkey);

260 261 262 263
	retval = __sctp_packet_append_chunk(pkt, auth);

	if (retval != SCTP_XMIT_OK)
		sctp_chunk_free(auth);
264 265 266 267

	return retval;
}

L
Linus Torvalds 已提交
268
/* Try to bundle a SACK with the packet. */
X
Xin Long 已提交
269 270
static enum sctp_xmit sctp_packet_bundle_sack(struct sctp_packet *pkt,
					      struct sctp_chunk *chunk)
L
Linus Torvalds 已提交
271
{
X
Xin Long 已提交
272
	enum sctp_xmit retval = SCTP_XMIT_OK;
L
Linus Torvalds 已提交
273 274 275 276 277 278 279

	/* If sending DATA and haven't aleady bundled a SACK, try to
	 * bundle one in to the packet.
	 */
	if (sctp_chunk_is_data(chunk) && !pkt->has_sack &&
	    !pkt->has_cookie_echo) {
		struct sctp_association *asoc;
D
Doug Graham 已提交
280
		struct timer_list *timer;
L
Linus Torvalds 已提交
281
		asoc = pkt->transport->asoc;
D
Doug Graham 已提交
282
		timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK];
L
Linus Torvalds 已提交
283

D
Doug Graham 已提交
284 285
		/* If the SACK timer is running, we have a pending SACK */
		if (timer_pending(timer)) {
L
Linus Torvalds 已提交
286
			struct sctp_chunk *sack;
287 288 289 290 291

			if (pkt->transport->sack_generation !=
			    pkt->transport->asoc->peer.sack_generation)
				return retval;

L
Linus Torvalds 已提交
292 293 294
			asoc->a_rwnd = asoc->rwnd;
			sack = sctp_make_sack(asoc);
			if (sack) {
295 296 297 298 299
				retval = __sctp_packet_append_chunk(pkt, sack);
				if (retval != SCTP_XMIT_OK) {
					sctp_chunk_free(sack);
					goto out;
				}
L
Linus Torvalds 已提交
300
				asoc->peer.sack_needed = 0;
D
Doug Graham 已提交
301
				if (del_timer(timer))
L
Linus Torvalds 已提交
302 303 304 305
					sctp_association_put(asoc);
			}
		}
	}
306
out:
L
Linus Torvalds 已提交
307 308 309
	return retval;
}

310

L
Linus Torvalds 已提交
311 312 313
/* Append a chunk to the offered packet reporting back any inability to do
 * so.
 */
X
Xin Long 已提交
314 315
static enum sctp_xmit __sctp_packet_append_chunk(struct sctp_packet *packet,
						 struct sctp_chunk *chunk)
L
Linus Torvalds 已提交
316
{
317
	__u16 chunk_len = SCTP_PAD4(ntohs(chunk->chunk_hdr->length));
X
Xin Long 已提交
318
	enum sctp_xmit retval = SCTP_XMIT_OK;
L
Linus Torvalds 已提交
319

320 321 322 323
	/* Check to see if this chunk will fit into the packet */
	retval = sctp_packet_will_fit(packet, chunk, chunk_len);
	if (retval != SCTP_XMIT_OK)
		goto finish;
L
Linus Torvalds 已提交
324

325
	/* We believe that this chunk is OK to add to the packet */
326
	switch (chunk->chunk_hdr->type) {
327
	case SCTP_CID_DATA:
328
	case SCTP_CID_I_DATA:
329 330
		/* Account for the data being in the packet */
		sctp_packet_append_data(packet, chunk);
L
Linus Torvalds 已提交
331 332
		/* Disallow SACK bundling after DATA. */
		packet->has_sack = 1;
333 334 335 336
		/* Disallow AUTH bundling after DATA */
		packet->has_auth = 1;
		/* Let it be knows that packet has DATA in it */
		packet->has_data = 1;
337 338
		/* timestamp the chunk for rtx purposes */
		chunk->sent_at = jiffies;
X
Xin Long 已提交
339 340
		/* Mainly used for prsctp RTX policy */
		chunk->sent_count++;
341
		break;
342
	case SCTP_CID_COOKIE_ECHO:
L
Linus Torvalds 已提交
343
		packet->has_cookie_echo = 1;
344 345
		break;

346
	case SCTP_CID_SACK:
L
Linus Torvalds 已提交
347
		packet->has_sack = 1;
348 349
		if (chunk->asoc)
			chunk->asoc->stats.osacks++;
350 351
		break;

352
	case SCTP_CID_AUTH:
353 354 355 356
		packet->has_auth = 1;
		packet->auth = chunk;
		break;
	}
L
Linus Torvalds 已提交
357 358

	/* It is OK to send this chunk.  */
359
	list_add_tail(&chunk->list, &packet->chunk_list);
L
Linus Torvalds 已提交
360 361 362 363 364 365
	packet->size += chunk_len;
	chunk->transport = packet->transport;
finish:
	return retval;
}

366 367 368
/* Append a chunk to the offered packet reporting back any inability to do
 * so.
 */
X
Xin Long 已提交
369 370
enum sctp_xmit sctp_packet_append_chunk(struct sctp_packet *packet,
					struct sctp_chunk *chunk)
371
{
X
Xin Long 已提交
372
	enum sctp_xmit retval = SCTP_XMIT_OK;
373

374
	pr_debug("%s: packet:%p chunk:%p\n", __func__, packet, chunk);
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401

	/* Data chunks are special.  Before seeing what else we can
	 * bundle into this packet, check to see if we are allowed to
	 * send this DATA.
	 */
	if (sctp_chunk_is_data(chunk)) {
		retval = sctp_packet_can_append_data(packet, chunk);
		if (retval != SCTP_XMIT_OK)
			goto finish;
	}

	/* Try to bundle AUTH chunk */
	retval = sctp_packet_bundle_auth(packet, chunk);
	if (retval != SCTP_XMIT_OK)
		goto finish;

	/* Try to bundle SACK chunk */
	retval = sctp_packet_bundle_sack(packet, chunk);
	if (retval != SCTP_XMIT_OK)
		goto finish;

	retval = __sctp_packet_append_chunk(packet, chunk);

finish:
	return retval;
}

402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
static void sctp_packet_gso_append(struct sk_buff *head, struct sk_buff *skb)
{
	if (SCTP_OUTPUT_CB(head)->last == head)
		skb_shinfo(head)->frag_list = skb;
	else
		SCTP_OUTPUT_CB(head)->last->next = skb;
	SCTP_OUTPUT_CB(head)->last = skb;

	head->truesize += skb->truesize;
	head->data_len += skb->len;
	head->len += skb->len;

	__skb_header_release(skb);
}

X
Xin Long 已提交
417 418
static int sctp_packet_pack(struct sctp_packet *packet,
			    struct sk_buff *head, int gso, gfp_t gfp)
L
Linus Torvalds 已提交
419 420
{
	struct sctp_transport *tp = packet->transport;
X
Xin Long 已提交
421
	struct sctp_auth_chunk *auth = NULL;
422
	struct sctp_chunk *chunk, *tmp;
X
Xin Long 已提交
423 424 425
	int pkt_count = 0, pkt_size;
	struct sock *sk = head->sk;
	struct sk_buff *nskb;
426
	int auth_len = 0;
L
Linus Torvalds 已提交
427

M
Marcelo Ricardo Leitner 已提交
428 429
	if (gso) {
		skb_shinfo(head)->gso_type = sk->sk_gso_type;
430
		SCTP_OUTPUT_CB(head)->last = head;
X
Xin Long 已提交
431 432 433 434
	} else {
		nskb = head;
		pkt_size = packet->size;
		goto merge;
M
Marcelo Ricardo Leitner 已提交
435
	}
L
Linus Torvalds 已提交
436

M
Marcelo Ricardo Leitner 已提交
437
	do {
X
Xin Long 已提交
438 439 440 441 442
		/* calculate the pkt_size and alloc nskb */
		pkt_size = packet->overhead;
		list_for_each_entry_safe(chunk, tmp, &packet->chunk_list,
					 list) {
			int padded = SCTP_PAD4(chunk->skb->len);
443

X
Xin Long 已提交
444 445 446 447 448 449 450 451
			if (chunk == packet->auth)
				auth_len = padded;
			else if (auth_len + padded + packet->overhead >
				 tp->pathmtu)
				return 0;
			else if (pkt_size + padded > tp->pathmtu)
				break;
			pkt_size += padded;
M
Marcelo Ricardo Leitner 已提交
452
		}
X
Xin Long 已提交
453 454 455 456
		nskb = alloc_skb(pkt_size + MAX_HEADER, gfp);
		if (!nskb)
			return 0;
		skb_reserve(nskb, packet->overhead + MAX_HEADER);
L
Linus Torvalds 已提交
457

X
Xin Long 已提交
458 459
merge:
		/* merge chunks into nskb and append nskb into head list */
M
Marcelo Ricardo Leitner 已提交
460 461
		pkt_size -= packet->overhead;
		list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
X
Xin Long 已提交
462 463
			int padding;

M
Marcelo Ricardo Leitner 已提交
464 465
			list_del_init(&chunk->list);
			if (sctp_chunk_is_data(chunk)) {
466 467
				if (!sctp_chunk_retransmitted(chunk) &&
				    !tp->rto_pending) {
M
Marcelo Ricardo Leitner 已提交
468 469 470 471 472
					chunk->rtt_in_progress = 1;
					tp->rto_pending = 1;
				}
			}

473
			padding = SCTP_PAD4(chunk->skb->len) - chunk->skb->len;
M
Marcelo Ricardo Leitner 已提交
474
			if (padding)
475
				skb_put_zero(chunk->skb, padding);
M
Marcelo Ricardo Leitner 已提交
476 477

			if (chunk == packet->auth)
X
Xin Long 已提交
478 479
				auth = (struct sctp_auth_chunk *)
							skb_tail_pointer(nskb);
M
Marcelo Ricardo Leitner 已提交
480

481
			skb_put_data(nskb, chunk->skb->data, chunk->skb->len);
L
Linus Torvalds 已提交
482

M
Marcelo Ricardo Leitner 已提交
483 484 485 486 487 488 489 490
			pr_debug("*** Chunk:%p[%s] %s 0x%x, length:%d, chunk->skb->len:%d, rtt_in_progress:%d\n",
				 chunk,
				 sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)),
				 chunk->has_tsn ? "TSN" : "No TSN",
				 chunk->has_tsn ? ntohl(chunk->subh.data_hdr->tsn) : 0,
				 ntohs(chunk->chunk_hdr->length), chunk->skb->len,
				 chunk->rtt_in_progress);

491
			pkt_size -= SCTP_PAD4(chunk->skb->len);
L
Linus Torvalds 已提交
492

493
			if (!sctp_chunk_is_data(chunk) && chunk != packet->auth)
M
Marcelo Ricardo Leitner 已提交
494 495 496 497 498 499
				sctp_chunk_free(chunk);

			if (!pkt_size)
				break;
		}

X
Xin Long 已提交
500
		if (auth) {
X
Xin Long 已提交
501 502
			sctp_auth_calculate_hmac(tp->asoc, nskb, auth,
						 packet->auth->shkey, gfp);
X
Xin Long 已提交
503 504 505 506
			/* free auth if no more chunks, or add it back */
			if (list_empty(&packet->chunk_list))
				sctp_chunk_free(packet->auth);
			else
507 508
				list_add(&packet->auth->list,
					 &packet->chunk_list);
509 510
		}

511 512
		if (gso)
			sctp_packet_gso_append(head, nskb);
X
Xin Long 已提交
513 514

		pkt_count++;
M
Marcelo Ricardo Leitner 已提交
515
	} while (!list_empty(&packet->chunk_list));
516

X
Xin Long 已提交
517 518 519 520 521 522 523 524 525
	if (gso) {
		memset(head->cb, 0, max(sizeof(struct inet_skb_parm),
					sizeof(struct inet6_skb_parm)));
		skb_shinfo(head)->gso_segs = pkt_count;
		skb_shinfo(head)->gso_size = GSO_BY_FRAGS;
		rcu_read_lock();
		if (skb_dst(head) != tp->dst) {
			dst_hold(tp->dst);
			sk_setup_caps(sk, tp->dst);
526
		}
X
Xin Long 已提交
527 528
		rcu_read_unlock();
		goto chksum;
529
	}
L
Linus Torvalds 已提交
530

X
Xin Long 已提交
531 532
	if (sctp_checksum_disable)
		return 1;
L
Linus Torvalds 已提交
533

X
Xin Long 已提交
534 535 536 537
	if (!(skb_dst(head)->dev->features & NETIF_F_SCTP_CRC) ||
	    dst_xfrm(skb_dst(head)) || packet->ipfragok) {
		struct sctphdr *sh =
			(struct sctphdr *)skb_transport_header(head);
L
Linus Torvalds 已提交
538

X
Xin Long 已提交
539 540 541 542
		sh->checksum = sctp_compute_cksum(head, 0);
	} else {
chksum:
		head->ip_summed = CHECKSUM_PARTIAL;
543
		head->csum_not_inet = 1;
X
Xin Long 已提交
544 545
		head->csum_start = skb_transport_header(head) - head->head;
		head->csum_offset = offsetof(struct sctphdr, checksum);
L
Linus Torvalds 已提交
546 547
	}

X
Xin Long 已提交
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
	return pkt_count;
}

/* All packets are sent to the network through this function from
 * sctp_outq_tail().
 *
 * The return value is always 0 for now.
 */
int sctp_packet_transmit(struct sctp_packet *packet, gfp_t gfp)
{
	struct sctp_transport *tp = packet->transport;
	struct sctp_association *asoc = tp->asoc;
	struct sctp_chunk *chunk, *tmp;
	int pkt_count, gso = 0;
	struct dst_entry *dst;
	struct sk_buff *head;
	struct sctphdr *sh;
	struct sock *sk;
L
Linus Torvalds 已提交
566

X
Xin Long 已提交
567 568 569 570 571
	pr_debug("%s: packet:%p\n", __func__, packet);
	if (list_empty(&packet->chunk_list))
		return 0;
	chunk = list_entry(packet->chunk_list.next, struct sctp_chunk, list);
	sk = chunk->skb->sk;
L
Linus Torvalds 已提交
572

X
Xin Long 已提交
573 574 575 576 577
	/* check gso */
	if (packet->size > tp->pathmtu && !packet->ipfragok) {
		if (!sk_can_gso(sk)) {
			pr_err_once("Trying to GSO but underlying device doesn't support it.");
			goto out;
L
Linus Torvalds 已提交
578
		}
X
Xin Long 已提交
579 580 581 582 583 584 585 586 587
		gso = 1;
	}

	/* alloc head skb */
	head = alloc_skb((gso ? packet->overhead : packet->size) +
			 MAX_HEADER, gfp);
	if (!head)
		goto out;
	skb_reserve(head, packet->overhead + MAX_HEADER);
588
	skb_set_owner_w(head, sk);
X
Xin Long 已提交
589 590

	/* set sctp header */
591
	sh = skb_push(head, sizeof(struct sctphdr));
X
Xin Long 已提交
592 593 594 595 596 597
	skb_reset_transport_header(head);
	sh->source = htons(packet->source_port);
	sh->dest = htons(packet->destination_port);
	sh->vtag = htonl(packet->vtag);
	sh->checksum = 0;

598
	/* drop packet if no dst */
X
Xin Long 已提交
599 600 601 602 603 604 605
	dst = dst_clone(tp->dst);
	if (!dst) {
		IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
		kfree_skb(head);
		goto out;
	}
	skb_dst_set(head, dst);
L
Linus Torvalds 已提交
606

X
Xin Long 已提交
607 608 609 610 611 612
	/* pack up chunks */
	pkt_count = sctp_packet_pack(packet, head, gso, gfp);
	if (!pkt_count) {
		kfree_skb(head);
		goto out;
	}
M
Marcelo Ricardo Leitner 已提交
613 614
	pr_debug("***sctp_transmit_packet*** skb->len:%d\n", head->len);

X
Xin Long 已提交
615 616 617 618 619 620 621
	/* start autoclose timer */
	if (packet->has_data && sctp_state(asoc, ESTABLISHED) &&
	    asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE]) {
		struct timer_list *timer =
			&asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
		unsigned long timeout =
			asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE];
L
Linus Torvalds 已提交
622

X
Xin Long 已提交
623 624 625
		if (!mod_timer(timer, jiffies + timeout))
			sctp_association_hold(asoc);
	}
M
Marcelo Ricardo Leitner 已提交
626

X
Xin Long 已提交
627 628 629 630 631 632
	/* sctp xmit */
	tp->af_specific->ecn_capable(sk);
	if (asoc) {
		asoc->stats.opackets += pkt_count;
		if (asoc->peer.last_sent_to != tp)
			asoc->peer.last_sent_to = tp;
M
Marcelo Ricardo Leitner 已提交
633 634
	}
	head->ignore_df = packet->ipfragok;
635
	if (tp->dst_pending_confirm)
636 637 638 639
		skb_set_dst_pending_confirm(head, 1);
	/* neighbour should be confirmed on successful transmission or
	 * positive error
	 */
640 641
	if (tp->af_specific->sctp_xmit(head, tp) >= 0 &&
	    tp->dst_pending_confirm)
642
		tp->dst_pending_confirm = 0;
L
Linus Torvalds 已提交
643

X
Xin Long 已提交
644
out:
645 646
	list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
		list_del_init(&chunk->list);
L
Linus Torvalds 已提交
647
		if (!sctp_chunk_is_data(chunk))
648
			sctp_chunk_free(chunk);
L
Linus Torvalds 已提交
649
	}
650
	sctp_packet_reset(packet);
X
Xin Long 已提交
651
	return 0;
L
Linus Torvalds 已提交
652 653 654 655 656 657
}

/********************************************************************
 * 2nd Level Abstractions
 ********************************************************************/

658
/* This private function check to see if a chunk can be added */
X
Xin Long 已提交
659 660
static enum sctp_xmit sctp_packet_can_append_data(struct sctp_packet *packet,
						  struct sctp_chunk *chunk)
L
Linus Torvalds 已提交
661
{
662
	size_t datasize, rwnd, inflight, flight_size;
L
Linus Torvalds 已提交
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
	struct sctp_transport *transport = packet->transport;
	struct sctp_association *asoc = transport->asoc;
	struct sctp_outq *q = &asoc->outqueue;

	/* RFC 2960 6.1  Transmission of DATA Chunks
	 *
	 * A) At any given time, the data sender MUST NOT transmit new data to
	 * any destination transport address if its peer's rwnd indicates
	 * that the peer has no buffer space (i.e. rwnd is 0, see Section
	 * 6.2.1).  However, regardless of the value of rwnd (including if it
	 * is 0), the data sender can always have one DATA chunk in flight to
	 * the receiver if allowed by cwnd (see rule B below).  This rule
	 * allows the sender to probe for a change in rwnd that the sender
	 * missed due to the SACK having been lost in transit from the data
	 * receiver to the data sender.
	 */

	rwnd = asoc->peer.rwnd;
681 682
	inflight = q->outstanding_bytes;
	flight_size = transport->flight_size;
L
Linus Torvalds 已提交
683 684 685

	datasize = sctp_data_size(chunk);

686 687 688 689 690
	if (datasize > rwnd && inflight > 0)
		/* We have (at least) one data chunk in flight,
		 * so we can't fall back to rule 6.1 B).
		 */
		return SCTP_XMIT_RWND_FULL;
L
Linus Torvalds 已提交
691 692 693 694 695 696 697 698 699 700 701 702 703

	/* RFC 2960 6.1  Transmission of DATA Chunks
	 *
	 * B) At any given time, the sender MUST NOT transmit new data
	 * to a given transport address if it has cwnd or more bytes
	 * of data outstanding to that transport address.
	 */
	/* RFC 7.2.4 & the Implementers Guide 2.8.
	 *
	 * 3) ...
	 *    When a Fast Retransmit is being performed the sender SHOULD
	 *    ignore the value of cwnd and SHOULD NOT delay retransmission.
	 */
704 705 706
	if (chunk->fast_retransmit != SCTP_NEED_FRTX &&
	    flight_size >= transport->cwnd)
		return SCTP_XMIT_RWND_FULL;
L
Linus Torvalds 已提交
707 708 709 710 711 712 713

	/* Nagle's algorithm to solve small-packet problem:
	 * Inhibit the sending of new chunks when new outgoing data arrives
	 * if any previously transmitted data on the connection remains
	 * unacknowledged.
	 */

X
Xin Long 已提交
714
	if ((sctp_sk(asoc->base.sk)->nodelay || inflight == 0) &&
715
	    !asoc->force_delay)
X
Xin Long 已提交
716
		/* Nothing unacked */
717 718 719 720 721 722 723 724 725 726 727 728
		return SCTP_XMIT_OK;

	if (!sctp_packet_empty(packet))
		/* Append to packet */
		return SCTP_XMIT_OK;

	if (!sctp_state(asoc, ESTABLISHED))
		return SCTP_XMIT_OK;

	/* Check whether this chunk and all the rest of pending data will fit
	 * or delay in hopes of bundling a full sized packet.
	 */
729
	if (chunk->skb->len + q->out_qlen > transport->pathmtu -
730
	    packet->overhead - sctp_datachk_len(&chunk->asoc->stream) - 4)
731 732 733 734 735 736 737 738
		/* Enough data queued to fill a packet */
		return SCTP_XMIT_OK;

	/* Don't delay large message writes that may have been fragmented */
	if (!chunk->msg->can_delay)
		return SCTP_XMIT_OK;

	/* Defer until all data acked or packet full */
739
	return SCTP_XMIT_DELAY;
740 741 742 743 744 745 746 747 748 749 750
}

/* This private function does management things when adding DATA chunk */
static void sctp_packet_append_data(struct sctp_packet *packet,
				struct sctp_chunk *chunk)
{
	struct sctp_transport *transport = packet->transport;
	size_t datasize = sctp_data_size(chunk);
	struct sctp_association *asoc = transport->asoc;
	u32 rwnd = asoc->peer.rwnd;

L
Linus Torvalds 已提交
751 752 753 754 755 756
	/* Keep track of how many bytes are in flight over this transport. */
	transport->flight_size += datasize;

	/* Keep track of how many bytes are in flight to the receiver. */
	asoc->outqueue.outstanding_bytes += datasize;

757
	/* Update our view of the receiver's rwnd. */
L
Linus Torvalds 已提交
758 759 760 761 762 763
	if (datasize < rwnd)
		rwnd -= datasize;
	else
		rwnd = 0;

	asoc->peer.rwnd = rwnd;
764
	sctp_chunk_assign_tsn(chunk);
765
	asoc->stream.si->assign_number(chunk);
766 767
}

X
Xin Long 已提交
768 769 770
static enum sctp_xmit sctp_packet_will_fit(struct sctp_packet *packet,
					   struct sctp_chunk *chunk,
					   u16 chunk_len)
771
{
X
Xin Long 已提交
772
	enum sctp_xmit retval = SCTP_XMIT_OK;
773
	size_t psize, pmtu, maxsize;
774

X
Xin Long 已提交
775 776 777 778 779 780 781 782 783 784
	/* Don't bundle in this packet if this chunk's auth key doesn't
	 * match other chunks already enqueued on this packet. Also,
	 * don't bundle the chunk with auth key if other chunks in this
	 * packet don't have auth key.
	 */
	if ((packet->auth && chunk->shkey != packet->auth->shkey) ||
	    (!packet->auth && chunk->shkey &&
	     chunk->chunk_hdr->type != SCTP_CID_AUTH))
		return SCTP_XMIT_PMTU_FULL;

785
	psize = packet->size;
M
Marcelo Ricardo Leitner 已提交
786 787 788 789
	if (packet->transport->asoc)
		pmtu = packet->transport->asoc->pathmtu;
	else
		pmtu = packet->transport->pathmtu;
790 791

	/* Decide if we need to fragment or resubmit later. */
M
Marcelo Ricardo Leitner 已提交
792 793
	if (psize + chunk_len > pmtu) {
		/* It's OK to fragment at IP level if any one of the following
794
		 * is true:
M
Marcelo Ricardo Leitner 已提交
795 796 797 798
		 *	1. The packet is empty (meaning this chunk is greater
		 *	   the MTU)
		 *	2. The packet doesn't have any data in it yet and data
		 *	   requires authentication.
799
		 */
M
Marcelo Ricardo Leitner 已提交
800
		if (sctp_packet_empty(packet) ||
801 802 803 804 805 806
		    (!packet->has_data && chunk->auth)) {
			/* We no longer do re-fragmentation.
			 * Just fragment at the IP layer, if we
			 * actually hit this condition
			 */
			packet->ipfragok = 1;
M
Marcelo Ricardo Leitner 已提交
807
			goto out;
808
		}
M
Marcelo Ricardo Leitner 已提交
809

810 811 812 813 814 815 816
		/* Similarly, if this chunk was built before a PMTU
		 * reduction, we have to fragment it at IP level now. So
		 * if the packet already contains something, we need to
		 * flush.
		 */
		maxsize = pmtu - packet->overhead;
		if (packet->auth)
817
			maxsize -= SCTP_PAD4(packet->auth->skb->len);
818 819 820
		if (chunk_len > maxsize)
			retval = SCTP_XMIT_PMTU_FULL;

M
Marcelo Ricardo Leitner 已提交
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847
		/* It is also okay to fragment if the chunk we are
		 * adding is a control chunk, but only if current packet
		 * is not a GSO one otherwise it causes fragmentation of
		 * a large frame. So in this case we allow the
		 * fragmentation by forcing it to be in a new packet.
		 */
		if (!sctp_chunk_is_data(chunk) && packet->has_data)
			retval = SCTP_XMIT_PMTU_FULL;

		if (psize + chunk_len > packet->max_size)
			/* Hit GSO/PMTU limit, gotta flush */
			retval = SCTP_XMIT_PMTU_FULL;

		if (!packet->transport->burst_limited &&
		    psize + chunk_len > (packet->transport->cwnd >> 1))
			/* Do not allow a single GSO packet to use more
			 * than half of cwnd.
			 */
			retval = SCTP_XMIT_PMTU_FULL;

		if (packet->transport->burst_limited &&
		    psize + chunk_len > (packet->transport->burst_limited >> 1))
			/* Do not allow a single GSO packet to use more
			 * than half of original cwnd.
			 */
			retval = SCTP_XMIT_PMTU_FULL;
		/* Otherwise it will fit in the GSO packet */
848
	}
L
Linus Torvalds 已提交
849

M
Marcelo Ricardo Leitner 已提交
850
out:
L
Linus Torvalds 已提交
851 852
	return retval;
}