protocol.c 42.6 KB
Newer Older
1
/* SCTP kernel implementation
Linus Torvalds's avatar
Linus Torvalds committed
2
3
4
5
6
7
8
 * (C) Copyright IBM Corp. 2001, 2004
 * Copyright (c) 1999-2000 Cisco, Inc.
 * Copyright (c) 1999-2001 Motorola, Inc.
 * Copyright (c) 2001 Intel Corp.
 * Copyright (c) 2001 Nokia, Inc.
 * Copyright (c) 2001 La Monte H.P. Yarroll
 *
9
 * This file is part of the SCTP kernel implementation
Linus Torvalds's avatar
Linus Torvalds committed
10
11
12
 *
 * Initialization/cleanup for SCTP protocol support.
 *
13
 * This SCTP implementation is free software;
Linus Torvalds's avatar
Linus Torvalds committed
14
15
16
17
18
 * 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.
 *
19
 * This SCTP implementation is distributed in the hope that it
Linus Torvalds's avatar
Linus Torvalds committed
20
21
22
23
24
25
 * 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
26
27
 * along with GNU CC; see the file COPYING.  If not, see
 * <http://www.gnu.org/licenses/>.
Linus Torvalds's avatar
Linus Torvalds committed
28
29
30
 *
 * Please send any bug reports or fixes you make to the
 * email address(es):
31
 *    lksctp developers <linux-sctp@vger.kernel.org>
Linus Torvalds's avatar
Linus Torvalds committed
32
33
34
35
36
37
38
39
40
41
 *
 * Written or modified by:
 *    La Monte H.P. Yarroll <piggy@acm.org>
 *    Karl Knutson <karl@athena.chicago.il.us>
 *    Jon Grimm <jgrimm@us.ibm.com>
 *    Sridhar Samudrala <sri@us.ibm.com>
 *    Daisy Chang <daisyc@us.ibm.com>
 *    Ardelle Fan <ardelle.fan@intel.com>
 */

42
43
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

Linus Torvalds's avatar
Linus Torvalds committed
44
45
46
47
48
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
#include <linux/seq_file.h>
49
#include <linux/bootmem.h>
50
51
#include <linux/highmem.h>
#include <linux/swap.h>
52
#include <linux/slab.h>
53
#include <net/net_namespace.h>
Linus Torvalds's avatar
Linus Torvalds committed
54
55
56
#include <net/protocol.h>
#include <net/ip.h>
#include <net/ipv6.h>
57
#include <net/route.h>
Linus Torvalds's avatar
Linus Torvalds committed
58
59
60
61
62
#include <net/sctp/sctp.h>
#include <net/addrconf.h>
#include <net/inet_common.h>
#include <net/inet_ecn.h>

63
64
#define MAX_SCTP_PORT_HASH_ENTRIES (64 * 1024)

Linus Torvalds's avatar
Linus Torvalds committed
65
/* Global data structures. */
66
struct sctp_globals sctp_globals __read_mostly;
Linus Torvalds's avatar
Linus Torvalds committed
67
68
69
70
71
72
73
74
75

struct idr sctp_assocs_id;
DEFINE_SPINLOCK(sctp_assocs_id_lock);

static struct sctp_pf *sctp_pf_inet6_specific;
static struct sctp_pf *sctp_pf_inet_specific;
static struct sctp_af *sctp_af_v4_specific;
static struct sctp_af *sctp_af_v6_specific;

76
77
struct kmem_cache *sctp_chunk_cachep __read_mostly;
struct kmem_cache *sctp_bucket_cachep __read_mostly;
Linus Torvalds's avatar
Linus Torvalds committed
78

Eric Dumazet's avatar
Eric Dumazet committed
79
long sysctl_sctp_mem[3];
80
81
int sysctl_sctp_rmem[3];
int sysctl_sctp_wmem[3];
82

Linus Torvalds's avatar
Linus Torvalds committed
83
/* Set up the proc fs entry for the SCTP protocol. */
84
static int __net_init sctp_proc_init(struct net *net)
Linus Torvalds's avatar
Linus Torvalds committed
85
{
86
#ifdef CONFIG_PROC_FS
87
88
89
90
	net->sctp.proc_net_sctp = proc_net_mkdir(net, "sctp", net->proc_net);
	if (!net->sctp.proc_net_sctp)
		goto out_proc_net_sctp;
	if (sctp_snmp_proc_init(net))
91
		goto out_snmp_proc_init;
92
	if (sctp_eps_proc_init(net))
93
		goto out_eps_proc_init;
94
	if (sctp_assocs_proc_init(net))
95
		goto out_assocs_proc_init;
96
	if (sctp_remaddr_proc_init(net))
97
		goto out_remaddr_proc_init;
Linus Torvalds's avatar
Linus Torvalds committed
98
99
100

	return 0;

101
out_remaddr_proc_init:
102
	sctp_assocs_proc_exit(net);
103
out_assocs_proc_init:
104
	sctp_eps_proc_exit(net);
105
out_eps_proc_init:
106
	sctp_snmp_proc_exit(net);
107
out_snmp_proc_init:
108
109
110
	remove_proc_entry("sctp", net->proc_net);
	net->sctp.proc_net_sctp = NULL;
out_proc_net_sctp:
111
	return -ENOMEM;
112
113
#endif /* CONFIG_PROC_FS */
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
114
115
}

116
/* Clean up the proc fs entry for the SCTP protocol.
Linus Torvalds's avatar
Linus Torvalds committed
117
118
119
 * Note: Do not make this __exit as it is used in the init error
 * path.
 */
120
static void sctp_proc_exit(struct net *net)
Linus Torvalds's avatar
Linus Torvalds committed
121
{
122
#ifdef CONFIG_PROC_FS
123
124
125
126
127
128
129
	sctp_snmp_proc_exit(net);
	sctp_eps_proc_exit(net);
	sctp_assocs_proc_exit(net);
	sctp_remaddr_proc_exit(net);

	remove_proc_entry("sctp", net->proc_net);
	net->sctp.proc_net_sctp = NULL;
130
#endif
Linus Torvalds's avatar
Linus Torvalds committed
131
132
133
134
135
136
137
138
139
140
141
142
143
}

/* Private helper to extract ipv4 address and stash them in
 * the protocol structure.
 */
static void sctp_v4_copy_addrlist(struct list_head *addrlist,
				  struct net_device *dev)
{
	struct in_device *in_dev;
	struct in_ifaddr *ifa;
	struct sctp_sockaddr_entry *addr;

	rcu_read_lock();
144
	if ((in_dev = __in_dev_get_rcu(dev)) == NULL) {
Linus Torvalds's avatar
Linus Torvalds committed
145
146
147
148
149
150
		rcu_read_unlock();
		return;
	}

	for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
		/* Add the address to the local list.  */
151
		addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
Linus Torvalds's avatar
Linus Torvalds committed
152
		if (addr) {
153
154
155
			addr->a.v4.sin_family = AF_INET;
			addr->a.v4.sin_port = 0;
			addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
156
157
			addr->valid = 1;
			INIT_LIST_HEAD(&addr->list);
Linus Torvalds's avatar
Linus Torvalds committed
158
159
160
161
162
163
164
165
166
167
			list_add_tail(&addr->list, addrlist);
		}
	}

	rcu_read_unlock();
}

