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);
M
Marcelo Ricardo Leitner 已提交
121 122
	}

123 124 125 126 127
	/* 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 已提交
128 129 130 131

		if (chunk)
			sctp_packet_append_chunk(packet, chunk);
	}
132 133 134 135 136 137 138 139 140 141 142 143 144

	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 已提交
145 146 147
}

/* Initialize the packet structure. */
148 149 150
void sctp_packet_init(struct sctp_packet *packet,
		      struct sctp_transport *transport,
		      __u16 sport, __u16 dport)
L
Linus Torvalds 已提交
151
{
152
	pr_debug("%s: packet:%p transport:%p\n", __func__, packet, transport);
L
Linus Torvalds 已提交
153 154 155 156

	packet->transport = transport;
	packet->source_port = sport;
	packet->destination_port = dport;
157
	INIT_LIST_HEAD(&packet->chunk_list);
R
Richard Haines 已提交
158 159
	/* The overhead will be calculated by sctp_packet_config() */
	packet->overhead = 0;
160
	sctp_packet_reset(packet);
L
Linus Torvalds 已提交
161 162 163 164 165 166
	packet->vtag = 0;
}

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

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

171 172
	list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
		list_del_init(&chunk->list);
L
Linus Torvalds 已提交
173
		sctp_chunk_free(chunk);
174
	}
L
Linus Torvalds 已提交
175 176 177 178 179 180 181 182 183
}

/* 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 已提交
184 185 186
enum sctp_xmit sctp_packet_transmit_chunk(struct sctp_packet *packet,
					  struct sctp_chunk *chunk,
					  int one_packet, gfp_t gfp)
L
Linus Torvalds 已提交
187
{
X
Xin Long 已提交
188
	enum sctp_xmit retval;
L
Linus Torvalds 已提交
189

190
	pr_debug("%s: packet:%p size:%zu chunk:%p size:%d\n", __func__,
191
		 packet, packet->size, chunk, chunk->skb ? chunk->skb->len : -1);
L
Linus Torvalds 已提交
192 193 194 195

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

198
			error = sctp_packet_transmit(packet, gfp);
L
Linus Torvalds 已提交
199 200 201 202 203 204
			if (error < 0)
				chunk->skb->sk->sk_err = -error;

			/* If we have an empty packet, then we can NOT ever
			 * return PMTU_FULL.
			 */
205 206 207
			if (!one_packet)
				retval = sctp_packet_append_chunk(packet,
								  chunk);
L
Linus Torvalds 已提交
208 209 210 211 212
		}
		break;

	case SCTP_XMIT_RWND_FULL:
	case SCTP_XMIT_OK:
213
	case SCTP_XMIT_DELAY:
L
Linus Torvalds 已提交
214
		break;
215
	}
L
Linus Torvalds 已提交
216 217 218 219

	return retval;
}

220
/* Try to bundle an auth chunk into the packet. */
X
Xin Long 已提交
221 222
static enum sctp_xmit sctp_packet_bundle_auth(struct sctp_packet *pkt,
					      struct sctp_chunk *chunk)
223 224
{
	struct sctp_association *asoc = pkt->transport->asoc;
X
Xin Long 已提交
225
	enum sctp_xmit retval = SCTP_XMIT_OK;
226 227 228 229 230 231 232 233 234
	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.
	 */
235
	if (chunk->chunk_hdr->type == SCTP_CID_AUTH || pkt->has_auth)
236 237 238 239 240 241 242 243
		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 已提交
244
	auth = sctp_make_auth(asoc, chunk->shkey->key_id);
245 246 247
	if (!auth)
		return retval;

X
Xin Long 已提交
248 249 250
	auth->shkey = chunk->shkey;
	sctp_auth_shkey_hold(auth->shkey);

251 252 253 254
	retval = __sctp_packet_append_chunk(pkt, auth);

	if (retval != SCTP_XMIT_OK)
		sctp_chunk_free(auth);
255 256 257 258

	return retval;
}

L
Linus Torvalds 已提交
259
/* Try to bundle a SACK with the packet. */
X
Xin Long 已提交
260 261
static enum sctp_xmit sctp_packet_bundle_sack(struct sctp_packet *pkt,
					      struct sctp_chunk *chunk)
L
Linus Torvalds 已提交
262
{
X
Xin Long 已提交
263
	enum sctp_xmit retval = SCTP_XMIT_OK;
L
Linus Torvalds 已提交
264 265 266 267 268 269 270

	/* 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 已提交
271
		struct timer_list *timer;
L
Linus Torvalds 已提交
272
		asoc = pkt->transport->asoc;
D
Doug Graham 已提交
273
		timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK];
L
Linus Torvalds 已提交
274

D
Doug Graham 已提交
275 276
		/* If the SACK timer is running, we have a pending SACK */
		if (timer_pending(timer)) {
L
Linus Torvalds 已提交
277
			struct sctp_chunk *sack;
278 279 280 281 282

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

L
Linus Torvalds 已提交
283 284 285
			asoc->a_rwnd = asoc->rwnd;
			sack = sctp_make_sack(asoc);
			if (sack) {
286 287 288 289 290
				retval = __sctp_packet_append_chunk(pkt, sack);
				if (retval != SCTP_XMIT_OK) {
					sctp_chunk_free(sack);
					goto out;
				}
L
Linus Torvalds 已提交
291
				asoc->peer.sack_needed = 0;
D
Doug Graham 已提交
292
				if (del_timer(timer))
L
Linus Torvalds 已提交
293 294 295 296
					sctp_association_put(asoc);
			}
		}
	}
