blob: 306c737bde874215acaff7f50bb8e640f90eea86 [file] [log] [blame]
Vlad Yasevich60c778b2008-01-11 09:57:09 -05001/* SCTP kernel implementation
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * (C) Copyright IBM Corp. 2001, 2004
3 * Copyright (c) 1999-2000 Cisco, Inc.
4 * Copyright (c) 1999-2001 Motorola, Inc.
5 * Copyright (c) 2001-2003 Intel Corp.
6 * Copyright (c) 2001-2002 Nokia, Inc.
7 * Copyright (c) 2001 La Monte H.P. Yarroll
8 *
Vlad Yasevich60c778b2008-01-11 09:57:09 -05009 * This file is part of the SCTP kernel implementation
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 *
11 * These functions interface with the sockets layer to implement the
12 * SCTP Extensions for the Sockets API.
13 *
14 * Note that the descriptions from the specification are USER level
15 * functions--this file is the functions which populate the struct proto
16 * for SCTP which is the BOTTOM of the sockets interface.
17 *
Vlad Yasevich60c778b2008-01-11 09:57:09 -050018 * This SCTP implementation is free software;
Linus Torvalds1da177e2005-04-16 15:20:36 -070019 * you can redistribute it and/or modify it under the terms of
20 * the GNU General Public License as published by
21 * the Free Software Foundation; either version 2, or (at your option)
22 * any later version.
23 *
Vlad Yasevich60c778b2008-01-11 09:57:09 -050024 * This SCTP implementation is distributed in the hope that it
Linus Torvalds1da177e2005-04-16 15:20:36 -070025 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
26 * ************************
27 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
28 * See the GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
Jeff Kirsher4b2f13a2013-12-06 06:28:48 -080031 * along with GNU CC; see the file COPYING. If not, see
32 * <http://www.gnu.org/licenses/>.
Linus Torvalds1da177e2005-04-16 15:20:36 -070033 *
34 * Please send any bug reports or fixes you make to the
35 * email address(es):
Daniel Borkmann91705c62013-07-23 14:51:47 +020036 * lksctp developers <linux-sctp@vger.kernel.org>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 * Written or modified by:
39 * La Monte H.P. Yarroll <piggy@acm.org>
40 * Narasimha Budihal <narsi@refcode.org>
41 * Karl Knutson <karl@athena.chicago.il.us>
42 * Jon Grimm <jgrimm@us.ibm.com>
43 * Xingang Guo <xingang.guo@intel.com>
44 * Daisy Chang <daisyc@us.ibm.com>
45 * Sridhar Samudrala <samudrala@us.ibm.com>
46 * Inaky Perez-Gonzalez <inaky.gonzalez@intel.com>
47 * Ardelle Fan <ardelle.fan@intel.com>
48 * Ryan Layer <rmlayer@us.ibm.com>
49 * Anup Pemmaiah <pemmaiah@cc.usu.edu>
50 * Kevin Gao <kevin.gao@intel.com>
Linus Torvalds1da177e2005-04-16 15:20:36 -070051 */
52
Joe Perches145ce502010-08-24 13:21:08 +000053#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
54
Herbert Xu5821c762016-01-24 21:20:12 +080055#include <crypto/hash.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070056#include <linux/types.h>
57#include <linux/kernel.h>
58#include <linux/wait.h>
59#include <linux/time.h>
Ingo Molnar3f07c012017-02-08 18:51:30 +010060#include <linux/sched/signal.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070061#include <linux/ip.h>
Randy Dunlap4fc268d2006-01-11 12:17:47 -080062#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070063#include <linux/fcntl.h>
64#include <linux/poll.h>
65#include <linux/init.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090066#include <linux/slab.h>
Al Viro56b31d12012-08-18 00:25:51 -040067#include <linux/file.h>
Daniel Borkmannffd59392014-02-17 12:11:11 +010068#include <linux/compat.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070069
70#include <net/ip.h>
71#include <net/icmp.h>
72#include <net/route.h>
73#include <net/ipv6.h>
74#include <net/inet_common.h>
Neil Horman8465a5f2014-04-17 15:26:51 -040075#include <net/busy_poll.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070076
77#include <linux/socket.h> /* for sa_family_t */
Paul Gortmakerbc3b2d72011-07-15 11:47:34 -040078#include <linux/export.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070079#include <net/sock.h>
80#include <net/sctp/sctp.h>
81#include <net/sctp/sm.h>
Marcelo Ricardo Leitner13aa8772017-10-03 19:20:14 -030082#include <net/sctp/stream_sched.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070083
Linus Torvalds1da177e2005-04-16 15:20:36 -070084/* Forward declarations for internal helper functions. */
85static int sctp_writeable(struct sock *sk);
86static void sctp_wfree(struct sk_buff *skb);
Xin Longcea0cc82017-11-15 16:57:26 +080087static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
88 size_t msg_len, struct sock **orig_sk);
wangweidong26ac8e52013-12-23 12:16:51 +080089static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p);
Linus Torvalds1da177e2005-04-16 15:20:36 -070090static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p);
91static int sctp_wait_for_accept(struct sock *sk, long timeo);
92static void sctp_wait_for_close(struct sock *sk, long timeo);
Daniel Borkmann0a2fbac2013-06-25 18:17:29 +020093static void sctp_destruct_sock(struct sock *sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -070094static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
95 union sctp_addr *addr, int len);
96static int sctp_bindx_add(struct sock *, struct sockaddr *, int);
97static int sctp_bindx_rem(struct sock *, struct sockaddr *, int);
98static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int);
99static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int);
100static int sctp_send_asconf(struct sctp_association *asoc,
101 struct sctp_chunk *chunk);
102static int sctp_do_bind(struct sock *, union sctp_addr *, int);
103static int sctp_autobind(struct sock *sk);
Xin Longb7ef2612017-08-11 10:23:50 +0800104static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
105 struct sctp_association *assoc,
106 enum sctp_socket_type type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Eric Dumazet06044752017-06-07 13:29:12 -0700108static unsigned long sctp_memory_pressure;
Eric Dumazet8d987e52010-11-09 23:24:26 +0000109static atomic_long_t sctp_memory_allocated;
Eric Dumazet17483762008-11-25 21:16:35 -0800110struct percpu_counter sctp_sockets_allocated;
Neil Horman4d93df02007-08-15 16:07:44 -0700111
Pavel Emelyanov5c52ba12008-07-16 20:28:10 -0700112static void sctp_enter_memory_pressure(struct sock *sk)
Neil Horman4d93df02007-08-15 16:07:44 -0700113{
114 sctp_memory_pressure = 1;
115}
116
117
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118/* Get the sndbuf space available at the time on the association. */
119static inline int sctp_wspace(struct sctp_association *asoc)
120{
Neil Horman4d93df02007-08-15 16:07:44 -0700121 int amt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122
Neil Horman4d93df02007-08-15 16:07:44 -0700123 if (asoc->ep->sndbuf_policy)
124 amt = asoc->sndbuf_used;
125 else
Eric Dumazet31e6d362009-06-17 19:05:41 -0700126 amt = sk_wmem_alloc_get(asoc->base.sk);
Neil Horman4d93df02007-08-15 16:07:44 -0700127
128 if (amt >= asoc->base.sk->sk_sndbuf) {
129 if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK)
130 amt = 0;
131 else {
132 amt = sk_stream_wspace(asoc->base.sk);
133 if (amt < 0)
134 amt = 0;
135 }
Neil Horman4eb701d2005-04-28 12:02:04 -0700136 } else {
Neil Horman4d93df02007-08-15 16:07:44 -0700137 amt = asoc->base.sk->sk_sndbuf - amt;
Neil Horman4eb701d2005-04-28 12:02:04 -0700138 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 return amt;
140}
141
142/* Increment the used sndbuf space count of the corresponding association by
143 * the size of the outgoing data chunk.
144 * Also, set the skb destructor for sndbuf accounting later.
145 *
146 * Since it is always 1-1 between chunk and skb, and also a new skb is always
147 * allocated for chunk bundling in sctp_packet_transmit(), we can use the
148 * destructor in the data chunk skb for the purpose of the sndbuf space
149 * tracking.
150 */
151static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
152{
153 struct sctp_association *asoc = chunk->asoc;
154 struct sock *sk = asoc->base.sk;
155
156 /* The sndbuf space is tracked per association. */
157 sctp_association_hold(asoc);
158
Neil Horman4eb701d2005-04-28 12:02:04 -0700159 skb_set_owner_w(chunk->skb, sk);
160
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161 chunk->skb->destructor = sctp_wfree;
162 /* Save the chunk pointer in skb for sctp_wfree to use later. */
Daniel Borkmannf869c912014-11-20 01:54:48 +0100163 skb_shinfo(chunk->skb)->destructor_arg = chunk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164
Neil Horman4eb701d2005-04-28 12:02:04 -0700165 asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk) +
166 sizeof(struct sk_buff) +
167 sizeof(struct sctp_chunk);
168
Reshetova, Elena14afee42017-06-30 13:08:00 +0300169 refcount_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
Hideo Aoki3ab224b2007-12-31 00:11:19 -0800170 sk->sk_wmem_queued += chunk->skb->truesize;
171 sk_mem_charge(sk, chunk->skb->truesize);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172}
173
Xin Longd04adf12017-10-28 02:13:29 +0800174static void sctp_clear_owner_w(struct sctp_chunk *chunk)
175{
176 skb_orphan(chunk->skb);
177}
178
179static void sctp_for_each_tx_datachunk(struct sctp_association *asoc,
180 void (*cb)(struct sctp_chunk *))
181
182{
183 struct sctp_outq *q = &asoc->outqueue;
184 struct sctp_transport *t;
185 struct sctp_chunk *chunk;
186
187 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports)
188 list_for_each_entry(chunk, &t->transmitted, transmitted_list)
189 cb(chunk);
190
Xin Longa8dd3972017-11-26 20:56:07 +0800191 list_for_each_entry(chunk, &q->retransmit, transmitted_list)
Xin Longd04adf12017-10-28 02:13:29 +0800192 cb(chunk);
193
Xin Longa8dd3972017-11-26 20:56:07 +0800194 list_for_each_entry(chunk, &q->sacked, transmitted_list)
Xin Longd04adf12017-10-28 02:13:29 +0800195 cb(chunk);
196
Xin Longa8dd3972017-11-26 20:56:07 +0800197 list_for_each_entry(chunk, &q->abandoned, transmitted_list)
Xin Longd04adf12017-10-28 02:13:29 +0800198 cb(chunk);
199
200 list_for_each_entry(chunk, &q->out_chunk_list, list)
201 cb(chunk);
202}
203
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204/* Verify that this is a valid address. */
205static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr,
206 int len)
207{
208 struct sctp_af *af;
209
210 /* Verify basic sockaddr. */
211 af = sctp_sockaddr_af(sctp_sk(sk), addr, len);
212 if (!af)
213 return -EINVAL;
214
215 /* Is this a valid SCTP address? */
Vlad Yasevich5636bef2006-06-17 22:55:35 -0700216 if (!af->addr_valid(addr, sctp_sk(sk), NULL))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217 return -EINVAL;
218
219 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr)))
220 return -EINVAL;
221
222 return 0;
223}
224
225/* Look up the association by its id. If this is not a UDP-style
226 * socket, the ID field is always ignored.
227 */
228struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id)
229{
230 struct sctp_association *asoc = NULL;
231
232 /* If this is not a UDP-style socket, assoc id should be ignored. */
233 if (!sctp_style(sk, UDP)) {
234 /* Return NULL if the socket state is not ESTABLISHED. It
235 * could be a TCP-style listening socket or a socket which
236 * hasn't yet called connect() to establish an association.
237 */
Marcelo Ricardo Leitnere5b13f32016-07-15 16:38:19 -0300238 if (!sctp_sstate(sk, ESTABLISHED) && !sctp_sstate(sk, CLOSING))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 return NULL;
240
241 /* Get the first and the only association from the list. */
242 if (!list_empty(&sctp_sk(sk)->ep->asocs))
243 asoc = list_entry(sctp_sk(sk)->ep->asocs.next,
244 struct sctp_association, asocs);
245 return asoc;
246 }
247
248 /* Otherwise this is a UDP-style socket. */
249 if (!id || (id == (sctp_assoc_t)-1))
250 return NULL;
251
252 spin_lock_bh(&sctp_assocs_id_lock);
253 asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id);
254 spin_unlock_bh(&sctp_assocs_id_lock);
255
256 if (!asoc || (asoc->base.sk != sk) || asoc->base.dead)
257 return NULL;
258
259 return asoc;
260}
261
262/* Look up the transport from an address and an assoc id. If both address and
263 * id are specified, the associations matching the address and the id should be
264 * the same.
265 */
266static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
267 struct sockaddr_storage *addr,
268 sctp_assoc_t id)
269{
270 struct sctp_association *addr_asoc = NULL, *id_asoc = NULL;
Xin Long6f29a132017-01-24 14:01:53 +0800271 struct sctp_af *af = sctp_get_af_specific(addr->ss_family);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272 union sctp_addr *laddr = (union sctp_addr *)addr;
Xin Long6f29a132017-01-24 14:01:53 +0800273 struct sctp_transport *transport;
274
Xin Long912964e2017-02-07 20:56:08 +0800275 if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len))
Xin Long6f29a132017-01-24 14:01:53 +0800276 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep,
Al Virocd4ff032006-11-20 17:11:33 -0800279 laddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 &transport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281
282 if (!addr_asoc)
283 return NULL;
284
285 id_asoc = sctp_id2assoc(sk, id);
286 if (id_asoc && (id_asoc != addr_asoc))
287 return NULL;
288
Jason Gunthorpe299ee122014-07-30 12:40:53 -0600289 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290 (union sctp_addr *)addr);
291
292 return transport;
293}
294
295/* API 3.1.2 bind() - UDP Style Syntax
296 * The syntax of bind() is,
297 *
298 * ret = bind(int sd, struct sockaddr *addr, int addrlen);
299 *
300 * sd - the socket descriptor returned by socket().
301 * addr - the address structure (struct sockaddr_in or struct
302 * sockaddr_in6 [RFC 2553]),
303 * addr_len - the size of the address structure.
304 */
Daniel Borkmanndda91922013-06-17 11:40:05 +0200305static int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306{
307 int retval = 0;
308
wangweidong048ed4b2014-01-21 15:44:11 +0800309 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310
Daniel Borkmannbb333812013-06-28 19:49:40 +0200311 pr_debug("%s: sk:%p, addr:%p, addr_len:%d\n", __func__, sk,
312 addr, addr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313
314 /* Disallow binding twice. */
315 if (!sctp_sk(sk)->ep->base.bind_addr.port)
Frank Filz3f7a87d2005-06-20 13:14:57 -0700316 retval = sctp_do_bind(sk, (union sctp_addr *)addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317 addr_len);
318 else
319 retval = -EINVAL;
320
wangweidong048ed4b2014-01-21 15:44:11 +0800321 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322
323 return retval;
324}
325
326static long sctp_get_port_local(struct sock *, union sctp_addr *);
327
328/* Verify this is a valid sockaddr. */
329static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
330 union sctp_addr *addr, int len)
331{
332 struct sctp_af *af;
333
334 /* Check minimum size. */
335 if (len < sizeof (struct sockaddr))
336 return NULL;
337
Vlad Yasevich7dab83d2008-07-18 23:05:40 -0700338 /* V4 mapped address are really of AF_INET family */
339 if (addr->sa.sa_family == AF_INET6 &&
340 ipv6_addr_v4mapped(&addr->v6.sin6_addr)) {
341 if (!opt->pf->af_supported(AF_INET, opt))
342 return NULL;
343 } else {
344 /* Does this PF support this AF? */
345 if (!opt->pf->af_supported(addr->sa.sa_family, opt))
346 return NULL;
347 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348
349 /* If we get this far, af is valid. */
350 af = sctp_get_af_specific(addr->sa.sa_family);
351
352 if (len < af->sockaddr_len)
353 return NULL;
354
355 return af;
356}
357
358/* Bind a local address either to an endpoint or to an association. */
Daniel Borkmanndda91922013-06-17 11:40:05 +0200359static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360{
Eric W. Biederman35946982012-11-16 03:03:12 +0000361 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362 struct sctp_sock *sp = sctp_sk(sk);
363 struct sctp_endpoint *ep = sp->ep;
364 struct sctp_bind_addr *bp = &ep->base.bind_addr;
365 struct sctp_af *af;
366 unsigned short snum;
367 int ret = 0;
368
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 /* Common sockaddr verification. */
370 af = sctp_sockaddr_af(sp, addr, len);
Frank Filz3f7a87d2005-06-20 13:14:57 -0700371 if (!af) {
Daniel Borkmannbb333812013-06-28 19:49:40 +0200372 pr_debug("%s: sk:%p, newaddr:%p, len:%d EINVAL\n",
373 __func__, sk, addr, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 return -EINVAL;
Frank Filz3f7a87d2005-06-20 13:14:57 -0700375 }
376
377 snum = ntohs(addr->v4.sin_port);
378
Daniel Borkmannbb333812013-06-28 19:49:40 +0200379 pr_debug("%s: sk:%p, new addr:%pISc, port:%d, new port:%d, len:%d\n",
380 __func__, sk, &addr->sa, bp->port, snum, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381
382 /* PF specific bind() address verification. */
383 if (!sp->pf->bind_verify(sp, addr))
384 return -EADDRNOTAVAIL;
385
Vlad Yasevich8b358052007-05-15 17:14:58 -0400386 /* We must either be unbound, or bind to the same port.
387 * It's OK to allow 0 ports if we are already bound.
388 * We'll just inhert an already bound port in this case
389 */
390 if (bp->port) {
391 if (!snum)
392 snum = bp->port;
393 else if (snum != bp->port) {
Daniel Borkmannbb333812013-06-28 19:49:40 +0200394 pr_debug("%s: new port %d doesn't match existing port "
395 "%d\n", __func__, snum, bp->port);
Vlad Yasevich8b358052007-05-15 17:14:58 -0400396 return -EINVAL;
397 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 }
399
Krister Johansen4548b682017-01-20 17:49:11 -0800400 if (snum && snum < inet_prot_sock(net) &&
Eric W. Biederman35946982012-11-16 03:03:12 +0000401 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402 return -EACCES;
403
Vlad Yasevich4e540642008-07-18 23:06:32 -0700404 /* See if the address matches any of the addresses we may have
405 * already bound before checking against other endpoints.
406 */
407 if (sctp_bind_addr_match(bp, addr, sp))
408 return -EINVAL;
409
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410 /* Make sure we are allowed to bind here.
411 * The function sctp_get_port_local() does duplicate address
412 * detection.
413 */
Vlad Yasevich2772b492007-08-21 14:24:30 +0900414 addr->v4.sin_port = htons(snum);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415 if ((ret = sctp_get_port_local(sk, addr))) {
Vlad Yasevich4e540642008-07-18 23:06:32 -0700416 return -EADDRINUSE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 }
418
419 /* Refresh ephemeral port. */
420 if (!bp->port)
Eric Dumazetc720c7e82009-10-15 06:30:45 +0000421 bp->port = inet_sk(sk)->inet_num;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422
Vlad Yasevich559cf712007-09-16 16:03:28 -0700423 /* Add the address to the bind address list.
424 * Use GFP_ATOMIC since BHs will be disabled.
425 */
Marcelo Ricardo Leitner133800d2016-03-08 10:34:28 -0300426 ret = sctp_add_bind_addr(bp, addr, af->sockaddr_len,
427 SCTP_ADDR_SRC, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428
429 /* Copy back into socket for getsockname() use. */
430 if (!ret) {
Eric Dumazetc720c7e82009-10-15 06:30:45 +0000431 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num);
Jason Gunthorpe299ee122014-07-30 12:40:53 -0600432 sp->pf->to_sk_saddr(addr, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 }
434
435 return ret;
436}
437
438 /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks
439 *
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900440 * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 * at any one time. If a sender, after sending an ASCONF chunk, decides
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900442 * it needs to transfer another ASCONF Chunk, it MUST wait until the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443 * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900444 * subsequent ASCONF. Note this restriction binds each side, so at any
445 * time two ASCONF may be in-transit on any given association (one sent
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 * from each endpoint).
447 */
448static int sctp_send_asconf(struct sctp_association *asoc,
449 struct sctp_chunk *chunk)
450{
Eric W. Biederman55e26eb2012-08-07 07:25:24 +0000451 struct net *net = sock_net(asoc->base.sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 int retval = 0;
453
454 /* If there is an outstanding ASCONF chunk, queue it for later
455 * transmission.
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900456 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 if (asoc->addip_last_asconf) {
David S. Miller79af02c2005-07-08 21:47:49 -0700458 list_add_tail(&chunk->list, &asoc->addip_chunk_list);
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900459 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460 }
461
462 /* Hold the chunk until an ASCONF_ACK is received. */
463 sctp_chunk_hold(chunk);
Eric W. Biederman55e26eb2012-08-07 07:25:24 +0000464 retval = sctp_primitive_ASCONF(net, asoc, chunk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465 if (retval)
466 sctp_chunk_free(chunk);
467 else
468 asoc->addip_last_asconf = chunk;
469
470out:
471 return retval;
472}
473
474/* Add a list of addresses as bind addresses to local endpoint or
475 * association.
476 *
477 * Basically run through each address specified in the addrs/addrcnt
478 * array/length pair, determine if it is IPv6 or IPv4 and call
479 * sctp_do_bind() on it.
480 *
481 * If any of them fails, then the operation will be reversed and the
482 * ones that were added will be removed.
483 *
484 * Only sctp_setsockopt_bindx() is supposed to call this function.
485 */
sebastian@breakpoint.cc04675212007-07-26 23:21:31 +0200486static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487{
488 int cnt;
489 int retval = 0;
490 void *addr_buf;
491 struct sockaddr *sa_addr;
492 struct sctp_af *af;
493
Daniel Borkmannbb333812013-06-28 19:49:40 +0200494 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n", __func__, sk,
495 addrs, addrcnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496
497 addr_buf = addrs;
498 for (cnt = 0; cnt < addrcnt; cnt++) {
499 /* The list may contain either IPv4 or IPv6 address;
500 * determine the address length for walking thru the list.
501 */
Joe Perchesea110732011-06-13 16:21:26 +0000502 sa_addr = addr_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 af = sctp_get_af_specific(sa_addr->sa_family);
504 if (!af) {
505 retval = -EINVAL;
506 goto err_bindx_add;
507 }
508
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900509 retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 af->sockaddr_len);
511
512 addr_buf += af->sockaddr_len;
513
514err_bindx_add:
515 if (retval < 0) {
516 /* Failed. Cleanup the ones that have been added */
517 if (cnt > 0)
518 sctp_bindx_rem(sk, addrs, cnt);
519 return retval;
520 }
521 }
522
523 return retval;
524}
525
526/* Send an ASCONF chunk with Add IP address parameters to all the peers of the
527 * associations that are part of the endpoint indicating that a list of local
528 * addresses are added to the endpoint.
529 *
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900530 * If any of the addresses is already in the bind address list of the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 * association, we do not send the chunk for that association. But it will not
532 * affect other associations.
533 *
534 * Only sctp_setsockopt_bindx() is supposed to call this function.
535 */
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900536static int sctp_send_asconf_add_ip(struct sock *sk,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 struct sockaddr *addrs,
538 int addrcnt)
539{
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +0000540 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 struct sctp_sock *sp;
542 struct sctp_endpoint *ep;
543 struct sctp_association *asoc;
544 struct sctp_bind_addr *bp;
545 struct sctp_chunk *chunk;
546 struct sctp_sockaddr_entry *laddr;
547 union sctp_addr *addr;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700548 union sctp_addr saveaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549 void *addr_buf;
550 struct sctp_af *af;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 struct list_head *p;
552 int i;
553 int retval = 0;
554
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +0000555 if (!net->sctp.addip_enable)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 return retval;
557
558 sp = sctp_sk(sk);
559 ep = sp->ep;
560
Daniel Borkmannbb333812013-06-28 19:49:40 +0200561 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
562 __func__, sk, addrs, addrcnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -0700564 list_for_each_entry(asoc, &ep->asocs, asocs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 if (!asoc->peer.asconf_capable)
566 continue;
567
568 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP)
569 continue;
570
571 if (!sctp_state(asoc, ESTABLISHED))
572 continue;
573
574 /* Check if any address in the packed array of addresses is
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900575 * in the bind address list of the association. If so,
576 * do not send the asconf chunk to its peer, but continue with
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 * other associations.
578 */
579 addr_buf = addrs;
580 for (i = 0; i < addrcnt; i++) {
Joe Perchesea110732011-06-13 16:21:26 +0000581 addr = addr_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582 af = sctp_get_af_specific(addr->v4.sin_family);
583 if (!af) {
584 retval = -EINVAL;
585 goto out;
586 }
587
588 if (sctp_assoc_lookup_laddr(asoc, addr))
589 break;
590
591 addr_buf += af->sockaddr_len;
592 }
593 if (i < addrcnt)
594 continue;
595
Vlad Yasevich559cf712007-09-16 16:03:28 -0700596 /* Use the first valid address in bind addr list of
597 * association as Address Parameter of ASCONF CHUNK.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 bp = &asoc->base.bind_addr;
600 p = bp->address_list.next;
601 laddr = list_entry(p, struct sctp_sockaddr_entry, list);
Al Viro5ae955c2006-11-20 17:22:08 -0800602 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 addrcnt, SCTP_PARAM_ADD_IP);
604 if (!chunk) {
605 retval = -ENOMEM;
606 goto out;
607 }
608
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700609 /* Add the new addresses to the bind address list with
610 * use_as_src set to 0.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611 */
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700612 addr_buf = addrs;
613 for (i = 0; i < addrcnt; i++) {
Joe Perchesea110732011-06-13 16:21:26 +0000614 addr = addr_buf;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700615 af = sctp_get_af_specific(addr->v4.sin_family);
616 memcpy(&saveaddr, addr, af->sockaddr_len);
Vlad Yasevichf57d96b2007-12-20 14:12:24 -0800617 retval = sctp_add_bind_addr(bp, &saveaddr,
Marcelo Ricardo Leitner133800d2016-03-08 10:34:28 -0300618 sizeof(saveaddr),
Vlad Yasevichf57d96b2007-12-20 14:12:24 -0800619 SCTP_ADDR_NEW, GFP_ATOMIC);
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700620 addr_buf += af->sockaddr_len;
621 }
Michio Honda8a07eb02011-04-26 20:19:36 +0900622 if (asoc->src_out_of_asoc_ok) {
623 struct sctp_transport *trans;
624
625 list_for_each_entry(trans,
626 &asoc->peer.transport_addr_list, transports) {
627 /* Clear the source and route cache */
Julian Anastasovc86a7732017-02-06 23:14:13 +0200628 sctp_transport_dst_release(trans);
Michio Honda8a07eb02011-04-26 20:19:36 +0900629 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32,
630 2*asoc->pathmtu, 4380));
631 trans->ssthresh = asoc->peer.i.a_rwnd;
632 trans->rto = asoc->rto_initial;
Michele Baldessari196d6752012-12-01 04:49:42 +0000633 sctp_max_rto(asoc, trans);
Michio Honda8a07eb02011-04-26 20:19:36 +0900634 trans->rtt = trans->srtt = trans->rttvar = 0;
635 sctp_transport_route(trans, NULL,
636 sctp_sk(asoc->base.sk));
637 }
638 }
639 retval = sctp_send_asconf(asoc, chunk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 }
641
642out:
643 return retval;
644}
645
646/* Remove a list of addresses from bind addresses list. Do not remove the
647 * last address.
648 *
649 * Basically run through each address specified in the addrs/addrcnt
650 * array/length pair, determine if it is IPv6 or IPv4 and call
651 * sctp_del_bind() on it.
652 *
653 * If any of them fails, then the operation will be reversed and the
654 * ones that were removed will be added back.
655 *
656 * At least one address has to be left; if only one address is
657 * available, the operation will return -EBUSY.
658 *
659 * Only sctp_setsockopt_bindx() is supposed to call this function.
660 */
sebastian@breakpoint.cc04675212007-07-26 23:21:31 +0200661static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662{
663 struct sctp_sock *sp = sctp_sk(sk);
664 struct sctp_endpoint *ep = sp->ep;
665 int cnt;
666 struct sctp_bind_addr *bp = &ep->base.bind_addr;
667 int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668 void *addr_buf;
Al Viroc9a08502006-11-20 17:07:48 -0800669 union sctp_addr *sa_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 struct sctp_af *af;
671
Daniel Borkmannbb333812013-06-28 19:49:40 +0200672 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
673 __func__, sk, addrs, addrcnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674
675 addr_buf = addrs;
676 for (cnt = 0; cnt < addrcnt; cnt++) {
677 /* If the bind address list is empty or if there is only one
678 * bind address, there is nothing more to be removed (we need
679 * at least one address here).
680 */
681 if (list_empty(&bp->address_list) ||
682 (sctp_list_single_entry(&bp->address_list))) {
683 retval = -EBUSY;
684 goto err_bindx_rem;
685 }
686
Joe Perchesea110732011-06-13 16:21:26 +0000687 sa_addr = addr_buf;
Al Viroc9a08502006-11-20 17:07:48 -0800688 af = sctp_get_af_specific(sa_addr->sa.sa_family);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 if (!af) {
690 retval = -EINVAL;
691 goto err_bindx_rem;
692 }
Paolo Galtieri0304ff8a2007-04-17 12:52:36 -0700693
694 if (!af->addr_valid(sa_addr, sp, NULL)) {
695 retval = -EADDRNOTAVAIL;
696 goto err_bindx_rem;
697 }
698
Vlad Yasevichee9cbac2011-04-18 19:14:47 +0000699 if (sa_addr->v4.sin_port &&
700 sa_addr->v4.sin_port != htons(bp->port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701 retval = -EINVAL;
702 goto err_bindx_rem;
703 }
704
Vlad Yasevichee9cbac2011-04-18 19:14:47 +0000705 if (!sa_addr->v4.sin_port)
706 sa_addr->v4.sin_port = htons(bp->port);
707
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 /* FIXME - There is probably a need to check if sk->sk_saddr and
709 * sk->sk_rcv_addr are currently set to one of the addresses to
710 * be removed. This is something which needs to be looked into
711 * when we are fixing the outstanding issues with multi-homing
712 * socket routing and failover schemes. Refer to comments in
713 * sctp_do_bind(). -daisy
714 */
Vlad Yasevich0ed90fb2007-10-24 16:10:00 -0400715 retval = sctp_del_bind_addr(bp, sa_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716
717 addr_buf += af->sockaddr_len;
718err_bindx_rem:
719 if (retval < 0) {
720 /* Failed. Add the ones that has been removed back */
721 if (cnt > 0)
722 sctp_bindx_add(sk, addrs, cnt);
723 return retval;
724 }
725 }
726
727 return retval;
728}
729
730/* Send an ASCONF chunk with Delete IP address parameters to all the peers of
731 * the associations that are part of the endpoint indicating that a list of
732 * local addresses are removed from the endpoint.
733 *
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900734 * If any of the addresses is already in the bind address list of the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735 * association, we do not send the chunk for that association. But it will not
736 * affect other associations.
737 *
738 * Only sctp_setsockopt_bindx() is supposed to call this function.
739 */
740static int sctp_send_asconf_del_ip(struct sock *sk,
741 struct sockaddr *addrs,
742 int addrcnt)
743{
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +0000744 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700745 struct sctp_sock *sp;
746 struct sctp_endpoint *ep;
747 struct sctp_association *asoc;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700748 struct sctp_transport *transport;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749 struct sctp_bind_addr *bp;
750 struct sctp_chunk *chunk;
751 union sctp_addr *laddr;
752 void *addr_buf;
753 struct sctp_af *af;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700754 struct sctp_sockaddr_entry *saddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755 int i;
756 int retval = 0;
Michio Honda8a07eb02011-04-26 20:19:36 +0900757 int stored = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700758
Michio Honda8a07eb02011-04-26 20:19:36 +0900759 chunk = NULL;
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +0000760 if (!net->sctp.addip_enable)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761 return retval;
762
763 sp = sctp_sk(sk);
764 ep = sp->ep;
765
Daniel Borkmannbb333812013-06-28 19:49:40 +0200766 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
767 __func__, sk, addrs, addrcnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -0700769 list_for_each_entry(asoc, &ep->asocs, asocs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770
771 if (!asoc->peer.asconf_capable)
772 continue;
773
774 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP)
775 continue;
776
777 if (!sctp_state(asoc, ESTABLISHED))
778 continue;
779
780 /* Check if any address in the packed array of addresses is
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +0900781 * not present in the bind address list of the association.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 * If so, do not send the asconf chunk to its peer, but
783 * continue with other associations.
784 */
785 addr_buf = addrs;
786 for (i = 0; i < addrcnt; i++) {
Joe Perchesea110732011-06-13 16:21:26 +0000787 laddr = addr_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 af = sctp_get_af_specific(laddr->v4.sin_family);
789 if (!af) {
790 retval = -EINVAL;
791 goto out;
792 }
793
794 if (!sctp_assoc_lookup_laddr(asoc, laddr))
795 break;
796
797 addr_buf += af->sockaddr_len;
798 }
799 if (i < addrcnt)
800 continue;
801
802 /* Find one address in the association's bind address list
803 * that is not in the packed array of addresses. This is to
804 * make sure that we do not delete all the addresses in the
805 * association.
806 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 bp = &asoc->base.bind_addr;
808 laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs,
809 addrcnt, sp);
Michio Honda8a07eb02011-04-26 20:19:36 +0900810 if ((laddr == NULL) && (addrcnt == 1)) {
811 if (asoc->asconf_addr_del_pending)
812 continue;
813 asoc->asconf_addr_del_pending =
814 kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
Michio Honda6d65e5e2011-06-10 16:42:14 +0900815 if (asoc->asconf_addr_del_pending == NULL) {
816 retval = -ENOMEM;
817 goto out;
818 }
Michio Honda8a07eb02011-04-26 20:19:36 +0900819 asoc->asconf_addr_del_pending->sa.sa_family =
820 addrs->sa_family;
821 asoc->asconf_addr_del_pending->v4.sin_port =
822 htons(bp->port);
823 if (addrs->sa_family == AF_INET) {
824 struct sockaddr_in *sin;
825
826 sin = (struct sockaddr_in *)addrs;
827 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr;
828 } else if (addrs->sa_family == AF_INET6) {
829 struct sockaddr_in6 *sin6;
830
831 sin6 = (struct sockaddr_in6 *)addrs;
Alexey Dobriyan4e3fd7a2011-11-21 03:39:03 +0000832 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr;
Michio Honda8a07eb02011-04-26 20:19:36 +0900833 }
Daniel Borkmannbb333812013-06-28 19:49:40 +0200834
835 pr_debug("%s: keep the last address asoc:%p %pISc at %p\n",
836 __func__, asoc, &asoc->asconf_addr_del_pending->sa,
837 asoc->asconf_addr_del_pending);
838
Michio Honda8a07eb02011-04-26 20:19:36 +0900839 asoc->src_out_of_asoc_ok = 1;
840 stored = 1;
841 goto skip_mkasconf;
842 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843
Daniel Borkmann88362ad2013-09-07 20:51:21 +0200844 if (laddr == NULL)
845 return -EINVAL;
846
Vlad Yasevich559cf712007-09-16 16:03:28 -0700847 /* We do not need RCU protection throughout this loop
848 * because this is done under a socket lock from the
849 * setsockopt call.
850 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt,
852 SCTP_PARAM_DEL_IP);
853 if (!chunk) {
854 retval = -ENOMEM;
855 goto out;
856 }
857
Michio Honda8a07eb02011-04-26 20:19:36 +0900858skip_mkasconf:
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700859 /* Reset use_as_src flag for the addresses in the bind address
860 * list that are to be deleted.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 */
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700862 addr_buf = addrs;
863 for (i = 0; i < addrcnt; i++) {
Joe Perchesea110732011-06-13 16:21:26 +0000864 laddr = addr_buf;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700865 af = sctp_get_af_specific(laddr->v4.sin_family);
Vlad Yasevich559cf712007-09-16 16:03:28 -0700866 list_for_each_entry(saddr, &bp->address_list, list) {
Al Viro5f242a12006-11-20 17:05:23 -0800867 if (sctp_cmp_addr_exact(&saddr->a, laddr))
Vlad Yasevichf57d96b2007-12-20 14:12:24 -0800868 saddr->state = SCTP_ADDR_DEL;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700869 }
870 addr_buf += af->sockaddr_len;
871 }
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700872
873 /* Update the route and saddr entries for all the transports
874 * as some of the addresses in the bind address list are
875 * about to be deleted and cannot be used as source addresses.
876 */
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -0700877 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
878 transports) {
Julian Anastasovc86a7732017-02-06 23:14:13 +0200879 sctp_transport_dst_release(transport);
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700880 sctp_transport_route(transport, NULL,
881 sctp_sk(asoc->base.sk));
882 }
883
Michio Honda8a07eb02011-04-26 20:19:36 +0900884 if (stored)
885 /* We don't need to transmit ASCONF */
886 continue;
Sridhar Samudraladc022a92006-07-21 14:49:25 -0700887 retval = sctp_send_asconf(asoc, chunk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888 }
889out:
890 return retval;
891}
892
Michio Honda9f7d6532011-04-26 19:32:51 +0900893/* set addr events to assocs in the endpoint. ep and addr_wq must be locked */
894int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw)
895{
896 struct sock *sk = sctp_opt2sk(sp);
897 union sctp_addr *addr;
898 struct sctp_af *af;
899
900 /* It is safe to write port space in caller. */
901 addr = &addrw->a;
902 addr->v4.sin_port = htons(sp->ep->base.bind_addr.port);
903 af = sctp_get_af_specific(addr->sa.sa_family);
904 if (!af)
905 return -EINVAL;
906 if (sctp_verify_addr(sk, addr, af->sockaddr_len))
907 return -EINVAL;
908
909 if (addrw->state == SCTP_ADDR_NEW)
910 return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1);
911 else
912 return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1);
913}
914
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915/* Helper for tunneling sctp_bindx() requests through sctp_setsockopt()
916 *
917 * API 8.1
918 * int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt,
919 * int flags);
920 *
921 * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses.
922 * If the sd is an IPv6 socket, the addresses passed can either be IPv4
923 * or IPv6 addresses.
924 *
925 * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see
926 * Section 3.1.2 for this usage.
927 *
928 * addrs is a pointer to an array of one or more socket addresses. Each
929 * address is contained in its appropriate structure (i.e. struct
930 * sockaddr_in or struct sockaddr_in6) the family of the address type
Ville Nuorvala23c435f2006-10-16 22:08:28 -0700931 * must be used to distinguish the address length (note that this
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 * representation is termed a "packed array" of addresses). The caller
933 * specifies the number of addresses in the array with addrcnt.
934 *
935 * On success, sctp_bindx() returns 0. On failure, sctp_bindx() returns
936 * -1, and sets errno to the appropriate error code.
937 *
938 * For SCTP, the port given in each socket address must be the same, or
939 * sctp_bindx() will fail, setting errno to EINVAL.
940 *
941 * The flags parameter is formed from the bitwise OR of zero or more of
942 * the following currently defined flags:
943 *
944 * SCTP_BINDX_ADD_ADDR
945 *
946 * SCTP_BINDX_REM_ADDR
947 *
948 * SCTP_BINDX_ADD_ADDR directs SCTP to add the given addresses to the
949 * association, and SCTP_BINDX_REM_ADDR directs SCTP to remove the given
950 * addresses from the association. The two flags are mutually exclusive;
951 * if both are given, sctp_bindx() will fail with EINVAL. A caller may
952 * not remove all addresses from an association; sctp_bindx() will
953 * reject such an attempt with EINVAL.
954 *
955 * An application can use sctp_bindx(SCTP_BINDX_ADD_ADDR) to associate
956 * additional addresses with an endpoint after calling bind(). Or use
957 * sctp_bindx(SCTP_BINDX_REM_ADDR) to remove some addresses a listening
958 * socket is associated with so that no new association accepted will be
959 * associated with those addresses. If the endpoint supports dynamic
960 * address a SCTP_BINDX_REM_ADDR or SCTP_BINDX_ADD_ADDR may cause a
961 * endpoint to send the appropriate message to the peer to change the
962 * peers address lists.
963 *
964 * Adding and removing addresses from a connected association is
965 * optional functionality. Implementations that do not support this
966 * functionality should return EOPNOTSUPP.
967 *
968 * Basically do nothing but copying the addresses from user to kernel
969 * land and invoking either sctp_bindx_add() or sctp_bindx_rem() on the sk.
Frank Filz3f7a87d2005-06-20 13:14:57 -0700970 * This is used for tunneling the sctp_bindx() request through sctp_setsockopt()
971 * from userspace.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 *
973 * We don't use copy_from_user() for optimization: we first do the
974 * sanity checks (buffer size -fast- and access check-healthy
975 * pointer); if all of those succeed, then we can alloc the memory
976 * (expensive operation) needed to copy the data to kernel. Then we do
977 * the copying without checking the user space area
978 * (__copy_from_user()).
979 *
980 * On exit there is no need to do sockfd_put(), sys_setsockopt() does
981 * it.
982 *
983 * sk The sk of the socket
984 * addrs The pointer to the addresses in user land
985 * addrssize Size of the addrs buffer
986 * op Operation to perform (add or remove, see the flags of
987 * sctp_bindx)
988 *
989 * Returns 0 if ok, <0 errno code on error.
990 */
wangweidong26ac8e52013-12-23 12:16:51 +0800991static int sctp_setsockopt_bindx(struct sock *sk,
Daniel Borkmanndda91922013-06-17 11:40:05 +0200992 struct sockaddr __user *addrs,
993 int addrs_size, int op)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994{
995 struct sockaddr *kaddrs;
996 int err;
997 int addrcnt = 0;
998 int walk_size = 0;
999 struct sockaddr *sa_addr;
1000 void *addr_buf;
1001 struct sctp_af *af;
1002
Daniel Borkmannbb333812013-06-28 19:49:40 +02001003 pr_debug("%s: sk:%p addrs:%p addrs_size:%d opt:%d\n",
1004 __func__, sk, addrs, addrs_size, op);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005
1006 if (unlikely(addrs_size <= 0))
1007 return -EINVAL;
1008
1009 /* Check the user passed a healthy pointer. */
1010 if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size)))
1011 return -EFAULT;
1012
1013 /* Alloc space for the address array in kernel memory. */
Marcelo Ricardo Leitnercacc0622015-11-30 14:32:54 -02001014 kaddrs = kmalloc(addrs_size, GFP_USER | __GFP_NOWARN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 if (unlikely(!kaddrs))
1016 return -ENOMEM;
1017
1018 if (__copy_from_user(kaddrs, addrs, addrs_size)) {
1019 kfree(kaddrs);
1020 return -EFAULT;
1021 }
1022
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09001023 /* Walk through the addrs buffer and count the number of addresses. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 addr_buf = kaddrs;
1025 while (walk_size < addrs_size) {
Dan Rosenbergd7e0d192010-10-01 11:16:58 +00001026 if (walk_size + sizeof(sa_family_t) > addrs_size) {
1027 kfree(kaddrs);
1028 return -EINVAL;
1029 }
1030
Joe Perchesea110732011-06-13 16:21:26 +00001031 sa_addr = addr_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 af = sctp_get_af_specific(sa_addr->sa_family);
1033
1034 /* If the address family is not supported or if this address
1035 * causes the address buffer to overflow return EINVAL.
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09001036 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
1038 kfree(kaddrs);
1039 return -EINVAL;
1040 }
1041 addrcnt++;
1042 addr_buf += af->sockaddr_len;
1043 walk_size += af->sockaddr_len;
1044 }
1045
1046 /* Do the work. */
1047 switch (op) {
1048 case SCTP_BINDX_ADD_ADDR:
1049 err = sctp_bindx_add(sk, kaddrs, addrcnt);
1050 if (err)
1051 goto out;
1052 err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt);
1053 break;
1054
1055 case SCTP_BINDX_REM_ADDR:
1056 err = sctp_bindx_rem(sk, kaddrs, addrcnt);
1057 if (err)
1058 goto out;
1059 err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt);
1060 break;
1061
1062 default:
1063 err = -EINVAL;
1064 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07001065 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066
1067out:
1068 kfree(kaddrs);
1069
1070 return err;
1071}
1072
Frank Filz3f7a87d2005-06-20 13:14:57 -07001073/* __sctp_connect(struct sock* sk, struct sockaddr *kaddrs, int addrs_size)
1074 *
1075 * Common routine for handling connect() and sctp_connectx().
1076 * Connect will come in with just a single address.
1077 */
wangweidong26ac8e52013-12-23 12:16:51 +08001078static int __sctp_connect(struct sock *sk,
Frank Filz3f7a87d2005-06-20 13:14:57 -07001079 struct sockaddr *kaddrs,
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001080 int addrs_size,
1081 sctp_assoc_t *assoc_id)
Frank Filz3f7a87d2005-06-20 13:14:57 -07001082{
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001083 struct net *net = sock_net(sk);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001084 struct sctp_sock *sp;
1085 struct sctp_endpoint *ep;
1086 struct sctp_association *asoc = NULL;
1087 struct sctp_association *asoc2;
1088 struct sctp_transport *transport;
1089 union sctp_addr to;
Xin Long1c662012017-08-05 19:59:54 +08001090 enum sctp_scope scope;
Frank Filz3f7a87d2005-06-20 13:14:57 -07001091 long timeo;
1092 int err = 0;
1093 int addrcnt = 0;
1094 int walk_size = 0;
Vlad Yaseviche4d1fea2007-08-01 10:56:43 -04001095 union sctp_addr *sa_addr = NULL;
Frank Filz3f7a87d2005-06-20 13:14:57 -07001096 void *addr_buf;
Vlad Yasevich16d00fb2007-05-04 13:34:09 -07001097 unsigned short port;
Vlad Yasevichf50f95c2007-07-03 12:47:40 -04001098 unsigned int f_flags = 0;
Frank Filz3f7a87d2005-06-20 13:14:57 -07001099
1100 sp = sctp_sk(sk);
1101 ep = sp->ep;
1102
1103 /* connect() cannot be done on a socket that is already in ESTABLISHED
1104 * state - UDP-style peeled off socket or a TCP-style socket that
1105 * is already connected.
1106 * It cannot be done even on a TCP-style listening socket.
1107 */
Marcelo Ricardo Leitnere5b13f32016-07-15 16:38:19 -03001108 if (sctp_sstate(sk, ESTABLISHED) || sctp_sstate(sk, CLOSING) ||
Frank Filz3f7a87d2005-06-20 13:14:57 -07001109 (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) {
1110 err = -EISCONN;
1111 goto out_free;
1112 }
1113
1114 /* Walk through the addrs buffer and count the number of addresses. */
1115 addr_buf = kaddrs;
1116 while (walk_size < addrs_size) {
Jason Gunthorpe299ee122014-07-30 12:40:53 -06001117 struct sctp_af *af;
1118
Dan Rosenbergd7e0d192010-10-01 11:16:58 +00001119 if (walk_size + sizeof(sa_family_t) > addrs_size) {
1120 err = -EINVAL;
1121 goto out_free;
1122 }
1123
Joe Perchesea110732011-06-13 16:21:26 +00001124 sa_addr = addr_buf;
Al Viro4bdf4b52006-11-20 17:10:20 -08001125 af = sctp_get_af_specific(sa_addr->sa.sa_family);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001126
1127 /* If the address family is not supported or if this address
1128 * causes the address buffer to overflow return EINVAL.
1129 */
1130 if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
1131 err = -EINVAL;
1132 goto out_free;
1133 }
1134
Dan Rosenbergd7e0d192010-10-01 11:16:58 +00001135 port = ntohs(sa_addr->v4.sin_port);
1136
Vlad Yaseviche4d1fea2007-08-01 10:56:43 -04001137 /* Save current address so we can work with it */
1138 memcpy(&to, sa_addr, af->sockaddr_len);
1139
1140 err = sctp_verify_addr(sk, &to, af->sockaddr_len);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001141 if (err)
1142 goto out_free;
1143
Vlad Yasevich16d00fb2007-05-04 13:34:09 -07001144 /* Make sure the destination port is correctly set
1145 * in all addresses.
1146 */
Wei Yongjun524fba62013-04-03 03:02:28 +00001147 if (asoc && asoc->peer.port && asoc->peer.port != port) {
1148 err = -EINVAL;
Vlad Yasevich16d00fb2007-05-04 13:34:09 -07001149 goto out_free;
Wei Yongjun524fba62013-04-03 03:02:28 +00001150 }
Frank Filz3f7a87d2005-06-20 13:14:57 -07001151
1152 /* Check if there already is a matching association on the
1153 * endpoint (other than the one created here).
1154 */
Vlad Yaseviche4d1fea2007-08-01 10:56:43 -04001155 asoc2 = sctp_endpoint_lookup_assoc(ep, &to, &transport);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001156 if (asoc2 && asoc2 != asoc) {
1157 if (asoc2->state >= SCTP_STATE_ESTABLISHED)
1158 err = -EISCONN;
1159 else
1160 err = -EALREADY;
1161 goto out_free;
1162 }
1163
1164 /* If we could not find a matching association on the endpoint,
1165 * make sure that there is no peeled-off association matching
1166 * the peer address even on another socket.
1167 */
Vlad Yaseviche4d1fea2007-08-01 10:56:43 -04001168 if (sctp_endpoint_is_peeled_off(ep, &to)) {
Frank Filz3f7a87d2005-06-20 13:14:57 -07001169 err = -EADDRNOTAVAIL;
1170 goto out_free;
1171 }
1172
1173 if (!asoc) {
1174 /* If a bind() or sctp_bindx() is not called prior to
1175 * an sctp_connectx() call, the system picks an
1176 * ephemeral port and will choose an address set
1177 * equivalent to binding with a wildcard address.
1178 */
1179 if (!ep->base.bind_addr.port) {
1180 if (sctp_autobind(sk)) {
1181 err = -EAGAIN;
1182 goto out_free;
1183 }
Ivan Skytte Jorgensen64a0c1c2005-10-28 15:39:02 -07001184 } else {
1185 /*
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09001186 * If an unprivileged user inherits a 1-many
1187 * style socket with open associations on a
1188 * privileged port, it MAY be permitted to
1189 * accept new associations, but it SHOULD NOT
Ivan Skytte Jorgensen64a0c1c2005-10-28 15:39:02 -07001190 * be permitted to open new associations.
1191 */
Krister Johansen4548b682017-01-20 17:49:11 -08001192 if (ep->base.bind_addr.port <
1193 inet_prot_sock(net) &&
1194 !ns_capable(net->user_ns,
1195 CAP_NET_BIND_SERVICE)) {
Ivan Skytte Jorgensen64a0c1c2005-10-28 15:39:02 -07001196 err = -EACCES;
1197 goto out_free;
1198 }
Frank Filz3f7a87d2005-06-20 13:14:57 -07001199 }
1200
Vlad Yaseviche4d1fea2007-08-01 10:56:43 -04001201 scope = sctp_scope(&to);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001202 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1203 if (!asoc) {
1204 err = -ENOMEM;
1205 goto out_free;
1206 }
Vlad Yasevich409b95a2009-11-10 08:57:34 +00001207
1208 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope,
1209 GFP_KERNEL);
1210 if (err < 0) {
1211 goto out_free;
1212 }
1213
Frank Filz3f7a87d2005-06-20 13:14:57 -07001214 }
1215
1216 /* Prime the peer's transport structures. */
Vlad Yaseviche4d1fea2007-08-01 10:56:43 -04001217 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL,
Frank Filz3f7a87d2005-06-20 13:14:57 -07001218 SCTP_UNKNOWN);
1219 if (!transport) {
1220 err = -ENOMEM;
1221 goto out_free;
1222 }
1223
1224 addrcnt++;
1225 addr_buf += af->sockaddr_len;
1226 walk_size += af->sockaddr_len;
1227 }
1228
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001229 /* In case the user of sctp_connectx() wants an association
1230 * id back, assign one now.
1231 */
1232 if (assoc_id) {
1233 err = sctp_assoc_set_id(asoc, GFP_KERNEL);
1234 if (err < 0)
1235 goto out_free;
1236 }
1237
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001238 err = sctp_primitive_ASSOCIATE(net, asoc, NULL);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001239 if (err < 0) {
1240 goto out_free;
1241 }
1242
1243 /* Initialize sk's dport and daddr for getpeername() */
Eric Dumazetc720c7e82009-10-15 06:30:45 +00001244 inet_sk(sk)->inet_dport = htons(asoc->peer.port);
Jason Gunthorpe299ee122014-07-30 12:40:53 -06001245 sp->pf->to_sk_daddr(sa_addr, sk);
Sridhar Samudrala8de8c872006-05-19 10:58:12 -07001246 sk->sk_err = 0;
Frank Filz3f7a87d2005-06-20 13:14:57 -07001247
Vlad Yasevichf50f95c2007-07-03 12:47:40 -04001248 /* in-kernel sockets don't generally have a file allocated to them
1249 * if all they do is call sock_create_kern().
1250 */
1251 if (sk->sk_socket->file)
1252 f_flags = sk->sk_socket->file->f_flags;
1253
1254 timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK);
1255
Marcelo Ricardo Leitner7233bc82016-11-03 17:03:41 -02001256 if (assoc_id)
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001257 *assoc_id = asoc->assoc_id;
Marcelo Ricardo Leitner7233bc82016-11-03 17:03:41 -02001258 err = sctp_wait_for_connect(asoc, &timeo);
1259 /* Note: the asoc may be freed after the return of
1260 * sctp_wait_for_connect.
1261 */
Frank Filz3f7a87d2005-06-20 13:14:57 -07001262
1263 /* Don't free association on exit. */
1264 asoc = NULL;
1265
1266out_free:
Daniel Borkmannbb333812013-06-28 19:49:40 +02001267 pr_debug("%s: took out_free path with asoc:%p kaddrs:%p err:%d\n",
1268 __func__, asoc, kaddrs, err);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001269
Neil Horman2eebc1e2012-07-16 09:13:51 +00001270 if (asoc) {
1271 /* sctp_primitive_ASSOCIATE may have added this association
1272 * To the hash table, try to unhash it, just in case, its a noop
1273 * if it wasn't hashed so we're safe
1274 */
Frank Filz3f7a87d2005-06-20 13:14:57 -07001275 sctp_association_free(asoc);
Neil Horman2eebc1e2012-07-16 09:13:51 +00001276 }
Frank Filz3f7a87d2005-06-20 13:14:57 -07001277 return err;
1278}
1279
1280/* Helper for tunneling sctp_connectx() requests through sctp_setsockopt()
1281 *
1282 * API 8.9
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001283 * int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt,
1284 * sctp_assoc_t *asoc);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001285 *
1286 * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses.
1287 * If the sd is an IPv6 socket, the addresses passed can either be IPv4
1288 * or IPv6 addresses.
1289 *
1290 * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see
1291 * Section 3.1.2 for this usage.
1292 *
1293 * addrs is a pointer to an array of one or more socket addresses. Each
1294 * address is contained in its appropriate structure (i.e. struct
1295 * sockaddr_in or struct sockaddr_in6) the family of the address type
1296 * must be used to distengish the address length (note that this
1297 * representation is termed a "packed array" of addresses). The caller
1298 * specifies the number of addresses in the array with addrcnt.
1299 *
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001300 * On success, sctp_connectx() returns 0. It also sets the assoc_id to
1301 * the association id of the new association. On failure, sctp_connectx()
1302 * returns -1, and sets errno to the appropriate error code. The assoc_id
1303 * is not touched by the kernel.
Frank Filz3f7a87d2005-06-20 13:14:57 -07001304 *
1305 * For SCTP, the port given in each socket address must be the same, or
1306 * sctp_connectx() will fail, setting errno to EINVAL.
1307 *
1308 * An application can use sctp_connectx to initiate an association with
1309 * an endpoint that is multi-homed. Much like sctp_bindx() this call
1310 * allows a caller to specify multiple addresses at which a peer can be
1311 * reached. The way the SCTP stack uses the list of addresses to set up
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001312 * the association is implementation dependent. This function only
Frank Filz3f7a87d2005-06-20 13:14:57 -07001313 * specifies that the stack will try to make use of all the addresses in
1314 * the list when needed.
1315 *
1316 * Note that the list of addresses passed in is only used for setting up
1317 * the association. It does not necessarily equal the set of addresses
1318 * the peer uses for the resulting association. If the caller wants to
1319 * find out the set of peer addresses, it must use sctp_getpaddrs() to
1320 * retrieve them after the association has been set up.
1321 *
1322 * Basically do nothing but copying the addresses from user to kernel
1323 * land and invoking either sctp_connectx(). This is used for tunneling
1324 * the sctp_connectx() request through sctp_setsockopt() from userspace.
1325 *
1326 * We don't use copy_from_user() for optimization: we first do the
1327 * sanity checks (buffer size -fast- and access check-healthy
1328 * pointer); if all of those succeed, then we can alloc the memory
1329 * (expensive operation) needed to copy the data to kernel. Then we do
1330 * the copying without checking the user space area
1331 * (__copy_from_user()).
1332 *
1333 * On exit there is no need to do sockfd_put(), sys_setsockopt() does
1334 * it.
1335 *
1336 * sk The sk of the socket
1337 * addrs The pointer to the addresses in user land
1338 * addrssize Size of the addrs buffer
1339 *
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001340 * Returns >=0 if ok, <0 errno code on error.
Frank Filz3f7a87d2005-06-20 13:14:57 -07001341 */
wangweidong26ac8e52013-12-23 12:16:51 +08001342static int __sctp_setsockopt_connectx(struct sock *sk,
Frank Filz3f7a87d2005-06-20 13:14:57 -07001343 struct sockaddr __user *addrs,
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001344 int addrs_size,
1345 sctp_assoc_t *assoc_id)
Frank Filz3f7a87d2005-06-20 13:14:57 -07001346{
Frank Filz3f7a87d2005-06-20 13:14:57 -07001347 struct sockaddr *kaddrs;
Marcelo Ricardo Leitner9ba0b962015-12-23 16:28:40 -02001348 gfp_t gfp = GFP_KERNEL;
1349 int err = 0;
Frank Filz3f7a87d2005-06-20 13:14:57 -07001350
Daniel Borkmannbb333812013-06-28 19:49:40 +02001351 pr_debug("%s: sk:%p addrs:%p addrs_size:%d\n",
1352 __func__, sk, addrs, addrs_size);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001353
1354 if (unlikely(addrs_size <= 0))
1355 return -EINVAL;
1356
1357 /* Check the user passed a healthy pointer. */
1358 if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size)))
1359 return -EFAULT;
1360
1361 /* Alloc space for the address array in kernel memory. */
Marcelo Ricardo Leitner9ba0b962015-12-23 16:28:40 -02001362 if (sk->sk_socket->file)
1363 gfp = GFP_USER | __GFP_NOWARN;
1364 kaddrs = kmalloc(addrs_size, gfp);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001365 if (unlikely(!kaddrs))
1366 return -ENOMEM;
1367
1368 if (__copy_from_user(kaddrs, addrs, addrs_size)) {
1369 err = -EFAULT;
1370 } else {
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001371 err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id);
Frank Filz3f7a87d2005-06-20 13:14:57 -07001372 }
1373
1374 kfree(kaddrs);
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001375
Frank Filz3f7a87d2005-06-20 13:14:57 -07001376 return err;
1377}
1378
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001379/*
1380 * This is an older interface. It's kept for backward compatibility
1381 * to the option that doesn't provide association id.
1382 */
wangweidong26ac8e52013-12-23 12:16:51 +08001383static int sctp_setsockopt_connectx_old(struct sock *sk,
Daniel Borkmanndda91922013-06-17 11:40:05 +02001384 struct sockaddr __user *addrs,
1385 int addrs_size)
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001386{
1387 return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL);
1388}
1389
1390/*
1391 * New interface for the API. The since the API is done with a socket
1392 * option, to make it simple we feed back the association id is as a return
1393 * indication to the call. Error is always negative and association id is
1394 * always positive.
1395 */
wangweidong26ac8e52013-12-23 12:16:51 +08001396static int sctp_setsockopt_connectx(struct sock *sk,
Daniel Borkmanndda91922013-06-17 11:40:05 +02001397 struct sockaddr __user *addrs,
1398 int addrs_size)
Vlad Yasevich88a0a942008-05-09 15:14:11 -07001399{
1400 sctp_assoc_t assoc_id = 0;
1401 int err = 0;
1402
1403 err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id);
1404
1405 if (err)
1406 return err;
1407 else
1408 return assoc_id;
1409}
1410
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001411/*
Vlad Yasevichf9c67812009-11-11 08:19:24 +00001412 * New (hopefully final) interface for the API.
1413 * We use the sctp_getaddrs_old structure so that use-space library
Daniel Borkmannffd59392014-02-17 12:11:11 +01001414 * can avoid any unnecessary allocations. The only different part
Vlad Yasevichf9c67812009-11-11 08:19:24 +00001415 * is that we store the actual length of the address buffer into the
Daniel Borkmannffd59392014-02-17 12:11:11 +01001416 * addrs_num structure member. That way we can re-use the existing
Vlad Yasevichf9c67812009-11-11 08:19:24 +00001417 * code.
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001418 */
Daniel Borkmannffd59392014-02-17 12:11:11 +01001419#ifdef CONFIG_COMPAT
1420struct compat_sctp_getaddrs_old {
1421 sctp_assoc_t assoc_id;
1422 s32 addr_num;
1423 compat_uptr_t addrs; /* struct sockaddr * */
1424};
1425#endif
1426
wangweidong26ac8e52013-12-23 12:16:51 +08001427static int sctp_getsockopt_connectx3(struct sock *sk, int len,
Daniel Borkmanndda91922013-06-17 11:40:05 +02001428 char __user *optval,
1429 int __user *optlen)
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001430{
Vlad Yasevichf9c67812009-11-11 08:19:24 +00001431 struct sctp_getaddrs_old param;
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001432 sctp_assoc_t assoc_id = 0;
1433 int err = 0;
1434
Daniel Borkmannffd59392014-02-17 12:11:11 +01001435#ifdef CONFIG_COMPAT
Andy Lutomirski96c0e0a2016-03-22 14:25:07 -07001436 if (in_compat_syscall()) {
Daniel Borkmannffd59392014-02-17 12:11:11 +01001437 struct compat_sctp_getaddrs_old param32;
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001438
Daniel Borkmannffd59392014-02-17 12:11:11 +01001439 if (len < sizeof(param32))
1440 return -EINVAL;
1441 if (copy_from_user(&param32, optval, sizeof(param32)))
1442 return -EFAULT;
Vlad Yasevichf9c67812009-11-11 08:19:24 +00001443
Daniel Borkmannffd59392014-02-17 12:11:11 +01001444 param.assoc_id = param32.assoc_id;
1445 param.addr_num = param32.addr_num;
1446 param.addrs = compat_ptr(param32.addrs);
1447 } else
1448#endif
1449 {
1450 if (len < sizeof(param))
1451 return -EINVAL;
1452 if (copy_from_user(&param, optval, sizeof(param)))
1453 return -EFAULT;
1454 }
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001455
Daniel Borkmannffd59392014-02-17 12:11:11 +01001456 err = __sctp_setsockopt_connectx(sk, (struct sockaddr __user *)
1457 param.addrs, param.addr_num,
1458 &assoc_id);
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04001459 if (err == 0 || err == -EINPROGRESS) {
1460 if (copy_to_user(optval, &assoc_id, sizeof(assoc_id)))
1461 return -EFAULT;
1462 if (put_user(sizeof(assoc_id), optlen))
1463 return -EFAULT;
1464 }
1465
1466 return err;
1467}
1468
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469/* API 3.1.4 close() - UDP Style Syntax
1470 * Applications use close() to perform graceful shutdown (as described in
1471 * Section 10.1 of [SCTP]) on ALL the associations currently represented
1472 * by a UDP-style socket.
1473 *
1474 * The syntax is
1475 *
1476 * ret = close(int sd);
1477 *
1478 * sd - the socket descriptor of the associations to be closed.
1479 *
1480 * To gracefully shutdown a specific association represented by the
1481 * UDP-style socket, an application should use the sendmsg() call,
1482 * passing no user data, but including the appropriate flag in the
1483 * ancillary data (see Section xxxx).
1484 *
1485 * If sd in the close() call is a branched-off socket representing only
1486 * one association, the shutdown is performed on that association only.
1487 *
1488 * 4.1.6 close() - TCP Style Syntax
1489 *
1490 * Applications use close() to gracefully close down an association.
1491 *
1492 * The syntax is:
1493 *
1494 * int close(int sd);
1495 *
1496 * sd - the socket descriptor of the association to be closed.
1497 *
1498 * After an application calls close() on a socket descriptor, no further
1499 * socket operations will succeed on that descriptor.
1500 *
1501 * API 7.1.4 SO_LINGER
1502 *
1503 * An application using the TCP-style socket can use this option to
1504 * perform the SCTP ABORT primitive. The linger option structure is:
1505 *
1506 * struct linger {
1507 * int l_onoff; // option on/off
1508 * int l_linger; // linger time
1509 * };
1510 *
1511 * To enable the option, set l_onoff to 1. If the l_linger value is set
1512 * to 0, calling close() is the same as the ABORT primitive. If the
1513 * value is set to a negative value, the setsockopt() call will return
1514 * an error. If the value is set to a positive value linger_time, the
1515 * close() can be blocked for at most linger_time ms. If the graceful
1516 * shutdown phase does not finish during this period, close() will
1517 * return but the graceful shutdown phase continues in the system.
1518 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02001519static void sctp_close(struct sock *sk, long timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520{
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001521 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522 struct sctp_endpoint *ep;
1523 struct sctp_association *asoc;
1524 struct list_head *pos, *temp;
Thomas Grafcd4fcc72011-07-08 04:37:46 +00001525 unsigned int data_was_unread;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526
Daniel Borkmannbb333812013-06-28 19:49:40 +02001527 pr_debug("%s: sk:%p, timeout:%ld\n", __func__, sk, timeout);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528
Xin Long6dfe4b92017-06-10 14:56:56 +08001529 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530 sk->sk_shutdown = SHUTDOWN_MASK;
Vlad Yasevichbec96402009-07-30 18:08:28 -04001531 sk->sk_state = SCTP_SS_CLOSING;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532
1533 ep = sctp_sk(sk)->ep;
1534
Thomas Grafcd4fcc72011-07-08 04:37:46 +00001535 /* Clean up any skbs sitting on the receive queue. */
1536 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue);
1537 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby);
1538
Vladislav Yasevich61c9fed2006-05-19 11:01:18 -07001539 /* Walk all associations on an endpoint. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540 list_for_each_safe(pos, temp, &ep->asocs) {
1541 asoc = list_entry(pos, struct sctp_association, asocs);
1542
1543 if (sctp_style(sk, TCP)) {
1544 /* A closed association can still be in the list if
1545 * it belongs to a TCP-style listening socket that is
1546 * not yet accepted. If so, free it. If not, send an
1547 * ABORT or SHUTDOWN based on the linger options.
1548 */
1549 if (sctp_state(asoc, CLOSED)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 sctp_association_free(asoc);
Vladislav Yasevichb89498a2006-05-19 14:32:06 -07001551 continue;
1552 }
1553 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001554
Thomas Grafcd4fcc72011-07-08 04:37:46 +00001555 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
1556 !skb_queue_empty(&asoc->ulpq.reasm) ||
1557 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
Sridhar Samudralab9ac8672006-08-28 13:53:01 -07001558 struct sctp_chunk *chunk;
1559
1560 chunk = sctp_make_abort_user(asoc, NULL, 0);
Xin Long068d8bd2015-12-29 17:49:25 +08001561 sctp_primitive_ABORT(net, asoc, chunk);
Sridhar Samudralab9ac8672006-08-28 13:53:01 -07001562 } else
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001563 sctp_primitive_SHUTDOWN(net, asoc, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564 }
1565
Linus Torvalds1da177e2005-04-16 15:20:36 -07001566 /* On a TCP-style socket, block for at most linger_time if set. */
1567 if (sctp_style(sk, TCP) && timeout)
1568 sctp_wait_for_close(sk, timeout);
1569
1570 /* This will run the backlog queue. */
wangweidong048ed4b2014-01-21 15:44:11 +08001571 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572
1573 /* Supposedly, no process has access to the socket, but
1574 * the net layers still may.
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03001575 * Also, sctp_destroy_sock() needs to be called with addr_wq_lock
1576 * held and that should be grabbed before socket lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577 */
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03001578 spin_lock_bh(&net->sctp.addr_wq_lock);
Xin Long6dfe4b92017-06-10 14:56:56 +08001579 bh_lock_sock_nested(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001580
1581 /* Hold the sock, since sk_common_release() will put sock_put()
1582 * and we have just a little more cleanup.
1583 */
1584 sock_hold(sk);
1585 sk_common_release(sk);
1586
wangweidong5bc1d1b2014-01-21 15:44:12 +08001587 bh_unlock_sock(sk);
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03001588 spin_unlock_bh(&net->sctp.addr_wq_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589
1590 sock_put(sk);
1591
1592 SCTP_DBG_OBJCNT_DEC(sock);
1593}
1594
1595/* Handle EPIPE error. */
1596static int sctp_error(struct sock *sk, int flags, int err)
1597{
1598 if (err == -EPIPE)
1599 err = sock_error(sk) ? : -EPIPE;
1600 if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
1601 send_sig(SIGPIPE, current, 0);
1602 return err;
1603}
1604
1605/* API 3.1.3 sendmsg() - UDP Style Syntax
1606 *
1607 * An application uses sendmsg() and recvmsg() calls to transmit data to
1608 * and receive data from its peer.
1609 *
1610 * ssize_t sendmsg(int socket, const struct msghdr *message,
1611 * int flags);
1612 *
1613 * socket - the socket descriptor of the endpoint.
1614 * message - pointer to the msghdr structure which contains a single
1615 * user message and possibly some ancillary data.
1616 *
1617 * See Section 5 for complete description of the data
1618 * structures.
1619 *
1620 * flags - flags sent or received with the user message, see Section
1621 * 5 for complete description of the flags.
1622 *
1623 * Note: This function could use a rewrite especially when explicit
1624 * connect support comes in.
1625 */
1626/* BUG: We do not implement the equivalent of sk_stream_wait_memory(). */
1627
Xin Longa05437a2017-08-11 10:23:48 +08001628static int sctp_msghdr_parse(const struct msghdr *msg,
1629 struct sctp_cmsgs *cmsgs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630
Ying Xue1b784142015-03-02 15:37:48 +08001631static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632{
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001633 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 struct sctp_sock *sp;
1635 struct sctp_endpoint *ep;
wangweidongcb3f8372013-12-23 12:16:50 +08001636 struct sctp_association *new_asoc = NULL, *asoc = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637 struct sctp_transport *transport, *chunk_tp;
1638 struct sctp_chunk *chunk;
Al Virodce116a2006-11-20 17:25:15 -08001639 union sctp_addr to;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001640 struct sockaddr *msg_name = NULL;
Joe Perches517aa0b2011-05-12 11:27:20 +00001641 struct sctp_sndrcvinfo default_sinfo;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642 struct sctp_sndrcvinfo *sinfo;
1643 struct sctp_initmsg *sinit;
1644 sctp_assoc_t associd = 0;
Xin Longa05437a2017-08-11 10:23:48 +08001645 struct sctp_cmsgs cmsgs = { NULL };
Xin Long1c662012017-08-05 19:59:54 +08001646 enum sctp_scope scope;
Daniel Borkmann2061dcd2015-01-15 16:34:35 +01001647 bool fill_sinfo_ttl = false, wait_connect = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001648 struct sctp_datamsg *datamsg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 int msg_flags = msg->msg_flags;
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02001650 __u16 sinfo_flags = 0;
1651 long timeo;
1652 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653
Linus Torvalds1da177e2005-04-16 15:20:36 -07001654 err = 0;
1655 sp = sctp_sk(sk);
1656 ep = sp->ep;
1657
Daniel Borkmannbb333812013-06-28 19:49:40 +02001658 pr_debug("%s: sk:%p, msg:%p, msg_len:%zu ep:%p\n", __func__, sk,
1659 msg, msg_len, ep);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001660
1661 /* We cannot send a message over a TCP-style listening socket. */
1662 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) {
1663 err = -EPIPE;
1664 goto out_nounlock;
1665 }
1666
1667 /* Parse out the SCTP CMSGs. */
1668 err = sctp_msghdr_parse(msg, &cmsgs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669 if (err) {
Daniel Borkmannbb333812013-06-28 19:49:40 +02001670 pr_debug("%s: msghdr parse err:%x\n", __func__, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671 goto out_nounlock;
1672 }
1673
1674 /* Fetch the destination address for this packet. This
1675 * address only selects the association--it is not necessarily
1676 * the address we will send to.
1677 * For a peeled-off socket, msg_name is ignored.
1678 */
1679 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) {
1680 int msg_namelen = msg->msg_namelen;
1681
1682 err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name,
1683 msg_namelen);
1684 if (err)
1685 return err;
1686
1687 if (msg_namelen > sizeof(to))
1688 msg_namelen = sizeof(to);
1689 memcpy(&to, msg->msg_name, msg_namelen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 msg_name = msg->msg_name;
1691 }
1692
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693 sinit = cmsgs.init;
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02001694 if (cmsgs.sinfo != NULL) {
1695 memset(&default_sinfo, 0, sizeof(default_sinfo));
1696 default_sinfo.sinfo_stream = cmsgs.sinfo->snd_sid;
1697 default_sinfo.sinfo_flags = cmsgs.sinfo->snd_flags;
1698 default_sinfo.sinfo_ppid = cmsgs.sinfo->snd_ppid;
1699 default_sinfo.sinfo_context = cmsgs.sinfo->snd_context;
1700 default_sinfo.sinfo_assoc_id = cmsgs.sinfo->snd_assoc_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02001702 sinfo = &default_sinfo;
1703 fill_sinfo_ttl = true;
1704 } else {
1705 sinfo = cmsgs.srinfo;
1706 }
1707 /* Did the user specify SNDINFO/SNDRCVINFO? */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708 if (sinfo) {
1709 sinfo_flags = sinfo->sinfo_flags;
1710 associd = sinfo->sinfo_assoc_id;
1711 }
1712
Daniel Borkmannbb333812013-06-28 19:49:40 +02001713 pr_debug("%s: msg_len:%zu, sinfo_flags:0x%x\n", __func__,
1714 msg_len, sinfo_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001716 /* SCTP_EOF or SCTP_ABORT cannot be set on a TCP-style socket. */
1717 if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001718 err = -EINVAL;
1719 goto out_nounlock;
1720 }
1721
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001722 /* If SCTP_EOF is set, no data can be sent. Disallow sending zero
1723 * length messages when SCTP_EOF|SCTP_ABORT is not set.
1724 * If SCTP_ABORT is set, the message length could be non zero with
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725 * the msg_iov set to the user abort reason.
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09001726 */
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001727 if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) ||
1728 (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729 err = -EINVAL;
1730 goto out_nounlock;
1731 }
1732
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001733 /* If SCTP_ADDR_OVER is set, there must be an address
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734 * specified in msg_name.
1735 */
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001736 if ((sinfo_flags & SCTP_ADDR_OVER) && (!msg->msg_name)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737 err = -EINVAL;
1738 goto out_nounlock;
1739 }
1740
1741 transport = NULL;
1742
Daniel Borkmannbb333812013-06-28 19:49:40 +02001743 pr_debug("%s: about to look up association\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744
wangweidong048ed4b2014-01-21 15:44:11 +08001745 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746
1747 /* If a msg_name has been specified, assume this is to be used. */
1748 if (msg_name) {
1749 /* Look for a matching association on the endpoint. */
Al Virodce116a2006-11-20 17:25:15 -08001750 asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport);
Marcelo Ricardo Leitnere5b13f32016-07-15 16:38:19 -03001751
1752 /* If we could not find a matching association on the
1753 * endpoint, make sure that it is not a TCP-style
1754 * socket that already has an association or there is
1755 * no peeled-off association on another socket.
1756 */
1757 if (!asoc &&
1758 ((sctp_style(sk, TCP) &&
1759 (sctp_sstate(sk, ESTABLISHED) ||
1760 sctp_sstate(sk, CLOSING))) ||
1761 sctp_endpoint_is_peeled_off(ep, &to))) {
1762 err = -EADDRNOTAVAIL;
1763 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764 }
1765 } else {
1766 asoc = sctp_id2assoc(sk, associd);
1767 if (!asoc) {
1768 err = -EPIPE;
1769 goto out_unlock;
1770 }
1771 }
1772
1773 if (asoc) {
Daniel Borkmannbb333812013-06-28 19:49:40 +02001774 pr_debug("%s: just looked up association:%p\n", __func__, asoc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775
1776 /* We cannot send a message on a TCP-style SCTP_SS_ESTABLISHED
1777 * socket that has an association in CLOSED state. This can
1778 * happen when an accepted socket has an association that is
1779 * already CLOSED.
1780 */
1781 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) {
1782 err = -EPIPE;
1783 goto out_unlock;
1784 }
1785
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001786 if (sinfo_flags & SCTP_EOF) {
Daniel Borkmannbb333812013-06-28 19:49:40 +02001787 pr_debug("%s: shutting down association:%p\n",
1788 __func__, asoc);
1789
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001790 sctp_primitive_SHUTDOWN(net, asoc, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 err = 0;
1792 goto out_unlock;
1793 }
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001794 if (sinfo_flags & SCTP_ABORT) {
Sridhar Samudralac164a9b2006-08-22 11:50:39 -07001795
1796 chunk = sctp_make_abort_user(asoc, msg, msg_len);
1797 if (!chunk) {
1798 err = -ENOMEM;
1799 goto out_unlock;
1800 }
1801
Daniel Borkmannbb333812013-06-28 19:49:40 +02001802 pr_debug("%s: aborting association:%p\n",
1803 __func__, asoc);
1804
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00001805 sctp_primitive_ABORT(net, asoc, chunk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001806 err = 0;
1807 goto out_unlock;
1808 }
1809 }
1810
1811 /* Do we need to create the association? */
1812 if (!asoc) {
Daniel Borkmannbb333812013-06-28 19:49:40 +02001813 pr_debug("%s: there is no association yet\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001815 if (sinfo_flags & (SCTP_EOF | SCTP_ABORT)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001816 err = -EINVAL;
1817 goto out_unlock;
1818 }
1819
1820 /* Check for invalid stream against the stream counts,
1821 * either the default or the user specified stream counts.
1822 */
1823 if (sinfo) {
Dan Carpenter0e864b22014-01-13 16:46:08 +03001824 if (!sinit || !sinit->sinit_num_ostreams) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001825 /* Check against the defaults. */
1826 if (sinfo->sinfo_stream >=
1827 sp->initmsg.sinit_num_ostreams) {
1828 err = -EINVAL;
1829 goto out_unlock;
1830 }
1831 } else {
1832 /* Check against the requested. */
1833 if (sinfo->sinfo_stream >=
1834 sinit->sinit_num_ostreams) {
1835 err = -EINVAL;
1836 goto out_unlock;
1837 }
1838 }
1839 }
1840
1841 /*
1842 * API 3.1.2 bind() - UDP Style Syntax
1843 * If a bind() or sctp_bindx() is not called prior to a
1844 * sendmsg() call that initiates a new association, the
1845 * system picks an ephemeral port and will choose an address
1846 * set equivalent to binding with a wildcard address.
1847 */
1848 if (!ep->base.bind_addr.port) {
1849 if (sctp_autobind(sk)) {
1850 err = -EAGAIN;
1851 goto out_unlock;
1852 }
Ivan Skytte Jorgensen64a0c1c2005-10-28 15:39:02 -07001853 } else {
1854 /*
1855 * If an unprivileged user inherits a one-to-many
1856 * style socket with open associations on a privileged
1857 * port, it MAY be permitted to accept new associations,
1858 * but it SHOULD NOT be permitted to open new
1859 * associations.
1860 */
Krister Johansen4548b682017-01-20 17:49:11 -08001861 if (ep->base.bind_addr.port < inet_prot_sock(net) &&
Eric W. Biederman35946982012-11-16 03:03:12 +00001862 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) {
Ivan Skytte Jorgensen64a0c1c2005-10-28 15:39:02 -07001863 err = -EACCES;
1864 goto out_unlock;
1865 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 }
1867
1868 scope = sctp_scope(&to);
1869 new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1870 if (!new_asoc) {
1871 err = -ENOMEM;
1872 goto out_unlock;
1873 }
1874 asoc = new_asoc;
Vlad Yasevich409b95a2009-11-10 08:57:34 +00001875 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL);
1876 if (err < 0) {
1877 err = -ENOMEM;
1878 goto out_free;
1879 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880
1881 /* If the SCTP_INIT ancillary data is specified, set all
1882 * the association init values accordingly.
1883 */
1884 if (sinit) {
1885 if (sinit->sinit_num_ostreams) {
1886 asoc->c.sinit_num_ostreams =
1887 sinit->sinit_num_ostreams;
1888 }
1889 if (sinit->sinit_max_instreams) {
1890 asoc->c.sinit_max_instreams =
1891 sinit->sinit_max_instreams;
1892 }
1893 if (sinit->sinit_max_attempts) {
1894 asoc->max_init_attempts
1895 = sinit->sinit_max_attempts;
1896 }
1897 if (sinit->sinit_max_init_timeo) {
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09001898 asoc->max_init_timeo =
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899 msecs_to_jiffies(sinit->sinit_max_init_timeo);
1900 }
1901 }
1902
1903 /* Prime the peer's transport structures. */
Al Virodce116a2006-11-20 17:25:15 -08001904 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905 if (!transport) {
1906 err = -ENOMEM;
1907 goto out_free;
1908 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001909 }
1910
1911 /* ASSERT: we have a valid association at this point. */
Daniel Borkmannbb333812013-06-28 19:49:40 +02001912 pr_debug("%s: we have a valid association\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001913
1914 if (!sinfo) {
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02001915 /* If the user didn't specify SNDINFO/SNDRCVINFO, make up
1916 * one with some defaults.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917 */
Joe Perches517aa0b2011-05-12 11:27:20 +00001918 memset(&default_sinfo, 0, sizeof(default_sinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001919 default_sinfo.sinfo_stream = asoc->default_stream;
1920 default_sinfo.sinfo_flags = asoc->default_flags;
1921 default_sinfo.sinfo_ppid = asoc->default_ppid;
1922 default_sinfo.sinfo_context = asoc->default_context;
1923 default_sinfo.sinfo_timetolive = asoc->default_timetolive;
1924 default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc);
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02001925
Linus Torvalds1da177e2005-04-16 15:20:36 -07001926 sinfo = &default_sinfo;
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02001927 } else if (fill_sinfo_ttl) {
1928 /* In case SNDINFO was specified, we still need to fill
1929 * it with a default ttl from the assoc here.
1930 */
1931 sinfo->sinfo_timetolive = asoc->default_timetolive;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932 }
1933
1934 /* API 7.1.7, the sndbuf size per association bounds the
1935 * maximum size of data that can be sent in a single send call.
1936 */
1937 if (msg_len > sk->sk_sndbuf) {
1938 err = -EMSGSIZE;
1939 goto out_free;
1940 }
1941
Vlad Yasevich8a479492007-06-07 14:21:05 -04001942 if (asoc->pmtu_pending)
Xin Long3ebfdf02017-04-04 13:39:55 +08001943 sctp_assoc_pending_pmtu(asoc);
Vlad Yasevich8a479492007-06-07 14:21:05 -04001944
Linus Torvalds1da177e2005-04-16 15:20:36 -07001945 /* If fragmentation is disabled and the message length exceeds the
1946 * association fragmentation point, return EMSGSIZE. The I-D
1947 * does not specify what this error is, but this looks like
1948 * a great fit.
1949 */
1950 if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) {
1951 err = -EMSGSIZE;
1952 goto out_free;
1953 }
1954
Joe Perchesafd76142011-05-12 09:19:10 +00001955 /* Check for invalid stream. */
Xin Longcee360a2017-05-31 16:36:31 +08001956 if (sinfo->sinfo_stream >= asoc->stream.outcnt) {
Joe Perchesafd76142011-05-12 09:19:10 +00001957 err = -EINVAL;
1958 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959 }
1960
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03001961 /* Allocate sctp_stream_out_ext if not already done */
1962 if (unlikely(!asoc->stream.out[sinfo->sinfo_stream].ext)) {
1963 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream);
1964 if (err)
1965 goto out_free;
1966 }
1967
Xin Long8dbdf1f2016-07-09 19:47:45 +08001968 if (sctp_wspace(asoc) < msg_len)
1969 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc));
1970
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1972 if (!sctp_wspace(asoc)) {
Xin Longcea0cc82017-11-15 16:57:26 +08001973 /* sk can be changed by peel off when waiting for buf. */
1974 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len, &sk);
Xin Longca3af4d2017-11-15 16:55:54 +08001975 if (err) {
1976 if (err == -ESRCH) {
1977 /* asoc is already dead. */
1978 new_asoc = NULL;
1979 err = -EPIPE;
1980 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981 goto out_free;
Xin Longca3af4d2017-11-15 16:55:54 +08001982 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 }
1984
1985 /* If an address is passed with the sendto/sendmsg call, it is used
1986 * to override the primary destination address in the TCP model, or
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001987 * when SCTP_ADDR_OVER flag is set in the UDP model.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988 */
1989 if ((sctp_style(sk, TCP) && msg_name) ||
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07001990 (sinfo_flags & SCTP_ADDR_OVER)) {
Al Virodce116a2006-11-20 17:25:15 -08001991 chunk_tp = sctp_assoc_lookup_paddr(asoc, &to);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992 if (!chunk_tp) {
1993 err = -EINVAL;
1994 goto out_free;
1995 }
1996 } else
1997 chunk_tp = NULL;
1998
1999 /* Auto-connect, if we aren't connected already. */
2000 if (sctp_state(asoc, CLOSED)) {
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00002001 err = sctp_primitive_ASSOCIATE(net, asoc, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002 if (err < 0)
2003 goto out_free;
Daniel Borkmannbb333812013-06-28 19:49:40 +02002004
Daniel Borkmann2061dcd2015-01-15 16:34:35 +01002005 wait_connect = true;
Daniel Borkmannbb333812013-06-28 19:49:40 +02002006 pr_debug("%s: we associated primitively\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007 }
2008
2009 /* Break the message into multiple chunks of maximum size. */
Al Viroc0371da2014-11-24 10:42:55 -05002010 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter);
Tommi Rantala6e51fe72012-11-22 03:23:16 +00002011 if (IS_ERR(datamsg)) {
2012 err = PTR_ERR(datamsg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013 goto out_free;
2014 }
Xin Longf9ba3502017-03-27 00:21:15 +08002015 asoc->force_delay = !!(msg->msg_flags & MSG_MORE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002016
2017 /* Now send the (possibly) fragmented message. */
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -07002018 list_for_each_entry(chunk, &datamsg->chunks, frag_list) {
Xin Longb61c6542016-09-14 02:04:20 +08002019 sctp_chunk_hold(chunk);
2020
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021 /* Do accounting for the write space. */
2022 sctp_set_owner_w(chunk);
2023
2024 chunk->transport = chunk_tp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 }
2026
Vlad Yasevich9c5c62b2009-08-10 13:51:03 -04002027 /* Send it to the lower layers. Note: all chunks
2028 * must either fail or succeed. The lower layer
2029 * works that way today. Keep it that way or this
2030 * breaks.
2031 */
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00002032 err = sctp_primitive_SEND(net, asoc, datamsg);
Vlad Yasevich9c5c62b2009-08-10 13:51:03 -04002033 /* Did the lower layer accept the chunk? */
Xin Longb61c6542016-09-14 02:04:20 +08002034 if (err) {
2035 sctp_datamsg_free(datamsg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 goto out_free;
Xin Longb61c6542016-09-14 02:04:20 +08002037 }
Daniel Borkmannbb333812013-06-28 19:49:40 +02002038
2039 pr_debug("%s: we sent primitively\n", __func__);
2040
Xin Longb61c6542016-09-14 02:04:20 +08002041 sctp_datamsg_put(datamsg);
Daniel Borkmannbb333812013-06-28 19:49:40 +02002042 err = msg_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043
Daniel Borkmann2061dcd2015-01-15 16:34:35 +01002044 if (unlikely(wait_connect)) {
2045 timeo = sock_sndtimeo(sk, msg_flags & MSG_DONTWAIT);
2046 sctp_wait_for_connect(asoc, &timeo);
2047 }
2048
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 /* If we are already past ASSOCIATE, the lower
2050 * layers are responsible for association cleanup.
2051 */
2052 goto out_unlock;
2053
2054out_free:
Xin Longb5eff712015-12-30 23:50:49 +08002055 if (new_asoc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056 sctp_association_free(asoc);
2057out_unlock:
wangweidong048ed4b2014-01-21 15:44:11 +08002058 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002059
2060out_nounlock:
2061 return sctp_error(sk, msg_flags, err);
2062
2063#if 0
2064do_sock_err:
2065 if (msg_len)
2066 err = msg_len;
2067 else
2068 err = sock_error(sk);
2069 goto out;
2070
2071do_interrupted:
2072 if (msg_len)
2073 err = msg_len;
2074 goto out;
2075#endif /* 0 */
2076}
2077
2078/* This is an extended version of skb_pull() that removes the data from the
2079 * start of a skb even when data is spread across the list of skb's in the
2080 * frag_list. len specifies the total amount of data that needs to be removed.
2081 * when 'len' bytes could be removed from the skb, it returns 0.
2082 * If 'len' exceeds the total skb length, it returns the no. of bytes that
2083 * could not be removed.
2084 */
2085static int sctp_skb_pull(struct sk_buff *skb, int len)
2086{
2087 struct sk_buff *list;
2088 int skb_len = skb_headlen(skb);
2089 int rlen;
2090
2091 if (len <= skb_len) {
2092 __skb_pull(skb, len);
2093 return 0;
2094 }
2095 len -= skb_len;
2096 __skb_pull(skb, skb_len);
2097
David S. Miller1b003be2009-06-09 00:22:35 -07002098 skb_walk_frags(skb, list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002099 rlen = sctp_skb_pull(list, len);
2100 skb->len -= (len-rlen);
2101 skb->data_len -= (len-rlen);
2102
2103 if (!rlen)
2104 return 0;
2105
2106 len = rlen;
2107 }
2108
2109 return len;
2110}
2111
2112/* API 3.1.3 recvmsg() - UDP Style Syntax
2113 *
2114 * ssize_t recvmsg(int socket, struct msghdr *message,
2115 * int flags);
2116 *
2117 * socket - the socket descriptor of the endpoint.
2118 * message - pointer to the msghdr structure which contains a single
2119 * user message and possibly some ancillary data.
2120 *
2121 * See Section 5 for complete description of the data
2122 * structures.
2123 *
2124 * flags - flags sent or received with the user message, see Section
2125 * 5 for complete description of the flags.
2126 */
Ying Xue1b784142015-03-02 15:37:48 +08002127static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
2128 int noblock, int flags, int *addr_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129{
2130 struct sctp_ulpevent *event = NULL;
2131 struct sctp_sock *sp = sctp_sk(sk);
Marcelo Ricardo Leitner1f45f782016-07-13 15:08:57 -03002132 struct sk_buff *skb, *head_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133 int copied;
2134 int err = 0;
2135 int skb_len;
2136
Daniel Borkmannbb333812013-06-28 19:49:40 +02002137 pr_debug("%s: sk:%p, msghdr:%p, len:%zd, noblock:%d, flags:0x%x, "
2138 "addr_len:%p)\n", __func__, sk, msg, len, noblock, flags,
2139 addr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140
wangweidong048ed4b2014-01-21 15:44:11 +08002141 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142
Marcelo Ricardo Leitnere5b13f32016-07-15 16:38:19 -03002143 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED) &&
Xin Longe0878692016-07-30 14:14:41 +08002144 !sctp_sstate(sk, CLOSING) && !sctp_sstate(sk, CLOSED)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145 err = -ENOTCONN;
2146 goto out;
2147 }
2148
2149 skb = sctp_skb_recv_datagram(sk, flags, noblock, &err);
2150 if (!skb)
2151 goto out;
2152
2153 /* Get the total length of the skb including any skb's in the
2154 * frag_list.
2155 */
2156 skb_len = skb->len;
2157
2158 copied = skb_len;
2159 if (copied > len)
2160 copied = len;
2161
David S. Miller51f3d022014-11-05 16:46:40 -05002162 err = skb_copy_datagram_msg(skb, 0, msg, copied);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163
2164 event = sctp_skb2event(skb);
2165
2166 if (err)
2167 goto out_free;
2168
Marcelo Ricardo Leitner1f45f782016-07-13 15:08:57 -03002169 if (event->chunk && event->chunk->head_skb)
2170 head_skb = event->chunk->head_skb;
2171 else
2172 head_skb = skb;
2173 sock_recv_ts_and_drops(msg, sk, head_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174 if (sctp_ulpevent_is_notification(event)) {
2175 msg->msg_flags |= MSG_NOTIFICATION;
2176 sp->pf->event_msgname(event, msg->msg_name, addr_len);
2177 } else {
Marcelo Ricardo Leitner1f45f782016-07-13 15:08:57 -03002178 sp->pf->skb_msgname(head_skb, msg->msg_name, addr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179 }
2180
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02002181 /* Check if we allow SCTP_NXTINFO. */
2182 if (sp->recvnxtinfo)
2183 sctp_ulpevent_read_nxtinfo(event, msg, sk);
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02002184 /* Check if we allow SCTP_RCVINFO. */
2185 if (sp->recvrcvinfo)
2186 sctp_ulpevent_read_rcvinfo(event, msg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187 /* Check if we allow SCTP_SNDRCVINFO. */
2188 if (sp->subscribe.sctp_data_io_event)
2189 sctp_ulpevent_read_sndrcvinfo(event, msg);
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02002190
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191 err = copied;
2192
2193 /* If skb's length exceeds the user's buffer, update the skb and
2194 * push it back to the receive_queue so that the next call to
2195 * recvmsg() will return the remaining data. Don't set MSG_EOR.
2196 */
2197 if (skb_len > copied) {
2198 msg->msg_flags &= ~MSG_EOR;
2199 if (flags & MSG_PEEK)
2200 goto out_free;
2201 sctp_skb_pull(skb, copied);
2202 skb_queue_head(&sk->sk_receive_queue, skb);
2203
Daniel Borkmann362d5202014-04-14 21:45:17 +02002204 /* When only partial message is copied to the user, increase
2205 * rwnd by that amount. If all the data in the skb is read,
2206 * rwnd is updated when the event is freed.
2207 */
2208 if (!sctp_ulpevent_is_notification(event))
2209 sctp_assoc_rwnd_increase(event->asoc, copied);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210 goto out;
2211 } else if ((event->msg_flags & MSG_NOTIFICATION) ||
2212 (event->msg_flags & MSG_EOR))
2213 msg->msg_flags |= MSG_EOR;
2214 else
2215 msg->msg_flags &= ~MSG_EOR;
2216
2217out_free:
2218 if (flags & MSG_PEEK) {
2219 /* Release the skb reference acquired after peeking the skb in
2220 * sctp_skb_recv_datagram().
2221 */
2222 kfree_skb(skb);
2223 } else {
2224 /* Free the event which includes releasing the reference to
2225 * the owner of the skb, freeing the skb and updating the
2226 * rwnd.
2227 */
2228 sctp_ulpevent_free(event);
2229 }
2230out:
wangweidong048ed4b2014-01-21 15:44:11 +08002231 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232 return err;
2233}
2234
2235/* 7.1.12 Enable/Disable message fragmentation (SCTP_DISABLE_FRAGMENTS)
2236 *
2237 * This option is a on/off flag. If enabled no SCTP message
2238 * fragmentation will be performed. Instead if a message being sent
2239 * exceeds the current PMTU size, the message will NOT be sent and
2240 * instead a error will be indicated to the user.
2241 */
2242static int sctp_setsockopt_disable_fragments(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07002243 char __user *optval,
2244 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245{
2246 int val;
2247
2248 if (optlen < sizeof(int))
2249 return -EINVAL;
2250
2251 if (get_user(val, (int __user *)optval))
2252 return -EFAULT;
2253
2254 sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1;
2255
2256 return 0;
2257}
2258
2259static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07002260 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261{
Wei Yongjun94912302011-07-02 09:28:04 +00002262 struct sctp_association *asoc;
2263 struct sctp_ulpevent *event;
2264
Vlad Yasevich7e8616d2008-02-27 16:04:52 -05002265 if (optlen > sizeof(struct sctp_event_subscribe))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266 return -EINVAL;
2267 if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
2268 return -EFAULT;
Wei Yongjun94912302011-07-02 09:28:04 +00002269
Daniel Borkmannbbbea412014-07-12 20:30:40 +02002270 /* At the time when a user app subscribes to SCTP_SENDER_DRY_EVENT,
Wei Yongjun94912302011-07-02 09:28:04 +00002271 * if there is no data to be sent or retransmit, the stack will
2272 * immediately send up this notification.
2273 */
2274 if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT,
2275 &sctp_sk(sk)->subscribe)) {
2276 asoc = sctp_id2assoc(sk, 0);
2277
2278 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
2279 event = sctp_ulpevent_make_sender_dry_event(asoc,
2280 GFP_ATOMIC);
2281 if (!event)
2282 return -ENOMEM;
2283
2284 sctp_ulpq_tail_event(&asoc->ulpq, event);
2285 }
2286 }
2287
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 return 0;
2289}
2290
2291/* 7.1.8 Automatic Close of associations (SCTP_AUTOCLOSE)
2292 *
2293 * This socket option is applicable to the UDP-style socket only. When
2294 * set it will cause associations that are idle for more than the
2295 * specified number of seconds to automatically close. An association
2296 * being idle is defined an association that has NOT sent or received
2297 * user data. The special value of '0' indicates that no automatic
2298 * close of any associations should be performed. The option expects an
2299 * integer defining the number of seconds of idle time before an
2300 * association is closed.
2301 */
2302static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07002303 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304{
2305 struct sctp_sock *sp = sctp_sk(sk);
Neil Horman9f70f462013-12-10 06:48:15 -05002306 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307
2308 /* Applicable to UDP-style socket only */
2309 if (sctp_style(sk, TCP))
2310 return -EOPNOTSUPP;
2311 if (optlen != sizeof(int))
2312 return -EINVAL;
2313 if (copy_from_user(&sp->autoclose, optval, optlen))
2314 return -EFAULT;
2315
Neil Horman9f70f462013-12-10 06:48:15 -05002316 if (sp->autoclose > net->sctp.max_autoclose)
2317 sp->autoclose = net->sctp.max_autoclose;
2318
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 return 0;
2320}
2321
2322/* 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS)
2323 *
2324 * Applications can enable or disable heartbeats for any peer address of
2325 * an association, modify an address's heartbeat interval, force a
2326 * heartbeat to be sent immediately, and adjust the address's maximum
2327 * number of retransmissions sent before an address is considered
2328 * unreachable. The following structure is used to access and modify an
2329 * address's parameters:
2330 *
2331 * struct sctp_paddrparams {
Frank Filz52ccb8e2005-12-22 11:36:46 -08002332 * sctp_assoc_t spp_assoc_id;
2333 * struct sockaddr_storage spp_address;
2334 * uint32_t spp_hbinterval;
2335 * uint16_t spp_pathmaxrxt;
2336 * uint32_t spp_pathmtu;
2337 * uint32_t spp_sackdelay;
2338 * uint32_t spp_flags;
2339 * };
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 *
Frank Filz52ccb8e2005-12-22 11:36:46 -08002341 * spp_assoc_id - (one-to-many style socket) This is filled in the
2342 * application, and identifies the association for
2343 * this query.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344 * spp_address - This specifies which address is of interest.
2345 * spp_hbinterval - This contains the value of the heartbeat interval,
Frank Filz52ccb8e2005-12-22 11:36:46 -08002346 * in milliseconds. If a value of zero
2347 * is present in this field then no changes are to
2348 * be made to this parameter.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349 * spp_pathmaxrxt - This contains the maximum number of
2350 * retransmissions before this address shall be
Frank Filz52ccb8e2005-12-22 11:36:46 -08002351 * considered unreachable. If a value of zero
2352 * is present in this field then no changes are to
2353 * be made to this parameter.
2354 * spp_pathmtu - When Path MTU discovery is disabled the value
2355 * specified here will be the "fixed" path mtu.
2356 * Note that if the spp_address field is empty
2357 * then all associations on this address will
2358 * have this fixed path mtu set upon them.
2359 *
2360 * spp_sackdelay - When delayed sack is enabled, this value specifies
2361 * the number of milliseconds that sacks will be delayed
2362 * for. This value will apply to all addresses of an
2363 * association if the spp_address field is empty. Note
2364 * also, that if delayed sack is enabled and this
2365 * value is set to 0, no change is made to the last
2366 * recorded delayed sack timer value.
2367 *
2368 * spp_flags - These flags are used to control various features
2369 * on an association. The flag field may contain
2370 * zero or more of the following options.
2371 *
2372 * SPP_HB_ENABLE - Enable heartbeats on the
2373 * specified address. Note that if the address
2374 * field is empty all addresses for the association
2375 * have heartbeats enabled upon them.
2376 *
2377 * SPP_HB_DISABLE - Disable heartbeats on the
2378 * speicifed address. Note that if the address
2379 * field is empty all addresses for the association
2380 * will have their heartbeats disabled. Note also
2381 * that SPP_HB_ENABLE and SPP_HB_DISABLE are
2382 * mutually exclusive, only one of these two should
2383 * be specified. Enabling both fields will have
2384 * undetermined results.
2385 *
2386 * SPP_HB_DEMAND - Request a user initiated heartbeat
2387 * to be made immediately.
2388 *
Vlad Yasevichbdf30922007-03-23 11:33:12 -07002389 * SPP_HB_TIME_IS_ZERO - Specify's that the time for
2390 * heartbeat delayis to be set to the value of 0
2391 * milliseconds.
2392 *
Frank Filz52ccb8e2005-12-22 11:36:46 -08002393 * SPP_PMTUD_ENABLE - This field will enable PMTU
2394 * discovery upon the specified address. Note that
2395 * if the address feild is empty then all addresses
2396 * on the association are effected.
2397 *
2398 * SPP_PMTUD_DISABLE - This field will disable PMTU
2399 * discovery upon the specified address. Note that
2400 * if the address feild is empty then all addresses
2401 * on the association are effected. Not also that
2402 * SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually
2403 * exclusive. Enabling both will have undetermined
2404 * results.
2405 *
2406 * SPP_SACKDELAY_ENABLE - Setting this flag turns
2407 * on delayed sack. The time specified in spp_sackdelay
2408 * is used to specify the sack delay for this address. Note
2409 * that if spp_address is empty then all addresses will
2410 * enable delayed sack and take on the sack delay
2411 * value specified in spp_sackdelay.
2412 * SPP_SACKDELAY_DISABLE - Setting this flag turns
2413 * off delayed sack. If the spp_address field is blank then
2414 * delayed sack is disabled for the entire association. Note
2415 * also that this field is mutually exclusive to
2416 * SPP_SACKDELAY_ENABLE, setting both will have undefined
2417 * results.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002418 */
Adrian Bunk16164362006-09-18 00:40:38 -07002419static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
2420 struct sctp_transport *trans,
2421 struct sctp_association *asoc,
2422 struct sctp_sock *sp,
2423 int hb_change,
2424 int pmtud_change,
2425 int sackdelay_change)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002427 int error;
2428
Frank Filz52ccb8e2005-12-22 11:36:46 -08002429 if (params->spp_flags & SPP_HB_DEMAND && trans) {
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00002430 struct net *net = sock_net(trans->asoc->base.sk);
2431
2432 error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002433 if (error)
2434 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002435 }
2436
Vlad Yasevichbdf30922007-03-23 11:33:12 -07002437 /* Note that unless the spp_flag is set to SPP_HB_ENABLE the value of
2438 * this field is ignored. Note also that a value of zero indicates
2439 * the current setting should be left unchanged.
2440 */
2441 if (params->spp_flags & SPP_HB_ENABLE) {
2442
2443 /* Re-zero the interval if the SPP_HB_TIME_IS_ZERO is
2444 * set. This lets us use 0 value when this flag
2445 * is set.
2446 */
2447 if (params->spp_flags & SPP_HB_TIME_IS_ZERO)
2448 params->spp_hbinterval = 0;
2449
2450 if (params->spp_hbinterval ||
2451 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) {
2452 if (trans) {
2453 trans->hbinterval =
2454 msecs_to_jiffies(params->spp_hbinterval);
2455 } else if (asoc) {
2456 asoc->hbinterval =
2457 msecs_to_jiffies(params->spp_hbinterval);
2458 } else {
2459 sp->hbinterval = params->spp_hbinterval;
2460 }
Frank Filz52ccb8e2005-12-22 11:36:46 -08002461 }
2462 }
2463
2464 if (hb_change) {
2465 if (trans) {
2466 trans->param_flags =
2467 (trans->param_flags & ~SPP_HB) | hb_change;
2468 } else if (asoc) {
2469 asoc->param_flags =
2470 (asoc->param_flags & ~SPP_HB) | hb_change;
2471 } else {
2472 sp->param_flags =
2473 (sp->param_flags & ~SPP_HB) | hb_change;
2474 }
2475 }
2476
Vlad Yasevichbdf30922007-03-23 11:33:12 -07002477 /* When Path MTU discovery is disabled the value specified here will
2478 * be the "fixed" path mtu (i.e. the value of the spp_flags field must
2479 * include the flag SPP_PMTUD_DISABLE for this field to have any
2480 * effect).
2481 */
2482 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) {
Frank Filz52ccb8e2005-12-22 11:36:46 -08002483 if (trans) {
2484 trans->pathmtu = params->spp_pathmtu;
Xin Long3ebfdf02017-04-04 13:39:55 +08002485 sctp_assoc_sync_pmtu(asoc);
Frank Filz52ccb8e2005-12-22 11:36:46 -08002486 } else if (asoc) {
2487 asoc->pathmtu = params->spp_pathmtu;
Frank Filz52ccb8e2005-12-22 11:36:46 -08002488 } else {
2489 sp->pathmtu = params->spp_pathmtu;
2490 }
2491 }
2492
2493 if (pmtud_change) {
2494 if (trans) {
2495 int update = (trans->param_flags & SPP_PMTUD_DISABLE) &&
2496 (params->spp_flags & SPP_PMTUD_ENABLE);
2497 trans->param_flags =
2498 (trans->param_flags & ~SPP_PMTUD) | pmtud_change;
2499 if (update) {
Vlad Yasevich9914ae32011-04-26 21:51:31 +00002500 sctp_transport_pmtu(trans, sctp_opt2sk(sp));
Xin Long3ebfdf02017-04-04 13:39:55 +08002501 sctp_assoc_sync_pmtu(asoc);
Frank Filz52ccb8e2005-12-22 11:36:46 -08002502 }
2503 } else if (asoc) {
2504 asoc->param_flags =
2505 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change;
2506 } else {
2507 sp->param_flags =
2508 (sp->param_flags & ~SPP_PMTUD) | pmtud_change;
2509 }
2510 }
2511
Vlad Yasevichbdf30922007-03-23 11:33:12 -07002512 /* Note that unless the spp_flag is set to SPP_SACKDELAY_ENABLE the
2513 * value of this field is ignored. Note also that a value of zero
2514 * indicates the current setting should be left unchanged.
2515 */
2516 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) {
Frank Filz52ccb8e2005-12-22 11:36:46 -08002517 if (trans) {
2518 trans->sackdelay =
2519 msecs_to_jiffies(params->spp_sackdelay);
2520 } else if (asoc) {
2521 asoc->sackdelay =
2522 msecs_to_jiffies(params->spp_sackdelay);
2523 } else {
2524 sp->sackdelay = params->spp_sackdelay;
2525 }
2526 }
2527
2528 if (sackdelay_change) {
2529 if (trans) {
2530 trans->param_flags =
2531 (trans->param_flags & ~SPP_SACKDELAY) |
2532 sackdelay_change;
2533 } else if (asoc) {
2534 asoc->param_flags =
2535 (asoc->param_flags & ~SPP_SACKDELAY) |
2536 sackdelay_change;
2537 } else {
2538 sp->param_flags =
2539 (sp->param_flags & ~SPP_SACKDELAY) |
2540 sackdelay_change;
2541 }
2542 }
2543
Andrei Pelinescu-Onciul37051f72009-11-23 15:53:57 -05002544 /* Note that a value of zero indicates the current setting should be
2545 left unchanged.
Vlad Yasevichbdf30922007-03-23 11:33:12 -07002546 */
Andrei Pelinescu-Onciul37051f72009-11-23 15:53:57 -05002547 if (params->spp_pathmaxrxt) {
Frank Filz52ccb8e2005-12-22 11:36:46 -08002548 if (trans) {
2549 trans->pathmaxrxt = params->spp_pathmaxrxt;
2550 } else if (asoc) {
2551 asoc->pathmaxrxt = params->spp_pathmaxrxt;
2552 } else {
2553 sp->pathmaxrxt = params->spp_pathmaxrxt;
2554 }
2555 }
2556
2557 return 0;
2558}
2559
2560static int sctp_setsockopt_peer_addr_params(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07002561 char __user *optval,
2562 unsigned int optlen)
Frank Filz52ccb8e2005-12-22 11:36:46 -08002563{
2564 struct sctp_paddrparams params;
2565 struct sctp_transport *trans = NULL;
2566 struct sctp_association *asoc = NULL;
2567 struct sctp_sock *sp = sctp_sk(sk);
2568 int error;
2569 int hb_change, pmtud_change, sackdelay_change;
2570
2571 if (optlen != sizeof(struct sctp_paddrparams))
wangweidongcb3f8372013-12-23 12:16:50 +08002572 return -EINVAL;
Frank Filz52ccb8e2005-12-22 11:36:46 -08002573
2574 if (copy_from_user(&params, optval, optlen))
2575 return -EFAULT;
2576
2577 /* Validate flags and value parameters. */
2578 hb_change = params.spp_flags & SPP_HB;
2579 pmtud_change = params.spp_flags & SPP_PMTUD;
2580 sackdelay_change = params.spp_flags & SPP_SACKDELAY;
2581
2582 if (hb_change == SPP_HB ||
2583 pmtud_change == SPP_PMTUD ||
2584 sackdelay_change == SPP_SACKDELAY ||
2585 params.spp_sackdelay > 500 ||
Joe Perchesf64f9e72009-11-29 16:55:45 -08002586 (params.spp_pathmtu &&
2587 params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
Frank Filz52ccb8e2005-12-22 11:36:46 -08002588 return -EINVAL;
2589
2590 /* If an address other than INADDR_ANY is specified, and
2591 * no transport is found, then the request is invalid.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002592 */
wangweidongcb3f8372013-12-23 12:16:50 +08002593 if (!sctp_is_any(sk, (union sctp_addr *)&params.spp_address)) {
Frank Filz52ccb8e2005-12-22 11:36:46 -08002594 trans = sctp_addr_id2transport(sk, &params.spp_address,
2595 params.spp_assoc_id);
2596 if (!trans)
2597 return -EINVAL;
2598 }
2599
2600 /* Get association, if assoc_id != 0 and the socket is a one
2601 * to many style socket, and an association was not found, then
2602 * the id was invalid.
2603 */
2604 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
2605 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP))
2606 return -EINVAL;
2607
2608 /* Heartbeat demand can only be sent on a transport or
2609 * association, but not a socket.
2610 */
2611 if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc)
2612 return -EINVAL;
2613
2614 /* Process parameters. */
2615 error = sctp_apply_peer_addr_params(&params, trans, asoc, sp,
2616 hb_change, pmtud_change,
2617 sackdelay_change);
2618
2619 if (error)
2620 return error;
2621
2622 /* If changes are for association, also apply parameters to each
2623 * transport.
2624 */
2625 if (!trans && asoc) {
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -07002626 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2627 transports) {
Frank Filz52ccb8e2005-12-22 11:36:46 -08002628 sctp_apply_peer_addr_params(&params, trans, asoc, sp,
2629 hb_change, pmtud_change,
2630 sackdelay_change);
2631 }
2632 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633
2634 return 0;
2635}
2636
wangweidong0ea5e4d2014-01-15 17:24:01 +08002637static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags)
2638{
2639 return (param_flags & ~SPP_SACKDELAY) | SPP_SACKDELAY_ENABLE;
2640}
2641
2642static inline __u32 sctp_spp_sackdelay_disable(__u32 param_flags)
2643{
2644 return (param_flags & ~SPP_SACKDELAY) | SPP_SACKDELAY_DISABLE;
2645}
2646
Wei Yongjund364d922008-05-09 15:13:26 -07002647/*
2648 * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK)
Frank Filz77086102005-12-22 11:37:30 -08002649 *
Wei Yongjund364d922008-05-09 15:13:26 -07002650 * This option will effect the way delayed acks are performed. This
2651 * option allows you to get or set the delayed ack time, in
2652 * milliseconds. It also allows changing the delayed ack frequency.
2653 * Changing the frequency to 1 disables the delayed sack algorithm. If
2654 * the assoc_id is 0, then this sets or gets the endpoints default
2655 * values. If the assoc_id field is non-zero, then the set or get
2656 * effects the specified association for the one to many model (the
2657 * assoc_id field is ignored by the one to one model). Note that if
2658 * sack_delay or sack_freq are 0 when setting this option, then the
2659 * current values will remain unchanged.
Frank Filz77086102005-12-22 11:37:30 -08002660 *
Wei Yongjund364d922008-05-09 15:13:26 -07002661 * struct sctp_sack_info {
2662 * sctp_assoc_t sack_assoc_id;
2663 * uint32_t sack_delay;
2664 * uint32_t sack_freq;
2665 * };
Frank Filz77086102005-12-22 11:37:30 -08002666 *
Wei Yongjund364d922008-05-09 15:13:26 -07002667 * sack_assoc_id - This parameter, indicates which association the user
2668 * is performing an action upon. Note that if this field's value is
2669 * zero then the endpoints default value is changed (effecting future
2670 * associations only).
Frank Filz77086102005-12-22 11:37:30 -08002671 *
Wei Yongjund364d922008-05-09 15:13:26 -07002672 * sack_delay - This parameter contains the number of milliseconds that
2673 * the user is requesting the delayed ACK timer be set to. Note that
2674 * this value is defined in the standard to be between 200 and 500
2675 * milliseconds.
Frank Filz77086102005-12-22 11:37:30 -08002676 *
Wei Yongjund364d922008-05-09 15:13:26 -07002677 * sack_freq - This parameter contains the number of packets that must
2678 * be received before a sack is sent without waiting for the delay
2679 * timer to expire. The default value for this is 2, setting this
2680 * value to 1 will disable the delayed sack algorithm.
Frank Filz77086102005-12-22 11:37:30 -08002681 */
2682
Wei Yongjund364d922008-05-09 15:13:26 -07002683static int sctp_setsockopt_delayed_ack(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07002684 char __user *optval, unsigned int optlen)
Frank Filz77086102005-12-22 11:37:30 -08002685{
Wei Yongjund364d922008-05-09 15:13:26 -07002686 struct sctp_sack_info params;
Frank Filz77086102005-12-22 11:37:30 -08002687 struct sctp_transport *trans = NULL;
2688 struct sctp_association *asoc = NULL;
2689 struct sctp_sock *sp = sctp_sk(sk);
2690
Wei Yongjund364d922008-05-09 15:13:26 -07002691 if (optlen == sizeof(struct sctp_sack_info)) {
2692 if (copy_from_user(&params, optval, optlen))
2693 return -EFAULT;
2694
2695 if (params.sack_delay == 0 && params.sack_freq == 0)
2696 return 0;
2697 } else if (optlen == sizeof(struct sctp_assoc_value)) {
Neil Horman94f65192013-12-23 08:29:43 -05002698 pr_warn_ratelimited(DEPRECATED
Neil Hormanf916ec92014-01-02 12:54:27 -05002699 "%s (pid %d) "
Neil Horman94f65192013-12-23 08:29:43 -05002700 "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
Neil Hormanf916ec92014-01-02 12:54:27 -05002701 "Use struct sctp_sack_info instead\n",
2702 current->comm, task_pid_nr(current));
Wei Yongjund364d922008-05-09 15:13:26 -07002703 if (copy_from_user(&params, optval, optlen))
2704 return -EFAULT;
2705
2706 if (params.sack_delay == 0)
2707 params.sack_freq = 1;
2708 else
2709 params.sack_freq = 0;
2710 } else
wangweidongcb3f8372013-12-23 12:16:50 +08002711 return -EINVAL;
Frank Filz77086102005-12-22 11:37:30 -08002712
Frank Filz77086102005-12-22 11:37:30 -08002713 /* Validate value parameter. */
Wei Yongjund364d922008-05-09 15:13:26 -07002714 if (params.sack_delay > 500)
Frank Filz77086102005-12-22 11:37:30 -08002715 return -EINVAL;
2716
Wei Yongjund364d922008-05-09 15:13:26 -07002717 /* Get association, if sack_assoc_id != 0 and the socket is a one
Frank Filz77086102005-12-22 11:37:30 -08002718 * to many style socket, and an association was not found, then
2719 * the id was invalid.
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002720 */
Wei Yongjund364d922008-05-09 15:13:26 -07002721 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
2722 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP))
Frank Filz77086102005-12-22 11:37:30 -08002723 return -EINVAL;
2724
Wei Yongjund364d922008-05-09 15:13:26 -07002725 if (params.sack_delay) {
Frank Filz77086102005-12-22 11:37:30 -08002726 if (asoc) {
2727 asoc->sackdelay =
Wei Yongjund364d922008-05-09 15:13:26 -07002728 msecs_to_jiffies(params.sack_delay);
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002729 asoc->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002730 sctp_spp_sackdelay_enable(asoc->param_flags);
Frank Filz77086102005-12-22 11:37:30 -08002731 } else {
Wei Yongjund364d922008-05-09 15:13:26 -07002732 sp->sackdelay = params.sack_delay;
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002733 sp->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002734 sctp_spp_sackdelay_enable(sp->param_flags);
Frank Filz77086102005-12-22 11:37:30 -08002735 }
Wei Yongjund364d922008-05-09 15:13:26 -07002736 }
2737
2738 if (params.sack_freq == 1) {
Frank Filz77086102005-12-22 11:37:30 -08002739 if (asoc) {
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002740 asoc->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002741 sctp_spp_sackdelay_disable(asoc->param_flags);
Frank Filz77086102005-12-22 11:37:30 -08002742 } else {
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002743 sp->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002744 sctp_spp_sackdelay_disable(sp->param_flags);
Frank Filz77086102005-12-22 11:37:30 -08002745 }
Wei Yongjund364d922008-05-09 15:13:26 -07002746 } else if (params.sack_freq > 1) {
2747 if (asoc) {
2748 asoc->sackfreq = params.sack_freq;
2749 asoc->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002750 sctp_spp_sackdelay_enable(asoc->param_flags);
Wei Yongjund364d922008-05-09 15:13:26 -07002751 } else {
2752 sp->sackfreq = params.sack_freq;
2753 sp->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002754 sctp_spp_sackdelay_enable(sp->param_flags);
Wei Yongjund364d922008-05-09 15:13:26 -07002755 }
Frank Filz77086102005-12-22 11:37:30 -08002756 }
2757
2758 /* If change is for association, also apply to each transport. */
2759 if (asoc) {
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -07002760 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2761 transports) {
Wei Yongjund364d922008-05-09 15:13:26 -07002762 if (params.sack_delay) {
Frank Filz77086102005-12-22 11:37:30 -08002763 trans->sackdelay =
Wei Yongjund364d922008-05-09 15:13:26 -07002764 msecs_to_jiffies(params.sack_delay);
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002765 trans->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002766 sctp_spp_sackdelay_enable(trans->param_flags);
Wei Yongjund364d922008-05-09 15:13:26 -07002767 }
Vlad Yasevich7bfe8bdb2008-06-09 15:45:05 -07002768 if (params.sack_freq == 1) {
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002769 trans->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002770 sctp_spp_sackdelay_disable(trans->param_flags);
Wei Yongjund364d922008-05-09 15:13:26 -07002771 } else if (params.sack_freq > 1) {
2772 trans->sackfreq = params.sack_freq;
2773 trans->param_flags =
wangweidong0ea5e4d2014-01-15 17:24:01 +08002774 sctp_spp_sackdelay_enable(trans->param_flags);
Frank Filz77086102005-12-22 11:37:30 -08002775 }
2776 }
2777 }
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002778
Frank Filz77086102005-12-22 11:37:30 -08002779 return 0;
2780}
2781
Linus Torvalds1da177e2005-04-16 15:20:36 -07002782/* 7.1.3 Initialization Parameters (SCTP_INITMSG)
2783 *
2784 * Applications can specify protocol parameters for the default association
2785 * initialization. The option name argument to setsockopt() and getsockopt()
2786 * is SCTP_INITMSG.
2787 *
2788 * Setting initialization parameters is effective only on an unconnected
2789 * socket (for UDP-style sockets only future associations are effected
2790 * by the change). With TCP-style sockets, this option is inherited by
2791 * sockets derived from a listener socket.
2792 */
David S. Millerb7058842009-09-30 16:12:20 -07002793static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002794{
2795 struct sctp_initmsg sinit;
2796 struct sctp_sock *sp = sctp_sk(sk);
2797
2798 if (optlen != sizeof(struct sctp_initmsg))
2799 return -EINVAL;
2800 if (copy_from_user(&sinit, optval, optlen))
2801 return -EFAULT;
2802
2803 if (sinit.sinit_num_ostreams)
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002804 sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002805 if (sinit.sinit_max_instreams)
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002806 sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002807 if (sinit.sinit_max_attempts)
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002808 sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002809 if (sinit.sinit_max_init_timeo)
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09002810 sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811
2812 return 0;
2813}
2814
2815/*
2816 * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM)
2817 *
2818 * Applications that wish to use the sendto() system call may wish to
2819 * specify a default set of parameters that would normally be supplied
2820 * through the inclusion of ancillary data. This socket option allows
2821 * such an application to set the default sctp_sndrcvinfo structure.
2822 * The application that wishes to use this socket option simply passes
2823 * in to this call the sctp_sndrcvinfo structure defined in Section
2824 * 5.2.2) The input parameters accepted by this call include
2825 * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context,
2826 * sinfo_timetolive. The user must provide the sinfo_assoc_id field in
2827 * to this call if the caller is using the UDP model.
2828 */
2829static int sctp_setsockopt_default_send_param(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07002830 char __user *optval,
2831 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002832{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833 struct sctp_sock *sp = sctp_sk(sk);
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02002834 struct sctp_association *asoc;
2835 struct sctp_sndrcvinfo info;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002836
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02002837 if (optlen != sizeof(info))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002838 return -EINVAL;
2839 if (copy_from_user(&info, optval, optlen))
2840 return -EFAULT;
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02002841 if (info.sinfo_flags &
2842 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
2843 SCTP_ABORT | SCTP_EOF))
2844 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002845
2846 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
2847 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP))
2848 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849 if (asoc) {
2850 asoc->default_stream = info.sinfo_stream;
2851 asoc->default_flags = info.sinfo_flags;
2852 asoc->default_ppid = info.sinfo_ppid;
2853 asoc->default_context = info.sinfo_context;
2854 asoc->default_timetolive = info.sinfo_timetolive;
2855 } else {
2856 sp->default_stream = info.sinfo_stream;
2857 sp->default_flags = info.sinfo_flags;
2858 sp->default_ppid = info.sinfo_ppid;
2859 sp->default_context = info.sinfo_context;
2860 sp->default_timetolive = info.sinfo_timetolive;
2861 }
2862
2863 return 0;
2864}
2865
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02002866/* RFC6458, Section 8.1.31. Set/get Default Send Parameters
2867 * (SCTP_DEFAULT_SNDINFO)
2868 */
2869static int sctp_setsockopt_default_sndinfo(struct sock *sk,
2870 char __user *optval,
2871 unsigned int optlen)
2872{
2873 struct sctp_sock *sp = sctp_sk(sk);
2874 struct sctp_association *asoc;
2875 struct sctp_sndinfo info;
2876
2877 if (optlen != sizeof(info))
2878 return -EINVAL;
2879 if (copy_from_user(&info, optval, optlen))
2880 return -EFAULT;
2881 if (info.snd_flags &
2882 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
2883 SCTP_ABORT | SCTP_EOF))
2884 return -EINVAL;
2885
2886 asoc = sctp_id2assoc(sk, info.snd_assoc_id);
2887 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP))
2888 return -EINVAL;
2889 if (asoc) {
2890 asoc->default_stream = info.snd_sid;
2891 asoc->default_flags = info.snd_flags;
2892 asoc->default_ppid = info.snd_ppid;
2893 asoc->default_context = info.snd_context;
2894 } else {
2895 sp->default_stream = info.snd_sid;
2896 sp->default_flags = info.snd_flags;
2897 sp->default_ppid = info.snd_ppid;
2898 sp->default_context = info.snd_context;
2899 }
2900
2901 return 0;
2902}
2903
Linus Torvalds1da177e2005-04-16 15:20:36 -07002904/* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR)
2905 *
2906 * Requests that the local SCTP stack use the enclosed peer address as
2907 * the association primary. The enclosed address must be one of the
2908 * association peer's addresses.
2909 */
2910static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07002911 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912{
2913 struct sctp_prim prim;
2914 struct sctp_transport *trans;
2915
2916 if (optlen != sizeof(struct sctp_prim))
2917 return -EINVAL;
2918
2919 if (copy_from_user(&prim, optval, sizeof(struct sctp_prim)))
2920 return -EFAULT;
2921
2922 trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id);
2923 if (!trans)
2924 return -EINVAL;
2925
2926 sctp_assoc_set_primary(trans->asoc, trans);
2927
2928 return 0;
2929}
2930
2931/*
2932 * 7.1.5 SCTP_NODELAY
2933 *
2934 * Turn on/off any Nagle-like algorithm. This means that packets are
2935 * generally sent as soon as possible and no unnecessary delays are
2936 * introduced, at the cost of more packets in the network. Expects an
2937 * integer boolean flag.
2938 */
2939static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07002940 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941{
2942 int val;
2943
2944 if (optlen < sizeof(int))
2945 return -EINVAL;
2946 if (get_user(val, (int __user *)optval))
2947 return -EFAULT;
2948
2949 sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1;
2950 return 0;
2951}
2952
2953/*
2954 *
2955 * 7.1.1 SCTP_RTOINFO
2956 *
2957 * The protocol parameters used to initialize and bound retransmission
2958 * timeout (RTO) are tunable. sctp_rtoinfo structure is used to access
2959 * and modify these parameters.
2960 * All parameters are time values, in milliseconds. A value of 0, when
2961 * modifying the parameters, indicates that the current value should not
2962 * be changed.
2963 *
2964 */
David S. Millerb7058842009-09-30 16:12:20 -07002965static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen)
2966{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 struct sctp_rtoinfo rtoinfo;
2968 struct sctp_association *asoc;
wangweidong85f935d2013-12-11 09:50:38 +08002969 unsigned long rto_min, rto_max;
2970 struct sctp_sock *sp = sctp_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971
2972 if (optlen != sizeof (struct sctp_rtoinfo))
2973 return -EINVAL;
2974
2975 if (copy_from_user(&rtoinfo, optval, optlen))
2976 return -EFAULT;
2977
2978 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
2979
2980 /* Set the values to the specific association */
2981 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
2982 return -EINVAL;
2983
wangweidong85f935d2013-12-11 09:50:38 +08002984 rto_max = rtoinfo.srto_max;
2985 rto_min = rtoinfo.srto_min;
2986
2987 if (rto_max)
2988 rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max;
2989 else
2990 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max;
2991
2992 if (rto_min)
2993 rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min;
2994 else
2995 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min;
2996
2997 if (rto_min > rto_max)
2998 return -EINVAL;
2999
Linus Torvalds1da177e2005-04-16 15:20:36 -07003000 if (asoc) {
3001 if (rtoinfo.srto_initial != 0)
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09003002 asoc->rto_initial =
Linus Torvalds1da177e2005-04-16 15:20:36 -07003003 msecs_to_jiffies(rtoinfo.srto_initial);
wangweidong85f935d2013-12-11 09:50:38 +08003004 asoc->rto_max = rto_max;
3005 asoc->rto_min = rto_min;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003006 } else {
3007 /* If there is no association or the association-id = 0
3008 * set the values to the endpoint.
3009 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 if (rtoinfo.srto_initial != 0)
3011 sp->rtoinfo.srto_initial = rtoinfo.srto_initial;
wangweidong85f935d2013-12-11 09:50:38 +08003012 sp->rtoinfo.srto_max = rto_max;
3013 sp->rtoinfo.srto_min = rto_min;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003014 }
3015
3016 return 0;
3017}
3018
3019/*
3020 *
3021 * 7.1.2 SCTP_ASSOCINFO
3022 *
Michael Opdenacker59c51592007-05-09 08:57:56 +02003023 * This option is used to tune the maximum retransmission attempts
Linus Torvalds1da177e2005-04-16 15:20:36 -07003024 * of the association.
3025 * Returns an error if the new association retransmission value is
3026 * greater than the sum of the retransmission value of the peer.
3027 * See [SCTP] for more information.
3028 *
3029 */
David S. Millerb7058842009-09-30 16:12:20 -07003030static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003031{
3032
3033 struct sctp_assocparams assocparams;
3034 struct sctp_association *asoc;
3035
3036 if (optlen != sizeof(struct sctp_assocparams))
3037 return -EINVAL;
3038 if (copy_from_user(&assocparams, optval, optlen))
3039 return -EFAULT;
3040
3041 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
3042
3043 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP))
3044 return -EINVAL;
3045
3046 /* Set the values to the specific association */
3047 if (asoc) {
Vlad Yasevich402d68c2006-06-17 22:54:51 -07003048 if (assocparams.sasoc_asocmaxrxt != 0) {
3049 __u32 path_sum = 0;
3050 int paths = 0;
Vlad Yasevich402d68c2006-06-17 22:54:51 -07003051 struct sctp_transport *peer_addr;
3052
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -07003053 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list,
3054 transports) {
Vlad Yasevich402d68c2006-06-17 22:54:51 -07003055 path_sum += peer_addr->pathmaxrxt;
3056 paths++;
3057 }
3058
Frederik Schwarzer025dfda2008-10-16 19:02:37 +02003059 /* Only validate asocmaxrxt if we have more than
Vlad Yasevich402d68c2006-06-17 22:54:51 -07003060 * one path/transport. We do this because path
3061 * retransmissions are only counted when we have more
3062 * then one path.
3063 */
3064 if (paths > 1 &&
3065 assocparams.sasoc_asocmaxrxt > path_sum)
3066 return -EINVAL;
3067
Linus Torvalds1da177e2005-04-16 15:20:36 -07003068 asoc->max_retrans = assocparams.sasoc_asocmaxrxt;
Vlad Yasevich402d68c2006-06-17 22:54:51 -07003069 }
3070
Daniel Borkmann52db8822013-06-25 18:17:27 +02003071 if (assocparams.sasoc_cookie_life != 0)
3072 asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003073 } else {
3074 /* Set the values to the endpoint */
3075 struct sctp_sock *sp = sctp_sk(sk);
3076
3077 if (assocparams.sasoc_asocmaxrxt != 0)
3078 sp->assocparams.sasoc_asocmaxrxt =
3079 assocparams.sasoc_asocmaxrxt;
3080 if (assocparams.sasoc_cookie_life != 0)
3081 sp->assocparams.sasoc_cookie_life =
3082 assocparams.sasoc_cookie_life;
3083 }
3084 return 0;
3085}
3086
3087/*
3088 * 7.1.16 Set/clear IPv4 mapped addresses (SCTP_I_WANT_MAPPED_V4_ADDR)
3089 *
3090 * This socket option is a boolean flag which turns on or off mapped V4
3091 * addresses. If this option is turned on and the socket is type
3092 * PF_INET6, then IPv4 addresses will be mapped to V6 representation.
3093 * If this option is turned off, then no mapping will be done of V4
3094 * addresses and a user will receive both PF_INET6 and PF_INET type
3095 * addresses on the socket.
3096 */
David S. Millerb7058842009-09-30 16:12:20 -07003097static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003098{
3099 int val;
3100 struct sctp_sock *sp = sctp_sk(sk);
3101
3102 if (optlen < sizeof(int))
3103 return -EINVAL;
3104 if (get_user(val, (int __user *)optval))
3105 return -EFAULT;
3106 if (val)
3107 sp->v4mapped = 1;
3108 else
3109 sp->v4mapped = 0;
3110
3111 return 0;
3112}
3113
3114/*
Wei Yongjune89c2092008-12-25 16:54:58 -08003115 * 8.1.16. Get or Set the Maximum Fragmentation Size (SCTP_MAXSEG)
3116 * This option will get or set the maximum size to put in any outgoing
3117 * SCTP DATA chunk. If a message is larger than this size it will be
Linus Torvalds1da177e2005-04-16 15:20:36 -07003118 * fragmented by SCTP into the specified size. Note that the underlying
3119 * SCTP implementation may fragment into smaller sized chunks when the
3120 * PMTU of the underlying association is smaller than the value set by
Wei Yongjune89c2092008-12-25 16:54:58 -08003121 * the user. The default value for this option is '0' which indicates
3122 * the user is NOT limiting fragmentation and only the PMTU will effect
3123 * SCTP's choice of DATA chunk size. Note also that values set larger
3124 * than the maximum size of an IP datagram will effectively let SCTP
3125 * control fragmentation (i.e. the same as setting this option to 0).
3126 *
3127 * The following structure is used to access and modify this parameter:
3128 *
3129 * struct sctp_assoc_value {
3130 * sctp_assoc_t assoc_id;
3131 * uint32_t assoc_value;
3132 * };
3133 *
3134 * assoc_id: This parameter is ignored for one-to-one style sockets.
3135 * For one-to-many style sockets this parameter indicates which
3136 * association the user is performing an action upon. Note that if
3137 * this field's value is zero then the endpoints default value is
3138 * changed (effecting future associations only).
3139 * assoc_value: This parameter specifies the maximum size in bytes.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003140 */
David S. Millerb7058842009-09-30 16:12:20 -07003141static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142{
Xin Longecca8f82017-11-17 14:11:11 +08003143 struct sctp_sock *sp = sctp_sk(sk);
Wei Yongjune89c2092008-12-25 16:54:58 -08003144 struct sctp_assoc_value params;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 struct sctp_association *asoc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003146 int val;
3147
Wei Yongjune89c2092008-12-25 16:54:58 -08003148 if (optlen == sizeof(int)) {
Neil Horman94f65192013-12-23 08:29:43 -05003149 pr_warn_ratelimited(DEPRECATED
Neil Hormanf916ec92014-01-02 12:54:27 -05003150 "%s (pid %d) "
Neil Horman94f65192013-12-23 08:29:43 -05003151 "Use of int in maxseg socket option.\n"
Neil Hormanf916ec92014-01-02 12:54:27 -05003152 "Use struct sctp_assoc_value instead\n",
3153 current->comm, task_pid_nr(current));
Wei Yongjune89c2092008-12-25 16:54:58 -08003154 if (copy_from_user(&val, optval, optlen))
3155 return -EFAULT;
3156 params.assoc_id = 0;
3157 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3158 if (copy_from_user(&params, optval, optlen))
3159 return -EFAULT;
3160 val = params.assoc_value;
Xin Longecca8f82017-11-17 14:11:11 +08003161 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003162 return -EINVAL;
Xin Longecca8f82017-11-17 14:11:11 +08003163 }
Wei Yongjune89c2092008-12-25 16:54:58 -08003164
Xin Longecca8f82017-11-17 14:11:11 +08003165 if (val) {
3166 int min_len, max_len;
3167
3168 min_len = SCTP_DEFAULT_MINSEGMENT - sp->pf->af->net_header_len;
3169 min_len -= sizeof(struct sctphdr) +
3170 sizeof(struct sctp_data_chunk);
3171
3172 max_len = SCTP_MAX_CHUNK_LEN - sizeof(struct sctp_data_chunk);
3173
3174 if (val < min_len || val > max_len)
3175 return -EINVAL;
3176 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003177
Wei Yongjune89c2092008-12-25 16:54:58 -08003178 asoc = sctp_id2assoc(sk, params.assoc_id);
Wei Yongjune89c2092008-12-25 16:54:58 -08003179 if (asoc) {
3180 if (val == 0) {
Xin Longecca8f82017-11-17 14:11:11 +08003181 val = asoc->pathmtu - sp->pf->af->net_header_len;
Wei Yongjune89c2092008-12-25 16:54:58 -08003182 val -= sizeof(struct sctphdr) +
Xin Longecca8f82017-11-17 14:11:11 +08003183 sizeof(struct sctp_data_chunk);
Wei Yongjune89c2092008-12-25 16:54:58 -08003184 }
Vlad Yasevichf68b2e02009-09-04 18:21:00 -04003185 asoc->user_frag = val;
3186 asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu);
Wei Yongjune89c2092008-12-25 16:54:58 -08003187 } else {
Xin Longecca8f82017-11-17 14:11:11 +08003188 if (params.assoc_id && sctp_style(sk, UDP))
3189 return -EINVAL;
Wei Yongjune89c2092008-12-25 16:54:58 -08003190 sp->user_frag = val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003191 }
3192
3193 return 0;
3194}
3195
3196
3197/*
3198 * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR)
3199 *
3200 * Requests that the peer mark the enclosed address as the association
3201 * primary. The enclosed address must be one of the association's
3202 * locally bound addresses. The following structure is used to make a
3203 * set primary request:
3204 */
3205static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003206 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207{
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00003208 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003209 struct sctp_sock *sp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210 struct sctp_association *asoc = NULL;
3211 struct sctp_setpeerprim prim;
3212 struct sctp_chunk *chunk;
Wei Yongjun40a01032010-12-07 17:11:09 +00003213 struct sctp_af *af;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214 int err;
3215
3216 sp = sctp_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003217
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00003218 if (!net->sctp.addip_enable)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003219 return -EPERM;
3220
3221 if (optlen != sizeof(struct sctp_setpeerprim))
3222 return -EINVAL;
3223
3224 if (copy_from_user(&prim, optval, optlen))
3225 return -EFAULT;
3226
3227 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id);
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09003228 if (!asoc)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003229 return -EINVAL;
3230
3231 if (!asoc->peer.asconf_capable)
3232 return -EPERM;
3233
3234 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY)
3235 return -EPERM;
3236
3237 if (!sctp_state(asoc, ESTABLISHED))
3238 return -ENOTCONN;
3239
Wei Yongjun40a01032010-12-07 17:11:09 +00003240 af = sctp_get_af_specific(prim.sspp_addr.ss_family);
3241 if (!af)
3242 return -EINVAL;
3243
3244 if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL))
3245 return -EADDRNOTAVAIL;
3246
Linus Torvalds1da177e2005-04-16 15:20:36 -07003247 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
3248 return -EADDRNOTAVAIL;
3249
3250 /* Create an ASCONF chunk with SET_PRIMARY parameter */
3251 chunk = sctp_make_asconf_set_prim(asoc,
3252 (union sctp_addr *)&prim.sspp_addr);
3253 if (!chunk)
3254 return -ENOMEM;
3255
3256 err = sctp_send_asconf(asoc, chunk);
3257
Daniel Borkmannbb333812013-06-28 19:49:40 +02003258 pr_debug("%s: we set peer primary addr primitively\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259
3260 return err;
3261}
3262
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08003263static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003264 unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265{
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08003266 struct sctp_setadaptation adaptation;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003267
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08003268 if (optlen != sizeof(struct sctp_setadaptation))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003269 return -EINVAL;
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08003270 if (copy_from_user(&adaptation, optval, optlen))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003271 return -EFAULT;
3272
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08003273 sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003274
3275 return 0;
3276}
3277
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08003278/*
3279 * 7.1.29. Set or Get the default context (SCTP_CONTEXT)
3280 *
3281 * The context field in the sctp_sndrcvinfo structure is normally only
3282 * used when a failed message is retrieved holding the value that was
3283 * sent down on the actual send call. This option allows the setting of
3284 * a default context on an association basis that will be received on
3285 * reading messages from the peer. This is especially helpful in the
3286 * one-2-many model for an application to keep some reference to an
3287 * internal state machine that is processing messages on the
3288 * association. Note that the setting of this value only effects
3289 * received messages from the peer and does not effect the value that is
3290 * saved with outbound messages.
3291 */
3292static int sctp_setsockopt_context(struct sock *sk, char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003293 unsigned int optlen)
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08003294{
3295 struct sctp_assoc_value params;
3296 struct sctp_sock *sp;
3297 struct sctp_association *asoc;
3298
3299 if (optlen != sizeof(struct sctp_assoc_value))
3300 return -EINVAL;
3301 if (copy_from_user(&params, optval, optlen))
3302 return -EFAULT;
3303
3304 sp = sctp_sk(sk);
3305
3306 if (params.assoc_id != 0) {
3307 asoc = sctp_id2assoc(sk, params.assoc_id);
3308 if (!asoc)
3309 return -EINVAL;
3310 asoc->default_rcv_context = params.assoc_value;
3311 } else {
3312 sp->default_rcv_context = params.assoc_value;
3313 }
3314
3315 return 0;
3316}
3317
Vlad Yasevichb6e13312007-04-20 12:23:15 -07003318/*
3319 * 7.1.24. Get or set fragmented interleave (SCTP_FRAGMENT_INTERLEAVE)
3320 *
3321 * This options will at a minimum specify if the implementation is doing
3322 * fragmented interleave. Fragmented interleave, for a one to many
3323 * socket, is when subsequent calls to receive a message may return
3324 * parts of messages from different associations. Some implementations
3325 * may allow you to turn this value on or off. If so, when turned off,
3326 * no fragment interleave will occur (which will cause a head of line
3327 * blocking amongst multiple associations sharing the same one to many
3328 * socket). When this option is turned on, then each receive call may
3329 * come from a different association (thus the user must receive data
3330 * with the extended calls (e.g. sctp_recvmsg) to keep track of which
3331 * association each receive belongs to.
3332 *
3333 * This option takes a boolean value. A non-zero value indicates that
3334 * fragmented interleave is on. A value of zero indicates that
3335 * fragmented interleave is off.
3336 *
3337 * Note that it is important that an implementation that allows this
3338 * option to be turned on, have it off by default. Otherwise an unaware
3339 * application using the one to many model may become confused and act
3340 * incorrectly.
3341 */
3342static int sctp_setsockopt_fragment_interleave(struct sock *sk,
3343 char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003344 unsigned int optlen)
Vlad Yasevichb6e13312007-04-20 12:23:15 -07003345{
3346 int val;
3347
3348 if (optlen != sizeof(int))
3349 return -EINVAL;
3350 if (get_user(val, (int __user *)optval))
3351 return -EFAULT;
3352
Xin Long772a5862017-12-08 21:03:58 +08003353 sctp_sk(sk)->frag_interleave = !!val;
3354
3355 if (!sctp_sk(sk)->frag_interleave)
3356 sctp_sk(sk)->strm_interleave = 0;
Vlad Yasevichb6e13312007-04-20 12:23:15 -07003357
3358 return 0;
3359}
3360
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003361/*
Wei Yongjun8510b932008-12-25 16:59:03 -08003362 * 8.1.21. Set or Get the SCTP Partial Delivery Point
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003363 * (SCTP_PARTIAL_DELIVERY_POINT)
Wei Yongjun8510b932008-12-25 16:59:03 -08003364 *
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003365 * This option will set or get the SCTP partial delivery point. This
3366 * point is the size of a message where the partial delivery API will be
3367 * invoked to help free up rwnd space for the peer. Setting this to a
Wei Yongjun8510b932008-12-25 16:59:03 -08003368 * lower value will cause partial deliveries to happen more often. The
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003369 * calls argument is an integer that sets or gets the partial delivery
Wei Yongjun8510b932008-12-25 16:59:03 -08003370 * point. Note also that the call will fail if the user attempts to set
3371 * this value larger than the socket receive buffer size.
3372 *
3373 * Note that any single message having a length smaller than or equal to
3374 * the SCTP partial delivery point will be delivered in one single read
3375 * call as long as the user provided buffer is large enough to hold the
3376 * message.
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003377 */
3378static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
3379 char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003380 unsigned int optlen)
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003381{
3382 u32 val;
3383
3384 if (optlen != sizeof(u32))
3385 return -EINVAL;
3386 if (get_user(val, (int __user *)optval))
3387 return -EFAULT;
3388
Wei Yongjun8510b932008-12-25 16:59:03 -08003389 /* Note: We double the receive buffer from what the user sets
3390 * it to be, also initial rwnd is based on rcvbuf/2.
3391 */
3392 if (val > (sk->sk_rcvbuf >> 1))
3393 return -EINVAL;
3394
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07003395 sctp_sk(sk)->pd_point = val;
3396
3397 return 0; /* is this the right error code? */
3398}
3399
Vlad Yasevich70331572007-03-23 11:34:36 -07003400/*
3401 * 7.1.28. Set or Get the maximum burst (SCTP_MAX_BURST)
3402 *
3403 * This option will allow a user to change the maximum burst of packets
3404 * that can be emitted by this association. Note that the default value
3405 * is 4, and some implementations may restrict this setting so that it
3406 * can only be lowered.
3407 *
3408 * NOTE: This text doesn't seem right. Do this on a socket basis with
3409 * future associations inheriting the socket value.
3410 */
3411static int sctp_setsockopt_maxburst(struct sock *sk,
3412 char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003413 unsigned int optlen)
Vlad Yasevich70331572007-03-23 11:34:36 -07003414{
Neil Horman219b99a2008-03-05 13:44:46 -08003415 struct sctp_assoc_value params;
3416 struct sctp_sock *sp;
3417 struct sctp_association *asoc;
Vlad Yasevich70331572007-03-23 11:34:36 -07003418 int val;
Neil Horman219b99a2008-03-05 13:44:46 -08003419 int assoc_id = 0;
Vlad Yasevich70331572007-03-23 11:34:36 -07003420
Neil Horman219b99a2008-03-05 13:44:46 -08003421 if (optlen == sizeof(int)) {
Neil Horman94f65192013-12-23 08:29:43 -05003422 pr_warn_ratelimited(DEPRECATED
Neil Hormanf916ec92014-01-02 12:54:27 -05003423 "%s (pid %d) "
Neil Horman94f65192013-12-23 08:29:43 -05003424 "Use of int in max_burst socket option deprecated.\n"
Neil Hormanf916ec92014-01-02 12:54:27 -05003425 "Use struct sctp_assoc_value instead\n",
3426 current->comm, task_pid_nr(current));
Neil Horman219b99a2008-03-05 13:44:46 -08003427 if (copy_from_user(&val, optval, optlen))
3428 return -EFAULT;
3429 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3430 if (copy_from_user(&params, optval, optlen))
3431 return -EFAULT;
3432 val = params.assoc_value;
3433 assoc_id = params.assoc_id;
3434 } else
3435 return -EINVAL;
3436
3437 sp = sctp_sk(sk);
3438
3439 if (assoc_id != 0) {
3440 asoc = sctp_id2assoc(sk, assoc_id);
3441 if (!asoc)
3442 return -EINVAL;
3443 asoc->max_burst = val;
3444 } else
3445 sp->max_burst = val;
Vlad Yasevich70331572007-03-23 11:34:36 -07003446
3447 return 0;
3448}
3449
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003450/*
3451 * 7.1.18. Add a chunk that must be authenticated (SCTP_AUTH_CHUNK)
3452 *
3453 * This set option adds a chunk type that the user is requesting to be
3454 * received only in an authenticated way. Changes to the list of chunks
3455 * will only effect future associations on the socket.
3456 */
3457static int sctp_setsockopt_auth_chunk(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07003458 char __user *optval,
3459 unsigned int optlen)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003460{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003461 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003462 struct sctp_authchunk val;
3463
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003464 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07003465 return -EACCES;
3466
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003467 if (optlen != sizeof(struct sctp_authchunk))
3468 return -EINVAL;
3469 if (copy_from_user(&val, optval, optlen))
3470 return -EFAULT;
3471
3472 switch (val.sauth_chunk) {
Joe Perches7fd71b12011-07-01 09:43:11 +00003473 case SCTP_CID_INIT:
3474 case SCTP_CID_INIT_ACK:
3475 case SCTP_CID_SHUTDOWN_COMPLETE:
3476 case SCTP_CID_AUTH:
3477 return -EINVAL;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003478 }
3479
3480 /* add this chunk id to the endpoint */
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003481 return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003482}
3483
3484/*
3485 * 7.1.19. Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT)
3486 *
3487 * This option gets or sets the list of HMAC algorithms that the local
3488 * endpoint requires the peer to use.
3489 */
3490static int sctp_setsockopt_hmac_ident(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07003491 char __user *optval,
3492 unsigned int optlen)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003493{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003494 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003495 struct sctp_hmacalgo *hmacs;
Vlad Yasevichd9724052008-08-27 16:09:49 -07003496 u32 idents;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003497 int err;
3498
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003499 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07003500 return -EACCES;
3501
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003502 if (optlen < sizeof(struct sctp_hmacalgo))
3503 return -EINVAL;
3504
wangweidongcb3f8372013-12-23 12:16:50 +08003505 hmacs = memdup_user(optval, optlen);
Shan Wei934253a2011-04-18 19:13:18 +00003506 if (IS_ERR(hmacs))
3507 return PTR_ERR(hmacs);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003508
Vlad Yasevichd9724052008-08-27 16:09:49 -07003509 idents = hmacs->shmac_num_idents;
3510 if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS ||
3511 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) {
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003512 err = -EINVAL;
3513 goto out;
3514 }
3515
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003516 err = sctp_auth_ep_set_hmacs(ep, hmacs);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003517out:
3518 kfree(hmacs);
3519 return err;
3520}
3521
3522/*
3523 * 7.1.20. Set a shared key (SCTP_AUTH_KEY)
3524 *
3525 * This option will set a shared secret key which is used to build an
3526 * association shared key.
3527 */
3528static int sctp_setsockopt_auth_key(struct sock *sk,
3529 char __user *optval,
David S. Millerb7058842009-09-30 16:12:20 -07003530 unsigned int optlen)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003531{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003532 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003533 struct sctp_authkey *authkey;
3534 struct sctp_association *asoc;
3535 int ret;
3536
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003537 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07003538 return -EACCES;
3539
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003540 if (optlen <= sizeof(struct sctp_authkey))
3541 return -EINVAL;
3542
wangweidongcb3f8372013-12-23 12:16:50 +08003543 authkey = memdup_user(optval, optlen);
Shan Wei934253a2011-04-18 19:13:18 +00003544 if (IS_ERR(authkey))
3545 return PTR_ERR(authkey);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003546
Vlad Yasevich328fc472008-08-27 16:08:54 -07003547 if (authkey->sca_keylength > optlen - sizeof(struct sctp_authkey)) {
Vlad Yasevich30c22352008-08-25 15:16:19 -07003548 ret = -EINVAL;
3549 goto out;
3550 }
3551
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003552 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id);
3553 if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) {
3554 ret = -EINVAL;
3555 goto out;
3556 }
3557
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003558 ret = sctp_auth_set_key(ep, asoc, authkey);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003559out:
Daniel Borkmann6ba542a2013-02-08 03:04:34 +00003560 kzfree(authkey);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003561 return ret;
3562}
3563
3564/*
3565 * 7.1.21. Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY)
3566 *
3567 * This option will get or set the active shared key to be used to build
3568 * the association shared key.
3569 */
3570static int sctp_setsockopt_active_key(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07003571 char __user *optval,
3572 unsigned int optlen)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003573{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003574 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003575 struct sctp_authkeyid val;
3576 struct sctp_association *asoc;
3577
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003578 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07003579 return -EACCES;
3580
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003581 if (optlen != sizeof(struct sctp_authkeyid))
3582 return -EINVAL;
3583 if (copy_from_user(&val, optval, optlen))
3584 return -EFAULT;
3585
3586 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3587 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
3588 return -EINVAL;
3589
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003590 return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003591}
3592
3593/*
3594 * 7.1.22. Delete a shared key (SCTP_AUTH_DELETE_KEY)
3595 *
3596 * This set option will delete a shared secret key from use.
3597 */
3598static int sctp_setsockopt_del_key(struct sock *sk,
David S. Millerb7058842009-09-30 16:12:20 -07003599 char __user *optval,
3600 unsigned int optlen)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003601{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003602 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003603 struct sctp_authkeyid val;
3604 struct sctp_association *asoc;
3605
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003606 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07003607 return -EACCES;
3608
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003609 if (optlen != sizeof(struct sctp_authkeyid))
3610 return -EINVAL;
3611 if (copy_from_user(&val, optval, optlen))
3612 return -EFAULT;
3613
3614 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3615 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
3616 return -EINVAL;
3617
Vlad Yasevichb14878c2014-04-17 17:26:50 +02003618 return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07003619
3620}
3621
Michio Honda7dc04d72011-04-26 20:16:31 +09003622/*
3623 * 8.1.23 SCTP_AUTO_ASCONF
3624 *
3625 * This option will enable or disable the use of the automatic generation of
3626 * ASCONF chunks to add and delete addresses to an existing association. Note
3627 * that this option has two caveats namely: a) it only affects sockets that
3628 * are bound to all addresses available to the SCTP stack, and b) the system
3629 * administrator may have an overriding control that turns the ASCONF feature
3630 * off no matter what setting the socket option may have.
3631 * This option expects an integer boolean flag, where a non-zero value turns on
3632 * the option, and a zero value turns off the option.
3633 * Note. In this implementation, socket operation overrides default parameter
3634 * being set by sysctl as well as FreeBSD implementation
3635 */
3636static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval,
3637 unsigned int optlen)
3638{
3639 int val;
3640 struct sctp_sock *sp = sctp_sk(sk);
3641
3642 if (optlen < sizeof(int))
3643 return -EINVAL;
3644 if (get_user(val, (int __user *)optval))
3645 return -EFAULT;
3646 if (!sctp_is_ep_boundall(sk) && val)
3647 return -EINVAL;
3648 if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf))
3649 return 0;
3650
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03003651 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock);
Michio Honda7dc04d72011-04-26 20:16:31 +09003652 if (val == 0 && sp->do_auto_asconf) {
3653 list_del(&sp->auto_asconf_list);
3654 sp->do_auto_asconf = 0;
3655 } else if (val && !sp->do_auto_asconf) {
3656 list_add_tail(&sp->auto_asconf_list,
Eric W. Biederman4db67e82012-08-06 08:42:04 +00003657 &sock_net(sk)->sctp.auto_asconf_splist);
Michio Honda7dc04d72011-04-26 20:16:31 +09003658 sp->do_auto_asconf = 1;
3659 }
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03003660 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock);
Michio Honda7dc04d72011-04-26 20:16:31 +09003661 return 0;
3662}
3663
Neil Horman5aa93bc2012-07-21 07:56:07 +00003664/*
3665 * SCTP_PEER_ADDR_THLDS
3666 *
3667 * This option allows us to alter the partially failed threshold for one or all
3668 * transports in an association. See Section 6.1 of:
3669 * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
3670 */
3671static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
3672 char __user *optval,
3673 unsigned int optlen)
3674{
3675 struct sctp_paddrthlds val;
3676 struct sctp_transport *trans;
3677 struct sctp_association *asoc;
3678
3679 if (optlen < sizeof(struct sctp_paddrthlds))
3680 return -EINVAL;
3681 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval,
3682 sizeof(struct sctp_paddrthlds)))
3683 return -EFAULT;
3684
3685
3686 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
3687 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
3688 if (!asoc)
3689 return -ENOENT;
3690 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
3691 transports) {
3692 if (val.spt_pathmaxrxt)
3693 trans->pathmaxrxt = val.spt_pathmaxrxt;
3694 trans->pf_retrans = val.spt_pathpfthld;
3695 }
3696
3697 if (val.spt_pathmaxrxt)
3698 asoc->pathmaxrxt = val.spt_pathmaxrxt;
3699 asoc->pf_retrans = val.spt_pathpfthld;
3700 } else {
3701 trans = sctp_addr_id2transport(sk, &val.spt_address,
3702 val.spt_assoc_id);
3703 if (!trans)
3704 return -ENOENT;
3705
3706 if (val.spt_pathmaxrxt)
3707 trans->pathmaxrxt = val.spt_pathmaxrxt;
3708 trans->pf_retrans = val.spt_pathpfthld;
3709 }
3710
3711 return 0;
3712}
3713
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02003714static int sctp_setsockopt_recvrcvinfo(struct sock *sk,
3715 char __user *optval,
3716 unsigned int optlen)
3717{
3718 int val;
3719
3720 if (optlen < sizeof(int))
3721 return -EINVAL;
3722 if (get_user(val, (int __user *) optval))
3723 return -EFAULT;
3724
3725 sctp_sk(sk)->recvrcvinfo = (val == 0) ? 0 : 1;
3726
3727 return 0;
3728}
3729
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02003730static int sctp_setsockopt_recvnxtinfo(struct sock *sk,
3731 char __user *optval,
3732 unsigned int optlen)
3733{
3734 int val;
3735
3736 if (optlen < sizeof(int))
3737 return -EINVAL;
3738 if (get_user(val, (int __user *) optval))
3739 return -EFAULT;
3740
3741 sctp_sk(sk)->recvnxtinfo = (val == 0) ? 0 : 1;
3742
3743 return 0;
3744}
3745
Xin Long28aa4c22016-07-09 19:47:40 +08003746static int sctp_setsockopt_pr_supported(struct sock *sk,
3747 char __user *optval,
3748 unsigned int optlen)
3749{
3750 struct sctp_assoc_value params;
3751 struct sctp_association *asoc;
3752 int retval = -EINVAL;
3753
3754 if (optlen != sizeof(params))
3755 goto out;
3756
3757 if (copy_from_user(&params, optval, optlen)) {
3758 retval = -EFAULT;
3759 goto out;
3760 }
3761
3762 asoc = sctp_id2assoc(sk, params.assoc_id);
3763 if (asoc) {
3764 asoc->prsctp_enable = !!params.assoc_value;
3765 } else if (!params.assoc_id) {
3766 struct sctp_sock *sp = sctp_sk(sk);
3767
3768 sp->ep->prsctp_enable = !!params.assoc_value;
3769 } else {
3770 goto out;
3771 }
3772
3773 retval = 0;
3774
3775out:
3776 return retval;
3777}
3778
Xin Longf959fb42016-07-09 19:47:41 +08003779static int sctp_setsockopt_default_prinfo(struct sock *sk,
3780 char __user *optval,
3781 unsigned int optlen)
3782{
3783 struct sctp_default_prinfo info;
3784 struct sctp_association *asoc;
3785 int retval = -EINVAL;
3786
3787 if (optlen != sizeof(info))
3788 goto out;
3789
3790 if (copy_from_user(&info, optval, sizeof(info))) {
3791 retval = -EFAULT;
3792 goto out;
3793 }
3794
3795 if (info.pr_policy & ~SCTP_PR_SCTP_MASK)
3796 goto out;
3797
3798 if (info.pr_policy == SCTP_PR_SCTP_NONE)
3799 info.pr_value = 0;
3800
3801 asoc = sctp_id2assoc(sk, info.pr_assoc_id);
3802 if (asoc) {
3803 SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
3804 asoc->default_timetolive = info.pr_value;
3805 } else if (!info.pr_assoc_id) {
3806 struct sctp_sock *sp = sctp_sk(sk);
3807
3808 SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy);
3809 sp->default_timetolive = info.pr_value;
3810 } else {
3811 goto out;
3812 }
3813
3814 retval = 0;
3815
3816out:
3817 return retval;
3818}
3819
Xin Longc0d8bab2017-03-10 12:11:12 +08003820static int sctp_setsockopt_reconfig_supported(struct sock *sk,
3821 char __user *optval,
3822 unsigned int optlen)
3823{
3824 struct sctp_assoc_value params;
3825 struct sctp_association *asoc;
3826 int retval = -EINVAL;
3827
3828 if (optlen != sizeof(params))
3829 goto out;
3830
3831 if (copy_from_user(&params, optval, optlen)) {
3832 retval = -EFAULT;
3833 goto out;
3834 }
3835
3836 asoc = sctp_id2assoc(sk, params.assoc_id);
3837 if (asoc) {
3838 asoc->reconf_enable = !!params.assoc_value;
3839 } else if (!params.assoc_id) {
3840 struct sctp_sock *sp = sctp_sk(sk);
3841
3842 sp->ep->reconf_enable = !!params.assoc_value;
3843 } else {
3844 goto out;
3845 }
3846
3847 retval = 0;
3848
3849out:
3850 return retval;
3851}
3852
Xin Long9fb657a2017-01-18 00:44:46 +08003853static int sctp_setsockopt_enable_strreset(struct sock *sk,
3854 char __user *optval,
3855 unsigned int optlen)
3856{
3857 struct sctp_assoc_value params;
3858 struct sctp_association *asoc;
3859 int retval = -EINVAL;
3860
3861 if (optlen != sizeof(params))
3862 goto out;
3863
3864 if (copy_from_user(&params, optval, optlen)) {
3865 retval = -EFAULT;
3866 goto out;
3867 }
3868
3869 if (params.assoc_value & (~SCTP_ENABLE_STRRESET_MASK))
3870 goto out;
3871
3872 asoc = sctp_id2assoc(sk, params.assoc_id);
3873 if (asoc) {
3874 asoc->strreset_enable = params.assoc_value;
3875 } else if (!params.assoc_id) {
3876 struct sctp_sock *sp = sctp_sk(sk);
3877
3878 sp->ep->strreset_enable = params.assoc_value;
3879 } else {
3880 goto out;
3881 }
3882
3883 retval = 0;
3884
3885out:
3886 return retval;
3887}
3888
Xin Long7f9d68a2017-01-18 00:44:47 +08003889static int sctp_setsockopt_reset_streams(struct sock *sk,
3890 char __user *optval,
3891 unsigned int optlen)
3892{
3893 struct sctp_reset_streams *params;
3894 struct sctp_association *asoc;
3895 int retval = -EINVAL;
3896
3897 if (optlen < sizeof(struct sctp_reset_streams))
3898 return -EINVAL;
3899
3900 params = memdup_user(optval, optlen);
3901 if (IS_ERR(params))
3902 return PTR_ERR(params);
3903
3904 asoc = sctp_id2assoc(sk, params->srs_assoc_id);
3905 if (!asoc)
3906 goto out;
3907
3908 retval = sctp_send_reset_streams(asoc, params);
3909
3910out:
3911 kfree(params);
3912 return retval;
3913}
3914
Xin Longa92ce1a2017-02-09 01:18:18 +08003915static int sctp_setsockopt_reset_assoc(struct sock *sk,
3916 char __user *optval,
3917 unsigned int optlen)
3918{
3919 struct sctp_association *asoc;
3920 sctp_assoc_t associd;
3921 int retval = -EINVAL;
3922
3923 if (optlen != sizeof(associd))
3924 goto out;
3925
3926 if (copy_from_user(&associd, optval, optlen)) {
3927 retval = -EFAULT;
3928 goto out;
3929 }
3930
3931 asoc = sctp_id2assoc(sk, associd);
3932 if (!asoc)
3933 goto out;
3934
3935 retval = sctp_send_reset_assoc(asoc);
3936
3937out:
3938 return retval;
3939}
3940
Xin Long242bd2d2017-02-09 01:18:20 +08003941static int sctp_setsockopt_add_streams(struct sock *sk,
3942 char __user *optval,
3943 unsigned int optlen)
3944{
3945 struct sctp_association *asoc;
3946 struct sctp_add_streams params;
3947 int retval = -EINVAL;
3948
3949 if (optlen != sizeof(params))
3950 goto out;
3951
3952 if (copy_from_user(&params, optval, optlen)) {
3953 retval = -EFAULT;
3954 goto out;
3955 }
3956
3957 asoc = sctp_id2assoc(sk, params.sas_assoc_id);
3958 if (!asoc)
3959 goto out;
3960
3961 retval = sctp_send_add_streams(asoc, &params);
3962
3963out:
3964 return retval;
3965}
3966
Marcelo Ricardo Leitner13aa8772017-10-03 19:20:14 -03003967static int sctp_setsockopt_scheduler(struct sock *sk,
3968 char __user *optval,
3969 unsigned int optlen)
3970{
3971 struct sctp_association *asoc;
3972 struct sctp_assoc_value params;
3973 int retval = -EINVAL;
3974
3975 if (optlen < sizeof(params))
3976 goto out;
3977
3978 optlen = sizeof(params);
3979 if (copy_from_user(&params, optval, optlen)) {
3980 retval = -EFAULT;
3981 goto out;
3982 }
3983
3984 if (params.assoc_value > SCTP_SS_MAX)
3985 goto out;
3986
3987 asoc = sctp_id2assoc(sk, params.assoc_id);
3988 if (!asoc)
3989 goto out;
3990
3991 retval = sctp_sched_set_sched(asoc, params.assoc_value);
3992
3993out:
3994 return retval;
3995}
3996
Marcelo Ricardo Leitner0ccdf3c2017-10-03 19:20:15 -03003997static int sctp_setsockopt_scheduler_value(struct sock *sk,
3998 char __user *optval,
3999 unsigned int optlen)
4000{
4001 struct sctp_association *asoc;
4002 struct sctp_stream_value params;
4003 int retval = -EINVAL;
4004
4005 if (optlen < sizeof(params))
4006 goto out;
4007
4008 optlen = sizeof(params);
4009 if (copy_from_user(&params, optval, optlen)) {
4010 retval = -EFAULT;
4011 goto out;
4012 }
4013
4014 asoc = sctp_id2assoc(sk, params.assoc_id);
4015 if (!asoc)
4016 goto out;
4017
4018 retval = sctp_sched_set_value(asoc, params.stream_id,
4019 params.stream_value, GFP_KERNEL);
4020
4021out:
4022 return retval;
4023}
4024
Xin Long772a5862017-12-08 21:03:58 +08004025static int sctp_setsockopt_interleaving_supported(struct sock *sk,
4026 char __user *optval,
4027 unsigned int optlen)
4028{
4029 struct sctp_sock *sp = sctp_sk(sk);
4030 struct net *net = sock_net(sk);
4031 struct sctp_assoc_value params;
4032 int retval = -EINVAL;
4033
4034 if (optlen < sizeof(params))
4035 goto out;
4036
4037 optlen = sizeof(params);
4038 if (copy_from_user(&params, optval, optlen)) {
4039 retval = -EFAULT;
4040 goto out;
4041 }
4042
4043 if (params.assoc_id)
4044 goto out;
4045
4046 if (!net->sctp.intl_enable || !sp->frag_interleave) {
4047 retval = -EPERM;
4048 goto out;
4049 }
4050
4051 sp->strm_interleave = !!params.assoc_value;
4052
4053 retval = 0;
4054
4055out:
4056 return retval;
4057}
4058
Linus Torvalds1da177e2005-04-16 15:20:36 -07004059/* API 6.2 setsockopt(), getsockopt()
4060 *
4061 * Applications use setsockopt() and getsockopt() to set or retrieve
4062 * socket options. Socket options are used to change the default
4063 * behavior of sockets calls. They are described in Section 7.
4064 *
4065 * The syntax is:
4066 *
4067 * ret = getsockopt(int sd, int level, int optname, void __user *optval,
4068 * int __user *optlen);
4069 * ret = setsockopt(int sd, int level, int optname, const void __user *optval,
4070 * int optlen);
4071 *
4072 * sd - the socket descript.
4073 * level - set to IPPROTO_SCTP for all SCTP options.
4074 * optname - the option name.
4075 * optval - the buffer to store the value of the option.
4076 * optlen - the size of the buffer.
4077 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004078static int sctp_setsockopt(struct sock *sk, int level, int optname,
4079 char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004080{
4081 int retval = 0;
4082
Daniel Borkmannbb333812013-06-28 19:49:40 +02004083 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004084
4085 /* I can hardly begin to describe how wrong this is. This is
4086 * so broken as to be worse than useless. The API draft
4087 * REALLY is NOT helpful here... I am not convinced that the
4088 * semantics of setsockopt() with a level OTHER THAN SOL_SCTP
4089 * are at all well-founded.
4090 */
4091 if (level != SOL_SCTP) {
4092 struct sctp_af *af = sctp_sk(sk)->pf->af;
4093 retval = af->setsockopt(sk, level, optname, optval, optlen);
4094 goto out_nounlock;
4095 }
4096
wangweidong048ed4b2014-01-21 15:44:11 +08004097 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004098
4099 switch (optname) {
4100 case SCTP_SOCKOPT_BINDX_ADD:
4101 /* 'optlen' is the size of the addresses buffer. */
4102 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
4103 optlen, SCTP_BINDX_ADD_ADDR);
4104 break;
4105
4106 case SCTP_SOCKOPT_BINDX_REM:
4107 /* 'optlen' is the size of the addresses buffer. */
4108 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
4109 optlen, SCTP_BINDX_REM_ADDR);
4110 break;
4111
Vlad Yasevich88a0a942008-05-09 15:14:11 -07004112 case SCTP_SOCKOPT_CONNECTX_OLD:
4113 /* 'optlen' is the size of the addresses buffer. */
4114 retval = sctp_setsockopt_connectx_old(sk,
4115 (struct sockaddr __user *)optval,
4116 optlen);
4117 break;
4118
Frank Filz3f7a87d2005-06-20 13:14:57 -07004119 case SCTP_SOCKOPT_CONNECTX:
4120 /* 'optlen' is the size of the addresses buffer. */
Vlad Yasevich88a0a942008-05-09 15:14:11 -07004121 retval = sctp_setsockopt_connectx(sk,
4122 (struct sockaddr __user *)optval,
4123 optlen);
Frank Filz3f7a87d2005-06-20 13:14:57 -07004124 break;
4125
Linus Torvalds1da177e2005-04-16 15:20:36 -07004126 case SCTP_DISABLE_FRAGMENTS:
4127 retval = sctp_setsockopt_disable_fragments(sk, optval, optlen);
4128 break;
4129
4130 case SCTP_EVENTS:
4131 retval = sctp_setsockopt_events(sk, optval, optlen);
4132 break;
4133
4134 case SCTP_AUTOCLOSE:
4135 retval = sctp_setsockopt_autoclose(sk, optval, optlen);
4136 break;
4137
4138 case SCTP_PEER_ADDR_PARAMS:
4139 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen);
4140 break;
4141
Shan Wei4580ccc2011-01-18 22:39:00 +00004142 case SCTP_DELAYED_SACK:
Wei Yongjund364d922008-05-09 15:13:26 -07004143 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen);
Frank Filz77086102005-12-22 11:37:30 -08004144 break;
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07004145 case SCTP_PARTIAL_DELIVERY_POINT:
4146 retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen);
4147 break;
Frank Filz77086102005-12-22 11:37:30 -08004148
Linus Torvalds1da177e2005-04-16 15:20:36 -07004149 case SCTP_INITMSG:
4150 retval = sctp_setsockopt_initmsg(sk, optval, optlen);
4151 break;
4152 case SCTP_DEFAULT_SEND_PARAM:
4153 retval = sctp_setsockopt_default_send_param(sk, optval,
4154 optlen);
4155 break;
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02004156 case SCTP_DEFAULT_SNDINFO:
4157 retval = sctp_setsockopt_default_sndinfo(sk, optval, optlen);
4158 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004159 case SCTP_PRIMARY_ADDR:
4160 retval = sctp_setsockopt_primary_addr(sk, optval, optlen);
4161 break;
4162 case SCTP_SET_PEER_PRIMARY_ADDR:
4163 retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen);
4164 break;
4165 case SCTP_NODELAY:
4166 retval = sctp_setsockopt_nodelay(sk, optval, optlen);
4167 break;
4168 case SCTP_RTOINFO:
4169 retval = sctp_setsockopt_rtoinfo(sk, optval, optlen);
4170 break;
4171 case SCTP_ASSOCINFO:
4172 retval = sctp_setsockopt_associnfo(sk, optval, optlen);
4173 break;
4174 case SCTP_I_WANT_MAPPED_V4_ADDR:
4175 retval = sctp_setsockopt_mappedv4(sk, optval, optlen);
4176 break;
4177 case SCTP_MAXSEG:
4178 retval = sctp_setsockopt_maxseg(sk, optval, optlen);
4179 break;
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08004180 case SCTP_ADAPTATION_LAYER:
4181 retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004182 break;
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08004183 case SCTP_CONTEXT:
4184 retval = sctp_setsockopt_context(sk, optval, optlen);
4185 break;
Vlad Yasevichb6e13312007-04-20 12:23:15 -07004186 case SCTP_FRAGMENT_INTERLEAVE:
4187 retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen);
4188 break;
Vlad Yasevich70331572007-03-23 11:34:36 -07004189 case SCTP_MAX_BURST:
4190 retval = sctp_setsockopt_maxburst(sk, optval, optlen);
4191 break;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07004192 case SCTP_AUTH_CHUNK:
4193 retval = sctp_setsockopt_auth_chunk(sk, optval, optlen);
4194 break;
4195 case SCTP_HMAC_IDENT:
4196 retval = sctp_setsockopt_hmac_ident(sk, optval, optlen);
4197 break;
4198 case SCTP_AUTH_KEY:
4199 retval = sctp_setsockopt_auth_key(sk, optval, optlen);
4200 break;
4201 case SCTP_AUTH_ACTIVE_KEY:
4202 retval = sctp_setsockopt_active_key(sk, optval, optlen);
4203 break;
4204 case SCTP_AUTH_DELETE_KEY:
4205 retval = sctp_setsockopt_del_key(sk, optval, optlen);
4206 break;
Michio Honda7dc04d72011-04-26 20:16:31 +09004207 case SCTP_AUTO_ASCONF:
4208 retval = sctp_setsockopt_auto_asconf(sk, optval, optlen);
4209 break;
Neil Horman5aa93bc2012-07-21 07:56:07 +00004210 case SCTP_PEER_ADDR_THLDS:
4211 retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen);
4212 break;
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02004213 case SCTP_RECVRCVINFO:
4214 retval = sctp_setsockopt_recvrcvinfo(sk, optval, optlen);
4215 break;
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02004216 case SCTP_RECVNXTINFO:
4217 retval = sctp_setsockopt_recvnxtinfo(sk, optval, optlen);
4218 break;
Xin Long28aa4c22016-07-09 19:47:40 +08004219 case SCTP_PR_SUPPORTED:
4220 retval = sctp_setsockopt_pr_supported(sk, optval, optlen);
4221 break;
Xin Longf959fb42016-07-09 19:47:41 +08004222 case SCTP_DEFAULT_PRINFO:
4223 retval = sctp_setsockopt_default_prinfo(sk, optval, optlen);
4224 break;
Xin Longc0d8bab2017-03-10 12:11:12 +08004225 case SCTP_RECONFIG_SUPPORTED:
4226 retval = sctp_setsockopt_reconfig_supported(sk, optval, optlen);
4227 break;
Xin Long9fb657a2017-01-18 00:44:46 +08004228 case SCTP_ENABLE_STREAM_RESET:
4229 retval = sctp_setsockopt_enable_strreset(sk, optval, optlen);
4230 break;
Xin Long7f9d68a2017-01-18 00:44:47 +08004231 case SCTP_RESET_STREAMS:
4232 retval = sctp_setsockopt_reset_streams(sk, optval, optlen);
4233 break;
Xin Longa92ce1a2017-02-09 01:18:18 +08004234 case SCTP_RESET_ASSOC:
4235 retval = sctp_setsockopt_reset_assoc(sk, optval, optlen);
4236 break;
Xin Long242bd2d2017-02-09 01:18:20 +08004237 case SCTP_ADD_STREAMS:
4238 retval = sctp_setsockopt_add_streams(sk, optval, optlen);
4239 break;
Marcelo Ricardo Leitner13aa8772017-10-03 19:20:14 -03004240 case SCTP_STREAM_SCHEDULER:
4241 retval = sctp_setsockopt_scheduler(sk, optval, optlen);
4242 break;
Marcelo Ricardo Leitner0ccdf3c2017-10-03 19:20:15 -03004243 case SCTP_STREAM_SCHEDULER_VALUE:
4244 retval = sctp_setsockopt_scheduler_value(sk, optval, optlen);
4245 break;
Xin Long772a5862017-12-08 21:03:58 +08004246 case SCTP_INTERLEAVING_SUPPORTED:
4247 retval = sctp_setsockopt_interleaving_supported(sk, optval,
4248 optlen);
4249 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004250 default:
4251 retval = -ENOPROTOOPT;
4252 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07004253 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004254
wangweidong048ed4b2014-01-21 15:44:11 +08004255 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004256
4257out_nounlock:
4258 return retval;
4259}
4260
4261/* API 3.1.6 connect() - UDP Style Syntax
4262 *
4263 * An application may use the connect() call in the UDP model to initiate an
4264 * association without sending data.
4265 *
4266 * The syntax is:
4267 *
4268 * ret = connect(int sd, const struct sockaddr *nam, socklen_t len);
4269 *
4270 * sd: the socket descriptor to have a new association added to.
4271 *
4272 * nam: the address structure (either struct sockaddr_in or struct
4273 * sockaddr_in6 defined in RFC2553 [7]).
4274 *
4275 * len: the size of the address.
4276 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004277static int sctp_connect(struct sock *sk, struct sockaddr *addr,
4278 int addr_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004279{
Linus Torvalds1da177e2005-04-16 15:20:36 -07004280 int err = 0;
Frank Filz3f7a87d2005-06-20 13:14:57 -07004281 struct sctp_af *af;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004282
wangweidong048ed4b2014-01-21 15:44:11 +08004283 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004284
Daniel Borkmannbb333812013-06-28 19:49:40 +02004285 pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk,
4286 addr, addr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004287
Frank Filz3f7a87d2005-06-20 13:14:57 -07004288 /* Validate addr_len before calling common connect/connectx routine. */
4289 af = sctp_get_af_specific(addr->sa_family);
4290 if (!af || addr_len < af->sockaddr_len) {
4291 err = -EINVAL;
4292 } else {
4293 /* Pass correct addr len to common routine (so it knows there
4294 * is only one address being passed.
4295 */
Vlad Yasevich88a0a942008-05-09 15:14:11 -07004296 err = __sctp_connect(sk, addr, af->sockaddr_len, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004297 }
4298
wangweidong048ed4b2014-01-21 15:44:11 +08004299 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004300 return err;
4301}
4302
4303/* FIXME: Write comments. */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004304static int sctp_disconnect(struct sock *sk, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004305{
4306 return -EOPNOTSUPP; /* STUB */
4307}
4308
4309/* 4.1.4 accept() - TCP Style Syntax
4310 *
4311 * Applications use accept() call to remove an established SCTP
4312 * association from the accept queue of the endpoint. A new socket
4313 * descriptor will be returned from accept() to represent the newly
4314 * formed association.
4315 */
David Howellscdfbabf2017-03-09 08:09:05 +00004316static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004317{
4318 struct sctp_sock *sp;
4319 struct sctp_endpoint *ep;
4320 struct sock *newsk = NULL;
4321 struct sctp_association *asoc;
4322 long timeo;
4323 int error = 0;
4324
wangweidong048ed4b2014-01-21 15:44:11 +08004325 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004326
4327 sp = sctp_sk(sk);
4328 ep = sp->ep;
4329
4330 if (!sctp_style(sk, TCP)) {
4331 error = -EOPNOTSUPP;
4332 goto out;
4333 }
4334
4335 if (!sctp_sstate(sk, LISTENING)) {
4336 error = -EINVAL;
4337 goto out;
4338 }
4339
Sridhar Samudrala8abfedd2006-08-22 00:24:09 -07004340 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004341
4342 error = sctp_wait_for_accept(sk, timeo);
4343 if (error)
4344 goto out;
4345
4346 /* We treat the list of associations on the endpoint as the accept
4347 * queue and pick the first association on the list.
4348 */
4349 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs);
4350
David Howellscdfbabf2017-03-09 08:09:05 +00004351 newsk = sp->pf->create_accept_sk(sk, asoc, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004352 if (!newsk) {
4353 error = -ENOMEM;
4354 goto out;
4355 }
4356
4357 /* Populate the fields of the newsk from the oldsk and migrate the
4358 * asoc to the newsk.
4359 */
4360 sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP);
4361
4362out:
wangweidong048ed4b2014-01-21 15:44:11 +08004363 release_sock(sk);
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09004364 *err = error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004365 return newsk;
4366}
4367
4368/* The SCTP ioctl handler. */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004369static int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004370{
Diego Elio 'Flameeyes' Pettenò65040c32010-09-03 03:47:03 +00004371 int rc = -ENOTCONN;
4372
wangweidong048ed4b2014-01-21 15:44:11 +08004373 lock_sock(sk);
Diego Elio 'Flameeyes' Pettenò65040c32010-09-03 03:47:03 +00004374
4375 /*
4376 * SEQPACKET-style sockets in LISTENING state are valid, for
4377 * SCTP, so only discard TCP-style sockets in LISTENING state.
4378 */
4379 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
4380 goto out;
4381
4382 switch (cmd) {
4383 case SIOCINQ: {
4384 struct sk_buff *skb;
4385 unsigned int amount = 0;
4386
4387 skb = skb_peek(&sk->sk_receive_queue);
4388 if (skb != NULL) {
4389 /*
4390 * We will only return the amount of this packet since
4391 * that is all that will be read.
4392 */
4393 amount = skb->len;
4394 }
4395 rc = put_user(amount, (int __user *)arg);
Diego Elio 'Flameeyes' Pettenò65040c32010-09-03 03:47:03 +00004396 break;
David S. Miller9a7241c2010-10-03 22:14:37 -07004397 }
Diego Elio 'Flameeyes' Pettenò65040c32010-09-03 03:47:03 +00004398 default:
4399 rc = -ENOIOCTLCMD;
4400 break;
4401 }
4402out:
wangweidong048ed4b2014-01-21 15:44:11 +08004403 release_sock(sk);
Diego Elio 'Flameeyes' Pettenò65040c32010-09-03 03:47:03 +00004404 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004405}
4406
4407/* This is the function which gets called during socket creation to
4408 * initialized the SCTP-specific portion of the sock.
4409 * The sock structure should already be zero-filled memory.
4410 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004411static int sctp_init_sock(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004412{
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004413 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004414 struct sctp_sock *sp;
4415
Daniel Borkmannbb333812013-06-28 19:49:40 +02004416 pr_debug("%s: sk:%p\n", __func__, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004417
4418 sp = sctp_sk(sk);
4419
4420 /* Initialize the SCTP per socket area. */
4421 switch (sk->sk_type) {
4422 case SOCK_SEQPACKET:
4423 sp->type = SCTP_SOCKET_UDP;
4424 break;
4425 case SOCK_STREAM:
4426 sp->type = SCTP_SOCKET_TCP;
4427 break;
4428 default:
4429 return -ESOCKTNOSUPPORT;
4430 }
4431
Marcelo Ricardo Leitner90017ac2016-06-02 15:05:43 -03004432 sk->sk_gso_type = SKB_GSO_SCTP;
4433
Linus Torvalds1da177e2005-04-16 15:20:36 -07004434 /* Initialize default send parameters. These parameters can be
4435 * modified with the SCTP_DEFAULT_SEND_PARAM socket option.
4436 */
4437 sp->default_stream = 0;
4438 sp->default_ppid = 0;
4439 sp->default_flags = 0;
4440 sp->default_context = 0;
4441 sp->default_timetolive = 0;
4442
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08004443 sp->default_rcv_context = 0;
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004444 sp->max_burst = net->sctp.max_burst;
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08004445
Neil Horman3c681982012-10-24 09:20:03 +00004446 sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg;
4447
Linus Torvalds1da177e2005-04-16 15:20:36 -07004448 /* Initialize default setup parameters. These parameters
4449 * can be modified with the SCTP_INITMSG socket option or
4450 * overridden by the SCTP_INIT CMSG.
4451 */
4452 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
4453 sp->initmsg.sinit_max_instreams = sctp_max_instreams;
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004454 sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init;
4455 sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004456
4457 /* Initialize default RTO related parameters. These parameters can
4458 * be modified for with the SCTP_RTOINFO socket option.
4459 */
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004460 sp->rtoinfo.srto_initial = net->sctp.rto_initial;
4461 sp->rtoinfo.srto_max = net->sctp.rto_max;
4462 sp->rtoinfo.srto_min = net->sctp.rto_min;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004463
4464 /* Initialize default association related parameters. These parameters
4465 * can be modified with the SCTP_ASSOCINFO socket option.
4466 */
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004467 sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004468 sp->assocparams.sasoc_number_peer_destinations = 0;
4469 sp->assocparams.sasoc_peer_rwnd = 0;
4470 sp->assocparams.sasoc_local_rwnd = 0;
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004471 sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004472
4473 /* Initialize default event subscriptions. By default, all the
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09004474 * options are off.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004475 */
4476 memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe));
4477
4478 /* Default Peer Address Parameters. These defaults can
4479 * be modified via SCTP_PEER_ADDR_PARAMS
4480 */
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004481 sp->hbinterval = net->sctp.hb_interval;
4482 sp->pathmaxrxt = net->sctp.max_retrans_path;
wangweidong4e2d52b2013-12-23 12:16:54 +08004483 sp->pathmtu = 0; /* allow default discovery */
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004484 sp->sackdelay = net->sctp.sack_timeout;
Vlad Yasevich7bfe8bdb2008-06-09 15:45:05 -07004485 sp->sackfreq = 2;
Frank Filz52ccb8e2005-12-22 11:36:46 -08004486 sp->param_flags = SPP_HB_ENABLE |
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09004487 SPP_PMTUD_ENABLE |
4488 SPP_SACKDELAY_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004489
4490 /* If enabled no SCTP message fragmentation will be performed.
4491 * Configure through SCTP_DISABLE_FRAGMENTS socket option.
4492 */
4493 sp->disable_fragments = 0;
4494
Sridhar Samudrala208edef2006-09-29 17:08:01 -07004495 /* Enable Nagle algorithm by default. */
4496 sp->nodelay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004497
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02004498 sp->recvrcvinfo = 0;
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02004499 sp->recvnxtinfo = 0;
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02004500
Linus Torvalds1da177e2005-04-16 15:20:36 -07004501 /* Enable by default. */
4502 sp->v4mapped = 1;
4503
4504 /* Auto-close idle associations after the configured
4505 * number of seconds. A value of 0 disables this
4506 * feature. Configure through the SCTP_AUTOCLOSE socket option,
4507 * for UDP-style sockets only.
4508 */
4509 sp->autoclose = 0;
4510
4511 /* User specified fragmentation limit. */
4512 sp->user_frag = 0;
4513
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08004514 sp->adaptation_ind = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004515
4516 sp->pf = sctp_get_pf_specific(sk->sk_family);
4517
4518 /* Control variables for partial data delivery. */
Vlad Yasevichb6e13312007-04-20 12:23:15 -07004519 atomic_set(&sp->pd_mode, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004520 skb_queue_head_init(&sp->pd_lobby);
Vlad Yasevichb6e13312007-04-20 12:23:15 -07004521 sp->frag_interleave = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004522
4523 /* Create a per socket endpoint structure. Even if we
4524 * change the data structure relationships, this may still
4525 * be useful for storing pre-connect address information.
4526 */
Daniel Borkmannc164b832013-06-14 18:24:06 +02004527 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL);
4528 if (!sp->ep)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004529 return -ENOMEM;
4530
Linus Torvalds1da177e2005-04-16 15:20:36 -07004531 sp->hmac = NULL;
4532
Daniel Borkmann0a2fbac2013-06-25 18:17:29 +02004533 sk->sk_destruct = sctp_destruct_sock;
4534
Linus Torvalds1da177e2005-04-16 15:20:36 -07004535 SCTP_DBG_OBJCNT_INC(sock);
David S. Miller6f756a82008-11-23 17:34:03 -08004536
4537 local_bh_disable();
Vlad Yasevich81419d82010-04-28 08:47:20 +00004538 percpu_counter_inc(&sctp_sockets_allocated);
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004539 sock_prot_inuse_add(net, sk->sk_prot, 1);
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03004540
4541 /* Nothing can fail after this block, otherwise
4542 * sctp_destroy_sock() will be called without addr_wq_lock held
4543 */
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004544 if (net->sctp.default_auto_asconf) {
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03004545 spin_lock(&sock_net(sk)->sctp.addr_wq_lock);
Michio Honda9f7d6532011-04-26 19:32:51 +09004546 list_add_tail(&sp->auto_asconf_list,
Eric W. Biedermane1fc3b12012-08-07 07:29:57 +00004547 &net->sctp.auto_asconf_splist);
Michio Honda9f7d6532011-04-26 19:32:51 +09004548 sp->do_auto_asconf = 1;
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03004549 spin_unlock(&sock_net(sk)->sctp.addr_wq_lock);
4550 } else {
Michio Honda9f7d6532011-04-26 19:32:51 +09004551 sp->do_auto_asconf = 0;
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03004552 }
4553
David S. Miller6f756a82008-11-23 17:34:03 -08004554 local_bh_enable();
4555
Linus Torvalds1da177e2005-04-16 15:20:36 -07004556 return 0;
4557}
4558
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03004559/* Cleanup any SCTP per socket resources. Must be called with
4560 * sock_net(sk)->sctp.addr_wq_lock held if sp->do_auto_asconf is true
4561 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004562static void sctp_destroy_sock(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004563{
Michio Honda9f7d6532011-04-26 19:32:51 +09004564 struct sctp_sock *sp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004565
Daniel Borkmannbb333812013-06-28 19:49:40 +02004566 pr_debug("%s: sk:%p\n", __func__, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004567
4568 /* Release our hold on the endpoint. */
Michio Honda9f7d6532011-04-26 19:32:51 +09004569 sp = sctp_sk(sk);
Daniel Borkmann1abd1652013-06-06 15:53:47 +02004570 /* This could happen during socket init, thus we bail out
4571 * early, since the rest of the below is not setup either.
4572 */
4573 if (sp->ep == NULL)
4574 return;
4575
Michio Honda9f7d6532011-04-26 19:32:51 +09004576 if (sp->do_auto_asconf) {
4577 sp->do_auto_asconf = 0;
4578 list_del(&sp->auto_asconf_list);
4579 }
4580 sctp_endpoint_free(sp->ep);
Eric Dumazet5bc0b3b2008-11-25 13:53:27 -08004581 local_bh_disable();
Vlad Yasevich81419d82010-04-28 08:47:20 +00004582 percpu_counter_dec(&sctp_sockets_allocated);
Eric Dumazet9a57f7f2008-11-17 02:41:00 -08004583 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
Eric Dumazet5bc0b3b2008-11-25 13:53:27 -08004584 local_bh_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07004585}
4586
Daniel Borkmann0a2fbac2013-06-25 18:17:29 +02004587/* Triggered when there are no references on the socket anymore */
4588static void sctp_destruct_sock(struct sock *sk)
4589{
4590 struct sctp_sock *sp = sctp_sk(sk);
4591
4592 /* Free up the HMAC transform. */
Herbert Xu5821c762016-01-24 21:20:12 +08004593 crypto_free_shash(sp->hmac);
Daniel Borkmann0a2fbac2013-06-25 18:17:29 +02004594
4595 inet_sock_destruct(sk);
4596}
4597
Linus Torvalds1da177e2005-04-16 15:20:36 -07004598/* API 4.1.7 shutdown() - TCP Style Syntax
4599 * int shutdown(int socket, int how);
4600 *
4601 * sd - the socket descriptor of the association to be closed.
4602 * how - Specifies the type of shutdown. The values are
4603 * as follows:
4604 * SHUT_RD
4605 * Disables further receive operations. No SCTP
4606 * protocol action is taken.
4607 * SHUT_WR
4608 * Disables further send operations, and initiates
4609 * the SCTP shutdown sequence.
4610 * SHUT_RDWR
4611 * Disables further send and receive operations
4612 * and initiates the SCTP shutdown sequence.
4613 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02004614static void sctp_shutdown(struct sock *sk, int how)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004615{
Eric W. Biederman55e26eb2012-08-07 07:25:24 +00004616 struct net *net = sock_net(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004617 struct sctp_endpoint *ep;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004618
4619 if (!sctp_style(sk, TCP))
4620 return;
4621
Xin Long5bf35dd2016-11-13 21:44:37 +08004622 ep = sctp_sk(sk)->ep;
4623 if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) {
4624 struct sctp_association *asoc;
4625
Xin Longd46e4162016-06-09 22:48:18 +08004626 sk->sk_state = SCTP_SS_CLOSING;
Xin Long5bf35dd2016-11-13 21:44:37 +08004627 asoc = list_entry(ep->asocs.next,
4628 struct sctp_association, asocs);
4629 sctp_primitive_SHUTDOWN(net, asoc, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004630 }
4631}
4632
Xin Long52c52a62016-04-14 15:35:30 +08004633int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
4634 struct sctp_info *info)
4635{
4636 struct sctp_transport *prim;
4637 struct list_head *pos;
4638 int mask;
4639
4640 memset(info, 0, sizeof(*info));
4641 if (!asoc) {
4642 struct sctp_sock *sp = sctp_sk(sk);
4643
4644 info->sctpi_s_autoclose = sp->autoclose;
4645 info->sctpi_s_adaptation_ind = sp->adaptation_ind;
4646 info->sctpi_s_pd_point = sp->pd_point;
4647 info->sctpi_s_nodelay = sp->nodelay;
4648 info->sctpi_s_disable_fragments = sp->disable_fragments;
4649 info->sctpi_s_v4mapped = sp->v4mapped;
4650 info->sctpi_s_frag_interleave = sp->frag_interleave;
Xin Long40eb90e92016-05-29 17:42:13 +08004651 info->sctpi_s_type = sp->type;
Xin Long52c52a62016-04-14 15:35:30 +08004652
4653 return 0;
4654 }
4655
4656 info->sctpi_tag = asoc->c.my_vtag;
4657 info->sctpi_state = asoc->state;
4658 info->sctpi_rwnd = asoc->a_rwnd;
4659 info->sctpi_unackdata = asoc->unack_data;
4660 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
Xin Longcee360a2017-05-31 16:36:31 +08004661 info->sctpi_instrms = asoc->stream.incnt;
4662 info->sctpi_outstrms = asoc->stream.outcnt;
Xin Long52c52a62016-04-14 15:35:30 +08004663 list_for_each(pos, &asoc->base.inqueue.in_chunk_list)
4664 info->sctpi_inqueue++;
4665 list_for_each(pos, &asoc->outqueue.out_chunk_list)
4666 info->sctpi_outqueue++;
4667 info->sctpi_overall_error = asoc->overall_error_count;
4668 info->sctpi_max_burst = asoc->max_burst;
4669 info->sctpi_maxseg = asoc->frag_point;
4670 info->sctpi_peer_rwnd = asoc->peer.rwnd;
4671 info->sctpi_peer_tag = asoc->c.peer_vtag;
4672
4673 mask = asoc->peer.ecn_capable << 1;
4674 mask = (mask | asoc->peer.ipv4_address) << 1;
4675 mask = (mask | asoc->peer.ipv6_address) << 1;
4676 mask = (mask | asoc->peer.hostname_address) << 1;
4677 mask = (mask | asoc->peer.asconf_capable) << 1;
4678 mask = (mask | asoc->peer.prsctp_capable) << 1;
4679 mask = (mask | asoc->peer.auth_capable);
4680 info->sctpi_peer_capable = mask;
4681 mask = asoc->peer.sack_needed << 1;
4682 mask = (mask | asoc->peer.sack_generation) << 1;
4683 mask = (mask | asoc->peer.zero_window_announced);
4684 info->sctpi_peer_sack = mask;
4685
4686 info->sctpi_isacks = asoc->stats.isacks;
4687 info->sctpi_osacks = asoc->stats.osacks;
4688 info->sctpi_opackets = asoc->stats.opackets;
4689 info->sctpi_ipackets = asoc->stats.ipackets;
4690 info->sctpi_rtxchunks = asoc->stats.rtxchunks;
4691 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns;
4692 info->sctpi_idupchunks = asoc->stats.idupchunks;
4693 info->sctpi_gapcnt = asoc->stats.gapcnt;
4694 info->sctpi_ouodchunks = asoc->stats.ouodchunks;
4695 info->sctpi_iuodchunks = asoc->stats.iuodchunks;
4696 info->sctpi_oodchunks = asoc->stats.oodchunks;
4697 info->sctpi_iodchunks = asoc->stats.iodchunks;
4698 info->sctpi_octrlchunks = asoc->stats.octrlchunks;
4699 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks;
4700
4701 prim = asoc->peer.primary_path;
Stefano Brivioee6c88b2017-08-23 13:27:13 +02004702 memcpy(&info->sctpi_p_address, &prim->ipaddr, sizeof(prim->ipaddr));
Xin Long52c52a62016-04-14 15:35:30 +08004703 info->sctpi_p_state = prim->state;
4704 info->sctpi_p_cwnd = prim->cwnd;
4705 info->sctpi_p_srtt = prim->srtt;
4706 info->sctpi_p_rto = jiffies_to_msecs(prim->rto);
4707 info->sctpi_p_hbinterval = prim->hbinterval;
4708 info->sctpi_p_pathmaxrxt = prim->pathmaxrxt;
4709 info->sctpi_p_sackdelay = jiffies_to_msecs(prim->sackdelay);
4710 info->sctpi_p_ssthresh = prim->ssthresh;
4711 info->sctpi_p_partial_bytes_acked = prim->partial_bytes_acked;
4712 info->sctpi_p_flight_size = prim->flight_size;
4713 info->sctpi_p_error = prim->error_count;
4714
4715 return 0;
4716}
4717EXPORT_SYMBOL_GPL(sctp_get_sctp_info);
4718
Xin Long626d16f2016-04-14 15:35:31 +08004719/* use callback to avoid exporting the core structure */
Tom Herbert97a6ec42017-12-04 10:31:41 -08004720void sctp_transport_walk_start(struct rhashtable_iter *iter)
Xin Long626d16f2016-04-14 15:35:31 +08004721{
Xin Long7fda702f2016-11-15 23:23:11 +08004722 rhltable_walk_enter(&sctp_transport_hashtable, iter);
Xin Long626d16f2016-04-14 15:35:31 +08004723
Tom Herbert97a6ec42017-12-04 10:31:41 -08004724 rhashtable_walk_start(iter);
Xin Long626d16f2016-04-14 15:35:31 +08004725}
4726
4727void sctp_transport_walk_stop(struct rhashtable_iter *iter)
4728{
4729 rhashtable_walk_stop(iter);
4730 rhashtable_walk_exit(iter);
4731}
4732
4733struct sctp_transport *sctp_transport_get_next(struct net *net,
4734 struct rhashtable_iter *iter)
4735{
4736 struct sctp_transport *t;
4737
4738 t = rhashtable_walk_next(iter);
4739 for (; t; t = rhashtable_walk_next(iter)) {
4740 if (IS_ERR(t)) {
4741 if (PTR_ERR(t) == -EAGAIN)
4742 continue;
4743 break;
4744 }
4745
4746 if (net_eq(sock_net(t->asoc->base.sk), net) &&
4747 t->asoc->peer.primary_path == t)
4748 break;
4749 }
4750
4751 return t;
4752}
4753
4754struct sctp_transport *sctp_transport_get_idx(struct net *net,
4755 struct rhashtable_iter *iter,
4756 int pos)
4757{
4758 void *obj = SEQ_START_TOKEN;
4759
4760 while (pos && (obj = sctp_transport_get_next(net, iter)) &&
4761 !IS_ERR(obj))
4762 pos--;
4763
4764 return obj;
4765}
4766
4767int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *),
4768 void *p) {
4769 int err = 0;
4770 int hash = 0;
4771 struct sctp_ep_common *epb;
4772 struct sctp_hashbucket *head;
4773
4774 for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize;
4775 hash++, head++) {
Xin Long581409d2017-06-10 14:48:14 +08004776 read_lock_bh(&head->lock);
Xin Long626d16f2016-04-14 15:35:31 +08004777 sctp_for_each_hentry(epb, &head->chain) {
4778 err = cb(sctp_ep(epb), p);
4779 if (err)
4780 break;
4781 }
Xin Long581409d2017-06-10 14:48:14 +08004782 read_unlock_bh(&head->lock);
Xin Long626d16f2016-04-14 15:35:31 +08004783 }
4784
4785 return err;
4786}
4787EXPORT_SYMBOL_GPL(sctp_for_each_endpoint);
4788
4789int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
4790 struct net *net,
4791 const union sctp_addr *laddr,
4792 const union sctp_addr *paddr, void *p)
4793{
4794 struct sctp_transport *transport;
Xin Long08abb792016-12-15 23:05:52 +08004795 int err;
Xin Long626d16f2016-04-14 15:35:31 +08004796
4797 rcu_read_lock();
4798 transport = sctp_addrs_lookup_transport(net, laddr, paddr);
Xin Long626d16f2016-04-14 15:35:31 +08004799 rcu_read_unlock();
Xin Long08abb792016-12-15 23:05:52 +08004800 if (!transport)
4801 return -ENOENT;
4802
Xin Long1cceda782016-09-29 02:55:44 +08004803 err = cb(transport, p);
Xin Longcd26da42016-10-31 20:32:31 +08004804 sctp_transport_put(transport);
Xin Long1cceda782016-09-29 02:55:44 +08004805
Xin Long626d16f2016-04-14 15:35:31 +08004806 return err;
4807}
4808EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);
4809
4810int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
Xin Longd25adbe2017-09-15 11:02:21 +08004811 int (*cb_done)(struct sctp_transport *, void *),
4812 struct net *net, int *pos, void *p) {
Xin Long626d16f2016-04-14 15:35:31 +08004813 struct rhashtable_iter hti;
Xin Longd25adbe2017-09-15 11:02:21 +08004814 struct sctp_transport *tsp;
Tom Herbert97a6ec42017-12-04 10:31:41 -08004815 int ret = 0;
Xin Long626d16f2016-04-14 15:35:31 +08004816
Xin Longd25adbe2017-09-15 11:02:21 +08004817again:
Tom Herbert97a6ec42017-12-04 10:31:41 -08004818 sctp_transport_walk_start(&hti);
Xin Long626d16f2016-04-14 15:35:31 +08004819
Xin Longd25adbe2017-09-15 11:02:21 +08004820 tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
4821 for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {
4822 if (!sctp_transport_hold(tsp))
Xin Long626d16f2016-04-14 15:35:31 +08004823 continue;
Xin Longd25adbe2017-09-15 11:02:21 +08004824 ret = cb(tsp, p);
4825 if (ret)
Xin Long626d16f2016-04-14 15:35:31 +08004826 break;
Xin Longd25adbe2017-09-15 11:02:21 +08004827 (*pos)++;
4828 sctp_transport_put(tsp);
Xin Long626d16f2016-04-14 15:35:31 +08004829 }
Xin Long626d16f2016-04-14 15:35:31 +08004830 sctp_transport_walk_stop(&hti);
Xin Long53fa1032016-04-14 15:35:35 +08004831
Xin Longd25adbe2017-09-15 11:02:21 +08004832 if (ret) {
4833 if (cb_done && !cb_done(tsp, p)) {
4834 (*pos)++;
4835 sctp_transport_put(tsp);
4836 goto again;
4837 }
4838 sctp_transport_put(tsp);
4839 }
4840
4841 return ret;
Xin Long626d16f2016-04-14 15:35:31 +08004842}
4843EXPORT_SYMBOL_GPL(sctp_for_each_transport);
4844
Linus Torvalds1da177e2005-04-16 15:20:36 -07004845/* 7.2.1 Association Status (SCTP_STATUS)
4846
4847 * Applications can retrieve current status information about an
4848 * association, including association state, peer receiver window size,
4849 * number of unacked data chunks, and number of data chunks pending
4850 * receipt. This information is read-only.
4851 */
4852static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
4853 char __user *optval,
4854 int __user *optlen)
4855{
4856 struct sctp_status status;
4857 struct sctp_association *asoc = NULL;
4858 struct sctp_transport *transport;
4859 sctp_assoc_t associd;
4860 int retval = 0;
4861
Neil Horman408f22e2007-06-16 14:03:45 -04004862 if (len < sizeof(status)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004863 retval = -EINVAL;
4864 goto out;
4865 }
4866
Neil Horman408f22e2007-06-16 14:03:45 -04004867 len = sizeof(status);
4868 if (copy_from_user(&status, optval, len)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004869 retval = -EFAULT;
4870 goto out;
4871 }
4872
4873 associd = status.sstat_assoc_id;
4874 asoc = sctp_id2assoc(sk, associd);
4875 if (!asoc) {
4876 retval = -EINVAL;
4877 goto out;
4878 }
4879
4880 transport = asoc->peer.primary_path;
4881
4882 status.sstat_assoc_id = sctp_assoc2id(asoc);
Daniel Borkmann38ab1fa2014-08-28 15:28:26 +02004883 status.sstat_state = sctp_assoc_to_state(asoc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004884 status.sstat_rwnd = asoc->peer.rwnd;
4885 status.sstat_unackdata = asoc->unack_data;
4886
4887 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
Xin Longcee360a2017-05-31 16:36:31 +08004888 status.sstat_instrms = asoc->stream.incnt;
4889 status.sstat_outstrms = asoc->stream.outcnt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004890 status.sstat_fragmentation_point = asoc->frag_point;
4891 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
Al Viro8cec6b82006-11-20 17:23:01 -08004892 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr,
4893 transport->af_specific->sockaddr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004894 /* Map ipv4 address into v4-mapped-on-v6 address. */
Jason Gunthorpe299ee122014-07-30 12:40:53 -06004895 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk),
Linus Torvalds1da177e2005-04-16 15:20:36 -07004896 (union sctp_addr *)&status.sstat_primary.spinfo_address);
Frank Filz3f7a87d2005-06-20 13:14:57 -07004897 status.sstat_primary.spinfo_state = transport->state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004898 status.sstat_primary.spinfo_cwnd = transport->cwnd;
4899 status.sstat_primary.spinfo_srtt = transport->srtt;
4900 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto);
Frank Filz52ccb8e2005-12-22 11:36:46 -08004901 status.sstat_primary.spinfo_mtu = transport->pathmtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004902
Frank Filz3f7a87d2005-06-20 13:14:57 -07004903 if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
4904 status.sstat_primary.spinfo_state = SCTP_ACTIVE;
4905
Linus Torvalds1da177e2005-04-16 15:20:36 -07004906 if (put_user(len, optlen)) {
4907 retval = -EFAULT;
4908 goto out;
4909 }
4910
Daniel Borkmannbb333812013-06-28 19:49:40 +02004911 pr_debug("%s: len:%d, state:%d, rwnd:%d, assoc_id:%d\n",
4912 __func__, len, status.sstat_state, status.sstat_rwnd,
4913 status.sstat_assoc_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004914
4915 if (copy_to_user(optval, &status, len)) {
4916 retval = -EFAULT;
4917 goto out;
4918 }
4919
4920out:
Eric Dumazeta02cec22010-09-22 20:43:57 +00004921 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004922}
4923
4924
4925/* 7.2.2 Peer Address Information (SCTP_GET_PEER_ADDR_INFO)
4926 *
4927 * Applications can retrieve information about a specific peer address
4928 * of an association, including its reachability state, congestion
4929 * window, and retransmission timer values. This information is
4930 * read-only.
4931 */
4932static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
4933 char __user *optval,
4934 int __user *optlen)
4935{
4936 struct sctp_paddrinfo pinfo;
4937 struct sctp_transport *transport;
4938 int retval = 0;
4939
Neil Horman408f22e2007-06-16 14:03:45 -04004940 if (len < sizeof(pinfo)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004941 retval = -EINVAL;
4942 goto out;
4943 }
4944
Neil Horman408f22e2007-06-16 14:03:45 -04004945 len = sizeof(pinfo);
4946 if (copy_from_user(&pinfo, optval, len)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004947 retval = -EFAULT;
4948 goto out;
4949 }
4950
4951 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address,
4952 pinfo.spinfo_assoc_id);
4953 if (!transport)
4954 return -EINVAL;
4955
4956 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
Frank Filz3f7a87d2005-06-20 13:14:57 -07004957 pinfo.spinfo_state = transport->state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004958 pinfo.spinfo_cwnd = transport->cwnd;
4959 pinfo.spinfo_srtt = transport->srtt;
4960 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
Frank Filz52ccb8e2005-12-22 11:36:46 -08004961 pinfo.spinfo_mtu = transport->pathmtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004962
Frank Filz3f7a87d2005-06-20 13:14:57 -07004963 if (pinfo.spinfo_state == SCTP_UNKNOWN)
4964 pinfo.spinfo_state = SCTP_ACTIVE;
4965
Linus Torvalds1da177e2005-04-16 15:20:36 -07004966 if (put_user(len, optlen)) {
4967 retval = -EFAULT;
4968 goto out;
4969 }
4970
4971 if (copy_to_user(optval, &pinfo, len)) {
4972 retval = -EFAULT;
4973 goto out;
4974 }
4975
4976out:
Eric Dumazeta02cec22010-09-22 20:43:57 +00004977 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004978}
4979
4980/* 7.1.12 Enable/Disable message fragmentation (SCTP_DISABLE_FRAGMENTS)
4981 *
4982 * This option is a on/off flag. If enabled no SCTP message
4983 * fragmentation will be performed. Instead if a message being sent
4984 * exceeds the current PMTU size, the message will NOT be sent and
4985 * instead a error will be indicated to the user.
4986 */
4987static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
4988 char __user *optval, int __user *optlen)
4989{
4990 int val;
4991
4992 if (len < sizeof(int))
4993 return -EINVAL;
4994
4995 len = sizeof(int);
4996 val = (sctp_sk(sk)->disable_fragments == 1);
4997 if (put_user(len, optlen))
4998 return -EFAULT;
4999 if (copy_to_user(optval, &val, len))
5000 return -EFAULT;
5001 return 0;
5002}
5003
5004/* 7.1.15 Set notification and ancillary events (SCTP_EVENTS)
5005 *
5006 * This socket option is used to specify various notifications and
5007 * ancillary data the user wishes to receive.
5008 */
5009static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
5010 int __user *optlen)
5011{
Jiri Slabya4b8e712016-10-21 14:13:24 +02005012 if (len == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005013 return -EINVAL;
Thomas Grafacdd5982012-04-03 22:17:53 +00005014 if (len > sizeof(struct sctp_event_subscribe))
5015 len = sizeof(struct sctp_event_subscribe);
Neil Horman408f22e2007-06-16 14:03:45 -04005016 if (put_user(len, optlen))
5017 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005018 if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len))
5019 return -EFAULT;
5020 return 0;
5021}
5022
5023/* 7.1.8 Automatic Close of associations (SCTP_AUTOCLOSE)
5024 *
5025 * This socket option is applicable to the UDP-style socket only. When
5026 * set it will cause associations that are idle for more than the
5027 * specified number of seconds to automatically close. An association
5028 * being idle is defined an association that has NOT sent or received
5029 * user data. The special value of '0' indicates that no automatic
5030 * close of any associations should be performed. The option expects an
5031 * integer defining the number of seconds of idle time before an
5032 * association is closed.
5033 */
5034static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen)
5035{
5036 /* Applicable to UDP-style socket only */
5037 if (sctp_style(sk, TCP))
5038 return -EOPNOTSUPP;
Neil Horman408f22e2007-06-16 14:03:45 -04005039 if (len < sizeof(int))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005040 return -EINVAL;
Neil Horman408f22e2007-06-16 14:03:45 -04005041 len = sizeof(int);
5042 if (put_user(len, optlen))
5043 return -EFAULT;
5044 if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005045 return -EFAULT;
5046 return 0;
5047}
5048
5049/* Helper routine to branch off an association to a new socket. */
Benjamin Poirier0343c552012-03-08 05:55:58 +00005050int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005051{
Benjamin Poirier0343c552012-03-08 05:55:58 +00005052 struct sctp_association *asoc = sctp_id2assoc(sk, id);
Jason Gunthorpe299ee122014-07-30 12:40:53 -06005053 struct sctp_sock *sp = sctp_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005054 struct socket *sock;
5055 int err = 0;
5056
Xin Longdf80cd92017-10-17 23:26:10 +08005057 /* Do not peel off from one netns to another one. */
5058 if (!net_eq(current->nsproxy->net_ns, sock_net(sk)))
5059 return -EINVAL;
5060
Benjamin Poirier0343c552012-03-08 05:55:58 +00005061 if (!asoc)
5062 return -EINVAL;
5063
Linus Torvalds1da177e2005-04-16 15:20:36 -07005064 /* An association cannot be branched off from an already peeled-off
5065 * socket, nor is this supported for tcp style sockets.
5066 */
5067 if (!sctp_style(sk, UDP))
5068 return -EINVAL;
5069
5070 /* Create a new socket. */
5071 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock);
5072 if (err < 0)
5073 return err;
5074
Vlad Yasevich914e1c82009-02-13 08:33:44 +00005075 sctp_copy_sock(sock->sk, sk, asoc);
Vlad Yasevich4f444302006-10-30 18:54:32 -08005076
5077 /* Make peeled-off sockets more like 1-1 accepted sockets.
5078 * Set the daddr and initialize id to something more random
5079 */
Jason Gunthorpe299ee122014-07-30 12:40:53 -06005080 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk);
Vlad Yasevich914e1c82009-02-13 08:33:44 +00005081
5082 /* Populate the fields of the newsk from the oldsk and migrate the
5083 * asoc to the newsk.
5084 */
5085 sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH);
Vlad Yasevich4f444302006-10-30 18:54:32 -08005086
Linus Torvalds1da177e2005-04-16 15:20:36 -07005087 *sockp = sock;
5088
5089 return err;
5090}
Benjamin Poirier0343c552012-03-08 05:55:58 +00005091EXPORT_SYMBOL(sctp_do_peeloff);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005092
Neil Horman2cb5c8e2017-06-30 13:32:57 -04005093static int sctp_getsockopt_peeloff_common(struct sock *sk, sctp_peeloff_arg_t *peeloff,
5094 struct file **newfile, unsigned flags)
5095{
5096 struct socket *newsock;
5097 int retval;
5098
5099 retval = sctp_do_peeloff(sk, peeloff->associd, &newsock);
5100 if (retval < 0)
5101 goto out;
5102
5103 /* Map the socket to an unused fd that can be returned to the user. */
5104 retval = get_unused_fd_flags(flags & SOCK_CLOEXEC);
5105 if (retval < 0) {
5106 sock_release(newsock);
5107 goto out;
5108 }
5109
5110 *newfile = sock_alloc_file(newsock, 0, NULL);
5111 if (IS_ERR(*newfile)) {
5112 put_unused_fd(retval);
Neil Horman2cb5c8e2017-06-30 13:32:57 -04005113 retval = PTR_ERR(*newfile);
5114 *newfile = NULL;
5115 return retval;
5116 }
5117
5118 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk,
5119 retval);
5120
5121 peeloff->sd = retval;
5122
5123 if (flags & SOCK_NONBLOCK)
5124 (*newfile)->f_flags |= O_NONBLOCK;
5125out:
5126 return retval;
5127}
5128
Linus Torvalds1da177e2005-04-16 15:20:36 -07005129static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen)
5130{
5131 sctp_peeloff_arg_t peeloff;
Neil Horman2cb5c8e2017-06-30 13:32:57 -04005132 struct file *newfile = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005133 int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005134
Neil Horman408f22e2007-06-16 14:03:45 -04005135 if (len < sizeof(sctp_peeloff_arg_t))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005136 return -EINVAL;
Neil Horman408f22e2007-06-16 14:03:45 -04005137 len = sizeof(sctp_peeloff_arg_t);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005138 if (copy_from_user(&peeloff, optval, len))
5139 return -EFAULT;
5140
Neil Horman2cb5c8e2017-06-30 13:32:57 -04005141 retval = sctp_getsockopt_peeloff_common(sk, &peeloff, &newfile, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005142 if (retval < 0)
5143 goto out;
5144
Linus Torvalds1da177e2005-04-16 15:20:36 -07005145 /* Return the fd mapped to the new socket. */
Al Viro56b31d12012-08-18 00:25:51 -04005146 if (put_user(len, optlen)) {
5147 fput(newfile);
5148 put_unused_fd(retval);
Neil Horman408f22e2007-06-16 14:03:45 -04005149 return -EFAULT;
Al Viro56b31d12012-08-18 00:25:51 -04005150 }
Neil Horman2cb5c8e2017-06-30 13:32:57 -04005151
5152 if (copy_to_user(optval, &peeloff, len)) {
5153 fput(newfile);
5154 put_unused_fd(retval);
5155 return -EFAULT;
5156 }
5157 fd_install(retval, newfile);
5158out:
5159 return retval;
5160}
5161
5162static int sctp_getsockopt_peeloff_flags(struct sock *sk, int len,
5163 char __user *optval, int __user *optlen)
5164{
5165 sctp_peeloff_flags_arg_t peeloff;
5166 struct file *newfile = NULL;
5167 int retval = 0;
5168
5169 if (len < sizeof(sctp_peeloff_flags_arg_t))
5170 return -EINVAL;
5171 len = sizeof(sctp_peeloff_flags_arg_t);
5172 if (copy_from_user(&peeloff, optval, len))
5173 return -EFAULT;
5174
5175 retval = sctp_getsockopt_peeloff_common(sk, &peeloff.p_arg,
5176 &newfile, peeloff.flags);
5177 if (retval < 0)
5178 goto out;
5179
5180 /* Return the fd mapped to the new socket. */
5181 if (put_user(len, optlen)) {
5182 fput(newfile);
5183 put_unused_fd(retval);
5184 return -EFAULT;
5185 }
5186
Al Viro56b31d12012-08-18 00:25:51 -04005187 if (copy_to_user(optval, &peeloff, len)) {
5188 fput(newfile);
5189 put_unused_fd(retval);
5190 return -EFAULT;
5191 }
5192 fd_install(retval, newfile);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005193out:
5194 return retval;
5195}
5196
5197/* 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS)
5198 *
5199 * Applications can enable or disable heartbeats for any peer address of
5200 * an association, modify an address's heartbeat interval, force a
5201 * heartbeat to be sent immediately, and adjust the address's maximum
5202 * number of retransmissions sent before an address is considered
5203 * unreachable. The following structure is used to access and modify an
5204 * address's parameters:
5205 *
5206 * struct sctp_paddrparams {
Frank Filz52ccb8e2005-12-22 11:36:46 -08005207 * sctp_assoc_t spp_assoc_id;
5208 * struct sockaddr_storage spp_address;
5209 * uint32_t spp_hbinterval;
5210 * uint16_t spp_pathmaxrxt;
5211 * uint32_t spp_pathmtu;
5212 * uint32_t spp_sackdelay;
5213 * uint32_t spp_flags;
5214 * };
Linus Torvalds1da177e2005-04-16 15:20:36 -07005215 *
Frank Filz52ccb8e2005-12-22 11:36:46 -08005216 * spp_assoc_id - (one-to-many style socket) This is filled in the
5217 * application, and identifies the association for
5218 * this query.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005219 * spp_address - This specifies which address is of interest.
5220 * spp_hbinterval - This contains the value of the heartbeat interval,
Frank Filz52ccb8e2005-12-22 11:36:46 -08005221 * in milliseconds. If a value of zero
5222 * is present in this field then no changes are to
5223 * be made to this parameter.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005224 * spp_pathmaxrxt - This contains the maximum number of
5225 * retransmissions before this address shall be
Frank Filz52ccb8e2005-12-22 11:36:46 -08005226 * considered unreachable. If a value of zero
5227 * is present in this field then no changes are to
5228 * be made to this parameter.
5229 * spp_pathmtu - When Path MTU discovery is disabled the value
5230 * specified here will be the "fixed" path mtu.
5231 * Note that if the spp_address field is empty
5232 * then all associations on this address will
5233 * have this fixed path mtu set upon them.
5234 *
5235 * spp_sackdelay - When delayed sack is enabled, this value specifies
5236 * the number of milliseconds that sacks will be delayed
5237 * for. This value will apply to all addresses of an
5238 * association if the spp_address field is empty. Note
5239 * also, that if delayed sack is enabled and this
5240 * value is set to 0, no change is made to the last
5241 * recorded delayed sack timer value.
5242 *
5243 * spp_flags - These flags are used to control various features
5244 * on an association. The flag field may contain
5245 * zero or more of the following options.
5246 *
5247 * SPP_HB_ENABLE - Enable heartbeats on the
5248 * specified address. Note that if the address
5249 * field is empty all addresses for the association
5250 * have heartbeats enabled upon them.
5251 *
5252 * SPP_HB_DISABLE - Disable heartbeats on the
5253 * speicifed address. Note that if the address
5254 * field is empty all addresses for the association
5255 * will have their heartbeats disabled. Note also
5256 * that SPP_HB_ENABLE and SPP_HB_DISABLE are
5257 * mutually exclusive, only one of these two should
5258 * be specified. Enabling both fields will have
5259 * undetermined results.
5260 *
5261 * SPP_HB_DEMAND - Request a user initiated heartbeat
5262 * to be made immediately.
5263 *
5264 * SPP_PMTUD_ENABLE - This field will enable PMTU
5265 * discovery upon the specified address. Note that
5266 * if the address feild is empty then all addresses
5267 * on the association are effected.
5268 *
5269 * SPP_PMTUD_DISABLE - This field will disable PMTU
5270 * discovery upon the specified address. Note that
5271 * if the address feild is empty then all addresses
5272 * on the association are effected. Not also that
5273 * SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually
5274 * exclusive. Enabling both will have undetermined
5275 * results.
5276 *
5277 * SPP_SACKDELAY_ENABLE - Setting this flag turns
5278 * on delayed sack. The time specified in spp_sackdelay
5279 * is used to specify the sack delay for this address. Note
5280 * that if spp_address is empty then all addresses will
5281 * enable delayed sack and take on the sack delay
5282 * value specified in spp_sackdelay.
5283 * SPP_SACKDELAY_DISABLE - Setting this flag turns
5284 * off delayed sack. If the spp_address field is blank then
5285 * delayed sack is disabled for the entire association. Note
5286 * also that this field is mutually exclusive to
5287 * SPP_SACKDELAY_ENABLE, setting both will have undefined
5288 * results.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005289 */
5290static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
Frank Filz52ccb8e2005-12-22 11:36:46 -08005291 char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005292{
Frank Filz52ccb8e2005-12-22 11:36:46 -08005293 struct sctp_paddrparams params;
5294 struct sctp_transport *trans = NULL;
5295 struct sctp_association *asoc = NULL;
5296 struct sctp_sock *sp = sctp_sk(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005297
Neil Horman408f22e2007-06-16 14:03:45 -04005298 if (len < sizeof(struct sctp_paddrparams))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005299 return -EINVAL;
Neil Horman408f22e2007-06-16 14:03:45 -04005300 len = sizeof(struct sctp_paddrparams);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005301 if (copy_from_user(&params, optval, len))
5302 return -EFAULT;
5303
Frank Filz52ccb8e2005-12-22 11:36:46 -08005304 /* If an address other than INADDR_ANY is specified, and
5305 * no transport is found, then the request is invalid.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005306 */
wangweidongcb3f8372013-12-23 12:16:50 +08005307 if (!sctp_is_any(sk, (union sctp_addr *)&params.spp_address)) {
Frank Filz52ccb8e2005-12-22 11:36:46 -08005308 trans = sctp_addr_id2transport(sk, &params.spp_address,
5309 params.spp_assoc_id);
5310 if (!trans) {
Daniel Borkmannbb333812013-06-28 19:49:40 +02005311 pr_debug("%s: failed no transport\n", __func__);
Frank Filz52ccb8e2005-12-22 11:36:46 -08005312 return -EINVAL;
5313 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005314 }
5315
Frank Filz52ccb8e2005-12-22 11:36:46 -08005316 /* Get association, if assoc_id != 0 and the socket is a one
5317 * to many style socket, and an association was not found, then
5318 * the id was invalid.
5319 */
5320 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
5321 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) {
Daniel Borkmannbb333812013-06-28 19:49:40 +02005322 pr_debug("%s: failed no association\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005323 return -EINVAL;
Frank Filz52ccb8e2005-12-22 11:36:46 -08005324 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07005325
Frank Filz52ccb8e2005-12-22 11:36:46 -08005326 if (trans) {
5327 /* Fetch transport values. */
5328 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval);
5329 params.spp_pathmtu = trans->pathmtu;
5330 params.spp_pathmaxrxt = trans->pathmaxrxt;
5331 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005332
Frank Filz52ccb8e2005-12-22 11:36:46 -08005333 /*draft-11 doesn't say what to return in spp_flags*/
5334 params.spp_flags = trans->param_flags;
5335 } else if (asoc) {
5336 /* Fetch association values. */
5337 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval);
5338 params.spp_pathmtu = asoc->pathmtu;
5339 params.spp_pathmaxrxt = asoc->pathmaxrxt;
5340 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005341
Frank Filz52ccb8e2005-12-22 11:36:46 -08005342 /*draft-11 doesn't say what to return in spp_flags*/
5343 params.spp_flags = asoc->param_flags;
5344 } else {
5345 /* Fetch socket values. */
5346 params.spp_hbinterval = sp->hbinterval;
5347 params.spp_pathmtu = sp->pathmtu;
5348 params.spp_sackdelay = sp->sackdelay;
5349 params.spp_pathmaxrxt = sp->pathmaxrxt;
5350
5351 /*draft-11 doesn't say what to return in spp_flags*/
5352 params.spp_flags = sp->param_flags;
5353 }
5354
Linus Torvalds1da177e2005-04-16 15:20:36 -07005355 if (copy_to_user(optval, &params, len))
5356 return -EFAULT;
5357
5358 if (put_user(len, optlen))
5359 return -EFAULT;
5360
5361 return 0;
5362}
5363
Wei Yongjund364d922008-05-09 15:13:26 -07005364/*
5365 * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK)
Frank Filz77086102005-12-22 11:37:30 -08005366 *
Wei Yongjund364d922008-05-09 15:13:26 -07005367 * This option will effect the way delayed acks are performed. This
5368 * option allows you to get or set the delayed ack time, in
5369 * milliseconds. It also allows changing the delayed ack frequency.
5370 * Changing the frequency to 1 disables the delayed sack algorithm. If
5371 * the assoc_id is 0, then this sets or gets the endpoints default
5372 * values. If the assoc_id field is non-zero, then the set or get
5373 * effects the specified association for the one to many model (the
5374 * assoc_id field is ignored by the one to one model). Note that if
5375 * sack_delay or sack_freq are 0 when setting this option, then the
5376 * current values will remain unchanged.
Frank Filz77086102005-12-22 11:37:30 -08005377 *
Wei Yongjund364d922008-05-09 15:13:26 -07005378 * struct sctp_sack_info {
5379 * sctp_assoc_t sack_assoc_id;
5380 * uint32_t sack_delay;
5381 * uint32_t sack_freq;
5382 * };
Frank Filz77086102005-12-22 11:37:30 -08005383 *
Wei Yongjund364d922008-05-09 15:13:26 -07005384 * sack_assoc_id - This parameter, indicates which association the user
5385 * is performing an action upon. Note that if this field's value is
5386 * zero then the endpoints default value is changed (effecting future
5387 * associations only).
Frank Filz77086102005-12-22 11:37:30 -08005388 *
Wei Yongjund364d922008-05-09 15:13:26 -07005389 * sack_delay - This parameter contains the number of milliseconds that
5390 * the user is requesting the delayed ACK timer be set to. Note that
5391 * this value is defined in the standard to be between 200 and 500
5392 * milliseconds.
Frank Filz77086102005-12-22 11:37:30 -08005393 *
Wei Yongjund364d922008-05-09 15:13:26 -07005394 * sack_freq - This parameter contains the number of packets that must
5395 * be received before a sack is sent without waiting for the delay
5396 * timer to expire. The default value for this is 2, setting this
5397 * value to 1 will disable the delayed sack algorithm.
Frank Filz77086102005-12-22 11:37:30 -08005398 */
Wei Yongjund364d922008-05-09 15:13:26 -07005399static int sctp_getsockopt_delayed_ack(struct sock *sk, int len,
Frank Filz77086102005-12-22 11:37:30 -08005400 char __user *optval,
5401 int __user *optlen)
5402{
Wei Yongjund364d922008-05-09 15:13:26 -07005403 struct sctp_sack_info params;
Frank Filz77086102005-12-22 11:37:30 -08005404 struct sctp_association *asoc = NULL;
5405 struct sctp_sock *sp = sctp_sk(sk);
5406
Wei Yongjund364d922008-05-09 15:13:26 -07005407 if (len >= sizeof(struct sctp_sack_info)) {
5408 len = sizeof(struct sctp_sack_info);
5409
5410 if (copy_from_user(&params, optval, len))
5411 return -EFAULT;
5412 } else if (len == sizeof(struct sctp_assoc_value)) {
Neil Horman94f65192013-12-23 08:29:43 -05005413 pr_warn_ratelimited(DEPRECATED
Neil Hormanf916ec92014-01-02 12:54:27 -05005414 "%s (pid %d) "
Neil Horman94f65192013-12-23 08:29:43 -05005415 "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
Neil Hormanf916ec92014-01-02 12:54:27 -05005416 "Use struct sctp_sack_info instead\n",
5417 current->comm, task_pid_nr(current));
Wei Yongjund364d922008-05-09 15:13:26 -07005418 if (copy_from_user(&params, optval, len))
5419 return -EFAULT;
5420 } else
wangweidongcb3f8372013-12-23 12:16:50 +08005421 return -EINVAL;
Frank Filz77086102005-12-22 11:37:30 -08005422
Wei Yongjund364d922008-05-09 15:13:26 -07005423 /* Get association, if sack_assoc_id != 0 and the socket is a one
Frank Filz77086102005-12-22 11:37:30 -08005424 * to many style socket, and an association was not found, then
5425 * the id was invalid.
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09005426 */
Wei Yongjund364d922008-05-09 15:13:26 -07005427 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
5428 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP))
Frank Filz77086102005-12-22 11:37:30 -08005429 return -EINVAL;
5430
5431 if (asoc) {
5432 /* Fetch association values. */
Wei Yongjund364d922008-05-09 15:13:26 -07005433 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) {
5434 params.sack_delay = jiffies_to_msecs(
Frank Filz77086102005-12-22 11:37:30 -08005435 asoc->sackdelay);
Wei Yongjund364d922008-05-09 15:13:26 -07005436 params.sack_freq = asoc->sackfreq;
5437
5438 } else {
5439 params.sack_delay = 0;
5440 params.sack_freq = 1;
5441 }
Frank Filz77086102005-12-22 11:37:30 -08005442 } else {
5443 /* Fetch socket values. */
Wei Yongjund364d922008-05-09 15:13:26 -07005444 if (sp->param_flags & SPP_SACKDELAY_ENABLE) {
5445 params.sack_delay = sp->sackdelay;
5446 params.sack_freq = sp->sackfreq;
5447 } else {
5448 params.sack_delay = 0;
5449 params.sack_freq = 1;
5450 }
Frank Filz77086102005-12-22 11:37:30 -08005451 }
5452
5453 if (copy_to_user(optval, &params, len))
5454 return -EFAULT;
5455
5456 if (put_user(len, optlen))
5457 return -EFAULT;
5458
5459 return 0;
5460}
5461
Linus Torvalds1da177e2005-04-16 15:20:36 -07005462/* 7.1.3 Initialization Parameters (SCTP_INITMSG)
5463 *
5464 * Applications can specify protocol parameters for the default association
5465 * initialization. The option name argument to setsockopt() and getsockopt()
5466 * is SCTP_INITMSG.
5467 *
5468 * Setting initialization parameters is effective only on an unconnected
5469 * socket (for UDP-style sockets only future associations are effected
5470 * by the change). With TCP-style sockets, this option is inherited by
5471 * sockets derived from a listener socket.
5472 */
5473static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen)
5474{
Neil Horman408f22e2007-06-16 14:03:45 -04005475 if (len < sizeof(struct sctp_initmsg))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005476 return -EINVAL;
Neil Horman408f22e2007-06-16 14:03:45 -04005477 len = sizeof(struct sctp_initmsg);
5478 if (put_user(len, optlen))
5479 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005480 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
5481 return -EFAULT;
5482 return 0;
5483}
5484
Linus Torvalds1da177e2005-04-16 15:20:36 -07005485
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005486static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
5487 char __user *optval, int __user *optlen)
5488{
5489 struct sctp_association *asoc;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005490 int cnt = 0;
5491 struct sctp_getaddrs getaddrs;
5492 struct sctp_transport *from;
5493 void __user *to;
5494 union sctp_addr temp;
5495 struct sctp_sock *sp = sctp_sk(sk);
5496 int addrlen;
5497 size_t space_left;
5498 int bytes_copied;
5499
5500 if (len < sizeof(struct sctp_getaddrs))
5501 return -EINVAL;
5502
5503 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
5504 return -EFAULT;
5505
5506 /* For UDP-style sockets, id specifies the association to query. */
5507 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
5508 if (!asoc)
5509 return -EINVAL;
5510
wangweidongcb3f8372013-12-23 12:16:50 +08005511 to = optval + offsetof(struct sctp_getaddrs, addrs);
5512 space_left = len - offsetof(struct sctp_getaddrs, addrs);
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005513
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -07005514 list_for_each_entry(from, &asoc->peer.transport_addr_list,
5515 transports) {
Al Virob3f5b3b2006-11-20 17:22:43 -08005516 memcpy(&temp, &from->ipaddr, sizeof(temp));
Jason Gunthorpe299ee122014-07-30 12:40:53 -06005517 addrlen = sctp_get_pf_specific(sk->sk_family)
5518 ->addr_to_user(sp, &temp);
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005519 if (space_left < addrlen)
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005520 return -ENOMEM;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005521 if (copy_to_user(to, &temp, addrlen))
5522 return -EFAULT;
5523 to += addrlen;
5524 cnt++;
5525 space_left -= addrlen;
5526 }
5527
5528 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num))
5529 return -EFAULT;
5530 bytes_copied = ((char __user *)to) - optval;
5531 if (put_user(bytes_copied, optlen))
5532 return -EFAULT;
5533
5534 return 0;
5535}
5536
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005537static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to,
5538 size_t space_left, int *bytes_copied)
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005539{
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005540 struct sctp_sockaddr_entry *addr;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005541 union sctp_addr temp;
5542 int cnt = 0;
5543 int addrlen;
Eric W. Biederman4db67e82012-08-06 08:42:04 +00005544 struct net *net = sock_net(sk);
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005545
Vlad Yasevich29303542007-09-16 16:02:12 -07005546 rcu_read_lock();
Eric W. Biederman4db67e82012-08-06 08:42:04 +00005547 list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
Vlad Yasevich29303542007-09-16 16:02:12 -07005548 if (!addr->valid)
5549 continue;
5550
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09005551 if ((PF_INET == sk->sk_family) &&
Al Viro6244be42006-11-20 17:21:44 -08005552 (AF_INET6 == addr->a.sa.sa_family))
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005553 continue;
Vlad Yasevich7dab83d2008-07-18 23:05:40 -07005554 if ((PF_INET6 == sk->sk_family) &&
5555 inet_v6_ipv6only(sk) &&
5556 (AF_INET == addr->a.sa.sa_family))
5557 continue;
Al Viro6244be42006-11-20 17:21:44 -08005558 memcpy(&temp, &addr->a, sizeof(temp));
Vlad Yasevichb46ae362008-01-28 14:25:36 -05005559 if (!temp.v4.sin_port)
5560 temp.v4.sin_port = htons(port);
5561
Jason Gunthorpe299ee122014-07-30 12:40:53 -06005562 addrlen = sctp_get_pf_specific(sk->sk_family)
5563 ->addr_to_user(sctp_sk(sk), &temp);
5564
Vlad Yasevich29303542007-09-16 16:02:12 -07005565 if (space_left < addrlen) {
5566 cnt = -ENOMEM;
5567 break;
5568 }
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005569 memcpy(to, &temp, addrlen);
Sridhar Samudrala29c7cf92006-12-13 16:26:26 -08005570
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005571 to += addrlen;
wangweidongcb3f8372013-12-23 12:16:50 +08005572 cnt++;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005573 space_left -= addrlen;
Vlad Yasevich3663c302007-07-03 12:43:12 -04005574 *bytes_copied += addrlen;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005575 }
Vlad Yasevich29303542007-09-16 16:02:12 -07005576 rcu_read_unlock();
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005577
5578 return cnt;
5579}
5580
Linus Torvalds1da177e2005-04-16 15:20:36 -07005581
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005582static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
5583 char __user *optval, int __user *optlen)
5584{
5585 struct sctp_bind_addr *bp;
5586 struct sctp_association *asoc;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005587 int cnt = 0;
5588 struct sctp_getaddrs getaddrs;
5589 struct sctp_sockaddr_entry *addr;
5590 void __user *to;
5591 union sctp_addr temp;
5592 struct sctp_sock *sp = sctp_sk(sk);
5593 int addrlen;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005594 int err = 0;
5595 size_t space_left;
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005596 int bytes_copied = 0;
5597 void *addrs;
Vlad Yasevich70b57b82007-05-09 13:51:31 -07005598 void *buf;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005599
Neil Horman408f22e2007-06-16 14:03:45 -04005600 if (len < sizeof(struct sctp_getaddrs))
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005601 return -EINVAL;
5602
5603 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
5604 return -EFAULT;
5605
5606 /*
5607 * For UDP-style sockets, id specifies the association to query.
5608 * If the id field is set to the value '0' then the locally bound
5609 * addresses are returned without regard to any particular
5610 * association.
5611 */
5612 if (0 == getaddrs.assoc_id) {
5613 bp = &sctp_sk(sk)->ep->base.bind_addr;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005614 } else {
5615 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
5616 if (!asoc)
5617 return -EINVAL;
5618 bp = &asoc->base.bind_addr;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005619 }
5620
wangweidongcb3f8372013-12-23 12:16:50 +08005621 to = optval + offsetof(struct sctp_getaddrs, addrs);
5622 space_left = len - offsetof(struct sctp_getaddrs, addrs);
Neil Horman186e2342007-06-18 19:59:16 -04005623
Marcelo Ricardo Leitnercacc0622015-11-30 14:32:54 -02005624 addrs = kmalloc(space_left, GFP_USER | __GFP_NOWARN);
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005625 if (!addrs)
5626 return -ENOMEM;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005627
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005628 /* If the endpoint is bound to 0.0.0.0 or ::0, get the valid
5629 * addresses from the global local address list.
5630 */
5631 if (sctp_list_single_entry(&bp->address_list)) {
5632 addr = list_entry(bp->address_list.next,
5633 struct sctp_sockaddr_entry, list);
Vlad Yasevich52cae8f2008-08-18 10:34:34 -04005634 if (sctp_is_any(sk, &addr->a)) {
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005635 cnt = sctp_copy_laddrs(sk, bp->port, addrs,
5636 space_left, &bytes_copied);
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005637 if (cnt < 0) {
5638 err = cnt;
Vlad Yasevich559cf712007-09-16 16:03:28 -07005639 goto out;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005640 }
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09005641 goto copy_getaddrs;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005642 }
5643 }
5644
Vlad Yasevich70b57b82007-05-09 13:51:31 -07005645 buf = addrs;
Vlad Yasevich559cf712007-09-16 16:03:28 -07005646 /* Protection on the bound address list is not needed since
5647 * in the socket option context we hold a socket lock and
5648 * thus the bound address list can't change.
5649 */
5650 list_for_each_entry(addr, &bp->address_list, list) {
Al Viro6244be42006-11-20 17:21:44 -08005651 memcpy(&temp, &addr->a, sizeof(temp));
Jason Gunthorpe299ee122014-07-30 12:40:53 -06005652 addrlen = sctp_get_pf_specific(sk->sk_family)
5653 ->addr_to_user(sp, &temp);
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005654 if (space_left < addrlen) {
5655 err = -ENOMEM; /*fixme: right error?*/
Vlad Yasevich559cf712007-09-16 16:03:28 -07005656 goto out;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005657 }
Vlad Yasevich70b57b82007-05-09 13:51:31 -07005658 memcpy(buf, &temp, addrlen);
5659 buf += addrlen;
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005660 bytes_copied += addrlen;
wangweidongcb3f8372013-12-23 12:16:50 +08005661 cnt++;
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005662 space_left -= addrlen;
5663 }
5664
5665copy_getaddrs:
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005666 if (copy_to_user(to, addrs, bytes_copied)) {
5667 err = -EFAULT;
Sebastian Siewiord6f9fda2007-07-27 22:55:59 +02005668 goto out;
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005669 }
Vlad Yasevichfe979ac2007-05-23 11:11:37 -04005670 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) {
5671 err = -EFAULT;
Sebastian Siewiord6f9fda2007-07-27 22:55:59 +02005672 goto out;
Vlad Yasevichfe979ac2007-05-23 11:11:37 -04005673 }
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005674 if (put_user(bytes_copied, optlen))
Vlad Yasevichfe979ac2007-05-23 11:11:37 -04005675 err = -EFAULT;
Sebastian Siewiord6f9fda2007-07-27 22:55:59 +02005676out:
Vlad Yasevichaad97f32007-04-28 21:09:04 -07005677 kfree(addrs);
Ivan Skytte Jørgensen5fe467e2005-10-06 21:36:17 -07005678 return err;
5679}
5680
Linus Torvalds1da177e2005-04-16 15:20:36 -07005681/* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR)
5682 *
5683 * Requests that the local SCTP stack use the enclosed peer address as
5684 * the association primary. The enclosed address must be one of the
5685 * association peer's addresses.
5686 */
5687static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
5688 char __user *optval, int __user *optlen)
5689{
5690 struct sctp_prim prim;
5691 struct sctp_association *asoc;
5692 struct sctp_sock *sp = sctp_sk(sk);
5693
Neil Horman408f22e2007-06-16 14:03:45 -04005694 if (len < sizeof(struct sctp_prim))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005695 return -EINVAL;
5696
Neil Horman408f22e2007-06-16 14:03:45 -04005697 len = sizeof(struct sctp_prim);
5698
5699 if (copy_from_user(&prim, optval, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005700 return -EFAULT;
5701
5702 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id);
5703 if (!asoc)
5704 return -EINVAL;
5705
5706 if (!asoc->peer.primary_path)
5707 return -ENOTCONN;
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09005708
Al Viro8cec6b82006-11-20 17:23:01 -08005709 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr,
5710 asoc->peer.primary_path->af_specific->sockaddr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005711
Jason Gunthorpe299ee122014-07-30 12:40:53 -06005712 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp,
Linus Torvalds1da177e2005-04-16 15:20:36 -07005713 (union sctp_addr *)&prim.ssp_addr);
5714
Neil Horman408f22e2007-06-16 14:03:45 -04005715 if (put_user(len, optlen))
5716 return -EFAULT;
5717 if (copy_to_user(optval, &prim, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005718 return -EFAULT;
5719
5720 return 0;
5721}
5722
5723/*
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08005724 * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005725 *
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08005726 * Requests that the local endpoint set the specified Adaptation Layer
Linus Torvalds1da177e2005-04-16 15:20:36 -07005727 * Indication parameter for all future INIT and INIT-ACK exchanges.
5728 */
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08005729static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
Linus Torvalds1da177e2005-04-16 15:20:36 -07005730 char __user *optval, int __user *optlen)
5731{
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08005732 struct sctp_setadaptation adaptation;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005733
Neil Horman408f22e2007-06-16 14:03:45 -04005734 if (len < sizeof(struct sctp_setadaptation))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005735 return -EINVAL;
5736
Neil Horman408f22e2007-06-16 14:03:45 -04005737 len = sizeof(struct sctp_setadaptation);
5738
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08005739 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind;
Neil Horman408f22e2007-06-16 14:03:45 -04005740
5741 if (put_user(len, optlen))
5742 return -EFAULT;
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08005743 if (copy_to_user(optval, &adaptation, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005744 return -EFAULT;
Ivan Skytte Jorgensena1ab3582005-10-28 15:33:24 -07005745
Linus Torvalds1da177e2005-04-16 15:20:36 -07005746 return 0;
5747}
5748
5749/*
5750 *
5751 * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM)
5752 *
5753 * Applications that wish to use the sendto() system call may wish to
5754 * specify a default set of parameters that would normally be supplied
5755 * through the inclusion of ancillary data. This socket option allows
5756 * such an application to set the default sctp_sndrcvinfo structure.
5757
5758
5759 * The application that wishes to use this socket option simply passes
5760 * in to this call the sctp_sndrcvinfo structure defined in Section
5761 * 5.2.2) The input parameters accepted by this call include
5762 * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context,
5763 * sinfo_timetolive. The user must provide the sinfo_assoc_id field in
5764 * to this call if the caller is using the UDP model.
5765 *
5766 * For getsockopt, it get the default sctp_sndrcvinfo structure.
5767 */
5768static int sctp_getsockopt_default_send_param(struct sock *sk,
5769 int len, char __user *optval,
5770 int __user *optlen)
5771{
Linus Torvalds1da177e2005-04-16 15:20:36 -07005772 struct sctp_sock *sp = sctp_sk(sk);
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02005773 struct sctp_association *asoc;
5774 struct sctp_sndrcvinfo info;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005775
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02005776 if (len < sizeof(info))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005777 return -EINVAL;
Neil Horman408f22e2007-06-16 14:03:45 -04005778
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02005779 len = sizeof(info);
Neil Horman408f22e2007-06-16 14:03:45 -04005780
5781 if (copy_from_user(&info, optval, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005782 return -EFAULT;
5783
5784 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
5785 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP))
5786 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005787 if (asoc) {
5788 info.sinfo_stream = asoc->default_stream;
5789 info.sinfo_flags = asoc->default_flags;
5790 info.sinfo_ppid = asoc->default_ppid;
5791 info.sinfo_context = asoc->default_context;
5792 info.sinfo_timetolive = asoc->default_timetolive;
5793 } else {
5794 info.sinfo_stream = sp->default_stream;
5795 info.sinfo_flags = sp->default_flags;
5796 info.sinfo_ppid = sp->default_ppid;
5797 info.sinfo_context = sp->default_context;
5798 info.sinfo_timetolive = sp->default_timetolive;
5799 }
5800
Neil Horman408f22e2007-06-16 14:03:45 -04005801 if (put_user(len, optlen))
5802 return -EFAULT;
5803 if (copy_to_user(optval, &info, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005804 return -EFAULT;
5805
5806 return 0;
5807}
5808
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02005809/* RFC6458, Section 8.1.31. Set/get Default Send Parameters
5810 * (SCTP_DEFAULT_SNDINFO)
5811 */
5812static int sctp_getsockopt_default_sndinfo(struct sock *sk, int len,
5813 char __user *optval,
5814 int __user *optlen)
5815{
5816 struct sctp_sock *sp = sctp_sk(sk);
5817 struct sctp_association *asoc;
5818 struct sctp_sndinfo info;
5819
5820 if (len < sizeof(info))
5821 return -EINVAL;
5822
5823 len = sizeof(info);
5824
5825 if (copy_from_user(&info, optval, len))
5826 return -EFAULT;
5827
5828 asoc = sctp_id2assoc(sk, info.snd_assoc_id);
5829 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP))
5830 return -EINVAL;
5831 if (asoc) {
5832 info.snd_sid = asoc->default_stream;
5833 info.snd_flags = asoc->default_flags;
5834 info.snd_ppid = asoc->default_ppid;
5835 info.snd_context = asoc->default_context;
5836 } else {
5837 info.snd_sid = sp->default_stream;
5838 info.snd_flags = sp->default_flags;
5839 info.snd_ppid = sp->default_ppid;
5840 info.snd_context = sp->default_context;
5841 }
5842
5843 if (put_user(len, optlen))
5844 return -EFAULT;
5845 if (copy_to_user(optval, &info, len))
5846 return -EFAULT;
5847
5848 return 0;
5849}
5850
Linus Torvalds1da177e2005-04-16 15:20:36 -07005851/*
5852 *
5853 * 7.1.5 SCTP_NODELAY
5854 *
5855 * Turn on/off any Nagle-like algorithm. This means that packets are
5856 * generally sent as soon as possible and no unnecessary delays are
5857 * introduced, at the cost of more packets in the network. Expects an
5858 * integer boolean flag.
5859 */
5860
5861static int sctp_getsockopt_nodelay(struct sock *sk, int len,
5862 char __user *optval, int __user *optlen)
5863{
5864 int val;
5865
5866 if (len < sizeof(int))
5867 return -EINVAL;
5868
5869 len = sizeof(int);
5870 val = (sctp_sk(sk)->nodelay == 1);
5871 if (put_user(len, optlen))
5872 return -EFAULT;
5873 if (copy_to_user(optval, &val, len))
5874 return -EFAULT;
5875 return 0;
5876}
5877
5878/*
5879 *
5880 * 7.1.1 SCTP_RTOINFO
5881 *
5882 * The protocol parameters used to initialize and bound retransmission
5883 * timeout (RTO) are tunable. sctp_rtoinfo structure is used to access
5884 * and modify these parameters.
5885 * All parameters are time values, in milliseconds. A value of 0, when
5886 * modifying the parameters, indicates that the current value should not
5887 * be changed.
5888 *
5889 */
5890static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
5891 char __user *optval,
5892 int __user *optlen) {
5893 struct sctp_rtoinfo rtoinfo;
5894 struct sctp_association *asoc;
5895
Neil Horman408f22e2007-06-16 14:03:45 -04005896 if (len < sizeof (struct sctp_rtoinfo))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005897 return -EINVAL;
5898
Neil Horman408f22e2007-06-16 14:03:45 -04005899 len = sizeof(struct sctp_rtoinfo);
5900
5901 if (copy_from_user(&rtoinfo, optval, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005902 return -EFAULT;
5903
5904 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
5905
5906 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
5907 return -EINVAL;
5908
5909 /* Values corresponding to the specific association. */
5910 if (asoc) {
5911 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial);
5912 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max);
5913 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min);
5914 } else {
5915 /* Values corresponding to the endpoint. */
5916 struct sctp_sock *sp = sctp_sk(sk);
5917
5918 rtoinfo.srto_initial = sp->rtoinfo.srto_initial;
5919 rtoinfo.srto_max = sp->rtoinfo.srto_max;
5920 rtoinfo.srto_min = sp->rtoinfo.srto_min;
5921 }
5922
5923 if (put_user(len, optlen))
5924 return -EFAULT;
5925
5926 if (copy_to_user(optval, &rtoinfo, len))
5927 return -EFAULT;
5928
5929 return 0;
5930}
5931
5932/*
5933 *
5934 * 7.1.2 SCTP_ASSOCINFO
5935 *
Michael Opdenacker59c51592007-05-09 08:57:56 +02005936 * This option is used to tune the maximum retransmission attempts
Linus Torvalds1da177e2005-04-16 15:20:36 -07005937 * of the association.
5938 * Returns an error if the new association retransmission value is
5939 * greater than the sum of the retransmission value of the peer.
5940 * See [SCTP] for more information.
5941 *
5942 */
5943static int sctp_getsockopt_associnfo(struct sock *sk, int len,
5944 char __user *optval,
5945 int __user *optlen)
5946{
5947
5948 struct sctp_assocparams assocparams;
5949 struct sctp_association *asoc;
5950 struct list_head *pos;
5951 int cnt = 0;
5952
Neil Horman408f22e2007-06-16 14:03:45 -04005953 if (len < sizeof (struct sctp_assocparams))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005954 return -EINVAL;
5955
Neil Horman408f22e2007-06-16 14:03:45 -04005956 len = sizeof(struct sctp_assocparams);
5957
5958 if (copy_from_user(&assocparams, optval, len))
Linus Torvalds1da177e2005-04-16 15:20:36 -07005959 return -EFAULT;
5960
5961 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
5962
5963 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP))
5964 return -EINVAL;
5965
5966 /* Values correspoinding to the specific association */
Vladislav Yasevich17337212005-04-28 11:57:54 -07005967 if (asoc) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005968 assocparams.sasoc_asocmaxrxt = asoc->max_retrans;
5969 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;
5970 assocparams.sasoc_local_rwnd = asoc->a_rwnd;
Daniel Borkmann52db8822013-06-25 18:17:27 +02005971 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005972
5973 list_for_each(pos, &asoc->peer.transport_addr_list) {
wangweidongcb3f8372013-12-23 12:16:50 +08005974 cnt++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005975 }
5976
5977 assocparams.sasoc_number_peer_destinations = cnt;
5978 } else {
5979 /* Values corresponding to the endpoint */
5980 struct sctp_sock *sp = sctp_sk(sk);
5981
5982 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt;
5983 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd;
5984 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd;
5985 assocparams.sasoc_cookie_life =
5986 sp->assocparams.sasoc_cookie_life;
5987 assocparams.sasoc_number_peer_destinations =
5988 sp->assocparams.
5989 sasoc_number_peer_destinations;
5990 }
5991
5992 if (put_user(len, optlen))
5993 return -EFAULT;
5994
5995 if (copy_to_user(optval, &assocparams, len))
5996 return -EFAULT;
5997
5998 return 0;
5999}
6000
6001/*
6002 * 7.1.16 Set/clear IPv4 mapped addresses (SCTP_I_WANT_MAPPED_V4_ADDR)
6003 *
6004 * This socket option is a boolean flag which turns on or off mapped V4
6005 * addresses. If this option is turned on and the socket is type
6006 * PF_INET6, then IPv4 addresses will be mapped to V6 representation.
6007 * If this option is turned off, then no mapping will be done of V4
6008 * addresses and a user will receive both PF_INET6 and PF_INET type
6009 * addresses on the socket.
6010 */
6011static int sctp_getsockopt_mappedv4(struct sock *sk, int len,
6012 char __user *optval, int __user *optlen)
6013{
6014 int val;
6015 struct sctp_sock *sp = sctp_sk(sk);
6016
6017 if (len < sizeof(int))
6018 return -EINVAL;
6019
6020 len = sizeof(int);
6021 val = sp->v4mapped;
6022 if (put_user(len, optlen))
6023 return -EFAULT;
6024 if (copy_to_user(optval, &val, len))
6025 return -EFAULT;
6026
6027 return 0;
6028}
6029
6030/*
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08006031 * 7.1.29. Set or Get the default context (SCTP_CONTEXT)
6032 * (chapter and verse is quoted at sctp_setsockopt_context())
6033 */
6034static int sctp_getsockopt_context(struct sock *sk, int len,
6035 char __user *optval, int __user *optlen)
6036{
6037 struct sctp_assoc_value params;
6038 struct sctp_sock *sp;
6039 struct sctp_association *asoc;
6040
Neil Horman408f22e2007-06-16 14:03:45 -04006041 if (len < sizeof(struct sctp_assoc_value))
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08006042 return -EINVAL;
6043
Neil Horman408f22e2007-06-16 14:03:45 -04006044 len = sizeof(struct sctp_assoc_value);
6045
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08006046 if (copy_from_user(&params, optval, len))
6047 return -EFAULT;
6048
6049 sp = sctp_sk(sk);
6050
6051 if (params.assoc_id != 0) {
6052 asoc = sctp_id2assoc(sk, params.assoc_id);
6053 if (!asoc)
6054 return -EINVAL;
6055 params.assoc_value = asoc->default_rcv_context;
6056 } else {
6057 params.assoc_value = sp->default_rcv_context;
6058 }
6059
6060 if (put_user(len, optlen))
6061 return -EFAULT;
6062 if (copy_to_user(optval, &params, len))
6063 return -EFAULT;
6064
6065 return 0;
6066}
6067
6068/*
Wei Yongjune89c2092008-12-25 16:54:58 -08006069 * 8.1.16. Get or Set the Maximum Fragmentation Size (SCTP_MAXSEG)
6070 * This option will get or set the maximum size to put in any outgoing
6071 * SCTP DATA chunk. If a message is larger than this size it will be
Linus Torvalds1da177e2005-04-16 15:20:36 -07006072 * fragmented by SCTP into the specified size. Note that the underlying
6073 * SCTP implementation may fragment into smaller sized chunks when the
6074 * PMTU of the underlying association is smaller than the value set by
Wei Yongjune89c2092008-12-25 16:54:58 -08006075 * the user. The default value for this option is '0' which indicates
6076 * the user is NOT limiting fragmentation and only the PMTU will effect
6077 * SCTP's choice of DATA chunk size. Note also that values set larger
6078 * than the maximum size of an IP datagram will effectively let SCTP
6079 * control fragmentation (i.e. the same as setting this option to 0).
6080 *
6081 * The following structure is used to access and modify this parameter:
6082 *
6083 * struct sctp_assoc_value {
6084 * sctp_assoc_t assoc_id;
6085 * uint32_t assoc_value;
6086 * };
6087 *
6088 * assoc_id: This parameter is ignored for one-to-one style sockets.
6089 * For one-to-many style sockets this parameter indicates which
6090 * association the user is performing an action upon. Note that if
6091 * this field's value is zero then the endpoints default value is
6092 * changed (effecting future associations only).
6093 * assoc_value: This parameter specifies the maximum size in bytes.
Linus Torvalds1da177e2005-04-16 15:20:36 -07006094 */
6095static int sctp_getsockopt_maxseg(struct sock *sk, int len,
6096 char __user *optval, int __user *optlen)
6097{
Wei Yongjune89c2092008-12-25 16:54:58 -08006098 struct sctp_assoc_value params;
6099 struct sctp_association *asoc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006100
Wei Yongjune89c2092008-12-25 16:54:58 -08006101 if (len == sizeof(int)) {
Neil Horman94f65192013-12-23 08:29:43 -05006102 pr_warn_ratelimited(DEPRECATED
Neil Hormanf916ec92014-01-02 12:54:27 -05006103 "%s (pid %d) "
Neil Horman94f65192013-12-23 08:29:43 -05006104 "Use of int in maxseg socket option.\n"
Neil Hormanf916ec92014-01-02 12:54:27 -05006105 "Use struct sctp_assoc_value instead\n",
6106 current->comm, task_pid_nr(current));
Wei Yongjune89c2092008-12-25 16:54:58 -08006107 params.assoc_id = 0;
6108 } else if (len >= sizeof(struct sctp_assoc_value)) {
6109 len = sizeof(struct sctp_assoc_value);
6110 if (copy_from_user(&params, optval, sizeof(params)))
6111 return -EFAULT;
6112 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07006113 return -EINVAL;
6114
Wei Yongjune89c2092008-12-25 16:54:58 -08006115 asoc = sctp_id2assoc(sk, params.assoc_id);
6116 if (!asoc && params.assoc_id && sctp_style(sk, UDP))
6117 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006118
Wei Yongjune89c2092008-12-25 16:54:58 -08006119 if (asoc)
6120 params.assoc_value = asoc->frag_point;
6121 else
6122 params.assoc_value = sctp_sk(sk)->user_frag;
6123
Linus Torvalds1da177e2005-04-16 15:20:36 -07006124 if (put_user(len, optlen))
6125 return -EFAULT;
Wei Yongjune89c2092008-12-25 16:54:58 -08006126 if (len == sizeof(int)) {
6127 if (copy_to_user(optval, &params.assoc_value, len))
6128 return -EFAULT;
6129 } else {
6130 if (copy_to_user(optval, &params, len))
6131 return -EFAULT;
6132 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006133
6134 return 0;
6135}
6136
Vlad Yasevichb6e13312007-04-20 12:23:15 -07006137/*
6138 * 7.1.24. Get or set fragmented interleave (SCTP_FRAGMENT_INTERLEAVE)
6139 * (chapter and verse is quoted at sctp_setsockopt_fragment_interleave())
6140 */
6141static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len,
6142 char __user *optval, int __user *optlen)
6143{
6144 int val;
6145
6146 if (len < sizeof(int))
6147 return -EINVAL;
6148
6149 len = sizeof(int);
6150
6151 val = sctp_sk(sk)->frag_interleave;
6152 if (put_user(len, optlen))
6153 return -EFAULT;
6154 if (copy_to_user(optval, &val, len))
6155 return -EFAULT;
6156
6157 return 0;
6158}
6159
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07006160/*
6161 * 7.1.25. Set or Get the sctp partial delivery point
6162 * (chapter and verse is quoted at sctp_setsockopt_partial_delivery_point())
6163 */
6164static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len,
6165 char __user *optval,
6166 int __user *optlen)
6167{
YOSHIFUJI Hideaki9cbcbf42007-07-19 10:44:50 +09006168 u32 val;
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07006169
6170 if (len < sizeof(u32))
6171 return -EINVAL;
6172
6173 len = sizeof(u32);
6174
6175 val = sctp_sk(sk)->pd_point;
6176 if (put_user(len, optlen))
6177 return -EFAULT;
6178 if (copy_to_user(optval, &val, len))
6179 return -EFAULT;
6180
Wei Yongjun7d743b72010-12-14 16:10:41 +00006181 return 0;
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07006182}
6183
Vlad Yasevich70331572007-03-23 11:34:36 -07006184/*
6185 * 7.1.28. Set or Get the maximum burst (SCTP_MAX_BURST)
6186 * (chapter and verse is quoted at sctp_setsockopt_maxburst())
6187 */
6188static int sctp_getsockopt_maxburst(struct sock *sk, int len,
6189 char __user *optval,
6190 int __user *optlen)
6191{
Neil Horman219b99a2008-03-05 13:44:46 -08006192 struct sctp_assoc_value params;
6193 struct sctp_sock *sp;
6194 struct sctp_association *asoc;
Vlad Yasevich70331572007-03-23 11:34:36 -07006195
Neil Horman219b99a2008-03-05 13:44:46 -08006196 if (len == sizeof(int)) {
Neil Horman94f65192013-12-23 08:29:43 -05006197 pr_warn_ratelimited(DEPRECATED
Neil Hormanf916ec92014-01-02 12:54:27 -05006198 "%s (pid %d) "
Neil Horman94f65192013-12-23 08:29:43 -05006199 "Use of int in max_burst socket option.\n"
Neil Hormanf916ec92014-01-02 12:54:27 -05006200 "Use struct sctp_assoc_value instead\n",
6201 current->comm, task_pid_nr(current));
Neil Horman219b99a2008-03-05 13:44:46 -08006202 params.assoc_id = 0;
Wei Yongjunc6db93a2009-03-02 09:46:12 +00006203 } else if (len >= sizeof(struct sctp_assoc_value)) {
6204 len = sizeof(struct sctp_assoc_value);
Neil Horman219b99a2008-03-05 13:44:46 -08006205 if (copy_from_user(&params, optval, len))
6206 return -EFAULT;
6207 } else
6208 return -EINVAL;
Vlad Yasevich70331572007-03-23 11:34:36 -07006209
Neil Horman219b99a2008-03-05 13:44:46 -08006210 sp = sctp_sk(sk);
Vlad Yasevich70331572007-03-23 11:34:36 -07006211
Neil Horman219b99a2008-03-05 13:44:46 -08006212 if (params.assoc_id != 0) {
6213 asoc = sctp_id2assoc(sk, params.assoc_id);
6214 if (!asoc)
6215 return -EINVAL;
6216 params.assoc_value = asoc->max_burst;
6217 } else
6218 params.assoc_value = sp->max_burst;
6219
6220 if (len == sizeof(int)) {
6221 if (copy_to_user(optval, &params.assoc_value, len))
6222 return -EFAULT;
6223 } else {
6224 if (copy_to_user(optval, &params, len))
6225 return -EFAULT;
6226 }
6227
6228 return 0;
6229
Vlad Yasevich70331572007-03-23 11:34:36 -07006230}
6231
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006232static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
6233 char __user *optval, int __user *optlen)
6234{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006235 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006236 struct sctp_hmacalgo __user *p = (void __user *)optval;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006237 struct sctp_hmac_algo_param *hmacs;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006238 __u16 data_len = 0;
6239 u32 num_idents;
Xin Long7a84bd42016-02-03 23:33:30 +08006240 int i;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006241
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006242 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006243 return -EACCES;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006244
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006245 hmacs = ep->auth_hmacs_list;
Xin Long3c918702017-06-30 11:52:16 +08006246 data_len = ntohs(hmacs->param_hdr.length) -
6247 sizeof(struct sctp_paramhdr);
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006248
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006249 if (len < sizeof(struct sctp_hmacalgo) + data_len)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006250 return -EINVAL;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006251
6252 len = sizeof(struct sctp_hmacalgo) + data_len;
6253 num_idents = data_len / sizeof(u16);
6254
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006255 if (put_user(len, optlen))
6256 return -EFAULT;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006257 if (put_user(num_idents, &p->shmac_num_idents))
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006258 return -EFAULT;
Xin Long7a84bd42016-02-03 23:33:30 +08006259 for (i = 0; i < num_idents; i++) {
6260 __u16 hmacid = ntohs(hmacs->hmac_ids[i]);
6261
6262 if (copy_to_user(&p->shmac_idents[i], &hmacid, sizeof(__u16)))
6263 return -EFAULT;
6264 }
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006265 return 0;
6266}
6267
6268static int sctp_getsockopt_active_key(struct sock *sk, int len,
6269 char __user *optval, int __user *optlen)
6270{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006271 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006272 struct sctp_authkeyid val;
6273 struct sctp_association *asoc;
6274
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006275 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006276 return -EACCES;
6277
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006278 if (len < sizeof(struct sctp_authkeyid))
6279 return -EINVAL;
6280 if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
6281 return -EFAULT;
6282
6283 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
6284 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
6285 return -EINVAL;
6286
6287 if (asoc)
6288 val.scact_keynumber = asoc->active_key_id;
6289 else
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006290 val.scact_keynumber = ep->active_key_id;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006291
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006292 len = sizeof(struct sctp_authkeyid);
6293 if (put_user(len, optlen))
6294 return -EFAULT;
6295 if (copy_to_user(optval, &val, len))
6296 return -EFAULT;
6297
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006298 return 0;
6299}
6300
6301static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
6302 char __user *optval, int __user *optlen)
6303{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006304 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Al Viro411223c2007-10-14 19:21:20 +01006305 struct sctp_authchunks __user *p = (void __user *)optval;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006306 struct sctp_authchunks val;
6307 struct sctp_association *asoc;
6308 struct sctp_chunks_param *ch;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006309 u32 num_chunks = 0;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006310 char __user *to;
6311
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006312 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006313 return -EACCES;
6314
6315 if (len < sizeof(struct sctp_authchunks))
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006316 return -EINVAL;
6317
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006318 if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006319 return -EFAULT;
6320
Al Viro411223c2007-10-14 19:21:20 +01006321 to = p->gauth_chunks;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006322 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
6323 if (!asoc)
6324 return -EINVAL;
6325
6326 ch = asoc->peer.peer_chunks;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006327 if (!ch)
6328 goto num;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006329
6330 /* See if the user provided enough room for all the data */
Xin Long3c918702017-06-30 11:52:16 +08006331 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
Vlad Yasevichb40db682008-02-27 14:40:37 -05006332 if (len < num_chunks)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006333 return -EINVAL;
6334
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006335 if (copy_to_user(to, ch->chunks, num_chunks))
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006336 return -EFAULT;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006337num:
6338 len = sizeof(struct sctp_authchunks) + num_chunks;
wangweidong8d726512013-12-23 12:16:53 +08006339 if (put_user(len, optlen))
6340 return -EFAULT;
Vlad Yasevich7e8616d2008-02-27 16:04:52 -05006341 if (put_user(num_chunks, &p->gauth_number_of_chunks))
6342 return -EFAULT;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006343 return 0;
6344}
6345
6346static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
6347 char __user *optval, int __user *optlen)
6348{
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006349 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
Al Viro411223c2007-10-14 19:21:20 +01006350 struct sctp_authchunks __user *p = (void __user *)optval;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006351 struct sctp_authchunks val;
6352 struct sctp_association *asoc;
6353 struct sctp_chunks_param *ch;
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006354 u32 num_chunks = 0;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006355 char __user *to;
6356
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006357 if (!ep->auth_enable)
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006358 return -EACCES;
6359
6360 if (len < sizeof(struct sctp_authchunks))
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006361 return -EINVAL;
6362
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006363 if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006364 return -EFAULT;
6365
Al Viro411223c2007-10-14 19:21:20 +01006366 to = p->gauth_chunks;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006367 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
6368 if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP))
6369 return -EINVAL;
6370
6371 if (asoc)
wangweidong26ac8e52013-12-23 12:16:51 +08006372 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006373 else
Vlad Yasevichb14878c2014-04-17 17:26:50 +02006374 ch = ep->auth_chunk_list;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006375
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006376 if (!ch)
6377 goto num;
6378
Xin Long3c918702017-06-30 11:52:16 +08006379 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006380 if (len < sizeof(struct sctp_authchunks) + num_chunks)
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006381 return -EINVAL;
6382
Vlad Yasevich5e739d12008-08-21 03:34:25 -07006383 if (copy_to_user(to, ch->chunks, num_chunks))
6384 return -EFAULT;
6385num:
6386 len = sizeof(struct sctp_authchunks) + num_chunks;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006387 if (put_user(len, optlen))
6388 return -EFAULT;
Vlad Yasevich7e8616d2008-02-27 16:04:52 -05006389 if (put_user(num_chunks, &p->gauth_number_of_chunks))
6390 return -EFAULT;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07006391
6392 return 0;
6393}
6394
Wei Yongjunaea3c5c2008-12-25 16:57:24 -08006395/*
6396 * 8.2.5. Get the Current Number of Associations (SCTP_GET_ASSOC_NUMBER)
6397 * This option gets the current number of associations that are attached
6398 * to a one-to-many style socket. The option value is an uint32_t.
6399 */
6400static int sctp_getsockopt_assoc_number(struct sock *sk, int len,
6401 char __user *optval, int __user *optlen)
6402{
6403 struct sctp_sock *sp = sctp_sk(sk);
6404 struct sctp_association *asoc;
6405 u32 val = 0;
6406
6407 if (sctp_style(sk, TCP))
6408 return -EOPNOTSUPP;
6409
6410 if (len < sizeof(u32))
6411 return -EINVAL;
6412
6413 len = sizeof(u32);
6414
6415 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
6416 val++;
6417 }
6418
6419 if (put_user(len, optlen))
6420 return -EFAULT;
6421 if (copy_to_user(optval, &val, len))
6422 return -EFAULT;
6423
6424 return 0;
6425}
6426
Wei Yongjun209ba422011-04-17 17:27:08 +00006427/*
Michio Honda7dc04d72011-04-26 20:16:31 +09006428 * 8.1.23 SCTP_AUTO_ASCONF
6429 * See the corresponding setsockopt entry as description
6430 */
6431static int sctp_getsockopt_auto_asconf(struct sock *sk, int len,
6432 char __user *optval, int __user *optlen)
6433{
6434 int val = 0;
6435
6436 if (len < sizeof(int))
6437 return -EINVAL;
6438
6439 len = sizeof(int);
6440 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk))
6441 val = 1;
6442 if (put_user(len, optlen))
6443 return -EFAULT;
6444 if (copy_to_user(optval, &val, len))
6445 return -EFAULT;
6446 return 0;
6447}
6448
6449/*
Wei Yongjun209ba422011-04-17 17:27:08 +00006450 * 8.2.6. Get the Current Identifiers of Associations
6451 * (SCTP_GET_ASSOC_ID_LIST)
6452 *
6453 * This option gets the current list of SCTP association identifiers of
6454 * the SCTP associations handled by a one-to-many style socket.
6455 */
6456static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,
6457 char __user *optval, int __user *optlen)
6458{
6459 struct sctp_sock *sp = sctp_sk(sk);
6460 struct sctp_association *asoc;
6461 struct sctp_assoc_ids *ids;
6462 u32 num = 0;
6463
6464 if (sctp_style(sk, TCP))
6465 return -EOPNOTSUPP;
6466
6467 if (len < sizeof(struct sctp_assoc_ids))
6468 return -EINVAL;
6469
6470 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
6471 num++;
6472 }
6473
6474 if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num)
6475 return -EINVAL;
6476
6477 len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num;
6478
Marcelo Ricardo Leitner9ba0b962015-12-23 16:28:40 -02006479 ids = kmalloc(len, GFP_USER | __GFP_NOWARN);
Wei Yongjun209ba422011-04-17 17:27:08 +00006480 if (unlikely(!ids))
6481 return -ENOMEM;
6482
6483 ids->gaids_number_of_ids = num;
6484 num = 0;
6485 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
6486 ids->gaids_assoc_id[num++] = asoc->assoc_id;
6487 }
6488
6489 if (put_user(len, optlen) || copy_to_user(optval, ids, len)) {
6490 kfree(ids);
6491 return -EFAULT;
6492 }
6493
6494 kfree(ids);
6495 return 0;
6496}
6497
Neil Horman5aa93bc2012-07-21 07:56:07 +00006498/*
6499 * SCTP_PEER_ADDR_THLDS
6500 *
6501 * This option allows us to fetch the partially failed threshold for one or all
6502 * transports in an association. See Section 6.1 of:
6503 * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
6504 */
6505static int sctp_getsockopt_paddr_thresholds(struct sock *sk,
6506 char __user *optval,
6507 int len,
6508 int __user *optlen)
6509{
6510 struct sctp_paddrthlds val;
6511 struct sctp_transport *trans;
6512 struct sctp_association *asoc;
6513
6514 if (len < sizeof(struct sctp_paddrthlds))
6515 return -EINVAL;
6516 len = sizeof(struct sctp_paddrthlds);
6517 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len))
6518 return -EFAULT;
6519
6520 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
6521 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
6522 if (!asoc)
6523 return -ENOENT;
6524
6525 val.spt_pathpfthld = asoc->pf_retrans;
6526 val.spt_pathmaxrxt = asoc->pathmaxrxt;
6527 } else {
6528 trans = sctp_addr_id2transport(sk, &val.spt_address,
6529 val.spt_assoc_id);
6530 if (!trans)
6531 return -ENOENT;
6532
6533 val.spt_pathmaxrxt = trans->pathmaxrxt;
6534 val.spt_pathpfthld = trans->pf_retrans;
6535 }
6536
6537 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
6538 return -EFAULT;
6539
6540 return 0;
6541}
6542
Michele Baldessari196d6752012-12-01 04:49:42 +00006543/*
6544 * SCTP_GET_ASSOC_STATS
6545 *
6546 * This option retrieves local per endpoint statistics. It is modeled
6547 * after OpenSolaris' implementation
6548 */
6549static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
6550 char __user *optval,
6551 int __user *optlen)
6552{
6553 struct sctp_assoc_stats sas;
6554 struct sctp_association *asoc = NULL;
6555
6556 /* User must provide at least the assoc id */
6557 if (len < sizeof(sctp_assoc_t))
6558 return -EINVAL;
6559
Guenter Roeck726bc6b2013-02-27 10:57:31 +00006560 /* Allow the struct to grow and fill in as much as possible */
6561 len = min_t(size_t, len, sizeof(sas));
6562
Michele Baldessari196d6752012-12-01 04:49:42 +00006563 if (copy_from_user(&sas, optval, len))
6564 return -EFAULT;
6565
6566 asoc = sctp_id2assoc(sk, sas.sas_assoc_id);
6567 if (!asoc)
6568 return -EINVAL;
6569
6570 sas.sas_rtxchunks = asoc->stats.rtxchunks;
6571 sas.sas_gapcnt = asoc->stats.gapcnt;
6572 sas.sas_outofseqtsns = asoc->stats.outofseqtsns;
6573 sas.sas_osacks = asoc->stats.osacks;
6574 sas.sas_isacks = asoc->stats.isacks;
6575 sas.sas_octrlchunks = asoc->stats.octrlchunks;
6576 sas.sas_ictrlchunks = asoc->stats.ictrlchunks;
6577 sas.sas_oodchunks = asoc->stats.oodchunks;
6578 sas.sas_iodchunks = asoc->stats.iodchunks;
6579 sas.sas_ouodchunks = asoc->stats.ouodchunks;
6580 sas.sas_iuodchunks = asoc->stats.iuodchunks;
6581 sas.sas_idupchunks = asoc->stats.idupchunks;
6582 sas.sas_opackets = asoc->stats.opackets;
6583 sas.sas_ipackets = asoc->stats.ipackets;
6584
6585 /* New high max rto observed, will return 0 if not a single
6586 * RTO update took place. obs_rto_ipaddr will be bogus
6587 * in such a case
6588 */
6589 sas.sas_maxrto = asoc->stats.max_obs_rto;
6590 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr,
6591 sizeof(struct sockaddr_storage));
6592
6593 /* Mark beginning of a new observation period */
6594 asoc->stats.max_obs_rto = asoc->rto_min;
6595
Michele Baldessari196d6752012-12-01 04:49:42 +00006596 if (put_user(len, optlen))
6597 return -EFAULT;
6598
Daniel Borkmannbb333812013-06-28 19:49:40 +02006599 pr_debug("%s: len:%d, assoc_id:%d\n", __func__, len, sas.sas_assoc_id);
Michele Baldessari196d6752012-12-01 04:49:42 +00006600
6601 if (copy_to_user(optval, &sas, len))
6602 return -EFAULT;
6603
6604 return 0;
6605}
6606
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02006607static int sctp_getsockopt_recvrcvinfo(struct sock *sk, int len,
6608 char __user *optval,
6609 int __user *optlen)
6610{
6611 int val = 0;
6612
6613 if (len < sizeof(int))
6614 return -EINVAL;
6615
6616 len = sizeof(int);
6617 if (sctp_sk(sk)->recvrcvinfo)
6618 val = 1;
6619 if (put_user(len, optlen))
6620 return -EFAULT;
6621 if (copy_to_user(optval, &val, len))
6622 return -EFAULT;
6623
6624 return 0;
6625}
6626
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02006627static int sctp_getsockopt_recvnxtinfo(struct sock *sk, int len,
6628 char __user *optval,
6629 int __user *optlen)
6630{
6631 int val = 0;
6632
6633 if (len < sizeof(int))
6634 return -EINVAL;
6635
6636 len = sizeof(int);
6637 if (sctp_sk(sk)->recvnxtinfo)
6638 val = 1;
6639 if (put_user(len, optlen))
6640 return -EFAULT;
6641 if (copy_to_user(optval, &val, len))
6642 return -EFAULT;
6643
6644 return 0;
6645}
6646
Xin Long28aa4c22016-07-09 19:47:40 +08006647static int sctp_getsockopt_pr_supported(struct sock *sk, int len,
6648 char __user *optval,
6649 int __user *optlen)
6650{
6651 struct sctp_assoc_value params;
6652 struct sctp_association *asoc;
6653 int retval = -EFAULT;
6654
6655 if (len < sizeof(params)) {
6656 retval = -EINVAL;
6657 goto out;
6658 }
6659
6660 len = sizeof(params);
6661 if (copy_from_user(&params, optval, len))
6662 goto out;
6663
6664 asoc = sctp_id2assoc(sk, params.assoc_id);
6665 if (asoc) {
6666 params.assoc_value = asoc->prsctp_enable;
6667 } else if (!params.assoc_id) {
6668 struct sctp_sock *sp = sctp_sk(sk);
6669
6670 params.assoc_value = sp->ep->prsctp_enable;
6671 } else {
6672 retval = -EINVAL;
6673 goto out;
6674 }
6675
6676 if (put_user(len, optlen))
6677 goto out;
6678
6679 if (copy_to_user(optval, &params, len))
6680 goto out;
6681
6682 retval = 0;
6683
6684out:
6685 return retval;
6686}
6687
Xin Longf959fb42016-07-09 19:47:41 +08006688static int sctp_getsockopt_default_prinfo(struct sock *sk, int len,
6689 char __user *optval,
6690 int __user *optlen)
6691{
6692 struct sctp_default_prinfo info;
6693 struct sctp_association *asoc;
6694 int retval = -EFAULT;
6695
6696 if (len < sizeof(info)) {
6697 retval = -EINVAL;
6698 goto out;
6699 }
6700
6701 len = sizeof(info);
6702 if (copy_from_user(&info, optval, len))
6703 goto out;
6704
6705 asoc = sctp_id2assoc(sk, info.pr_assoc_id);
6706 if (asoc) {
6707 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags);
6708 info.pr_value = asoc->default_timetolive;
6709 } else if (!info.pr_assoc_id) {
6710 struct sctp_sock *sp = sctp_sk(sk);
6711
6712 info.pr_policy = SCTP_PR_POLICY(sp->default_flags);
6713 info.pr_value = sp->default_timetolive;
6714 } else {
6715 retval = -EINVAL;
6716 goto out;
6717 }
6718
6719 if (put_user(len, optlen))
6720 goto out;
6721
6722 if (copy_to_user(optval, &info, len))
6723 goto out;
6724
6725 retval = 0;
6726
6727out:
6728 return retval;
6729}
6730
Xin Long826d2532016-07-09 19:47:42 +08006731static int sctp_getsockopt_pr_assocstatus(struct sock *sk, int len,
6732 char __user *optval,
6733 int __user *optlen)
6734{
6735 struct sctp_prstatus params;
6736 struct sctp_association *asoc;
6737 int policy;
6738 int retval = -EINVAL;
6739
6740 if (len < sizeof(params))
6741 goto out;
6742
6743 len = sizeof(params);
6744 if (copy_from_user(&params, optval, len)) {
6745 retval = -EFAULT;
6746 goto out;
6747 }
6748
6749 policy = params.sprstat_policy;
6750 if (policy & ~SCTP_PR_SCTP_MASK)
6751 goto out;
6752
6753 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
6754 if (!asoc)
6755 goto out;
6756
6757 if (policy == SCTP_PR_SCTP_NONE) {
6758 params.sprstat_abandoned_unsent = 0;
6759 params.sprstat_abandoned_sent = 0;
6760 for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
6761 params.sprstat_abandoned_unsent +=
6762 asoc->abandoned_unsent[policy];
6763 params.sprstat_abandoned_sent +=
6764 asoc->abandoned_sent[policy];
6765 }
6766 } else {
6767 params.sprstat_abandoned_unsent =
6768 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)];
6769 params.sprstat_abandoned_sent =
6770 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)];
6771 }
6772
6773 if (put_user(len, optlen)) {
6774 retval = -EFAULT;
6775 goto out;
6776 }
6777
6778 if (copy_to_user(optval, &params, len)) {
6779 retval = -EFAULT;
6780 goto out;
6781 }
6782
6783 retval = 0;
6784
6785out:
6786 return retval;
6787}
6788
Xin Longd229d482017-04-01 17:07:46 +08006789static int sctp_getsockopt_pr_streamstatus(struct sock *sk, int len,
6790 char __user *optval,
6791 int __user *optlen)
6792{
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03006793 struct sctp_stream_out_ext *streamoute;
Xin Longd229d482017-04-01 17:07:46 +08006794 struct sctp_association *asoc;
6795 struct sctp_prstatus params;
6796 int retval = -EINVAL;
6797 int policy;
6798
6799 if (len < sizeof(params))
6800 goto out;
6801
6802 len = sizeof(params);
6803 if (copy_from_user(&params, optval, len)) {
6804 retval = -EFAULT;
6805 goto out;
6806 }
6807
6808 policy = params.sprstat_policy;
6809 if (policy & ~SCTP_PR_SCTP_MASK)
6810 goto out;
6811
6812 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
Xin Longcee360a2017-05-31 16:36:31 +08006813 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt)
Xin Longd229d482017-04-01 17:07:46 +08006814 goto out;
6815
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03006816 streamoute = asoc->stream.out[params.sprstat_sid].ext;
6817 if (!streamoute) {
6818 /* Not allocated yet, means all stats are 0 */
6819 params.sprstat_abandoned_unsent = 0;
6820 params.sprstat_abandoned_sent = 0;
6821 retval = 0;
6822 goto out;
6823 }
6824
Xin Longd229d482017-04-01 17:07:46 +08006825 if (policy == SCTP_PR_SCTP_NONE) {
6826 params.sprstat_abandoned_unsent = 0;
6827 params.sprstat_abandoned_sent = 0;
6828 for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
6829 params.sprstat_abandoned_unsent +=
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03006830 streamoute->abandoned_unsent[policy];
Xin Longd229d482017-04-01 17:07:46 +08006831 params.sprstat_abandoned_sent +=
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03006832 streamoute->abandoned_sent[policy];
Xin Longd229d482017-04-01 17:07:46 +08006833 }
6834 } else {
6835 params.sprstat_abandoned_unsent =
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03006836 streamoute->abandoned_unsent[__SCTP_PR_INDEX(policy)];
Xin Longd229d482017-04-01 17:07:46 +08006837 params.sprstat_abandoned_sent =
Marcelo Ricardo Leitnerf952be72017-10-03 19:20:11 -03006838 streamoute->abandoned_sent[__SCTP_PR_INDEX(policy)];
Xin Longd229d482017-04-01 17:07:46 +08006839 }
6840
6841 if (put_user(len, optlen) || copy_to_user(optval, &params, len)) {
6842 retval = -EFAULT;
6843 goto out;
6844 }
6845
6846 retval = 0;
6847
6848out:
6849 return retval;
6850}
6851
Xin Longc0d8bab2017-03-10 12:11:12 +08006852static int sctp_getsockopt_reconfig_supported(struct sock *sk, int len,
6853 char __user *optval,
6854 int __user *optlen)
6855{
6856 struct sctp_assoc_value params;
6857 struct sctp_association *asoc;
6858 int retval = -EFAULT;
6859
6860 if (len < sizeof(params)) {
6861 retval = -EINVAL;
6862 goto out;
6863 }
6864
6865 len = sizeof(params);
6866 if (copy_from_user(&params, optval, len))
6867 goto out;
6868
6869 asoc = sctp_id2assoc(sk, params.assoc_id);
6870 if (asoc) {
6871 params.assoc_value = asoc->reconf_enable;
6872 } else if (!params.assoc_id) {
6873 struct sctp_sock *sp = sctp_sk(sk);
6874
6875 params.assoc_value = sp->ep->reconf_enable;
6876 } else {
6877 retval = -EINVAL;
6878 goto out;
6879 }
6880
6881 if (put_user(len, optlen))
6882 goto out;
6883
6884 if (copy_to_user(optval, &params, len))
6885 goto out;
6886
6887 retval = 0;
6888
6889out:
6890 return retval;
6891}
6892
Xin Long9fb657a2017-01-18 00:44:46 +08006893static int sctp_getsockopt_enable_strreset(struct sock *sk, int len,
6894 char __user *optval,
6895 int __user *optlen)
6896{
6897 struct sctp_assoc_value params;
6898 struct sctp_association *asoc;
6899 int retval = -EFAULT;
6900
6901 if (len < sizeof(params)) {
6902 retval = -EINVAL;
6903 goto out;
6904 }
6905
6906 len = sizeof(params);
6907 if (copy_from_user(&params, optval, len))
6908 goto out;
6909
6910 asoc = sctp_id2assoc(sk, params.assoc_id);
6911 if (asoc) {
6912 params.assoc_value = asoc->strreset_enable;
6913 } else if (!params.assoc_id) {
6914 struct sctp_sock *sp = sctp_sk(sk);
6915
6916 params.assoc_value = sp->ep->strreset_enable;
6917 } else {
6918 retval = -EINVAL;
6919 goto out;
6920 }
6921
6922 if (put_user(len, optlen))
6923 goto out;
6924
6925 if (copy_to_user(optval, &params, len))
6926 goto out;
6927
6928 retval = 0;
6929
6930out:
6931 return retval;
6932}
6933
Marcelo Ricardo Leitner13aa8772017-10-03 19:20:14 -03006934static int sctp_getsockopt_scheduler(struct sock *sk, int len,
6935 char __user *optval,
6936 int __user *optlen)
6937{
6938 struct sctp_assoc_value params;
6939 struct sctp_association *asoc;
6940 int retval = -EFAULT;
6941
6942 if (len < sizeof(params)) {
6943 retval = -EINVAL;
6944 goto out;
6945 }
6946
6947 len = sizeof(params);
6948 if (copy_from_user(&params, optval, len))
6949 goto out;
6950
6951 asoc = sctp_id2assoc(sk, params.assoc_id);
6952 if (!asoc) {
6953 retval = -EINVAL;
6954 goto out;
6955 }
6956
6957 params.assoc_value = sctp_sched_get_sched(asoc);
6958
6959 if (put_user(len, optlen))
6960 goto out;
6961
6962 if (copy_to_user(optval, &params, len))
6963 goto out;
6964
6965 retval = 0;
6966
6967out:
6968 return retval;
6969}
6970
Marcelo Ricardo Leitner0ccdf3c2017-10-03 19:20:15 -03006971static int sctp_getsockopt_scheduler_value(struct sock *sk, int len,
6972 char __user *optval,
6973 int __user *optlen)
6974{
6975 struct sctp_stream_value params;
6976 struct sctp_association *asoc;
6977 int retval = -EFAULT;
6978
6979 if (len < sizeof(params)) {
6980 retval = -EINVAL;
6981 goto out;
6982 }
6983
6984 len = sizeof(params);
6985 if (copy_from_user(&params, optval, len))
6986 goto out;
6987
6988 asoc = sctp_id2assoc(sk, params.assoc_id);
6989 if (!asoc) {
6990 retval = -EINVAL;
6991 goto out;
6992 }
6993
6994 retval = sctp_sched_get_value(asoc, params.stream_id,
6995 &params.stream_value);
6996 if (retval)
6997 goto out;
6998
6999 if (put_user(len, optlen)) {
7000 retval = -EFAULT;
7001 goto out;
7002 }
7003
7004 if (copy_to_user(optval, &params, len)) {
7005 retval = -EFAULT;
7006 goto out;
7007 }
7008
7009out:
7010 return retval;
7011}
7012
Xin Long772a5862017-12-08 21:03:58 +08007013static int sctp_getsockopt_interleaving_supported(struct sock *sk, int len,
7014 char __user *optval,
7015 int __user *optlen)
7016{
7017 struct sctp_assoc_value params;
7018 struct sctp_association *asoc;
7019 int retval = -EFAULT;
7020
7021 if (len < sizeof(params)) {
7022 retval = -EINVAL;
7023 goto out;
7024 }
7025
7026 len = sizeof(params);
7027 if (copy_from_user(&params, optval, len))
7028 goto out;
7029
7030 asoc = sctp_id2assoc(sk, params.assoc_id);
7031 if (asoc) {
7032 params.assoc_value = asoc->intl_enable;
7033 } else if (!params.assoc_id) {
7034 struct sctp_sock *sp = sctp_sk(sk);
7035
7036 params.assoc_value = sp->strm_interleave;
7037 } else {
7038 retval = -EINVAL;
7039 goto out;
7040 }
7041
7042 if (put_user(len, optlen))
7043 goto out;
7044
7045 if (copy_to_user(optval, &params, len))
7046 goto out;
7047
7048 retval = 0;
7049
7050out:
7051 return retval;
7052}
7053
Daniel Borkmanndda91922013-06-17 11:40:05 +02007054static int sctp_getsockopt(struct sock *sk, int level, int optname,
7055 char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007056{
7057 int retval = 0;
7058 int len;
7059
Daniel Borkmannbb333812013-06-28 19:49:40 +02007060 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007061
7062 /* I can hardly begin to describe how wrong this is. This is
7063 * so broken as to be worse than useless. The API draft
7064 * REALLY is NOT helpful here... I am not convinced that the
7065 * semantics of getsockopt() with a level OTHER THAN SOL_SCTP
7066 * are at all well-founded.
7067 */
7068 if (level != SOL_SCTP) {
7069 struct sctp_af *af = sctp_sk(sk)->pf->af;
7070
7071 retval = af->getsockopt(sk, level, optname, optval, optlen);
7072 return retval;
7073 }
7074
7075 if (get_user(len, optlen))
7076 return -EFAULT;
7077
Jiri Slabya4b8e712016-10-21 14:13:24 +02007078 if (len < 0)
7079 return -EINVAL;
7080
wangweidong048ed4b2014-01-21 15:44:11 +08007081 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007082
7083 switch (optname) {
7084 case SCTP_STATUS:
7085 retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen);
7086 break;
7087 case SCTP_DISABLE_FRAGMENTS:
7088 retval = sctp_getsockopt_disable_fragments(sk, len, optval,
7089 optlen);
7090 break;
7091 case SCTP_EVENTS:
7092 retval = sctp_getsockopt_events(sk, len, optval, optlen);
7093 break;
7094 case SCTP_AUTOCLOSE:
7095 retval = sctp_getsockopt_autoclose(sk, len, optval, optlen);
7096 break;
7097 case SCTP_SOCKOPT_PEELOFF:
7098 retval = sctp_getsockopt_peeloff(sk, len, optval, optlen);
7099 break;
Neil Horman2cb5c8e2017-06-30 13:32:57 -04007100 case SCTP_SOCKOPT_PEELOFF_FLAGS:
7101 retval = sctp_getsockopt_peeloff_flags(sk, len, optval, optlen);
7102 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007103 case SCTP_PEER_ADDR_PARAMS:
7104 retval = sctp_getsockopt_peer_addr_params(sk, len, optval,
7105 optlen);
7106 break;
Shan Wei4580ccc2011-01-18 22:39:00 +00007107 case SCTP_DELAYED_SACK:
Wei Yongjund364d922008-05-09 15:13:26 -07007108 retval = sctp_getsockopt_delayed_ack(sk, len, optval,
Frank Filz77086102005-12-22 11:37:30 -08007109 optlen);
7110 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007111 case SCTP_INITMSG:
7112 retval = sctp_getsockopt_initmsg(sk, len, optval, optlen);
7113 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007114 case SCTP_GET_PEER_ADDRS:
7115 retval = sctp_getsockopt_peer_addrs(sk, len, optval,
7116 optlen);
7117 break;
7118 case SCTP_GET_LOCAL_ADDRS:
7119 retval = sctp_getsockopt_local_addrs(sk, len, optval,
7120 optlen);
7121 break;
Vlad Yasevichc6ba68a2009-06-01 12:41:15 -04007122 case SCTP_SOCKOPT_CONNECTX3:
7123 retval = sctp_getsockopt_connectx3(sk, len, optval, optlen);
7124 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007125 case SCTP_DEFAULT_SEND_PARAM:
7126 retval = sctp_getsockopt_default_send_param(sk, len,
7127 optval, optlen);
7128 break;
Geir Ola Vaagland6b3fd5f2014-07-12 20:30:39 +02007129 case SCTP_DEFAULT_SNDINFO:
7130 retval = sctp_getsockopt_default_sndinfo(sk, len,
7131 optval, optlen);
7132 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007133 case SCTP_PRIMARY_ADDR:
7134 retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen);
7135 break;
7136 case SCTP_NODELAY:
7137 retval = sctp_getsockopt_nodelay(sk, len, optval, optlen);
7138 break;
7139 case SCTP_RTOINFO:
7140 retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen);
7141 break;
7142 case SCTP_ASSOCINFO:
7143 retval = sctp_getsockopt_associnfo(sk, len, optval, optlen);
7144 break;
7145 case SCTP_I_WANT_MAPPED_V4_ADDR:
7146 retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen);
7147 break;
7148 case SCTP_MAXSEG:
7149 retval = sctp_getsockopt_maxseg(sk, len, optval, optlen);
7150 break;
7151 case SCTP_GET_PEER_ADDR_INFO:
7152 retval = sctp_getsockopt_peer_addr_info(sk, len, optval,
7153 optlen);
7154 break;
Ivan Skytte Jorgensen0f3fffd2006-12-20 16:07:04 -08007155 case SCTP_ADAPTATION_LAYER:
7156 retval = sctp_getsockopt_adaptation_layer(sk, len, optval,
Linus Torvalds1da177e2005-04-16 15:20:36 -07007157 optlen);
7158 break;
Ivan Skytte Jorgensen6ab792f2006-12-13 16:34:22 -08007159 case SCTP_CONTEXT:
7160 retval = sctp_getsockopt_context(sk, len, optval, optlen);
7161 break;
Vlad Yasevichb6e13312007-04-20 12:23:15 -07007162 case SCTP_FRAGMENT_INTERLEAVE:
7163 retval = sctp_getsockopt_fragment_interleave(sk, len, optval,
7164 optlen);
7165 break;
Vlad Yasevichd49d91d2007-03-23 11:32:00 -07007166 case SCTP_PARTIAL_DELIVERY_POINT:
7167 retval = sctp_getsockopt_partial_delivery_point(sk, len, optval,
7168 optlen);
7169 break;
Vlad Yasevich70331572007-03-23 11:34:36 -07007170 case SCTP_MAX_BURST:
7171 retval = sctp_getsockopt_maxburst(sk, len, optval, optlen);
7172 break;
Vlad Yasevich65b07e52007-09-16 19:34:00 -07007173 case SCTP_AUTH_KEY:
7174 case SCTP_AUTH_CHUNK:
7175 case SCTP_AUTH_DELETE_KEY:
7176 retval = -EOPNOTSUPP;
7177 break;
7178 case SCTP_HMAC_IDENT:
7179 retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen);
7180 break;
7181 case SCTP_AUTH_ACTIVE_KEY:
7182 retval = sctp_getsockopt_active_key(sk, len, optval, optlen);
7183 break;
7184 case SCTP_PEER_AUTH_CHUNKS:
7185 retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval,
7186 optlen);
7187 break;
7188 case SCTP_LOCAL_AUTH_CHUNKS:
7189 retval = sctp_getsockopt_local_auth_chunks(sk, len, optval,
7190 optlen);
7191 break;
Wei Yongjunaea3c5c2008-12-25 16:57:24 -08007192 case SCTP_GET_ASSOC_NUMBER:
7193 retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen);
7194 break;
Wei Yongjun209ba422011-04-17 17:27:08 +00007195 case SCTP_GET_ASSOC_ID_LIST:
7196 retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen);
7197 break;
Michio Honda7dc04d72011-04-26 20:16:31 +09007198 case SCTP_AUTO_ASCONF:
7199 retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen);
7200 break;
Neil Horman5aa93bc2012-07-21 07:56:07 +00007201 case SCTP_PEER_ADDR_THLDS:
7202 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen);
7203 break;
Michele Baldessari196d6752012-12-01 04:49:42 +00007204 case SCTP_GET_ASSOC_STATS:
7205 retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen);
7206 break;
Geir Ola Vaagland0d3a4212014-07-12 20:30:37 +02007207 case SCTP_RECVRCVINFO:
7208 retval = sctp_getsockopt_recvrcvinfo(sk, len, optval, optlen);
7209 break;
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02007210 case SCTP_RECVNXTINFO:
7211 retval = sctp_getsockopt_recvnxtinfo(sk, len, optval, optlen);
7212 break;
Xin Long28aa4c22016-07-09 19:47:40 +08007213 case SCTP_PR_SUPPORTED:
7214 retval = sctp_getsockopt_pr_supported(sk, len, optval, optlen);
7215 break;
Xin Longf959fb42016-07-09 19:47:41 +08007216 case SCTP_DEFAULT_PRINFO:
7217 retval = sctp_getsockopt_default_prinfo(sk, len, optval,
7218 optlen);
7219 break;
Xin Long826d2532016-07-09 19:47:42 +08007220 case SCTP_PR_ASSOC_STATUS:
7221 retval = sctp_getsockopt_pr_assocstatus(sk, len, optval,
7222 optlen);
7223 break;
Xin Longd229d482017-04-01 17:07:46 +08007224 case SCTP_PR_STREAM_STATUS:
7225 retval = sctp_getsockopt_pr_streamstatus(sk, len, optval,
7226 optlen);
7227 break;
Xin Longc0d8bab2017-03-10 12:11:12 +08007228 case SCTP_RECONFIG_SUPPORTED:
7229 retval = sctp_getsockopt_reconfig_supported(sk, len, optval,
7230 optlen);
7231 break;
Xin Long9fb657a2017-01-18 00:44:46 +08007232 case SCTP_ENABLE_STREAM_RESET:
7233 retval = sctp_getsockopt_enable_strreset(sk, len, optval,
7234 optlen);
7235 break;
Marcelo Ricardo Leitner13aa8772017-10-03 19:20:14 -03007236 case SCTP_STREAM_SCHEDULER:
7237 retval = sctp_getsockopt_scheduler(sk, len, optval,
7238 optlen);
7239 break;
Marcelo Ricardo Leitner0ccdf3c2017-10-03 19:20:15 -03007240 case SCTP_STREAM_SCHEDULER_VALUE:
7241 retval = sctp_getsockopt_scheduler_value(sk, len, optval,
7242 optlen);
7243 break;
Xin Long772a5862017-12-08 21:03:58 +08007244 case SCTP_INTERLEAVING_SUPPORTED:
7245 retval = sctp_getsockopt_interleaving_supported(sk, len, optval,
7246 optlen);
7247 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007248 default:
7249 retval = -ENOPROTOOPT;
7250 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07007251 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007252
wangweidong048ed4b2014-01-21 15:44:11 +08007253 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007254 return retval;
7255}
7256
Craig Gallek086c6532016-02-10 11:50:35 -05007257static int sctp_hash(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007258{
7259 /* STUB */
Craig Gallek086c6532016-02-10 11:50:35 -05007260 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007261}
7262
7263static void sctp_unhash(struct sock *sk)
7264{
7265 /* STUB */
7266}
7267
7268/* Check if port is acceptable. Possibly find first available port.
7269 *
7270 * The port hash table (contained in the 'global' SCTP protocol storage
7271 * returned by struct sctp_protocol *sctp_get_protocol()). The hash
7272 * table is an array of 4096 lists (sctp_bind_hashbucket). Each
7273 * list (the list number is the port number hashed out, so as you
7274 * would expect from a hash function, all the ports in a given list have
7275 * such a number that hashes out to the same list number; you were
7276 * expecting that, right?); so each list has a set of ports, with a
7277 * link to the socket (struct sock) that uses it, the port number and
7278 * a fastreuse flag (FIXME: NPI ipg).
7279 */
7280static struct sctp_bind_bucket *sctp_bucket_create(
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007281 struct sctp_bind_hashbucket *head, struct net *, unsigned short snum);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007282
7283static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
7284{
7285 struct sctp_bind_hashbucket *head; /* hash list */
Sasha Levinb67bfe02013-02-27 17:06:00 -08007286 struct sctp_bind_bucket *pp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007287 unsigned short snum;
7288 int ret;
7289
Al Viro04afd8b2006-11-20 17:02:01 -08007290 snum = ntohs(addr->v4.sin_port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007291
Daniel Borkmannbb333812013-06-28 19:49:40 +02007292 pr_debug("%s: begins, snum:%d\n", __func__, snum);
7293
wangweidong79b91132014-01-21 15:44:07 +08007294 local_bh_disable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007295
7296 if (snum == 0) {
Stephen Hemminger06393002007-10-10 17:30:18 -07007297 /* Search for an available port. */
Stephen Hemminger227b60f2007-10-10 17:30:46 -07007298 int low, high, remaining, index;
7299 unsigned int rover;
WANG Cong122ff242014-05-12 16:04:53 -07007300 struct net *net = sock_net(sk);
Stephen Hemminger227b60f2007-10-10 17:30:46 -07007301
WANG Cong122ff242014-05-12 16:04:53 -07007302 inet_get_local_port_range(net, &low, &high);
Stephen Hemminger227b60f2007-10-10 17:30:46 -07007303 remaining = (high - low) + 1;
Aruna-Hewapathirane63862b52014-01-11 07:15:59 -05007304 rover = prandom_u32() % remaining + low;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007305
Linus Torvalds1da177e2005-04-16 15:20:36 -07007306 do {
7307 rover++;
7308 if ((rover < low) || (rover > high))
7309 rover = low;
WANG Cong122ff242014-05-12 16:04:53 -07007310 if (inet_is_local_reserved_port(net, rover))
Amerigo Wange3826f12010-05-05 00:27:06 +00007311 continue;
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007312 index = sctp_phashfn(sock_net(sk), rover);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007313 head = &sctp_port_hashtable[index];
wangweidong3c8e43b2014-01-21 15:44:08 +08007314 spin_lock(&head->lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08007315 sctp_for_each_hentry(pp, &head->chain)
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007316 if ((pp->port == rover) &&
7317 net_eq(sock_net(sk), pp->net))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007318 goto next;
7319 break;
7320 next:
wangweidong3c8e43b2014-01-21 15:44:08 +08007321 spin_unlock(&head->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007322 } while (--remaining > 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007323
7324 /* Exhausted local port range during search? */
7325 ret = 1;
7326 if (remaining <= 0)
7327 goto fail;
7328
7329 /* OK, here is the one we will use. HEAD (the port
7330 * hash table list entry) is non-NULL and we hold it's
7331 * mutex.
7332 */
7333 snum = rover;
7334 } else {
7335 /* We are given an specific port number; we verify
7336 * that it is not being used. If it is used, we will
7337 * exahust the search in the hash list corresponding
7338 * to the port number (snum) - we detect that with the
7339 * port iterator, pp being NULL.
7340 */
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007341 head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)];
wangweidong3c8e43b2014-01-21 15:44:08 +08007342 spin_lock(&head->lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08007343 sctp_for_each_hentry(pp, &head->chain) {
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007344 if ((pp->port == snum) && net_eq(pp->net, sock_net(sk)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007345 goto pp_found;
7346 }
7347 }
7348 pp = NULL;
7349 goto pp_not_found;
7350pp_found:
7351 if (!hlist_empty(&pp->owner)) {
7352 /* We had a port hash table hit - there is an
7353 * available port (pp != NULL) and it is being
7354 * used by other socket (pp->owner not empty); that other
7355 * socket is going to be sk2.
7356 */
7357 int reuse = sk->sk_reuse;
7358 struct sock *sk2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007359
Daniel Borkmannbb333812013-06-28 19:49:40 +02007360 pr_debug("%s: found a possible match\n", __func__);
7361
Vlad Yasevichce5325c2007-05-04 13:34:49 -07007362 if (pp->fastreuse && sk->sk_reuse &&
7363 sk->sk_state != SCTP_SS_LISTENING)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007364 goto success;
7365
7366 /* Run through the list of sockets bound to the port
7367 * (pp->port) [via the pointers bind_next and
7368 * bind_pprev in the struct sock *sk2 (pp->sk)]. On each one,
7369 * we get the endpoint they describe and run through
7370 * the endpoint's list of IP (v4 or v6) addresses,
7371 * comparing each of the addresses with the address of
7372 * the socket sk. If we find a match, then that means
7373 * that this port/socket (sk) combination are already
7374 * in an endpoint.
7375 */
Sasha Levinb67bfe02013-02-27 17:06:00 -08007376 sk_for_each_bound(sk2, &pp->owner) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007377 struct sctp_endpoint *ep2;
7378 ep2 = sctp_sk(sk2)->ep;
7379
Vlad Yasevich4e540642008-07-18 23:06:32 -07007380 if (sk == sk2 ||
7381 (reuse && sk2->sk_reuse &&
7382 sk2->sk_state != SCTP_SS_LISTENING))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007383 continue;
7384
Vlad Yasevich7dab83d2008-07-18 23:05:40 -07007385 if (sctp_bind_addr_conflict(&ep2->base.bind_addr, addr,
7386 sctp_sk(sk2), sctp_sk(sk))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007387 ret = (long)sk2;
7388 goto fail_unlock;
7389 }
7390 }
Daniel Borkmannbb333812013-06-28 19:49:40 +02007391
7392 pr_debug("%s: found a match\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007393 }
7394pp_not_found:
7395 /* If there was a hash table miss, create a new port. */
7396 ret = 1;
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007397 if (!pp && !(pp = sctp_bucket_create(head, sock_net(sk), snum)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007398 goto fail_unlock;
7399
7400 /* In either case (hit or miss), make sure fastreuse is 1 only
7401 * if sk->sk_reuse is too (that is, if the caller requested
7402 * SO_REUSEADDR on this socket -sk-).
7403 */
Vlad Yasevichce5325c2007-05-04 13:34:49 -07007404 if (hlist_empty(&pp->owner)) {
7405 if (sk->sk_reuse && sk->sk_state != SCTP_SS_LISTENING)
7406 pp->fastreuse = 1;
7407 else
7408 pp->fastreuse = 0;
7409 } else if (pp->fastreuse &&
7410 (!sk->sk_reuse || sk->sk_state == SCTP_SS_LISTENING))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007411 pp->fastreuse = 0;
7412
7413 /* We are set, so fill up all the data in the hash table
7414 * entry, tie the socket list information with the rest of the
7415 * sockets FIXME: Blurry, NPI (ipg).
7416 */
7417success:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007418 if (!sctp_sk(sk)->bind_hash) {
Eric Dumazetc720c7e82009-10-15 06:30:45 +00007419 inet_sk(sk)->inet_num = snum;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007420 sk_add_bind_node(sk, &pp->owner);
7421 sctp_sk(sk)->bind_hash = pp;
7422 }
7423 ret = 0;
7424
7425fail_unlock:
wangweidong3c8e43b2014-01-21 15:44:08 +08007426 spin_unlock(&head->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007427
7428fail:
wangweidong79b91132014-01-21 15:44:07 +08007429 local_bh_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007430 return ret;
7431}
7432
7433/* Assign a 'snum' port to the socket. If snum == 0, an ephemeral
7434 * port is requested.
7435 */
7436static int sctp_get_port(struct sock *sk, unsigned short snum)
7437{
Linus Torvalds1da177e2005-04-16 15:20:36 -07007438 union sctp_addr addr;
7439 struct sctp_af *af = sctp_sk(sk)->pf->af;
7440
7441 /* Set up a dummy address struct from the sk. */
7442 af->from_sk(&addr, sk);
7443 addr.v4.sin_port = htons(snum);
7444
7445 /* Note: sk->sk_num gets filled in if ephemeral port request. */
Daniel Borkmann62208f12013-06-25 18:17:30 +02007446 return !!sctp_get_port_local(sk, &addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007447}
7448
7449/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07007450 * Move a socket to LISTENING state.
7451 */
Daniel Borkmanndda91922013-06-17 11:40:05 +02007452static int sctp_listen_start(struct sock *sk, int backlog)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007453{
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007454 struct sctp_sock *sp = sctp_sk(sk);
7455 struct sctp_endpoint *ep = sp->ep;
Herbert Xu5821c762016-01-24 21:20:12 +08007456 struct crypto_shash *tfm = NULL;
Neil Horman3c681982012-10-24 09:20:03 +00007457 char alg[32];
Linus Torvalds1da177e2005-04-16 15:20:36 -07007458
7459 /* Allocate HMAC for generating cookie. */
Neil Horman3c681982012-10-24 09:20:03 +00007460 if (!sp->hmac && sp->sctp_hmac_alg) {
7461 sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg);
Herbert Xu5821c762016-01-24 21:20:12 +08007462 tfm = crypto_alloc_shash(alg, 0, 0);
Vlad Yasevich8dc49842007-05-09 13:50:20 -07007463 if (IS_ERR(tfm)) {
Joe Perchese87cc472012-05-13 21:56:26 +00007464 net_info_ratelimited("failed to load transform for %s: %ld\n",
Neil Horman3c681982012-10-24 09:20:03 +00007465 sp->sctp_hmac_alg, PTR_ERR(tfm));
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007466 return -ENOSYS;
7467 }
7468 sctp_sk(sk)->hmac = tfm;
7469 }
7470
7471 /*
7472 * If a bind() or sctp_bindx() is not called prior to a listen()
7473 * call that allows new associations to be accepted, the system
7474 * picks an ephemeral port and will choose an address set equivalent
7475 * to binding with a wildcard address.
7476 *
7477 * This is not currently spelled out in the SCTP sockets
7478 * extensions draft, but follows the practice as seen in TCP
7479 * sockets.
7480 *
7481 */
7482 sk->sk_state = SCTP_SS_LISTENING;
7483 if (!ep->base.bind_addr.port) {
7484 if (sctp_autobind(sk))
7485 return -EAGAIN;
7486 } else {
Eric Dumazetc720c7e82009-10-15 06:30:45 +00007487 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) {
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007488 sk->sk_state = SCTP_SS_CLOSED;
7489 return -EADDRINUSE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007490 }
7491 }
7492
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007493 sk->sk_max_ack_backlog = backlog;
7494 sctp_hash_endpoint(ep);
7495 return 0;
7496}
7497
7498/*
7499 * 4.1.3 / 5.1.3 listen()
7500 *
7501 * By default, new associations are not accepted for UDP style sockets.
7502 * An application uses listen() to mark a socket as being able to
7503 * accept new associations.
7504 *
7505 * On TCP style sockets, applications use listen() to ready the SCTP
7506 * endpoint for accepting inbound associations.
7507 *
7508 * On both types of endpoints a backlog of '0' disables listening.
7509 *
7510 * Move a socket to LISTENING state.
7511 */
7512int sctp_inet_listen(struct socket *sock, int backlog)
7513{
7514 struct sock *sk = sock->sk;
7515 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
7516 int err = -EINVAL;
7517
7518 if (unlikely(backlog < 0))
7519 return err;
7520
wangweidong048ed4b2014-01-21 15:44:11 +08007521 lock_sock(sk);
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007522
7523 /* Peeled-off sockets are not allowed to listen(). */
7524 if (sctp_style(sk, UDP_HIGH_BANDWIDTH))
7525 goto out;
7526
7527 if (sock->state != SS_UNCONNECTED)
7528 goto out;
7529
Xin Long34b27892017-04-06 13:10:52 +08007530 if (!sctp_sstate(sk, LISTENING) && !sctp_sstate(sk, CLOSED))
7531 goto out;
7532
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007533 /* If backlog is zero, disable listening. */
7534 if (!backlog) {
7535 if (sctp_sstate(sk, CLOSED))
7536 goto out;
7537
7538 err = 0;
7539 sctp_unhash_endpoint(ep);
7540 sk->sk_state = SCTP_SS_CLOSED;
7541 if (sk->sk_reuse)
7542 sctp_sk(sk)->bind_hash->fastreuse = 1;
7543 goto out;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07007544 }
7545
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007546 /* If we are already listening, just update the backlog */
7547 if (sctp_sstate(sk, LISTENING))
7548 sk->sk_max_ack_backlog = backlog;
7549 else {
7550 err = sctp_listen_start(sk, backlog);
7551 if (err)
7552 goto out;
7553 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007554
Vlad Yasevich5e8f3f72009-03-12 09:49:17 +00007555 err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007556out:
wangweidong048ed4b2014-01-21 15:44:11 +08007557 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007558 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007559}
7560
7561/*
7562 * This function is done by modeling the current datagram_poll() and the
7563 * tcp_poll(). Note that, based on these implementations, we don't
7564 * lock the socket in this function, even though it seems that,
7565 * ideally, locking or some other mechanisms can be used to ensure
Neil Horman9bffc4a2005-12-19 14:24:40 -08007566 * the integrity of the counters (sndbuf and wmem_alloc) used
Linus Torvalds1da177e2005-04-16 15:20:36 -07007567 * in this place. We assume that we don't need locks either until proven
7568 * otherwise.
7569 *
7570 * Another thing to note is that we include the Async I/O support
7571 * here, again, by modeling the current TCP/UDP code. We don't have
7572 * a good way to test with it yet.
7573 */
7574unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
7575{
7576 struct sock *sk = sock->sk;
7577 struct sctp_sock *sp = sctp_sk(sk);
7578 unsigned int mask;
7579
Eric Dumazetaa395142010-04-20 13:03:51 +00007580 poll_wait(file, sk_sleep(sk), wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007581
Marcelo Ricardo Leitner486bdee2016-04-12 18:11:31 -03007582 sock_rps_record_flow(sk);
7583
Linus Torvalds1da177e2005-04-16 15:20:36 -07007584 /* A TCP-style listening socket becomes readable when the accept queue
7585 * is not empty.
7586 */
7587 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
7588 return (!list_empty(&sp->ep->asocs)) ?
YOSHIFUJI Hideakid808ad92007-02-09 23:25:18 +09007589 (POLLIN | POLLRDNORM) : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007590
7591 mask = 0;
7592
7593 /* Is there any exceptional events? */
7594 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
Keller, Jacob E7d4c04f2013-03-28 11:19:25 +00007595 mask |= POLLERR |
Daniel Borkmanna0fb05d2013-09-07 16:44:59 +02007596 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0);
Davide Libenzif348d702006-03-25 03:07:39 -08007597 if (sk->sk_shutdown & RCV_SHUTDOWN)
Eric Dumazetdb409802010-09-06 11:13:50 +00007598 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007599 if (sk->sk_shutdown == SHUTDOWN_MASK)
7600 mask |= POLLHUP;
7601
7602 /* Is it readable? Reconsider this code with TCP-style support. */
Eric Dumazetdb409802010-09-06 11:13:50 +00007603 if (!skb_queue_empty(&sk->sk_receive_queue))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007604 mask |= POLLIN | POLLRDNORM;
7605
7606 /* The association is either gone or not ready. */
7607 if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED))
7608 return mask;
7609
7610 /* Is it writable? */
7611 if (sctp_writeable(sk)) {
7612 mask |= POLLOUT | POLLWRNORM;
7613 } else {
Eric Dumazet9cd3e072015-11-29 20:03:10 -08007614 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007615 /*
7616 * Since the socket is not locked, the buffer
7617 * might be made available after the writeable check and
7618 * before the bit is set. This could cause a lost I/O
7619 * signal. tcp_poll() has a race breaker for this race
7620 * condition. Based on their implementation, we put
7621 * in the following code to cover it as well.
7622 */
7623 if (sctp_writeable(sk))
7624 mask |= POLLOUT | POLLWRNORM;
7625 }
7626 return mask;
7627}
7628
7629/********************************************************************
7630 * 2nd Level Abstractions
7631 ********************************************************************/
7632
7633static struct sctp_bind_bucket *sctp_bucket_create(
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007634 struct sctp_bind_hashbucket *head, struct net *net, unsigned short snum)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007635{
7636 struct sctp_bind_bucket *pp;
7637
Christoph Lameter54e6ecb2006-12-06 20:33:16 -08007638 pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007639 if (pp) {
Li Zefan935a7f62008-04-10 01:58:06 -07007640 SCTP_DBG_OBJCNT_INC(bind_bucket);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007641 pp->port = snum;
7642 pp->fastreuse = 0;
7643 INIT_HLIST_HEAD(&pp->owner);
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007644 pp->net = net;
Vlad Yasevichd970dbf2007-11-09 11:43:40 -05007645 hlist_add_head(&pp->node, &head->chain);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007646 }
7647 return pp;
7648}
7649
7650/* Caller must hold hashbucket lock for this tb with local BH disabled */
7651static void sctp_bucket_destroy(struct sctp_bind_bucket *pp)
7652{
Sridhar Samudrala37fa6872006-07-21 14:45:47 -07007653 if (pp && hlist_empty(&pp->owner)) {
Vlad Yasevichd970dbf2007-11-09 11:43:40 -05007654 __hlist_del(&pp->node);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007655 kmem_cache_free(sctp_bucket_cachep, pp);
7656 SCTP_DBG_OBJCNT_DEC(bind_bucket);
7657 }
7658}
7659
7660/* Release this socket's reference to a local port. */
7661static inline void __sctp_put_port(struct sock *sk)
7662{
7663 struct sctp_bind_hashbucket *head =
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00007664 &sctp_port_hashtable[sctp_phashfn(sock_net(sk),
7665 inet_sk(sk)->inet_num)];
Linus Torvalds1da177e2005-04-16 15:20:36 -07007666 struct sctp_bind_bucket *pp;
7667
wangweidong3c8e43b2014-01-21 15:44:08 +08007668 spin_lock(&head->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007669 pp = sctp_sk(sk)->bind_hash;
7670 __sk_del_bind_node(sk);
7671 sctp_sk(sk)->bind_hash = NULL;
Eric Dumazetc720c7e82009-10-15 06:30:45 +00007672 inet_sk(sk)->inet_num = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007673 sctp_bucket_destroy(pp);
wangweidong3c8e43b2014-01-21 15:44:08 +08007674 spin_unlock(&head->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007675}
7676
7677void sctp_put_port(struct sock *sk)
7678{
wangweidong79b91132014-01-21 15:44:07 +08007679 local_bh_disable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007680 __sctp_put_port(sk);
wangweidong79b91132014-01-21 15:44:07 +08007681 local_bh_enable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007682}
7683
7684/*
7685 * The system picks an ephemeral port and choose an address set equivalent
7686 * to binding with a wildcard address.
7687 * One of those addresses will be the primary address for the association.
7688 * This automatically enables the multihoming capability of SCTP.
7689 */
7690static int sctp_autobind(struct sock *sk)
7691{
7692 union sctp_addr autoaddr;
7693 struct sctp_af *af;
Al Viro6fbfa9f2006-11-20 17:24:53 -08007694 __be16 port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007695
7696 /* Initialize a local sockaddr structure to INADDR_ANY. */
7697 af = sctp_sk(sk)->pf->af;
7698
Eric Dumazetc720c7e82009-10-15 06:30:45 +00007699 port = htons(inet_sk(sk)->inet_num);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007700 af->inaddr_any(&autoaddr, port);
7701
7702 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len);
7703}
7704
7705/* Parse out IPPROTO_SCTP CMSG headers. Perform only minimal validation.
7706 *
7707 * From RFC 2292
7708 * 4.2 The cmsghdr Structure *
7709 *
7710 * When ancillary data is sent or received, any number of ancillary data
7711 * objects can be specified by the msg_control and msg_controllen members of
7712 * the msghdr structure, because each object is preceded by
7713 * a cmsghdr structure defining the object's length (the cmsg_len member).
7714 * Historically Berkeley-derived implementations have passed only one object
7715 * at a time, but this API allows multiple objects to be
7716 * passed in a single call to sendmsg() or recvmsg(). The following example
7717 * shows two ancillary data objects in a control buffer.
7718 *
7719 * |<--------------------------- msg_controllen -------------------------->|
7720 * | |
7721 *
7722 * |<----- ancillary data object ----->|<----- ancillary data object ----->|
7723 *
7724 * |<---------- CMSG_SPACE() --------->|<---------- CMSG_SPACE() --------->|
7725 * | | |
7726 *
7727 * |<---------- cmsg_len ---------->| |<--------- cmsg_len ----------->| |
7728 *
7729 * |<--------- CMSG_LEN() --------->| |<-------- CMSG_LEN() ---------->| |
7730 * | | | | |
7731 *
7732 * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+
7733 * |cmsg_|cmsg_|cmsg_|XX| |XX|cmsg_|cmsg_|cmsg_|XX| |XX|
7734 *
7735 * |len |level|type |XX|cmsg_data[]|XX|len |level|type |XX|cmsg_data[]|XX|
7736 *
7737 * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+
7738 * ^
7739 * |
7740 *
7741 * msg_control
7742 * points here
7743 */
Xin Longa05437a2017-08-11 10:23:48 +08007744static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007745{
Vlad Yasevichab38fb02008-04-12 18:40:06 -07007746 struct msghdr *my_msg = (struct msghdr *)msg;
Xin Longa05437a2017-08-11 10:23:48 +08007747 struct cmsghdr *cmsg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007748
Gu Zhengf95b4142014-12-11 11:22:04 +08007749 for_each_cmsghdr(cmsg, my_msg) {
Vlad Yasevichab38fb02008-04-12 18:40:06 -07007750 if (!CMSG_OK(my_msg, cmsg))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007751 return -EINVAL;
7752
7753 /* Should we parse this header or ignore? */
7754 if (cmsg->cmsg_level != IPPROTO_SCTP)
7755 continue;
7756
7757 /* Strictly check lengths following example in SCM code. */
7758 switch (cmsg->cmsg_type) {
7759 case SCTP_INIT:
7760 /* SCTP Socket API Extension
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007761 * 5.3.1 SCTP Initiation Structure (SCTP_INIT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007762 *
7763 * This cmsghdr structure provides information for
7764 * initializing new SCTP associations with sendmsg().
7765 * The SCTP_INITMSG socket option uses this same data
7766 * structure. This structure is not used for
7767 * recvmsg().
7768 *
7769 * cmsg_level cmsg_type cmsg_data[]
7770 * ------------ ------------ ----------------------
7771 * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg
7772 */
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007773 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_initmsg)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007774 return -EINVAL;
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007775
7776 cmsgs->init = CMSG_DATA(cmsg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007777 break;
7778
7779 case SCTP_SNDRCV:
7780 /* SCTP Socket API Extension
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007781 * 5.3.2 SCTP Header Information Structure(SCTP_SNDRCV)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007782 *
7783 * This cmsghdr structure specifies SCTP options for
7784 * sendmsg() and describes SCTP header information
7785 * about a received message through recvmsg().
7786 *
7787 * cmsg_level cmsg_type cmsg_data[]
7788 * ------------ ------------ ----------------------
7789 * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo
7790 */
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007791 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndrcvinfo)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007792 return -EINVAL;
7793
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007794 cmsgs->srinfo = CMSG_DATA(cmsg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007795
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007796 if (cmsgs->srinfo->sinfo_flags &
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07007797 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
Xin Longa6c2f792016-07-09 19:47:43 +08007798 SCTP_SACK_IMMEDIATELY | SCTP_PR_SCTP_MASK |
Ivan Skytte Jorgenseneaa5c542005-10-28 15:10:00 -07007799 SCTP_ABORT | SCTP_EOF))
Linus Torvalds1da177e2005-04-16 15:20:36 -07007800 return -EINVAL;
7801 break;
7802
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007803 case SCTP_SNDINFO:
7804 /* SCTP Socket API Extension
7805 * 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO)
7806 *
7807 * This cmsghdr structure specifies SCTP options for
7808 * sendmsg(). This structure and SCTP_RCVINFO replaces
7809 * SCTP_SNDRCV which has been deprecated.
7810 *
7811 * cmsg_level cmsg_type cmsg_data[]
7812 * ------------ ------------ ---------------------
7813 * IPPROTO_SCTP SCTP_SNDINFO struct sctp_sndinfo
7814 */
7815 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndinfo)))
7816 return -EINVAL;
7817
7818 cmsgs->sinfo = CMSG_DATA(cmsg);
7819
7820 if (cmsgs->sinfo->snd_flags &
7821 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
Xin Longa6c2f792016-07-09 19:47:43 +08007822 SCTP_SACK_IMMEDIATELY | SCTP_PR_SCTP_MASK |
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007823 SCTP_ABORT | SCTP_EOF))
7824 return -EINVAL;
7825 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007826 default:
7827 return -EINVAL;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -07007828 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007829 }
Geir Ola Vaagland63b94932014-07-12 20:30:36 +02007830
Linus Torvalds1da177e2005-04-16 15:20:36 -07007831 return 0;
7832}
7833
7834/*
7835 * Wait for a packet..
7836 * Note: This function is the same function as in core/datagram.c
7837 * with a few modifications to make lksctp work.
7838 */
wangweidong26ac8e52013-12-23 12:16:51 +08007839static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007840{
7841 int error;
7842 DEFINE_WAIT(wait);
7843
Eric Dumazetaa395142010-04-20 13:03:51 +00007844 prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007845
7846 /* Socket errors? */
7847 error = sock_error(sk);
7848 if (error)
7849 goto out;
7850
7851 if (!skb_queue_empty(&sk->sk_receive_queue))
7852 goto ready;
7853
7854 /* Socket shut down? */
7855 if (sk->sk_shutdown & RCV_SHUTDOWN)
7856 goto out;
7857
7858 /* Sequenced packets can come disconnected. If so we report the
7859 * problem.
7860 */
7861 error = -ENOTCONN;
7862
7863 /* Is there a good reason to think that we may receive some data? */
7864 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING))
7865 goto out;
7866
7867 /* Handle signals. */
7868 if (signal_pending(current))
7869 goto interrupted;
7870
7871 /* Let another process have a go. Since we are going to sleep
7872 * anyway. Note: This may cause odd behaviors if the message
7873 * does not fit in the user's buffer, but this seems to be the
7874 * only way to honor MSG_DONTWAIT realistically.
7875 */
wangweidong048ed4b2014-01-21 15:44:11 +08007876 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007877 *timeo_p = schedule_timeout(*timeo_p);
wangweidong048ed4b2014-01-21 15:44:11 +08007878 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007879
7880ready:
Eric Dumazetaa395142010-04-20 13:03:51 +00007881 finish_wait(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007882 return 0;
7883
7884interrupted:
7885 error = sock_intr_errno(*timeo_p);
7886
7887out:
Eric Dumazetaa395142010-04-20 13:03:51 +00007888 finish_wait(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007889 *err = error;
7890 return error;
7891}
7892
7893/* Receive a datagram.
7894 * Note: This is pretty much the same routine as in core/datagram.c
7895 * with a few changes to make lksctp work.
7896 */
Geir Ola Vaagland2347c802014-07-12 20:30:38 +02007897struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
7898 int noblock, int *err)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007899{
7900 int error;
7901 struct sk_buff *skb;
7902 long timeo;
7903
Linus Torvalds1da177e2005-04-16 15:20:36 -07007904 timeo = sock_rcvtimeo(sk, noblock);
7905
Daniel Borkmannbb333812013-06-28 19:49:40 +02007906 pr_debug("%s: timeo:%ld, max:%ld\n", __func__, timeo,
7907 MAX_SCHEDULE_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007908
7909 do {
7910 /* Again only user level code calls this function,
7911 * so nothing interrupt level
7912 * will suddenly eat the receive_queue.
7913 *
7914 * Look at current nfs client by the way...
David Shwatrz8917a3c2010-12-02 09:01:55 +00007915 * However, this function was correct in any case. 8)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007916 */
7917 if (flags & MSG_PEEK) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007918 skb = skb_peek(&sk->sk_receive_queue);
7919 if (skb)
Reshetova, Elena63354792017-06-30 13:07:58 +03007920 refcount_inc(&skb->users);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007921 } else {
Marcelo Ricardo Leitner311b2172016-04-13 19:12:29 -03007922 skb = __skb_dequeue(&sk->sk_receive_queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007923 }
7924
7925 if (skb)
7926 return skb;
7927
Neil Horman6736dc32005-12-02 20:30:06 -08007928 /* Caller is allowed not to check sk->sk_err before calling. */
7929 error = sock_error(sk);
7930 if (error)
7931 goto no_packet;
7932
Linus Torvalds1da177e2005-04-16 15:20:36 -07007933 if (sk->sk_shutdown & RCV_SHUTDOWN)
7934 break;
7935
Alexander Duyck2b5cd0d2017-03-24 10:08:12 -07007936 if (sk_can_busy_loop(sk)) {
7937 sk_busy_loop(sk, noblock);
7938
7939 if (!skb_queue_empty(&sk->sk_receive_queue))
7940 continue;
7941 }
Neil Horman8465a5f2014-04-17 15:26:51 -04007942
Linus Torvalds1da177e2005-04-16 15:20:36 -07007943 /* User doesn't want to wait. */
7944 error = -EAGAIN;
7945 if (!timeo)
7946 goto no_packet;
7947 } while (sctp_wait_for_packet(sk, err, &timeo) == 0);
7948
7949 return NULL;
7950
7951no_packet:
7952 *err = error;
7953 return NULL;
7954}
7955
7956/* If sndbuf has changed, wake up per association sndbuf waiters. */
7957static void __sctp_write_space(struct sctp_association *asoc)
7958{
7959 struct sock *sk = asoc->base.sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007960
Eric Dumazetceb5d582015-11-29 20:03:11 -08007961 if (sctp_wspace(asoc) <= 0)
7962 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007963
Eric Dumazetceb5d582015-11-29 20:03:11 -08007964 if (waitqueue_active(&asoc->wait))
7965 wake_up_interruptible(&asoc->wait);
Eric Dumazeteaefd112011-02-18 03:26:36 +00007966
Eric Dumazetceb5d582015-11-29 20:03:11 -08007967 if (sctp_writeable(sk)) {
7968 struct socket_wq *wq;
7969
7970 rcu_read_lock();
7971 wq = rcu_dereference(sk->sk_wq);
7972 if (wq) {
7973 if (waitqueue_active(&wq->wait))
7974 wake_up_interruptible(&wq->wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007975
7976 /* Note that we try to include the Async I/O support
7977 * here by modeling from the current TCP/UDP code.
7978 * We have not tested with it yet.
7979 */
Eric Dumazeteaefd112011-02-18 03:26:36 +00007980 if (!(sk->sk_shutdown & SEND_SHUTDOWN))
Eric Dumazetceb5d582015-11-29 20:03:11 -08007981 sock_wake_async(wq, SOCK_WAKE_SPACE, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007982 }
Eric Dumazetceb5d582015-11-29 20:03:11 -08007983 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007984 }
7985}
7986
Daniel Borkmann52c35be2014-04-08 17:26:13 +02007987static void sctp_wake_up_waiters(struct sock *sk,
7988 struct sctp_association *asoc)
7989{
7990 struct sctp_association *tmp = asoc;
7991
7992 /* We do accounting for the sndbuf space per association,
7993 * so we only need to wake our own association.
7994 */
7995 if (asoc->ep->sndbuf_policy)
7996 return __sctp_write_space(asoc);
7997
Daniel Borkmann1e1cdf82014-04-09 16:10:20 +02007998 /* If association goes down and is just flushing its
7999 * outq, then just normally notify others.
8000 */
8001 if (asoc->base.dead)
8002 return sctp_write_space(sk);
8003
Daniel Borkmann52c35be2014-04-08 17:26:13 +02008004 /* Accounting for the sndbuf space is per socket, so we
8005 * need to wake up others, try to be fair and in case of
8006 * other associations, let them have a go first instead
8007 * of just doing a sctp_write_space() call.
8008 *
8009 * Note that we reach sctp_wake_up_waiters() only when
8010 * associations free up queued chunks, thus we are under
8011 * lock and the list of associations on a socket is
8012 * guaranteed not to change.
8013 */
8014 for (tmp = list_next_entry(tmp, asocs); 1;
8015 tmp = list_next_entry(tmp, asocs)) {
8016 /* Manually skip the head element. */
8017 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs))
8018 continue;
8019 /* Wake up association. */
8020 __sctp_write_space(tmp);
8021 /* We've reached the end. */
8022 if (tmp == asoc)
8023 break;
8024 }
8025}
8026
Linus Torvalds1da177e2005-04-16 15:20:36 -07008027/* Do accounting for the sndbuf space.
8028 * Decrement the used sndbuf space of the corresponding association by the
8029 * data size which was just transmitted(freed).
8030 */
8031static void sctp_wfree(struct sk_buff *skb)
8032{
Daniel Borkmannf869c912014-11-20 01:54:48 +01008033 struct sctp_chunk *chunk = skb_shinfo(skb)->destructor_arg;
8034 struct sctp_association *asoc = chunk->asoc;
8035 struct sock *sk = asoc->base.sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07008036
Neil Horman4eb701d2005-04-28 12:02:04 -07008037 asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk) +
8038 sizeof(struct sk_buff) +
8039 sizeof(struct sctp_chunk);
8040
Reshetova, Elena14afee42017-06-30 13:08:00 +03008041 WARN_ON(refcount_sub_and_test(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc));
Neil Horman4eb701d2005-04-28 12:02:04 -07008042
Neil Horman4d93df02007-08-15 16:07:44 -07008043 /*
Hideo Aoki3ab224b2007-12-31 00:11:19 -08008044 * This undoes what is done via sctp_set_owner_w and sk_mem_charge
Neil Horman4d93df02007-08-15 16:07:44 -07008045 */
8046 sk->sk_wmem_queued -= skb->truesize;
Hideo Aoki3ab224b2007-12-31 00:11:19 -08008047 sk_mem_uncharge(sk, skb->truesize);
Neil Horman4d93df02007-08-15 16:07:44 -07008048
Neil Horman4eb701d2005-04-28 12:02:04 -07008049 sock_wfree(skb);
Daniel Borkmann52c35be2014-04-08 17:26:13 +02008050 sctp_wake_up_waiters(sk, asoc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008051
8052 sctp_association_put(asoc);
8053}
8054
Vlad Yasevich331c4ee2006-10-09 21:34:04 -07008055/* Do accounting for the receive space on the socket.
8056 * Accounting for the association is done in ulpevent.c
8057 * We set this as a destructor for the cloned data skbs so that
8058 * accounting is done at the correct time.
8059 */
8060void sctp_sock_rfree(struct sk_buff *skb)
8061{
8062 struct sock *sk = skb->sk;
8063 struct sctp_ulpevent *event = sctp_skb2event(skb);
8064
8065 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc);
Neil Horman4d93df02007-08-15 16:07:44 -07008066
8067 /*
Hideo Aoki3ab224b2007-12-31 00:11:19 -08008068 * Mimic the behavior of sock_rfree
Neil Horman4d93df02007-08-15 16:07:44 -07008069 */
Hideo Aoki3ab224b2007-12-31 00:11:19 -08008070 sk_mem_uncharge(sk, event->rmem_len);
Vlad Yasevich331c4ee2006-10-09 21:34:04 -07008071}
8072
8073
Linus Torvalds1da177e2005-04-16 15:20:36 -07008074/* Helper function to wait for space in the sndbuf. */
8075static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
Xin Longcea0cc82017-11-15 16:57:26 +08008076 size_t msg_len, struct sock **orig_sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07008077{
8078 struct sock *sk = asoc->base.sk;
8079 int err = 0;
8080 long current_timeo = *timeo_p;
8081 DEFINE_WAIT(wait);
8082
Daniel Borkmannbb333812013-06-28 19:49:40 +02008083 pr_debug("%s: asoc:%p, timeo:%ld, msg_len:%zu\n", __func__, asoc,
8084 *timeo_p, msg_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008085
8086 /* Increment the association's refcnt. */
8087 sctp_association_hold(asoc);
8088
8089 /* Wait on the association specific sndbuf space. */
8090 for (;;) {
8091 prepare_to_wait_exclusive(&asoc->wait, &wait,
8092 TASK_INTERRUPTIBLE);
Xin Longca3af4d2017-11-15 16:55:54 +08008093 if (asoc->base.dead)
8094 goto do_dead;
Linus Torvalds1da177e2005-04-16 15:20:36 -07008095 if (!*timeo_p)
8096 goto do_nonblock;
Xin Longca3af4d2017-11-15 16:55:54 +08008097 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING)
Linus Torvalds1da177e2005-04-16 15:20:36 -07008098 goto do_error;
8099 if (signal_pending(current))
8100 goto do_interrupted;
8101 if (msg_len <= sctp_wspace(asoc))
8102 break;
8103
8104 /* Let another process have a go. Since we are going
8105 * to sleep anyway.
8106 */
wangweidong048ed4b2014-01-21 15:44:11 +08008107 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008108 current_timeo = schedule_timeout(current_timeo);
wangweidong048ed4b2014-01-21 15:44:11 +08008109 lock_sock(sk);
Xin Longcea0cc82017-11-15 16:57:26 +08008110 if (sk != asoc->base.sk) {
8111 release_sock(sk);
8112 sk = asoc->base.sk;
8113 lock_sock(sk);
8114 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07008115
8116 *timeo_p = current_timeo;
8117 }
8118
8119out:
Xin Longcea0cc82017-11-15 16:57:26 +08008120 *orig_sk = sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07008121 finish_wait(&asoc->wait, &wait);
8122
8123 /* Release the association's refcnt. */
8124 sctp_association_put(asoc);
8125
8126 return err;
8127
Xin Longca3af4d2017-11-15 16:55:54 +08008128do_dead:
8129 err = -ESRCH;
8130 goto out;
8131
Linus Torvalds1da177e2005-04-16 15:20:36 -07008132do_error:
8133 err = -EPIPE;
8134 goto out;
8135
8136do_interrupted:
8137 err = sock_intr_errno(*timeo_p);
8138 goto out;
8139
8140do_nonblock:
8141 err = -EAGAIN;
8142 goto out;
8143}
8144
David S. Miller676d2362014-04-11 16:15:36 -04008145void sctp_data_ready(struct sock *sk)
Wei Yongjun561b1732010-04-28 08:47:18 +00008146{
David S. Miller7ef52732010-05-02 21:43:40 -07008147 struct socket_wq *wq;
8148
8149 rcu_read_lock();
8150 wq = rcu_dereference(sk->sk_wq);
Herbert Xu1ce0bf52015-11-26 13:55:39 +08008151 if (skwq_has_sleeper(wq))
David S. Miller7ef52732010-05-02 21:43:40 -07008152 wake_up_interruptible_sync_poll(&wq->wait, POLLIN |
Wei Yongjun561b1732010-04-28 08:47:18 +00008153 POLLRDNORM | POLLRDBAND);
8154 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
David S. Miller7ef52732010-05-02 21:43:40 -07008155 rcu_read_unlock();
Wei Yongjun561b1732010-04-28 08:47:18 +00008156}
8157
Linus Torvalds1da177e2005-04-16 15:20:36 -07008158/* If socket sndbuf has changed, wake up all per association waiters. */
8159void sctp_write_space(struct sock *sk)
8160{
8161 struct sctp_association *asoc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07008162
8163 /* Wake up the tasks in each wait queue. */
Robert P. J. Day9dbc15f2008-04-12 18:54:24 -07008164 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07008165 __sctp_write_space(asoc);
8166 }
8167}
8168
8169/* Is there any sndbuf space available on the socket?
8170 *
Neil Horman9bffc4a2005-12-19 14:24:40 -08008171 * Note that sk_wmem_alloc is the sum of the send buffers on all of the
Linus Torvalds1da177e2005-04-16 15:20:36 -07008172 * associations on the same socket. For a UDP-style socket with
8173 * multiple associations, it is possible for it to be "unwriteable"
8174 * prematurely. I assume that this is acceptable because
8175 * a premature "unwriteable" is better than an accidental "writeable" which
8176 * would cause an unwanted block under certain circumstances. For the 1-1
8177 * UDP-style sockets or TCP-style sockets, this code should work.
8178 * - Daisy
8179 */
8180static int sctp_writeable(struct sock *sk)
8181{
8182 int amt = 0;
8183
Eric Dumazet31e6d362009-06-17 19:05:41 -07008184 amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008185 if (amt < 0)
8186 amt = 0;
8187 return amt;
8188}
8189
8190/* Wait for an association to go into ESTABLISHED state. If timeout is 0,
8191 * returns immediately with EINPROGRESS.
8192 */
8193static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p)
8194{
8195 struct sock *sk = asoc->base.sk;
8196 int err = 0;
8197 long current_timeo = *timeo_p;
8198 DEFINE_WAIT(wait);
8199
Daniel Borkmannbb333812013-06-28 19:49:40 +02008200 pr_debug("%s: asoc:%p, timeo:%ld\n", __func__, asoc, *timeo_p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008201
8202 /* Increment the association's refcnt. */
8203 sctp_association_hold(asoc);
8204
8205 for (;;) {
8206 prepare_to_wait_exclusive(&asoc->wait, &wait,
8207 TASK_INTERRUPTIBLE);
8208 if (!*timeo_p)
8209 goto do_nonblock;
8210 if (sk->sk_shutdown & RCV_SHUTDOWN)
8211 break;
8212 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING ||
8213 asoc->base.dead)
8214 goto do_error;
8215 if (signal_pending(current))
8216 goto do_interrupted;
8217
8218 if (sctp_state(asoc, ESTABLISHED))
8219 break;
8220
8221 /* Let another process have a go. Since we are going
8222 * to sleep anyway.
8223 */
wangweidong048ed4b2014-01-21 15:44:11 +08008224 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008225 current_timeo = schedule_timeout(current_timeo);
wangweidong048ed4b2014-01-21 15:44:11 +08008226 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008227
8228 *timeo_p = current_timeo;
8229 }
8230
8231out:
8232 finish_wait(&asoc->wait, &wait);
8233
8234 /* Release the association's refcnt. */
8235 sctp_association_put(asoc);
8236
8237 return err;
8238
8239do_error:
Vlad Yasevich81845c22006-01-30 15:59:54 -08008240 if (asoc->init_err_counter + 1 > asoc->max_init_attempts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07008241 err = -ETIMEDOUT;
8242 else
8243 err = -ECONNREFUSED;
8244 goto out;
8245
8246do_interrupted:
8247 err = sock_intr_errno(*timeo_p);
8248 goto out;
8249
8250do_nonblock:
8251 err = -EINPROGRESS;
8252 goto out;
8253}
8254
8255static int sctp_wait_for_accept(struct sock *sk, long timeo)
8256{
8257 struct sctp_endpoint *ep;
8258 int err = 0;
8259 DEFINE_WAIT(wait);
8260
8261 ep = sctp_sk(sk)->ep;
8262
8263
8264 for (;;) {
Eric Dumazetaa395142010-04-20 13:03:51 +00008265 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
Linus Torvalds1da177e2005-04-16 15:20:36 -07008266 TASK_INTERRUPTIBLE);
8267
8268 if (list_empty(&ep->asocs)) {
wangweidong048ed4b2014-01-21 15:44:11 +08008269 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008270 timeo = schedule_timeout(timeo);
wangweidong048ed4b2014-01-21 15:44:11 +08008271 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008272 }
8273
8274 err = -EINVAL;
8275 if (!sctp_sstate(sk, LISTENING))
8276 break;
8277
8278 err = 0;
8279 if (!list_empty(&ep->asocs))
8280 break;
8281
8282 err = sock_intr_errno(timeo);
8283 if (signal_pending(current))
8284 break;
8285
8286 err = -EAGAIN;
8287 if (!timeo)
8288 break;
8289 }
8290
Eric Dumazetaa395142010-04-20 13:03:51 +00008291 finish_wait(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008292
8293 return err;
8294}
8295
sebastian@breakpoint.cc04675212007-07-26 23:21:31 +02008296static void sctp_wait_for_close(struct sock *sk, long timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07008297{
8298 DEFINE_WAIT(wait);
8299
8300 do {
Eric Dumazetaa395142010-04-20 13:03:51 +00008301 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008302 if (list_empty(&sctp_sk(sk)->ep->asocs))
8303 break;
wangweidong048ed4b2014-01-21 15:44:11 +08008304 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008305 timeout = schedule_timeout(timeout);
wangweidong048ed4b2014-01-21 15:44:11 +08008306 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008307 } while (!signal_pending(current) && timeout);
8308
Eric Dumazetaa395142010-04-20 13:03:51 +00008309 finish_wait(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008310}
8311
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008312static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk)
8313{
8314 struct sk_buff *frag;
8315
8316 if (!skb->data_len)
8317 goto done;
8318
8319 /* Don't forget the fragments. */
David S. Miller1b003be2009-06-09 00:22:35 -07008320 skb_walk_frags(skb, frag)
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008321 sctp_skb_set_owner_r_frag(frag, sk);
8322
8323done:
8324 sctp_skb_set_owner_r(skb, sk);
8325}
8326
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008327void sctp_copy_sock(struct sock *newsk, struct sock *sk,
8328 struct sctp_association *asoc)
8329{
8330 struct inet_sock *inet = inet_sk(sk);
Julia Lawall09cb47a2010-01-21 02:43:20 -08008331 struct inet_sock *newinet;
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008332
8333 newsk->sk_type = sk->sk_type;
8334 newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
8335 newsk->sk_flags = sk->sk_flags;
Marcelo Ricardo Leitner50a5ffb2015-12-04 15:14:05 -02008336 newsk->sk_tsflags = sk->sk_tsflags;
Tom Herbert28448b82014-05-23 08:47:19 -07008337 newsk->sk_no_check_tx = sk->sk_no_check_tx;
8338 newsk->sk_no_check_rx = sk->sk_no_check_rx;
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008339 newsk->sk_reuse = sk->sk_reuse;
8340
8341 newsk->sk_shutdown = sk->sk_shutdown;
Daniel Borkmann0a2fbac2013-06-25 18:17:29 +02008342 newsk->sk_destruct = sctp_destruct_sock;
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008343 newsk->sk_family = sk->sk_family;
8344 newsk->sk_protocol = IPPROTO_SCTP;
8345 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv;
8346 newsk->sk_sndbuf = sk->sk_sndbuf;
8347 newsk->sk_rcvbuf = sk->sk_rcvbuf;
8348 newsk->sk_lingertime = sk->sk_lingertime;
8349 newsk->sk_rcvtimeo = sk->sk_rcvtimeo;
8350 newsk->sk_sndtimeo = sk->sk_sndtimeo;
Marcelo Ricardo Leitner486bdee2016-04-12 18:11:31 -03008351 newsk->sk_rxhash = sk->sk_rxhash;
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008352
8353 newinet = inet_sk(newsk);
8354
8355 /* Initialize sk's sport, dport, rcv_saddr and daddr for
8356 * getsockname() and getpeername()
8357 */
Eric Dumazetc720c7e82009-10-15 06:30:45 +00008358 newinet->inet_sport = inet->inet_sport;
8359 newinet->inet_saddr = inet->inet_saddr;
8360 newinet->inet_rcv_saddr = inet->inet_rcv_saddr;
8361 newinet->inet_dport = htons(asoc->peer.port);
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008362 newinet->pmtudisc = inet->pmtudisc;
Eric Dumazetc720c7e82009-10-15 06:30:45 +00008363 newinet->inet_id = asoc->next_tsn ^ jiffies;
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008364
8365 newinet->uc_ttl = inet->uc_ttl;
8366 newinet->mc_loop = 1;
8367 newinet->mc_ttl = 1;
8368 newinet->mc_index = 0;
8369 newinet->mc_list = NULL;
Marcelo Ricardo Leitner01ce63c2015-12-04 15:14:04 -02008370
8371 if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
8372 net_enable_timestamp();
Marcelo Ricardo Leitner3538a5c2015-12-23 16:44:09 -02008373
8374 security_sk_clone(sk, newsk);
Vlad Yasevich914e1c82009-02-13 08:33:44 +00008375}
8376
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03008377static inline void sctp_copy_descendant(struct sock *sk_to,
8378 const struct sock *sk_from)
8379{
8380 int ancestor_size = sizeof(struct inet_sock) +
8381 sizeof(struct sctp_sock) -
8382 offsetof(struct sctp_sock, auto_asconf_list);
8383
8384 if (sk_from->sk_family == PF_INET6)
8385 ancestor_size += sizeof(struct ipv6_pinfo);
8386
8387 __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
8388}
8389
Linus Torvalds1da177e2005-04-16 15:20:36 -07008390/* Populate the fields of the newsk from the oldsk and migrate the assoc
8391 * and its messages to the newsk.
8392 */
8393static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
8394 struct sctp_association *assoc,
Xin Longb7ef2612017-08-11 10:23:50 +08008395 enum sctp_socket_type type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07008396{
8397 struct sctp_sock *oldsp = sctp_sk(oldsk);
8398 struct sctp_sock *newsp = sctp_sk(newsk);
8399 struct sctp_bind_bucket *pp; /* hash list port iterator */
8400 struct sctp_endpoint *newep = newsp->ep;
8401 struct sk_buff *skb, *tmp;
8402 struct sctp_ulpevent *event;
Vlad Yasevichf26f7c42007-12-06 22:50:27 -08008403 struct sctp_bind_hashbucket *head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07008404
8405 /* Migrate socket buffer sizes and all the socket level options to the
8406 * new socket.
8407 */
8408 newsk->sk_sndbuf = oldsk->sk_sndbuf;
8409 newsk->sk_rcvbuf = oldsk->sk_rcvbuf;
8410 /* Brute force copy old sctp opt. */
Marcelo Ricardo Leitner2d45a022015-06-12 10:16:41 -03008411 sctp_copy_descendant(newsk, oldsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008412
8413 /* Restore the ep value that was overwritten with the above structure
8414 * copy.
8415 */
8416 newsp->ep = newep;
8417 newsp->hmac = NULL;
8418
8419 /* Hook this new socket in to the bind_hash list. */
Eric W. Biedermanf1f43762012-08-06 08:39:38 +00008420 head = &sctp_port_hashtable[sctp_phashfn(sock_net(oldsk),
8421 inet_sk(oldsk)->inet_num)];
Nicholas Mc Guire489ce5f2016-03-13 11:48:24 +01008422 spin_lock_bh(&head->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008423 pp = sctp_sk(oldsk)->bind_hash;
8424 sk_add_bind_node(newsk, &pp->owner);
8425 sctp_sk(newsk)->bind_hash = pp;
Eric Dumazetc720c7e82009-10-15 06:30:45 +00008426 inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num;
Nicholas Mc Guire489ce5f2016-03-13 11:48:24 +01008427 spin_unlock_bh(&head->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008428
Vladislav Yasevich4243cac2005-06-13 15:10:49 -07008429 /* Copy the bind_addr list from the original endpoint to the new
8430 * endpoint so that we can handle restarts properly
8431 */
Vlad Yasevich8e71a112007-12-06 22:50:54 -08008432 sctp_bind_addr_dup(&newsp->ep->base.bind_addr,
8433 &oldsp->ep->base.bind_addr, GFP_KERNEL);
Vladislav Yasevich4243cac2005-06-13 15:10:49 -07008434
Linus Torvalds1da177e2005-04-16 15:20:36 -07008435 /* Move any messages in the old socket's receive queue that are for the
8436 * peeled off association to the new socket's receive queue.
8437 */
8438 sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
8439 event = sctp_skb2event(skb);
8440 if (event->asoc == assoc) {
David S. Miller8728b832005-08-09 19:25:21 -07008441 __skb_unlink(skb, &oldsk->sk_receive_queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008442 __skb_queue_tail(&newsk->sk_receive_queue, skb);
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008443 sctp_skb_set_owner_r_frag(skb, newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008444 }
8445 }
8446
8447 /* Clean up any messages pending delivery due to partial
8448 * delivery. Three cases:
8449 * 1) No partial deliver; no work.
8450 * 2) Peeling off partial delivery; keep pd_lobby in new pd_lobby.
8451 * 3) Peeling off non-partial delivery; move pd_lobby to receive_queue.
8452 */
8453 skb_queue_head_init(&newsp->pd_lobby);
Vlad Yasevichb6e13312007-04-20 12:23:15 -07008454 atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008455
Vlad Yasevichb6e13312007-04-20 12:23:15 -07008456 if (atomic_read(&sctp_sk(oldsk)->pd_mode)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07008457 struct sk_buff_head *queue;
8458
8459 /* Decide which queue to move pd_lobby skbs to. */
8460 if (assoc->ulpq.pd_mode) {
8461 queue = &newsp->pd_lobby;
8462 } else
8463 queue = &newsk->sk_receive_queue;
8464
8465 /* Walk through the pd_lobby, looking for skbs that
8466 * need moved to the new socket.
8467 */
8468 sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
8469 event = sctp_skb2event(skb);
8470 if (event->asoc == assoc) {
David S. Miller8728b832005-08-09 19:25:21 -07008471 __skb_unlink(skb, &oldsp->pd_lobby);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008472 __skb_queue_tail(queue, skb);
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008473 sctp_skb_set_owner_r_frag(skb, newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008474 }
8475 }
8476
8477 /* Clear up any skbs waiting for the partial
8478 * delivery to finish.
8479 */
8480 if (assoc->ulpq.pd_mode)
Vlad Yasevichb6e13312007-04-20 12:23:15 -07008481 sctp_clear_pd(oldsk, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008482
8483 }
8484
Wei Yongjun1bc4ee42009-07-05 19:45:48 +00008485 sctp_skb_for_each(skb, &assoc->ulpq.reasm, tmp)
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008486 sctp_skb_set_owner_r_frag(skb, newsk);
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008487
Wei Yongjun1bc4ee42009-07-05 19:45:48 +00008488 sctp_skb_for_each(skb, &assoc->ulpq.lobby, tmp)
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008489 sctp_skb_set_owner_r_frag(skb, newsk);
Tsutomu Fujiiea2bc482007-04-17 12:49:53 -07008490
Linus Torvalds1da177e2005-04-16 15:20:36 -07008491 /* Set the type of socket to indicate that it is peeled off from the
8492 * original UDP-style socket or created with the accept() call on a
8493 * TCP-style socket..
8494 */
8495 newsp->type = type;
8496
Vladislav Yasevich61c9fed2006-05-19 11:01:18 -07008497 /* Mark the new socket "in-use" by the user so that any packets
8498 * that may arrive on the association after we've moved it are
8499 * queued to the backlog. This prevents a potential race between
8500 * backlog processing on the old socket and new-packet processing
8501 * on the new socket.
Zach Brown5131a182007-06-22 15:14:46 -07008502 *
8503 * The caller has just allocated newsk so we can guarantee that other
8504 * paths won't try to lock it and then oldsk.
Vladislav Yasevich61c9fed2006-05-19 11:01:18 -07008505 */
Zach Brown5131a182007-06-22 15:14:46 -07008506 lock_sock_nested(newsk, SINGLE_DEPTH_NESTING);
Xin Longd04adf12017-10-28 02:13:29 +08008507 sctp_for_each_tx_datachunk(assoc, sctp_clear_owner_w);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008508 sctp_assoc_migrate(assoc, newsk);
Xin Longd04adf12017-10-28 02:13:29 +08008509 sctp_for_each_tx_datachunk(assoc, sctp_set_owner_w);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008510
8511 /* If the association on the newsk is already closed before accept()
8512 * is called, set RCV_SHUTDOWN flag.
8513 */
Xin Longd46e4162016-06-09 22:48:18 +08008514 if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) {
Xin Long141ddef2016-06-16 01:15:06 +08008515 newsk->sk_state = SCTP_SS_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07008516 newsk->sk_shutdown |= RCV_SHUTDOWN;
Xin Longd46e4162016-06-09 22:48:18 +08008517 } else {
8518 newsk->sk_state = SCTP_SS_ESTABLISHED;
8519 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07008520
wangweidong048ed4b2014-01-21 15:44:11 +08008521 release_sock(newsk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07008522}
8523
Neil Horman4d93df02007-08-15 16:07:44 -07008524
Linus Torvalds1da177e2005-04-16 15:20:36 -07008525/* This proto struct describes the ULP interface for SCTP. */
8526struct proto sctp_prot = {
8527 .name = "SCTP",
8528 .owner = THIS_MODULE,
8529 .close = sctp_close,
8530 .connect = sctp_connect,
8531 .disconnect = sctp_disconnect,
8532 .accept = sctp_accept,
8533 .ioctl = sctp_ioctl,
8534 .init = sctp_init_sock,
8535 .destroy = sctp_destroy_sock,
8536 .shutdown = sctp_shutdown,
8537 .setsockopt = sctp_setsockopt,
8538 .getsockopt = sctp_getsockopt,
8539 .sendmsg = sctp_sendmsg,
8540 .recvmsg = sctp_recvmsg,
8541 .bind = sctp_bind,
8542 .backlog_rcv = sctp_backlog_rcv,
8543 .hash = sctp_hash,
8544 .unhash = sctp_unhash,
8545 .get_port = sctp_get_port,
8546 .obj_size = sizeof(struct sctp_sock),
Neil Horman4d93df02007-08-15 16:07:44 -07008547 .sysctl_mem = sysctl_sctp_mem,
8548 .sysctl_rmem = sysctl_sctp_rmem,
8549 .sysctl_wmem = sysctl_sctp_wmem,
8550 .memory_pressure = &sctp_memory_pressure,
8551 .enter_memory_pressure = sctp_enter_memory_pressure,
8552 .memory_allocated = &sctp_memory_allocated,
Pavel Emelyanov5f318862008-02-20 00:23:01 -08008553 .sockets_allocated = &sctp_sockets_allocated,
Linus Torvalds1da177e2005-04-16 15:20:36 -07008554};
8555
Eric Dumazetdfd56b82011-12-10 09:48:31 +00008556#if IS_ENABLED(CONFIG_IPV6)
Eric Dumazet8295b6d2007-11-05 23:40:28 -08008557
Eric Dumazet602dd622015-12-01 07:20:07 -08008558#include <net/transp_v6.h>
8559static void sctp_v6_destroy_sock(struct sock *sk)
8560{
8561 sctp_destroy_sock(sk);
8562 inet6_destroy_sock(sk);
8563}
8564
Linus Torvalds1da177e2005-04-16 15:20:36 -07008565struct proto sctpv6_prot = {
8566 .name = "SCTPv6",
8567 .owner = THIS_MODULE,
8568 .close = sctp_close,
8569 .connect = sctp_connect,
8570 .disconnect = sctp_disconnect,
8571 .accept = sctp_accept,
8572 .ioctl = sctp_ioctl,
8573 .init = sctp_init_sock,
Eric Dumazet602dd622015-12-01 07:20:07 -08008574 .destroy = sctp_v6_destroy_sock,
Linus Torvalds1da177e2005-04-16 15:20:36 -07008575 .shutdown = sctp_shutdown,
8576 .setsockopt = sctp_setsockopt,
8577 .getsockopt = sctp_getsockopt,
8578 .sendmsg = sctp_sendmsg,
8579 .recvmsg = sctp_recvmsg,
8580 .bind = sctp_bind,
8581 .backlog_rcv = sctp_backlog_rcv,
8582 .hash = sctp_hash,
8583 .unhash = sctp_unhash,
8584 .get_port = sctp_get_port,
8585 .obj_size = sizeof(struct sctp6_sock),
Neil Horman4d93df02007-08-15 16:07:44 -07008586 .sysctl_mem = sysctl_sctp_mem,
8587 .sysctl_rmem = sysctl_sctp_rmem,
8588 .sysctl_wmem = sysctl_sctp_wmem,
8589 .memory_pressure = &sctp_memory_pressure,
8590 .enter_memory_pressure = sctp_enter_memory_pressure,
8591 .memory_allocated = &sctp_memory_allocated,
Pavel Emelyanov5f318862008-02-20 00:23:01 -08008592 .sockets_allocated = &sctp_sockets_allocated,
Linus Torvalds1da177e2005-04-16 15:20:36 -07008593};
Eric Dumazetdfd56b82011-12-10 09:48:31 +00008594#endif /* IS_ENABLED(CONFIG_IPV6) */