/* Extract our IP addresses from the system and stash them in the
 * protocol structure.
 */
168
static void sctp_get_local_addr_list(struct net *net)
Linus Torvalds's avatar
Linus Torvalds committed
169
170
171
172
173
{
	struct net_device *dev;
	struct list_head *pos;
	struct sctp_af *af;

174
	rcu_read_lock();
175
	for_each_netdev_rcu(net, dev) {
176
		list_for_each(pos, &sctp_address_families) {
Linus Torvalds's avatar
Linus Torvalds committed
177
			af = list_entry(pos, struct sctp_af, list);
178
			af->copy_addrlist(&net->sctp.local_addr_list, dev);
Linus Torvalds's avatar
Linus Torvalds committed
179
180
		}
	}
181
	rcu_read_unlock();
Linus Torvalds's avatar
Linus Torvalds committed
182
183
184
}

/* Free the existing local addresses.  */
185
static void sctp_free_local_addr_list(struct net *net)
Linus Torvalds's avatar
Linus Torvalds committed
186
187
188
189
{
	struct sctp_sockaddr_entry *addr;
	struct list_head *pos, *temp;

190
	list_for_each_safe(pos, temp, &net->sctp.local_addr_list) {
Linus Torvalds's avatar
Linus Torvalds committed
191
192
193
194
195
196
197
		addr = list_entry(pos, struct sctp_sockaddr_entry, list);
		list_del(pos);
		kfree(addr);
	}
}

/* Copy the local addresses which are valid for 'scope' into 'bp'.  */
198
199
int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *bp,
			      sctp_scope_t scope, gfp_t gfp, int copy_flags)
Linus Torvalds's avatar
Linus Torvalds committed
200
201
202
203
{
	struct sctp_sockaddr_entry *addr;
	int error = 0;

204
	rcu_read_lock();
205
	list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
206
207
		if (!addr->valid)
			continue;
208
		if (sctp_in_scope(net, &addr->a, scope)) {
Linus Torvalds's avatar
Linus Torvalds committed
209
210
211
212
			/* Now that the address is in scope, check to see if
			 * the address type is really supported by the local
			 * sock as well as the remote peer.
			 */
213
			if ((((AF_INET == addr->a.sa.sa_family) &&
Linus Torvalds's avatar
Linus Torvalds committed
214
			      (copy_flags & SCTP_ADDR4_PEERSUPP))) ||
215
			    (((AF_INET6 == addr->a.sa.sa_family) &&
Linus Torvalds's avatar
Linus Torvalds committed
216
217
			      (copy_flags & SCTP_ADDR6_ALLOWED) &&
			      (copy_flags & SCTP_ADDR6_PEERSUPP)))) {
218
				error = sctp_add_bind_addr(bp, &addr->a,
219
						    sizeof(addr->a),
220
						    SCTP_ADDR_SRC, GFP_ATOMIC);
Linus Torvalds's avatar
Linus Torvalds committed
221
222
223
224
225
226
227
				if (error)
					goto end_copy;
			}
		}
	}

end_copy:
228
	rcu_read_unlock();
Linus Torvalds's avatar
Linus Torvalds committed
229
230
231
232
233
234
235
236
	return error;
}

/* Initialize a sctp_addr from in incoming skb.  */
static void sctp_v4_from_skb(union sctp_addr *addr, struct sk_buff *skb,
			     int is_saddr)
{
	void *from;
237
	__be16 *port;
Linus Torvalds's avatar
Linus Torvalds committed
238
239
240
241
242
	struct sctphdr *sh;

	port = &addr->v4.sin_port;
	addr->v4.sin_family = AF_INET;

243
	sh = sctp_hdr(skb);
Linus Torvalds's avatar
Linus Torvalds committed
244
	if (is_saddr) {
245
		*port  = sh->source;
246
		from = &ip_hdr(skb)->saddr;
Linus Torvalds's avatar
Linus Torvalds committed
247
	} else {
248
		*port = sh->dest;
249
		from = &ip_hdr(skb)->daddr;
Linus Torvalds's avatar
Linus Torvalds committed
250
251
252
253
254
255
256
257
	}
	memcpy(&addr->v4.sin_addr.s_addr, from, sizeof(struct in_addr));
}

/* Initialize an sctp_addr from a socket. */
static void sctp_v4_from_sk(union sctp_addr *addr, struct sock *sk)
{
	addr->v4.sin_family = AF_INET;
258
	addr->v4.sin_port = 0;
259
	addr->v4.sin_addr.s_addr = inet_sk(sk)->inet_rcv_saddr;
Linus Torvalds's avatar
Linus Torvalds committed
260
261
262
263
264
}

/* Initialize sk->sk_rcv_saddr from sctp_addr. */
static void sctp_v4_to_sk_saddr(union sctp_addr *addr, struct sock *sk)
{
265
	inet_sk(sk)->inet_rcv_saddr = addr->v4.sin_addr.s_addr;
Linus Torvalds's avatar
Linus Torvalds committed
266
267
268
269
270
}

/* Initialize sk->sk_daddr from sctp_addr. */
static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
{
271
	inet_sk(sk)->inet_daddr = addr->v4.sin_addr.s_addr;
Linus Torvalds's avatar
Linus Torvalds committed
272
273
274
275
276
}

/* Initialize a sctp_addr from an address parameter. */
static void sctp_v4_from_addr_param(union sctp_addr *addr,
				    union sctp_addr_param *param,
277
				    __be16 port, int iif)
Linus Torvalds's avatar
Linus Torvalds committed
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
{
	addr->v4.sin_family = AF_INET;
	addr->v4.sin_port = port;
	addr->v4.sin_addr.s_addr = param->v4.addr.s_addr;
}

/* Initialize an address parameter from a sctp_addr and return the length
 * of the address parameter.
 */
static int sctp_v4_to_addr_param(const union sctp_addr *addr,
				 union sctp_addr_param *param)
{
	int length = sizeof(sctp_ipv4addr_param_t);

	param->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS;
293
	param->v4.param_hdr.length = htons(length);
294
	param->v4.addr.s_addr = addr->v4.sin_addr.s_addr;
Linus Torvalds's avatar
Linus Torvalds committed
295
296
297
298
299

	return length;
}

/* Initialize a sctp_addr from a dst_entry. */
300
static void sctp_v4_dst_saddr(union sctp_addr *saddr, struct flowi4 *fl4,
Al Viro's avatar
Al Viro committed
301
			      __be16 port)
Linus Torvalds's avatar
Linus Torvalds committed
302
303
304
{
	saddr->v4.sin_family = AF_INET;
	saddr->v4.sin_port = port;
305
	saddr->v4.sin_addr.s_addr = fl4->saddr;
Linus Torvalds's avatar
Linus Torvalds committed
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
}

