Lines Matching +full:tx +full:- +full:sched +full:- +full:sp
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>
45 #include <linux/sched/signal.h>
107 struct sock *sk = asoc->base.sk; in sctp_wspace()
109 return asoc->ep->sndbuf_policy ? sk->sk_sndbuf - asoc->sndbuf_used in sctp_wspace()
117 * Since it is always 1-1 between chunk and skb, and also a new skb is always
124 struct sctp_association *asoc = chunk->asoc; in sctp_set_owner_w()
125 struct sock *sk = asoc->base.sk; in sctp_set_owner_w()
130 if (chunk->shkey) in sctp_set_owner_w()
131 sctp_auth_shkey_hold(chunk->shkey); in sctp_set_owner_w()
133 skb_set_owner_w(chunk->skb, sk); in sctp_set_owner_w()
135 chunk->skb->destructor = sctp_wfree; in sctp_set_owner_w()
137 skb_shinfo(chunk->skb)->destructor_arg = chunk; in sctp_set_owner_w()
139 refcount_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); in sctp_set_owner_w()
140 asoc->sndbuf_used += chunk->skb->truesize + sizeof(struct sctp_chunk); in sctp_set_owner_w()
141 sk->sk_wmem_queued += chunk->skb->truesize + sizeof(struct sctp_chunk); in sctp_set_owner_w()
142 sk_mem_charge(sk, chunk->skb->truesize); in sctp_set_owner_w()
147 skb_orphan(chunk->skb); in sctp_clear_owner_w()
152 msg = chunk->msg; \
155 list_for_each_entry(c, &msg->chunks, frag_list) { \
156 if ((clear && asoc->base.sk == c->skb->sk) || \
157 (!clear && asoc->base.sk != c->skb->sk)) \
169 struct sctp_outq *q = &asoc->outqueue; in sctp_for_each_tx_datachunk()
173 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) in sctp_for_each_tx_datachunk()
174 list_for_each_entry(chunk, &t->transmitted, transmitted_list) in sctp_for_each_tx_datachunk()
177 list_for_each_entry(chunk, &q->retransmit, transmitted_list) in sctp_for_each_tx_datachunk()
180 list_for_each_entry(chunk, &q->sacked, transmitted_list) in sctp_for_each_tx_datachunk()
183 list_for_each_entry(chunk, &q->abandoned, transmitted_list) in sctp_for_each_tx_datachunk()
186 list_for_each_entry(chunk, &q->out_chunk_list, list) in sctp_for_each_tx_datachunk()
196 sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp) in sctp_for_each_rx_skb()
199 sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp) in sctp_for_each_rx_skb()
202 sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp) in sctp_for_each_rx_skb()
215 return -EINVAL; in sctp_verify_addr()
218 if (!af->addr_valid(addr, sctp_sk(sk), NULL)) in sctp_verify_addr()
219 return -EINVAL; in sctp_verify_addr()
221 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr))) in sctp_verify_addr()
222 return -EINVAL; in sctp_verify_addr()
227 /* Look up the association by its id. If this is not a UDP-style
234 /* If this is not a UDP-style socket, assoc id should be ignored. */ in sctp_id2assoc()
237 * could be a TCP-style listening socket or a socket which in sctp_id2assoc()
244 if (!list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_id2assoc()
245 asoc = list_entry(sctp_sk(sk)->ep->asocs.next, in sctp_id2assoc()
250 /* Otherwise this is a UDP-style socket. */ in sctp_id2assoc()
256 if (asoc && (asoc->base.sk != sk || asoc->base.dead)) in sctp_id2assoc()
272 struct sctp_af *af = sctp_get_af_specific(addr->ss_family); in sctp_addr_id2transport()
276 if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len)) in sctp_addr_id2transport()
279 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep, in sctp_addr_id2transport()
290 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_addr_id2transport()
296 /* API 3.1.2 bind() - UDP Style Syntax
301 * sd - the socket descriptor returned by socket().
302 * addr - the address structure (struct sockaddr_in or struct
304 * addr_len - the size of the address structure.
316 if (!sctp_sk(sk)->ep->base.bind_addr.port) in sctp_bind()
320 retval = -EINVAL; in sctp_bind()
339 if (!opt->pf->af_supported(addr->sa.sa_family, opt)) in sctp_sockaddr_af()
342 if (addr->sa.sa_family == AF_INET6) { in sctp_sockaddr_af()
346 if (ipv6_addr_v4mapped(&addr->v6.sin6_addr) && in sctp_sockaddr_af()
347 !opt->pf->af_supported(AF_INET, opt)) in sctp_sockaddr_af()
352 af = sctp_get_af_specific(addr->sa.sa_family); in sctp_sockaddr_af()
354 if (len < af->sockaddr_len) in sctp_sockaddr_af()
360 static void sctp_auto_asconf_init(struct sctp_sock *sp) in sctp_auto_asconf_init() argument
362 struct net *net = sock_net(&sp->inet.sk); in sctp_auto_asconf_init()
364 if (net->sctp.default_auto_asconf) { in sctp_auto_asconf_init()
365 spin_lock(&net->sctp.addr_wq_lock); in sctp_auto_asconf_init()
366 list_add_tail(&sp->auto_asconf_list, &net->sctp.auto_asconf_splist); in sctp_auto_asconf_init()
367 spin_unlock(&net->sctp.addr_wq_lock); in sctp_auto_asconf_init()
368 sp->do_auto_asconf = 1; in sctp_auto_asconf_init()
376 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_bind() local
377 struct sctp_endpoint *ep = sp->ep; in sctp_do_bind()
378 struct sctp_bind_addr *bp = &ep->base.bind_addr; in sctp_do_bind()
384 af = sctp_sockaddr_af(sp, addr, len); in sctp_do_bind()
388 return -EINVAL; in sctp_do_bind()
391 snum = ntohs(addr->v4.sin_port); in sctp_do_bind()
394 __func__, sk, &addr->sa, bp->port, snum, len); in sctp_do_bind()
397 if (!sp->pf->bind_verify(sp, addr)) in sctp_do_bind()
398 return -EADDRNOTAVAIL; in sctp_do_bind()
404 if (bp->port) { in sctp_do_bind()
406 snum = bp->port; in sctp_do_bind()
407 else if (snum != bp->port) { in sctp_do_bind()
409 "%d\n", __func__, snum, bp->port); in sctp_do_bind()
410 return -EINVAL; in sctp_do_bind()
415 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) in sctp_do_bind()
416 return -EACCES; in sctp_do_bind()
421 if (sctp_bind_addr_match(bp, addr, sp)) in sctp_do_bind()
422 return -EINVAL; in sctp_do_bind()
428 addr->v4.sin_port = htons(snum); in sctp_do_bind()
430 return -EADDRINUSE; in sctp_do_bind()
433 if (!bp->port) { in sctp_do_bind()
434 bp->port = inet_sk(sk)->inet_num; in sctp_do_bind()
435 sctp_auto_asconf_init(sp); in sctp_do_bind()
441 ret = sctp_add_bind_addr(bp, addr, af->sockaddr_len, in sctp_do_bind()
449 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num); in sctp_do_bind()
450 sp->pf->to_sk_saddr(addr, sk); in sctp_do_bind()
460 * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a
462 * time two ASCONF may be in-transit on any given association (one sent
473 if (asoc->addip_last_asconf) { in sctp_send_asconf()
474 list_add_tail(&chunk->list, &asoc->addip_chunk_list); in sctp_send_asconf()
480 retval = sctp_primitive_ASCONF(asoc->base.net, asoc, chunk); in sctp_send_asconf()
484 asoc->addip_last_asconf = chunk; in sctp_send_asconf()
519 af = sctp_get_af_specific(sa_addr->sa_family); in sctp_bindx_add()
521 retval = -EINVAL; in sctp_bindx_add()
526 af->sockaddr_len); in sctp_bindx_add()
528 addr_buf += af->sockaddr_len; in sctp_bindx_add()
556 struct sctp_sock *sp; in sctp_send_asconf_add_ip() local
570 sp = sctp_sk(sk); in sctp_send_asconf_add_ip()
571 ep = sp->ep; in sctp_send_asconf_add_ip()
573 if (!ep->asconf_enable) in sctp_send_asconf_add_ip()
579 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_add_ip()
580 if (!asoc->peer.asconf_capable) in sctp_send_asconf_add_ip()
583 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP) in sctp_send_asconf_add_ip()
597 af = sctp_get_af_specific(addr->v4.sin_family); in sctp_send_asconf_add_ip()
599 retval = -EINVAL; in sctp_send_asconf_add_ip()
606 addr_buf += af->sockaddr_len; in sctp_send_asconf_add_ip()
614 bp = &asoc->base.bind_addr; in sctp_send_asconf_add_ip()
615 p = bp->address_list.next; in sctp_send_asconf_add_ip()
617 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, in sctp_send_asconf_add_ip()
620 retval = -ENOMEM; in sctp_send_asconf_add_ip()
630 af = sctp_get_af_specific(addr->v4.sin_family); in sctp_send_asconf_add_ip()
631 memcpy(&saveaddr, addr, af->sockaddr_len); in sctp_send_asconf_add_ip()
635 addr_buf += af->sockaddr_len; in sctp_send_asconf_add_ip()
637 if (asoc->src_out_of_asoc_ok) { in sctp_send_asconf_add_ip()
641 &asoc->peer.transport_addr_list, transports) { in sctp_send_asconf_add_ip()
642 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32, in sctp_send_asconf_add_ip()
643 2*asoc->pathmtu, 4380)); in sctp_send_asconf_add_ip()
644 trans->ssthresh = asoc->peer.i.a_rwnd; in sctp_send_asconf_add_ip()
645 trans->rto = asoc->rto_initial; in sctp_send_asconf_add_ip()
647 trans->rtt = trans->srtt = trans->rttvar = 0; in sctp_send_asconf_add_ip()
650 sctp_sk(asoc->base.sk)); in sctp_send_asconf_add_ip()
671 * available, the operation will return -EBUSY.
677 struct sctp_sock *sp = sctp_sk(sk); in sctp_bindx_rem() local
678 struct sctp_endpoint *ep = sp->ep; in sctp_bindx_rem()
680 struct sctp_bind_addr *bp = &ep->base.bind_addr; in sctp_bindx_rem()
695 if (list_empty(&bp->address_list) || in sctp_bindx_rem()
696 (sctp_list_single_entry(&bp->address_list))) { in sctp_bindx_rem()
697 retval = -EBUSY; in sctp_bindx_rem()
702 af = sctp_get_af_specific(sa_addr->sa.sa_family); in sctp_bindx_rem()
704 retval = -EINVAL; in sctp_bindx_rem()
708 if (!af->addr_valid(sa_addr, sp, NULL)) { in sctp_bindx_rem()
709 retval = -EADDRNOTAVAIL; in sctp_bindx_rem()
713 if (sa_addr->v4.sin_port && in sctp_bindx_rem()
714 sa_addr->v4.sin_port != htons(bp->port)) { in sctp_bindx_rem()
715 retval = -EINVAL; in sctp_bindx_rem()
719 if (!sa_addr->v4.sin_port) in sctp_bindx_rem()
720 sa_addr->v4.sin_port = htons(bp->port); in sctp_bindx_rem()
722 /* FIXME - There is probably a need to check if sk->sk_saddr and in sctp_bindx_rem()
723 * sk->sk_rcv_addr are currently set to one of the addresses to in sctp_bindx_rem()
725 * when we are fixing the outstanding issues with multi-homing in sctp_bindx_rem()
727 * sctp_do_bind(). -daisy in sctp_bindx_rem()
731 addr_buf += af->sockaddr_len; in sctp_bindx_rem()
758 struct sctp_sock *sp; in sctp_send_asconf_del_ip() local
773 sp = sctp_sk(sk); in sctp_send_asconf_del_ip()
774 ep = sp->ep; in sctp_send_asconf_del_ip()
776 if (!ep->asconf_enable) in sctp_send_asconf_del_ip()
782 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_del_ip()
784 if (!asoc->peer.asconf_capable) in sctp_send_asconf_del_ip()
787 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP) in sctp_send_asconf_del_ip()
801 af = sctp_get_af_specific(laddr->v4.sin_family); in sctp_send_asconf_del_ip()
803 retval = -EINVAL; in sctp_send_asconf_del_ip()
810 addr_buf += af->sockaddr_len; in sctp_send_asconf_del_ip()
820 bp = &asoc->base.bind_addr; in sctp_send_asconf_del_ip()
822 addrcnt, sp); in sctp_send_asconf_del_ip()
824 if (asoc->asconf_addr_del_pending) in sctp_send_asconf_del_ip()
826 asoc->asconf_addr_del_pending = in sctp_send_asconf_del_ip()
828 if (asoc->asconf_addr_del_pending == NULL) { in sctp_send_asconf_del_ip()
829 retval = -ENOMEM; in sctp_send_asconf_del_ip()
832 asoc->asconf_addr_del_pending->sa.sa_family = in sctp_send_asconf_del_ip()
833 addrs->sa_family; in sctp_send_asconf_del_ip()
834 asoc->asconf_addr_del_pending->v4.sin_port = in sctp_send_asconf_del_ip()
835 htons(bp->port); in sctp_send_asconf_del_ip()
836 if (addrs->sa_family == AF_INET) { in sctp_send_asconf_del_ip()
840 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr; in sctp_send_asconf_del_ip()
841 } else if (addrs->sa_family == AF_INET6) { in sctp_send_asconf_del_ip()
845 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr; in sctp_send_asconf_del_ip()
849 __func__, asoc, &asoc->asconf_addr_del_pending->sa, in sctp_send_asconf_del_ip()
850 asoc->asconf_addr_del_pending); in sctp_send_asconf_del_ip()
852 asoc->src_out_of_asoc_ok = 1; in sctp_send_asconf_del_ip()
858 return -EINVAL; in sctp_send_asconf_del_ip()
867 retval = -ENOMEM; in sctp_send_asconf_del_ip()
878 af = sctp_get_af_specific(laddr->v4.sin_family); in sctp_send_asconf_del_ip()
879 list_for_each_entry(saddr, &bp->address_list, list) { in sctp_send_asconf_del_ip()
880 if (sctp_cmp_addr_exact(&saddr->a, laddr)) in sctp_send_asconf_del_ip()
881 saddr->state = SCTP_ADDR_DEL; in sctp_send_asconf_del_ip()
883 addr_buf += af->sockaddr_len; in sctp_send_asconf_del_ip()
890 list_for_each_entry(transport, &asoc->peer.transport_addr_list, in sctp_send_asconf_del_ip()
893 sctp_sk(asoc->base.sk)); in sctp_send_asconf_del_ip()
906 int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw) in sctp_asconf_mgmt() argument
908 struct sock *sk = sctp_opt2sk(sp); in sctp_asconf_mgmt()
913 addr = &addrw->a; in sctp_asconf_mgmt()
914 addr->v4.sin_port = htons(sp->ep->base.bind_addr.port); in sctp_asconf_mgmt()
915 af = sctp_get_af_specific(addr->sa.sa_family); in sctp_asconf_mgmt()
917 return -EINVAL; in sctp_asconf_mgmt()
918 if (sctp_verify_addr(sk, addr, af->sockaddr_len)) in sctp_asconf_mgmt()
919 return -EINVAL; in sctp_asconf_mgmt()
921 if (addrw->state == SCTP_ADDR_NEW) in sctp_asconf_mgmt()
948 * -1, and sets errno to the appropriate error code.
1010 return -EINVAL; in sctp_setsockopt_bindx()
1015 return -EINVAL; in sctp_setsockopt_bindx()
1018 af = sctp_get_af_specific(sa_addr->sa_family); in sctp_setsockopt_bindx()
1023 if (!af || (walk_size + af->sockaddr_len) > addrs_size) in sctp_setsockopt_bindx()
1024 return -EINVAL; in sctp_setsockopt_bindx()
1026 addr_buf += af->sockaddr_len; in sctp_setsockopt_bindx()
1027 walk_size += af->sockaddr_len; in sctp_setsockopt_bindx()
1049 return -EINVAL; in sctp_setsockopt_bindx()
1070 struct sock *sk = ep->base.sk; in sctp_connect_new_asoc()
1076 return -EADDRNOTAVAIL; in sctp_connect_new_asoc()
1078 if (!ep->base.bind_addr.port) { in sctp_connect_new_asoc()
1080 return -EAGAIN; in sctp_connect_new_asoc()
1082 if (inet_port_requires_bind_service(net, ep->base.bind_addr.port) && in sctp_connect_new_asoc()
1083 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) in sctp_connect_new_asoc()
1084 return -EACCES; in sctp_connect_new_asoc()
1090 return -ENOMEM; in sctp_connect_new_asoc()
1098 err = -ENOMEM; in sctp_connect_new_asoc()
1105 if (init->sinit_num_ostreams) { in sctp_connect_new_asoc()
1106 __u16 outcnt = init->sinit_num_ostreams; in sctp_connect_new_asoc()
1108 asoc->c.sinit_num_ostreams = outcnt; in sctp_connect_new_asoc()
1109 /* outcnt has been changed, need to re-init stream */ in sctp_connect_new_asoc()
1110 err = sctp_stream_init(&asoc->stream, outcnt, 0, GFP_KERNEL); in sctp_connect_new_asoc()
1115 if (init->sinit_max_instreams) in sctp_connect_new_asoc()
1116 asoc->c.sinit_max_instreams = init->sinit_max_instreams; in sctp_connect_new_asoc()
1118 if (init->sinit_max_attempts) in sctp_connect_new_asoc()
1119 asoc->max_init_attempts = init->sinit_max_attempts; in sctp_connect_new_asoc()
1121 if (init->sinit_max_init_timeo) in sctp_connect_new_asoc()
1122 asoc->max_init_timeo = in sctp_connect_new_asoc()
1123 msecs_to_jiffies(init->sinit_max_init_timeo); in sctp_connect_new_asoc()
1134 struct sctp_endpoint *ep = asoc->ep; in sctp_connect_add_peer()
1139 err = sctp_verify_addr(ep->base.sk, daddr, addr_len); in sctp_connect_add_peer()
1145 return old->state >= SCTP_STATE_ESTABLISHED ? -EISCONN in sctp_connect_add_peer()
1146 : -EALREADY; in sctp_connect_add_peer()
1149 return -EADDRNOTAVAIL; in sctp_connect_add_peer()
1153 return -ENOMEM; in sctp_connect_add_peer()
1166 struct sctp_sock *sp = sctp_sk(sk); in __sctp_connect() local
1167 struct sctp_endpoint *ep = sp->ep; in __sctp_connect()
1178 return -EISCONN; in __sctp_connect()
1181 af = sctp_get_af_specific(daddr->sa.sa_family); in __sctp_connect()
1182 if (!af || af->sockaddr_len > addrs_size) in __sctp_connect()
1183 return -EINVAL; in __sctp_connect()
1185 err = sctp_verify_addr(sk, daddr, af->sockaddr_len); in __sctp_connect()
1191 return asoc->state >= SCTP_STATE_ESTABLISHED ? -EISCONN in __sctp_connect()
1192 : -EALREADY; in __sctp_connect()
1197 asoc = transport->asoc; in __sctp_connect()
1199 addr_buf += af->sockaddr_len; in __sctp_connect()
1200 walk_size = af->sockaddr_len; in __sctp_connect()
1202 err = -EINVAL; in __sctp_connect()
1207 af = sctp_get_af_specific(daddr->sa.sa_family); in __sctp_connect()
1208 if (!af || af->sockaddr_len + walk_size > addrs_size) in __sctp_connect()
1211 if (asoc->peer.port != ntohs(daddr->v4.sin_port)) in __sctp_connect()
1214 err = sctp_connect_add_peer(asoc, daddr, af->sockaddr_len); in __sctp_connect()
1218 addr_buf += af->sockaddr_len; in __sctp_connect()
1219 walk_size += af->sockaddr_len; in __sctp_connect()
1236 inet_sk(sk)->inet_dport = htons(asoc->peer.port); in __sctp_connect()
1237 sp->pf->to_sk_daddr(daddr, sk); in __sctp_connect()
1238 sk->sk_err = 0; in __sctp_connect()
1241 *assoc_id = asoc->assoc_id; in __sctp_connect()
1275 * returns -1, and sets errno to the appropriate error code. The assoc_id
1282 * an endpoint that is multi-homed. Much like sctp_bindx() this call
1318 return -EINVAL; in __sctp_setsockopt_connectx()
1327 /* in-kernel sockets don't generally have a file allocated to them in __sctp_setsockopt_connectx()
1330 if (sk->sk_socket->file) in __sctp_setsockopt_connectx()
1331 flags = sk->sk_socket->file->f_flags; in __sctp_setsockopt_connectx()
1370 * We use the sctp_getaddrs_old structure so that use-space library
1373 * addrs_num structure member. That way we can re-use the existing
1398 return -EINVAL; in sctp_getsockopt_connectx3()
1400 return -EFAULT; in sctp_getsockopt_connectx3()
1409 return -EINVAL; in sctp_getsockopt_connectx3()
1411 return -EFAULT; in sctp_getsockopt_connectx3()
1420 if (err == 0 || err == -EINPROGRESS) { in sctp_getsockopt_connectx3()
1422 return -EFAULT; in sctp_getsockopt_connectx3()
1424 return -EFAULT; in sctp_getsockopt_connectx3()
1430 /* API 3.1.4 close() - UDP Style Syntax
1433 * by a UDP-style socket.
1439 * sd - the socket descriptor of the associations to be closed.
1442 * UDP-style socket, an application should use the sendmsg() call,
1446 * If sd in the close() call is a branched-off socket representing only
1449 * 4.1.6 close() - TCP Style Syntax
1457 * sd - the socket descriptor of the association to be closed.
1464 * An application using the TCP-style socket can use this option to
1491 sk->sk_shutdown = SHUTDOWN_MASK; in sctp_close()
1494 ep = sctp_sk(sk)->ep; in sctp_close()
1497 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue); in sctp_close()
1498 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby); in sctp_close()
1501 list_for_each_safe(pos, temp, &ep->asocs) { in sctp_close()
1506 * it belongs to a TCP-style listening socket that is in sctp_close()
1516 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) || in sctp_close()
1517 !skb_queue_empty(&asoc->ulpq.reasm) || in sctp_close()
1518 !skb_queue_empty(&asoc->ulpq.reasm_uo) || in sctp_close()
1519 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) { in sctp_close()
1528 /* On a TCP-style socket, block for at most linger_time if set. */ in sctp_close()
1540 spin_lock_bh(&net->sctp.addr_wq_lock); in sctp_close()
1550 spin_unlock_bh(&net->sctp.addr_wq_lock); in sctp_close()
1560 if (err == -EPIPE) in sctp_error()
1561 err = sock_error(sk) ? : -EPIPE; in sctp_error()
1562 if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) in sctp_error()
1567 /* API 3.1.3 sendmsg() - UDP Style Syntax
1575 * socket - the socket descriptor of the endpoint.
1576 * message - pointer to the msghdr structure which contains a single
1582 * flags - flags sent or received with the user message, see Section
1601 return -EPIPE; in sctp_sendmsg_parse()
1603 if (msg_len > sk->sk_sndbuf) in sctp_sendmsg_parse()
1604 return -EMSGSIZE; in sctp_sendmsg_parse()
1614 if (cmsgs->srinfo) { in sctp_sendmsg_parse()
1615 srinfo->sinfo_stream = cmsgs->srinfo->sinfo_stream; in sctp_sendmsg_parse()
1616 srinfo->sinfo_flags = cmsgs->srinfo->sinfo_flags; in sctp_sendmsg_parse()
1617 srinfo->sinfo_ppid = cmsgs->srinfo->sinfo_ppid; in sctp_sendmsg_parse()
1618 srinfo->sinfo_context = cmsgs->srinfo->sinfo_context; in sctp_sendmsg_parse()
1619 srinfo->sinfo_assoc_id = cmsgs->srinfo->sinfo_assoc_id; in sctp_sendmsg_parse()
1620 srinfo->sinfo_timetolive = cmsgs->srinfo->sinfo_timetolive; in sctp_sendmsg_parse()
1623 if (cmsgs->sinfo) { in sctp_sendmsg_parse()
1624 srinfo->sinfo_stream = cmsgs->sinfo->snd_sid; in sctp_sendmsg_parse()
1625 srinfo->sinfo_flags = cmsgs->sinfo->snd_flags; in sctp_sendmsg_parse()
1626 srinfo->sinfo_ppid = cmsgs->sinfo->snd_ppid; in sctp_sendmsg_parse()
1627 srinfo->sinfo_context = cmsgs->sinfo->snd_context; in sctp_sendmsg_parse()
1628 srinfo->sinfo_assoc_id = cmsgs->sinfo->snd_assoc_id; in sctp_sendmsg_parse()
1631 if (cmsgs->prinfo) { in sctp_sendmsg_parse()
1632 srinfo->sinfo_timetolive = cmsgs->prinfo->pr_value; in sctp_sendmsg_parse()
1633 SCTP_PR_SET_POLICY(srinfo->sinfo_flags, in sctp_sendmsg_parse()
1634 cmsgs->prinfo->pr_policy); in sctp_sendmsg_parse()
1637 sflags = srinfo->sinfo_flags; in sctp_sendmsg_parse()
1642 return -EINVAL; in sctp_sendmsg_parse()
1646 return -EINVAL; in sctp_sendmsg_parse()
1648 if ((sflags & SCTP_ADDR_OVER) && !msg->msg_name) in sctp_sendmsg_parse()
1649 return -EINVAL; in sctp_sendmsg_parse()
1659 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_sendmsg_new_asoc()
1669 return -EINVAL; in sctp_sendmsg_new_asoc()
1673 return -EADDRNOTAVAIL; in sctp_sendmsg_new_asoc()
1675 /* Label connection socket for first association 1-to-many in sctp_sendmsg_new_asoc()
1676 * style for client sequence socket()->sendmsg(). This in sctp_sendmsg_new_asoc()
1681 af = sctp_get_af_specific(daddr->sa.sa_family); in sctp_sendmsg_new_asoc()
1683 return -EINVAL; in sctp_sendmsg_new_asoc()
1686 af->sockaddr_len); in sctp_sendmsg_new_asoc()
1690 err = sctp_connect_new_asoc(ep, daddr, cmsgs->init, tp); in sctp_sendmsg_new_asoc()
1693 asoc = (*tp)->asoc; in sctp_sendmsg_new_asoc()
1695 if (!cmsgs->addrs_msg) in sctp_sendmsg_new_asoc()
1698 if (daddr->sa.sa_family == AF_INET6) in sctp_sendmsg_new_asoc()
1699 flowinfo = daddr->v6.sin6_flowinfo; in sctp_sendmsg_new_asoc()
1702 for_each_cmsghdr(cmsg, cmsgs->addrs_msg) { in sctp_sendmsg_new_asoc()
1706 if (cmsg->cmsg_level != IPPROTO_SCTP || in sctp_sendmsg_new_asoc()
1707 (cmsg->cmsg_type != SCTP_DSTADDRV4 && in sctp_sendmsg_new_asoc()
1708 cmsg->cmsg_type != SCTP_DSTADDRV6)) in sctp_sendmsg_new_asoc()
1713 dlen = cmsg->cmsg_len - sizeof(struct cmsghdr); in sctp_sendmsg_new_asoc()
1714 if (cmsg->cmsg_type == SCTP_DSTADDRV4) { in sctp_sendmsg_new_asoc()
1716 err = -EINVAL; in sctp_sendmsg_new_asoc()
1721 daddr->v4.sin_family = AF_INET; in sctp_sendmsg_new_asoc()
1722 daddr->v4.sin_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1723 memcpy(&daddr->v4.sin_addr, CMSG_DATA(cmsg), dlen); in sctp_sendmsg_new_asoc()
1726 err = -EINVAL; in sctp_sendmsg_new_asoc()
1731 daddr->v6.sin6_flowinfo = flowinfo; in sctp_sendmsg_new_asoc()
1732 daddr->v6.sin6_family = AF_INET6; in sctp_sendmsg_new_asoc()
1733 daddr->v6.sin6_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1734 memcpy(&daddr->v6.sin6_addr, CMSG_DATA(cmsg), dlen); in sctp_sendmsg_new_asoc()
1753 struct sock *sk = asoc->base.sk; in sctp_sendmsg_check_sflags()
1757 return -EPIPE; in sctp_sendmsg_check_sflags()
1775 return -ENOMEM; in sctp_sendmsg_check_sflags()
1779 iov_iter_revert(&msg->msg_iter, msg_len); in sctp_sendmsg_check_sflags()
1792 struct sock *sk = asoc->base.sk; in sctp_sendmsg_to_asoc()
1793 struct sctp_sock *sp = sctp_sk(sk); in sctp_sendmsg_to_asoc() local
1801 if (sinfo->sinfo_stream >= asoc->stream.outcnt) { in sctp_sendmsg_to_asoc()
1802 err = -EINVAL; in sctp_sendmsg_to_asoc()
1806 if (unlikely(!SCTP_SO(&asoc->stream, sinfo->sinfo_stream)->ext)) { in sctp_sendmsg_to_asoc()
1807 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream); in sctp_sendmsg_to_asoc()
1812 if (sp->disable_fragments && msg_len > asoc->frag_point) { in sctp_sendmsg_to_asoc()
1813 err = -EMSGSIZE; in sctp_sendmsg_to_asoc()
1817 if (asoc->pmtu_pending) { in sctp_sendmsg_to_asoc()
1818 if (sp->param_flags & SPP_PMTUD_ENABLE) in sctp_sendmsg_to_asoc()
1820 asoc->pmtu_pending = 0; in sctp_sendmsg_to_asoc()
1824 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); in sctp_sendmsg_to_asoc()
1830 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in sctp_sendmsg_to_asoc()
1841 if (asoc->ep->intl_enable) { in sctp_sendmsg_to_asoc()
1845 err = -ESRCH; in sctp_sendmsg_to_asoc()
1855 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter); in sctp_sendmsg_to_asoc()
1861 asoc->force_delay = !!(msg->msg_flags & MSG_MORE); in sctp_sendmsg_to_asoc()
1863 list_for_each_entry(chunk, &datamsg->chunks, frag_list) { in sctp_sendmsg_to_asoc()
1866 chunk->transport = transport; in sctp_sendmsg_to_asoc()
1880 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in sctp_sendmsg_to_asoc()
1897 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { in sctp_sendmsg_get_daddr()
1898 int len = msg->msg_namelen; in sctp_sendmsg_get_daddr()
1903 daddr = (union sctp_addr *)msg->msg_name; in sctp_sendmsg_get_daddr()
1917 if (!cmsgs->srinfo && !cmsgs->sinfo) { in sctp_sendmsg_update_sinfo()
1918 sinfo->sinfo_stream = asoc->default_stream; in sctp_sendmsg_update_sinfo()
1919 sinfo->sinfo_ppid = asoc->default_ppid; in sctp_sendmsg_update_sinfo()
1920 sinfo->sinfo_context = asoc->default_context; in sctp_sendmsg_update_sinfo()
1921 sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); in sctp_sendmsg_update_sinfo()
1923 if (!cmsgs->prinfo) in sctp_sendmsg_update_sinfo()
1924 sinfo->sinfo_flags = asoc->default_flags; in sctp_sendmsg_update_sinfo()
1927 if (!cmsgs->srinfo && !cmsgs->prinfo) in sctp_sendmsg_update_sinfo()
1928 sinfo->sinfo_timetolive = asoc->default_timetolive; in sctp_sendmsg_update_sinfo()
1930 if (cmsgs->authinfo) { in sctp_sendmsg_update_sinfo()
1932 * sinfo_ssn to save the keyid on tx path. in sctp_sendmsg_update_sinfo()
1934 sinfo->sinfo_tsn = 1; in sctp_sendmsg_update_sinfo()
1935 sinfo->sinfo_ssn = cmsgs->authinfo->auth_keynumber; in sctp_sendmsg_update_sinfo()
1941 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_sendmsg()
1957 sflags = sinfo->sinfo_flags; in sctp_sendmsg()
1970 list_for_each_entry_safe(asoc, tmp, &ep->asocs, asocs) { in sctp_sendmsg()
1985 iov_iter_revert(&msg->msg_iter, err); in sctp_sendmsg()
2005 asoc = transport->asoc; in sctp_sendmsg()
2012 asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id); in sctp_sendmsg()
2014 err = -EPIPE; in sctp_sendmsg()
2028 if (err < 0 && err != -ESRCH && new) in sctp_sendmsg()
2034 return sctp_error(sk, msg->msg_flags, err); in sctp_sendmsg()
2054 len -= skb_len; in sctp_skb_pull()
2059 skb->len -= (len-rlen); in sctp_skb_pull()
2060 skb->data_len -= (len-rlen); in sctp_skb_pull()
2071 /* API 3.1.3 recvmsg() - UDP Style Syntax
2076 * socket - the socket descriptor of the endpoint.
2077 * message - pointer to the msghdr structure which contains a single
2083 * flags - flags sent or received with the user message, see Section
2090 struct sctp_sock *sp = sctp_sk(sk); in sctp_recvmsg() local
2104 err = -ENOTCONN; in sctp_recvmsg()
2115 skb_len = skb->len; in sctp_recvmsg()
2128 if (event->chunk && event->chunk->head_skb) in sctp_recvmsg()
2129 head_skb = event->chunk->head_skb; in sctp_recvmsg()
2134 msg->msg_flags |= MSG_NOTIFICATION; in sctp_recvmsg()
2135 sp->pf->event_msgname(event, msg->msg_name, addr_len); in sctp_recvmsg()
2137 sp->pf->skb_msgname(head_skb, msg->msg_name, addr_len); in sctp_recvmsg()
2141 if (sp->recvnxtinfo) in sctp_recvmsg()
2144 if (sp->recvrcvinfo) in sctp_recvmsg()
2147 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_DATA_IO_EVENT)) in sctp_recvmsg()
2157 msg->msg_flags &= ~MSG_EOR; in sctp_recvmsg()
2161 skb_queue_head(&sk->sk_receive_queue, skb); in sctp_recvmsg()
2168 sctp_assoc_rwnd_increase(event->asoc, copied); in sctp_recvmsg()
2170 } else if ((event->msg_flags & MSG_NOTIFICATION) || in sctp_recvmsg()
2171 (event->msg_flags & MSG_EOR)) in sctp_recvmsg()
2172 msg->msg_flags |= MSG_EOR; in sctp_recvmsg()
2174 msg->msg_flags &= ~MSG_EOR; in sctp_recvmsg()
2205 return -EINVAL; in sctp_setsockopt_disable_fragments()
2206 sctp_sk(sk)->disable_fragments = (*val == 0) ? 0 : 1; in sctp_setsockopt_disable_fragments()
2213 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_events() local
2218 return -EINVAL; in sctp_setsockopt_events()
2221 sctp_ulpevent_type_set(&sp->subscribe, SCTP_SN_TYPE_BASE + i, in sctp_setsockopt_events()
2224 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_events()
2225 asoc->subscribe = sctp_sk(sk)->subscribe; in sctp_setsockopt_events()
2231 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_SENDER_DRY_EVENT)) { in sctp_setsockopt_events()
2235 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) { in sctp_setsockopt_events()
2239 return -ENOMEM; in sctp_setsockopt_events()
2241 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_setsockopt_events()
2250 * This socket option is applicable to the UDP-style socket only. When
2262 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_autoclose() local
2265 /* Applicable to UDP-style socket only */ in sctp_setsockopt_autoclose()
2267 return -EOPNOTSUPP; in sctp_setsockopt_autoclose()
2269 return -EINVAL; in sctp_setsockopt_autoclose()
2271 sp->autoclose = *optval; in sctp_setsockopt_autoclose()
2272 if (sp->autoclose > net->sctp.max_autoclose) in sctp_setsockopt_autoclose()
2273 sp->autoclose = net->sctp.max_autoclose; in sctp_setsockopt_autoclose()
2299 * spp_assoc_id - (one-to-many style socket) This is filled in the
2302 * spp_address - This specifies which address is of interest.
2303 * spp_hbinterval - This contains the value of the heartbeat interval,
2307 * spp_pathmaxrxt - This contains the maximum number of
2312 * spp_pathmtu - When Path MTU discovery is disabled the value
2318 * spp_sackdelay - When delayed sack is enabled, this value specifies
2326 * spp_flags - These flags are used to control various features
2330 * SPP_HB_ENABLE - Enable heartbeats on the
2335 * SPP_HB_DISABLE - Disable heartbeats on the
2344 * SPP_HB_DEMAND - Request a user initiated heartbeat
2347 * SPP_HB_TIME_IS_ZERO - Specify's that the time for
2351 * SPP_PMTUD_ENABLE - This field will enable PMTU
2356 * SPP_PMTUD_DISABLE - This field will disable PMTU
2364 * SPP_SACKDELAY_ENABLE - Setting this flag turns
2370 * SPP_SACKDELAY_DISABLE - Setting this flag turns
2388 * returned. For non-IPv6 sockets, this flag will be left
2405 * - This field is used in conjunction with the
2408 * label. This setting has precedence over any IPv6-layer
2411 * spp_dscp - This field is used in conjunction with the SPP_DSCP flag
2414 * IPv4- or IPv6- layer setting.
2419 struct sctp_sock *sp, in sctp_apply_peer_addr_params() argument
2426 if (params->spp_flags & SPP_HB_DEMAND && trans) { in sctp_apply_peer_addr_params()
2427 error = sctp_primitive_REQUESTHEARTBEAT(trans->asoc->base.net, in sctp_apply_peer_addr_params()
2428 trans->asoc, trans); in sctp_apply_peer_addr_params()
2437 if (params->spp_flags & SPP_HB_ENABLE) { in sctp_apply_peer_addr_params()
2439 /* Re-zero the interval if the SPP_HB_TIME_IS_ZERO is in sctp_apply_peer_addr_params()
2443 if (params->spp_flags & SPP_HB_TIME_IS_ZERO) in sctp_apply_peer_addr_params()
2444 params->spp_hbinterval = 0; in sctp_apply_peer_addr_params()
2446 if (params->spp_hbinterval || in sctp_apply_peer_addr_params()
2447 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) { in sctp_apply_peer_addr_params()
2449 trans->hbinterval = in sctp_apply_peer_addr_params()
2450 msecs_to_jiffies(params->spp_hbinterval); in sctp_apply_peer_addr_params()
2452 asoc->hbinterval = in sctp_apply_peer_addr_params()
2453 msecs_to_jiffies(params->spp_hbinterval); in sctp_apply_peer_addr_params()
2455 sp->hbinterval = params->spp_hbinterval; in sctp_apply_peer_addr_params()
2462 trans->param_flags = in sctp_apply_peer_addr_params()
2463 (trans->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2465 asoc->param_flags = in sctp_apply_peer_addr_params()
2466 (asoc->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2468 sp->param_flags = in sctp_apply_peer_addr_params()
2469 (sp->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2478 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) { in sctp_apply_peer_addr_params()
2480 trans->pathmtu = params->spp_pathmtu; in sctp_apply_peer_addr_params()
2483 sctp_assoc_set_pmtu(asoc, params->spp_pathmtu); in sctp_apply_peer_addr_params()
2485 sp->pathmtu = params->spp_pathmtu; in sctp_apply_peer_addr_params()
2491 int update = (trans->param_flags & SPP_PMTUD_DISABLE) && in sctp_apply_peer_addr_params()
2492 (params->spp_flags & SPP_PMTUD_ENABLE); in sctp_apply_peer_addr_params()
2493 trans->param_flags = in sctp_apply_peer_addr_params()
2494 (trans->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2496 sctp_transport_pmtu(trans, sctp_opt2sk(sp)); in sctp_apply_peer_addr_params()
2500 asoc->param_flags = in sctp_apply_peer_addr_params()
2501 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2503 sp->param_flags = in sctp_apply_peer_addr_params()
2504 (sp->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2512 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) { in sctp_apply_peer_addr_params()
2514 trans->sackdelay = in sctp_apply_peer_addr_params()
2515 msecs_to_jiffies(params->spp_sackdelay); in sctp_apply_peer_addr_params()
2517 asoc->sackdelay = in sctp_apply_peer_addr_params()
2518 msecs_to_jiffies(params->spp_sackdelay); in sctp_apply_peer_addr_params()
2520 sp->sackdelay = params->spp_sackdelay; in sctp_apply_peer_addr_params()
2526 trans->param_flags = in sctp_apply_peer_addr_params()
2527 (trans->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2530 asoc->param_flags = in sctp_apply_peer_addr_params()
2531 (asoc->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2534 sp->param_flags = in sctp_apply_peer_addr_params()
2535 (sp->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2543 if (params->spp_pathmaxrxt) { in sctp_apply_peer_addr_params()
2545 trans->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2547 asoc->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2549 sp->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2553 if (params->spp_flags & SPP_IPV6_FLOWLABEL) { in sctp_apply_peer_addr_params()
2555 if (trans->ipaddr.sa.sa_family == AF_INET6) { in sctp_apply_peer_addr_params()
2556 trans->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2558 trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2563 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2565 if (t->ipaddr.sa.sa_family != AF_INET6) in sctp_apply_peer_addr_params()
2567 t->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2569 t->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2571 asoc->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2573 asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2574 } else if (sctp_opt2sk(sp)->sk_family == AF_INET6) { in sctp_apply_peer_addr_params()
2575 sp->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2577 sp->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2581 if (params->spp_flags & SPP_DSCP) { in sctp_apply_peer_addr_params()
2583 trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2584 trans->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2588 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2590 t->dscp = params->spp_dscp & in sctp_apply_peer_addr_params()
2592 t->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2594 asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2595 asoc->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2597 sp->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2598 sp->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2611 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_peer_addr_params() local
2617 if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL)) in sctp_setsockopt_peer_addr_params()
2618 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2620 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2624 hb_change = params->spp_flags & SPP_HB; in sctp_setsockopt_peer_addr_params()
2625 pmtud_change = params->spp_flags & SPP_PMTUD; in sctp_setsockopt_peer_addr_params()
2626 sackdelay_change = params->spp_flags & SPP_SACKDELAY; in sctp_setsockopt_peer_addr_params()
2631 params->spp_sackdelay > 500 || in sctp_setsockopt_peer_addr_params()
2632 (params->spp_pathmtu && in sctp_setsockopt_peer_addr_params()
2633 params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) in sctp_setsockopt_peer_addr_params()
2634 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2639 if (!sctp_is_any(sk, (union sctp_addr *)¶ms->spp_address)) { in sctp_setsockopt_peer_addr_params()
2640 trans = sctp_addr_id2transport(sk, ¶ms->spp_address, in sctp_setsockopt_peer_addr_params()
2641 params->spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2643 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2650 asoc = sctp_id2assoc(sk, params->spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2651 if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_peer_addr_params()
2653 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2658 if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc) in sctp_setsockopt_peer_addr_params()
2659 return -EINVAL; in sctp_setsockopt_peer_addr_params()
2662 error = sctp_apply_peer_addr_params(params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2673 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_peer_addr_params()
2675 sctp_apply_peer_addr_params(params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2699 if (params->sack_delay) { in sctp_apply_asoc_delayed_ack()
2700 asoc->sackdelay = msecs_to_jiffies(params->sack_delay); in sctp_apply_asoc_delayed_ack()
2701 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2702 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2704 if (params->sack_freq == 1) { in sctp_apply_asoc_delayed_ack()
2705 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2706 sctp_spp_sackdelay_disable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2707 } else if (params->sack_freq > 1) { in sctp_apply_asoc_delayed_ack()
2708 asoc->sackfreq = params->sack_freq; in sctp_apply_asoc_delayed_ack()
2709 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2710 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2713 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_apply_asoc_delayed_ack()
2715 if (params->sack_delay) { in sctp_apply_asoc_delayed_ack()
2716 trans->sackdelay = msecs_to_jiffies(params->sack_delay); in sctp_apply_asoc_delayed_ack()
2717 trans->param_flags = in sctp_apply_asoc_delayed_ack()
2718 sctp_spp_sackdelay_enable(trans->param_flags); in sctp_apply_asoc_delayed_ack()
2720 if (params->sack_freq == 1) { in sctp_apply_asoc_delayed_ack()
2721 trans->param_flags = in sctp_apply_asoc_delayed_ack()
2722 sctp_spp_sackdelay_disable(trans->param_flags); in sctp_apply_asoc_delayed_ack()
2723 } else if (params->sack_freq > 1) { in sctp_apply_asoc_delayed_ack()
2724 trans->sackfreq = params->sack_freq; in sctp_apply_asoc_delayed_ack()
2725 trans->param_flags = in sctp_apply_asoc_delayed_ack()
2726 sctp_spp_sackdelay_enable(trans->param_flags); in sctp_apply_asoc_delayed_ack()
2739 * values. If the assoc_id field is non-zero, then the set or get
2751 * sack_assoc_id - This parameter, indicates which association the user
2756 * sack_delay - This parameter contains the number of milliseconds that
2761 * sack_freq - This parameter contains the number of packets that must
2769 struct sctp_sock *sp = sctp_sk(sk); in __sctp_setsockopt_delayed_ack() local
2773 if (params->sack_delay > 500) in __sctp_setsockopt_delayed_ack()
2774 return -EINVAL; in __sctp_setsockopt_delayed_ack()
2780 asoc = sctp_id2assoc(sk, params->sack_assoc_id); in __sctp_setsockopt_delayed_ack()
2781 if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC && in __sctp_setsockopt_delayed_ack()
2783 return -EINVAL; in __sctp_setsockopt_delayed_ack()
2792 params->sack_assoc_id = SCTP_FUTURE_ASSOC; in __sctp_setsockopt_delayed_ack()
2794 if (params->sack_assoc_id == SCTP_FUTURE_ASSOC || in __sctp_setsockopt_delayed_ack()
2795 params->sack_assoc_id == SCTP_ALL_ASSOC) { in __sctp_setsockopt_delayed_ack()
2796 if (params->sack_delay) { in __sctp_setsockopt_delayed_ack()
2797 sp->sackdelay = params->sack_delay; in __sctp_setsockopt_delayed_ack()
2798 sp->param_flags = in __sctp_setsockopt_delayed_ack()
2799 sctp_spp_sackdelay_enable(sp->param_flags); in __sctp_setsockopt_delayed_ack()
2801 if (params->sack_freq == 1) { in __sctp_setsockopt_delayed_ack()
2802 sp->param_flags = in __sctp_setsockopt_delayed_ack()
2803 sctp_spp_sackdelay_disable(sp->param_flags); in __sctp_setsockopt_delayed_ack()
2804 } else if (params->sack_freq > 1) { in __sctp_setsockopt_delayed_ack()
2805 sp->sackfreq = params->sack_freq; in __sctp_setsockopt_delayed_ack()
2806 sp->param_flags = in __sctp_setsockopt_delayed_ack()
2807 sctp_spp_sackdelay_enable(sp->param_flags); in __sctp_setsockopt_delayed_ack()
2811 if (params->sack_assoc_id == SCTP_CURRENT_ASSOC || in __sctp_setsockopt_delayed_ack()
2812 params->sack_assoc_id == SCTP_ALL_ASSOC) in __sctp_setsockopt_delayed_ack()
2813 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in __sctp_setsockopt_delayed_ack()
2831 current->comm, task_pid_nr(current)); in sctp_setsockopt_delayed_ack()
2833 p.sack_assoc_id = v->assoc_id; in sctp_setsockopt_delayed_ack()
2834 p.sack_delay = v->assoc_value; in sctp_setsockopt_delayed_ack()
2835 p.sack_freq = v->assoc_value ? 0 : 1; in sctp_setsockopt_delayed_ack()
2840 return -EINVAL; in sctp_setsockopt_delayed_ack()
2841 if (params->sack_delay == 0 && params->sack_freq == 0) in sctp_setsockopt_delayed_ack()
2853 * socket (for UDP-style sockets only future associations are effected
2854 * by the change). With TCP-style sockets, this option is inherited by
2860 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_initmsg() local
2863 return -EINVAL; in sctp_setsockopt_initmsg()
2865 if (sinit->sinit_num_ostreams) in sctp_setsockopt_initmsg()
2866 sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams; in sctp_setsockopt_initmsg()
2867 if (sinit->sinit_max_instreams) in sctp_setsockopt_initmsg()
2868 sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams; in sctp_setsockopt_initmsg()
2869 if (sinit->sinit_max_attempts) in sctp_setsockopt_initmsg()
2870 sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts; in sctp_setsockopt_initmsg()
2871 if (sinit->sinit_max_init_timeo) in sctp_setsockopt_initmsg()
2872 sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo; in sctp_setsockopt_initmsg()
2895 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_send_param() local
2899 return -EINVAL; in sctp_setsockopt_default_send_param()
2900 if (info->sinfo_flags & in sctp_setsockopt_default_send_param()
2903 return -EINVAL; in sctp_setsockopt_default_send_param()
2905 asoc = sctp_id2assoc(sk, info->sinfo_assoc_id); in sctp_setsockopt_default_send_param()
2906 if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_send_param()
2908 return -EINVAL; in sctp_setsockopt_default_send_param()
2911 asoc->default_stream = info->sinfo_stream; in sctp_setsockopt_default_send_param()
2912 asoc->default_flags = info->sinfo_flags; in sctp_setsockopt_default_send_param()
2913 asoc->default_ppid = info->sinfo_ppid; in sctp_setsockopt_default_send_param()
2914 asoc->default_context = info->sinfo_context; in sctp_setsockopt_default_send_param()
2915 asoc->default_timetolive = info->sinfo_timetolive; in sctp_setsockopt_default_send_param()
2921 info->sinfo_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_default_send_param()
2923 if (info->sinfo_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_default_send_param()
2924 info->sinfo_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_send_param()
2925 sp->default_stream = info->sinfo_stream; in sctp_setsockopt_default_send_param()
2926 sp->default_flags = info->sinfo_flags; in sctp_setsockopt_default_send_param()
2927 sp->default_ppid = info->sinfo_ppid; in sctp_setsockopt_default_send_param()
2928 sp->default_context = info->sinfo_context; in sctp_setsockopt_default_send_param()
2929 sp->default_timetolive = info->sinfo_timetolive; in sctp_setsockopt_default_send_param()
2932 if (info->sinfo_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_default_send_param()
2933 info->sinfo_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_send_param()
2934 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_send_param()
2935 asoc->default_stream = info->sinfo_stream; in sctp_setsockopt_default_send_param()
2936 asoc->default_flags = info->sinfo_flags; in sctp_setsockopt_default_send_param()
2937 asoc->default_ppid = info->sinfo_ppid; in sctp_setsockopt_default_send_param()
2938 asoc->default_context = info->sinfo_context; in sctp_setsockopt_default_send_param()
2939 asoc->default_timetolive = info->sinfo_timetolive; in sctp_setsockopt_default_send_param()
2953 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_sndinfo() local
2957 return -EINVAL; in sctp_setsockopt_default_sndinfo()
2958 if (info->snd_flags & in sctp_setsockopt_default_sndinfo()
2961 return -EINVAL; in sctp_setsockopt_default_sndinfo()
2963 asoc = sctp_id2assoc(sk, info->snd_assoc_id); in sctp_setsockopt_default_sndinfo()
2964 if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_sndinfo()
2966 return -EINVAL; in sctp_setsockopt_default_sndinfo()
2969 asoc->default_stream = info->snd_sid; in sctp_setsockopt_default_sndinfo()
2970 asoc->default_flags = info->snd_flags; in sctp_setsockopt_default_sndinfo()
2971 asoc->default_ppid = info->snd_ppid; in sctp_setsockopt_default_sndinfo()
2972 asoc->default_context = info->snd_context; in sctp_setsockopt_default_sndinfo()
2978 info->snd_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_default_sndinfo()
2980 if (info->snd_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_default_sndinfo()
2981 info->snd_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_sndinfo()
2982 sp->default_stream = info->snd_sid; in sctp_setsockopt_default_sndinfo()
2983 sp->default_flags = info->snd_flags; in sctp_setsockopt_default_sndinfo()
2984 sp->default_ppid = info->snd_ppid; in sctp_setsockopt_default_sndinfo()
2985 sp->default_context = info->snd_context; in sctp_setsockopt_default_sndinfo()
2988 if (info->snd_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_default_sndinfo()
2989 info->snd_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_sndinfo()
2990 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_sndinfo()
2991 asoc->default_stream = info->snd_sid; in sctp_setsockopt_default_sndinfo()
2992 asoc->default_flags = info->snd_flags; in sctp_setsockopt_default_sndinfo()
2993 asoc->default_ppid = info->snd_ppid; in sctp_setsockopt_default_sndinfo()
2994 asoc->default_context = info->snd_context; in sctp_setsockopt_default_sndinfo()
3015 return -EINVAL; in sctp_setsockopt_primary_addr()
3018 af = sctp_get_af_specific(prim->ssp_addr.ss_family); in sctp_setsockopt_primary_addr()
3020 return -EINVAL; in sctp_setsockopt_primary_addr()
3023 (struct sockaddr *)&prim->ssp_addr, in sctp_setsockopt_primary_addr()
3024 af->sockaddr_len); in sctp_setsockopt_primary_addr()
3028 trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id); in sctp_setsockopt_primary_addr()
3030 return -EINVAL; in sctp_setsockopt_primary_addr()
3032 sctp_assoc_set_primary(trans->asoc, trans); in sctp_setsockopt_primary_addr()
3040 * Turn on/off any Nagle-like algorithm. This means that packets are
3049 return -EINVAL; in sctp_setsockopt_nodelay()
3050 sctp_sk(sk)->nodelay = (*val == 0) ? 0 : 1; in sctp_setsockopt_nodelay()
3072 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_rtoinfo() local
3075 return -EINVAL; in sctp_setsockopt_rtoinfo()
3077 asoc = sctp_id2assoc(sk, rtoinfo->srto_assoc_id); in sctp_setsockopt_rtoinfo()
3080 if (!asoc && rtoinfo->srto_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_rtoinfo()
3082 return -EINVAL; in sctp_setsockopt_rtoinfo()
3084 rto_max = rtoinfo->srto_max; in sctp_setsockopt_rtoinfo()
3085 rto_min = rtoinfo->srto_min; in sctp_setsockopt_rtoinfo()
3090 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max; in sctp_setsockopt_rtoinfo()
3095 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min; in sctp_setsockopt_rtoinfo()
3098 return -EINVAL; in sctp_setsockopt_rtoinfo()
3101 if (rtoinfo->srto_initial != 0) in sctp_setsockopt_rtoinfo()
3102 asoc->rto_initial = in sctp_setsockopt_rtoinfo()
3103 msecs_to_jiffies(rtoinfo->srto_initial); in sctp_setsockopt_rtoinfo()
3104 asoc->rto_max = rto_max; in sctp_setsockopt_rtoinfo()
3105 asoc->rto_min = rto_min; in sctp_setsockopt_rtoinfo()
3107 /* If there is no association or the association-id = 0 in sctp_setsockopt_rtoinfo()
3110 if (rtoinfo->srto_initial != 0) in sctp_setsockopt_rtoinfo()
3111 sp->rtoinfo.srto_initial = rtoinfo->srto_initial; in sctp_setsockopt_rtoinfo()
3112 sp->rtoinfo.srto_max = rto_max; in sctp_setsockopt_rtoinfo()
3113 sp->rtoinfo.srto_min = rto_min; in sctp_setsockopt_rtoinfo()
3138 return -EINVAL; in sctp_setsockopt_associnfo()
3140 asoc = sctp_id2assoc(sk, assocparams->sasoc_assoc_id); in sctp_setsockopt_associnfo()
3142 if (!asoc && assocparams->sasoc_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_associnfo()
3144 return -EINVAL; in sctp_setsockopt_associnfo()
3148 if (assocparams->sasoc_asocmaxrxt != 0) { in sctp_setsockopt_associnfo()
3153 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list, in sctp_setsockopt_associnfo()
3155 path_sum += peer_addr->pathmaxrxt; in sctp_setsockopt_associnfo()
3165 assocparams->sasoc_asocmaxrxt > path_sum) in sctp_setsockopt_associnfo()
3166 return -EINVAL; in sctp_setsockopt_associnfo()
3168 asoc->max_retrans = assocparams->sasoc_asocmaxrxt; in sctp_setsockopt_associnfo()
3171 if (assocparams->sasoc_cookie_life != 0) in sctp_setsockopt_associnfo()
3172 asoc->cookie_life = in sctp_setsockopt_associnfo()
3173 ms_to_ktime(assocparams->sasoc_cookie_life); in sctp_setsockopt_associnfo()
3176 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_associnfo() local
3178 if (assocparams->sasoc_asocmaxrxt != 0) in sctp_setsockopt_associnfo()
3179 sp->assocparams.sasoc_asocmaxrxt = in sctp_setsockopt_associnfo()
3180 assocparams->sasoc_asocmaxrxt; in sctp_setsockopt_associnfo()
3181 if (assocparams->sasoc_cookie_life != 0) in sctp_setsockopt_associnfo()
3182 sp->assocparams.sasoc_cookie_life = in sctp_setsockopt_associnfo()
3183 assocparams->sasoc_cookie_life; in sctp_setsockopt_associnfo()
3201 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_mappedv4() local
3204 return -EINVAL; in sctp_setsockopt_mappedv4()
3206 sp->v4mapped = 1; in sctp_setsockopt_mappedv4()
3208 sp->v4mapped = 0; in sctp_setsockopt_mappedv4()
3233 * assoc_id: This parameter is ignored for one-to-one style sockets.
3234 * For one-to-many style sockets this parameter indicates which
3244 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_maxseg() local
3254 current->comm, task_pid_nr(current)); in sctp_setsockopt_maxseg()
3258 assoc_id = params->assoc_id; in sctp_setsockopt_maxseg()
3259 val = params->assoc_value; in sctp_setsockopt_maxseg()
3261 return -EINVAL; in sctp_setsockopt_maxseg()
3267 return -EINVAL; in sctp_setsockopt_maxseg()
3271 __u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) : in sctp_setsockopt_maxseg()
3274 min_len = sctp_min_frag_point(sp, datasize); in sctp_setsockopt_maxseg()
3275 max_len = SCTP_MAX_CHUNK_LEN - datasize; in sctp_setsockopt_maxseg()
3278 return -EINVAL; in sctp_setsockopt_maxseg()
3282 asoc->user_frag = val; in sctp_setsockopt_maxseg()
3285 sp->user_frag = val; in sctp_setsockopt_maxseg()
3304 struct sctp_sock *sp; in sctp_setsockopt_peer_primary_addr() local
3310 sp = sctp_sk(sk); in sctp_setsockopt_peer_primary_addr()
3312 if (!sp->ep->asconf_enable) in sctp_setsockopt_peer_primary_addr()
3313 return -EPERM; in sctp_setsockopt_peer_primary_addr()
3316 return -EINVAL; in sctp_setsockopt_peer_primary_addr()
3318 asoc = sctp_id2assoc(sk, prim->sspp_assoc_id); in sctp_setsockopt_peer_primary_addr()
3320 return -EINVAL; in sctp_setsockopt_peer_primary_addr()
3322 if (!asoc->peer.asconf_capable) in sctp_setsockopt_peer_primary_addr()
3323 return -EPERM; in sctp_setsockopt_peer_primary_addr()
3325 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY) in sctp_setsockopt_peer_primary_addr()
3326 return -EPERM; in sctp_setsockopt_peer_primary_addr()
3329 return -ENOTCONN; in sctp_setsockopt_peer_primary_addr()
3331 af = sctp_get_af_specific(prim->sspp_addr.ss_family); in sctp_setsockopt_peer_primary_addr()
3333 return -EINVAL; in sctp_setsockopt_peer_primary_addr()
3335 if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL)) in sctp_setsockopt_peer_primary_addr()
3336 return -EADDRNOTAVAIL; in sctp_setsockopt_peer_primary_addr()
3338 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr)) in sctp_setsockopt_peer_primary_addr()
3339 return -EADDRNOTAVAIL; in sctp_setsockopt_peer_primary_addr()
3343 (struct sockaddr *)&prim->sspp_addr, in sctp_setsockopt_peer_primary_addr()
3344 af->sockaddr_len); in sctp_setsockopt_peer_primary_addr()
3350 (union sctp_addr *)&prim->sspp_addr); in sctp_setsockopt_peer_primary_addr()
3352 return -ENOMEM; in sctp_setsockopt_peer_primary_addr()
3366 return -EINVAL; in sctp_setsockopt_adaptation_layer()
3368 sctp_sk(sk)->adaptation_ind = adapt->ssb_adaptation_ind; in sctp_setsockopt_adaptation_layer()
3381 * one-2-many model for an application to keep some reference to an
3391 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_context() local
3395 return -EINVAL; in sctp_setsockopt_context()
3397 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_context()
3398 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_context()
3400 return -EINVAL; in sctp_setsockopt_context()
3403 asoc->default_rcv_context = params->assoc_value; in sctp_setsockopt_context()
3409 params->assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_context()
3411 if (params->assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_context()
3412 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_context()
3413 sp->default_rcv_context = params->assoc_value; in sctp_setsockopt_context()
3415 if (params->assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_context()
3416 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_context()
3417 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_context()
3418 asoc->default_rcv_context = params->assoc_value; in sctp_setsockopt_context()
3438 * This option takes a boolean value. A non-zero value indicates that
3451 return -EINVAL; in sctp_setsockopt_fragment_interleave()
3453 sctp_sk(sk)->frag_interleave = !!*val; in sctp_setsockopt_fragment_interleave()
3455 if (!sctp_sk(sk)->frag_interleave) in sctp_setsockopt_fragment_interleave()
3456 sctp_sk(sk)->ep->intl_enable = 0; in sctp_setsockopt_fragment_interleave()
3482 return -EINVAL; in sctp_setsockopt_partial_delivery_point()
3487 if (*val > (sk->sk_rcvbuf >> 1)) in sctp_setsockopt_partial_delivery_point()
3488 return -EINVAL; in sctp_setsockopt_partial_delivery_point()
3490 sctp_sk(sk)->pd_point = *val; in sctp_setsockopt_partial_delivery_point()
3510 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_maxburst() local
3520 current->comm, task_pid_nr(current)); in sctp_setsockopt_maxburst()
3524 assoc_id = params->assoc_id; in sctp_setsockopt_maxburst()
3525 assoc_value = params->assoc_value; in sctp_setsockopt_maxburst()
3527 return -EINVAL; in sctp_setsockopt_maxburst()
3531 return -EINVAL; in sctp_setsockopt_maxburst()
3534 asoc->max_burst = assoc_value; in sctp_setsockopt_maxburst()
3543 sp->max_burst = assoc_value; in sctp_setsockopt_maxburst()
3546 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_maxburst()
3547 asoc->max_burst = assoc_value; in sctp_setsockopt_maxburst()
3563 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_chunk()
3565 if (!ep->auth_enable) in sctp_setsockopt_auth_chunk()
3566 return -EACCES; in sctp_setsockopt_auth_chunk()
3569 return -EINVAL; in sctp_setsockopt_auth_chunk()
3571 switch (val->sauth_chunk) { in sctp_setsockopt_auth_chunk()
3576 return -EINVAL; in sctp_setsockopt_auth_chunk()
3580 return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk); in sctp_setsockopt_auth_chunk()
3593 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_hmac_ident()
3596 if (!ep->auth_enable) in sctp_setsockopt_hmac_ident()
3597 return -EACCES; in sctp_setsockopt_hmac_ident()
3600 return -EINVAL; in sctp_setsockopt_hmac_ident()
3604 idents = hmacs->shmac_num_idents; in sctp_setsockopt_hmac_ident()
3606 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) in sctp_setsockopt_hmac_ident()
3607 return -EINVAL; in sctp_setsockopt_hmac_ident()
3622 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_key()
3624 int ret = -EINVAL; in sctp_setsockopt_auth_key()
3627 return -EINVAL; in sctp_setsockopt_auth_key()
3628 /* authkey->sca_keylength is u16, so optlen can't be bigger than in sctp_setsockopt_auth_key()
3633 if (authkey->sca_keylength > optlen - sizeof(*authkey)) in sctp_setsockopt_auth_key()
3636 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); in sctp_setsockopt_auth_key()
3637 if (!asoc && authkey->sca_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_auth_key()
3647 authkey->sca_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_auth_key()
3649 if (authkey->sca_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_auth_key()
3650 authkey->sca_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_auth_key()
3658 if (authkey->sca_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_auth_key()
3659 authkey->sca_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_auth_key()
3660 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_auth_key()
3683 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_active_key()
3688 return -EINVAL; in sctp_setsockopt_active_key()
3690 asoc = sctp_id2assoc(sk, val->scact_assoc_id); in sctp_setsockopt_active_key()
3691 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_active_key()
3693 return -EINVAL; in sctp_setsockopt_active_key()
3696 return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); in sctp_setsockopt_active_key()
3699 val->scact_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_active_key()
3701 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_active_key()
3702 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_active_key()
3703 ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber); in sctp_setsockopt_active_key()
3708 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_active_key()
3709 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_active_key()
3710 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_active_key()
3712 val->scact_keynumber); in sctp_setsockopt_active_key()
3731 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_del_key()
3736 return -EINVAL; in sctp_setsockopt_del_key()
3738 asoc = sctp_id2assoc(sk, val->scact_assoc_id); in sctp_setsockopt_del_key()
3739 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_del_key()
3741 return -EINVAL; in sctp_setsockopt_del_key()
3744 return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_del_key()
3747 val->scact_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_del_key()
3749 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_del_key()
3750 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_del_key()
3751 ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_del_key()
3756 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_del_key()
3757 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_del_key()
3758 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_del_key()
3760 val->scact_keynumber); in sctp_setsockopt_del_key()
3779 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_deactivate_key()
3784 return -EINVAL; in sctp_setsockopt_deactivate_key()
3786 asoc = sctp_id2assoc(sk, val->scact_assoc_id); in sctp_setsockopt_deactivate_key()
3787 if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_deactivate_key()
3789 return -EINVAL; in sctp_setsockopt_deactivate_key()
3792 return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_deactivate_key()
3795 val->scact_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_deactivate_key()
3797 if (val->scact_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_deactivate_key()
3798 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_deactivate_key()
3799 ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber); in sctp_setsockopt_deactivate_key()
3804 if (val->scact_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_deactivate_key()
3805 val->scact_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_deactivate_key()
3806 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_deactivate_key()
3808 val->scact_keynumber); in sctp_setsockopt_deactivate_key()
3827 * This option expects an integer boolean flag, where a non-zero value turns on
3835 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_auto_asconf() local
3838 return -EINVAL; in sctp_setsockopt_auto_asconf()
3840 return -EINVAL; in sctp_setsockopt_auto_asconf()
3841 if ((*val && sp->do_auto_asconf) || (!*val && !sp->do_auto_asconf)) in sctp_setsockopt_auto_asconf()
3844 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3845 if (*val == 0 && sp->do_auto_asconf) { in sctp_setsockopt_auto_asconf()
3846 list_del(&sp->auto_asconf_list); in sctp_setsockopt_auto_asconf()
3847 sp->do_auto_asconf = 0; in sctp_setsockopt_auto_asconf()
3848 } else if (*val && !sp->do_auto_asconf) { in sctp_setsockopt_auto_asconf()
3849 list_add_tail(&sp->auto_asconf_list, in sctp_setsockopt_auto_asconf()
3850 &sock_net(sk)->sctp.auto_asconf_splist); in sctp_setsockopt_auto_asconf()
3851 sp->do_auto_asconf = 1; in sctp_setsockopt_auto_asconf()
3853 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3862 * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
3874 return -EINVAL; in sctp_setsockopt_paddr_thresholds()
3876 if (v2 && val->spt_pathpfthld > val->spt_pathcpthld) in sctp_setsockopt_paddr_thresholds()
3877 return -EINVAL; in sctp_setsockopt_paddr_thresholds()
3879 if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) { in sctp_setsockopt_paddr_thresholds()
3880 trans = sctp_addr_id2transport(sk, &val->spt_address, in sctp_setsockopt_paddr_thresholds()
3881 val->spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3883 return -ENOENT; in sctp_setsockopt_paddr_thresholds()
3885 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3886 trans->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3888 trans->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3889 trans->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3894 asoc = sctp_id2assoc(sk, val->spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3895 if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_paddr_thresholds()
3897 return -EINVAL; in sctp_setsockopt_paddr_thresholds()
3900 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_paddr_thresholds()
3902 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3903 trans->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3905 trans->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3906 trans->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3909 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3910 asoc->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3912 asoc->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3913 asoc->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3915 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_paddr_thresholds() local
3917 if (val->spt_pathmaxrxt) in sctp_setsockopt_paddr_thresholds()
3918 sp->pathmaxrxt = val->spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3920 sp->ps_retrans = val->spt_pathcpthld; in sctp_setsockopt_paddr_thresholds()
3921 sp->pf_retrans = val->spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3931 return -EINVAL; in sctp_setsockopt_recvrcvinfo()
3933 sctp_sk(sk)->recvrcvinfo = (*val == 0) ? 0 : 1; in sctp_setsockopt_recvrcvinfo()
3942 return -EINVAL; in sctp_setsockopt_recvnxtinfo()
3944 sctp_sk(sk)->recvnxtinfo = (*val == 0) ? 0 : 1; in sctp_setsockopt_recvnxtinfo()
3956 return -EINVAL; in sctp_setsockopt_pr_supported()
3958 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_pr_supported()
3959 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_pr_supported()
3961 return -EINVAL; in sctp_setsockopt_pr_supported()
3963 sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value; in sctp_setsockopt_pr_supported()
3972 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_prinfo() local
3974 int retval = -EINVAL; in sctp_setsockopt_default_prinfo()
3979 if (info->pr_policy & ~SCTP_PR_SCTP_MASK) in sctp_setsockopt_default_prinfo()
3982 if (info->pr_policy == SCTP_PR_SCTP_NONE) in sctp_setsockopt_default_prinfo()
3983 info->pr_value = 0; in sctp_setsockopt_default_prinfo()
3985 asoc = sctp_id2assoc(sk, info->pr_assoc_id); in sctp_setsockopt_default_prinfo()
3986 if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_prinfo()
3993 SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy); in sctp_setsockopt_default_prinfo()
3994 asoc->default_timetolive = info->pr_value; in sctp_setsockopt_default_prinfo()
3999 info->pr_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_default_prinfo()
4001 if (info->pr_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_default_prinfo()
4002 info->pr_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_prinfo()
4003 SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy); in sctp_setsockopt_default_prinfo()
4004 sp->default_timetolive = info->pr_value; in sctp_setsockopt_default_prinfo()
4007 if (info->pr_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_default_prinfo()
4008 info->pr_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_default_prinfo()
4009 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_prinfo()
4010 SCTP_PR_SET_POLICY(asoc->default_flags, in sctp_setsockopt_default_prinfo()
4011 info->pr_policy); in sctp_setsockopt_default_prinfo()
4012 asoc->default_timetolive = info->pr_value; in sctp_setsockopt_default_prinfo()
4025 int retval = -EINVAL; in sctp_setsockopt_reconfig_supported()
4030 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_reconfig_supported()
4031 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_reconfig_supported()
4035 sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value; in sctp_setsockopt_reconfig_supported()
4047 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_enable_strreset()
4049 int retval = -EINVAL; in sctp_setsockopt_enable_strreset()
4054 if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK)) in sctp_setsockopt_enable_strreset()
4057 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_enable_strreset()
4058 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_enable_strreset()
4065 asoc->strreset_enable = params->assoc_value; in sctp_setsockopt_enable_strreset()
4070 params->assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_enable_strreset()
4072 if (params->assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_enable_strreset()
4073 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_enable_strreset()
4074 ep->strreset_enable = params->assoc_value; in sctp_setsockopt_enable_strreset()
4076 if (params->assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_enable_strreset()
4077 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_enable_strreset()
4078 list_for_each_entry(asoc, &ep->asocs, asocs) in sctp_setsockopt_enable_strreset()
4079 asoc->strreset_enable = params->assoc_value; in sctp_setsockopt_enable_strreset()
4092 return -EINVAL; in sctp_setsockopt_reset_streams()
4097 if (params->srs_number_streams * sizeof(__u16) > in sctp_setsockopt_reset_streams()
4098 optlen - sizeof(*params)) in sctp_setsockopt_reset_streams()
4099 return -EINVAL; in sctp_setsockopt_reset_streams()
4101 asoc = sctp_id2assoc(sk, params->srs_assoc_id); in sctp_setsockopt_reset_streams()
4103 return -EINVAL; in sctp_setsockopt_reset_streams()
4114 return -EINVAL; in sctp_setsockopt_reset_assoc()
4118 return -EINVAL; in sctp_setsockopt_reset_assoc()
4130 return -EINVAL; in sctp_setsockopt_add_streams()
4132 asoc = sctp_id2assoc(sk, params->sas_assoc_id); in sctp_setsockopt_add_streams()
4134 return -EINVAL; in sctp_setsockopt_add_streams()
4143 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_scheduler() local
4148 return -EINVAL; in sctp_setsockopt_scheduler()
4150 if (params->assoc_value > SCTP_SS_MAX) in sctp_setsockopt_scheduler()
4151 return -EINVAL; in sctp_setsockopt_scheduler()
4153 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_scheduler()
4154 if (!asoc && params->assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_scheduler()
4156 return -EINVAL; in sctp_setsockopt_scheduler()
4159 return sctp_sched_set_sched(asoc, params->assoc_value); in sctp_setsockopt_scheduler()
4162 params->assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_scheduler()
4164 if (params->assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_scheduler()
4165 params->assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_scheduler()
4166 sp->default_ss = params->assoc_value; in sctp_setsockopt_scheduler()
4168 if (params->assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_scheduler()
4169 params->assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_scheduler()
4170 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_scheduler()
4172 params->assoc_value); in sctp_setsockopt_scheduler()
4187 int retval = -EINVAL; in sctp_setsockopt_scheduler_value()
4192 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_scheduler_value()
4193 if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC && in sctp_setsockopt_scheduler_value()
4198 retval = sctp_sched_set_value(asoc, params->stream_id, in sctp_setsockopt_scheduler_value()
4199 params->stream_value, GFP_KERNEL); in sctp_setsockopt_scheduler_value()
4205 list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) { in sctp_setsockopt_scheduler_value()
4206 int ret = sctp_sched_set_value(asoc, params->stream_id, in sctp_setsockopt_scheduler_value()
4207 params->stream_value, in sctp_setsockopt_scheduler_value()
4221 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_interleaving_supported() local
4225 return -EINVAL; in sctp_setsockopt_interleaving_supported()
4227 asoc = sctp_id2assoc(sk, p->assoc_id); in sctp_setsockopt_interleaving_supported()
4228 if (!asoc && p->assoc_id != SCTP_FUTURE_ASSOC && sctp_style(sk, UDP)) in sctp_setsockopt_interleaving_supported()
4229 return -EINVAL; in sctp_setsockopt_interleaving_supported()
4231 if (!sock_net(sk)->sctp.intl_enable || !sp->frag_interleave) { in sctp_setsockopt_interleaving_supported()
4232 return -EPERM; in sctp_setsockopt_interleaving_supported()
4235 sp->ep->intl_enable = !!p->assoc_value; in sctp_setsockopt_interleaving_supported()
4243 return -EOPNOTSUPP; in sctp_setsockopt_reuse_port()
4245 if (sctp_sk(sk)->ep->base.bind_addr.port) in sctp_setsockopt_reuse_port()
4246 return -EFAULT; in sctp_setsockopt_reuse_port()
4249 return -EINVAL; in sctp_setsockopt_reuse_port()
4251 sctp_sk(sk)->reuse = !!*val; in sctp_setsockopt_reuse_port()
4261 sctp_ulpevent_type_set(&asoc->subscribe, param->se_type, param->se_on); in sctp_assoc_ulpevent_type_set()
4263 if (param->se_type == SCTP_SENDER_DRY_EVENT && param->se_on) { in sctp_assoc_ulpevent_type_set()
4264 if (sctp_outq_is_empty(&asoc->outqueue)) { in sctp_assoc_ulpevent_type_set()
4268 return -ENOMEM; in sctp_assoc_ulpevent_type_set()
4270 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_assoc_ulpevent_type_set()
4280 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_event() local
4285 return -EINVAL; in sctp_setsockopt_event()
4287 if (param->se_type < SCTP_SN_TYPE_BASE || in sctp_setsockopt_event()
4288 param->se_type > SCTP_SN_TYPE_MAX) in sctp_setsockopt_event()
4289 return -EINVAL; in sctp_setsockopt_event()
4291 asoc = sctp_id2assoc(sk, param->se_assoc_id); in sctp_setsockopt_event()
4292 if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_event()
4294 return -EINVAL; in sctp_setsockopt_event()
4300 param->se_assoc_id = SCTP_FUTURE_ASSOC; in sctp_setsockopt_event()
4302 if (param->se_assoc_id == SCTP_FUTURE_ASSOC || in sctp_setsockopt_event()
4303 param->se_assoc_id == SCTP_ALL_ASSOC) in sctp_setsockopt_event()
4304 sctp_ulpevent_type_set(&sp->subscribe, in sctp_setsockopt_event()
4305 param->se_type, param->se_on); in sctp_setsockopt_event()
4307 if (param->se_assoc_id == SCTP_CURRENT_ASSOC || in sctp_setsockopt_event()
4308 param->se_assoc_id == SCTP_ALL_ASSOC) { in sctp_setsockopt_event()
4309 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_event()
4326 int retval = -EINVAL; in sctp_setsockopt_asconf_supported()
4331 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_asconf_supported()
4332 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_asconf_supported()
4336 ep = sctp_sk(sk)->ep; in sctp_setsockopt_asconf_supported()
4337 ep->asconf_enable = !!params->assoc_value; in sctp_setsockopt_asconf_supported()
4339 if (ep->asconf_enable && ep->auth_enable) { in sctp_setsockopt_asconf_supported()
4356 int retval = -EINVAL; in sctp_setsockopt_auth_supported()
4361 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_auth_supported()
4362 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_auth_supported()
4366 ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_supported()
4367 if (params->assoc_value) { in sctp_setsockopt_auth_supported()
4371 if (ep->asconf_enable) { in sctp_setsockopt_auth_supported()
4377 ep->auth_enable = !!params->assoc_value; in sctp_setsockopt_auth_supported()
4389 int retval = -EINVAL; in sctp_setsockopt_ecn_supported()
4394 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_ecn_supported()
4395 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_ecn_supported()
4399 sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value; in sctp_setsockopt_ecn_supported()
4411 int retval = -EINVAL; in sctp_setsockopt_pf_expose()
4416 if (params->assoc_value > SCTP_PF_EXPOSE_MAX) in sctp_setsockopt_pf_expose()
4419 asoc = sctp_id2assoc(sk, params->assoc_id); in sctp_setsockopt_pf_expose()
4420 if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_pf_expose()
4425 asoc->pf_expose = params->assoc_value; in sctp_setsockopt_pf_expose()
4427 sctp_sk(sk)->pf_expose = params->assoc_value; in sctp_setsockopt_pf_expose()
4447 * sd - the socket descript.
4448 * level - set to IPPROTO_SCTP for all SCTP options.
4449 * optname - the option name.
4450 * optval - the buffer to store the value of the option.
4451 * optlen - the size of the buffer.
4465 * are at all well-founded. in sctp_setsockopt()
4468 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_setsockopt()
4470 return af->setsockopt(sk, level, optname, optval, optlen); in sctp_setsockopt()
4658 retval = -ENOPROTOOPT; in sctp_setsockopt()
4667 /* API 3.1.6 connect() - UDP Style Syntax
4687 int err = -EINVAL; in sctp_connect()
4694 af = sctp_get_af_specific(addr->sa_family); in sctp_connect()
4695 if (af && addr_len >= af->sockaddr_len) in sctp_connect()
4696 err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL); in sctp_connect()
4705 if (addr_len < sizeof(uaddr->sa_family)) in sctp_inet_connect()
4706 return -EINVAL; in sctp_inet_connect()
4708 if (uaddr->sa_family == AF_UNSPEC) in sctp_inet_connect()
4709 return -EOPNOTSUPP; in sctp_inet_connect()
4711 return sctp_connect(sock->sk, uaddr, addr_len, flags); in sctp_inet_connect()
4717 return -EOPNOTSUPP; /* STUB */ in sctp_disconnect()
4720 /* 4.1.4 accept() - TCP Style Syntax
4729 struct sctp_sock *sp; in sctp_accept() local
4738 sp = sctp_sk(sk); in sctp_accept()
4739 ep = sp->ep; in sctp_accept()
4742 error = -EOPNOTSUPP; in sctp_accept()
4747 error = -EINVAL; in sctp_accept()
4760 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); in sctp_accept()
4762 newsk = sp->pf->create_accept_sk(sk, asoc, kern); in sctp_accept()
4764 error = -ENOMEM; in sctp_accept()
4786 int rc = -ENOTCONN; in sctp_ioctl()
4791 * SEQPACKET-style sockets in LISTENING state are valid, for in sctp_ioctl()
4792 * SCTP, so only discard TCP-style sockets in LISTENING state. in sctp_ioctl()
4802 skb = skb_peek(&sk->sk_receive_queue); in sctp_ioctl()
4808 amount = skb->len; in sctp_ioctl()
4814 rc = -ENOIOCTLCMD; in sctp_ioctl()
4823 * initialized the SCTP-specific portion of the sock.
4824 * The sock structure should already be zero-filled memory.
4829 struct sctp_sock *sp; in sctp_init_sock() local
4833 sp = sctp_sk(sk); in sctp_init_sock()
4836 switch (sk->sk_type) { in sctp_init_sock()
4838 sp->type = SCTP_SOCKET_UDP; in sctp_init_sock()
4841 sp->type = SCTP_SOCKET_TCP; in sctp_init_sock()
4844 return -ESOCKTNOSUPPORT; in sctp_init_sock()
4847 sk->sk_gso_type = SKB_GSO_SCTP; in sctp_init_sock()
4852 sp->default_stream = 0; in sctp_init_sock()
4853 sp->default_ppid = 0; in sctp_init_sock()
4854 sp->default_flags = 0; in sctp_init_sock()
4855 sp->default_context = 0; in sctp_init_sock()
4856 sp->default_timetolive = 0; in sctp_init_sock()
4858 sp->default_rcv_context = 0; in sctp_init_sock()
4859 sp->max_burst = net->sctp.max_burst; in sctp_init_sock()
4861 sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg; in sctp_init_sock()
4867 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; in sctp_init_sock()
4868 sp->initmsg.sinit_max_instreams = sctp_max_instreams; in sctp_init_sock()
4869 sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init; in sctp_init_sock()
4870 sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max; in sctp_init_sock()
4875 sp->rtoinfo.srto_initial = net->sctp.rto_initial; in sctp_init_sock()
4876 sp->rtoinfo.srto_max = net->sctp.rto_max; in sctp_init_sock()
4877 sp->rtoinfo.srto_min = net->sctp.rto_min; in sctp_init_sock()
4882 sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association; in sctp_init_sock()
4883 sp->assocparams.sasoc_number_peer_destinations = 0; in sctp_init_sock()
4884 sp->assocparams.sasoc_peer_rwnd = 0; in sctp_init_sock()
4885 sp->assocparams.sasoc_local_rwnd = 0; in sctp_init_sock()
4886 sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life; in sctp_init_sock()
4891 sp->subscribe = 0; in sctp_init_sock()
4896 sp->hbinterval = net->sctp.hb_interval; in sctp_init_sock()
4897 sp->pathmaxrxt = net->sctp.max_retrans_path; in sctp_init_sock()
4898 sp->pf_retrans = net->sctp.pf_retrans; in sctp_init_sock()
4899 sp->ps_retrans = net->sctp.ps_retrans; in sctp_init_sock()
4900 sp->pf_expose = net->sctp.pf_expose; in sctp_init_sock()
4901 sp->pathmtu = 0; /* allow default discovery */ in sctp_init_sock()
4902 sp->sackdelay = net->sctp.sack_timeout; in sctp_init_sock()
4903 sp->sackfreq = 2; in sctp_init_sock()
4904 sp->param_flags = SPP_HB_ENABLE | in sctp_init_sock()
4907 sp->default_ss = SCTP_SS_DEFAULT; in sctp_init_sock()
4912 sp->disable_fragments = 0; in sctp_init_sock()
4915 sp->nodelay = 0; in sctp_init_sock()
4917 sp->recvrcvinfo = 0; in sctp_init_sock()
4918 sp->recvnxtinfo = 0; in sctp_init_sock()
4921 sp->v4mapped = 1; in sctp_init_sock()
4923 /* Auto-close idle associations after the configured in sctp_init_sock()
4926 * for UDP-style sockets only. in sctp_init_sock()
4928 sp->autoclose = 0; in sctp_init_sock()
4931 sp->user_frag = 0; in sctp_init_sock()
4933 sp->adaptation_ind = 0; in sctp_init_sock()
4935 sp->pf = sctp_get_pf_specific(sk->sk_family); in sctp_init_sock()
4938 atomic_set(&sp->pd_mode, 0); in sctp_init_sock()
4939 skb_queue_head_init(&sp->pd_lobby); in sctp_init_sock()
4940 sp->frag_interleave = 0; in sctp_init_sock()
4944 * be useful for storing pre-connect address information. in sctp_init_sock()
4946 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL); in sctp_init_sock()
4947 if (!sp->ep) in sctp_init_sock()
4948 return -ENOMEM; in sctp_init_sock()
4950 sp->hmac = NULL; in sctp_init_sock()
4952 sk->sk_destruct = sctp_destruct_sock; in sctp_init_sock()
4958 sock_prot_inuse_add(net, sk->sk_prot, 1); in sctp_init_sock()
4966 * sock_net(sk)->sctp.addr_wq_lock held if sp->do_auto_asconf is true
4970 struct sctp_sock *sp; in sctp_destroy_sock() local
4975 sp = sctp_sk(sk); in sctp_destroy_sock()
4979 if (sp->ep == NULL) in sctp_destroy_sock()
4982 if (sp->do_auto_asconf) { in sctp_destroy_sock()
4983 sp->do_auto_asconf = 0; in sctp_destroy_sock()
4984 list_del(&sp->auto_asconf_list); in sctp_destroy_sock()
4986 sctp_endpoint_free(sp->ep); in sctp_destroy_sock()
4989 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in sctp_destroy_sock()
4996 struct sctp_sock *sp = sctp_sk(sk); in sctp_destruct_sock() local
4999 crypto_free_shash(sp->hmac); in sctp_destruct_sock()
5004 /* API 4.1.7 shutdown() - TCP Style Syntax
5007 * sd - the socket descriptor of the association to be closed.
5008 * how - Specifies the type of shutdown. The values are
5028 ep = sctp_sk(sk)->ep; in sctp_shutdown()
5029 if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) { in sctp_shutdown()
5033 asoc = list_entry(ep->asocs.next, in sctp_shutdown()
5048 struct sctp_sock *sp = sctp_sk(sk); in sctp_get_sctp_info() local
5050 info->sctpi_s_autoclose = sp->autoclose; in sctp_get_sctp_info()
5051 info->sctpi_s_adaptation_ind = sp->adaptation_ind; in sctp_get_sctp_info()
5052 info->sctpi_s_pd_point = sp->pd_point; in sctp_get_sctp_info()
5053 info->sctpi_s_nodelay = sp->nodelay; in sctp_get_sctp_info()
5054 info->sctpi_s_disable_fragments = sp->disable_fragments; in sctp_get_sctp_info()
5055 info->sctpi_s_v4mapped = sp->v4mapped; in sctp_get_sctp_info()
5056 info->sctpi_s_frag_interleave = sp->frag_interleave; in sctp_get_sctp_info()
5057 info->sctpi_s_type = sp->type; in sctp_get_sctp_info()
5062 info->sctpi_tag = asoc->c.my_vtag; in sctp_get_sctp_info()
5063 info->sctpi_state = asoc->state; in sctp_get_sctp_info()
5064 info->sctpi_rwnd = asoc->a_rwnd; in sctp_get_sctp_info()
5065 info->sctpi_unackdata = asoc->unack_data; in sctp_get_sctp_info()
5066 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_get_sctp_info()
5067 info->sctpi_instrms = asoc->stream.incnt; in sctp_get_sctp_info()
5068 info->sctpi_outstrms = asoc->stream.outcnt; in sctp_get_sctp_info()
5069 list_for_each(pos, &asoc->base.inqueue.in_chunk_list) in sctp_get_sctp_info()
5070 info->sctpi_inqueue++; in sctp_get_sctp_info()
5071 list_for_each(pos, &asoc->outqueue.out_chunk_list) in sctp_get_sctp_info()
5072 info->sctpi_outqueue++; in sctp_get_sctp_info()
5073 info->sctpi_overall_error = asoc->overall_error_count; in sctp_get_sctp_info()
5074 info->sctpi_max_burst = asoc->max_burst; in sctp_get_sctp_info()
5075 info->sctpi_maxseg = asoc->frag_point; in sctp_get_sctp_info()
5076 info->sctpi_peer_rwnd = asoc->peer.rwnd; in sctp_get_sctp_info()
5077 info->sctpi_peer_tag = asoc->c.peer_vtag; in sctp_get_sctp_info()
5079 mask = asoc->peer.ecn_capable << 1; in sctp_get_sctp_info()
5080 mask = (mask | asoc->peer.ipv4_address) << 1; in sctp_get_sctp_info()
5081 mask = (mask | asoc->peer.ipv6_address) << 1; in sctp_get_sctp_info()
5082 mask = (mask | asoc->peer.hostname_address) << 1; in sctp_get_sctp_info()
5083 mask = (mask | asoc->peer.asconf_capable) << 1; in sctp_get_sctp_info()
5084 mask = (mask | asoc->peer.prsctp_capable) << 1; in sctp_get_sctp_info()
5085 mask = (mask | asoc->peer.auth_capable); in sctp_get_sctp_info()
5086 info->sctpi_peer_capable = mask; in sctp_get_sctp_info()
5087 mask = asoc->peer.sack_needed << 1; in sctp_get_sctp_info()
5088 mask = (mask | asoc->peer.sack_generation) << 1; in sctp_get_sctp_info()
5089 mask = (mask | asoc->peer.zero_window_announced); in sctp_get_sctp_info()
5090 info->sctpi_peer_sack = mask; in sctp_get_sctp_info()
5092 info->sctpi_isacks = asoc->stats.isacks; in sctp_get_sctp_info()
5093 info->sctpi_osacks = asoc->stats.osacks; in sctp_get_sctp_info()
5094 info->sctpi_opackets = asoc->stats.opackets; in sctp_get_sctp_info()
5095 info->sctpi_ipackets = asoc->stats.ipackets; in sctp_get_sctp_info()
5096 info->sctpi_rtxchunks = asoc->stats.rtxchunks; in sctp_get_sctp_info()
5097 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns; in sctp_get_sctp_info()
5098 info->sctpi_idupchunks = asoc->stats.idupchunks; in sctp_get_sctp_info()
5099 info->sctpi_gapcnt = asoc->stats.gapcnt; in sctp_get_sctp_info()
5100 info->sctpi_ouodchunks = asoc->stats.ouodchunks; in sctp_get_sctp_info()
5101 info->sctpi_iuodchunks = asoc->stats.iuodchunks; in sctp_get_sctp_info()
5102 info->sctpi_oodchunks = asoc->stats.oodchunks; in sctp_get_sctp_info()
5103 info->sctpi_iodchunks = asoc->stats.iodchunks; in sctp_get_sctp_info()
5104 info->sctpi_octrlchunks = asoc->stats.octrlchunks; in sctp_get_sctp_info()
5105 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks; in sctp_get_sctp_info()
5107 prim = asoc->peer.primary_path; in sctp_get_sctp_info()
5108 memcpy(&info->sctpi_p_address, &prim->ipaddr, sizeof(prim->ipaddr)); in sctp_get_sctp_info()
5109 info->sctpi_p_state = prim->state; in sctp_get_sctp_info()
5110 info->sctpi_p_cwnd = prim->cwnd; in sctp_get_sctp_info()
5111 info->sctpi_p_srtt = prim->srtt; in sctp_get_sctp_info()
5112 info->sctpi_p_rto = jiffies_to_msecs(prim->rto); in sctp_get_sctp_info()
5113 info->sctpi_p_hbinterval = prim->hbinterval; in sctp_get_sctp_info()
5114 info->sctpi_p_pathmaxrxt = prim->pathmaxrxt; in sctp_get_sctp_info()
5115 info->sctpi_p_sackdelay = jiffies_to_msecs(prim->sackdelay); in sctp_get_sctp_info()
5116 info->sctpi_p_ssthresh = prim->ssthresh; in sctp_get_sctp_info()
5117 info->sctpi_p_partial_bytes_acked = prim->partial_bytes_acked; in sctp_get_sctp_info()
5118 info->sctpi_p_flight_size = prim->flight_size; in sctp_get_sctp_info()
5119 info->sctpi_p_error = prim->error_count; in sctp_get_sctp_info()
5147 if (PTR_ERR(t) == -EAGAIN) in sctp_transport_get_next()
5155 if (net_eq(t->asoc->base.net, net) && in sctp_transport_get_next()
5156 t->asoc->peer.primary_path == t) in sctp_transport_get_next()
5175 if (!--pos) in sctp_transport_get_idx()
5192 read_lock_bh(&head->lock); in sctp_for_each_endpoint()
5193 sctp_for_each_hentry(epb, &head->chain) { in sctp_for_each_endpoint()
5198 read_unlock_bh(&head->lock); in sctp_for_each_endpoint()
5217 return -ENOENT; in sctp_transport_lookup_process()
5240 ep = tsp->asoc->ep; in sctp_transport_traverse_process()
5272 * receipt. This information is read-only.
5285 retval = -EINVAL; in sctp_getsockopt_sctp_status()
5291 retval = -EFAULT; in sctp_getsockopt_sctp_status()
5298 retval = -EINVAL; in sctp_getsockopt_sctp_status()
5302 transport = asoc->peer.primary_path; in sctp_getsockopt_sctp_status()
5306 status.sstat_rwnd = asoc->peer.rwnd; in sctp_getsockopt_sctp_status()
5307 status.sstat_unackdata = asoc->unack_data; in sctp_getsockopt_sctp_status()
5309 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_getsockopt_sctp_status()
5310 status.sstat_instrms = asoc->stream.incnt; in sctp_getsockopt_sctp_status()
5311 status.sstat_outstrms = asoc->stream.outcnt; in sctp_getsockopt_sctp_status()
5312 status.sstat_fragmentation_point = asoc->frag_point; in sctp_getsockopt_sctp_status()
5313 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_sctp_status()
5314 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr, in sctp_getsockopt_sctp_status()
5315 transport->af_specific->sockaddr_len); in sctp_getsockopt_sctp_status()
5316 /* Map ipv4 address into v4-mapped-on-v6 address. */ in sctp_getsockopt_sctp_status()
5317 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_getsockopt_sctp_status()
5319 status.sstat_primary.spinfo_state = transport->state; in sctp_getsockopt_sctp_status()
5320 status.sstat_primary.spinfo_cwnd = transport->cwnd; in sctp_getsockopt_sctp_status()
5321 status.sstat_primary.spinfo_srtt = transport->srtt; in sctp_getsockopt_sctp_status()
5322 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto); in sctp_getsockopt_sctp_status()
5323 status.sstat_primary.spinfo_mtu = transport->pathmtu; in sctp_getsockopt_sctp_status()
5329 retval = -EFAULT; in sctp_getsockopt_sctp_status()
5338 retval = -EFAULT; in sctp_getsockopt_sctp_status()
5352 * read-only.
5363 retval = -EINVAL; in sctp_getsockopt_peer_addr_info()
5369 retval = -EFAULT; in sctp_getsockopt_peer_addr_info()
5376 retval = -EINVAL; in sctp_getsockopt_peer_addr_info()
5380 if (transport->state == SCTP_PF && in sctp_getsockopt_peer_addr_info()
5381 transport->asoc->pf_expose == SCTP_PF_EXPOSE_DISABLE) { in sctp_getsockopt_peer_addr_info()
5382 retval = -EACCES; in sctp_getsockopt_peer_addr_info()
5386 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_peer_addr_info()
5387 pinfo.spinfo_state = transport->state; in sctp_getsockopt_peer_addr_info()
5388 pinfo.spinfo_cwnd = transport->cwnd; in sctp_getsockopt_peer_addr_info()
5389 pinfo.spinfo_srtt = transport->srtt; in sctp_getsockopt_peer_addr_info()
5390 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto); in sctp_getsockopt_peer_addr_info()
5391 pinfo.spinfo_mtu = transport->pathmtu; in sctp_getsockopt_peer_addr_info()
5397 retval = -EFAULT; in sctp_getsockopt_peer_addr_info()
5402 retval = -EFAULT; in sctp_getsockopt_peer_addr_info()
5423 return -EINVAL; in sctp_getsockopt_disable_fragments()
5426 val = (sctp_sk(sk)->disable_fragments == 1); in sctp_getsockopt_disable_fragments()
5428 return -EFAULT; in sctp_getsockopt_disable_fragments()
5430 return -EFAULT; in sctp_getsockopt_disable_fragments()
5447 return -EINVAL; in sctp_getsockopt_events()
5451 return -EFAULT; in sctp_getsockopt_events()
5454 sn_type[i] = sctp_ulpevent_type_enabled(sctp_sk(sk)->subscribe, in sctp_getsockopt_events()
5458 return -EFAULT; in sctp_getsockopt_events()
5465 * This socket option is applicable to the UDP-style socket only. When
5476 /* Applicable to UDP-style socket only */ in sctp_getsockopt_autoclose()
5478 return -EOPNOTSUPP; in sctp_getsockopt_autoclose()
5480 return -EINVAL; in sctp_getsockopt_autoclose()
5483 return -EFAULT; in sctp_getsockopt_autoclose()
5484 if (put_user(sctp_sk(sk)->autoclose, (int __user *)optval)) in sctp_getsockopt_autoclose()
5485 return -EFAULT; in sctp_getsockopt_autoclose()
5493 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_peeloff() local
5498 if (!net_eq(current->nsproxy->net_ns, sock_net(sk))) in sctp_do_peeloff()
5499 return -EINVAL; in sctp_do_peeloff()
5502 return -EINVAL; in sctp_do_peeloff()
5504 /* An association cannot be branched off from an already peeled-off in sctp_do_peeloff()
5508 return -EINVAL; in sctp_do_peeloff()
5511 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); in sctp_do_peeloff()
5515 sctp_copy_sock(sock->sk, sk, asoc); in sctp_do_peeloff()
5517 /* Make peeled-off sockets more like 1-1 accepted sockets. in sctp_do_peeloff()
5521 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk); in sctp_do_peeloff()
5522 sp->pf->copy_ip_options(sk, sock->sk); in sctp_do_peeloff()
5527 err = sctp_sock_migrate(sk, sock->sk, asoc, in sctp_do_peeloff()
5546 retval = sctp_do_peeloff(sk, peeloff->associd, &newsock); in sctp_getsockopt_peeloff_common()
5565 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk, in sctp_getsockopt_peeloff_common()
5568 peeloff->sd = retval; in sctp_getsockopt_peeloff_common()
5571 (*newfile)->f_flags |= O_NONBLOCK; in sctp_getsockopt_peeloff_common()
5583 return -EINVAL; in sctp_getsockopt_peeloff()
5586 return -EFAULT; in sctp_getsockopt_peeloff()
5596 return -EFAULT; in sctp_getsockopt_peeloff()
5602 return -EFAULT; in sctp_getsockopt_peeloff()
5617 return -EINVAL; in sctp_getsockopt_peeloff_flags()
5620 return -EFAULT; in sctp_getsockopt_peeloff_flags()
5631 return -EFAULT; in sctp_getsockopt_peeloff_flags()
5637 return -EFAULT; in sctp_getsockopt_peeloff_flags()
5663 * spp_assoc_id - (one-to-many style socket) This is filled in the
5666 * spp_address - This specifies which address is of interest.
5667 * spp_hbinterval - This contains the value of the heartbeat interval,
5671 * spp_pathmaxrxt - This contains the maximum number of
5676 * spp_pathmtu - When Path MTU discovery is disabled the value
5682 * spp_sackdelay - When delayed sack is enabled, this value specifies
5690 * spp_flags - These flags are used to control various features
5694 * SPP_HB_ENABLE - Enable heartbeats on the
5699 * SPP_HB_DISABLE - Disable heartbeats on the
5708 * SPP_HB_DEMAND - Request a user initiated heartbeat
5711 * SPP_PMTUD_ENABLE - This field will enable PMTU
5716 * SPP_PMTUD_DISABLE - This field will disable PMTU
5724 * SPP_SACKDELAY_ENABLE - Setting this flag turns
5730 * SPP_SACKDELAY_DISABLE - Setting this flag turns
5748 * returned. For non-IPv6 sockets, this flag will be left
5765 * - This field is used in conjunction with the
5768 * label. This setting has precedence over any IPv6-layer
5771 * spp_dscp - This field is used in conjunction with the SPP_DSCP flag
5774 * IPv4- or IPv6- layer setting.
5782 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addr_params() local
5791 return -EINVAL; in sctp_getsockopt_peer_addr_params()
5794 return -EFAULT; in sctp_getsockopt_peer_addr_params()
5804 return -EINVAL; in sctp_getsockopt_peer_addr_params()
5816 return -EINVAL; in sctp_getsockopt_peer_addr_params()
5821 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval); in sctp_getsockopt_peer_addr_params()
5822 params.spp_pathmtu = trans->pathmtu; in sctp_getsockopt_peer_addr_params()
5823 params.spp_pathmaxrxt = trans->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5824 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay); in sctp_getsockopt_peer_addr_params()
5826 /*draft-11 doesn't say what to return in spp_flags*/ in sctp_getsockopt_peer_addr_params()
5827 params.spp_flags = trans->param_flags; in sctp_getsockopt_peer_addr_params()
5828 if (trans->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5829 params.spp_ipv6_flowlabel = trans->flowlabel & in sctp_getsockopt_peer_addr_params()
5833 if (trans->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5834 params.spp_dscp = trans->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
5839 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval); in sctp_getsockopt_peer_addr_params()
5840 params.spp_pathmtu = asoc->pathmtu; in sctp_getsockopt_peer_addr_params()
5841 params.spp_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5842 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_peer_addr_params()
5844 /*draft-11 doesn't say what to return in spp_flags*/ in sctp_getsockopt_peer_addr_params()
5845 params.spp_flags = asoc->param_flags; in sctp_getsockopt_peer_addr_params()
5846 if (asoc->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5847 params.spp_ipv6_flowlabel = asoc->flowlabel & in sctp_getsockopt_peer_addr_params()
5851 if (asoc->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5852 params.spp_dscp = asoc->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
5857 params.spp_hbinterval = sp->hbinterval; in sctp_getsockopt_peer_addr_params()
5858 params.spp_pathmtu = sp->pathmtu; in sctp_getsockopt_peer_addr_params()
5859 params.spp_sackdelay = sp->sackdelay; in sctp_getsockopt_peer_addr_params()
5860 params.spp_pathmaxrxt = sp->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5862 /*draft-11 doesn't say what to return in spp_flags*/ in sctp_getsockopt_peer_addr_params()
5863 params.spp_flags = sp->param_flags; in sctp_getsockopt_peer_addr_params()
5864 if (sp->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5865 params.spp_ipv6_flowlabel = sp->flowlabel & in sctp_getsockopt_peer_addr_params()
5869 if (sp->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5870 params.spp_dscp = sp->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
5876 return -EFAULT; in sctp_getsockopt_peer_addr_params()
5879 return -EFAULT; in sctp_getsockopt_peer_addr_params()
5892 * values. If the assoc_id field is non-zero, then the set or get
5904 * sack_assoc_id - This parameter, indicates which association the user
5909 * sack_delay - This parameter contains the number of milliseconds that
5914 * sack_freq - This parameter contains the number of packets that must
5925 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_delayed_ack() local
5931 return -EFAULT; in sctp_getsockopt_delayed_ack()
5937 current->comm, task_pid_nr(current)); in sctp_getsockopt_delayed_ack()
5939 return -EFAULT; in sctp_getsockopt_delayed_ack()
5941 return -EINVAL; in sctp_getsockopt_delayed_ack()
5950 return -EINVAL; in sctp_getsockopt_delayed_ack()
5954 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) { in sctp_getsockopt_delayed_ack()
5955 params.sack_delay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_delayed_ack()
5956 params.sack_freq = asoc->sackfreq; in sctp_getsockopt_delayed_ack()
5964 if (sp->param_flags & SPP_SACKDELAY_ENABLE) { in sctp_getsockopt_delayed_ack()
5965 params.sack_delay = sp->sackdelay; in sctp_getsockopt_delayed_ack()
5966 params.sack_freq = sp->sackfreq; in sctp_getsockopt_delayed_ack()
5974 return -EFAULT; in sctp_getsockopt_delayed_ack()
5977 return -EFAULT; in sctp_getsockopt_delayed_ack()
5989 * socket (for UDP-style sockets only future associations are effected
5990 * by the change). With TCP-style sockets, this option is inherited by
5996 return -EINVAL; in sctp_getsockopt_initmsg()
5999 return -EFAULT; in sctp_getsockopt_initmsg()
6000 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) in sctp_getsockopt_initmsg()
6001 return -EFAULT; in sctp_getsockopt_initmsg()
6015 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addrs() local
6021 return -EINVAL; in sctp_getsockopt_peer_addrs()
6024 return -EFAULT; in sctp_getsockopt_peer_addrs()
6026 /* For UDP-style sockets, id specifies the association to query. */ in sctp_getsockopt_peer_addrs()
6029 return -EINVAL; in sctp_getsockopt_peer_addrs()
6032 space_left = len - offsetof(struct sctp_getaddrs, addrs); in sctp_getsockopt_peer_addrs()
6034 list_for_each_entry(from, &asoc->peer.transport_addr_list, in sctp_getsockopt_peer_addrs()
6036 memcpy(&temp, &from->ipaddr, sizeof(temp)); in sctp_getsockopt_peer_addrs()
6037 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_peer_addrs()
6038 ->addr_to_user(sp, &temp); in sctp_getsockopt_peer_addrs()
6040 return -ENOMEM; in sctp_getsockopt_peer_addrs()
6042 return -EFAULT; in sctp_getsockopt_peer_addrs()
6045 space_left -= addrlen; in sctp_getsockopt_peer_addrs()
6048 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) in sctp_getsockopt_peer_addrs()
6049 return -EFAULT; in sctp_getsockopt_peer_addrs()
6050 bytes_copied = ((char __user *)to) - optval; in sctp_getsockopt_peer_addrs()
6052 return -EFAULT; in sctp_getsockopt_peer_addrs()
6067 list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) { in sctp_copy_laddrs()
6068 if (!addr->valid) in sctp_copy_laddrs()
6071 if ((PF_INET == sk->sk_family) && in sctp_copy_laddrs()
6072 (AF_INET6 == addr->a.sa.sa_family)) in sctp_copy_laddrs()
6074 if ((PF_INET6 == sk->sk_family) && in sctp_copy_laddrs()
6076 (AF_INET == addr->a.sa.sa_family)) in sctp_copy_laddrs()
6078 memcpy(&temp, &addr->a, sizeof(temp)); in sctp_copy_laddrs()
6082 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_copy_laddrs()
6083 ->addr_to_user(sctp_sk(sk), &temp); in sctp_copy_laddrs()
6086 cnt = -ENOMEM; in sctp_copy_laddrs()
6093 space_left -= addrlen; in sctp_copy_laddrs()
6112 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_local_addrs() local
6121 return -EINVAL; in sctp_getsockopt_local_addrs()
6124 return -EFAULT; in sctp_getsockopt_local_addrs()
6127 * For UDP-style sockets, id specifies the association to query. in sctp_getsockopt_local_addrs()
6133 bp = &sctp_sk(sk)->ep->base.bind_addr; in sctp_getsockopt_local_addrs()
6137 return -EINVAL; in sctp_getsockopt_local_addrs()
6138 bp = &asoc->base.bind_addr; in sctp_getsockopt_local_addrs()
6142 space_left = len - offsetof(struct sctp_getaddrs, addrs); in sctp_getsockopt_local_addrs()
6146 return -ENOMEM; in sctp_getsockopt_local_addrs()
6151 if (sctp_list_single_entry(&bp->address_list)) { in sctp_getsockopt_local_addrs()
6152 addr = list_entry(bp->address_list.next, in sctp_getsockopt_local_addrs()
6154 if (sctp_is_any(sk, &addr->a)) { in sctp_getsockopt_local_addrs()
6155 cnt = sctp_copy_laddrs(sk, bp->port, addrs, in sctp_getsockopt_local_addrs()
6170 list_for_each_entry(addr, &bp->address_list, list) { in sctp_getsockopt_local_addrs()
6171 memcpy(&temp, &addr->a, sizeof(temp)); in sctp_getsockopt_local_addrs()
6172 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_local_addrs()
6173 ->addr_to_user(sp, &temp); in sctp_getsockopt_local_addrs()
6175 err = -ENOMEM; /*fixme: right error?*/ in sctp_getsockopt_local_addrs()
6182 space_left -= addrlen; in sctp_getsockopt_local_addrs()
6187 err = -EFAULT; in sctp_getsockopt_local_addrs()
6190 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) { in sctp_getsockopt_local_addrs()
6191 err = -EFAULT; in sctp_getsockopt_local_addrs()
6198 err = -EFAULT; in sctp_getsockopt_local_addrs()
6215 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_primary_addr() local
6218 return -EINVAL; in sctp_getsockopt_primary_addr()
6223 return -EFAULT; in sctp_getsockopt_primary_addr()
6227 return -EINVAL; in sctp_getsockopt_primary_addr()
6229 if (!asoc->peer.primary_path) in sctp_getsockopt_primary_addr()
6230 return -ENOTCONN; in sctp_getsockopt_primary_addr()
6232 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, in sctp_getsockopt_primary_addr()
6233 asoc->peer.primary_path->af_specific->sockaddr_len); in sctp_getsockopt_primary_addr()
6235 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp, in sctp_getsockopt_primary_addr()
6239 return -EFAULT; in sctp_getsockopt_primary_addr()
6241 return -EFAULT; in sctp_getsockopt_primary_addr()
6250 * Indication parameter for all future INIT and INIT-ACK exchanges.
6258 return -EINVAL; in sctp_getsockopt_adaptation_layer()
6262 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind; in sctp_getsockopt_adaptation_layer()
6265 return -EFAULT; in sctp_getsockopt_adaptation_layer()
6267 return -EFAULT; in sctp_getsockopt_adaptation_layer()
6295 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_send_param() local
6300 return -EINVAL; in sctp_getsockopt_default_send_param()
6305 return -EFAULT; in sctp_getsockopt_default_send_param()
6310 return -EINVAL; in sctp_getsockopt_default_send_param()
6313 info.sinfo_stream = asoc->default_stream; in sctp_getsockopt_default_send_param()
6314 info.sinfo_flags = asoc->default_flags; in sctp_getsockopt_default_send_param()
6315 info.sinfo_ppid = asoc->default_ppid; in sctp_getsockopt_default_send_param()
6316 info.sinfo_context = asoc->default_context; in sctp_getsockopt_default_send_param()
6317 info.sinfo_timetolive = asoc->default_timetolive; in sctp_getsockopt_default_send_param()
6319 info.sinfo_stream = sp->default_stream; in sctp_getsockopt_default_send_param()
6320 info.sinfo_flags = sp->default_flags; in sctp_getsockopt_default_send_param()
6321 info.sinfo_ppid = sp->default_ppid; in sctp_getsockopt_default_send_param()
6322 info.sinfo_context = sp->default_context; in sctp_getsockopt_default_send_param()
6323 info.sinfo_timetolive = sp->default_timetolive; in sctp_getsockopt_default_send_param()
6327 return -EFAULT; in sctp_getsockopt_default_send_param()
6329 return -EFAULT; in sctp_getsockopt_default_send_param()
6341 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_sndinfo() local
6346 return -EINVAL; in sctp_getsockopt_default_sndinfo()
6351 return -EFAULT; in sctp_getsockopt_default_sndinfo()
6356 return -EINVAL; in sctp_getsockopt_default_sndinfo()
6359 info.snd_sid = asoc->default_stream; in sctp_getsockopt_default_sndinfo()
6360 info.snd_flags = asoc->default_flags; in sctp_getsockopt_default_sndinfo()
6361 info.snd_ppid = asoc->default_ppid; in sctp_getsockopt_default_sndinfo()
6362 info.snd_context = asoc->default_context; in sctp_getsockopt_default_sndinfo()
6364 info.snd_sid = sp->default_stream; in sctp_getsockopt_default_sndinfo()
6365 info.snd_flags = sp->default_flags; in sctp_getsockopt_default_sndinfo()
6366 info.snd_ppid = sp->default_ppid; in sctp_getsockopt_default_sndinfo()
6367 info.snd_context = sp->default_context; in sctp_getsockopt_default_sndinfo()
6371 return -EFAULT; in sctp_getsockopt_default_sndinfo()
6373 return -EFAULT; in sctp_getsockopt_default_sndinfo()
6382 * Turn on/off any Nagle-like algorithm. This means that packets are
6394 return -EINVAL; in sctp_getsockopt_nodelay()
6397 val = (sctp_sk(sk)->nodelay == 1); in sctp_getsockopt_nodelay()
6399 return -EFAULT; in sctp_getsockopt_nodelay()
6401 return -EFAULT; in sctp_getsockopt_nodelay()
6424 return -EINVAL; in sctp_getsockopt_rtoinfo()
6429 return -EFAULT; in sctp_getsockopt_rtoinfo()
6435 return -EINVAL; in sctp_getsockopt_rtoinfo()
6439 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); in sctp_getsockopt_rtoinfo()
6440 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); in sctp_getsockopt_rtoinfo()
6441 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); in sctp_getsockopt_rtoinfo()
6444 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_rtoinfo() local
6446 rtoinfo.srto_initial = sp->rtoinfo.srto_initial; in sctp_getsockopt_rtoinfo()
6447 rtoinfo.srto_max = sp->rtoinfo.srto_max; in sctp_getsockopt_rtoinfo()
6448 rtoinfo.srto_min = sp->rtoinfo.srto_min; in sctp_getsockopt_rtoinfo()
6452 return -EFAULT; in sctp_getsockopt_rtoinfo()
6455 return -EFAULT; in sctp_getsockopt_rtoinfo()
6482 return -EINVAL; in sctp_getsockopt_associnfo()
6487 return -EFAULT; in sctp_getsockopt_associnfo()
6493 return -EINVAL; in sctp_getsockopt_associnfo()
6497 assocparams.sasoc_asocmaxrxt = asoc->max_retrans; in sctp_getsockopt_associnfo()
6498 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd; in sctp_getsockopt_associnfo()
6499 assocparams.sasoc_local_rwnd = asoc->a_rwnd; in sctp_getsockopt_associnfo()
6500 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life); in sctp_getsockopt_associnfo()
6502 list_for_each(pos, &asoc->peer.transport_addr_list) { in sctp_getsockopt_associnfo()
6509 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_associnfo() local
6511 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt; in sctp_getsockopt_associnfo()
6512 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd; in sctp_getsockopt_associnfo()
6513 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd; in sctp_getsockopt_associnfo()
6515 sp->assocparams.sasoc_cookie_life; in sctp_getsockopt_associnfo()
6517 sp->assocparams. in sctp_getsockopt_associnfo()
6522 return -EFAULT; in sctp_getsockopt_associnfo()
6525 return -EFAULT; in sctp_getsockopt_associnfo()
6544 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_mappedv4() local
6547 return -EINVAL; in sctp_getsockopt_mappedv4()
6550 val = sp->v4mapped; in sctp_getsockopt_mappedv4()
6552 return -EFAULT; in sctp_getsockopt_mappedv4()
6554 return -EFAULT; in sctp_getsockopt_mappedv4()
6570 return -EINVAL; in sctp_getsockopt_context()
6575 return -EFAULT; in sctp_getsockopt_context()
6580 return -EINVAL; in sctp_getsockopt_context()
6582 params.assoc_value = asoc ? asoc->default_rcv_context in sctp_getsockopt_context()
6583 : sctp_sk(sk)->default_rcv_context; in sctp_getsockopt_context()
6586 return -EFAULT; in sctp_getsockopt_context()
6588 return -EFAULT; in sctp_getsockopt_context()
6613 * assoc_id: This parameter is ignored for one-to-one style sockets.
6614 * For one-to-many style sockets this parameter indicates which
6631 current->comm, task_pid_nr(current)); in sctp_getsockopt_maxseg()
6636 return -EFAULT; in sctp_getsockopt_maxseg()
6638 return -EINVAL; in sctp_getsockopt_maxseg()
6643 return -EINVAL; in sctp_getsockopt_maxseg()
6646 params.assoc_value = asoc->frag_point; in sctp_getsockopt_maxseg()
6648 params.assoc_value = sctp_sk(sk)->user_frag; in sctp_getsockopt_maxseg()
6651 return -EFAULT; in sctp_getsockopt_maxseg()
6654 return -EFAULT; in sctp_getsockopt_maxseg()
6657 return -EFAULT; in sctp_getsockopt_maxseg()
6673 return -EINVAL; in sctp_getsockopt_fragment_interleave()
6677 val = sctp_sk(sk)->frag_interleave; in sctp_getsockopt_fragment_interleave()
6679 return -EFAULT; in sctp_getsockopt_fragment_interleave()
6681 return -EFAULT; in sctp_getsockopt_fragment_interleave()
6697 return -EINVAL; in sctp_getsockopt_partial_delivery_point()
6701 val = sctp_sk(sk)->pd_point; in sctp_getsockopt_partial_delivery_point()
6703 return -EFAULT; in sctp_getsockopt_partial_delivery_point()
6705 return -EFAULT; in sctp_getsockopt_partial_delivery_point()
6726 current->comm, task_pid_nr(current)); in sctp_getsockopt_maxburst()
6731 return -EFAULT; in sctp_getsockopt_maxburst()
6733 return -EINVAL; in sctp_getsockopt_maxburst()
6738 return -EINVAL; in sctp_getsockopt_maxburst()
6740 params.assoc_value = asoc ? asoc->max_burst : sctp_sk(sk)->max_burst; in sctp_getsockopt_maxburst()
6744 return -EFAULT; in sctp_getsockopt_maxburst()
6747 return -EFAULT; in sctp_getsockopt_maxburst()
6757 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_hmac_ident()
6764 if (!ep->auth_enable) in sctp_getsockopt_hmac_ident()
6765 return -EACCES; in sctp_getsockopt_hmac_ident()
6767 hmacs = ep->auth_hmacs_list; in sctp_getsockopt_hmac_ident()
6768 data_len = ntohs(hmacs->param_hdr.length) - in sctp_getsockopt_hmac_ident()
6772 return -EINVAL; in sctp_getsockopt_hmac_ident()
6778 return -EFAULT; in sctp_getsockopt_hmac_ident()
6779 if (put_user(num_idents, &p->shmac_num_idents)) in sctp_getsockopt_hmac_ident()
6780 return -EFAULT; in sctp_getsockopt_hmac_ident()
6782 __u16 hmacid = ntohs(hmacs->hmac_ids[i]); in sctp_getsockopt_hmac_ident()
6784 if (copy_to_user(&p->shmac_idents[i], &hmacid, sizeof(__u16))) in sctp_getsockopt_hmac_ident()
6785 return -EFAULT; in sctp_getsockopt_hmac_ident()
6793 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_active_key()
6798 return -EINVAL; in sctp_getsockopt_active_key()
6802 return -EFAULT; in sctp_getsockopt_active_key()
6806 return -EINVAL; in sctp_getsockopt_active_key()
6809 if (!asoc->peer.auth_capable) in sctp_getsockopt_active_key()
6810 return -EACCES; in sctp_getsockopt_active_key()
6811 val.scact_keynumber = asoc->active_key_id; in sctp_getsockopt_active_key()
6813 if (!ep->auth_enable) in sctp_getsockopt_active_key()
6814 return -EACCES; in sctp_getsockopt_active_key()
6815 val.scact_keynumber = ep->active_key_id; in sctp_getsockopt_active_key()
6819 return -EFAULT; in sctp_getsockopt_active_key()
6821 return -EFAULT; in sctp_getsockopt_active_key()
6837 return -EINVAL; in sctp_getsockopt_peer_auth_chunks()
6840 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6842 to = p->gauth_chunks; in sctp_getsockopt_peer_auth_chunks()
6845 return -EINVAL; in sctp_getsockopt_peer_auth_chunks()
6847 if (!asoc->peer.auth_capable) in sctp_getsockopt_peer_auth_chunks()
6848 return -EACCES; in sctp_getsockopt_peer_auth_chunks()
6850 ch = asoc->peer.peer_chunks; in sctp_getsockopt_peer_auth_chunks()
6855 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr); in sctp_getsockopt_peer_auth_chunks()
6857 return -EINVAL; in sctp_getsockopt_peer_auth_chunks()
6859 if (copy_to_user(to, ch->chunks, num_chunks)) in sctp_getsockopt_peer_auth_chunks()
6860 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6864 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6865 if (put_user(num_chunks, &p->gauth_number_of_chunks)) in sctp_getsockopt_peer_auth_chunks()
6866 return -EFAULT; in sctp_getsockopt_peer_auth_chunks()
6873 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_local_auth_chunks()
6882 return -EINVAL; in sctp_getsockopt_local_auth_chunks()
6885 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
6887 to = p->gauth_chunks; in sctp_getsockopt_local_auth_chunks()
6891 return -EINVAL; in sctp_getsockopt_local_auth_chunks()
6894 if (!asoc->peer.auth_capable) in sctp_getsockopt_local_auth_chunks()
6895 return -EACCES; in sctp_getsockopt_local_auth_chunks()
6896 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks; in sctp_getsockopt_local_auth_chunks()
6898 if (!ep->auth_enable) in sctp_getsockopt_local_auth_chunks()
6899 return -EACCES; in sctp_getsockopt_local_auth_chunks()
6900 ch = ep->auth_chunk_list; in sctp_getsockopt_local_auth_chunks()
6905 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr); in sctp_getsockopt_local_auth_chunks()
6907 return -EINVAL; in sctp_getsockopt_local_auth_chunks()
6909 if (copy_to_user(to, ch->chunks, num_chunks)) in sctp_getsockopt_local_auth_chunks()
6910 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
6914 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
6915 if (put_user(num_chunks, &p->gauth_number_of_chunks)) in sctp_getsockopt_local_auth_chunks()
6916 return -EFAULT; in sctp_getsockopt_local_auth_chunks()
6924 * to a one-to-many style socket. The option value is an uint32_t.
6929 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_number() local
6934 return -EOPNOTSUPP; in sctp_getsockopt_assoc_number()
6937 return -EINVAL; in sctp_getsockopt_assoc_number()
6941 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_number()
6946 return -EFAULT; in sctp_getsockopt_assoc_number()
6948 return -EFAULT; in sctp_getsockopt_assoc_number()
6963 return -EINVAL; in sctp_getsockopt_auto_asconf()
6966 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk)) in sctp_getsockopt_auto_asconf()
6969 return -EFAULT; in sctp_getsockopt_auto_asconf()
6971 return -EFAULT; in sctp_getsockopt_auto_asconf()
6980 * the SCTP associations handled by a one-to-many style socket.
6985 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_ids() local
6991 return -EOPNOTSUPP; in sctp_getsockopt_assoc_ids()
6994 return -EINVAL; in sctp_getsockopt_assoc_ids()
6996 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
7001 return -EINVAL; in sctp_getsockopt_assoc_ids()
7007 return -ENOMEM; in sctp_getsockopt_assoc_ids()
7009 ids->gaids_number_of_ids = num; in sctp_getsockopt_assoc_ids()
7011 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
7012 ids->gaids_assoc_id[num++] = asoc->assoc_id; in sctp_getsockopt_assoc_ids()
7017 return -EFAULT; in sctp_getsockopt_assoc_ids()
7029 * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
7042 return -EINVAL; in sctp_getsockopt_paddr_thresholds()
7045 return -EFAULT; in sctp_getsockopt_paddr_thresholds()
7051 return -ENOENT; in sctp_getsockopt_paddr_thresholds()
7053 val.spt_pathmaxrxt = trans->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7054 val.spt_pathpfthld = trans->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7055 val.spt_pathcpthld = trans->ps_retrans; in sctp_getsockopt_paddr_thresholds()
7063 return -EINVAL; in sctp_getsockopt_paddr_thresholds()
7066 val.spt_pathpfthld = asoc->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7067 val.spt_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7068 val.spt_pathcpthld = asoc->ps_retrans; in sctp_getsockopt_paddr_thresholds()
7070 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_paddr_thresholds() local
7072 val.spt_pathpfthld = sp->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7073 val.spt_pathmaxrxt = sp->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7074 val.spt_pathcpthld = sp->ps_retrans; in sctp_getsockopt_paddr_thresholds()
7079 return -EFAULT; in sctp_getsockopt_paddr_thresholds()
7099 return -EINVAL; in sctp_getsockopt_assoc_stats()
7105 return -EFAULT; in sctp_getsockopt_assoc_stats()
7109 return -EINVAL; in sctp_getsockopt_assoc_stats()
7111 sas.sas_rtxchunks = asoc->stats.rtxchunks; in sctp_getsockopt_assoc_stats()
7112 sas.sas_gapcnt = asoc->stats.gapcnt; in sctp_getsockopt_assoc_stats()
7113 sas.sas_outofseqtsns = asoc->stats.outofseqtsns; in sctp_getsockopt_assoc_stats()
7114 sas.sas_osacks = asoc->stats.osacks; in sctp_getsockopt_assoc_stats()
7115 sas.sas_isacks = asoc->stats.isacks; in sctp_getsockopt_assoc_stats()
7116 sas.sas_octrlchunks = asoc->stats.octrlchunks; in sctp_getsockopt_assoc_stats()
7117 sas.sas_ictrlchunks = asoc->stats.ictrlchunks; in sctp_getsockopt_assoc_stats()
7118 sas.sas_oodchunks = asoc->stats.oodchunks; in sctp_getsockopt_assoc_stats()
7119 sas.sas_iodchunks = asoc->stats.iodchunks; in sctp_getsockopt_assoc_stats()
7120 sas.sas_ouodchunks = asoc->stats.ouodchunks; in sctp_getsockopt_assoc_stats()
7121 sas.sas_iuodchunks = asoc->stats.iuodchunks; in sctp_getsockopt_assoc_stats()
7122 sas.sas_idupchunks = asoc->stats.idupchunks; in sctp_getsockopt_assoc_stats()
7123 sas.sas_opackets = asoc->stats.opackets; in sctp_getsockopt_assoc_stats()
7124 sas.sas_ipackets = asoc->stats.ipackets; in sctp_getsockopt_assoc_stats()
7130 sas.sas_maxrto = asoc->stats.max_obs_rto; in sctp_getsockopt_assoc_stats()
7131 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr, in sctp_getsockopt_assoc_stats()
7135 asoc->stats.max_obs_rto = asoc->rto_min; in sctp_getsockopt_assoc_stats()
7138 return -EFAULT; in sctp_getsockopt_assoc_stats()
7143 return -EFAULT; in sctp_getsockopt_assoc_stats()
7155 return -EINVAL; in sctp_getsockopt_recvrcvinfo()
7158 if (sctp_sk(sk)->recvrcvinfo) in sctp_getsockopt_recvrcvinfo()
7161 return -EFAULT; in sctp_getsockopt_recvrcvinfo()
7163 return -EFAULT; in sctp_getsockopt_recvrcvinfo()
7175 return -EINVAL; in sctp_getsockopt_recvnxtinfo()
7178 if (sctp_sk(sk)->recvnxtinfo) in sctp_getsockopt_recvnxtinfo()
7181 return -EFAULT; in sctp_getsockopt_recvnxtinfo()
7183 return -EFAULT; in sctp_getsockopt_recvnxtinfo()
7194 int retval = -EFAULT; in sctp_getsockopt_pr_supported()
7197 retval = -EINVAL; in sctp_getsockopt_pr_supported()
7208 retval = -EINVAL; in sctp_getsockopt_pr_supported()
7212 params.assoc_value = asoc ? asoc->peer.prsctp_capable in sctp_getsockopt_pr_supported()
7213 : sctp_sk(sk)->ep->prsctp_enable; in sctp_getsockopt_pr_supported()
7233 int retval = -EFAULT; in sctp_getsockopt_default_prinfo()
7236 retval = -EINVAL; in sctp_getsockopt_default_prinfo()
7247 retval = -EINVAL; in sctp_getsockopt_default_prinfo()
7252 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags); in sctp_getsockopt_default_prinfo()
7253 info.pr_value = asoc->default_timetolive; in sctp_getsockopt_default_prinfo()
7255 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_prinfo() local
7257 info.pr_policy = SCTP_PR_POLICY(sp->default_flags); in sctp_getsockopt_default_prinfo()
7258 info.pr_value = sp->default_timetolive; in sctp_getsockopt_default_prinfo()
7280 int retval = -EINVAL; in sctp_getsockopt_pr_assocstatus()
7287 retval = -EFAULT; in sctp_getsockopt_pr_assocstatus()
7305 asoc->abandoned_unsent[policy]; in sctp_getsockopt_pr_assocstatus()
7307 asoc->abandoned_sent[policy]; in sctp_getsockopt_pr_assocstatus()
7311 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7313 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7317 retval = -EFAULT; in sctp_getsockopt_pr_assocstatus()
7322 retval = -EFAULT; in sctp_getsockopt_pr_assocstatus()
7339 int retval = -EINVAL; in sctp_getsockopt_pr_streamstatus()
7347 retval = -EFAULT; in sctp_getsockopt_pr_streamstatus()
7357 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt) in sctp_getsockopt_pr_streamstatus()
7360 streamoute = SCTP_SO(&asoc->stream, params.sprstat_sid)->ext; in sctp_getsockopt_pr_streamstatus()
7374 streamoute->abandoned_unsent[policy]; in sctp_getsockopt_pr_streamstatus()
7376 streamoute->abandoned_sent[policy]; in sctp_getsockopt_pr_streamstatus()
7380 streamoute->abandoned_unsent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_streamstatus()
7382 streamoute->abandoned_sent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_streamstatus()
7386 retval = -EFAULT; in sctp_getsockopt_pr_streamstatus()
7402 int retval = -EFAULT; in sctp_getsockopt_reconfig_supported()
7405 retval = -EINVAL; in sctp_getsockopt_reconfig_supported()
7416 retval = -EINVAL; in sctp_getsockopt_reconfig_supported()
7420 params.assoc_value = asoc ? asoc->peer.reconf_capable in sctp_getsockopt_reconfig_supported()
7421 : sctp_sk(sk)->ep->reconf_enable; in sctp_getsockopt_reconfig_supported()
7441 int retval = -EFAULT; in sctp_getsockopt_enable_strreset()
7444 retval = -EINVAL; in sctp_getsockopt_enable_strreset()
7455 retval = -EINVAL; in sctp_getsockopt_enable_strreset()
7459 params.assoc_value = asoc ? asoc->strreset_enable in sctp_getsockopt_enable_strreset()
7460 : sctp_sk(sk)->ep->strreset_enable; in sctp_getsockopt_enable_strreset()
7480 int retval = -EFAULT; in sctp_getsockopt_scheduler()
7483 retval = -EINVAL; in sctp_getsockopt_scheduler()
7494 retval = -EINVAL; in sctp_getsockopt_scheduler()
7499 : sctp_sk(sk)->default_ss; in sctp_getsockopt_scheduler()
7519 int retval = -EFAULT; in sctp_getsockopt_scheduler_value()
7522 retval = -EINVAL; in sctp_getsockopt_scheduler_value()
7532 retval = -EINVAL; in sctp_getsockopt_scheduler_value()
7542 retval = -EFAULT; in sctp_getsockopt_scheduler_value()
7547 retval = -EFAULT; in sctp_getsockopt_scheduler_value()
7561 int retval = -EFAULT; in sctp_getsockopt_interleaving_supported()
7564 retval = -EINVAL; in sctp_getsockopt_interleaving_supported()
7575 retval = -EINVAL; in sctp_getsockopt_interleaving_supported()
7579 params.assoc_value = asoc ? asoc->peer.intl_capable in sctp_getsockopt_interleaving_supported()
7580 : sctp_sk(sk)->ep->intl_enable; in sctp_getsockopt_interleaving_supported()
7601 return -EINVAL; in sctp_getsockopt_reuse_port()
7604 val = sctp_sk(sk)->reuse; in sctp_getsockopt_reuse_port()
7606 return -EFAULT; in sctp_getsockopt_reuse_port()
7609 return -EFAULT; in sctp_getsockopt_reuse_port()
7622 return -EINVAL; in sctp_getsockopt_event()
7626 return -EFAULT; in sctp_getsockopt_event()
7630 return -EINVAL; in sctp_getsockopt_event()
7635 return -EINVAL; in sctp_getsockopt_event()
7637 subscribe = asoc ? asoc->subscribe : sctp_sk(sk)->subscribe; in sctp_getsockopt_event()
7641 return -EFAULT; in sctp_getsockopt_event()
7644 return -EFAULT; in sctp_getsockopt_event()
7655 int retval = -EFAULT; in sctp_getsockopt_asconf_supported()
7658 retval = -EINVAL; in sctp_getsockopt_asconf_supported()
7669 retval = -EINVAL; in sctp_getsockopt_asconf_supported()
7673 params.assoc_value = asoc ? asoc->peer.asconf_capable in sctp_getsockopt_asconf_supported()
7674 : sctp_sk(sk)->ep->asconf_enable; in sctp_getsockopt_asconf_supported()
7694 int retval = -EFAULT; in sctp_getsockopt_auth_supported()
7697 retval = -EINVAL; in sctp_getsockopt_auth_supported()
7708 retval = -EINVAL; in sctp_getsockopt_auth_supported()
7712 params.assoc_value = asoc ? asoc->peer.auth_capable in sctp_getsockopt_auth_supported()
7713 : sctp_sk(sk)->ep->auth_enable; in sctp_getsockopt_auth_supported()
7733 int retval = -EFAULT; in sctp_getsockopt_ecn_supported()
7736 retval = -EINVAL; in sctp_getsockopt_ecn_supported()
7747 retval = -EINVAL; in sctp_getsockopt_ecn_supported()
7751 params.assoc_value = asoc ? asoc->peer.ecn_capable in sctp_getsockopt_ecn_supported()
7752 : sctp_sk(sk)->ep->ecn_enable; in sctp_getsockopt_ecn_supported()
7772 int retval = -EFAULT; in sctp_getsockopt_pf_expose()
7775 retval = -EINVAL; in sctp_getsockopt_pf_expose()
7786 retval = -EINVAL; in sctp_getsockopt_pf_expose()
7790 params.assoc_value = asoc ? asoc->pf_expose in sctp_getsockopt_pf_expose()
7791 : sctp_sk(sk)->pf_expose; in sctp_getsockopt_pf_expose()
7817 * are at all well-founded. in sctp_getsockopt()
7820 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_getsockopt()
7822 retval = af->getsockopt(sk, level, optname, optval, optlen); in sctp_getsockopt()
7827 return -EFAULT; in sctp_getsockopt()
7830 return -EINVAL; in sctp_getsockopt()
7928 retval = -EOPNOTSUPP; in sctp_getsockopt()
8026 retval = -ENOPROTOOPT; in sctp_getsockopt()
8062 struct sctp_sock *sp = sctp_sk(sk); in sctp_get_port_local() local
8063 bool reuse = (sk->sk_reuse || sp->reuse); in sctp_get_port_local()
8071 snum = ntohs(addr->v4.sin_port); in sctp_get_port_local()
8081 remaining = (high - low) + 1; in sctp_get_port_local()
8092 spin_lock_bh(&head->lock); in sctp_get_port_local()
8093 sctp_for_each_hentry(pp, &head->chain) in sctp_get_port_local()
8094 if ((pp->port == rover) && in sctp_get_port_local()
8095 net_eq(net, pp->net)) in sctp_get_port_local()
8099 spin_unlock_bh(&head->lock); in sctp_get_port_local()
8101 } while (--remaining > 0); in sctp_get_port_local()
8109 * hash table list entry) is non-NULL and we hold it's in sctp_get_port_local()
8117 * to the port number (snum) - we detect that with the in sctp_get_port_local()
8121 spin_lock_bh(&head->lock); in sctp_get_port_local()
8122 sctp_for_each_hentry(pp, &head->chain) { in sctp_get_port_local()
8123 if ((pp->port == snum) && net_eq(pp->net, net)) in sctp_get_port_local()
8130 if (!hlist_empty(&pp->owner)) { in sctp_get_port_local()
8131 /* We had a port hash table hit - there is an in sctp_get_port_local()
8133 * used by other socket (pp->owner not empty); that other in sctp_get_port_local()
8140 if ((pp->fastreuse && reuse && in sctp_get_port_local()
8141 sk->sk_state != SCTP_SS_LISTENING) || in sctp_get_port_local()
8142 (pp->fastreuseport && sk->sk_reuseport && in sctp_get_port_local()
8143 uid_eq(pp->fastuid, uid))) in sctp_get_port_local()
8147 * (pp->port) [via the pointers bind_next and in sctp_get_port_local()
8148 * bind_pprev in the struct sock *sk2 (pp->sk)]. On each one, in sctp_get_port_local()
8156 sk_for_each_bound(sk2, &pp->owner) { in sctp_get_port_local()
8158 struct sctp_endpoint *ep2 = sp2->ep; in sctp_get_port_local()
8161 (reuse && (sk2->sk_reuse || sp2->reuse) && in sctp_get_port_local()
8162 sk2->sk_state != SCTP_SS_LISTENING) || in sctp_get_port_local()
8163 (sk->sk_reuseport && sk2->sk_reuseport && in sctp_get_port_local()
8167 if (sctp_bind_addr_conflict(&ep2->base.bind_addr, in sctp_get_port_local()
8168 addr, sp2, sp)) { in sctp_get_port_local()
8183 * if sk->sk_reuse is too (that is, if the caller requested in sctp_get_port_local()
8184 * SO_REUSEADDR on this socket -sk-). in sctp_get_port_local()
8186 if (hlist_empty(&pp->owner)) { in sctp_get_port_local()
8187 if (reuse && sk->sk_state != SCTP_SS_LISTENING) in sctp_get_port_local()
8188 pp->fastreuse = 1; in sctp_get_port_local()
8190 pp->fastreuse = 0; in sctp_get_port_local()
8192 if (sk->sk_reuseport) { in sctp_get_port_local()
8193 pp->fastreuseport = 1; in sctp_get_port_local()
8194 pp->fastuid = uid; in sctp_get_port_local()
8196 pp->fastreuseport = 0; in sctp_get_port_local()
8199 if (pp->fastreuse && in sctp_get_port_local()
8200 (!reuse || sk->sk_state == SCTP_SS_LISTENING)) in sctp_get_port_local()
8201 pp->fastreuse = 0; in sctp_get_port_local()
8203 if (pp->fastreuseport && in sctp_get_port_local()
8204 (!sk->sk_reuseport || !uid_eq(pp->fastuid, uid))) in sctp_get_port_local()
8205 pp->fastreuseport = 0; in sctp_get_port_local()
8213 if (!sp->bind_hash) { in sctp_get_port_local()
8214 inet_sk(sk)->inet_num = snum; in sctp_get_port_local()
8215 sk_add_bind_node(sk, &pp->owner); in sctp_get_port_local()
8216 sp->bind_hash = pp; in sctp_get_port_local()
8221 spin_unlock_bh(&head->lock); in sctp_get_port_local()
8231 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_get_port()
8234 af->from_sk(&addr, sk); in sctp_get_port()
8237 /* Note: sk->sk_num gets filled in if ephemeral port request. */ in sctp_get_port()
8246 struct sctp_sock *sp = sctp_sk(sk); in sctp_listen_start() local
8247 struct sctp_endpoint *ep = sp->ep; in sctp_listen_start()
8252 if (!sp->hmac && sp->sctp_hmac_alg) { in sctp_listen_start()
8253 sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg); in sctp_listen_start()
8257 sp->sctp_hmac_alg, PTR_ERR(tfm)); in sctp_listen_start()
8258 return -ENOSYS; in sctp_listen_start()
8260 sctp_sk(sk)->hmac = tfm; in sctp_listen_start()
8275 if (!ep->base.bind_addr.port) { in sctp_listen_start()
8277 return -EAGAIN; in sctp_listen_start()
8279 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) { in sctp_listen_start()
8281 return -EADDRINUSE; in sctp_listen_start()
8285 WRITE_ONCE(sk->sk_max_ack_backlog, backlog); in sctp_listen_start()
8305 struct sock *sk = sock->sk; in sctp_inet_listen()
8306 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_inet_listen()
8307 int err = -EINVAL; in sctp_inet_listen()
8314 /* Peeled-off sockets are not allowed to listen(). */ in sctp_inet_listen()
8318 if (sock->state != SS_UNCONNECTED) in sctp_inet_listen()
8331 sk->sk_state = SCTP_SS_CLOSED; in sctp_inet_listen()
8332 if (sk->sk_reuse || sctp_sk(sk)->reuse) in sctp_inet_listen()
8333 sctp_sk(sk)->bind_hash->fastreuse = 1; in sctp_inet_listen()
8339 WRITE_ONCE(sk->sk_max_ack_backlog, backlog); in sctp_inet_listen()
8367 struct sock *sk = sock->sk; in sctp_poll()
8368 struct sctp_sock *sp = sctp_sk(sk); in sctp_poll() local
8375 /* A TCP-style listening socket becomes readable when the accept queue in sctp_poll()
8379 return (!list_empty(&sp->ep->asocs)) ? in sctp_poll()
8385 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue)) in sctp_poll()
8388 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_poll()
8390 if (sk->sk_shutdown == SHUTDOWN_MASK) in sctp_poll()
8393 /* Is it readable? Reconsider this code with TCP-style support. */ in sctp_poll()
8394 if (!skb_queue_empty_lockless(&sk->sk_receive_queue)) in sctp_poll()
8432 pp->port = snum; in sctp_bucket_create()
8433 pp->fastreuse = 0; in sctp_bucket_create()
8434 INIT_HLIST_HEAD(&pp->owner); in sctp_bucket_create()
8435 pp->net = net; in sctp_bucket_create()
8436 hlist_add_head(&pp->node, &head->chain); in sctp_bucket_create()
8444 if (pp && hlist_empty(&pp->owner)) { in sctp_bucket_destroy()
8445 __hlist_del(&pp->node); in sctp_bucket_destroy()
8456 inet_sk(sk)->inet_num)]; in __sctp_put_port()
8459 spin_lock(&head->lock); in __sctp_put_port()
8460 pp = sctp_sk(sk)->bind_hash; in __sctp_put_port()
8462 sctp_sk(sk)->bind_hash = NULL; in __sctp_put_port()
8463 inet_sk(sk)->inet_num = 0; in __sctp_put_port()
8465 spin_unlock(&head->lock); in __sctp_put_port()
8488 af = sctp_sk(sk)->pf->af; in sctp_autobind()
8490 port = htons(inet_sk(sk)->inet_num); in sctp_autobind()
8491 af->inaddr_any(&autoaddr, port); in sctp_autobind()
8493 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); in sctp_autobind()
8505 * Historically Berkeley-derived implementations have passed only one object
8510 * |<--------------------------- msg_controllen -------------------------->|
8513 * |<----- ancillary data object ----->|<----- ancillary data object ----->|
8515 * |<---------- CMSG_SPACE() --------->|<---------- CMSG_SPACE() --------->|
8518 * |<---------- cmsg_len ---------->| |<--------- cmsg_len ----------->| |
8520 * |<--------- CMSG_LEN() --------->| |<-------- CMSG_LEN() ---------->| |
8523 * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+
8528 * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+
8542 return -EINVAL; in sctp_msghdr_parse()
8545 if (cmsg->cmsg_level != IPPROTO_SCTP) in sctp_msghdr_parse()
8549 switch (cmsg->cmsg_type) { in sctp_msghdr_parse()
8561 * ------------ ------------ ---------------------- in sctp_msghdr_parse()
8564 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_initmsg))) in sctp_msghdr_parse()
8565 return -EINVAL; in sctp_msghdr_parse()
8567 cmsgs->init = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8579 * ------------ ------------ ---------------------- in sctp_msghdr_parse()
8582 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndrcvinfo))) in sctp_msghdr_parse()
8583 return -EINVAL; in sctp_msghdr_parse()
8585 cmsgs->srinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8587 if (cmsgs->srinfo->sinfo_flags & in sctp_msghdr_parse()
8591 return -EINVAL; in sctp_msghdr_parse()
8603 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8606 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndinfo))) in sctp_msghdr_parse()
8607 return -EINVAL; in sctp_msghdr_parse()
8609 cmsgs->sinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8611 if (cmsgs->sinfo->snd_flags & in sctp_msghdr_parse()
8615 return -EINVAL; in sctp_msghdr_parse()
8619 * 5.3.7 SCTP PR-SCTP Information Structure (SCTP_PRINFO) in sctp_msghdr_parse()
8624 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8627 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_prinfo))) in sctp_msghdr_parse()
8628 return -EINVAL; in sctp_msghdr_parse()
8630 cmsgs->prinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8631 if (cmsgs->prinfo->pr_policy & ~SCTP_PR_SCTP_MASK) in sctp_msghdr_parse()
8632 return -EINVAL; in sctp_msghdr_parse()
8634 if (cmsgs->prinfo->pr_policy == SCTP_PR_SCTP_NONE) in sctp_msghdr_parse()
8635 cmsgs->prinfo->pr_value = 0; in sctp_msghdr_parse()
8644 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8647 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_authinfo))) in sctp_msghdr_parse()
8648 return -EINVAL; in sctp_msghdr_parse()
8650 cmsgs->authinfo = CMSG_DATA(cmsg); in sctp_msghdr_parse()
8660 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8662 * ------------ ------------ --------------------- in sctp_msghdr_parse()
8665 cmsgs->addrs_msg = my_msg; in sctp_msghdr_parse()
8668 return -EINVAL; in sctp_msghdr_parse()
8692 if (!skb_queue_empty(&sk->sk_receive_queue)) in sctp_wait_for_packet()
8696 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_packet()
8702 error = -ENOTCONN; in sctp_wait_for_packet()
8705 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING)) in sctp_wait_for_packet()
8759 skb = skb_peek(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
8761 refcount_inc(&skb->users); in sctp_skb_recv_datagram()
8763 skb = __skb_dequeue(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
8769 /* Caller is allowed not to check sk->sk_err before calling. */ in sctp_skb_recv_datagram()
8774 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_skb_recv_datagram()
8780 if (!skb_queue_empty_lockless(&sk->sk_receive_queue)) in sctp_skb_recv_datagram()
8785 error = -EAGAIN; in sctp_skb_recv_datagram()
8800 struct sock *sk = asoc->base.sk; in __sctp_write_space()
8805 if (waitqueue_active(&asoc->wait)) in __sctp_write_space()
8806 wake_up_interruptible(&asoc->wait); in __sctp_write_space()
8812 wq = rcu_dereference(sk->sk_wq); in __sctp_write_space()
8814 if (waitqueue_active(&wq->wait)) in __sctp_write_space()
8815 wake_up_interruptible(&wq->wait); in __sctp_write_space()
8821 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in __sctp_write_space()
8836 if (asoc->ep->sndbuf_policy) in sctp_wake_up_waiters()
8842 if (asoc->base.dead) in sctp_wake_up_waiters()
8858 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs)) in sctp_wake_up_waiters()
8874 struct sctp_chunk *chunk = skb_shinfo(skb)->destructor_arg; in sctp_wfree()
8875 struct sctp_association *asoc = chunk->asoc; in sctp_wfree()
8876 struct sock *sk = asoc->base.sk; in sctp_wfree()
8878 sk_mem_uncharge(sk, skb->truesize); in sctp_wfree()
8879 sk->sk_wmem_queued -= skb->truesize + sizeof(struct sctp_chunk); in sctp_wfree()
8880 asoc->sndbuf_used -= skb->truesize + sizeof(struct sctp_chunk); in sctp_wfree()
8882 &sk->sk_wmem_alloc)); in sctp_wfree()
8884 if (chunk->shkey) { in sctp_wfree()
8885 struct sctp_shared_key *shkey = chunk->shkey; in sctp_wfree()
8891 if (shkey->deactivated && !list_empty(&shkey->key_list) && in sctp_wfree()
8892 refcount_read(&shkey->refcnt) == 2) { in sctp_wfree()
8895 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id, in sctp_wfree()
8899 asoc->stream.si->enqueue_event(&asoc->ulpq, ev); in sctp_wfree()
8901 sctp_auth_shkey_release(chunk->shkey); in sctp_wfree()
8917 struct sock *sk = skb->sk; in sctp_sock_rfree()
8920 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc); in sctp_sock_rfree()
8925 sk_mem_uncharge(sk, event->rmem_len); in sctp_sock_rfree()
8933 struct sock *sk = asoc->base.sk; in sctp_wait_for_sndbuf()
8946 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_sndbuf()
8948 if (asoc->base.dead) in sctp_wait_for_sndbuf()
8952 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING) in sctp_wait_for_sndbuf()
8968 if (sk != asoc->base.sk) in sctp_wait_for_sndbuf()
8975 finish_wait(&asoc->wait, &wait); in sctp_wait_for_sndbuf()
8983 err = -ESRCH; in sctp_wait_for_sndbuf()
8987 err = -EPIPE; in sctp_wait_for_sndbuf()
8995 err = -EAGAIN; in sctp_wait_for_sndbuf()
9004 wq = rcu_dereference(sk->sk_wq); in sctp_data_ready()
9006 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | in sctp_data_ready()
9018 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { in sctp_write_space()
9026 * associations on the same socket. For a UDP-style socket with
9030 * would cause an unwanted block under certain circumstances. For the 1-1
9031 * UDP-style sockets or TCP-style sockets, this code should work.
9032 * - Daisy
9036 return sk->sk_sndbuf > sk->sk_wmem_queued; in sctp_writeable()
9044 struct sock *sk = asoc->base.sk; in sctp_wait_for_connect()
9055 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_connect()
9059 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_connect()
9061 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_connect()
9062 asoc->base.dead) in sctp_wait_for_connect()
9081 finish_wait(&asoc->wait, &wait); in sctp_wait_for_connect()
9089 if (asoc->init_err_counter + 1 > asoc->max_init_attempts) in sctp_wait_for_connect()
9090 err = -ETIMEDOUT; in sctp_wait_for_connect()
9092 err = -ECONNREFUSED; in sctp_wait_for_connect()
9100 err = -EINPROGRESS; in sctp_wait_for_connect()
9110 ep = sctp_sk(sk)->ep; in sctp_wait_for_accept()
9117 if (list_empty(&ep->asocs)) { in sctp_wait_for_accept()
9123 err = -EINVAL; in sctp_wait_for_accept()
9128 if (!list_empty(&ep->asocs)) in sctp_wait_for_accept()
9135 err = -EAGAIN; in sctp_wait_for_accept()
9151 if (list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_wait_for_close()
9165 if (!skb->data_len) in sctp_skb_set_owner_r_frag()
9181 struct sctp_sock *sp = sctp_sk(sk); in sctp_copy_sock() local
9182 struct sctp_endpoint *ep = sp->ep; in sctp_copy_sock()
9184 newsk->sk_type = sk->sk_type; in sctp_copy_sock()
9185 newsk->sk_bound_dev_if = sk->sk_bound_dev_if; in sctp_copy_sock()
9186 newsk->sk_flags = sk->sk_flags; in sctp_copy_sock()
9187 newsk->sk_tsflags = sk->sk_tsflags; in sctp_copy_sock()
9188 newsk->sk_no_check_tx = sk->sk_no_check_tx; in sctp_copy_sock()
9189 newsk->sk_no_check_rx = sk->sk_no_check_rx; in sctp_copy_sock()
9190 newsk->sk_reuse = sk->sk_reuse; in sctp_copy_sock()
9191 sctp_sk(newsk)->reuse = sp->reuse; in sctp_copy_sock()
9193 newsk->sk_shutdown = sk->sk_shutdown; in sctp_copy_sock()
9194 newsk->sk_destruct = sctp_destruct_sock; in sctp_copy_sock()
9195 newsk->sk_family = sk->sk_family; in sctp_copy_sock()
9196 newsk->sk_protocol = IPPROTO_SCTP; in sctp_copy_sock()
9197 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; in sctp_copy_sock()
9198 newsk->sk_sndbuf = sk->sk_sndbuf; in sctp_copy_sock()
9199 newsk->sk_rcvbuf = sk->sk_rcvbuf; in sctp_copy_sock()
9200 newsk->sk_lingertime = sk->sk_lingertime; in sctp_copy_sock()
9201 newsk->sk_rcvtimeo = sk->sk_rcvtimeo; in sctp_copy_sock()
9202 newsk->sk_sndtimeo = sk->sk_sndtimeo; in sctp_copy_sock()
9203 newsk->sk_rxhash = sk->sk_rxhash; in sctp_copy_sock()
9210 newinet->inet_sport = inet->inet_sport; in sctp_copy_sock()
9211 newinet->inet_saddr = inet->inet_saddr; in sctp_copy_sock()
9212 newinet->inet_rcv_saddr = inet->inet_rcv_saddr; in sctp_copy_sock()
9213 newinet->inet_dport = htons(asoc->peer.port); in sctp_copy_sock()
9214 newinet->pmtudisc = inet->pmtudisc; in sctp_copy_sock()
9215 newinet->inet_id = prandom_u32(); in sctp_copy_sock()
9217 newinet->uc_ttl = inet->uc_ttl; in sctp_copy_sock()
9218 newinet->mc_loop = 1; in sctp_copy_sock()
9219 newinet->mc_ttl = 1; in sctp_copy_sock()
9220 newinet->mc_index = 0; in sctp_copy_sock()
9221 newinet->mc_list = NULL; in sctp_copy_sock()
9223 if (newsk->sk_flags & SK_FLAGS_TIMESTAMP) in sctp_copy_sock()
9237 ancestor_size += sk_from->sk_prot->obj_size; in sctp_copy_descendant()
9238 ancestor_size -= offsetof(struct sctp_sock, pd_lobby); in sctp_copy_descendant()
9252 struct sctp_endpoint *newep = newsp->ep; in sctp_sock_migrate()
9261 newsk->sk_sndbuf = oldsk->sk_sndbuf; in sctp_sock_migrate()
9262 newsk->sk_rcvbuf = oldsk->sk_rcvbuf; in sctp_sock_migrate()
9269 newsp->ep = newep; in sctp_sock_migrate()
9270 newsp->hmac = NULL; in sctp_sock_migrate()
9274 inet_sk(oldsk)->inet_num)]; in sctp_sock_migrate()
9275 spin_lock_bh(&head->lock); in sctp_sock_migrate()
9276 pp = sctp_sk(oldsk)->bind_hash; in sctp_sock_migrate()
9277 sk_add_bind_node(newsk, &pp->owner); in sctp_sock_migrate()
9278 sctp_sk(newsk)->bind_hash = pp; in sctp_sock_migrate()
9279 inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num; in sctp_sock_migrate()
9280 spin_unlock_bh(&head->lock); in sctp_sock_migrate()
9285 err = sctp_bind_addr_dup(&newsp->ep->base.bind_addr, in sctp_sock_migrate()
9286 &oldsp->ep->base.bind_addr, GFP_KERNEL); in sctp_sock_migrate()
9291 * that net->sctp.auth_enable has been changed to 0 by users and in sctp_sock_migrate()
9294 if (oldsp->ep->auth_hmacs) { in sctp_sock_migrate()
9295 err = sctp_auth_init_hmacs(newsp->ep, GFP_KERNEL); in sctp_sock_migrate()
9305 sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) { in sctp_sock_migrate()
9307 if (event->asoc == assoc) { in sctp_sock_migrate()
9308 __skb_unlink(skb, &oldsk->sk_receive_queue); in sctp_sock_migrate()
9309 __skb_queue_tail(&newsk->sk_receive_queue, skb); in sctp_sock_migrate()
9318 * 3) Peeling off non-partial delivery; move pd_lobby to receive_queue. in sctp_sock_migrate()
9320 atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode); in sctp_sock_migrate()
9322 if (atomic_read(&sctp_sk(oldsk)->pd_mode)) { in sctp_sock_migrate()
9326 if (assoc->ulpq.pd_mode) { in sctp_sock_migrate()
9327 queue = &newsp->pd_lobby; in sctp_sock_migrate()
9329 queue = &newsk->sk_receive_queue; in sctp_sock_migrate()
9334 sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) { in sctp_sock_migrate()
9336 if (event->asoc == assoc) { in sctp_sock_migrate()
9337 __skb_unlink(skb, &oldsp->pd_lobby); in sctp_sock_migrate()
9346 if (assoc->ulpq.pd_mode) in sctp_sock_migrate()
9354 * original UDP-style socket or created with the accept() call on a in sctp_sock_migrate()
9355 * TCP-style socket.. in sctp_sock_migrate()
9357 newsp->type = type; in sctp_sock_migrate()
9359 /* Mark the new socket "in-use" by the user so that any packets in sctp_sock_migrate()
9362 * backlog processing on the old socket and new-packet processing in sctp_sock_migrate()
9378 newsk->sk_shutdown |= RCV_SHUTDOWN; in sctp_sock_migrate()
9412 .usersize = offsetof(struct sctp_sock, initmsg) -
9455 .usersize = offsetof(struct sctp6_sock, sctp.initmsg) -