297
out:
L
Linus Torvalds 已提交
298 299 300
	return retval;
}

301

L
Linus Torvalds 已提交
302 303 304
/* Append a chunk to the offered packet reporting back any inability to do
 * so.
 */
X
Xin Long 已提交
305 306
static enum sctp_xmit __sctp_packet_append_chunk(struct sctp_packet *packet,
						 struct sctp_chunk *chunk)
L
Linus Torvalds 已提交
307
{
308
	__u16 chunk_len = SCTP_PAD4(ntohs(chunk->chunk_hdr->length));
X
Xin Long 已提交
309
	enum sctp_xmit retval = SCTP_XMIT_OK;
L
Linus Torvalds 已提交
310

311 312 313 314
	/* 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 已提交
315

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

337
	case SCTP_CID_SACK:
L
Linus Torvalds 已提交
338
		packet->has_sack = 1;
339 340
		if (chunk->asoc)
			chunk->asoc->stats.osacks++;
341 342
		break;

343
	case SCTP_CID_AUTH:
344 345 346 347
		packet->has_auth = 1;
		packet->auth = chunk;
		break;
	}
L
Linus Torvalds 已提交
348 349

	/* It is OK to send this chunk.  */
350
	list_add_tail(&chunk->list, &packet->chunk_list);
L
Linus Torvalds 已提交
351 352 353 354 355 356
	packet->size += chunk_len;
	chunk->transport = packet->transport;
finish:
	return retval;
}

357 358 359
/* Append a chunk to the offered packet reporting back any inability to do
 * so.
 */
X
Xin Long 已提交
360 361
enum sctp_xmit sctp_packet_append_chunk(struct sctp_packet *packet,
					struct sctp_chunk *chunk)
362
{
X
Xin Long 已提交
363
	enum sctp_xmit retval = SCTP_XMIT_OK;
364

365
	pr_debug("%s: packet:%p chunk:%p\n", __func__, packet, chunk);
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392

	/* 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;
}

393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
static void sctp_packet_release_owner(struct sk_buff *skb)
{
	sk_free(skb->sk);
}

static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk)
{
	skb_orphan(skb);
	skb->sk = sk;
	skb->destructor = sctp_packet_release_owner;

	/*
	 * The data chunks have already been accounted for in sctp_sendmsg(),
	 * therefore only reserve a single byte to keep socket around until
	 * the packet has been transmitted.
	 */
409
	refcount_inc(&sk->sk_wmem_alloc);
410 411
}

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

M
Marcelo Ricardo Leitner 已提交
423 424
	if (gso) {
		skb_shinfo(head)->gso_type = sk->sk_gso_type;
X
Xin Long 已提交
425 426 427 428 429
		NAPI_GRO_CB(head)->last = head;
	} else {
		nskb = head;
		pkt_size = packet->size;
		goto merge;
M
Marcelo Ricardo Leitner 已提交
430
	}
L
Linus Torvalds 已提交
431