/* Compare two addresses exactly. */
static int sctp_v4_cmp_addr(const union sctp_addr *addr1,
			    const union sctp_addr *addr2)
{
	if (addr1->sa.sa_family != addr2->sa.sa_family)
		return 0;
	if (addr1->v4.sin_port != addr2->v4.sin_port)
		return 0;
	if (addr1->v4.sin_addr.s_addr != addr2->v4.sin_addr.s_addr)
		return 0;

	return 1;
}

/* Initialize addr struct to INADDR_ANY. */
Al Viro's avatar
Al Viro committed
323
static void sctp_v4_inaddr_any(union sctp_addr *addr, __be16 port)
Linus Torvalds's avatar
Linus Torvalds committed
324
325
{
	addr->v4.sin_family = AF_INET;
Al Viro's avatar
Al Viro committed
326
	addr->v4.sin_addr.s_addr = htonl(INADDR_ANY);
Linus Torvalds's avatar
Linus Torvalds committed
327
328
329
330
331
332
	addr->v4.sin_port = port;
}

/* Is this a wildcard address? */
static int sctp_v4_is_any(const union sctp_addr *addr)
{
Al Viro's avatar
Al Viro committed
333
	return htonl(INADDR_ANY) == addr->v4.sin_addr.s_addr;
Linus Torvalds's avatar
Linus Torvalds committed
334
335
336
337
338
339
340
341
342
}

/* This function checks if the address is a valid address to be used for
 * SCTP binding.
 *
 * Output:
 * Return 0 - If the address is a non-unicast or an illegal address.
 * Return 1 - If the address is a unicast.
 */
343
344
345
static int sctp_v4_addr_valid(union sctp_addr *addr,
			      struct sctp_sock *sp,
			      const struct sk_buff *skb)
Linus Torvalds's avatar
Linus Torvalds committed
346
{
347
348
349
350
	/* IPv4 addresses not allowed */
	if (sp && ipv6_only_sock(sctp_opt2sk(sp)))
		return 0;

Linus Torvalds's avatar
Linus Torvalds committed
351
	/* Is this a non-unicast address or a unusable SCTP address? */
Joe Perches's avatar
Joe Perches committed
352
	if (IS_IPV4_UNUSABLE_ADDRESS(addr->v4.sin_addr.s_addr))
Linus Torvalds's avatar
Linus Torvalds committed
353
354
		return 0;

355
	/* Is this a broadcast address? */
Eric Dumazet's avatar
Eric Dumazet committed
356
	if (skb && skb_rtable(skb)->rt_flags & RTCF_BROADCAST)
357
		return 0;
358

Linus Torvalds's avatar
Linus Torvalds committed
359
360
361
362
363
364
	return 1;
}

/* Should this be available for binding?   */
static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
{
365
366
	struct net *net = sock_net(&sp->inet.sk);
	int ret = inet_addr_type(net, addr->v4.sin_addr.s_addr);
Linus Torvalds's avatar
Linus Torvalds committed
367
368


Al Viro's avatar
Al Viro committed
369
	if (addr->v4.sin_addr.s_addr != htonl(INADDR_ANY) &&
370
371
	   ret != RTN_LOCAL &&
	   !sp->inet.freebind &&
372
	   !net->ipv4.sysctl_ip_nonlocal_bind)
Linus Torvalds's avatar
Linus Torvalds committed
373
		return 0;
374

375
376
377
	if (ipv6_only_sock(sctp_opt2sk(sp)))
		return 0;

Linus Torvalds's avatar
Linus Torvalds committed
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
	return 1;
}

/* Checking the loopback, private and other address scopes as defined in
 * RFC 1918.   The IPv4 scoping is based on the draft for SCTP IPv4
 * scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>.
 *
 * Level 0 - unusable SCTP addresses
 * Level 1 - loopback address
 * Level 2 - link-local addresses
 * Level 3 - private addresses.
 * Level 4 - global addresses
 * For INIT and INIT-ACK address list, let L be the level of
 * of requested destination address, sender and receiver
 * SHOULD include all of its addresses with level greater
 * than or equal to L.
394
395
396
 *
 * IPv4 scoping can be controlled through sysctl option
 * net.sctp.addr_scope_policy
Linus Torvalds's avatar
Linus Torvalds committed
397
398
399
400
401
402
 */
static sctp_scope_t sctp_v4_scope(union sctp_addr *addr)
{
	sctp_scope_t retval;

	/* Check for unusable SCTP addresses. */
Joe Perches's avatar
Joe Perches committed
403
	if (IS_IPV4_UNUSABLE_ADDRESS(addr->v4.sin_addr.s_addr)) {
Linus Torvalds's avatar
Linus Torvalds committed
404
		retval =  SCTP_SCOPE_UNUSABLE;
Joe Perches's avatar
Joe Perches committed
405
	} else if (ipv4_is_loopback(addr->v4.sin_addr.s_addr)) {
Linus Torvalds's avatar
Linus Torvalds committed
406
		retval = SCTP_SCOPE_LOOPBACK;
Joe Perches's avatar
Joe Perches committed
407
	} else if (ipv4_is_linklocal_169(addr->v4.sin_addr.s_addr)) {
Linus Torvalds's avatar
Linus Torvalds committed
408
		retval = SCTP_SCOPE_LINK;
Joe Perches's avatar
Joe Perches committed
409
410
411
	} else if (ipv4_is_private_10(addr->v4.sin_addr.s_addr) ||
		   ipv4_is_private_172(addr->v4.sin_addr.s_addr) ||
		   ipv4_is_private_192(addr->v4.sin_addr.s_addr)) {
Linus Torvalds's avatar
Linus Torvalds committed
412
413
414
415
416
417
418
419
420
421
422
423
		retval = SCTP_SCOPE_PRIVATE;
	} else {
		retval = SCTP_SCOPE_GLOBAL;
	}

	return retval;
}

/* Returns a valid dst cache entry for the given source and destination ip
 * addresses. If an association is passed, trys to get a dst entry with a
 * source address that matches an address in the bind address list.
 */
424
425
static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
				struct flowi *fl, struct sock *sk)
