Lines Matching +full:sp +full:- +full:disabled +full:- +full:ports

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (c) 1999-2000 Cisco, Inc.
5 * Copyright (c) 1999-2001 Motorola, Inc.
6 * Copyright (c) 2001-2003 Intel Corp.
7 * Copyright (c) 2001-2002 Nokia, Inc.
16 * functions--this file is the functions which populate the struct proto
21 * lksctp developers <linux-sctp@vger.kernel.org>
31 * Inaky Perez-Gonzalez <inaky.gonzalez@intel.com>
109 struct sock *sk = asoc->base.sk; in sctp_wspace()
111 return asoc->ep->sndbuf_policy ? sk->sk_sndbuf - asoc->sndbuf_used in sctp_wspace()
119 * Since it is always 1-1 between chunk and skb, and also a new skb is always
126 struct sctp_association *asoc = chunk->asoc; in sctp_set_owner_w()
127 struct sock *sk = asoc->base.sk; in sctp_set_owner_w()
132 if (chunk->shkey) in sctp_set_owner_w()
133 sctp_auth_shkey_hold(chunk->shkey); in sctp_set_owner_w()
135 skb_set_owner_w(chunk->skb, sk); in sctp_set_owner_w()
137 chunk->skb->destructor = sctp_wfree; in sctp_set_owner_w()
139 skb_shinfo(chunk->skb)->destructor_arg = chunk; in sctp_set_owner_w()
141 refcount_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); in sctp_set_owner_w()
142 asoc->sndbuf_used += chunk->skb->truesize + sizeof(struct sctp_chunk); in sctp_set_owner_w()
143 sk_wmem_queued_add(sk, chunk->skb->truesize + sizeof(struct sctp_chunk)); in sctp_set_owner_w()
144 sk_mem_charge(sk, chunk->skb->truesize); in sctp_set_owner_w()
149 skb_orphan(chunk->skb); in sctp_clear_owner_w()
154 msg = chunk->msg; \
157 list_for_each_entry(c, &msg->chunks, frag_list) { \
158 if ((clear && asoc->base.sk == c->skb->sk) || \
159 (!clear && asoc->base.sk != c->skb->sk)) \
171 struct sctp_outq *q = &asoc->outqueue; in sctp_for_each_tx_datachunk()
175 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) in sctp_for_each_tx_datachunk()
176 list_for_each_entry(chunk, &t->transmitted, transmitted_list) in sctp_for_each_tx_datachunk()
179 list_for_each_entry(chunk, &q->retransmit, transmitted_list) in sctp_for_each_tx_datachunk()
182 list_for_each_entry(chunk, &q->sacked, transmitted_list) in sctp_for_each_tx_datachunk()
185 list_for_each_entry(chunk, &q->abandoned, transmitted_list) in sctp_for_each_tx_datachunk()
188 list_for_each_entry(chunk, &q->out_chunk_list, list) in sctp_for_each_tx_datachunk()
198 sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp) in sctp_for_each_rx_skb()
201 sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp) in sctp_for_each_rx_skb()
204 sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp) in sctp_for_each_rx_skb()
217 return -EINVAL; in sctp_verify_addr()
220 if (!af->addr_valid(addr, sctp_sk(sk), NULL)) in sctp_verify_addr()
221 return -EINVAL; in sctp_verify_addr()
223 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr))) in sctp_verify_addr()
224 return -EINVAL; in sctp_verify_addr()
229 /* Look up the association by its id. If this is not a UDP-style
236 /* If this is not a UDP-style socket, assoc id should be ignored. */ in sctp_id2assoc()
239 * could be a TCP-style listening socket or a socket which in sctp_id2assoc()
246 if (!list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_id2assoc()
247 asoc = list_entry(sctp_sk(sk)->ep->asocs.next, in sctp_id2assoc()
252 /* Otherwise this is a UDP-style socket. */ in sctp_id2assoc()
258 if (asoc && (asoc->base.sk != sk || asoc->base.dead)) in sctp_id2assoc()
274 struct sctp_af *af = sctp_get_af_specific(addr->ss_family); in sctp_addr_id2transport()
278 if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len)) in sctp_addr_id2transport()
281 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep, in sctp_addr_id2transport()
292 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_addr_id2transport()
298 /* API 3.1.2 bind() - UDP Style Syntax
303 * sd - the socket descriptor returned by socket().
304 * addr - the address structure (struct sockaddr_in or struct
306 * addr_len - the size of the address structure.
318 if (!sctp_sk(sk)->ep->base.bind_addr.port) in sctp_bind()
322 retval = -EINVAL; in sctp_bind()
341 if (!opt->pf->af_supported(addr->sa.sa_family, opt)) in sctp_sockaddr_af()
344 if (addr->sa.sa_family == AF_INET6) { in sctp_sockaddr_af()
348 if (ipv6_addr_v4mapped(&addr->v6.sin6_addr) && in sctp_sockaddr_af()
349 !opt->pf->af_supported(AF_INET, opt)) in sctp_sockaddr_af()
354 af = sctp_get_af_specific(addr->sa.sa_family); in sctp_sockaddr_af()
356 if (len < af->sockaddr_len) in sctp_sockaddr_af()
362 static void sctp_auto_asconf_init(struct sctp_sock *sp) in sctp_auto_asconf_init() argument
364 struct net *net = sock_net(&sp->inet.sk); in sctp_auto_asconf_init()
366 if (net->sctp.default_auto_asconf) { in sctp_auto_asconf_init()
367 spin_lock_bh(&net->sctp.addr_wq_lock); in sctp_auto_asconf_init()
368 list_add_tail(&sp->auto_asconf_list, &net->sctp.auto_asconf_splist); in sctp_auto_asconf_init()
369 spin_unlock_bh(&net->sctp.addr_wq_lock); in sctp_auto_asconf_init()
370 sp->do_auto_asconf = 1; in sctp_auto_asconf_init()
378 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_bind() local
379 struct sctp_endpoint *ep = sp->ep; in sctp_do_bind()
380 struct sctp_bind_addr *bp = &ep->base.bind_addr; in sctp_do_bind()
386 af = sctp_sockaddr_af(sp, addr, len); in sctp_do_bind()
390 return -EINVAL; in sctp_do_bind()
393 snum = ntohs(addr->v4.sin_port); in sctp_do_bind()
396 __func__, sk, &addr->sa, bp->port, snum, len); in sctp_do_bind()
399 if (!sp->pf->bind_verify(sp, addr)) in sctp_do_bind()
400 return -EADDRNOTAVAIL; in sctp_do_bind()
403 * It's OK to allow 0 ports if we are already bound. in sctp_do_bind()
406 if (bp->port) { in sctp_do_bind()
408 snum = bp->port; in sctp_do_bind()
409 else if (snum != bp->port) { in sctp_do_bind()
411 "%d\n", __func__, snum, bp->port); in sctp_do_bind()
412 return -EINVAL; in sctp_do_bind()
417 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) in sctp_do_bind()
418 return -EACCES; in sctp_do_bind()
423 if (sctp_bind_addr_match(bp, addr, sp)) in sctp_do_bind()
424 return -EINVAL; in sctp_do_bind()
430 addr->v4.sin_port = htons(snum); in sctp_do_bind()
432 return -EADDRINUSE; in sctp_do_bind()
435 if (!bp->port) { in sctp_do_bind()
436 bp->port = inet_sk(sk)->inet_num; in sctp_do_bind()
437 sctp_auto_asconf_init(sp); in sctp_do_bind()
441 * Use GFP_ATOMIC since BHs will be disabled. in sctp_do_bind()
443 ret = sctp_add_bind_addr(bp, addr, af->sockaddr_len, in sctp_do_bind()
451 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num); in sctp_do_bind()
452 sp->pf->to_sk_saddr(addr, sk); in sctp_do_bind()
462 * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a
464 * time two ASCONF may be in-transit on any given association (one sent
475 if (asoc->addip_last_asconf) { in sctp_send_asconf()
476 list_add_tail(&chunk->list, &asoc->addip_chunk_list); in sctp_send_asconf()
482 retval = sctp_primitive_ASCONF(asoc->base.net, asoc, chunk); in sctp_send_asconf()
486 asoc->addip_last_asconf = chunk; in sctp_send_asconf()
521 af = sctp_get_af_specific(sa_addr->sa_family); in sctp_bindx_add()
523 retval = -EINVAL; in sctp_bindx_add()
528 af->sockaddr_len); in sctp_bindx_add()
530 addr_buf += af->sockaddr_len; in sctp_bindx_add()
558 struct sctp_sock *sp; in sctp_send_asconf_add_ip() local
572 sp = sctp_sk(sk); in sctp_send_asconf_add_ip()
573 ep = sp->ep; in sctp_send_asconf_add_ip()
575 if (!ep->asconf_enable) in sctp_send_asconf_add_ip()
581 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_add_ip()
582 if (!asoc->peer.asconf_capable) in sctp_send_asconf_add_ip()
585 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP) in sctp_send_asconf_add_ip()
599 af = sctp_get_af_specific(addr->v4.sin_family); in sctp_send_asconf_add_ip()
601 retval = -EINVAL; in sctp_send_asconf_add_ip()
608 addr_buf += af->sockaddr_len; in sctp_send_asconf_add_ip()
616 bp = &asoc->base.bind_addr; in sctp_send_asconf_add_ip()
617 p = bp->address_list.next; in sctp_send_asconf_add_ip()
619 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, in sctp_send_asconf_add_ip()
622 retval = -ENOMEM; in sctp_send_asconf_add_ip()
632 af = sctp_get_af_specific(addr->v4.sin_family); in sctp_send_asconf_add_ip()
633 memcpy(&saveaddr, addr, af->sockaddr_len); in sctp_send_asconf_add_ip()
637 addr_buf += af->sockaddr_len; in sctp_send_asconf_add_ip()
639 if (asoc->src_out_of_asoc_ok) { in sctp_send_asconf_add_ip()
643 &asoc->peer.transport_addr_list, transports) { in sctp_send_asconf_add_ip()
644 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32, in sctp_send_asconf_add_ip()
645 2*asoc->pathmtu, 4380)); in sctp_send_asconf_add_ip()
646 trans->ssthresh = asoc->peer.i.a_rwnd; in sctp_send_asconf_add_ip()
647 trans->rto = asoc->rto_initial; in sctp_send_asconf_add_ip()
649 trans->rtt = trans->srtt = trans->rttvar = 0; in sctp_send_asconf_add_ip()
652 sctp_sk(asoc->base.sk)); in sctp_send_asconf_add_ip()
673 * available, the operation will return -EBUSY.
679 struct sctp_sock *sp = sctp_sk(sk); in sctp_bindx_rem() local
680 struct sctp_endpoint *ep = sp->ep; in sctp_bindx_rem()
682 struct sctp_bind_addr *bp = &ep->base.bind_addr; in sctp_bindx_rem()
697 if (list_empty(&bp->address_list) || in sctp_bindx_rem()
698 (sctp_list_single_entry(&bp->address_list))) { in sctp_bindx_rem()
699 retval = -EBUSY; in sctp_bindx_rem()
704 af = sctp_get_af_specific(sa_addr->sa.sa_family); in sctp_bindx_rem()
706 retval = -EINVAL; in sctp_bindx_rem()
710 if (!af->addr_valid(sa_addr, sp, NULL)) { in sctp_bindx_rem()
711 retval = -EADDRNOTAVAIL; in sctp_bindx_rem()
715 if (sa_addr->v4.sin_port && in sctp_bindx_rem()
716 sa_addr->v4.sin_port != htons(bp->port)) { in sctp_bindx_rem()
717 retval = -EINVAL; in sctp_bindx_rem()
721 if (!sa_addr->v4.sin_port) in sctp_bindx_rem()
722 sa_addr->v4.sin_port = htons(bp->port); in sctp_bindx_rem()
724 /* FIXME - There is probably a need to check if sk->sk_saddr and in sctp_bindx_rem()
725 * sk->sk_rcv_addr are currently set to one of the addresses to in sctp_bindx_rem()
727 * when we are fixing the outstanding issues with multi-homing in sctp_bindx_rem()
729 * sctp_do_bind(). -daisy in sctp_bindx_rem()
733 addr_buf += af->sockaddr_len; in sctp_bindx_rem()
760 struct sctp_sock *sp; in sctp_send_asconf_del_ip() local
775 sp = sctp_sk(sk); in sctp_send_asconf_del_ip()
776 ep = sp->ep; in sctp_send_asconf_del_ip()
778 if (!ep->asconf_enable) in sctp_send_asconf_del_ip()
784 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_del_ip()
786 if (!asoc->peer.asconf_capable) in sctp_send_asconf_del_ip()
789 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP) in sctp_send_asconf_del_ip()
803 af = sctp_get_af_specific(laddr->v4.sin_family); in sctp_send_asconf_del_ip()
805 retval = -EINVAL; in sctp_send_asconf_del_ip()
812 addr_buf += af->sockaddr_len; in sctp_send_asconf_del_ip()
822 bp = &asoc->base.bind_addr; in sctp_send_asconf_del_ip()
824 addrcnt, sp); in sctp_send_asconf_del_ip()
826 if (asoc->asconf_addr_del_pending) in sctp_send_asconf_del_ip()
828 asoc->asconf_addr_del_pending = in sctp_send_asconf_del_ip()
830 if (asoc->asconf_addr_del_pending == NULL) { in sctp_send_asconf_del_ip()
831 retval = -ENOMEM; in sctp_send_asconf_del_ip()
834 asoc->asconf_addr_del_pending->sa.sa_family = in sctp_send_asconf_del_ip()
835 addrs->sa_family; in sctp_send_asconf_del_ip()
836 asoc->asconf_addr_del_pending->v4.sin_port = in sctp_send_asconf_del_ip()
837 htons(bp->port); in sctp_send_asconf_del_ip()
838 if (addrs->sa_family == AF_INET) { in sctp_send_asconf_del_ip()
842 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr; in sctp_send_asconf_del_ip()
843 } else if (addrs->sa_family == AF_INET6) { in sctp_send_asconf_del_ip()
847 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr; in sctp_send_asconf_del_ip()
851 __func__, asoc, &asoc->asconf_addr_del_pending->sa, in sctp_send_asconf_del_ip()
852 asoc->asconf_addr_del_pending); in sctp_send_asconf_del_ip()
854 asoc->src_out_of_asoc_ok = 1; in sctp_send_asconf_del_ip()
860 return -EINVAL; in sctp_send_asconf_del_ip()
869 retval = -ENOMEM; in sctp_send_asconf_del_ip()
880 af = sctp_get_af_specific(laddr->v4.sin_family); in sctp_send_asconf_del_ip()
881 list_for_each_entry(saddr, &bp->address_list, list) { in sctp_send_asconf_del_ip()
882 if (sctp_cmp_addr_exact(&saddr->a, laddr)) in sctp_send_asconf_del_ip()
883 saddr->state = SCTP_ADDR_DEL; in sctp_send_asconf_del_ip()
885 addr_buf += af->sockaddr_len; in sctp_send_asconf_del_ip()
892 list_for_each_entry(transport, &asoc->peer.transport_addr_list, in sctp_send_asconf_del_ip()
895 sctp_sk(asoc->base.sk)); in sctp_send_asconf_del_ip()
908 int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw) in sctp_asconf_mgmt() argument
910 struct sock *sk = sctp_opt2sk(sp); in sctp_asconf_mgmt()
915 addr = &addrw->a; in sctp_asconf_mgmt()
916 addr->v4.sin_port = htons(sp->ep->base.bind_addr.port); in sctp_asconf_mgmt()
917 af = sctp_get_af_specific(addr->sa.sa_family); in sctp_asconf_mgmt()
919 return -EINVAL; in sctp_asconf_mgmt()
920 if (sctp_verify_addr(sk, addr, af->sockaddr_len)) in sctp_asconf_mgmt()
921 return -EINVAL; in sctp_asconf_mgmt()
923 if (addrw->state == SCTP_ADDR_NEW) in sctp_asconf_mgmt()
950 * -1, and sets errno to the appropriate error code.
1012 return -EINVAL; in sctp_setsockopt_bindx()
1017 return -EINVAL; in sctp_setsockopt_bindx()
1020 af = sctp_get_af_specific(sa_addr->sa_family); in sctp_setsockopt_bindx()
1025 if (!af || (walk_size + af->sockaddr_len) > addrs_size) in sctp_setsockopt_bindx()
1026 return -EINVAL; in sctp_setsockopt_bindx()
1028 addr_buf += af->sockaddr_len; in sctp_setsockopt_bindx()
1029 walk_size += af->sockaddr_len; in sctp_setsockopt_bindx()
1051 return -EINVAL; in sctp_setsockopt_bindx()
1072 struct sock *sk = ep->base.sk; in sctp_connect_new_asoc()
1078 return -EADDRNOTAVAIL; in sctp_connect_new_asoc()
1080 if (!ep->base.bind_addr.port) { in sctp_connect_new_asoc()
1082 return -EAGAIN; in sctp_connect_new_asoc()
1084 if (inet_port_requires_bind_service(net, ep->base.bind_addr.port) && in sctp_connect_new_asoc()
1085 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) in sctp_connect_new_asoc()
1086 return -EACCES; in sctp_connect_new_asoc()
1092 return -ENOMEM; in sctp_connect_new_asoc()
1100 err = -ENOMEM; in sctp_connect_new_asoc()
1107 if (init->sinit_num_ostreams) { in sctp_connect_new_asoc()
1108 __u16 outcnt = init->sinit_num_ostreams; in sctp_connect_new_asoc()
1110 asoc->c.sinit_num_ostreams = outcnt; in sctp_connect_new_asoc()
1111 /* outcnt has been changed, need to re-init stream */ in sctp_connect_new_asoc()
1112 err = sctp_stream_init(&asoc->stream, outcnt, 0, GFP_KERNEL); in sctp_connect_new_asoc()
1117 if (init->sinit_max_instreams) in sctp_connect_new_asoc()
1118 asoc->c.sinit_max_instreams = init->sinit_max_instreams; in sctp_connect_new_asoc()
1120 if (init->sinit_max_attempts) in sctp_connect_new_asoc()
1121 asoc->max_init_attempts = init->sinit_max_attempts; in sctp_connect_new_asoc()
1123 if (init->sinit_max_init_timeo) in sctp_connect_new_asoc()
1124 asoc->max_init_timeo = in sctp_connect_new_asoc()
1125 msecs_to_jiffies(init->sinit_max_init_timeo); in sctp_connect_new_asoc()
1136 struct sctp_endpoint *ep = asoc->ep; in sctp_connect_add_peer()
1141 err = sctp_verify_addr(ep->base.sk, daddr, addr_len); in sctp_connect_add_peer()
1147 return old->state >= SCTP_STATE_ESTABLISHED ? -EISCONN in sctp_connect_add_peer()
1148 : -EALREADY; in sctp_connect_add_peer()
1151 return -EADDRNOTAVAIL; in sctp_connect_add_peer()
1155 return -ENOMEM; in sctp_connect_add_peer()
1168 struct sctp_sock *sp = sctp_sk(sk); in __sctp_connect() local
1169 struct sctp_endpoint *ep = sp->ep; in __sctp_connect()
1180 return -EISCONN; in __sctp_connect()
1183 af = sctp_get_af_specific(daddr->sa.sa_family); in __sctp_connect()
1184 if (!af || af->sockaddr_len > addrs_size) in __sctp_connect()
1185 return -EINVAL; in __sctp_connect()
1187 err = sctp_verify_addr(sk, daddr, af->sockaddr_len); in __sctp_connect()
1193 return asoc->state >= SCTP_STATE_ESTABLISHED ? -EISCONN in __sctp_connect()
1194 : -EALREADY; in __sctp_connect()
1199 asoc = transport->asoc; in __sctp_connect()
1201 addr_buf += af->sockaddr_len; in __sctp_connect()
1202 walk_size = af->sockaddr_len; in __sctp_connect()
1204 err = -EINVAL; in __sctp_connect()
1209 af = sctp_get_af_specific(daddr->sa.sa_family); in __sctp_connect()
1210 if (!af || af->sockaddr_len + walk_size > addrs_size) in __sctp_connect()
1213 if (asoc->peer.port != ntohs(daddr->v4.sin_port)) in __sctp_connect()
1216 err = sctp_connect_add_peer(asoc, daddr, af->sockaddr_len); in __sctp_connect()
1220 addr_buf += af->sockaddr_len; in __sctp_connect()
1221 walk_size += af->sockaddr_len; in __sctp_connect()
1238 inet_sk(sk)->inet_dport = htons(asoc->peer.port); in __sctp_connect()
1239 sp->pf->to_sk_daddr(daddr, sk); in __sctp_connect()
1240 sk->sk_err = 0; in __sctp_connect()
1243 *assoc_id = asoc->assoc_id; in __sctp_connect()
1277 * returns -1, and sets errno to the appropriate error code. The assoc_id
1284 * an endpoint that is multi-homed. Much like sctp_bindx() this call
1320 return -EINVAL; in __sctp_setsockopt_connectx()
1329 /* in-kernel sockets don't generally have a file allocated to them in __sctp_setsockopt_connectx()
1332 if (sk->sk_socket->file) in __sctp_setsockopt_connectx()
1333 flags = sk->sk_socket->file->f_flags; in __sctp_setsockopt_connectx()
1372 * We use the sctp_getaddrs_old structure so that use-space library
1375 * addrs_num structure member. That way we can re-use the existing
1400 return -EINVAL; in sctp_getsockopt_connectx3()
1402 return -EFAULT; in sctp_getsockopt_connectx3()
1411 return -EINVAL; in sctp_getsockopt_connectx3()
1413 return -EFAULT; in sctp_getsockopt_connectx3()
1422 if (err == 0 || err == -EINPROGRESS) { in sctp_getsockopt_connectx3()
1424 return -EFAULT; in sctp_getsockopt_connectx3()
1426 return -EFAULT; in sctp_getsockopt_connectx3()
1432 /* API 3.1.4 close() - UDP Style Syntax
1435 * by a UDP-style socket.
1441 * sd - the socket descriptor of the associations to be closed.
1444 * UDP-style socket, an application should use the sendmsg() call,
1448 * If sd in the close() call is a branched-off socket representing only
1451 * 4.1.6 close() - TCP Style Syntax
1459 * sd - the socket descriptor of the association to be closed.
1466 * An application using the TCP-style socket can use this option to
1493 sk->sk_shutdown = SHUTDOWN_MASK; in sctp_close()
1496 ep = sctp_sk(sk)->ep; in sctp_close()
1499 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue); in sctp_close()
1500 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby); in sctp_close()
1503 list_for_each_safe(pos, temp, &ep->asocs) { in sctp_close()
1508 * it belongs to a TCP-style listening socket that is in sctp_close()
1518 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) || in sctp_close()
1519 !skb_queue_empty(&asoc->ulpq.reasm) || in sctp_close()
1520 !skb_queue_empty(&asoc->ulpq.reasm_uo) || in sctp_close()
1521 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) { in sctp_close()
1530 /* On a TCP-style socket, block for at most linger_time if set. */ in sctp_close()
1542 spin_lock_bh(&net->sctp.addr_wq_lock); in sctp_close()
1552 spin_unlock_bh(&net->sctp.addr_wq_lock); in sctp_close()
1562 if (err == -EPIPE) in sctp_error()
1563 err = sock_error(sk) ? : -EPIPE; in sctp_error()
1564 if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) in sctp_error()
1569 /* API 3.1.3 sendmsg() - UDP Style Syntax
1577 * socket - the socket descriptor of the endpoint.
1578 * message - pointer to the msghdr structure which contains a single
1584 * flags - flags sent or received with the user message, see Section
1603 return -EPIPE; in sctp_sendmsg_parse()
1605 if (msg_len > sk->sk_sndbuf) in sctp_sendmsg_parse()
1606 return -EMSGSIZE; in sctp_sendmsg_parse()
1616 if (cmsgs->srinfo) { in sctp_sendmsg_parse()
1617 srinfo->sinfo_stream = cmsgs->srinfo->sinfo_stream; in sctp_sendmsg_parse()
1618 srinfo->sinfo_flags = cmsgs->srinfo->sinfo_flags; in sctp_sendmsg_parse()
1619 srinfo->sinfo_ppid = cmsgs->srinfo->sinfo_ppid; in sctp_sendmsg_parse()
1620 srinfo->sinfo_context = cmsgs->srinfo->sinfo_context; in sctp_sendmsg_parse()
1621 srinfo->sinfo_assoc_id = cmsgs->srinfo->sinfo_assoc_id; in sctp_sendmsg_parse()
1622 srinfo->sinfo_timetolive = cmsgs->srinfo->sinfo_timetolive; in sctp_sendmsg_parse()
1625 if (cmsgs->sinfo) { in sctp_sendmsg_parse()
1626 srinfo->sinfo_stream = cmsgs->sinfo->snd_sid; in sctp_sendmsg_parse()
1627 srinfo->sinfo_flags = cmsgs->sinfo->snd_flags; in sctp_sendmsg_parse()
1628 srinfo->sinfo_ppid = cmsgs->sinfo->snd_ppid; in sctp_sendmsg_parse()
1629 srinfo->sinfo_context = cmsgs->sinfo->snd_context; in sctp_sendmsg_parse()
1630 srinfo->sinfo_assoc_id = cmsgs->sinfo->snd_assoc_id; in sctp_sendmsg_parse()
1633 if (cmsgs->prinfo) { in sctp_sendmsg_parse()
1634 srinfo->sinfo_timetolive = cmsgs->prinfo->pr_value; in sctp_sendmsg_parse()
1635 SCTP_PR_SET_POLICY(srinfo->sinfo_flags, in sctp_sendmsg_parse()
1636 cmsgs->prinfo->pr_policy); in sctp_sendmsg_parse()
1639 sflags = srinfo->sinfo_flags; in sctp_sendmsg_parse()
1644 return -EINVAL; in sctp_sendmsg_parse()
1648 return -EINVAL; in sctp_sendmsg_parse()
1650 if ((sflags & SCTP_ADDR_OVER) && !msg->msg_name) in sctp_sendmsg_parse()
1651 return -EINVAL; in sctp_sendmsg_parse()
1661 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_sendmsg_new_asoc()
1671 return -EINVAL; in sctp_sendmsg_new_asoc()
1675 return -EADDRNOTAVAIL; in sctp_sendmsg_new_asoc()
1677 /* Label connection socket for first association 1-to-many in sctp_sendmsg_new_asoc()
1678 * style for client sequence socket()->sendmsg(). This in sctp_sendmsg_new_asoc()
1683 af = sctp_get_af_specific(daddr->sa.sa_family); in sctp_sendmsg_new_asoc()
1685 return -EINVAL; in sctp_sendmsg_new_asoc()
1688 af->sockaddr_len); in sctp_sendmsg_new_asoc()
1692 err = sctp_connect_new_asoc(ep, daddr, cmsgs->init, tp); in sctp_sendmsg_new_asoc()
1695 asoc = (*tp)->asoc; in sctp_sendmsg_new_asoc()
1697 if (!cmsgs->addrs_msg) in sctp_sendmsg_new_asoc()
1700 if (daddr->sa.sa_family == AF_INET6) in sctp_sendmsg_new_asoc()
1701 flowinfo = daddr->v6.sin6_flowinfo; in sctp_sendmsg_new_asoc()
1704 for_each_cmsghdr(cmsg, cmsgs->addrs_msg) { in sctp_sendmsg_new_asoc()
1708 if (cmsg->cmsg_level != IPPROTO_SCTP || in sctp_sendmsg_new_asoc()
1709 (cmsg->cmsg_type != SCTP_DSTADDRV4 && in sctp_sendmsg_new_asoc()
1710 cmsg->cmsg_type != SCTP_DSTADDRV6)) in sctp_sendmsg_new_asoc()
1715 dlen = cmsg->cmsg_len - sizeof(struct cmsghdr); in sctp_sendmsg_new_asoc()
1716 if (cmsg->cmsg_type == SCTP_DSTADDRV4) { in sctp_sendmsg_new_asoc()
1718 err = -EINVAL; in sctp_sendmsg_new_asoc()
1723 daddr->v4.sin_family = AF_INET; in sctp_sendmsg_new_asoc()
1724 daddr->v4.sin_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1725 memcpy(&daddr->v4.sin_addr, CMSG_DATA(cmsg), dlen); in sctp_sendmsg_new_asoc()
1728 err = -EINVAL; in sctp_sendmsg_new_asoc()
1733 daddr->v6.sin6_flowinfo = flowinfo; in sctp_sendmsg_new_asoc()
1734 daddr->v6.sin6_family = AF_INET6; in sctp_sendmsg_new_asoc()
1735 daddr->v6.sin6_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1736 memcpy(&daddr->v6.sin6_addr, CMSG_DATA(cmsg), dlen); in sctp_sendmsg_new_asoc()
1755 struct sock *sk = asoc->base.sk; in sctp_sendmsg_check_sflags()
1759 return -EPIPE; in sctp_sendmsg_check_sflags()
1777 return -ENOMEM; in sctp_sendmsg_check_sflags()
1781 iov_iter_revert(&msg->msg_iter, msg_len); in sctp_sendmsg_check_sflags()
1794 struct sock *sk = asoc->base.sk; in sctp_sendmsg_to_asoc()
1795 struct sctp_sock *sp = sctp_sk(sk); in sctp_sendmsg_to_asoc() local
1803 if (sinfo->sinfo_stream >= asoc->stream.outcnt) { in sctp_sendmsg_to_asoc()
1804 err = -EINVAL; in sctp_sendmsg_to_asoc()
1808 if (unlikely(!SCTP_SO(&asoc->stream, sinfo->sinfo_stream)->ext)) { in sctp_sendmsg_to_asoc()
1809 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream); in sctp_sendmsg_to_asoc()
1814 if (sp->disable_fragments && msg_len > asoc->frag_point) { in sctp_sendmsg_to_asoc()
1815 err = -EMSGSIZE; in sctp_sendmsg_to_asoc()
1819 if (asoc->pmtu_pending) { in sctp_sendmsg_to_asoc()
1820 if (sp->param_flags & SPP_PMTUD_ENABLE) in sctp_sendmsg_to_asoc()
1822 asoc->pmtu_pending = 0; in sctp_sendmsg_to_asoc()
1826 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); in sctp_sendmsg_to_asoc()
1829 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in sctp_sendmsg_to_asoc()
1833 if (unlikely(sinfo->sinfo_stream >= asoc->stream.outcnt)) { in sctp_sendmsg_to_asoc()
1834 err = -EINVAL; in sctp_sendmsg_to_asoc()
1844 if (asoc->ep->intl_enable) { in sctp_sendmsg_to_asoc()
1848 err = -ESRCH; in sctp_sendmsg_to_asoc()
1858 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter); in sctp_sendmsg_to_asoc()
1864 asoc->force_delay = !!(msg->msg_flags & MSG_MORE); in sctp_sendmsg_to_asoc()
1866 list_for_each_entry(chunk, &datamsg->chunks, frag_list) { in sctp_sendmsg_to_asoc()
1869 chunk->transport = transport; in sctp_sendmsg_to_asoc()
1883 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in sctp_sendmsg_to_asoc()
1900 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { in sctp_sendmsg_get_daddr()
1901 int len = msg->msg_namelen; in sctp_sendmsg_get_daddr()
1906 daddr = (union sctp_addr *)msg->msg_name; in sctp_sendmsg_get_daddr()
1920 if (!cmsgs->srinfo && !cmsgs->sinfo) { in sctp_sendmsg_update_sinfo()
1921 sinfo->sinfo_stream = asoc->default_stream; in sctp_sendmsg_update_sinfo()
1922 sinfo->sinfo_ppid = asoc->default_ppid; in sctp_sendmsg_update_sinfo()
1923 sinfo->sinfo_context = asoc->default_context; in sctp_sendmsg_update_sinfo()
1924 sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); in sctp_sendmsg_update_sinfo()
1926 if (!cmsgs->prinfo) in sctp_sendmsg_update_sinfo()
1927 sinfo->sinfo_flags = asoc->default_flags; in sctp_sendmsg_update_sinfo()
1930 if (!cmsgs->srinfo && !cmsgs->prinfo) in sctp_sendmsg_update_sinfo()
1931 sinfo->sinfo_timetolive = asoc->default_timetolive; in sctp_sendmsg_update_sinfo()
1933 if (cmsgs->authinfo) { in sctp_sendmsg_update_sinfo()
1937 sinfo->sinfo_tsn = 1; in sctp_sendmsg_update_sinfo()
1938 sinfo->sinfo_ssn = cmsgs->authinfo->auth_keynumber; in sctp_sendmsg_update_sinfo()
1944 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_sendmsg()
1960 sflags = sinfo->sinfo_flags; in sctp_sendmsg()
1973 list_for_each_entry_safe(asoc, tmp, &ep->asocs, asocs) { in sctp_sendmsg()
1988 iov_iter_revert(&msg->msg_iter, err); in sctp_sendmsg()
2008 asoc = transport->asoc; in sctp_sendmsg()
2015 asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id); in sctp_sendmsg()
2017 err = -EPIPE; in sctp_sendmsg()
2031 if (err < 0 && err != -ESRCH && new) in sctp_sendmsg()
2037 return sctp_error(sk, msg->msg_flags, err); in sctp_sendmsg()
2057 len -= skb_len; in sctp_skb_pull()
2062 skb->len -= (len-rlen); in sctp_skb_pull()
2063 skb->data_len -= (len-rlen); in sctp_skb_pull()
2074 /* API 3.1.3 recvmsg() - UDP Style Syntax
2079 * socket - the socket descriptor of the endpoint.
2080 * message - pointer to the msghdr structure which contains a single
2086 * flags - flags sent or received with the user message, see Section
2093 struct sctp_sock *sp = sctp_sk(sk); in sctp_recvmsg() local
2106 skb_queue_empty_lockless(&sk->sk_receive_queue)) in sctp_recvmsg()
2113 err = -ENOTCONN; in sctp_recvmsg()
2124 skb_len = skb->len; in sctp_recvmsg()
2137 if (event->chunk && event->chunk->head_skb) in sctp_recvmsg()
2138 head_skb = event->chunk->head_skb; in sctp_recvmsg()
2143 msg->msg_flags |= MSG_NOTIFICATION; in sctp_recvmsg()
2144 sp->pf->event_msgname(event, msg->msg_name, addr_len); in sctp_recvmsg()
2146 sp->pf->skb_msgname(head_skb, msg->msg_name, addr_len); in sctp_recvmsg()
2150 if (sp->recvnxtinfo) in sctp_recvmsg()
2153 if (sp->recvrcvinfo) in sctp_recvmsg()
2156 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_DATA_IO_EVENT)) in sctp_recvmsg()
2166 msg->msg_flags &= ~MSG_EOR; in sctp_recvmsg()
2170 skb_queue_head(&sk->sk_receive_queue, skb); in sctp_recvmsg()
2177 sctp_assoc_rwnd_increase(event->asoc, copied); in sctp_recvmsg()
2179 } else if ((event->msg_flags & MSG_NOTIFICATION) || in sctp_recvmsg()
2180 (event->msg_flags & MSG_EOR)) in sctp_recvmsg()
2181 msg->msg_flags |= MSG_EOR; in sctp_recvmsg()
2183 msg->msg_flags &= ~MSG_EOR; in sctp_recvmsg()
2214 return -EINVAL; in sctp_setsockopt_disable_fragments()
2215 sctp_sk(sk)->disable_fragments = (*val == 0) ? 0 : 1; in sctp_setsockopt_disable_fragments()
2222 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_events() local
2227 return -EINVAL; in sctp_setsockopt_events()
2230 sctp_ulpevent_type_set(&sp->subscribe, SCTP_SN_TYPE_BASE + i, in sctp_setsockopt_events()
2233 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_events()
2234 asoc->subscribe = sctp_sk(sk)->subscribe; in sctp_setsockopt_events()
2240 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_SENDER_DRY_EVENT)) { in sctp_setsockopt_events()
2244 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) { in sctp_setsockopt_events()
2248 return -ENOMEM; in sctp_setsockopt_events()
2250 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_setsockopt_events()
2259 * This socket option is applicable to the UDP-style socket only. When
2271 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_autoclose() local
2274 /* Applicable to UDP-style socket only */ in sctp_setsockopt_autoclose()
2276 return -EOPNOTSUPP; in sctp_setsockopt_autoclose()
2278 return -EINVAL; in sctp_setsockopt_autoclose()
2280 sp->autoclose = *optval; in sctp_setsockopt_autoclose()
2281 if (sp->autoclose > net->sctp.max_autoclose) in sctp_setsockopt_autoclose()
2282 sp->autoclose = net->sctp.max_autoclose; in sctp_setsockopt_autoclose()
2308 * spp_assoc_id - (one-to-many style socket) This is filled in the
2311 * spp_address - This specifies which address is of interest.
2312 * spp_hbinterval - This contains the value of the heartbeat interval,
2316 * spp_pathmaxrxt - This contains the maximum number of
2321 * spp_pathmtu - When Path MTU discovery is disabled the value
2327 * spp_sackdelay - When delayed sack is enabled, this value specifies
2335 * spp_flags - These flags are used to control various features
2339 * SPP_HB_ENABLE - Enable heartbeats on the
2344 * SPP_HB_DISABLE - Disable heartbeats on the
2347 * will have their heartbeats disabled. Note also
2353 * SPP_HB_DEMAND - Request a user initiated heartbeat
2356 * SPP_HB_TIME_IS_ZERO - Specify's that the time for
2360 * SPP_PMTUD_ENABLE - This field will enable PMTU
2365 * SPP_PMTUD_DISABLE - This field will disable PMTU
2373 * SPP_SACKDELAY_ENABLE - Setting this flag turns
2379 * SPP_SACKDELAY_DISABLE - Setting this flag turns
2381 * delayed sack is disabled for the entire association. Note
2397 * returned. For non-IPv6 sockets, this flag will be left
2414 * - This field is used in conjunction with the
2417 * label. This setting has precedence over any IPv6-layer
2420 * spp_dscp - This field is used in conjunction with the SPP_DSCP flag
2423 * IPv4- or IPv6- layer setting.
2428 struct sctp_sock *sp, in sctp_apply_peer_addr_params() argument
2435 if (params->spp_flags & SPP_HB_DEMAND && trans) { in sctp_apply_peer_addr_params()
2436 error = sctp_primitive_REQUESTHEARTBEAT(trans->asoc->base.net, in sctp_apply_peer_addr_params()
2437 trans->asoc, trans); in sctp_apply_peer_addr_params()
2446 if (params->spp_flags & SPP_HB_ENABLE) { in sctp_apply_peer_addr_params()
2448 /* Re-zero the interval if the SPP_HB_TIME_IS_ZERO is in sctp_apply_peer_addr_params()
2452 if (params->spp_flags & SPP_HB_TIME_IS_ZERO) in sctp_apply_peer_addr_params()
2453 params->spp_hbinterval = 0; in sctp_apply_peer_addr_params()
2455 if (params->spp_hbinterval || in sctp_apply_peer_addr_params()
2456 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) { in sctp_apply_peer_addr_params()
2458 trans->hbinterval = in sctp_apply_peer_addr_params()
2459 msecs_to_jiffies(params->spp_hbinterval); in sctp_apply_peer_addr_params()
2462 asoc->hbinterval = in sctp_apply_peer_addr_params()
2463 msecs_to_jiffies(params->spp_hbinterval); in sctp_apply_peer_addr_params()
2465 sp->hbinterval = params->spp_hbinterval; in sctp_apply_peer_addr_params()
2472 trans->param_flags = in sctp_apply_peer_addr_params()
2473 (trans->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2475 asoc->param_flags = in sctp_apply_peer_addr_params()
2476 (asoc->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2478 sp->param_flags = in sctp_apply_peer_addr_params()
2479 (sp->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2483 /* When Path MTU discovery is disabled the value specified here will in sctp_apply_peer_addr_params()
2488 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) { in sctp_apply_peer_addr_params()
2490 trans->pathmtu = params->spp_pathmtu; in sctp_apply_peer_addr_params()
2493 sctp_assoc_set_pmtu(asoc, params->spp_pathmtu); in sctp_apply_peer_addr_params()
2495 sp->pathmtu = params->spp_pathmtu; in sctp_apply_peer_addr_params()
2501 int update = (trans->param_flags & SPP_PMTUD_DISABLE) && in sctp_apply_peer_addr_params()
2502 (params->spp_flags & SPP_PMTUD_ENABLE); in sctp_apply_peer_addr_params()
2503 trans->param_flags = in sctp_apply_peer_addr_params()
2504 (trans->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2506 sctp_transport_pmtu(trans, sctp_opt2sk(sp)); in sctp_apply_peer_addr_params()
2511 asoc->param_flags = in sctp_apply_peer_addr_params()
2512 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2514 sp->param_flags = in sctp_apply_peer_addr_params()
2515 (sp->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2523 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) { in sctp_apply_peer_addr_params()
2525 trans->sackdelay = in sctp_apply_peer_addr_params()
2526 msecs_to_jiffies(params->spp_sackdelay); in sctp_apply_peer_addr_params()
2528 asoc->sackdelay = in sctp_apply_peer_addr_params()
2529 msecs_to_jiffies(params->spp_sackdelay); in sctp_apply_peer_addr_params()
2531 sp->sackdelay = params->spp_sackdelay; in sctp_apply_peer_addr_params()
2537 trans->param_flags = in sctp_apply_peer_addr_params()
2538 (trans->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2541 asoc->param_flags = in sctp_apply_peer_addr_params()
2542 (asoc->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2545 sp->param_flags = in sctp_apply_peer_addr_params()
2546 (sp->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2554 if (params->spp_pathmaxrxt) { in sctp_apply_peer_addr_params()
2556 trans->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2558 asoc->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2560 sp->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2564 if (params->spp_flags & SPP_IPV6_FLOWLABEL) { in sctp_apply_peer_addr_params()
2566 if (trans->ipaddr.sa.sa_family == AF_INET6) { in sctp_apply_peer_addr_params()
2567 trans->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2569 trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2574 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2576 if (t->ipaddr.sa.sa_family != AF_INET6) in sctp_apply_peer_addr_params()
2578 t->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2580 t->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2582 asoc->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2584 asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2585 } else if (sctp_opt2sk(sp)->sk_family == AF_INET6) { in sctp_apply_peer_addr_params()
2586 sp->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2588 sp->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2592 if (params->spp_flags & SPP_DSCP) { in sctp_apply_peer_addr_params()
2594 trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2595 trans->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2599 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2601 t->dscp = params->spp_dscp & in sctp_apply_peer_addr_params()
2603 t->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2605 asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2606 asoc->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2608 sp->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2609 sp->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2622 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_peer_addr_params() local
2628 if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) in sctp_setsockopt_peer_addr_params()
2629 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2631 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2635 hb_change = params->spp_flags & SPP_HB; in sctp_setsockopt_peer_addr_params()
2636 pmtud_change = params->spp_flags & SPP_PMTUD; in sctp_setsockopt_peer_addr_params()
2637 sackdelay_change = params->spp_flags & SPP_SACKDELAY; in sctp_setsockopt_peer_addr_params()
2642 params->spp_sackdelay > 500 || in sctp_setsockopt_peer_addr_params()
2643 (params->spp_pathmtu && in sctp_setsockopt_peer_addr_params()
2644 params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) in sctp_setsockopt_peer_addr_params()
2645 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2650 if (!sctp_is_any(sk, (union sctp_addr *)&params->spp_address)) { in sctp_setsockopt_peer_addr_params()
2651 trans = sctp_addr_id2transport(sk, &params->spp_address, in sctp_setsockopt_peer_addr_params()
2652 params->spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2654 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2661 asoc = sctp_id2assoc(sk, params->spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2662 if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_peer_addr_params()
2664 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2669 if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc) in sctp_setsockopt_peer_addr_params()
2670 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2673 error = sctp_apply_peer_addr_params(params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2684 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_peer_addr_params()
2686 sctp_apply_peer_addr_params(params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2710 if (params->sack_delay) { in sctp_apply_asoc_delayed_ack()
2711 asoc->sackdelay = msecs_to_jiffies(params->sack_delay); in sctp_apply_asoc_delayed_ack()
2712 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2713 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2715 if (params->sack_freq == 1) { in sctp_apply_asoc_delayed_ack()
2716 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2717 sctp_spp_sackdelay_disable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2718 } else if (params->sack_freq > 1) { in sctp_apply_asoc_delayed_ack()
2719 asoc->sackfreq = params->sack_freq; in sctp_apply_asoc_delayed_ack()
2720 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2721 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2724 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_apply_asoc_delayed_ack()
2726 if (params->sack_delay) { in sctp_apply_asoc_delayed_ack()
2727 trans->sackdelay = msecs_to_jiffies(params->sack_delay); in sctp_apply_asoc_delayed_ack()
2728 trans->param_flags = in sctp_apply_asoc_delayed_ack()
2729 sctp_spp_sackdelay_enable(trans->param_flags); in sctp_apply_asoc_delayed_ack()
2731 if (params->sack_freq == 1) { in sctp_apply_asoc_delayed_ack()
2732 trans->param_flags = in sctp_apply_asoc_delayed_ack()
2733 sctp_spp_sackdelay_disable(trans->param_flags); in sctp_apply_asoc_delayed_ack()
2734 } else if (params->sack_freq > 1) { in sctp_apply_asoc_delayed_ack()
2735 trans->sackfreq = params->sack_freq; in sctp_apply_asoc_delayed_ack()
2736 trans->param_flags = in sctp_apply_asoc_delayed_ack()
2737 sctp_spp_sackdelay_enable(trans->param_flags); in sctp_apply_asoc_delayed_ack()
2750 * values. If the assoc_id field is non-zero, then the set or get
2762 * sack_assoc_id - This parameter, indicates which association the user
2767 * sack_delay - This parameter contains the number of milliseconds that
2772 * sack_freq - This parameter contains the number of packets that must
2780 struct sctp_sock *sp = sctp_sk(sk); in __sctp_setsockopt_delayed_ack() local
2784 if (params->sack_delay > 500) in __sctp_setsockopt_delayed_ack()
2785 return -EINVAL; in __sctp_setsockopt_delayed_ack()
2791 asoc = sctp_id2assoc(sk, params->sack_assoc_id); in __sctp_setsockopt_delayed_ack()
2792 if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC && in __sctp_setsockopt_delayed_ack()
2794 return -EINVAL; in __sctp_setsockopt_delayed_ack()
2803 params->sack_assoc_id = SCTP_FUTURE_ASSOC; in __sctp_setsockopt_delayed_ack()
2805 if (params->sack_assoc_id == SCTP_FUTURE_ASSOC || in __sctp_setsockopt_delayed_ack()
2806 params->sack_assoc_id == SCTP_ALL_ASSOC) { in __sctp_setsockopt_delayed_ack()
2807 if (params->sack_delay) { in __sctp_setsockopt_delayed_ack()
2808 sp->sackdelay = params->sack_delay; in __sctp_setsockopt_delayed_ack()
2809 sp->param_flags = in __sctp_setsockopt_delayed_ack()
2810 sctp_spp_sackdelay_enable(sp->param_flags); in __sctp_setsockopt_delayed_ack()
2812 if (params->sack_freq == 1) { in __sctp_setsockopt_delayed_ack()
2813 sp->param_flags = in __sctp_setsockopt_delayed_ack()
2814 sctp_spp_sackdelay_disable(sp->param_flags); in __sctp_setsockopt_delayed_ack()
2815 } else if (params->sack_freq > 1) { in __sctp_setsockopt_delayed_ack()
2816 sp->sackfreq = params->sack_freq; in __sctp_setsockopt_delayed_ack()
2817 sp->param_flags = in __sctp_setsockopt_delayed_ack()
2818 sctp_spp_sackdelay_enable(sp->param_flags); in __sctp_setsockopt_delayed_ack()
2822 if (params->sack_assoc_id == SCTP_CURRENT_ASSOC || in __sctp_setsockopt_delayed_ack()
2823 params->sack_assoc_id == SCTP_ALL_ASSOC) in __sctp_setsockopt_delayed_ack()
2824 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in __sctp_setsockopt_delayed_ack()
2842 current->comm, task_pid_nr(current)); in sctp_setsockopt_delayed_ack()
2844 p.sack_assoc_id = v->assoc_id; in sctp_setsockopt_delayed_ack()
2845 p.sack_delay = v->assoc_value; in sctp_setsockopt_delayed_ack()
2846 p.sack_freq = v->assoc_value ? 0 : 1; in sctp_setsockopt_delayed_ack()
2851 return -EINVAL; in sctp_setsockopt_delayed_ack()
2852 if (params->sack_delay == 0 && params->sack_freq == 0) in sctp_setsockopt_delayed_ack()
2864 * socket (for UDP-style sockets only future associations are effected
2865 * by the change). With TCP-style sockets, this option is inherited by
2871 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_initmsg() local
2874 return -EINVAL; in sctp_setsockopt_initmsg()
2876 if (sinit->sinit_num_ostreams) in sctp_setsockopt_initmsg()
2877 sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams; in sctp_setsockopt_initmsg()
2878 if (sinit->sinit_max_instreams) in sctp_setsockopt_initmsg()
2879 sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams; in sctp_setsockopt_initmsg()
2880 if (sinit->sinit_max_attempts) in sctp_setsockopt_initmsg()
2881 sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts; in sctp_setsockopt_initmsg()
2882 if (sinit->sinit_max_init_timeo) in sctp_setsockopt_initmsg()
2883 sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo; in sctp_setsockopt_initmsg()
2906 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_send_param() local
2910 return -EINVAL; in sctp_setsockopt_default_send_param()
2911 if (info->sinfo_flags & in sctp_setsockopt_default_send_param()
2914 return -EINVAL; in sctp_setsockopt_default_send_param()
2916 asoc = sctp_id2assoc(sk, info->sinfo_assoc_id); in sctp_setsockopt_default_send_param()
2917 if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_send_param()
2919 return -EINVAL; in sctp_setsockopt_default_send_param()
2922 asoc->default_stream = info->sinfo_stream; in sctp_setsockopt_default_send_param()
2923 asoc->default_flags = info->sinfo_flags; in sctp_setsockopt_default_send_param()
2924 asoc->default_ppid = info->sinfo_ppid; in sctp_setsockopt_default_send_param()
2925 asoc->default_context = info->sinfo_context; in sctp_setsockopt_default_send_param()
2926 asoc->default_timetolive = info->sinfo_timetolive; in sctp_setsockopt_default_send_param()
2932 info->sinfo_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_default_send_param()
2934 if (info->sinfo_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_default_send_param()
2935 info->sinfo_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_send_param()
2936 sp->default_stream = info->sinfo_stream; in sctp_setsockopt_default_send_param()
2937 sp->default_flags = info->sinfo_flags; in sctp_setsockopt_default_send_param()
2938 sp->default_ppid = info->sinfo_ppid; in sctp_setsockopt_default_send_param()
2939 sp->default_context = info->sinfo_context; in sctp_setsockopt_default_send_param()
2940 sp->default_timetolive = info->sinfo_timetolive; in sctp_setsockopt_default_send_param()
2943 if (info->sinfo_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_default_send_param()
2944 info->sinfo_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_send_param()
2945 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_send_param()
2946 asoc->default_stream = info->sinfo_stream; in sctp_setsockopt_default_send_param()
2947 asoc->default_flags = info->sinfo_flags; in sctp_setsockopt_default_send_param()
2948 asoc->default_ppid = info->sinfo_ppid; in sctp_setsockopt_default_send_param()
2949 asoc->default_context = info->sinfo_context; in sctp_setsockopt_default_send_param()
2950 asoc->default_timetolive = info->sinfo_timetolive; in sctp_setsockopt_default_send_param()
2964 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_sndinfo() local
2968 return -EINVAL; in sctp_setsockopt_default_sndinfo()
2969 if (info->snd_flags & in sctp_setsockopt_default_sndinfo()
2972 return -EINVAL; in sctp_setsockopt_default_sndinfo()
2974 asoc = sctp_id2assoc(sk, info->snd_assoc_id); in sctp_setsockopt_default_sndinfo()
2975 if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_sndinfo()
2977 return -EINVAL; in sctp_setsockopt_default_sndinfo()
2980 asoc->default_stream = info->snd_sid; in sctp_setsockopt_default_sndinfo()
2981 asoc->default_flags = info->snd_flags; in sctp_setsockopt_default_sndinfo()
2982 asoc->default_ppid = info->snd_ppid; in sctp_setsockopt_default_sndinfo()
2983 asoc->default_context = info->snd_context; in sctp_setsockopt_default_sndinfo()
2989 info->snd_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_default_sndinfo()
2991 if (info->snd_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_default_sndinfo()
2992 info->snd_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_sndinfo()
2993 sp->default_stream = info->snd_sid; in sctp_setsockopt_default_sndinfo()
2994 sp->default_flags = info->snd_flags; in sctp_setsockopt_default_sndinfo()
2995 sp->default_ppid = info->snd_ppid; in sctp_setsockopt_default_sndinfo()
2996 sp->default_context = info->snd_context; in sctp_setsockopt_default_sndinfo()
2999 if (info->snd_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_default_sndinfo()
3000 info->snd_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_sndinfo()
3001 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_sndinfo()
3002 asoc->default_stream = info->snd_sid; in sctp_setsockopt_default_sndinfo()
3003 asoc->default_flags = info->snd_flags; in sctp_setsockopt_default_sndinfo()
3004 asoc->default_ppid = info->snd_ppid; in sctp_setsockopt_default_sndinfo()
3005 asoc->default_context = info->snd_context; in sctp_setsockopt_default_sndinfo()
3026 return -EINVAL; in sctp_setsockopt_primary_addr()
3029 af = sctp_get_af_specific(prim->ssp_addr.ss_family); in sctp_setsockopt_primary_addr()
3031 return -EINVAL; in sctp_setsockopt_primary_addr()
3034 (struct sockaddr *)&prim->ssp_addr, in sctp_setsockopt_primary_addr()
3035 af->sockaddr_len); in sctp_setsockopt_primary_addr()
3039 trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id); in sctp_setsockopt_primary_addr()
3041 return -EINVAL; in sctp_setsockopt_primary_addr()
3043 sctp_assoc_set_primary(trans->asoc, trans); in sctp_setsockopt_primary_addr()
3051 * Turn on/off any Nagle-like algorithm. This means that packets are
3060 return -EINVAL; in sctp_setsockopt_nodelay()
3061 sctp_sk(sk)->nodelay = (*val == 0) ? 0 : 1; in sctp_setsockopt_nodelay()
3083 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_rtoinfo() local
3086 return -EINVAL; in sctp_setsockopt_rtoinfo()
3088 asoc = sctp_id2assoc(sk, rtoinfo->srto_assoc_id); in sctp_setsockopt_rtoinfo()
3091 if (!asoc && rtoinfo->srto_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_rtoinfo()
3093 return -EINVAL; in sctp_setsockopt_rtoinfo()
3095 rto_max = rtoinfo->srto_max; in sctp_setsockopt_rtoinfo()
3096 rto_min = rtoinfo->srto_min; in sctp_setsockopt_rtoinfo()
3101 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max; in sctp_setsockopt_rtoinfo()
3106 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min; in sctp_setsockopt_rtoinfo()
3109 return -EINVAL; in sctp_setsockopt_rtoinfo()
3112 if (rtoinfo->srto_initial != 0) in sctp_setsockopt_rtoinfo()
3113 asoc->rto_initial = in sctp_setsockopt_rtoinfo()
3114 msecs_to_jiffies(rtoinfo->srto_initial); in sctp_setsockopt_rtoinfo()
3115 asoc->rto_max = rto_max; in sctp_setsockopt_rtoinfo()
3116 asoc->rto_min = rto_min; in sctp_setsockopt_rtoinfo()
3118 /* If there is no association or the association-id = 0 in sctp_setsockopt_rtoinfo()
3121 if (rtoinfo->srto_initial != 0) in sctp_setsockopt_rtoinfo()
3122 sp->rtoinfo.srto_initial = rtoinfo->srto_initial; in sctp_setsockopt_rtoinfo()
3123 sp->rtoinfo.srto_max = rto_max; in sctp_setsockopt_rtoinfo()
3124 sp->rtoinfo.srto_min = rto_min; in sctp_setsockopt_rtoinfo()
3149 return -EINVAL; in sctp_setsockopt_associnfo()
3151 asoc = sctp_id2assoc(sk, assocparams->sasoc_assoc_id); in sctp_setsockopt_associnfo()
3153 if (!asoc && assocparams->sasoc_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_associnfo()
3155 return -EINVAL; in sctp_setsockopt_associnfo()
3159 if (assocparams->sasoc_asocmaxrxt != 0) { in sctp_setsockopt_associnfo()
3164 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list, in sctp_setsockopt_associnfo()
3166 path_sum += peer_addr->pathmaxrxt; in sctp_setsockopt_associnfo()
3176 assocparams->sasoc_asocmaxrxt > path_sum) in sctp_setsockopt_associnfo()
3177 return -EINVAL; in sctp_setsockopt_associnfo()
3179 asoc->max_retrans = assocparams->sasoc_asocmaxrxt; in sctp_setsockopt_associnfo()
3182 if (assocparams->sasoc_cookie_life != 0) in sctp_setsockopt_associnfo()
3183 asoc->cookie_life = in sctp_setsockopt_associnfo()
3184 ms_to_ktime(assocparams->sasoc_cookie_life); in sctp_setsockopt_associnfo()
3187 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_associnfo() local
3189 if (assocparams->sasoc_asocmaxrxt != 0) in sctp_setsockopt_associnfo()
3190 sp->assocparams.sasoc_asocmaxrxt = in sctp_setsockopt_associnfo()
3191 assocparams->sasoc_asocmaxrxt; in sctp_setsockopt_associnfo()
3192 if (assocparams->sasoc_cookie_life != 0) in sctp_setsockopt_associnfo()
3193 sp->assocparams.sasoc_cookie_life = in sctp_setsockopt_associnfo()
3194 assocparams->sasoc_cookie_life; in sctp_setsockopt_associnfo()
3212 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_mappedv4() local
3215 return -EINVAL; in sctp_setsockopt_mappedv4()
3217 sp->v4mapped = 1; in sctp_setsockopt_mappedv4()
3219 sp->v4mapped = 0; in sctp_setsockopt_mappedv4()
3244 * assoc_id: This parameter is ignored for one-to-one style sockets.
3245 * For one-to-many style sockets this parameter indicates which
3255 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_maxseg() local
3265 current->comm, task_pid_nr(current)); in sctp_setsockopt_maxseg()
3269 assoc_id = params->assoc_id; in sctp_setsockopt_maxseg()
3270 val = params->assoc_value; in sctp_setsockopt_maxseg()
3272 return -EINVAL; in sctp_setsockopt_maxseg()
3278 return -EINVAL; in sctp_setsockopt_maxseg()
3282 __u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) : in sctp_setsockopt_maxseg()
3285 min_len = sctp_min_frag_point(sp, datasize); in sctp_setsockopt_maxseg()
3286 max_len = SCTP_MAX_CHUNK_LEN - datasize; in sctp_setsockopt_maxseg()
3289 return -EINVAL; in sctp_setsockopt_maxseg()
3293 asoc->user_frag = val; in sctp_setsockopt_maxseg()
3296 sp->user_frag = val; in sctp_setsockopt_maxseg()
3315 struct sctp_sock *sp; in sctp_setsockopt_peer_primary_addr() local
3321 sp = sctp_sk(sk); in sctp_setsockopt_peer_primary_addr()
3323 if (!sp->ep->asconf_enable) in sctp_setsockopt_peer_primary_addr()
3324 return -EPERM; in sctp_setsockopt_peer_primary_addr()
3327 return -EINVAL; in sctp_setsockopt_peer_primary_addr()
3329 asoc = sctp_id2assoc(sk, prim->sspp_assoc_id); in sctp_setsockopt_peer_primary_addr()
3331 return -EINVAL; in sctp_setsockopt_peer_primary_addr()
3333 if (!asoc->peer.asconf_capable) in sctp_setsockopt_peer_primary_addr()
3334 return -EPERM; in sctp_setsockopt_peer_primary_addr()
3336 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY) in sctp_setsockopt_peer_primary_addr()
3337 return -EPERM; in sctp_setsockopt_peer_primary_addr()
3340 return -ENOTCONN; in sctp_setsockopt_peer_primary_addr()
3342 af = sctp_get_af_specific(prim->sspp_addr.ss_family); in sctp_setsockopt_peer_primary_addr()
3344 return -EINVAL; in sctp_setsockopt_peer_primary_addr()
3346 if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL)) in sctp_setsockopt_peer_primary_addr()
3347 return -EADDRNOTAVAIL; in sctp_setsockopt_peer_primary_addr()
3349 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr)) in sctp_setsockopt_peer_primary_addr()
3350 return -EADDRNOTAVAIL; in sctp_setsockopt_peer_primary_addr()
3354 (struct sockaddr *)&prim->sspp_addr, in sctp_setsockopt_peer_primary_addr()
3355 af->sockaddr_len); in sctp_setsockopt_peer_primary_addr()
3361 (union sctp_addr *)&prim->sspp_addr); in sctp_setsockopt_peer_primary_addr()
3363 return -ENOMEM; in sctp_setsockopt_peer_primary_addr()
3377 return -EINVAL; in sctp_setsockopt_adaptation_layer()
3379 sctp_sk(sk)->adaptation_ind = adapt->ssb_adaptation_ind; in sctp_setsockopt_adaptation_layer()
3392 * one-2-many model for an application to keep some reference to an
3402 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_context() local
3406 return -EINVAL; in sctp_setsockopt_context()
3408 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_context()
3409 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_context()
3411 return -EINVAL; in sctp_setsockopt_context()
3414 asoc->default_rcv_context = params->assoc_value; in sctp_setsockopt_context()
3420 params->assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_context()
3422 if (params->assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_context()
3423 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_context()
3424 sp->default_rcv_context = params->assoc_value; in sctp_setsockopt_context()
3426 if (params->assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_context()
3427 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_context()
3428 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_context()
3429 asoc->default_rcv_context = params->assoc_value; in sctp_setsockopt_context()
3449 * This option takes a boolean value. A non-zero value indicates that
3462 return -EINVAL; in sctp_setsockopt_fragment_interleave()
3464 sctp_sk(sk)->frag_interleave = !!*val; in sctp_setsockopt_fragment_interleave()
3466 if (!sctp_sk(sk)->frag_interleave) in sctp_setsockopt_fragment_interleave()
3467 sctp_sk(sk)->ep->intl_enable = 0; in sctp_setsockopt_fragment_interleave()
3493 return -EINVAL; in sctp_setsockopt_partial_delivery_point()
3498 if (*val > (sk->sk_rcvbuf >> 1)) in sctp_setsockopt_partial_delivery_point()
3499 return -EINVAL; in sctp_setsockopt_partial_delivery_point()
3501 sctp_sk(sk)->pd_point = *val; in sctp_setsockopt_partial_delivery_point()
3521 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_maxburst() local
3531 current->comm, task_pid_nr(current)); in sctp_setsockopt_maxburst()
3535 assoc_id = params->assoc_id; in sctp_setsockopt_maxburst()
3536 assoc_value = params->assoc_value; in sctp_setsockopt_maxburst()
3538 return -EINVAL; in sctp_setsockopt_maxburst()
3542 return -EINVAL; in sctp_setsockopt_maxburst()
3545 asoc->max_burst = assoc_value; in sctp_setsockopt_maxburst()
3554 sp->max_burst = assoc_value; in sctp_setsockopt_maxburst()
3557 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_maxburst()
3558 asoc->max_burst = assoc_value; in sctp_setsockopt_maxburst()
3574 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_chunk()
3576 if (!ep->auth_enable) in sctp_setsockopt_auth_chunk()
3577 return -EACCES; in sctp_setsockopt_auth_chunk()
3580 return -EINVAL; in sctp_setsockopt_auth_chunk()
3582 switch (val->sauth_chunk) { in sctp_setsockopt_auth_chunk()
3587 return -EINVAL; in sctp_setsockopt_auth_chunk()
3591 return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk); in sctp_setsockopt_auth_chunk()
3604 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_hmac_ident()
3607 if (!ep->auth_enable) in sctp_setsockopt_hmac_ident()
3608 return -EACCES; in sctp_setsockopt_hmac_ident()
3611 return -EINVAL; in sctp_setsockopt_hmac_ident()
3615 idents = hmacs->shmac_num_idents; in sctp_setsockopt_hmac_ident()
3617 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) in sctp_setsockopt_hmac_ident()
3618 return -EINVAL; in sctp_setsockopt_hmac_ident()
3633 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_key()
3635 int ret = -EINVAL; in sctp_setsockopt_auth_key()
3638 return -EINVAL; in sctp_setsockopt_auth_key()
3639 /* authkey->sca_keylength is u16, so optlen can't be bigger than in sctp_setsockopt_auth_key()
3644 if (authkey->sca_keylength > optlen - sizeof(*authkey)) in sctp_setsockopt_auth_key()
3647 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); in sctp_setsockopt_auth_key()
3648 if (!asoc && authkey->sca_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_auth_key()
3658 authkey->sca_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_auth_key()
3660 if (authkey->sca_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_auth_key()
3661 authkey->sca_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_auth_key()
3669 if (authkey->sca_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_auth_key()
3670 authkey->sca_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_auth_key()
3671 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_auth_key()
3694 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_active_key()
3699 return -EINVAL; in sctp_setsockopt_active_key()
3701 asoc = sctp_id2assoc(sk, val->scact_assoc_id); in sctp_setsockopt_active_key()
3702 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_active_key()
3704 return -EINVAL; in sctp_setsockopt_active_key()
3707 return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); in sctp_setsockopt_active_key()
3710 val->scact_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_active_key()
3712 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_active_key()
3713 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_active_key()
3714 ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); in sctp_setsockopt_active_key()
3719 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_active_key()
3720 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_active_key()
3721 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_active_key()
3723 val->scact_keynumber); in sctp_setsockopt_active_key()
3742 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_del_key()
3747 return -EINVAL; in sctp_setsockopt_del_key()
3749 asoc = sctp_id2assoc(sk, val->scact_assoc_id); in sctp_setsockopt_del_key()
3750 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_del_key()
3752 return -EINVAL; in sctp_setsockopt_del_key()
3755 return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_del_key()
3758 val->scact_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_del_key()
3760 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_del_key()
3761 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_del_key()
3762 ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_del_key()
3767 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_del_key()
3768 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_del_key()
3769 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_del_key()
3771 val->scact_keynumber); in sctp_setsockopt_del_key()
3790 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_deactivate_key()
3795 return -EINVAL; in sctp_setsockopt_deactivate_key()
3797 asoc = sctp_id2assoc(sk, val->scact_assoc_id); in sctp_setsockopt_deactivate_key()
3798 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_deactivate_key()
3800 return -EINVAL; in sctp_setsockopt_deactivate_key()
3803 return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_deactivate_key()
3806 val->scact_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_deactivate_key()
3808 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_deactivate_key()
3809 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_deactivate_key()
3810 ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_deactivate_key()
3815 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_deactivate_key()
3816 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_deactivate_key()
3817 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_deactivate_key()
3819 val->scact_keynumber); in sctp_setsockopt_deactivate_key()
3838 * This option expects an integer boolean flag, where a non-zero value turns on
3846 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_auto_asconf() local
3849 return -EINVAL; in sctp_setsockopt_auto_asconf()
3851 return -EINVAL; in sctp_setsockopt_auto_asconf()
3852 if ((*val && sp->do_auto_asconf) || (!*val && !sp->do_auto_asconf)) in sctp_setsockopt_auto_asconf()
3855 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3856 if (*val == 0 && sp->do_auto_asconf) { in sctp_setsockopt_auto_asconf()
3857 list_del(&sp->auto_asconf_list); in sctp_setsockopt_auto_asconf()
3858 sp->do_auto_asconf = 0; in sctp_setsockopt_auto_asconf()
3859 } else if (*val && !sp->do_auto_asconf) { in sctp_setsockopt_auto_asconf()
3860 list_add_tail(&sp->auto_asconf_list, in sctp_setsockopt_auto_asconf()
3861 &sock_net(sk)->sctp.auto_asconf_splist); in sctp_setsockopt_auto_asconf()
3862 sp->do_auto_asconf = 1; in sctp_setsockopt_auto_asconf()
3864 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3873 * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
3885 return -EINVAL; in sctp_setsockopt_paddr_thresholds()
3887 if (v2 && val->spt_pathpfthld > val->spt_pathcpthld) in sctp_setsockopt_paddr_thresholds()
3888 return -EINVAL; in sctp_setsockopt_paddr_thresholds()
3890 if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) { in sctp_setsockopt_paddr_thresholds()
3891 trans = sctp_addr_id2transport(sk, &val->spt_address, in sctp_setsockopt_paddr_thresholds()
3892 val->spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3894 return -ENOENT; in sctp_setsockopt_paddr_thresholds()
3896 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3897 trans->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3899 trans->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3900 trans->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3905 asoc = sctp_id2assoc(sk, val->spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3906 if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_paddr_thresholds()
3908 return -EINVAL; in sctp_setsockopt_paddr_thresholds()
3911 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_paddr_thresholds()
3913 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3914 trans->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3916 trans->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3917 trans->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3920 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3921 asoc->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3923 asoc->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3924 asoc->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3926 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_paddr_thresholds() local
3928 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3929 sp->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3931 sp->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3932 sp->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3942 return -EINVAL; in sctp_setsockopt_recvrcvinfo()
3944 sctp_sk(sk)->recvrcvinfo = (*val == 0) ? 0 : 1; in sctp_setsockopt_recvrcvinfo()
3953 return -EINVAL; in sctp_setsockopt_recvnxtinfo()
3955 sctp_sk(sk)->recvnxtinfo = (*val == 0) ? 0 : 1; in sctp_setsockopt_recvnxtinfo()
3967 return -EINVAL; in sctp_setsockopt_pr_supported()
3969 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_pr_supported()
3970 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_pr_supported()
3972 return -EINVAL; in sctp_setsockopt_pr_supported()
3974 sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value; in sctp_setsockopt_pr_supported()
3983 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_prinfo() local
3985 int retval = -EINVAL; in sctp_setsockopt_default_prinfo()
3990 if (info->pr_policy & ~SCTP_PR_SCTP_MASK) in sctp_setsockopt_default_prinfo()
3993 if (info->pr_policy == SCTP_PR_SCTP_NONE) in sctp_setsockopt_default_prinfo()
3994 info->pr_value = 0; in sctp_setsockopt_default_prinfo()
3996 asoc = sctp_id2assoc(sk, info->pr_assoc_id); in sctp_setsockopt_default_prinfo()
3997 if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_prinfo()
4004 SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); in sctp_setsockopt_default_prinfo()
4005 asoc->default_timetolive = info->pr_value; in sctp_setsockopt_default_prinfo()
4010 info->pr_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_default_prinfo()
4012 if (info->pr_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_default_prinfo()
4013 info->pr_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_prinfo()
4014 SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy); in sctp_setsockopt_default_prinfo()
4015 sp->default_timetolive = info->pr_value; in sctp_setsockopt_default_prinfo()
4018 if (info->pr_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_default_prinfo()
4019 info->pr_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_prinfo()
4020 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_prinfo()
4021 SCTP_PR_SET_POLICY(asoc->default_flags, in sctp_setsockopt_default_prinfo()
4022 info->pr_policy); in sctp_setsockopt_default_prinfo()
4023 asoc->default_timetolive = info->pr_value; in sctp_setsockopt_default_prinfo()
4036 int retval = -EINVAL; in sctp_setsockopt_reconfig_supported()
4041 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_reconfig_supported()
4042 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_reconfig_supported()
4046 sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value; in sctp_setsockopt_reconfig_supported()
4058 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_enable_strreset()
4060 int retval = -EINVAL; in sctp_setsockopt_enable_strreset()
4065 if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) in sctp_setsockopt_enable_strreset()
4068 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_enable_strreset()
4069 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_enable_strreset()
4076 asoc->strreset_enable = params->assoc_value; in sctp_setsockopt_enable_strreset()
4081 params->assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_enable_strreset()
4083 if (params->assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_enable_strreset()
4084 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_enable_strreset()
4085 ep->strreset_enable = params->assoc_value; in sctp_setsockopt_enable_strreset()
4087 if (params->assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_enable_strreset()
4088 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_enable_strreset()
4089 list_for_each_entry(asoc, &ep->asocs, asocs) in sctp_setsockopt_enable_strreset()
4090 asoc->strreset_enable = params->assoc_value; in sctp_setsockopt_enable_strreset()
4103 return -EINVAL; in sctp_setsockopt_reset_streams()
4108 if (params->srs_number_streams * sizeof(__u16) > in sctp_setsockopt_reset_streams()
4109 optlen - sizeof(*params)) in sctp_setsockopt_reset_streams()
4110 return -EINVAL; in sctp_setsockopt_reset_streams()
4112 asoc = sctp_id2assoc(sk, params->srs_assoc_id); in sctp_setsockopt_reset_streams()
4114 return -EINVAL; in sctp_setsockopt_reset_streams()
4125 return -EINVAL; in sctp_setsockopt_reset_assoc()
4129 return -EINVAL; in sctp_setsockopt_reset_assoc()
4141 return -EINVAL; in sctp_setsockopt_add_streams()
4143 asoc = sctp_id2assoc(sk, params->sas_assoc_id); in sctp_setsockopt_add_streams()
4145 return -EINVAL; in sctp_setsockopt_add_streams()
4154 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_scheduler() local
4159 return -EINVAL; in sctp_setsockopt_scheduler()
4161 if (params->assoc_value > SCTP_SS_MAX) in sctp_setsockopt_scheduler()
4162 return -EINVAL; in sctp_setsockopt_scheduler()
4164 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_scheduler()
4165 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_scheduler()
4167 return -EINVAL; in sctp_setsockopt_scheduler()
4170 return sctp_sched_set_sched(asoc, params->assoc_value); in sctp_setsockopt_scheduler()
4173 params->assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_scheduler()
4175 if (params->assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_scheduler()
4176 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_scheduler()
4177 sp->default_ss = params->assoc_value; in sctp_setsockopt_scheduler()
4179 if (params->assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_scheduler()
4180 params->assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_scheduler()
4181 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_scheduler()
4183 params->assoc_value); in sctp_setsockopt_scheduler()
4198 int retval = -EINVAL; in sctp_setsockopt_scheduler_value()
4203 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_scheduler_value()
4204 if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC && in sctp_setsockopt_scheduler_value()
4209 retval = sctp_sched_set_value(asoc, params->stream_id, in sctp_setsockopt_scheduler_value()
4210 params->stream_value, GFP_KERNEL); in sctp_setsockopt_scheduler_value()
4216 list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) { in sctp_setsockopt_scheduler_value()
4217 int ret = sctp_sched_set_value(asoc, params->stream_id, in sctp_setsockopt_scheduler_value()
4218 params->stream_value, in sctp_setsockopt_scheduler_value()
4232 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_interleaving_supported() local
4236 return -EINVAL; in sctp_setsockopt_interleaving_supported()
4238 asoc = sctp_id2assoc(sk, p->assoc_id); in sctp_setsockopt_interleaving_supported()
4239 if (!asoc && p->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) in sctp_setsockopt_interleaving_supported()
4240 return -EINVAL; in sctp_setsockopt_interleaving_supported()
4242 if (!sock_net(sk)->sctp.intl_enable || !sp->frag_interleave) { in sctp_setsockopt_interleaving_supported()
4243 return -EPERM; in sctp_setsockopt_interleaving_supported()
4246 sp->ep->intl_enable = !!p->assoc_value; in sctp_setsockopt_interleaving_supported()
4254 return -EOPNOTSUPP; in sctp_setsockopt_reuse_port()
4256 if (sctp_sk(sk)->ep->base.bind_addr.port) in sctp_setsockopt_reuse_port()
4257 return -EFAULT; in sctp_setsockopt_reuse_port()
4260 return -EINVAL; in sctp_setsockopt_reuse_port()
4262 sctp_sk(sk)->reuse = !!*val; in sctp_setsockopt_reuse_port()
4272 sctp_ulpevent_type_set(&asoc->subscribe, param->se_type, param->se_on); in sctp_assoc_ulpevent_type_set()
4274 if (param->se_type == SCTP_SENDER_DRY_EVENT && param->se_on) { in sctp_assoc_ulpevent_type_set()
4275 if (sctp_outq_is_empty(&asoc->outqueue)) { in sctp_assoc_ulpevent_type_set()
4279 return -ENOMEM; in sctp_assoc_ulpevent_type_set()
4281 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_assoc_ulpevent_type_set()
4291 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_event() local
4296 return -EINVAL; in sctp_setsockopt_event()
4298 if (param->se_type < SCTP_SN_TYPE_BASE || in sctp_setsockopt_event()
4299 param->se_type > SCTP_SN_TYPE_MAX) in sctp_setsockopt_event()
4300 return -EINVAL; in sctp_setsockopt_event()
4302 asoc = sctp_id2assoc(sk, param->se_assoc_id); in sctp_setsockopt_event()
4303 if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_event()
4305 return -EINVAL; in sctp_setsockopt_event()
4311 param->se_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_event()
4313 if (param->se_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_event()
4314 param->se_assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_event()
4315 sctp_ulpevent_type_set(&sp->subscribe, in sctp_setsockopt_event()
4316 param->se_type, param->se_on); in sctp_setsockopt_event()
4318 if (param->se_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_event()
4319 param->se_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_event()
4320 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_event()
4337 int retval = -EINVAL; in sctp_setsockopt_asconf_supported()
4342 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_asconf_supported()
4343 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_asconf_supported()
4347 ep = sctp_sk(sk)->ep; in sctp_setsockopt_asconf_supported()
4348 ep->asconf_enable = !!params->assoc_value; in sctp_setsockopt_asconf_supported()
4350 if (ep->asconf_enable && ep->auth_enable) { in sctp_setsockopt_asconf_supported()
4367 int retval = -EINVAL; in sctp_setsockopt_auth_supported()
4372 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_auth_supported()
4373 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_auth_supported()
4377 ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_supported()
4378 if (params->assoc_value) { in sctp_setsockopt_auth_supported()
4382 if (ep->asconf_enable) { in sctp_setsockopt_auth_supported()
4388 ep->auth_enable = !!params->assoc_value; in sctp_setsockopt_auth_supported()
4400 int retval = -EINVAL; in sctp_setsockopt_ecn_supported()
4405 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_ecn_supported()
4406 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_ecn_supported()
4410 sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value; in sctp_setsockopt_ecn_supported()
4422 int retval = -EINVAL; in sctp_setsockopt_pf_expose()
4427 if (params->assoc_value > SCTP_PF_EXPOSE_MAX) in sctp_setsockopt_pf_expose()
4430 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_pf_expose()
4431 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_pf_expose()
4436 asoc->pf_expose = params->assoc_value; in sctp_setsockopt_pf_expose()
4438 sctp_sk(sk)->pf_expose = params->assoc_value; in sctp_setsockopt_pf_expose()
4454 return -EINVAL; in sctp_setsockopt_encap_port()
4459 encap_port = (__force __be16)encap->sue_port; in sctp_setsockopt_encap_port()
4460 if (!sctp_is_any(sk, (union sctp_addr *)&encap->sue_address)) { in sctp_setsockopt_encap_port()
4461 t = sctp_addr_id2transport(sk, &encap->sue_address, in sctp_setsockopt_encap_port()
4462 encap->sue_assoc_id); in sctp_setsockopt_encap_port()
4464 return -EINVAL; in sctp_setsockopt_encap_port()
4466 t->encap_port = encap_port; in sctp_setsockopt_encap_port()
4474 asoc = sctp_id2assoc(sk, encap->sue_assoc_id); in sctp_setsockopt_encap_port()
4475 if (!asoc && encap->sue_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_encap_port()
4477 return -EINVAL; in sctp_setsockopt_encap_port()
4483 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_setsockopt_encap_port()
4485 t->encap_port = encap_port; in sctp_setsockopt_encap_port()
4487 asoc->encap_port = encap_port; in sctp_setsockopt_encap_port()
4491 sctp_sk(sk)->encap_port = encap_port; in sctp_setsockopt_encap_port()
4504 return -EINVAL; in sctp_setsockopt_probe_interval()
4506 probe_interval = params->spi_interval; in sctp_setsockopt_probe_interval()
4508 return -EINVAL; in sctp_setsockopt_probe_interval()
4513 if (!sctp_is_any(sk, (union sctp_addr *)&params->spi_address)) { in sctp_setsockopt_probe_interval()
4514 t = sctp_addr_id2transport(sk, &params->spi_address, in sctp_setsockopt_probe_interval()
4515 params->spi_assoc_id); in sctp_setsockopt_probe_interval()
4517 return -EINVAL; in sctp_setsockopt_probe_interval()
4519 t->probe_interval = msecs_to_jiffies(probe_interval); in sctp_setsockopt_probe_interval()
4528 asoc = sctp_id2assoc(sk, params->spi_assoc_id); in sctp_setsockopt_probe_interval()
4529 if (!asoc && params->spi_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_probe_interval()
4531 return -EINVAL; in sctp_setsockopt_probe_interval()
4537 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) { in sctp_setsockopt_probe_interval()
4538 t->probe_interval = msecs_to_jiffies(probe_interval); in sctp_setsockopt_probe_interval()
4542 asoc->probe_interval = msecs_to_jiffies(probe_interval); in sctp_setsockopt_probe_interval()
4546 sctp_sk(sk)->probe_interval = probe_interval; in sctp_setsockopt_probe_interval()
4563 * sd - the socket descript.
4564 * level - set to IPPROTO_SCTP for all SCTP options.
4565 * optname - the option name.
4566 * optval - the buffer to store the value of the option.
4567 * optlen - the size of the buffer.
4581 * are at all well-founded. in sctp_setsockopt()
4584 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_setsockopt()
4586 return af->setsockopt(sk, level, optname, optval, optlen); in sctp_setsockopt()
4780 retval = -ENOPROTOOPT; in sctp_setsockopt()
4789 /* API 3.1.6 connect() - UDP Style Syntax
4809 int err = -EINVAL; in sctp_connect()
4816 af = sctp_get_af_specific(addr->sa_family); in sctp_connect()
4817 if (af && addr_len >= af->sockaddr_len) in sctp_connect()
4818 err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL); in sctp_connect()
4827 if (addr_len < sizeof(uaddr->sa_family)) in sctp_inet_connect()
4828 return -EINVAL; in sctp_inet_connect()
4830 if (uaddr->sa_family == AF_UNSPEC) in sctp_inet_connect()
4831 return -EOPNOTSUPP; in sctp_inet_connect()
4833 return sctp_connect(sock->sk, uaddr, addr_len, flags); in sctp_inet_connect()
4839 return -EOPNOTSUPP; /* STUB */ in sctp_disconnect()
4842 /* 4.1.4 accept() - TCP Style Syntax
4851 struct sctp_sock *sp; in sctp_accept() local
4860 sp = sctp_sk(sk); in sctp_accept()
4861 ep = sp->ep; in sctp_accept()
4864 error = -EOPNOTSUPP; in sctp_accept()
4869 error = -EINVAL; in sctp_accept()
4882 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); in sctp_accept()
4884 newsk = sp->pf->create_accept_sk(sk, asoc, kern); in sctp_accept()
4886 error = -ENOMEM; in sctp_accept()
4908 int rc = -ENOTCONN; in sctp_ioctl()
4913 * SEQPACKET-style sockets in LISTENING state are valid, for in sctp_ioctl()
4914 * SCTP, so only discard TCP-style sockets in LISTENING state. in sctp_ioctl()
4924 skb = skb_peek(&sk->sk_receive_queue); in sctp_ioctl()
4930 *karg = skb->len; in sctp_ioctl()
4936 rc = -ENOIOCTLCMD; in sctp_ioctl()
4945 * initialized the SCTP-specific portion of the sock.
4946 * The sock structure should already be zero-filled memory.
4951 struct sctp_sock *sp; in sctp_init_sock() local
4955 sp = sctp_sk(sk); in sctp_init_sock()
4958 switch (sk->sk_type) { in sctp_init_sock()
4960 sp->type = SCTP_SOCKET_UDP; in sctp_init_sock()
4963 sp->type = SCTP_SOCKET_TCP; in sctp_init_sock()
4966 return -ESOCKTNOSUPPORT; in sctp_init_sock()
4969 sk->sk_gso_type = SKB_GSO_SCTP; in sctp_init_sock()
4974 sp->default_stream = 0; in sctp_init_sock()
4975 sp->default_ppid = 0; in sctp_init_sock()
4976 sp->default_flags = 0; in sctp_init_sock()
4977 sp->default_context = 0; in sctp_init_sock()
4978 sp->default_timetolive = 0; in sctp_init_sock()
4980 sp->default_rcv_context = 0; in sctp_init_sock()
4981 sp->max_burst = net->sctp.max_burst; in sctp_init_sock()
4983 sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg; in sctp_init_sock()
4989 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; in sctp_init_sock()
4990 sp->initmsg.sinit_max_instreams = sctp_max_instreams; in sctp_init_sock()
4991 sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init; in sctp_init_sock()
4992 sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max; in sctp_init_sock()
4997 sp->rtoinfo.srto_initial = net->sctp.rto_initial; in sctp_init_sock()
4998 sp->rtoinfo.srto_max = net->sctp.rto_max; in sctp_init_sock()
4999 sp->rtoinfo.srto_min = net->sctp.rto_min; in sctp_init_sock()
5004 sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association; in sctp_init_sock()
5005 sp->assocparams.sasoc_number_peer_destinations = 0; in sctp_init_sock()
5006 sp->assocparams.sasoc_peer_rwnd = 0; in sctp_init_sock()
5007 sp->assocparams.sasoc_local_rwnd = 0; in sctp_init_sock()
5008 sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life; in sctp_init_sock()
5013 sp->subscribe = 0; in sctp_init_sock()
5018 sp->hbinterval = net->sctp.hb_interval; in sctp_init_sock()
5019 sp->udp_port = htons(net->sctp.udp_port); in sctp_init_sock()
5020 sp->encap_port = htons(net->sctp.encap_port); in sctp_init_sock()
5021 sp->pathmaxrxt = net->sctp.max_retrans_path; in sctp_init_sock()
5022 sp->pf_retrans = net->sctp.pf_retrans; in sctp_init_sock()
5023 sp->ps_retrans = net->sctp.ps_retrans; in sctp_init_sock()
5024 sp->pf_expose = net->sctp.pf_expose; in sctp_init_sock()
5025 sp->pathmtu = 0; /* allow default discovery */ in sctp_init_sock()
5026 sp->sackdelay = net->sctp.sack_timeout; in sctp_init_sock()
5027 sp->sackfreq = 2; in sctp_init_sock()
5028 sp->param_flags = SPP_HB_ENABLE | in sctp_init_sock()
5031 sp->default_ss = SCTP_SS_DEFAULT; in sctp_init_sock()
5036 sp->disable_fragments = 0; in sctp_init_sock()
5039 sp->nodelay = 0; in sctp_init_sock()
5041 sp->recvrcvinfo = 0; in sctp_init_sock()
5042 sp->recvnxtinfo = 0; in sctp_init_sock()
5045 sp->v4mapped = 1; in sctp_init_sock()
5047 /* Auto-close idle associations after the configured in sctp_init_sock()
5050 * for UDP-style sockets only. in sctp_init_sock()
5052 sp->autoclose = 0; in sctp_init_sock()
5055 sp->user_frag = 0; in sctp_init_sock()
5057 sp->adaptation_ind = 0; in sctp_init_sock()
5059 sp->pf = sctp_get_pf_specific(sk->sk_family); in sctp_init_sock()
5062 atomic_set(&sp->pd_mode, 0); in sctp_init_sock()
5063 skb_queue_head_init(&sp->pd_lobby); in sctp_init_sock()
5064 sp->frag_interleave = 0; in sctp_init_sock()
5065 sp->probe_interval = net->sctp.probe_interval; in sctp_init_sock()
5069 * be useful for storing pre-connect address information. in sctp_init_sock()
5071 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL); in sctp_init_sock()
5072 if (!sp->ep) in sctp_init_sock()
5073 return -ENOMEM; in sctp_init_sock()
5075 sp->hmac = NULL; in sctp_init_sock()
5077 sk->sk_destruct = sctp_destruct_sock; in sctp_init_sock()
5082 sock_prot_inuse_add(net, sk->sk_prot, 1); in sctp_init_sock()
5088 * sock_net(sk)->sctp.addr_wq_lock held if sp->do_auto_asconf is true
5092 struct sctp_sock *sp; in sctp_destroy_sock() local
5097 sp = sctp_sk(sk); in sctp_destroy_sock()
5101 if (sp->ep == NULL) in sctp_destroy_sock()
5104 if (sp->do_auto_asconf) { in sctp_destroy_sock()
5105 sp->do_auto_asconf = 0; in sctp_destroy_sock()
5106 list_del(&sp->auto_asconf_list); in sctp_destroy_sock()
5108 sctp_endpoint_free(sp->ep); in sctp_destroy_sock()
5110 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in sctp_destroy_sock()
5116 struct sctp_sock *sp = sctp_sk(sk); in sctp_destruct_common() local
5119 crypto_free_shash(sp->hmac); in sctp_destruct_common()
5128 /* API 4.1.7 shutdown() - TCP Style Syntax
5131 * sd - the socket descriptor of the association to be closed.
5132 * how - Specifies the type of shutdown. The values are
5152 ep = sctp_sk(sk)->ep; in sctp_shutdown()
5153 if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) { in sctp_shutdown()
5157 asoc = list_entry(ep->asocs.next, in sctp_shutdown()
5172 struct sctp_sock *sp = sctp_sk(sk); in sctp_get_sctp_info() local
5174 info->sctpi_s_autoclose = sp->autoclose; in sctp_get_sctp_info()
5175 info->sctpi_s_adaptation_ind = sp->adaptation_ind; in sctp_get_sctp_info()
5176 info->sctpi_s_pd_point = sp->pd_point; in sctp_get_sctp_info()
5177 info->sctpi_s_nodelay = sp->nodelay; in sctp_get_sctp_info()
5178 info->sctpi_s_disable_fragments = sp->disable_fragments; in sctp_get_sctp_info()
5179 info->sctpi_s_v4mapped = sp->v4mapped; in sctp_get_sctp_info()
5180 info->sctpi_s_frag_interleave = sp->frag_interleave; in sctp_get_sctp_info()
5181 info->sctpi_s_type = sp->type; in sctp_get_sctp_info()
5186 info->sctpi_tag = asoc->c.my_vtag; in sctp_get_sctp_info()
5187 info->sctpi_state = asoc->state; in sctp_get_sctp_info()
5188 info->sctpi_rwnd = asoc->a_rwnd; in sctp_get_sctp_info()
5189 info->sctpi_unackdata = asoc->unack_data; in sctp_get_sctp_info()
5190 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_get_sctp_info()
5191 info->sctpi_instrms = asoc->stream.incnt; in sctp_get_sctp_info()
5192 info->sctpi_outstrms = asoc->stream.outcnt; in sctp_get_sctp_info()
5193 list_for_each(pos, &asoc->base.inqueue.in_chunk_list) in sctp_get_sctp_info()
5194 info->sctpi_inqueue++; in sctp_get_sctp_info()
5195 list_for_each(pos, &asoc->outqueue.out_chunk_list) in sctp_get_sctp_info()
5196 info->sctpi_outqueue++; in sctp_get_sctp_info()
5197 info->sctpi_overall_error = asoc->overall_error_count; in sctp_get_sctp_info()
5198 info->sctpi_max_burst = asoc->max_burst; in sctp_get_sctp_info()
5199 info->sctpi_maxseg = asoc->frag_point; in sctp_get_sctp_info()
5200 info->sctpi_peer_rwnd = asoc->peer.rwnd; in sctp_get_sctp_info()
5201 info->sctpi_peer_tag = asoc->c.peer_vtag; in sctp_get_sctp_info()
5203 mask = asoc->peer.intl_capable << 1; in sctp_get_sctp_info()
5204 mask = (mask | asoc->peer.ecn_capable) << 1; in sctp_get_sctp_info()
5205 mask = (mask | asoc->peer.ipv4_address) << 1; in sctp_get_sctp_info()
5206 mask = (mask | asoc->peer.ipv6_address) << 1; in sctp_get_sctp_info()
5207 mask = (mask | asoc->peer.reconf_capable) << 1; in sctp_get_sctp_info()
5208 mask = (mask | asoc->peer.asconf_capable) << 1; in sctp_get_sctp_info()
5209 mask = (mask | asoc->peer.prsctp_capable) << 1; in sctp_get_sctp_info()
5210 mask = (mask | asoc->peer.auth_capable); in sctp_get_sctp_info()
5211 info->sctpi_peer_capable = mask; in sctp_get_sctp_info()
5212 mask = asoc->peer.sack_needed << 1; in sctp_get_sctp_info()
5213 mask = (mask | asoc->peer.sack_generation) << 1; in sctp_get_sctp_info()
5214 mask = (mask | asoc->peer.zero_window_announced); in sctp_get_sctp_info()
5215 info->sctpi_peer_sack = mask; in sctp_get_sctp_info()
5217 info->sctpi_isacks = asoc->stats.isacks; in sctp_get_sctp_info()
5218 info->sctpi_osacks = asoc->stats.osacks; in sctp_get_sctp_info()
5219 info->sctpi_opackets = asoc->stats.opackets; in sctp_get_sctp_info()
5220 info->sctpi_ipackets = asoc->stats.ipackets; in sctp_get_sctp_info()
5221 info->sctpi_rtxchunks = asoc->stats.rtxchunks; in sctp_get_sctp_info()
5222 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns; in sctp_get_sctp_info()
5223 info->sctpi_idupchunks = asoc->stats.idupchunks; in sctp_get_sctp_info()
5224 info->sctpi_gapcnt = asoc->stats.gapcnt; in sctp_get_sctp_info()
5225 info->sctpi_ouodchunks = asoc->stats.ouodchunks; in sctp_get_sctp_info()
5226 info->sctpi_iuodchunks = asoc->stats.iuodchunks; in sctp_get_sctp_info()
5227 info->sctpi_oodchunks = asoc->stats.oodchunks; in sctp_get_sctp_info()
5228 info->sctpi_iodchunks = asoc->stats.iodchunks; in sctp_get_sctp_info()
5229 info->sctpi_octrlchunks = asoc->stats.octrlchunks; in sctp_get_sctp_info()
5230 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks; in sctp_get_sctp_info()
5232 prim = asoc->peer.primary_path; in sctp_get_sctp_info()
5233 memcpy(&info->sctpi_p_address, &prim->ipaddr, sizeof(prim->ipaddr)); in sctp_get_sctp_info()
5234 info->sctpi_p_state = prim->state; in sctp_get_sctp_info()
5235 info->sctpi_p_cwnd = prim->cwnd; in sctp_get_sctp_info()
5236 info->sctpi_p_srtt = prim->srtt; in sctp_get_sctp_info()
5237 info->sctpi_p_rto = jiffies_to_msecs(prim->rto); in sctp_get_sctp_info()
5238 info->sctpi_p_hbinterval = prim->hbinterval; in sctp_get_sctp_info()
5239 info->sctpi_p_pathmaxrxt = prim->pathmaxrxt; in sctp_get_sctp_info()
5240 info->sctpi_p_sackdelay = jiffies_to_msecs(prim->sackdelay); in sctp_get_sctp_info()
5241 info->sctpi_p_ssthresh = prim->ssthresh; in sctp_get_sctp_info()
5242 info->sctpi_p_partial_bytes_acked = prim->partial_bytes_acked; in sctp_get_sctp_info()
5243 info->sctpi_p_flight_size = prim->flight_size; in sctp_get_sctp_info()
5244 info->sctpi_p_error = prim->error_count; in sctp_get_sctp_info()
5272 if (PTR_ERR(t) == -EAGAIN) in sctp_transport_get_next()
5280 if (net_eq(t->asoc->base.net, net) && in sctp_transport_get_next()
5281 t->asoc->peer.primary_path == t) in sctp_transport_get_next()
5300 if (!--pos) in sctp_transport_get_idx()
5317 read_lock_bh(&head->lock); in sctp_for_each_endpoint()
5318 sctp_for_each_hentry(ep, &head->chain) { in sctp_for_each_endpoint()
5323 read_unlock_bh(&head->lock); in sctp_for_each_endpoint()
5336 int err = -ENOENT; in sctp_transport_lookup_process()
5344 ep = transport->asoc->ep; in sctp_transport_lookup_process()
5373 ep = tsp->asoc->ep; in sctp_transport_traverse_process()
5405 * receipt. This information is read-only.
5418 retval = -EINVAL; in sctp_getsockopt_sctp_status()
5424 retval = -EFAULT; in sctp_getsockopt_sctp_status()
5431 retval = -EINVAL; in sctp_getsockopt_sctp_status()
5435 transport = asoc->peer.primary_path; in sctp_getsockopt_sctp_status()
5439 status.sstat_rwnd = asoc->peer.rwnd; in sctp_getsockopt_sctp_status()
5440 status.sstat_unackdata = asoc->unack_data; in sctp_getsockopt_sctp_status()
5442 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_getsockopt_sctp_status()
5443 status.sstat_instrms = asoc->stream.incnt; in sctp_getsockopt_sctp_status()
5444 status.sstat_outstrms = asoc->stream.outcnt; in sctp_getsockopt_sctp_status()
5445 status.sstat_fragmentation_point = asoc->frag_point; in sctp_getsockopt_sctp_status()
5446 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_sctp_status()
5447 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr, in sctp_getsockopt_sctp_status()
5448 transport->af_specific->sockaddr_len); in sctp_getsockopt_sctp_status()
5449 /* Map ipv4 address into v4-mapped-on-v6 address. */ in sctp_getsockopt_sctp_status()
5450 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_getsockopt_sctp_status()
5452 status.sstat_primary.spinfo_state = transport->state; in sctp_getsockopt_sctp_status()
5453 status.sstat_primary.spinfo_cwnd = transport->cwnd; in sctp_getsockopt_sctp_status()
5454 status.sstat_primary.spinfo_srtt = transport->srtt; in sctp_getsockopt_sctp_status()
5455 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto); in sctp_getsockopt_sctp_status()
5456 status.sstat_primary.spinfo_mtu = transport->pathmtu; in sctp_getsockopt_sctp_status()
5462 retval = -EFAULT; in sctp_getsockopt_sctp_status()
5471 retval = -EFAULT; in sctp_getsockopt_sctp_status()
5485 * read-only.
5496 retval = -EINVAL; in sctp_getsockopt_peer_addr_info()
5502 retval = -EFAULT; in sctp_getsockopt_peer_addr_info()
5509 retval = -EINVAL; in sctp_getsockopt_peer_addr_info()
5513 if (transport->state == SCTP_PF && in sctp_getsockopt_peer_addr_info()
5514 transport->asoc->pf_expose == SCTP_PF_EXPOSE_DISABLE) { in sctp_getsockopt_peer_addr_info()
5515 retval = -EACCES; in sctp_getsockopt_peer_addr_info()
5519 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_peer_addr_info()
5520 pinfo.spinfo_state = transport->state; in sctp_getsockopt_peer_addr_info()
5521 pinfo.spinfo_cwnd = transport->cwnd; in sctp_getsockopt_peer_addr_info()
5522 pinfo.spinfo_srtt = transport->srtt; in sctp_getsockopt_peer_addr_info()
5523 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto); in sctp_getsockopt_peer_addr_info()
5524 pinfo.spinfo_mtu = transport->pathmtu; in sctp_getsockopt_peer_addr_info()
5530 retval = -EFAULT; in sctp_getsockopt_peer_addr_info()
5535 retval = -EFAULT; in sctp_getsockopt_peer_addr_info()
5556 return -EINVAL; in sctp_getsockopt_disable_fragments()
5559 val = (sctp_sk(sk)->disable_fragments == 1); in sctp_getsockopt_disable_fragments()
5561 return -EFAULT; in sctp_getsockopt_disable_fragments()
5563 return -EFAULT; in sctp_getsockopt_disable_fragments()
5580 return -EINVAL; in sctp_getsockopt_events()
5584 return -EFAULT; in sctp_getsockopt_events()
5587 sn_type[i] = sctp_ulpevent_type_enabled(sctp_sk(sk)->subscribe, in sctp_getsockopt_events()
5591 return -EFAULT; in sctp_getsockopt_events()
5598 * This socket option is applicable to the UDP-style socket only. When
5609 /* Applicable to UDP-style socket only */ in sctp_getsockopt_autoclose()
5611 return -EOPNOTSUPP; in sctp_getsockopt_autoclose()
5613 return -EINVAL; in sctp_getsockopt_autoclose()
5616 return -EFAULT; in sctp_getsockopt_autoclose()
5617 if (put_user(sctp_sk(sk)->autoclose, (int __user *)optval)) in sctp_getsockopt_autoclose()
5618 return -EFAULT; in sctp_getsockopt_autoclose()
5626 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_peeloff() local
5631 if (!net_eq(current->nsproxy->net_ns, sock_net(sk))) in sctp_do_peeloff()
5632 return -EINVAL; in sctp_do_peeloff()
5635 return -EINVAL; in sctp_do_peeloff()
5637 /* An association cannot be branched off from an already peeled-off in sctp_do_peeloff()
5641 return -EINVAL; in sctp_do_peeloff()
5644 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); in sctp_do_peeloff()
5648 sctp_copy_sock(sock->sk, sk, asoc); in sctp_do_peeloff()
5650 /* Make peeled-off sockets more like 1-1 accepted sockets. in sctp_do_peeloff()
5654 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sock->sk); in sctp_do_peeloff()
5655 sp->pf->copy_ip_options(sk, sock->sk); in sctp_do_peeloff()
5660 err = sctp_sock_migrate(sk, sock->sk, asoc, in sctp_do_peeloff()
5679 retval = sctp_do_peeloff(sk, peeloff->associd, &newsock); in sctp_getsockopt_peeloff_common()
5698 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk, in sctp_getsockopt_peeloff_common()
5701 peeloff->sd = retval; in sctp_getsockopt_peeloff_common()
5704 (*newfile)->f_flags |= O_NONBLOCK; in sctp_getsockopt_peeloff_common()
5716 return -EINVAL; in sctp_getsockopt_peeloff()
5719 return -EFAULT; in sctp_getsockopt_peeloff()
5729 return -EFAULT; in sctp_getsockopt_peeloff()
5735 return -EFAULT; in sctp_getsockopt_peeloff()
5750 return -EINVAL; in sctp_getsockopt_peeloff_flags()
5753 return -EFAULT; in sctp_getsockopt_peeloff_flags()
5764 return -EFAULT; in sctp_getsockopt_peeloff_flags()
5770 return -EFAULT; in sctp_getsockopt_peeloff_flags()
5796 * spp_assoc_id - (one-to-many style socket) This is filled in the
5799 * spp_address - This specifies which address is of interest.
5800 * spp_hbinterval - This contains the value of the heartbeat interval,
5804 * spp_pathmaxrxt - This contains the maximum number of
5809 * spp_pathmtu - When Path MTU discovery is disabled the value
5815 * spp_sackdelay - When delayed sack is enabled, this value specifies
5823 * spp_flags - These flags are used to control various features
5827 * SPP_HB_ENABLE - Enable heartbeats on the
5832 * SPP_HB_DISABLE - Disable heartbeats on the
5835 * will have their heartbeats disabled. Note also
5841 * SPP_HB_DEMAND - Request a user initiated heartbeat
5844 * SPP_PMTUD_ENABLE - This field will enable PMTU
5849 * SPP_PMTUD_DISABLE - This field will disable PMTU
5857 * SPP_SACKDELAY_ENABLE - Setting this flag turns
5863 * SPP_SACKDELAY_DISABLE - Setting this flag turns
5865 * delayed sack is disabled for the entire association. Note
5881 * returned. For non-IPv6 sockets, this flag will be left
5898 * - This field is used in conjunction with the
5901 * label. This setting has precedence over any IPv6-layer
5904 * spp_dscp - This field is used in conjunction with the SPP_DSCP flag
5907 * IPv4- or IPv6- layer setting.
5915 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addr_params() local
5924 return -EINVAL; in sctp_getsockopt_peer_addr_params()
5927 return -EFAULT; in sctp_getsockopt_peer_addr_params()
5937 return -EINVAL; in sctp_getsockopt_peer_addr_params()
5949 return -EINVAL; in sctp_getsockopt_peer_addr_params()
5954 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval); in sctp_getsockopt_peer_addr_params()
5955 params.spp_pathmtu = trans->pathmtu; in sctp_getsockopt_peer_addr_params()
5956 params.spp_pathmaxrxt = trans->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5957 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay); in sctp_getsockopt_peer_addr_params()
5959 /*draft-11 doesn't say what to return in spp_flags*/ in sctp_getsockopt_peer_addr_params()
5960 params.spp_flags = trans->param_flags; in sctp_getsockopt_peer_addr_params()
5961 if (trans->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5962 params.spp_ipv6_flowlabel = trans->flowlabel & in sctp_getsockopt_peer_addr_params()
5966 if (trans->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5967 params.spp_dscp = trans->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
5972 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval); in sctp_getsockopt_peer_addr_params()
5973 params.spp_pathmtu = asoc->pathmtu; in sctp_getsockopt_peer_addr_params()
5974 params.spp_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5975 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_peer_addr_params()
5977 /*draft-11 doesn't say what to return in spp_flags*/ in sctp_getsockopt_peer_addr_params()
5978 params.spp_flags = asoc->param_flags; in sctp_getsockopt_peer_addr_params()
5979 if (asoc->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5980 params.spp_ipv6_flowlabel = asoc->flowlabel & in sctp_getsockopt_peer_addr_params()
5984 if (asoc->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5985 params.spp_dscp = asoc->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
5990 params.spp_hbinterval = sp->hbinterval; in sctp_getsockopt_peer_addr_params()
5991 params.spp_pathmtu = sp->pathmtu; in sctp_getsockopt_peer_addr_params()
5992 params.spp_sackdelay = sp->sackdelay; in sctp_getsockopt_peer_addr_params()
5993 params.spp_pathmaxrxt = sp->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5995 /*draft-11 doesn't say what to return in spp_flags*/ in sctp_getsockopt_peer_addr_params()
5996 params.spp_flags = sp->param_flags; in sctp_getsockopt_peer_addr_params()
5997 if (sp->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5998 params.spp_ipv6_flowlabel = sp->flowlabel & in sctp_getsockopt_peer_addr_params()
6002 if (sp->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
6003 params.spp_dscp = sp->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
6009 return -EFAULT; in sctp_getsockopt_peer_addr_params()
6012 return -EFAULT; in sctp_getsockopt_peer_addr_params()
6025 * values. If the assoc_id field is non-zero, then the set or get
6037 * sack_assoc_id - This parameter, indicates which association the user
6042 * sack_delay - This parameter contains the number of milliseconds that
6047 * sack_freq - This parameter contains the number of packets that must
6058 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_delayed_ack() local
6064 return -EFAULT; in sctp_getsockopt_delayed_ack()
6070 current->comm, task_pid_nr(current)); in sctp_getsockopt_delayed_ack()
6072 return -EFAULT; in sctp_getsockopt_delayed_ack()
6074 return -EINVAL; in sctp_getsockopt_delayed_ack()
6083 return -EINVAL; in sctp_getsockopt_delayed_ack()
6087 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) { in sctp_getsockopt_delayed_ack()
6088 params.sack_delay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_delayed_ack()
6089 params.sack_freq = asoc->sackfreq; in sctp_getsockopt_delayed_ack()
6097 if (sp->param_flags & SPP_SACKDELAY_ENABLE) { in sctp_getsockopt_delayed_ack()
6098 params.sack_delay = sp->sackdelay; in sctp_getsockopt_delayed_ack()
6099 params.sack_freq = sp->sackfreq; in sctp_getsockopt_delayed_ack()
6107 return -EFAULT; in sctp_getsockopt_delayed_ack()
6110 return -EFAULT; in sctp_getsockopt_delayed_ack()
6122 * socket (for UDP-style sockets only future associations are effected
6123 * by the change). With TCP-style sockets, this option is inherited by
6129 return -EINVAL; in sctp_getsockopt_initmsg()
6132 return -EFAULT; in sctp_getsockopt_initmsg()
6133 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) in sctp_getsockopt_initmsg()
6134 return -EFAULT; in sctp_getsockopt_initmsg()
6148 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addrs() local
6154 return -EINVAL; in sctp_getsockopt_peer_addrs()
6157 return -EFAULT; in sctp_getsockopt_peer_addrs()
6159 /* For UDP-style sockets, id specifies the association to query. */ in sctp_getsockopt_peer_addrs()
6162 return -EINVAL; in sctp_getsockopt_peer_addrs()
6165 space_left = len - offsetof(struct sctp_getaddrs, addrs); in sctp_getsockopt_peer_addrs()
6167 list_for_each_entry(from, &asoc->peer.transport_addr_list, in sctp_getsockopt_peer_addrs()
6169 memcpy(&temp, &from->ipaddr, sizeof(temp)); in sctp_getsockopt_peer_addrs()
6170 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_peer_addrs()
6171 ->addr_to_user(sp, &temp); in sctp_getsockopt_peer_addrs()
6173 return -ENOMEM; in sctp_getsockopt_peer_addrs()
6175 return -EFAULT; in sctp_getsockopt_peer_addrs()
6178 space_left -= addrlen; in sctp_getsockopt_peer_addrs()
6181 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) in sctp_getsockopt_peer_addrs()
6182 return -EFAULT; in sctp_getsockopt_peer_addrs()
6183 bytes_copied = ((char __user *)to) - optval; in sctp_getsockopt_peer_addrs()
6185 return -EFAULT; in sctp_getsockopt_peer_addrs()
6200 list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) { in sctp_copy_laddrs()
6201 if (!addr->valid) in sctp_copy_laddrs()
6204 if ((PF_INET == sk->sk_family) && in sctp_copy_laddrs()
6205 (AF_INET6 == addr->a.sa.sa_family)) in sctp_copy_laddrs()
6207 if ((PF_INET6 == sk->sk_family) && in sctp_copy_laddrs()
6209 (AF_INET == addr->a.sa.sa_family)) in sctp_copy_laddrs()
6211 memcpy(&temp, &addr->a, sizeof(temp)); in sctp_copy_laddrs()
6215 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_copy_laddrs()
6216 ->addr_to_user(sctp_sk(sk), &temp); in sctp_copy_laddrs()
6219 cnt = -ENOMEM; in sctp_copy_laddrs()
6226 space_left -= addrlen; in sctp_copy_laddrs()
6245 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_local_addrs() local
6254 return -EINVAL; in sctp_getsockopt_local_addrs()
6257 return -EFAULT; in sctp_getsockopt_local_addrs()
6260 * For UDP-style sockets, id specifies the association to query. in sctp_getsockopt_local_addrs()
6266 bp = &sctp_sk(sk)->ep->base.bind_addr; in sctp_getsockopt_local_addrs()
6270 return -EINVAL; in sctp_getsockopt_local_addrs()
6271 bp = &asoc->base.bind_addr; in sctp_getsockopt_local_addrs()
6275 space_left = len - offsetof(struct sctp_getaddrs, addrs); in sctp_getsockopt_local_addrs()
6279 return -ENOMEM; in sctp_getsockopt_local_addrs()
6284 if (sctp_list_single_entry(&bp->address_list)) { in sctp_getsockopt_local_addrs()
6285 addr = list_entry(bp->address_list.next, in sctp_getsockopt_local_addrs()
6287 if (sctp_is_any(sk, &addr->a)) { in sctp_getsockopt_local_addrs()
6288 cnt = sctp_copy_laddrs(sk, bp->port, addrs, in sctp_getsockopt_local_addrs()
6303 list_for_each_entry(addr, &bp->address_list, list) { in sctp_getsockopt_local_addrs()
6304 memcpy(&temp, &addr->a, sizeof(temp)); in sctp_getsockopt_local_addrs()
6305 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_local_addrs()
6306 ->addr_to_user(sp, &temp); in sctp_getsockopt_local_addrs()
6308 err = -ENOMEM; /*fixme: right error?*/ in sctp_getsockopt_local_addrs()
6315 space_left -= addrlen; in sctp_getsockopt_local_addrs()
6320 err = -EFAULT; in sctp_getsockopt_local_addrs()
6323 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) { in sctp_getsockopt_local_addrs()
6324 err = -EFAULT; in sctp_getsockopt_local_addrs()
6331 err = -EFAULT; in sctp_getsockopt_local_addrs()
6348 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_primary_addr() local
6351 return -EINVAL; in sctp_getsockopt_primary_addr()
6356 return -EFAULT; in sctp_getsockopt_primary_addr()
6360 return -EINVAL; in sctp_getsockopt_primary_addr()
6362 if (!asoc->peer.primary_path) in sctp_getsockopt_primary_addr()
6363 return -ENOTCONN; in sctp_getsockopt_primary_addr()
6365 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, in sctp_getsockopt_primary_addr()
6366 asoc->peer.primary_path->af_specific->sockaddr_len); in sctp_getsockopt_primary_addr()
6368 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp, in sctp_getsockopt_primary_addr()
6372 return -EFAULT; in sctp_getsockopt_primary_addr()
6374 return -EFAULT; in sctp_getsockopt_primary_addr()
6383 * Indication parameter for all future INIT and INIT-ACK exchanges.
6391 return -EINVAL; in sctp_getsockopt_adaptation_layer()
6395 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind; in sctp_getsockopt_adaptation_layer()
6398 return -EFAULT; in sctp_getsockopt_adaptation_layer()
6400 return -EFAULT; in sctp_getsockopt_adaptation_layer()
6428 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_send_param() local
6433 return -EINVAL; in sctp_getsockopt_default_send_param()
6438 return -EFAULT; in sctp_getsockopt_default_send_param()
6443 return -EINVAL; in sctp_getsockopt_default_send_param()
6446 info.sinfo_stream = asoc->default_stream; in sctp_getsockopt_default_send_param()
6447 info.sinfo_flags = asoc->default_flags; in sctp_getsockopt_default_send_param()
6448 info.sinfo_ppid = asoc->default_ppid; in sctp_getsockopt_default_send_param()
6449 info.sinfo_context = asoc->default_context; in sctp_getsockopt_default_send_param()
6450 info.sinfo_timetolive = asoc->default_timetolive; in sctp_getsockopt_default_send_param()
6452 info.sinfo_stream = sp->default_stream; in sctp_getsockopt_default_send_param()
6453 info.sinfo_flags = sp->default_flags; in sctp_getsockopt_default_send_param()
6454 info.sinfo_ppid = sp->default_ppid; in sctp_getsockopt_default_send_param()
6455 info.sinfo_context = sp->default_context; in sctp_getsockopt_default_send_param()
6456 info.sinfo_timetolive = sp->default_timetolive; in sctp_getsockopt_default_send_param()
6460 return -EFAULT; in sctp_getsockopt_default_send_param()
6462 return -EFAULT; in sctp_getsockopt_default_send_param()
6474 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_sndinfo() local
6479 return -EINVAL; in sctp_getsockopt_default_sndinfo()
6484 return -EFAULT; in sctp_getsockopt_default_sndinfo()
6489 return -EINVAL; in sctp_getsockopt_default_sndinfo()
6492 info.snd_sid = asoc->default_stream; in sctp_getsockopt_default_sndinfo()
6493 info.snd_flags = asoc->default_flags; in sctp_getsockopt_default_sndinfo()
6494 info.snd_ppid = asoc->default_ppid; in sctp_getsockopt_default_sndinfo()
6495 info.snd_context = asoc->default_context; in sctp_getsockopt_default_sndinfo()
6497 info.snd_sid = sp->default_stream; in sctp_getsockopt_default_sndinfo()
6498 info.snd_flags = sp->default_flags; in sctp_getsockopt_default_sndinfo()
6499 info.snd_ppid = sp->default_ppid; in sctp_getsockopt_default_sndinfo()
6500 info.snd_context = sp->default_context; in sctp_getsockopt_default_sndinfo()
6504 return -EFAULT; in sctp_getsockopt_default_sndinfo()
6506 return -EFAULT; in sctp_getsockopt_default_sndinfo()
6515 * Turn on/off any Nagle-like algorithm. This means that packets are
6527 return -EINVAL; in sctp_getsockopt_nodelay()
6530 val = (sctp_sk(sk)->nodelay == 1); in sctp_getsockopt_nodelay()
6532 return -EFAULT; in sctp_getsockopt_nodelay()
6534 return -EFAULT; in sctp_getsockopt_nodelay()
6557 return -EINVAL; in sctp_getsockopt_rtoinfo()
6562 return -EFAULT; in sctp_getsockopt_rtoinfo()
6568 return -EINVAL; in sctp_getsockopt_rtoinfo()
6572 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); in sctp_getsockopt_rtoinfo()
6573 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); in sctp_getsockopt_rtoinfo()
6574 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); in sctp_getsockopt_rtoinfo()
6577 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_rtoinfo() local
6579 rtoinfo.srto_initial = sp->rtoinfo.srto_initial; in sctp_getsockopt_rtoinfo()
6580 rtoinfo.srto_max = sp->rtoinfo.srto_max; in sctp_getsockopt_rtoinfo()
6581 rtoinfo.srto_min = sp->rtoinfo.srto_min; in sctp_getsockopt_rtoinfo()
6585 return -EFAULT; in sctp_getsockopt_rtoinfo()
6588 return -EFAULT; in sctp_getsockopt_rtoinfo()
6615 return -EINVAL; in sctp_getsockopt_associnfo()
6620 return -EFAULT; in sctp_getsockopt_associnfo()
6626 return -EINVAL; in sctp_getsockopt_associnfo()
6630 assocparams.sasoc_asocmaxrxt = asoc->max_retrans; in sctp_getsockopt_associnfo()
6631 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd; in sctp_getsockopt_associnfo()
6632 assocparams.sasoc_local_rwnd = asoc->a_rwnd; in sctp_getsockopt_associnfo()
6633 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life); in sctp_getsockopt_associnfo()
6635 list_for_each(pos, &asoc->peer.transport_addr_list) { in sctp_getsockopt_associnfo()
6642 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_associnfo() local
6644 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt; in sctp_getsockopt_associnfo()
6645 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd; in sctp_getsockopt_associnfo()
6646 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd; in sctp_getsockopt_associnfo()
6648 sp->assocparams.sasoc_cookie_life; in sctp_getsockopt_associnfo()
6650 sp->assocparams. in sctp_getsockopt_associnfo()
6655 return -EFAULT; in sctp_getsockopt_associnfo()
6658 return -EFAULT; in sctp_getsockopt_associnfo()
6677 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_mappedv4() local
6680 return -EINVAL; in sctp_getsockopt_mappedv4()
6683 val = sp->v4mapped; in sctp_getsockopt_mappedv4()
6685 return -EFAULT; in sctp_getsockopt_mappedv4()
6687 return -EFAULT; in sctp_getsockopt_mappedv4()
6703 return -EINVAL; in sctp_getsockopt_context()
6708 return -EFAULT; in sctp_getsockopt_context()
6713 return -EINVAL; in sctp_getsockopt_context()
6715 params.assoc_value = asoc ? asoc->default_rcv_context in sctp_getsockopt_context()
6716 : sctp_sk(sk)->default_rcv_context; in sctp_getsockopt_context()
6719 return -EFAULT; in sctp_getsockopt_context()
6721 return -EFAULT; in sctp_getsockopt_context()
6746 * assoc_id: This parameter is ignored for one-to-one style sockets.
6747 * For one-to-many style sockets this parameter indicates which
6764 current->comm, task_pid_nr(current)); in sctp_getsockopt_maxseg()
6769 return -EFAULT; in sctp_getsockopt_maxseg()
6771 return -EINVAL; in sctp_getsockopt_maxseg()
6776 return -EINVAL; in sctp_getsockopt_maxseg()
6779 params.assoc_value = asoc->frag_point; in sctp_getsockopt_maxseg()
6781 params.assoc_value = sctp_sk(sk)->user_frag; in sctp_getsockopt_maxseg()
6784 return -EFAULT; in sctp_getsockopt_maxseg()
6787 return -EFAULT; in sctp_getsockopt_maxseg()
6790 return -EFAULT; in sctp_getsockopt_maxseg()
6806 return -EINVAL; in sctp_getsockopt_fragment_interleave()
6810 val = sctp_sk(sk)->frag_interleave; in sctp_getsockopt_fragment_interleave()
6812 return -EFAULT; in sctp_getsockopt_fragment_interleave()
6814 return -EFAULT; in sctp_getsockopt_fragment_interleave()
6830 return -EINVAL; in sctp_getsockopt_partial_delivery_point()
6834 val = sctp_sk(sk)->pd_point; in sctp_getsockopt_partial_delivery_point()
6836 return -EFAULT; in sctp_getsockopt_partial_delivery_point()
6838 return -EFAULT; in sctp_getsockopt_partial_delivery_point()
6859 current->comm, task_pid_nr(current)); in sctp_getsockopt_maxburst()
6864 return -EFAULT; in sctp_getsockopt_maxburst()
6866 return -EINVAL; in sctp_getsockopt_maxburst()
6871 return -EINVAL; in sctp_getsockopt_maxburst()
6873 params.assoc_value = asoc ? asoc->max_burst : sctp_sk(sk)->max_burst; in sctp_getsockopt_maxburst()
6877 return -EFAULT; in sctp_getsockopt_maxburst()
6880 return -EFAULT; in sctp_getsockopt_maxburst()
6890 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_hmac_ident()
6897 if (!ep->auth_enable) in sctp_getsockopt_hmac_ident()
6898 return -EACCES; in sctp_getsockopt_hmac_ident()
6900 hmacs = ep->auth_hmacs_list; in sctp_getsockopt_hmac_ident()
6901 data_len = ntohs(hmacs->param_hdr.length) - in sctp_getsockopt_hmac_ident()
6905 return -EINVAL; in sctp_getsockopt_hmac_ident()
6911 return -EFAULT; in sctp_getsockopt_hmac_ident()
6912 if (put_user(num_idents, &p->shmac_num_idents)) in sctp_getsockopt_hmac_ident()
6913 return -EFAULT; in sctp_getsockopt_hmac_ident()
6915 __u16 hmacid = ntohs(hmacs->hmac_ids[i]); in sctp_getsockopt_hmac_ident()
6917 if (copy_to_user(&p->shmac_idents[i], &hmacid, sizeof(__u16))) in sctp_getsockopt_hmac_ident()
6918 return -EFAULT; in sctp_getsockopt_hmac_ident()
6926 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_active_key()
6931 return -EINVAL; in sctp_getsockopt_active_key()
6935 return -EFAULT; in sctp_getsockopt_active_key()
6939 return -EINVAL; in sctp_getsockopt_active_key()
6942 if (!asoc->peer.auth_capable) in sctp_getsockopt_active_key()
6943 return -EACCES; in sctp_getsockopt_active_key()
6944 val.scact_keynumber = asoc->active_key_id; in sctp_getsockopt_active_key()
6946 if (!ep->auth_enable) in sctp_getsockopt_active_key()
6947 return -EACCES; in sctp_getsockopt_active_key()
6948 val.scact_keynumber = ep->active_key_id; in sctp_getsockopt_active_key()
6952 return -EFAULT; in sctp_getsockopt_active_key()
6954 return -EFAULT; in sctp_getsockopt_active_key()
6970 return -EINVAL; in sctp_getsockopt_peer_auth_chunks()
6973 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6975 to = p->gauth_chunks; in sctp_getsockopt_peer_auth_chunks()
6978 return -EINVAL; in sctp_getsockopt_peer_auth_chunks()
6980 if (!asoc->peer.auth_capable) in sctp_getsockopt_peer_auth_chunks()
6981 return -EACCES; in sctp_getsockopt_peer_auth_chunks()
6983 ch = asoc->peer.peer_chunks; in sctp_getsockopt_peer_auth_chunks()
6988 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr); in sctp_getsockopt_peer_auth_chunks()
6990 return -EINVAL; in sctp_getsockopt_peer_auth_chunks()
6992 if (copy_to_user(to, ch->chunks, num_chunks)) in sctp_getsockopt_peer_auth_chunks()
6993 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6997 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6998 if (put_user(num_chunks, &p->gauth_number_of_chunks)) in sctp_getsockopt_peer_auth_chunks()
6999 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
7006 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_local_auth_chunks()
7015 return -EINVAL; in sctp_getsockopt_local_auth_chunks()
7018 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
7020 to = p->gauth_chunks; in sctp_getsockopt_local_auth_chunks()
7024 return -EINVAL; in sctp_getsockopt_local_auth_chunks()
7027 if (!asoc->peer.auth_capable) in sctp_getsockopt_local_auth_chunks()
7028 return -EACCES; in sctp_getsockopt_local_auth_chunks()
7029 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks; in sctp_getsockopt_local_auth_chunks()
7031 if (!ep->auth_enable) in sctp_getsockopt_local_auth_chunks()
7032 return -EACCES; in sctp_getsockopt_local_auth_chunks()
7033 ch = ep->auth_chunk_list; in sctp_getsockopt_local_auth_chunks()
7038 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr); in sctp_getsockopt_local_auth_chunks()
7040 return -EINVAL; in sctp_getsockopt_local_auth_chunks()
7042 if (copy_to_user(to, ch->chunks, num_chunks)) in sctp_getsockopt_local_auth_chunks()
7043 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
7047 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
7048 if (put_user(num_chunks, &p->gauth_number_of_chunks)) in sctp_getsockopt_local_auth_chunks()
7049 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
7057 * to a one-to-many style socket. The option value is an uint32_t.
7062 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_number() local
7067 return -EOPNOTSUPP; in sctp_getsockopt_assoc_number()
7070 return -EINVAL; in sctp_getsockopt_assoc_number()
7074 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_number()
7079 return -EFAULT; in sctp_getsockopt_assoc_number()
7081 return -EFAULT; in sctp_getsockopt_assoc_number()
7096 return -EINVAL; in sctp_getsockopt_auto_asconf()
7099 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk)) in sctp_getsockopt_auto_asconf()
7102 return -EFAULT; in sctp_getsockopt_auto_asconf()
7104 return -EFAULT; in sctp_getsockopt_auto_asconf()
7113 * the SCTP associations handled by a one-to-many style socket.
7118 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_ids() local
7124 return -EOPNOTSUPP; in sctp_getsockopt_assoc_ids()
7127 return -EINVAL; in sctp_getsockopt_assoc_ids()
7129 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
7134 return -EINVAL; in sctp_getsockopt_assoc_ids()
7140 return -ENOMEM; in sctp_getsockopt_assoc_ids()
7142 ids->gaids_number_of_ids = num; in sctp_getsockopt_assoc_ids()
7144 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
7145 ids->gaids_assoc_id[num++] = asoc->assoc_id; in sctp_getsockopt_assoc_ids()
7150 return -EFAULT; in sctp_getsockopt_assoc_ids()
7162 * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
7175 return -EINVAL; in sctp_getsockopt_paddr_thresholds()
7178 return -EFAULT; in sctp_getsockopt_paddr_thresholds()
7184 return -ENOENT; in sctp_getsockopt_paddr_thresholds()
7186 val.spt_pathmaxrxt = trans->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7187 val.spt_pathpfthld = trans->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7188 val.spt_pathcpthld = trans->ps_retrans; in sctp_getsockopt_paddr_thresholds()
7196 return -EINVAL; in sctp_getsockopt_paddr_thresholds()
7199 val.spt_pathpfthld = asoc->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7200 val.spt_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7201 val.spt_pathcpthld = asoc->ps_retrans; in sctp_getsockopt_paddr_thresholds()
7203 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_paddr_thresholds() local
7205 val.spt_pathpfthld = sp->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7206 val.spt_pathmaxrxt = sp->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7207 val.spt_pathcpthld = sp->ps_retrans; in sctp_getsockopt_paddr_thresholds()
7212 return -EFAULT; in sctp_getsockopt_paddr_thresholds()
7232 return -EINVAL; in sctp_getsockopt_assoc_stats()
7238 return -EFAULT; in sctp_getsockopt_assoc_stats()
7242 return -EINVAL; in sctp_getsockopt_assoc_stats()
7244 sas.sas_rtxchunks = asoc->stats.rtxchunks; in sctp_getsockopt_assoc_stats()
7245 sas.sas_gapcnt = asoc->stats.gapcnt; in sctp_getsockopt_assoc_stats()
7246 sas.sas_outofseqtsns = asoc->stats.outofseqtsns; in sctp_getsockopt_assoc_stats()
7247 sas.sas_osacks = asoc->stats.osacks; in sctp_getsockopt_assoc_stats()
7248 sas.sas_isacks = asoc->stats.isacks; in sctp_getsockopt_assoc_stats()
7249 sas.sas_octrlchunks = asoc->stats.octrlchunks; in sctp_getsockopt_assoc_stats()
7250 sas.sas_ictrlchunks = asoc->stats.ictrlchunks; in sctp_getsockopt_assoc_stats()
7251 sas.sas_oodchunks = asoc->stats.oodchunks; in sctp_getsockopt_assoc_stats()
7252 sas.sas_iodchunks = asoc->stats.iodchunks; in sctp_getsockopt_assoc_stats()
7253 sas.sas_ouodchunks = asoc->stats.ouodchunks; in sctp_getsockopt_assoc_stats()
7254 sas.sas_iuodchunks = asoc->stats.iuodchunks; in sctp_getsockopt_assoc_stats()
7255 sas.sas_idupchunks = asoc->stats.idupchunks; in sctp_getsockopt_assoc_stats()
7256 sas.sas_opackets = asoc->stats.opackets; in sctp_getsockopt_assoc_stats()
7257 sas.sas_ipackets = asoc->stats.ipackets; in sctp_getsockopt_assoc_stats()
7263 sas.sas_maxrto = asoc->stats.max_obs_rto; in sctp_getsockopt_assoc_stats()
7264 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr, in sctp_getsockopt_assoc_stats()
7268 asoc->stats.max_obs_rto = asoc->rto_min; in sctp_getsockopt_assoc_stats()
7271 return -EFAULT; in sctp_getsockopt_assoc_stats()
7276 return -EFAULT; in sctp_getsockopt_assoc_stats()
7288 return -EINVAL; in sctp_getsockopt_recvrcvinfo()
7291 if (sctp_sk(sk)->recvrcvinfo) in sctp_getsockopt_recvrcvinfo()
7294 return -EFAULT; in sctp_getsockopt_recvrcvinfo()
7296 return -EFAULT; in sctp_getsockopt_recvrcvinfo()
7308 return -EINVAL; in sctp_getsockopt_recvnxtinfo()
7311 if (sctp_sk(sk)->recvnxtinfo) in sctp_getsockopt_recvnxtinfo()
7314 return -EFAULT; in sctp_getsockopt_recvnxtinfo()
7316 return -EFAULT; in sctp_getsockopt_recvnxtinfo()
7327 int retval = -EFAULT; in sctp_getsockopt_pr_supported()
7330 retval = -EINVAL; in sctp_getsockopt_pr_supported()
7341 retval = -EINVAL; in sctp_getsockopt_pr_supported()
7345 params.assoc_value = asoc ? asoc->peer.prsctp_capable in sctp_getsockopt_pr_supported()
7346 : sctp_sk(sk)->ep->prsctp_enable; in sctp_getsockopt_pr_supported()
7366 int retval = -EFAULT; in sctp_getsockopt_default_prinfo()
7369 retval = -EINVAL; in sctp_getsockopt_default_prinfo()
7380 retval = -EINVAL; in sctp_getsockopt_default_prinfo()
7385 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags); in sctp_getsockopt_default_prinfo()
7386 info.pr_value = asoc->default_timetolive; in sctp_getsockopt_default_prinfo()
7388 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_prinfo() local
7390 info.pr_policy = SCTP_PR_POLICY(sp->default_flags); in sctp_getsockopt_default_prinfo()
7391 info.pr_value = sp->default_timetolive; in sctp_getsockopt_default_prinfo()
7413 int retval = -EINVAL; in sctp_getsockopt_pr_assocstatus()
7420 retval = -EFAULT; in sctp_getsockopt_pr_assocstatus()
7438 asoc->abandoned_unsent[policy]; in sctp_getsockopt_pr_assocstatus()
7440 asoc->abandoned_sent[policy]; in sctp_getsockopt_pr_assocstatus()
7444 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7446 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7450 retval = -EFAULT; in sctp_getsockopt_pr_assocstatus()
7455 retval = -EFAULT; in sctp_getsockopt_pr_assocstatus()
7472 int retval = -EINVAL; in sctp_getsockopt_pr_streamstatus()
7480 retval = -EFAULT; in sctp_getsockopt_pr_streamstatus()
7490 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt) in sctp_getsockopt_pr_streamstatus()
7493 streamoute = SCTP_SO(&asoc->stream, params.sprstat_sid)->ext; in sctp_getsockopt_pr_streamstatus()
7507 streamoute->abandoned_unsent[policy]; in sctp_getsockopt_pr_streamstatus()
7509 streamoute->abandoned_sent[policy]; in sctp_getsockopt_pr_streamstatus()
7513 streamoute->abandoned_unsent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_streamstatus()
7515 streamoute->abandoned_sent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_streamstatus()
7519 retval = -EFAULT; in sctp_getsockopt_pr_streamstatus()
7535 int retval = -EFAULT; in sctp_getsockopt_reconfig_supported()
7538 retval = -EINVAL; in sctp_getsockopt_reconfig_supported()
7549 retval = -EINVAL; in sctp_getsockopt_reconfig_supported()
7553 params.assoc_value = asoc ? asoc->peer.reconf_capable in sctp_getsockopt_reconfig_supported()
7554 : sctp_sk(sk)->ep->reconf_enable; in sctp_getsockopt_reconfig_supported()
7574 int retval = -EFAULT; in sctp_getsockopt_enable_strreset()
7577 retval = -EINVAL; in sctp_getsockopt_enable_strreset()
7588 retval = -EINVAL; in sctp_getsockopt_enable_strreset()
7592 params.assoc_value = asoc ? asoc->strreset_enable in sctp_getsockopt_enable_strreset()
7593 : sctp_sk(sk)->ep->strreset_enable; in sctp_getsockopt_enable_strreset()
7613 int retval = -EFAULT; in sctp_getsockopt_scheduler()
7616 retval = -EINVAL; in sctp_getsockopt_scheduler()
7627 retval = -EINVAL; in sctp_getsockopt_scheduler()
7632 : sctp_sk(sk)->default_ss; in sctp_getsockopt_scheduler()
7652 int retval = -EFAULT; in sctp_getsockopt_scheduler_value()
7655 retval = -EINVAL; in sctp_getsockopt_scheduler_value()
7665 retval = -EINVAL; in sctp_getsockopt_scheduler_value()
7675 retval = -EFAULT; in sctp_getsockopt_scheduler_value()
7680 retval = -EFAULT; in sctp_getsockopt_scheduler_value()
7694 int retval = -EFAULT; in sctp_getsockopt_interleaving_supported()
7697 retval = -EINVAL; in sctp_getsockopt_interleaving_supported()
7708 retval = -EINVAL; in sctp_getsockopt_interleaving_supported()
7712 params.assoc_value = asoc ? asoc->peer.intl_capable in sctp_getsockopt_interleaving_supported()
7713 : sctp_sk(sk)->ep->intl_enable; in sctp_getsockopt_interleaving_supported()
7734 return -EINVAL; in sctp_getsockopt_reuse_port()
7737 val = sctp_sk(sk)->reuse; in sctp_getsockopt_reuse_port()
7739 return -EFAULT; in sctp_getsockopt_reuse_port()
7742 return -EFAULT; in sctp_getsockopt_reuse_port()
7755 return -EINVAL; in sctp_getsockopt_event()
7759 return -EFAULT; in sctp_getsockopt_event()
7763 return -EINVAL; in sctp_getsockopt_event()
7768 return -EINVAL; in sctp_getsockopt_event()
7770 subscribe = asoc ? asoc->subscribe : sctp_sk(sk)->subscribe; in sctp_getsockopt_event()
7774 return -EFAULT; in sctp_getsockopt_event()
7777 return -EFAULT; in sctp_getsockopt_event()
7788 int retval = -EFAULT; in sctp_getsockopt_asconf_supported()
7791 retval = -EINVAL; in sctp_getsockopt_asconf_supported()
7802 retval = -EINVAL; in sctp_getsockopt_asconf_supported()
7806 params.assoc_value = asoc ? asoc->peer.asconf_capable in sctp_getsockopt_asconf_supported()
7807 : sctp_sk(sk)->ep->asconf_enable; in sctp_getsockopt_asconf_supported()
7827 int retval = -EFAULT; in sctp_getsockopt_auth_supported()
7830 retval = -EINVAL; in sctp_getsockopt_auth_supported()
7841 retval = -EINVAL; in sctp_getsockopt_auth_supported()
7845 params.assoc_value = asoc ? asoc->peer.auth_capable in sctp_getsockopt_auth_supported()
7846 : sctp_sk(sk)->ep->auth_enable; in sctp_getsockopt_auth_supported()
7866 int retval = -EFAULT; in sctp_getsockopt_ecn_supported()
7869 retval = -EINVAL; in sctp_getsockopt_ecn_supported()
7880 retval = -EINVAL; in sctp_getsockopt_ecn_supported()
7884 params.assoc_value = asoc ? asoc->peer.ecn_capable in sctp_getsockopt_ecn_supported()
7885 : sctp_sk(sk)->ep->ecn_enable; in sctp_getsockopt_ecn_supported()
7905 int retval = -EFAULT; in sctp_getsockopt_pf_expose()
7908 retval = -EINVAL; in sctp_getsockopt_pf_expose()
7919 retval = -EINVAL; in sctp_getsockopt_pf_expose()
7923 params.assoc_value = asoc ? asoc->pf_expose in sctp_getsockopt_pf_expose()
7924 : sctp_sk(sk)->pf_expose; in sctp_getsockopt_pf_expose()
7947 return -EINVAL; in sctp_getsockopt_encap_port()
7951 return -EFAULT; in sctp_getsockopt_encap_port()
7961 return -EINVAL; in sctp_getsockopt_encap_port()
7964 encap_port = t->encap_port; in sctp_getsockopt_encap_port()
7976 return -EINVAL; in sctp_getsockopt_encap_port()
7980 encap_port = asoc->encap_port; in sctp_getsockopt_encap_port()
7984 encap_port = sctp_sk(sk)->encap_port; in sctp_getsockopt_encap_port()
7989 return -EFAULT; in sctp_getsockopt_encap_port()
7992 return -EFAULT; in sctp_getsockopt_encap_port()
8007 return -EINVAL; in sctp_getsockopt_probe_interval()
8011 return -EFAULT; in sctp_getsockopt_probe_interval()
8021 return -EINVAL; in sctp_getsockopt_probe_interval()
8024 probe_interval = jiffies_to_msecs(t->probe_interval); in sctp_getsockopt_probe_interval()
8036 return -EINVAL; in sctp_getsockopt_probe_interval()
8040 probe_interval = jiffies_to_msecs(asoc->probe_interval); in sctp_getsockopt_probe_interval()
8044 probe_interval = sctp_sk(sk)->probe_interval; in sctp_getsockopt_probe_interval()
8049 return -EFAULT; in sctp_getsockopt_probe_interval()
8052 return -EFAULT; in sctp_getsockopt_probe_interval()
8069 * are at all well-founded. in sctp_getsockopt()
8072 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_getsockopt()
8074 retval = af->getsockopt(sk, level, optname, optval, optlen); in sctp_getsockopt()
8079 return -EFAULT; in sctp_getsockopt()
8082 return -EINVAL; in sctp_getsockopt()
8180 retval = -EOPNOTSUPP; in sctp_getsockopt()
8284 retval = -ENOPROTOOPT; in sctp_getsockopt()
8325 * would expect from a hash function, all the ports in a given list have
8327 * expecting that, right?); so each list has a set of ports, with a
8336 struct sctp_sock *sp = sctp_sk(sk); in sctp_get_port_local() local
8337 bool reuse = (sk->sk_reuse || sp->reuse); in sctp_get_port_local()
8345 snum = ntohs(addr->v4.sin_port); in sctp_get_port_local()
8355 remaining = (high - low) + 1; in sctp_get_port_local()
8366 spin_lock_bh(&head->lock); in sctp_get_port_local()
8367 sctp_for_each_hentry(pp, &head->chain) in sctp_get_port_local()
8368 if ((pp->port == rover) && in sctp_get_port_local()
8369 net_eq(net, pp->net)) in sctp_get_port_local()
8373 spin_unlock_bh(&head->lock); in sctp_get_port_local()
8375 } while (--remaining > 0); in sctp_get_port_local()
8383 * hash table list entry) is non-NULL and we hold it's in sctp_get_port_local()
8391 * to the port number (snum) - we detect that with the in sctp_get_port_local()
8395 spin_lock_bh(&head->lock); in sctp_get_port_local()
8396 sctp_for_each_hentry(pp, &head->chain) { in sctp_get_port_local()
8397 if ((pp->port == snum) && net_eq(pp->net, net)) in sctp_get_port_local()
8404 if (!hlist_empty(&pp->owner)) { in sctp_get_port_local()
8405 /* We had a port hash table hit - there is an in sctp_get_port_local()
8407 * used by other socket (pp->owner not empty); that other in sctp_get_port_local()
8414 if ((pp->fastreuse && reuse && in sctp_get_port_local()
8415 sk->sk_state != SCTP_SS_LISTENING) || in sctp_get_port_local()
8416 (pp->fastreuseport && sk->sk_reuseport && in sctp_get_port_local()
8417 uid_eq(pp->fastuid, uid))) in sctp_get_port_local()
8421 * (pp->port) [via the pointers bind_next and in sctp_get_port_local()
8422 * bind_pprev in the struct sock *sk2 (pp->sk)]. On each one, in sctp_get_port_local()
8430 sk_for_each_bound(sk2, &pp->owner) { in sctp_get_port_local()
8431 int bound_dev_if2 = READ_ONCE(sk2->sk_bound_dev_if); in sctp_get_port_local()
8433 struct sctp_endpoint *ep2 = sp2->ep; in sctp_get_port_local()
8436 (reuse && (sk2->sk_reuse || sp2->reuse) && in sctp_get_port_local()
8437 sk2->sk_state != SCTP_SS_LISTENING) || in sctp_get_port_local()
8438 (sk->sk_reuseport && sk2->sk_reuseport && in sctp_get_port_local()
8442 if ((!sk->sk_bound_dev_if || !bound_dev_if2 || in sctp_get_port_local()
8443 sk->sk_bound_dev_if == bound_dev_if2) && in sctp_get_port_local()
8444 sctp_bind_addr_conflict(&ep2->base.bind_addr, in sctp_get_port_local()
8445 addr, sp2, sp)) { in sctp_get_port_local()
8460 * if sk->sk_reuse is too (that is, if the caller requested in sctp_get_port_local()
8461 * SO_REUSEADDR on this socket -sk-). in sctp_get_port_local()
8463 if (hlist_empty(&pp->owner)) { in sctp_get_port_local()
8464 if (reuse && sk->sk_state != SCTP_SS_LISTENING) in sctp_get_port_local()
8465 pp->fastreuse = 1; in sctp_get_port_local()
8467 pp->fastreuse = 0; in sctp_get_port_local()
8469 if (sk->sk_reuseport) { in sctp_get_port_local()
8470 pp->fastreuseport = 1; in sctp_get_port_local()
8471 pp->fastuid = uid; in sctp_get_port_local()
8473 pp->fastreuseport = 0; in sctp_get_port_local()
8476 if (pp->fastreuse && in sctp_get_port_local()
8477 (!reuse || sk->sk_state == SCTP_SS_LISTENING)) in sctp_get_port_local()
8478 pp->fastreuse = 0; in sctp_get_port_local()
8480 if (pp->fastreuseport && in sctp_get_port_local()
8481 (!sk->sk_reuseport || !uid_eq(pp->fastuid, uid))) in sctp_get_port_local()
8482 pp->fastreuseport = 0; in sctp_get_port_local()
8490 if (!sp->bind_hash) { in sctp_get_port_local()
8491 inet_sk(sk)->inet_num = snum; in sctp_get_port_local()
8492 sk_add_bind_node(sk, &pp->owner); in sctp_get_port_local()
8493 sp->bind_hash = pp; in sctp_get_port_local()
8498 spin_unlock_bh(&head->lock); in sctp_get_port_local()
8508 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_get_port()
8511 af->from_sk(&addr, sk); in sctp_get_port()
8514 /* Note: sk->sk_num gets filled in if ephemeral port request. */ in sctp_get_port()
8523 struct sctp_sock *sp = sctp_sk(sk); in sctp_listen_start() local
8524 struct sctp_endpoint *ep = sp->ep; in sctp_listen_start()
8529 if (!sp->hmac && sp->sctp_hmac_alg) { in sctp_listen_start()
8530 sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg); in sctp_listen_start()
8534 sp->sctp_hmac_alg, PTR_ERR(tfm)); in sctp_listen_start()
8535 return -ENOSYS; in sctp_listen_start()
8537 sctp_sk(sk)->hmac = tfm; in sctp_listen_start()
8552 if (!ep->base.bind_addr.port) { in sctp_listen_start()
8554 return -EAGAIN; in sctp_listen_start()
8556 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) { in sctp_listen_start()
8558 return -EADDRINUSE; in sctp_listen_start()
8562 WRITE_ONCE(sk->sk_max_ack_backlog, backlog); in sctp_listen_start()
8582 struct sock *sk = sock->sk; in sctp_inet_listen()
8583 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_inet_listen()
8584 int err = -EINVAL; in sctp_inet_listen()
8591 /* Peeled-off sockets are not allowed to listen(). */ in sctp_inet_listen()
8595 if (sock->state != SS_UNCONNECTED) in sctp_inet_listen()
8608 sk->sk_state = SCTP_SS_CLOSED; in sctp_inet_listen()
8609 if (sk->sk_reuse || sctp_sk(sk)->reuse) in sctp_inet_listen()
8610 sctp_sk(sk)->bind_hash->fastreuse = 1; in sctp_inet_listen()
8616 WRITE_ONCE(sk->sk_max_ack_backlog, backlog); in sctp_inet_listen()
8644 struct sock *sk = sock->sk; in sctp_poll()
8645 struct sctp_sock *sp = sctp_sk(sk); in sctp_poll() local
8652 /* A TCP-style listening socket becomes readable when the accept queue in sctp_poll()
8656 return (!list_empty(&sp->ep->asocs)) ? in sctp_poll()
8662 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue)) in sctp_poll()
8665 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_poll()
8667 if (sk->sk_shutdown == SHUTDOWN_MASK) in sctp_poll()
8670 /* Is it readable? Reconsider this code with TCP-style support. */ in sctp_poll()
8671 if (!skb_queue_empty_lockless(&sk->sk_receive_queue)) in sctp_poll()
8709 pp->port = snum; in sctp_bucket_create()
8710 pp->fastreuse = 0; in sctp_bucket_create()
8711 INIT_HLIST_HEAD(&pp->owner); in sctp_bucket_create()
8712 pp->net = net; in sctp_bucket_create()
8713 hlist_add_head(&pp->node, &head->chain); in sctp_bucket_create()
8718 /* Caller must hold hashbucket lock for this tb with local BH disabled */
8721 if (pp && hlist_empty(&pp->owner)) { in sctp_bucket_destroy()
8722 __hlist_del(&pp->node); in sctp_bucket_destroy()
8733 inet_sk(sk)->inet_num)]; in __sctp_put_port()
8736 spin_lock(&head->lock); in __sctp_put_port()
8737 pp = sctp_sk(sk)->bind_hash; in __sctp_put_port()
8739 sctp_sk(sk)->bind_hash = NULL; in __sctp_put_port()
8740 inet_sk(sk)->inet_num = 0; in __sctp_put_port()
8742 spin_unlock(&head->lock); in __sctp_put_port()
8765 af = sctp_sk(sk)->pf->af; in sctp_autobind()
8767 port = htons(inet_sk(sk)->inet_num); in sctp_autobind()
8768 af->inaddr_any(&autoaddr, port); in sctp_autobind()
8770 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); in sctp_autobind()
8782 * Historically Berkeley-derived implementations have passed only one object
8787 * |<--------------------------- msg_controllen -------------------------->|
8790 * |<----- ancillary data object ----->|<----- ancillary data object ----->|
8792 * |<---------- CMSG_SPACE() --------->|<---------- CMSG_SPACE() --------->|
8795 * |<---------- cmsg_len ---------->| |<--------- cmsg_len ----------->| |
8797 * |<--------- CMSG_LEN() --------->| |<-------- CMSG_LEN() ---------->| |
8800 * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+
8805 * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+
8819 return -EINVAL; in sctp_msghdr_parse()
8822 if (cmsg->cmsg_level != IPPROTO_SCTP) in sctp_msghdr_parse()
8826 switch (cmsg->cmsg_type) { in sctp_msghdr_parse()
8838 * ------------ ------------ ---------------------- in sctp_msghdr_parse()
8841 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_initmsg))) in sctp_msghdr_parse()
8842 return -EINVAL; in sctp_msghdr_parse()
8844 cmsgs->init = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8856 * ------------ ------------ ---------------------- in sctp_msghdr_parse()
8859 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndrcvinfo))) in sctp_msghdr_parse()
8860 return -EINVAL; in sctp_msghdr_parse()
8862 cmsgs->srinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8864 if (cmsgs->srinfo->sinfo_flags & in sctp_msghdr_parse()
8868 return -EINVAL; in sctp_msghdr_parse()
8880 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8883 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndinfo))) in sctp_msghdr_parse()
8884 return -EINVAL; in sctp_msghdr_parse()
8886 cmsgs->sinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8888 if (cmsgs->sinfo->snd_flags & in sctp_msghdr_parse()
8892 return -EINVAL; in sctp_msghdr_parse()
8896 * 5.3.7 SCTP PR-SCTP Information Structure (SCTP_PRINFO) in sctp_msghdr_parse()
8901 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8904 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_prinfo))) in sctp_msghdr_parse()
8905 return -EINVAL; in sctp_msghdr_parse()
8907 cmsgs->prinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8908 if (cmsgs->prinfo->pr_policy & ~SCTP_PR_SCTP_MASK) in sctp_msghdr_parse()
8909 return -EINVAL; in sctp_msghdr_parse()
8911 if (cmsgs->prinfo->pr_policy == SCTP_PR_SCTP_NONE) in sctp_msghdr_parse()
8912 cmsgs->prinfo->pr_value = 0; in sctp_msghdr_parse()
8921 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8924 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_authinfo))) in sctp_msghdr_parse()
8925 return -EINVAL; in sctp_msghdr_parse()
8927 cmsgs->authinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8937 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8939 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8942 cmsgs->addrs_msg = my_msg; in sctp_msghdr_parse()
8945 return -EINVAL; in sctp_msghdr_parse()
8969 if (!skb_queue_empty(&sk->sk_receive_queue)) in sctp_wait_for_packet()
8973 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_packet()
8979 error = -ENOTCONN; in sctp_wait_for_packet()
8982 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING)) in sctp_wait_for_packet()
9035 skb = skb_peek(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
9037 refcount_inc(&skb->users); in sctp_skb_recv_datagram()
9039 skb = __skb_dequeue(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
9045 /* Caller is allowed not to check sk->sk_err before calling. */ in sctp_skb_recv_datagram()
9050 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_skb_recv_datagram()
9055 error = -EAGAIN; in sctp_skb_recv_datagram()
9070 struct sock *sk = asoc->base.sk; in __sctp_write_space()
9075 if (waitqueue_active(&asoc->wait)) in __sctp_write_space()
9076 wake_up_interruptible(&asoc->wait); in __sctp_write_space()
9082 wq = rcu_dereference(sk->sk_wq); in __sctp_write_space()
9084 if (waitqueue_active(&wq->wait)) in __sctp_write_space()
9085 wake_up_interruptible(&wq->wait); in __sctp_write_space()
9091 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in __sctp_write_space()
9106 if (asoc->ep->sndbuf_policy) in sctp_wake_up_waiters()
9112 if (asoc->base.dead) in sctp_wake_up_waiters()
9128 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs)) in sctp_wake_up_waiters()
9144 struct sctp_chunk *chunk = skb_shinfo(skb)->destructor_arg; in sctp_wfree()
9145 struct sctp_association *asoc = chunk->asoc; in sctp_wfree()
9146 struct sock *sk = asoc->base.sk; in sctp_wfree()
9148 sk_mem_uncharge(sk, skb->truesize); in sctp_wfree()
9149 sk_wmem_queued_add(sk, -(skb->truesize + sizeof(struct sctp_chunk))); in sctp_wfree()
9150 asoc->sndbuf_used -= skb->truesize + sizeof(struct sctp_chunk); in sctp_wfree()
9152 &sk->sk_wmem_alloc)); in sctp_wfree()
9154 if (chunk->shkey) { in sctp_wfree()
9155 struct sctp_shared_key *shkey = chunk->shkey; in sctp_wfree()
9161 if (shkey->deactivated && !list_empty(&shkey->key_list) && in sctp_wfree()
9162 refcount_read(&shkey->refcnt) == 2) { in sctp_wfree()
9165 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id, in sctp_wfree()
9169 asoc->stream.si->enqueue_event(&asoc->ulpq, ev); in sctp_wfree()
9171 sctp_auth_shkey_release(chunk->shkey); in sctp_wfree()
9187 struct sock *sk = skb->sk; in sctp_sock_rfree()
9190 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc); in sctp_sock_rfree()
9195 sk_mem_uncharge(sk, event->rmem_len); in sctp_sock_rfree()
9203 struct sock *sk = asoc->base.sk; in sctp_wait_for_sndbuf()
9216 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_sndbuf()
9218 if (asoc->base.dead) in sctp_wait_for_sndbuf()
9222 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING) in sctp_wait_for_sndbuf()
9236 if (sk != asoc->base.sk) in sctp_wait_for_sndbuf()
9243 finish_wait(&asoc->wait, &wait); in sctp_wait_for_sndbuf()
9251 err = -ESRCH; in sctp_wait_for_sndbuf()
9255 err = -EPIPE; in sctp_wait_for_sndbuf()
9263 err = -EAGAIN; in sctp_wait_for_sndbuf()
9274 wq = rcu_dereference(sk->sk_wq); in sctp_data_ready()
9276 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | in sctp_data_ready()
9288 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { in sctp_write_space()
9296 * associations on the same socket. For a UDP-style socket with
9300 * would cause an unwanted block under certain circumstances. For the 1-1
9301 * UDP-style sockets or TCP-style sockets, this code should work.
9302 * - Daisy
9306 return READ_ONCE(sk->sk_sndbuf) > READ_ONCE(sk->sk_wmem_queued); in sctp_writeable()
9314 struct sock *sk = asoc->base.sk; in sctp_wait_for_connect()
9325 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_connect()
9329 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_connect()
9331 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_connect()
9332 asoc->base.dead) in sctp_wait_for_connect()
9351 finish_wait(&asoc->wait, &wait); in sctp_wait_for_connect()
9359 if (asoc->init_err_counter + 1 > asoc->max_init_attempts) in sctp_wait_for_connect()
9360 err = -ETIMEDOUT; in sctp_wait_for_connect()
9362 err = -ECONNREFUSED; in sctp_wait_for_connect()
9370 err = -EINPROGRESS; in sctp_wait_for_connect()
9380 ep = sctp_sk(sk)->ep; in sctp_wait_for_accept()
9387 if (list_empty(&ep->asocs)) { in sctp_wait_for_accept()
9393 err = -EINVAL; in sctp_wait_for_accept()
9398 if (!list_empty(&ep->asocs)) in sctp_wait_for_accept()
9405 err = -EAGAIN; in sctp_wait_for_accept()
9421 if (list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_wait_for_close()
9435 if (!skb->data_len) in sctp_skb_set_owner_r_frag()
9451 struct sctp_sock *sp = sctp_sk(sk); in sctp_copy_sock() local
9453 newsk->sk_type = sk->sk_type; in sctp_copy_sock()
9454 newsk->sk_bound_dev_if = sk->sk_bound_dev_if; in sctp_copy_sock()
9455 newsk->sk_flags = sk->sk_flags; in sctp_copy_sock()
9456 newsk->sk_tsflags = sk->sk_tsflags; in sctp_copy_sock()
9457 newsk->sk_no_check_tx = sk->sk_no_check_tx; in sctp_copy_sock()
9458 newsk->sk_no_check_rx = sk->sk_no_check_rx; in sctp_copy_sock()
9459 newsk->sk_reuse = sk->sk_reuse; in sctp_copy_sock()
9460 sctp_sk(newsk)->reuse = sp->reuse; in sctp_copy_sock()
9462 newsk->sk_shutdown = sk->sk_shutdown; in sctp_copy_sock()
9463 newsk->sk_destruct = sk->sk_destruct; in sctp_copy_sock()
9464 newsk->sk_family = sk->sk_family; in sctp_copy_sock()
9465 newsk->sk_protocol = IPPROTO_SCTP; in sctp_copy_sock()
9466 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; in sctp_copy_sock()
9467 newsk->sk_sndbuf = sk->sk_sndbuf; in sctp_copy_sock()
9468 newsk->sk_rcvbuf = sk->sk_rcvbuf; in sctp_copy_sock()
9469 newsk->sk_lingertime = sk->sk_lingertime; in sctp_copy_sock()
9470 newsk->sk_rcvtimeo = sk->sk_rcvtimeo; in sctp_copy_sock()
9471 newsk->sk_sndtimeo = sk->sk_sndtimeo; in sctp_copy_sock()
9472 newsk->sk_rxhash = sk->sk_rxhash; in sctp_copy_sock()
9479 newinet->inet_sport = inet->inet_sport; in sctp_copy_sock()
9480 newinet->inet_saddr = inet->inet_saddr; in sctp_copy_sock()
9481 newinet->inet_rcv_saddr = inet->inet_rcv_saddr; in sctp_copy_sock()
9482 newinet->inet_dport = htons(asoc->peer.port); in sctp_copy_sock()
9483 newinet->pmtudisc = inet->pmtudisc; in sctp_copy_sock()
9484 atomic_set(&newinet->inet_id, get_random_u16()); in sctp_copy_sock()
9486 newinet->uc_ttl = inet->uc_ttl; in sctp_copy_sock()
9488 newinet->mc_ttl = 1; in sctp_copy_sock()
9489 newinet->mc_index = 0; in sctp_copy_sock()
9490 newinet->mc_list = NULL; in sctp_copy_sock()
9492 if (newsk->sk_flags & SK_FLAGS_TIMESTAMP) in sctp_copy_sock()
9506 ancestor_size += sk_from->sk_prot->obj_size; in sctp_copy_descendant()
9507 ancestor_size -= offsetof(struct sctp_sock, pd_lobby); in sctp_copy_descendant()
9521 struct sctp_endpoint *newep = newsp->ep; in sctp_sock_migrate()
9530 newsk->sk_sndbuf = oldsk->sk_sndbuf; in sctp_sock_migrate()
9531 newsk->sk_rcvbuf = oldsk->sk_rcvbuf; in sctp_sock_migrate()
9538 newsp->ep = newep; in sctp_sock_migrate()
9539 newsp->hmac = NULL; in sctp_sock_migrate()
9543 inet_sk(oldsk)->inet_num)]; in sctp_sock_migrate()
9544 spin_lock_bh(&head->lock); in sctp_sock_migrate()
9545 pp = sctp_sk(oldsk)->bind_hash; in sctp_sock_migrate()
9546 sk_add_bind_node(newsk, &pp->owner); in sctp_sock_migrate()
9547 sctp_sk(newsk)->bind_hash = pp; in sctp_sock_migrate()
9548 inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num; in sctp_sock_migrate()
9549 spin_unlock_bh(&head->lock); in sctp_sock_migrate()
9554 err = sctp_bind_addr_dup(&newsp->ep->base.bind_addr, in sctp_sock_migrate()
9555 &oldsp->ep->base.bind_addr, GFP_KERNEL); in sctp_sock_migrate()
9560 * that net->sctp.auth_enable has been changed to 0 by users and in sctp_sock_migrate()
9563 if (oldsp->ep->auth_hmacs) { in sctp_sock_migrate()
9564 err = sctp_auth_init_hmacs(newsp->ep, GFP_KERNEL); in sctp_sock_migrate()
9574 sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) { in sctp_sock_migrate()
9576 if (event->asoc == assoc) { in sctp_sock_migrate()
9577 __skb_unlink(skb, &oldsk->sk_receive_queue); in sctp_sock_migrate()
9578 __skb_queue_tail(&newsk->sk_receive_queue, skb); in sctp_sock_migrate()
9587 * 3) Peeling off non-partial delivery; move pd_lobby to receive_queue. in sctp_sock_migrate()
9589 atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode); in sctp_sock_migrate()
9591 if (atomic_read(&sctp_sk(oldsk)->pd_mode)) { in sctp_sock_migrate()
9595 if (assoc->ulpq.pd_mode) { in sctp_sock_migrate()
9596 queue = &newsp->pd_lobby; in sctp_sock_migrate()
9598 queue = &newsk->sk_receive_queue; in sctp_sock_migrate()
9603 sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) { in sctp_sock_migrate()
9605 if (event->asoc == assoc) { in sctp_sock_migrate()
9606 __skb_unlink(skb, &oldsp->pd_lobby); in sctp_sock_migrate()
9615 if (assoc->ulpq.pd_mode) in sctp_sock_migrate()
9623 * original UDP-style socket or created with the accept() call on a in sctp_sock_migrate()
9624 * TCP-style socket.. in sctp_sock_migrate()
9626 newsp->type = type; in sctp_sock_migrate()
9628 /* Mark the new socket "in-use" by the user so that any packets in sctp_sock_migrate()
9631 * backlog processing on the old socket and new-packet processing in sctp_sock_migrate()
9647 newsk->sk_shutdown |= RCV_SHUTDOWN; in sctp_sock_migrate()
9682 .usersize = offsetof(struct sctp_sock, initmsg) -
9710 sk->sk_destruct = sctp_v6_destruct_sock; in sctp_v6_init_sock()
9739 .usersize = offsetof(struct sctp6_sock, sctp.initmsg) -