M
Marcelo Ricardo Leitner 已提交
432
	do {
X
Xin Long 已提交
433 434 435 436 437
		/* 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);
438

X
Xin Long 已提交
439 440 441 442 443 444 445 446
			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 已提交
447
		}
X
Xin Long 已提交
448 449 450 451
		nskb = alloc_skb(pkt_size + MAX_HEADER, gfp);
		if (!nskb)
			return 0;
		skb_reserve(nskb, packet->overhead + MAX_HEADER);
L
Linus Torvalds 已提交
452

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

M
Marcelo Ricardo Leitner 已提交
459 460
			list_del_init(&chunk->list);
			if (sctp_chunk_is_data(chunk)) {
461 462
				if (!sctp_chunk_retransmitted(chunk) &&
				    !tp->rto_pending) {
M
Marcelo Ricardo Leitner 已提交
463 464 465 466 467
					chunk->rtt_in_progress = 1;
					tp->rto_pending = 1;
				}
			}

468
			padding = SCTP_PAD4(chunk->skb->len) - chunk->skb->len;
M
Marcelo Ricardo Leitner 已提交
469
			if (padding)
470
				skb_put_zero(chunk->skb, padding);
M
Marcelo Ricardo Leitner 已提交
471 472

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

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

M
Marcelo Ricardo Leitner 已提交
478 479 480 481 482 483 484 485
			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);

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

488
			if (!sctp_chunk_is_data(chunk) && chunk != packet->auth)
M
Marcelo Ricardo Leitner 已提交
489 490 491 492 493 494
				sctp_chunk_free(chunk);

			if (!pkt_size)
				break;
		}

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

X
Xin Long 已提交
506 507 508 509 510 511 512 513
		if (gso) {
			if (skb_gro_receive(&head, nskb)) {
				kfree_skb(nskb);
				return 0;
			}
			if (WARN_ON_ONCE(skb_shinfo(head)->gso_segs >=
					 sk->sk_gso_max_segs))
				return 0;
514
		}
X
Xin Long 已提交
515 516

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

X
Xin Long 已提交
519 520 521 522 523 524 525 526 527
	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);
528
		}
X
Xin Long 已提交
529 530
		rcu_read_unlock();
		goto chksum;
531
	}
L
Linus Torvalds 已提交
532

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

X
Xin Long 已提交
536 537 538 539
	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 已提交
540

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

X
Xin Long 已提交
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
	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 已提交
568

X
Xin Long 已提交
569 570 571 572 573
	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 已提交
574

X
Xin Long 已提交
575 576 577 578 579
	/* 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 已提交
580
		}
X
Xin Long 已提交
581 582 583 584 585 586 587 588 589 590 591 592
		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);
	sctp_packet_set_owner_w(head, sk);

	/* set sctp header */
593
	sh = skb_push(head, sizeof(struct sctphdr));
X
Xin Long 已提交
594 595 596 597 598 599
	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;

600
	/* drop packet if no dst */
X
Xin Long 已提交
601 602 603 604 605 606 607
	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 已提交
608

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

X
Xin Long 已提交
617 618 619 620 621 622 623
	/* 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 已提交
624

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

X
Xin Long 已提交
629 630 631 632 633 634
	/* 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 已提交
635 636
	}
	head->ignore_df = packet->ipfragok;
637
	if (tp->dst_pending_confirm)
638 639 640 641
		skb_set_dst_pending_confirm(head, 1);
	/* neighbour should be confirmed on successful transmission or
	 * positive error
	 */
642 643
	if (tp->af_specific->sctp_xmit(head, tp) >= 0 &&
	    tp->dst_pending_confirm)
644
		tp->dst_pending_confirm = 0;
L
Linus Torvalds 已提交
645

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

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

660
/* This private function check to see if a chunk can be added */
X
Xin Long 已提交
661 662
static enum sctp_xmit sctp_packet_can_append_data(struct sctp_packet *packet,
						  struct sctp_chunk *chunk)
L
Linus Torvalds 已提交
663
{
664
	size_t datasize, rwnd, inflight, flight_size;
L
Linus Torvalds 已提交
665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
	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;
683 684
	inflight = q->outstanding_bytes;
	flight_size = transport->flight_size;
L
Linus Torvalds 已提交
685 686 687

	datasize = sctp_data_size(chunk);

688 689 690 691 692
	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 已提交
693 694 695 696 697 698 699 700 701 702 703 704 705

	/* 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.
	 */
706 707 708
	if (chunk->fast_retransmit != SCTP_NEED_FRTX &&
	    flight_size >= transport->cwnd)
		return SCTP_XMIT_RWND_FULL;
L
Linus Torvalds 已提交
709 710 711 712 713 714 715

	/* 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 已提交
716
	if ((sctp_sk(asoc->base.sk)->nodelay || inflight == 0) &&
717
	    !asoc->force_delay)
X
Xin Long 已提交
718
		/* Nothing unacked */
719 720 721 722 723 724 725 726 727 728 729 730
		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.
	 */
731
	if (chunk->skb->len + q->out_qlen > transport->pathmtu -
732
	    packet->overhead - sctp_datachk_len(&chunk->asoc->stream) - 4)
733 734 735 736 737 738 739 740
		/* 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 */
741
	return SCTP_XMIT_DELAY;
742 743 744 745 746 747 748 749 750 751 752
}

/* 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 已提交
753 754 755 756 757 758
	/* 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;

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

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

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

X
Xin Long 已提交
777 778 779 780 781 782 783 784 785 786
	/* 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;

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

	/* Decide if we need to fragment or resubmit later. */
M
Marcelo Ricardo Leitner 已提交
794 795
	if (psize + chunk_len > pmtu) {
		/* It's OK to fragment at IP level if any one of the following
796
		 * is true:
M
Marcelo Ricardo Leitner 已提交
797 798 799 800
		 *	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.
801
		 */
M
Marcelo Ricardo Leitner 已提交
802
		if (sctp_packet_empty(packet) ||
803 804 805 806 807 808
		    (!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 已提交
809
			goto out;
810
		}
M
Marcelo Ricardo Leitner 已提交
811

812 813 814 815 816 817 818
		/* 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)
819
			maxsize -= SCTP_PAD4(packet->auth->skb->len);
820 821 822
		if (chunk_len > maxsize)
			retval = SCTP_XMIT_PMTU_FULL;

M
Marcelo Ricardo Leitner 已提交
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 848 849
		/* 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 */
850
	}
L
Linus Torvalds 已提交
851

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