Linus Torvalds's avatar
Linus Torvalds committed
426
{
427
	struct sctp_association *asoc = t->asoc;
Linus Torvalds's avatar
Linus Torvalds committed
428
	struct rtable *rt;
429
	struct flowi4 *fl4 = &fl->u.ip4;
Linus Torvalds's avatar
Linus Torvalds committed
430
431
432
	struct sctp_bind_addr *bp;
	struct sctp_sockaddr_entry *laddr;
	struct dst_entry *dst = NULL;
433
	union sctp_addr *daddr = &t->ipaddr;
Linus Torvalds's avatar
Linus Torvalds committed
434
435
	union sctp_addr dst_saddr;

436
437
438
439
	memset(fl4, 0x0, sizeof(struct flowi4));
	fl4->daddr  = daddr->v4.sin_addr.s_addr;
	fl4->fl4_dport = daddr->v4.sin_port;
	fl4->flowi4_proto = IPPROTO_SCTP;
Linus Torvalds's avatar
Linus Torvalds committed
440
	if (asoc) {
441
442
443
		fl4->flowi4_tos = RT_CONN_FLAGS(asoc->base.sk);
		fl4->flowi4_oif = asoc->base.sk->sk_bound_dev_if;
		fl4->fl4_sport = htons(asoc->base.bind_addr.port);
Linus Torvalds's avatar
Linus Torvalds committed
444
	}
445
	if (saddr) {
446
447
		fl4->saddr = saddr->v4.sin_addr.s_addr;
		fl4->fl4_sport = saddr->v4.sin_port;
448
	}
Linus Torvalds's avatar
Linus Torvalds committed
449

450
451
	pr_debug("%s: dst:%pI4, src:%pI4 - ", __func__, &fl4->daddr,
		 &fl4->saddr);
Linus Torvalds's avatar
Linus Torvalds committed
452

453
	rt = ip_route_output_key(sock_net(sk), fl4);
454
	if (!IS_ERR(rt))
455
		dst = &rt->dst;
Linus Torvalds's avatar
Linus Torvalds committed
456
457
458
459
460
461
462
463
464
465
466
467
468

	/* If there is no association or if a source address is passed, no
	 * more validation is required.
	 */
	if (!asoc || saddr)
		goto out;

	bp = &asoc->base.bind_addr;

	if (dst) {
		/* Walk through the bind address list and look for a bind
		 * address that matches the source address of the returned dst.
		 */
469
		sctp_v4_dst_saddr(&dst_saddr, fl4, htons(bp->port));
470
471
		rcu_read_lock();
		list_for_each_entry_rcu(laddr, &bp->address_list, list) {
472
473
474
			if (!laddr->valid || (laddr->state == SCTP_ADDR_DEL) ||
			    (laddr->state != SCTP_ADDR_SRC &&
			    !asoc->src_out_of_asoc_ok))
475
				continue;
Al Viro's avatar
Al Viro committed
476
			if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a))
Linus Torvalds's avatar
Linus Torvalds committed
477
478
				goto out_unlock;
		}
479
		rcu_read_unlock();
Linus Torvalds's avatar
Linus Torvalds committed
480
481
482
483
484
485
486
487
488
489
490

		/* None of the bound addresses match the source address of the
		 * dst. So release it.
		 */
		dst_release(dst);
		dst = NULL;
	}

	/* Walk through the bind address list and try to get a dst that
	 * matches a bind address as the source address.
	 */
491
492
	rcu_read_lock();
	list_for_each_entry_rcu(laddr, &bp->address_list, list) {
493
494
		struct net_device *odev;

495
496
		if (!laddr->valid)
			continue;
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
		if (laddr->state != SCTP_ADDR_SRC ||
		    AF_INET != laddr->a.sa.sa_family)
			continue;

		fl4->fl4_sport = laddr->a.v4.sin_port;
		flowi4_update_output(fl4,
				     asoc->base.sk->sk_bound_dev_if,
				     RT_CONN_FLAGS(asoc->base.sk),
				     daddr->v4.sin_addr.s_addr,
				     laddr->a.v4.sin_addr.s_addr);

		rt = ip_route_output_key(sock_net(sk), fl4);
		if (IS_ERR(rt))
			continue;

512
513
514
		if (!dst)
			dst = &rt->dst;

515
516
517
518
519
		/* Ensure the src address belongs to the output
		 * interface.
		 */
		odev = __ip_dev_find(sock_net(sk), laddr->a.v4.sin_addr.s_addr,
				     false);
Marcelo Ricardo Leitner's avatar
Marcelo Ricardo Leitner committed
520
		if (!odev || odev->ifindex != fl4->flowi4_oif) {
521
522
			if (&rt->dst != dst)
				dst_release(&rt->dst);
523
			continue;
Marcelo Ricardo Leitner's avatar
Marcelo Ricardo Leitner committed
524
		}
525

526
527
		if (dst != &rt->dst)
			dst_release(dst);
528
529
		dst = &rt->dst;
		break;
Linus Torvalds's avatar
Linus Torvalds committed
530
531
532
	}

out_unlock:
533
	rcu_read_unlock();
Linus Torvalds's avatar
Linus Torvalds committed
534
out:
535
	t->dst = dst;
Linus Torvalds's avatar
Linus Torvalds committed
536
	if (dst)
537
538
		pr_debug("rt_dst:%pI4, rt_src:%pI4\n",
			 &fl4->daddr, &fl4->saddr);
Linus Torvalds's avatar
Linus Torvalds committed
539
	else
540
		pr_debug("no route\n");
Linus Torvalds's avatar
Linus Torvalds committed
541
542
543
544
545
}

/* For v4, the source address is cached in the route entry(dst). So no need
 * to cache it separately and hence this is an empty routine.
 */
546
static void sctp_v4_get_saddr(struct sctp_sock *sk,
547
548
			      struct sctp_transport *t,
			      struct flowi *fl)
Linus Torvalds's avatar
Linus Torvalds committed
549
{
550
551
	union sctp_addr *saddr = &t->saddr;
	struct rtable *rt = (struct rtable *)t->dst;
552

Linus Torvalds's avatar
Linus Torvalds committed
553
554
	if (rt) {
		saddr->v4.sin_family = AF_INET;
555
		saddr->v4.sin_addr.s_addr = fl->u.ip4.saddr;
Linus Torvalds's avatar
Linus Torvalds committed
556
557
558
559
560
561
	}
}

/* What interface did this skb arrive on? */
static int sctp_v4_skb_iif(const struct sk_buff *skb)
{
562
	return inet_iif(skb);
Linus Torvalds's avatar
Linus Torvalds committed
563
564
565
566
567
}

/* Was this packet marked by Explicit Congestion Notification? */
static int sctp_v4_is_ce(const struct sk_buff *skb)
{
568
	return INET_ECN_is_ce(ip_hdr(skb)->tos);
Linus Torvalds's avatar
Linus Torvalds committed
569
570
571
572
573
574
}

/* Create and initialize a new sk for the socket returned by accept(). */
static struct sock *sctp_v4_create_accept_sk(struct sock *sk,
					     struct sctp_association *asoc)
{
575
	struct sock *newsk = sk_alloc(sock_net(sk), PF_INET, GFP_KERNEL,
576
			sk->sk_prot, 0);
577
	struct inet_sock *newinet;
Linus Torvalds's avatar
Linus Torvalds committed
578
579
580
581
582
583

	if (!newsk)
		goto out;

	sock_init_data(NULL, newsk);

584
	sctp_copy_sock(newsk, sk, asoc);
Linus Torvalds's avatar
Linus Torvalds committed
585
586
587
588
	sock_reset_flag(newsk, SOCK_ZAPPED);

	newinet = inet_sk(newsk);

589
	newinet->inet_daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr;
Linus Torvalds's avatar
Linus Torvalds committed
590

591
	sk_refcnt_debug_inc(newsk);
Linus Torvalds's avatar
Linus Torvalds committed
592
593
594
595
596
597
598
599
600
601

	if (newsk->sk_prot->init(newsk)) {
		sk_common_release(newsk);
		newsk = NULL;
	}

out:
	return newsk;
}

602
static int sctp_v4_addr_to_user(struct sctp_sock *sp, union sctp_addr *addr)
Linus Torvalds's avatar
Linus Torvalds committed
603
{
604
605
	/* No address mapping for V4 sockets */
	return sizeof(struct sockaddr_in);
Linus Torvalds's avatar
Linus Torvalds committed
606
607
608
609
610
}

/* Dump the v4 addr to the seq file. */
static void sctp_v4_seq_dump_addr(struct seq_file *seq, union sctp_addr *addr)
{
611
	seq_printf(seq, "%pI4 ", &addr->v4.sin_addr);
Linus Torvalds's avatar
Linus Torvalds committed
612
613
}

614
615
616
617
618
static void sctp_v4_ecn_capable(struct sock *sk)
{
	INET_ECN_xmit(sk);
}

619
static void sctp_addr_wq_timeout_handler(unsigned long arg)
620
{
621
	struct net *net = (struct net *)arg;
622
623
624
	struct sctp_sockaddr_entry *addrw, *temp;
	struct sctp_sock *sp;

625
	spin_lock_bh(&net->sctp.addr_wq_lock);
626

627
	list_for_each_entry_safe(addrw, temp, &net->sctp.addr_waitq, list) {
628
629
630
		pr_debug("%s: the first ent in wq:%p is addr:%pISc for cmd:%d at "
			 "entry:%p\n", __func__, &net->sctp.addr_waitq, &addrw->a.sa,
			 addrw->state, addrw);
631

632
#if IS_ENABLED(CONFIG_IPV6)
633
634
635
636
637
638
639
640
641
642
		/* Now we send an ASCONF for each association */
		/* Note. we currently don't handle link local IPv6 addressees */
		if (addrw->a.sa.sa_family == AF_INET6) {
			struct in6_addr *in6;

			if (ipv6_addr_type(&addrw->a.v6.sin6_addr) &
			    IPV6_ADDR_LINKLOCAL)
				goto free_next;

			in6 = (struct in6_addr *)&addrw->a.v6.sin6_addr;
643
			if (ipv6_chk_addr(net, in6, NULL, 0) == 0 &&
644
645
646
			    addrw->state == SCTP_ADDR_NEW) {
				unsigned long timeo_val;

647
648
649
650
				pr_debug("%s: this is on DAD, trying %d sec "
					 "later\n", __func__,
					 SCTP_ADDRESS_TICK_DELAY);

651
652
				timeo_val = jiffies;
				timeo_val += msecs_to_jiffies(SCTP_ADDRESS_TICK_DELAY);
653
				mod_timer(&net->sctp.addr_wq_timer, timeo_val);
654
655
656
				break;
			}
		}
657
#endif
658
		list_for_each_entry(sp, &net->sctp.auto_asconf_splist, auto_asconf_list) {
659
660
661
662
663
664
			struct sock *sk;

			sk = sctp_opt2sk(sp);
			/* ignore bound-specific endpoints */
			if (!sctp_is_ep_boundall(sk))
				continue;
665
			bh_lock_sock(sk);
666
			if (sctp_asconf_mgmt(sp, addrw) < 0)
667
				pr_debug("%s: sctp_asconf_mgmt failed\n", __func__);
668
			bh_unlock_sock(sk);
669
		}
670
#if IS_ENABLED(CONFIG_IPV6)
671
free_next:
672
#endif
673
674
675
		list_del(&addrw->list);
		kfree(addrw);
	}
676
	spin_unlock_bh(&net->sctp.addr_wq_lock);
677
678
}

679
static void sctp_free_addr_wq(struct net *net)
680
681
682
683
{
	struct sctp_sockaddr_entry *addrw;
	struct sctp_sockaddr_entry *temp;

684
685
686
	spin_lock_bh(&net->sctp.addr_wq_lock);
	del_timer(&net->sctp.addr_wq_timer);
	list_for_each_entry_safe(addrw, temp, &net->sctp.addr_waitq, list) {
687
688
689
		list_del(&addrw->list);
		kfree(addrw);
	}
690
	spin_unlock_bh(&net->sctp.addr_wq_lock);
691
692
693
694
695
}

/* lookup the entry for the same address in the addr_waitq
 * sctp_addr_wq MUST be locked
 */
696
697
static struct sctp_sockaddr_entry *sctp_addr_wq_lookup(struct net *net,
					struct sctp_sockaddr_entry *addr)
698
699
700
{
	struct sctp_sockaddr_entry *addrw;

701
	list_for_each_entry(addrw, &net->sctp.addr_waitq, list) {
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
		if (addrw->a.sa.sa_family != addr->a.sa.sa_family)
			continue;
		if (addrw->a.sa.sa_family == AF_INET) {
			if (addrw->a.v4.sin_addr.s_addr ==
			    addr->a.v4.sin_addr.s_addr)
				return addrw;
		} else if (addrw->a.sa.sa_family == AF_INET6) {
			if (ipv6_addr_equal(&addrw->a.v6.sin6_addr,
			    &addr->a.v6.sin6_addr))
				return addrw;
		}
	}
	return NULL;
}

717
void sctp_addr_wq_mgmt(struct net *net, struct sctp_sockaddr_entry *addr, int cmd)
718
719
720
721
722
723
724
725
726
727
{
	struct sctp_sockaddr_entry *addrw;
	unsigned long timeo_val;

	/* first, we check if an opposite message already exist in the queue.
	 * If we found such message, it is removed.
	 * This operation is a bit stupid, but the DHCP client attaches the
	 * new address after a couple of addition and deletion of that address
	 */

728
	spin_lock_bh(&net->sctp.addr_wq_lock);
729
	/* Offsets existing events in addr_wq */
730
	addrw = sctp_addr_wq_lookup(net, addr);
731
732
	if (addrw) {
		if (addrw->state != cmd) {
733
734
735
736
			pr_debug("%s: offsets existing entry for %d, addr:%pISc "
				 "in wq:%p\n", __func__, addrw->state, &addrw->a.sa,
				 &net->sctp.addr_waitq);

737
738
739
			list_del(&addrw->list);
			kfree(addrw);
		}
740
		spin_unlock_bh(&net->sctp.addr_wq_lock);
741
742
743
744
745
746
		return;
	}

	/* OK, we have to add the new address to the wait queue */
	addrw = kmemdup(addr, sizeof(struct sctp_sockaddr_entry), GFP_ATOMIC);
	if (addrw == NULL) {
747
		spin_unlock_bh(&net->sctp.addr_wq_lock);
748
749
750
		return;
	}
	addrw->state = cmd;
751
	list_add_tail(&addrw->list, &net->sctp.addr_waitq);
752
753
754

	pr_debug("%s: add new entry for cmd:%d, addr:%pISc in wq:%p\n",
		 __func__, addrw->state, &addrw->a.sa, &net->sctp.addr_waitq);
755

756
	if (!timer_pending(&net->sctp.addr_wq_timer)) {
757
758
		timeo_val = jiffies;
		timeo_val += msecs_to_jiffies(SCTP_ADDRESS_TICK_DELAY);
759
		mod_timer(&net->sctp.addr_wq_timer, timeo_val);
760
	}
761
	spin_unlock_bh(&net->sctp.addr_wq_lock);
762
763
}

764
765
766
767
768
769
/* Event handler for inet address addition/deletion events.
 * The sctp_local_addr_list needs to be protocted by a spin lock since
 * multiple notifiers (say IPv4 and IPv6) may be running at the same
 * time and thus corrupt the list.
 * The reader side is protected with RCU.
 */
Adrian Bunk's avatar
Adrian Bunk committed
770
771
static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
			       void *ptr)
Linus Torvalds's avatar
Linus Torvalds committed
772
{
773
	struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
774
775
	struct sctp_sockaddr_entry *addr = NULL;
	struct sctp_sockaddr_entry *temp;
776
	struct net *net = dev_net(ifa->ifa_dev->dev);
777
	int found = 0;
Linus Torvalds's avatar
Linus Torvalds committed
778

779
780
781
782
783
784
785
	switch (ev) {
	case NETDEV_UP:
		addr = kmalloc(sizeof(struct sctp_sockaddr_entry), GFP_ATOMIC);
		if (addr) {
			addr->a.v4.sin_family = AF_INET;
			addr->a.v4.sin_port = 0;
			addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
786
			addr->valid = 1;
787
788
789
790
			spin_lock_bh(&net->sctp.local_addr_lock);
			list_add_tail_rcu(&addr->list, &net->sctp.local_addr_list);
			sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_NEW);
			spin_unlock_bh(&net->sctp.local_addr_lock);
791
792
793
		}
		break;
	case NETDEV_DOWN:
794
		spin_lock_bh(&net->sctp.local_addr_lock);
795
		list_for_each_entry_safe(addr, temp,
796
					&net->sctp.local_addr_list, list) {
797
798
799
			if (addr->a.sa.sa_family == AF_INET &&
					addr->a.v4.sin_addr.s_addr ==
					ifa->ifa_local) {
800
				sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_DEL);
801
				found = 1;
802
803
				addr->valid = 0;
				list_del_rcu(&addr->list);
804
805
806
				break;
			}
		}
807
		spin_unlock_bh(&net->sctp.local_addr_lock);
808
		if (found)
809
			kfree_rcu(addr, rcu);
810
811
		break;
	}
Linus Torvalds's avatar
Linus Torvalds committed
812
813
814
815
816
817
818
819

	return NOTIFY_DONE;
}

/*
 * Initialize the control inode/socket with a control endpoint data
 * structure.  This endpoint is reserved exclusively for the OOTB processing.
 */
820
static int sctp_ctl_sock_init(struct net *net)
Linus Torvalds's avatar
Linus Torvalds committed
821
822
{
	int err;
823
	sa_family_t family = PF_INET;
Linus Torvalds's avatar
Linus Torvalds committed
824
825
826
827

	if (sctp_get_pf_specific(PF_INET6))
		family = PF_INET6;

828
829
	err = inet_ctl_sock_create(&net->sctp.ctl_sock, family,
				   SOCK_SEQPACKET, IPPROTO_SCTP, net);
830
831
832

	/* If IPv6 socket could not be created, try the IPv4 socket */
	if (err < 0 && family == PF_INET6)
833
		err = inet_ctl_sock_create(&net->sctp.ctl_sock, AF_INET,
834
					   SOCK_SEQPACKET, IPPROTO_SCTP,
835
					   net);
836

Linus Torvalds's avatar
Linus Torvalds committed
837
	if (err < 0) {
838
		pr_err("Failed to create the SCTP control socket\n");
Linus Torvalds's avatar
Linus Torvalds committed
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
		return err;
	}
	return 0;
}

/* Register address family specific functions. */
int sctp_register_af(struct sctp_af *af)
{
	switch (af->sa_family) {
	case AF_INET:
		if (sctp_af_v4_specific)
			return 0;
		sctp_af_v4_specific = af;
		break;
	case AF_INET6:
		if (sctp_af_v6_specific)
			return 0;
		sctp_af_v6_specific = af;
		break;
	default:
		return 0;
	}

	INIT_LIST_HEAD(&af->list);
	list_add_tail(&af->list, &sctp_address_families);
	return 1;
}

/* Get the table of functions for manipulating a particular address
 * family.
 */
struct sctp_af *sctp_get_af_specific(sa_family_t family)
{
	switch (family) {
	case AF_INET:
		return sctp_af_v4_specific;
	case AF_INET6:
		return sctp_af_v6_specific;
	default:
		return NULL;
	}
}

/* Common code to initialize a AF_INET msg_name. */
static void sctp_inet_msgname(char *msgname, int *addr_len)
{
	struct sockaddr_in *sin;

	sin = (struct sockaddr_in *)msgname;
	*addr_len = sizeof(struct sockaddr_in);
	sin->sin_family = AF_INET;
	memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
}

/* Copy the primary address of the peer primary address as the msg_name. */
static void sctp_inet_event_msgname(struct sctp_ulpevent *event, char *msgname,
				    int *addr_len)
{
	struct sockaddr_in *sin, *sinfrom;

	if (msgname) {
		struct sctp_association *asoc;

		asoc = event->asoc;
		sctp_inet_msgname(msgname, addr_len);
		sin = (struct sockaddr_in *)msgname;
		sinfrom = &asoc->peer.primary_addr.v4;
		sin->sin_port = htons(asoc->peer.port);
		sin->sin_addr.s_addr = sinfrom->sin_addr.s_addr;
	}
}

/* Initialize and copy out a msgname from an inbound skb. */
static void sctp_inet_skb_msgname(struct sk_buff *skb, char *msgname, int *len)
{
	if (msgname) {
915
916
917
		struct sctphdr *sh = sctp_hdr(skb);
		struct sockaddr_in *sin = (struct sockaddr_in *)msgname;

Linus Torvalds's avatar
Linus Torvalds committed
918
919
		sctp_inet_msgname(msgname, len);
		sin->sin_port = sh->source;
920
		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
Linus Torvalds's avatar
Linus Torvalds committed
921
922
923
924
925
926
927
	}
}

/* Do we support this AF? */
static int sctp_inet_af_supported(sa_family_t family, struct sctp_sock *sp)
{
	/* PF_INET only supports AF_INET addresses. */
Eric Dumazet's avatar
Eric Dumazet committed
928
	return AF_INET == family;
Linus Torvalds's avatar
Linus Torvalds committed
929
930
931
932
933
934
935
936
937
938
}

/* Address matching with wildcards allowed. */
static int sctp_inet_cmp_addr(const union sctp_addr *addr1,
			      const union sctp_addr *addr2,
			      struct sctp_sock *opt)
{
	/* PF_INET only supports AF_INET addresses. */
	if (addr1->sa.sa_family != addr2->sa.sa_family)
		return 0;
Al Viro's avatar
Al Viro committed
939
940
	if (htonl(INADDR_ANY) == addr1->v4.sin_addr.s_addr ||
	    htonl(INADDR_ANY) == addr2->v4.sin_addr.s_addr)
Linus Torvalds's avatar
Linus Torvalds committed
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
		return 1;
	if (addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr)
		return 1;

	return 0;
}

/* Verify that provided sockaddr looks bindable.  Common verification has
 * already been taken care of.
 */
static int sctp_inet_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
{
	return sctp_v4_available(addr, opt);
}

/* Verify that sockaddr looks sendable.  Common verification has already
 * been taken care of.
 */
static int sctp_inet_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
{
	return 1;
}

/* Fill in Supported Address Type information for INIT and INIT-ACK
 * chunks.  Returns number of addresses supported.
 */
static int sctp_inet_supported_addrs(const struct sctp_sock *opt,
968
				     __be16 *types)
Linus Torvalds's avatar
Linus Torvalds committed
969
970
971
972
973
974
975
{
	types[0] = SCTP_PARAM_IPV4_ADDRESS;
	return 1;
}

/* Wrapper routine that calls the ip transmit routine. */
static inline int sctp_v4_xmit(struct sk_buff *skb,
976
			       struct sctp_transport *transport)
Linus Torvalds's avatar
Linus Torvalds committed
977
{
978
979
	struct inet_sock *inet = inet_sk(skb->sk);

980
981
	pr_debug("%s: skb:%p, len:%d, src:%pI4, dst:%pI4\n", __func__, skb,
		 skb->len, &transport->fl.u.ip4.saddr, &transport->fl.u.ip4.daddr);
Linus Torvalds's avatar
Linus Torvalds committed
982

983
984
985
	inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
			 IP_PMTUDISC_DO : IP_PMTUDISC_DONT;

986
	SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS);
987

988
	return ip_queue_xmit(&inet->sk, skb, &transport->fl);
Linus Torvalds's avatar
Linus Torvalds committed
989
990
}

991
static struct sctp_af sctp_af_inet;
Linus Torvalds's avatar
Linus Torvalds committed
992
993
994
995
996
997
998
999
1000
1001

static struct sctp_pf sctp_pf_inet = {
	.event_msgname = sctp_inet_event_msgname,
	.skb_msgname   = sctp_inet_skb_msgname,
	.af_supported  = sctp_inet_af_supported,
	.cmp_addr      = sctp_inet_cmp_addr,
	.bind_verify   = sctp_inet_bind_verify,
	.send_verify   = sctp_inet_send_verify,
	.supported_addrs = sctp_inet_supported_addrs,
	.create_accept_sk = sctp_v4_create_accept_sk,
1002
1003
1004
	.addr_to_user  = sctp_v4_addr_to_user,
	.to_sk_saddr   = sctp_v4_to_sk_saddr,
	.to_sk_daddr   = sctp_v4_to_sk_daddr,
1005
	.af            = &sctp_af_inet
Linus Torvalds's avatar
Linus Torvalds committed
1006
1007
1008
1009
1010
1011
1012
1013
};

/* Notifier for inetaddr addition/deletion events.  */
static struct notifier_block sctp_inetaddr_notifier = {
	.notifier_call = sctp_inetaddr_event,
};

/* Socket operations.  */
1014
static const struct proto_ops inet_seqpacket_ops = {
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
	.family		   = PF_INET,
	.owner		   = THIS_MODULE,
	.release	   = inet_release,	/* Needs to be wrapped... */
	.bind		   = inet_bind,
	.connect	   = inet_dgram_connect,
	.socketpair	   = sock_no_socketpair,
	.accept		   = inet_accept,
	.getname	   = inet_getname,	/* Semantics are different.  */
	.poll		   = sctp_poll,
	.ioctl		   = inet_ioctl,
	.listen		   = sctp_inet_listen,
	.shutdown	   = inet_shutdown,	/* Looks harmless.  */
	.setsockopt	   = sock_common_setsockopt, /* IP_SOL IP_OPTION is a problem */
	.getsockopt	   = sock_common_getsockopt,
	.sendmsg	   = inet_sendmsg,
	.recvmsg	   = sock_common_recvmsg,
	.mmap		   = sock_no_mmap,
	.sendpage	   = sock_no_sendpage,
1033
#ifdef CONFIG_COMPAT
1034
1035
	.compat_setsockopt = compat_sock_common_setsockopt,
	.compat_getsockopt = compat_sock_common_getsockopt,
1036
#endif
Linus Torvalds's avatar
Linus Torvalds committed
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
};

/* Registration with AF_INET family.  */
static struct inet_protosw sctp_seqpacket_protosw = {
	.type       = SOCK_SEQPACKET,
	.protocol   = IPPROTO_SCTP,
	.prot       = &sctp_prot,
	.ops        = &inet_seqpacket_ops,
	.flags      = SCTP_PROTOSW_FLAG
};
static struct inet_protosw sctp_stream_protosw = {
	.type       = SOCK_STREAM,
	.protocol   = IPPROTO_SCTP,
	.prot       = &sctp_prot,
	.ops        = &inet_seqpacket_ops,
	.flags      = SCTP_PROTOSW_FLAG
};

/* Register with IP layer.  */
1056
static const struct net_protocol sctp_protocol = {
Linus Torvalds's avatar
Linus Torvalds committed
1057
1058
1059
	.handler     = sctp_rcv,
	.err_handler = sctp_v4_err,
	.no_policy   = 1,
1060
	.netns_ok    = 1,
1061
	.icmp_strict_tag_validation = 1,
Linus Torvalds's avatar
Linus Torvalds committed
1062
1063
1064
};

/* IPv4 address related functions.  */
1065
static struct sctp_af sctp_af_inet = {
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
	.sa_family	   = AF_INET,
	.sctp_xmit	   = sctp_v4_xmit,
	.setsockopt	   = ip_setsockopt,
	.getsockopt	   = ip_getsockopt,
	.get_dst	   = sctp_v4_get_dst,
	.get_saddr	   = sctp_v4_get_saddr,
	.copy_addrlist	   = sctp_v4_copy_addrlist,
	.from_skb	   = sctp_v4_from_skb,
	.from_sk	   = sctp_v4_from_sk,
	.from_addr_param   = sctp_v4_from_addr_param,
	.to_addr_param	   = sctp_v4_to_addr_param,
	.cmp_addr	   = sctp_v4_cmp_addr,
	.addr_valid	   = sctp_v4_addr_valid,
	.inaddr_any	   = sctp_v4_inaddr_any,
	.is_any		   = sctp_v4_is_any,
	.available	   = sctp_v4_available,
	.scope		   = sctp_v4_scope,
	.skb_iif	   = sctp_v4_skb_iif,
	.is_ce		   = sctp_v4_is_ce,
	.seq_dump_addr	   = sctp_v4_seq_dump_addr,
1086
	.ecn_capable	   = sctp_v4_ecn_capable,
1087
1088
	.net_header_len	   = sizeof(struct iphdr),
	.sockaddr_len	   = sizeof(struct sockaddr_in),
1089
#ifdef CONFIG_COMPAT
1090
1091
	.compat_setsockopt = compat_ip_setsockopt,
	.compat_getsockopt = compat_ip_getsockopt,
1092
#endif
Linus Torvalds's avatar
Linus Torvalds committed
1093
1094
};

1095
1096
struct sctp_pf *sctp_get_pf_specific(sa_family_t family)
{
Linus Torvalds's avatar
Linus Torvalds committed
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
	switch (family) {
	case PF_INET:
		return sctp_pf_inet_specific;
	case PF_INET6:
		return sctp_pf_inet6_specific;
	default:
		return NULL;
	}
}

/* Register the PF specific function table.  */
int sctp_register_pf(struct sctp_pf *pf, sa_family_t family)
{
	switch (family) {
	case PF_INET:
		if (sctp_pf_inet_specific)
			return 0;
		sctp_pf_inet_specific = pf;
		break;
	case PF_INET6:
		if (sctp_pf_inet6_specific)
			return 0;
		sctp_pf_inet6_specific = pf;
		break;
	default:
		return 0;
	}
	return 1;
}

1127
static inline int init_sctp_mibs(struct net *net)
1128
{
WANG Cong's avatar
WANG Cong committed
1129
1130
1131
1132
	net->sctp.sctp_statistics = alloc_percpu(struct sctp_mib);
	if (!net->sctp.sctp_statistics)
		return -ENOMEM;
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
1133
1134
}

1135
static inline void cleanup_sctp_mibs(struct net *net)
Linus Torvalds's avatar
Linus Torvalds committed
1136
{
WANG Cong's avatar
WANG Cong committed
1137
	free_percpu(net->sctp.sctp_statistics);
Linus Torvalds's avatar
Linus Torvalds committed
1138
1139
}

1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
static void sctp_v4_pf_init(void)
{
	/* Initialize the SCTP specific PF functions. */
	sctp_register_pf(&sctp_pf_inet, PF_INET);
	sctp_register_af(&sctp_af_inet);
}

static void sctp_v4_pf_exit(void)
{
	list_del(&sctp_af_inet.list);
}

static int sctp_v4_protosw_init(void)
{
	int rc;

	rc = proto_register(&sctp_prot, 1);
	if (rc)
		return rc;

	/* Register SCTP(UDP and TCP style) with socket layer.  */
	inet_register_protosw(&sctp_seqpacket_protosw);
	inet_register_protosw(&sctp_stream_protosw);

	return 0;
}

static void sctp_v4_protosw_exit(void)
{
	inet_unregister_protosw(&sctp_stream_protosw);
	inet_unregister_protosw(&sctp_seqpacket_protosw);
	proto_unregister(&sctp_prot);
}

static int sctp_v4_add_protocol(void)
{
	/* Register notifier for inet address additions/deletions. */
	register_inetaddr_notifier(&sctp_inetaddr_notifier);

	/* Register SCTP with inet layer.  */
	if (inet_add_protocol(&sctp_protocol, IPPROTO_SCTP) < 0)
		return -EAGAIN;

	return 0;
}

static void sctp_v4_del_protocol(void)
{
	inet_del_protocol(&sctp_protocol, IPPROTO_SCTP);
	unregister_inetaddr_notifier(&sctp_inetaddr_notifier);
}

1192
static int __net_init sctp_defaults_init(struct net *net)
1193
{
1194
1195
	int status;

1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
	/*
	 * 14. Suggested SCTP Protocol Parameter Values
	 */
	/* The following protocol parameters are RECOMMENDED:  */
	/* RTO.Initial              - 3  seconds */
	net->sctp.rto_initial			= SCTP_RTO_INITIAL;
	/* RTO.Min                  - 1  second */
	net->sctp.rto_min	 		= SCTP_RTO_MIN;
	/* RTO.Max                 -  60 seconds */
	net->sctp.rto_max 			= SCTP_RTO_MAX;
	/* RTO.Alpha                - 1/8 */
	net->sctp.rto_alpha			= SCTP_RTO_ALPHA;
	/* RTO.Beta                 - 1/4 */
	net->sctp.rto_beta			= SCTP_RTO_BETA;

	/* Valid.Cookie.Life        - 60  seconds */
	net->sctp.valid_cookie_life		= SCTP_DEFAULT_COOKIE_LIFE;

	/* Whether Cookie Preservative is enabled(1) or not(0) */
	net->sctp.cookie_preserve_enable 	= 1;

1217
	/* Default sctp sockets to use md5 as their hmac alg */
1218
#if defined (CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5)
1219
	net->sctp.sctp_hmac_alg			= "md5";
1220
#elif defined (CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1)
1221
1222
1223
1224
1225
	net->sctp.sctp_hmac_alg			= "sha1";
#else
	net->sctp.sctp_hmac_alg			= NULL;
#endif

1226
1227
1228
	/* Max.Burst		    - 4 */
	net->sctp.max_burst			= SCTP_DEFAULT_MAX_BURST;

1229
1230
1231
	/* Enable pf state by default */
	net->sctp.pf_enable = 1;

1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
	/* Association.Max.Retrans  - 10 attempts
	 * Path.Max.Retrans         - 5  attempts (per destination address)
	 * Max.Init.Retransmits     - 8  attempts
	 */
	net->sctp.max_retrans_association	= 10;
	net->sctp.max_retrans_path		= 5;
	net->sctp.max_retrans_init		= 8;

	/* Sendbuffer growth	    - do per-socket accounting */
	net->sctp.sndbuf_policy			= 0;

	/* Rcvbuffer growth	    - do per-socket accounting */
	net->sctp.rcvbuf_policy			= 0;

	/* HB.interval              - 30 seconds */
	net->sctp.hb_interval			= SCTP_DEFAULT_TIMEOUT_HEARTBEAT;

	/* delayed SACK timeout */
	net->sctp.sack_timeout			= SCTP_DEFAULT_TIMEOUT_SACK;

	/* Disable ADDIP by default. */
	net->sctp.addip_enable = 0;
	net->sctp.addip_noauth = 0;
	net->sctp.default_auto_asconf = 0;

	/* Enable PR-SCTP by default. */
	net->sctp.prsctp_enable = 1;

	/* Disable AUTH by default. */
	net->sctp.auth_enable = 0;

	/* Set SCOPE policy to enabled */
	net->sctp.scope_policy = SCTP_SCOPE_POLICY_ENABLE;

	/* Set the default rwnd update threshold */
	net->sctp.rwnd_upd_shift = SCTP_DEFAULT_RWND_SHIFT;

	/* Initialize maximum autoclose timeout. */
	net->sctp.max_autoclose		= INT_MAX / HZ;

1272
1273
1274
1275
	status = sctp_sysctl_net_register(net);
	if (status)
		goto err_sysctl_register;

1276
1277
1278
1279
1280
	/* Allocate and initialise sctp mibs.  */
	status = init_sctp_mibs(net);
	if (status)
		goto err_init_mibs;

1281
1282
1283
1284
1285
1286
1287
	/* Initialize proc fs directory.  */
	status = sctp_proc_init(net);
	if (status)
		goto err_init_proc;

	sctp_dbg_objcnt_init(net);

1288
1289
1290
1291
1292