Lines Matching refs:sk

83 static int sctp_writeable(struct sock *sk);
87 static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p);
89 static int sctp_wait_for_accept(struct sock *sk, long timeo);
90 static void sctp_wait_for_close(struct sock *sk, long timeo);
91 static void sctp_destruct_sock(struct sock *sk);
101 static int sctp_autobind(struct sock *sk);
109 static void sctp_enter_memory_pressure(struct sock *sk) in sctp_enter_memory_pressure() argument
123 amt = sk_wmem_alloc_get(asoc->base.sk); in sctp_wspace()
125 if (amt >= asoc->base.sk->sk_sndbuf) { in sctp_wspace()
126 if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK) in sctp_wspace()
129 amt = sk_stream_wspace(asoc->base.sk); in sctp_wspace()
134 amt = asoc->base.sk->sk_sndbuf - amt; in sctp_wspace()
151 struct sock *sk = asoc->base.sk; in sctp_set_owner_w() local
156 skb_set_owner_w(chunk->skb, sk); in sctp_set_owner_w()
166 atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); in sctp_set_owner_w()
167 sk->sk_wmem_queued += chunk->skb->truesize; in sctp_set_owner_w()
168 sk_mem_charge(sk, chunk->skb->truesize); in sctp_set_owner_w()
172 static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr, in sctp_verify_addr() argument
178 af = sctp_sockaddr_af(sctp_sk(sk), addr, len); in sctp_verify_addr()
183 if (!af->addr_valid(addr, sctp_sk(sk), NULL)) in sctp_verify_addr()
186 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr))) in sctp_verify_addr()
195 struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id) in sctp_id2assoc() argument
200 if (!sctp_style(sk, UDP)) { in sctp_id2assoc()
205 if (!sctp_sstate(sk, ESTABLISHED)) in sctp_id2assoc()
209 if (!list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_id2assoc()
210 asoc = list_entry(sctp_sk(sk)->ep->asocs.next, in sctp_id2assoc()
223 if (!asoc || (asoc->base.sk != sk) || asoc->base.dead) in sctp_id2assoc()
233 static struct sctp_transport *sctp_addr_id2transport(struct sock *sk, in sctp_addr_id2transport() argument
241 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep, in sctp_addr_id2transport()
248 id_asoc = sctp_id2assoc(sk, id); in sctp_addr_id2transport()
252 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_addr_id2transport()
268 static int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len) in sctp_bind() argument
272 lock_sock(sk); in sctp_bind()
274 pr_debug("%s: sk:%p, addr:%p, addr_len:%d\n", __func__, sk, in sctp_bind()
278 if (!sctp_sk(sk)->ep->base.bind_addr.port) in sctp_bind()
279 retval = sctp_do_bind(sk, (union sctp_addr *)addr, in sctp_bind()
284 release_sock(sk); in sctp_bind()
322 static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) in sctp_do_bind() argument
324 struct net *net = sock_net(sk); in sctp_do_bind()
325 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_bind()
336 __func__, sk, addr, len); in sctp_do_bind()
343 __func__, sk, &addr->sa, bp->port, snum, len); in sctp_do_bind()
378 if ((ret = sctp_get_port_local(sk, addr))) { in sctp_do_bind()
384 bp->port = inet_sk(sk)->inet_num; in sctp_do_bind()
393 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num); in sctp_do_bind()
394 sp->pf->to_sk_saddr(addr, sk); in sctp_do_bind()
413 struct net *net = sock_net(asoc->base.sk); in sctp_send_asconf()
448 static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt) in sctp_bindx_add() argument
456 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n", __func__, sk, in sctp_bindx_add()
471 retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr, in sctp_bindx_add()
480 sctp_bindx_rem(sk, addrs, cnt); in sctp_bindx_add()
498 static int sctp_send_asconf_add_ip(struct sock *sk, in sctp_send_asconf_add_ip() argument
502 struct net *net = sock_net(sk); in sctp_send_asconf_add_ip()
520 sp = sctp_sk(sk); in sctp_send_asconf_add_ip()
524 __func__, sk, addrs, addrcnt); in sctp_send_asconf_add_ip()
597 sctp_sk(asoc->base.sk)); in sctp_send_asconf_add_ip()
622 static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt) in sctp_bindx_rem() argument
624 struct sctp_sock *sp = sctp_sk(sk); in sctp_bindx_rem()
634 __func__, sk, addrs, addrcnt); in sctp_bindx_rem()
683 sctp_bindx_add(sk, addrs, cnt); in sctp_bindx_rem()
701 static int sctp_send_asconf_del_ip(struct sock *sk, in sctp_send_asconf_del_ip() argument
705 struct net *net = sock_net(sk); in sctp_send_asconf_del_ip()
724 sp = sctp_sk(sk); in sctp_send_asconf_del_ip()
728 __func__, sk, addrs, addrcnt); in sctp_send_asconf_del_ip()
842 sctp_sk(asoc->base.sk)); in sctp_send_asconf_del_ip()
857 struct sock *sk = sctp_opt2sk(sp); in sctp_asconf_mgmt() local
867 if (sctp_verify_addr(sk, addr, af->sockaddr_len)) in sctp_asconf_mgmt()
871 return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1); in sctp_asconf_mgmt()
873 return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1); in sctp_asconf_mgmt()
952 static int sctp_setsockopt_bindx(struct sock *sk, in sctp_setsockopt_bindx() argument
965 __func__, sk, addrs, addrs_size, op); in sctp_setsockopt_bindx()
1010 err = sctp_bindx_add(sk, kaddrs, addrcnt); in sctp_setsockopt_bindx()
1013 err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt); in sctp_setsockopt_bindx()
1017 err = sctp_bindx_rem(sk, kaddrs, addrcnt); in sctp_setsockopt_bindx()
1020 err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt); in sctp_setsockopt_bindx()
1039 static int __sctp_connect(struct sock *sk, in __sctp_connect() argument
1044 struct net *net = sock_net(sk); in __sctp_connect()
1061 sp = sctp_sk(sk); in __sctp_connect()
1069 if (sctp_sstate(sk, ESTABLISHED) || in __sctp_connect()
1070 (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) { in __sctp_connect()
1101 err = sctp_verify_addr(sk, &to, af->sockaddr_len); in __sctp_connect()
1141 if (sctp_autobind(sk)) { in __sctp_connect()
1161 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); in __sctp_connect()
1203 inet_sk(sk)->inet_dport = htons(asoc->peer.port); in __sctp_connect()
1204 sp->pf->to_sk_daddr(sa_addr, sk); in __sctp_connect()
1205 sk->sk_err = 0; in __sctp_connect()
1210 if (sk->sk_socket->file) in __sctp_connect()
1211 f_flags = sk->sk_socket->file->f_flags; in __sctp_connect()
1213 timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK); in __sctp_connect()
1299 static int __sctp_setsockopt_connectx(struct sock *sk, in __sctp_setsockopt_connectx() argument
1309 __func__, sk, addrs, addrs_size); in __sctp_setsockopt_connectx()
1319 if (sk->sk_socket->file) in __sctp_setsockopt_connectx()
1328 err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id); in __sctp_setsockopt_connectx()
1340 static int sctp_setsockopt_connectx_old(struct sock *sk, in sctp_setsockopt_connectx_old() argument
1344 return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL); in sctp_setsockopt_connectx_old()
1353 static int sctp_setsockopt_connectx(struct sock *sk, in sctp_setsockopt_connectx() argument
1360 err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id); in sctp_setsockopt_connectx()
1384 static int sctp_getsockopt_connectx3(struct sock *sk, int len, in sctp_getsockopt_connectx3() argument
1413 err = __sctp_setsockopt_connectx(sk, (struct sockaddr __user *) in sctp_getsockopt_connectx3()
1476 static void sctp_close(struct sock *sk, long timeout) in sctp_close() argument
1478 struct net *net = sock_net(sk); in sctp_close()
1484 pr_debug("%s: sk:%p, timeout:%ld\n", __func__, sk, timeout); in sctp_close()
1486 lock_sock(sk); in sctp_close()
1487 sk->sk_shutdown = SHUTDOWN_MASK; in sctp_close()
1488 sk->sk_state = SCTP_SS_CLOSING; in sctp_close()
1490 ep = sctp_sk(sk)->ep; in sctp_close()
1493 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue); in sctp_close()
1494 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby); in sctp_close()
1500 if (sctp_style(sk, TCP)) { in sctp_close()
1515 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) { in sctp_close()
1525 if (sctp_style(sk, TCP) && timeout) in sctp_close()
1526 sctp_wait_for_close(sk, timeout); in sctp_close()
1529 release_sock(sk); in sctp_close()
1537 bh_lock_sock(sk); in sctp_close()
1542 sock_hold(sk); in sctp_close()
1543 sk_common_release(sk); in sctp_close()
1545 bh_unlock_sock(sk); in sctp_close()
1548 sock_put(sk); in sctp_close()
1554 static int sctp_error(struct sock *sk, int flags, int err) in sctp_error() argument
1557 err = sock_error(sk) ? : -EPIPE; in sctp_error()
1588 static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) in sctp_sendmsg() argument
1590 struct net *net = sock_net(sk); in sctp_sendmsg()
1612 sp = sctp_sk(sk); in sctp_sendmsg()
1615 pr_debug("%s: sk:%p, msg:%p, msg_len:%zu ep:%p\n", __func__, sk, in sctp_sendmsg()
1619 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) { in sctp_sendmsg()
1636 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { in sctp_sendmsg()
1639 err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name, in sctp_sendmsg()
1674 if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) { in sctp_sendmsg()
1702 lock_sock(sk); in sctp_sendmsg()
1714 if ((sctp_style(sk, TCP) && in sctp_sendmsg()
1715 sctp_sstate(sk, ESTABLISHED)) || in sctp_sendmsg()
1722 asoc = sctp_id2assoc(sk, associd); in sctp_sendmsg()
1737 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) { in sctp_sendmsg()
1805 if (sctp_autobind(sk)) { in sctp_sendmsg()
1825 new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); in sctp_sendmsg()
1893 if (msg_len > sk->sk_sndbuf) { in sctp_sendmsg()
1899 sctp_assoc_pending_pmtu(sk, asoc); in sctp_sendmsg()
1906 if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) { in sctp_sendmsg()
1917 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in sctp_sendmsg()
1928 if ((sctp_style(sk, TCP) && msg_name) || in sctp_sendmsg()
1979 timeo = sock_sndtimeo(sk, msg_flags & MSG_DONTWAIT); in sctp_sendmsg()
1994 release_sock(sk); in sctp_sendmsg()
1997 return sctp_error(sk, msg_flags, err); in sctp_sendmsg()
2004 err = sock_error(sk); in sctp_sendmsg()
2063 static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in sctp_recvmsg() argument
2067 struct sctp_sock *sp = sctp_sk(sk); in sctp_recvmsg()
2074 "addr_len:%p)\n", __func__, sk, msg, len, noblock, flags, in sctp_recvmsg()
2077 lock_sock(sk); in sctp_recvmsg()
2079 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED)) { in sctp_recvmsg()
2084 skb = sctp_skb_recv_datagram(sk, flags, noblock, &err); in sctp_recvmsg()
2104 sock_recv_ts_and_drops(msg, sk, skb); in sctp_recvmsg()
2114 sctp_ulpevent_read_nxtinfo(event, msg, sk); in sctp_recvmsg()
2133 skb_queue_head(&sk->sk_receive_queue, skb); in sctp_recvmsg()
2162 release_sock(sk); in sctp_recvmsg()
2173 static int sctp_setsockopt_disable_fragments(struct sock *sk, in sctp_setsockopt_disable_fragments() argument
2185 sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1; in sctp_setsockopt_disable_fragments()
2190 static int sctp_setsockopt_events(struct sock *sk, char __user *optval, in sctp_setsockopt_events() argument
2198 if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) in sctp_setsockopt_events()
2206 &sctp_sk(sk)->subscribe)) { in sctp_setsockopt_events()
2207 asoc = sctp_id2assoc(sk, 0); in sctp_setsockopt_events()
2233 static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, in sctp_setsockopt_autoclose() argument
2236 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_autoclose()
2237 struct net *net = sock_net(sk); in sctp_setsockopt_autoclose()
2240 if (sctp_style(sk, TCP)) in sctp_setsockopt_autoclose()
2361 struct net *net = sock_net(trans->asoc->base.sk); in sctp_apply_peer_addr_params()
2492 static int sctp_setsockopt_peer_addr_params(struct sock *sk, in sctp_setsockopt_peer_addr_params() argument
2499 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_peer_addr_params()
2525 if (!sctp_is_any(sk, (union sctp_addr *)&params.spp_address)) { in sctp_setsockopt_peer_addr_params()
2526 trans = sctp_addr_id2transport(sk, &params.spp_address, in sctp_setsockopt_peer_addr_params()
2536 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2537 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_peer_addr_params()
2615 static int sctp_setsockopt_delayed_ack(struct sock *sk, in sctp_setsockopt_delayed_ack() argument
2621 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_delayed_ack()
2653 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_setsockopt_delayed_ack()
2654 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_delayed_ack()
2725 static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_initmsg() argument
2728 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_initmsg()
2761 static int sctp_setsockopt_default_send_param(struct sock *sk, in sctp_setsockopt_default_send_param() argument
2765 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_send_param()
2778 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_setsockopt_default_send_param()
2779 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_default_send_param()
2801 static int sctp_setsockopt_default_sndinfo(struct sock *sk, in sctp_setsockopt_default_sndinfo() argument
2805 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_sndinfo()
2818 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_setsockopt_default_sndinfo()
2819 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_default_sndinfo()
2842 static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval, in sctp_setsockopt_primary_addr() argument
2854 trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); in sctp_setsockopt_primary_addr()
2871 static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval, in sctp_setsockopt_nodelay() argument
2881 sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1; in sctp_setsockopt_nodelay()
2897 static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_rtoinfo() argument
2902 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_rtoinfo()
2910 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_setsockopt_rtoinfo()
2913 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_rtoinfo()
2962 static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_associnfo() argument
2973 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_setsockopt_associnfo()
2975 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_associnfo()
3007 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_associnfo()
3029 static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_mappedv4() argument
3032 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_mappedv4()
3073 static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_maxseg() argument
3077 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_maxseg()
3099 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_maxseg()
3100 if (!asoc && params.assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_maxseg()
3128 static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval, in sctp_setsockopt_peer_primary_addr() argument
3131 struct net *net = sock_net(sk); in sctp_setsockopt_peer_primary_addr()
3139 sp = sctp_sk(sk); in sctp_setsockopt_peer_primary_addr()
3150 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); in sctp_setsockopt_peer_primary_addr()
3186 static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval, in sctp_setsockopt_adaptation_layer() argument
3196 sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind; in sctp_setsockopt_adaptation_layer()
3215 static int sctp_setsockopt_context(struct sock *sk, char __user *optval, in sctp_setsockopt_context() argument
3227 sp = sctp_sk(sk); in sctp_setsockopt_context()
3230 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_context()
3265 static int sctp_setsockopt_fragment_interleave(struct sock *sk, in sctp_setsockopt_fragment_interleave() argument
3276 sctp_sk(sk)->frag_interleave = (val == 0) ? 0 : 1; in sctp_setsockopt_fragment_interleave()
3298 static int sctp_setsockopt_partial_delivery_point(struct sock *sk, in sctp_setsockopt_partial_delivery_point() argument
3312 if (val > (sk->sk_rcvbuf >> 1)) in sctp_setsockopt_partial_delivery_point()
3315 sctp_sk(sk)->pd_point = val; in sctp_setsockopt_partial_delivery_point()
3331 static int sctp_setsockopt_maxburst(struct sock *sk, in sctp_setsockopt_maxburst() argument
3357 sp = sctp_sk(sk); in sctp_setsockopt_maxburst()
3360 asoc = sctp_id2assoc(sk, assoc_id); in sctp_setsockopt_maxburst()
3377 static int sctp_setsockopt_auth_chunk(struct sock *sk, in sctp_setsockopt_auth_chunk() argument
3381 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_chunk()
3410 static int sctp_setsockopt_hmac_ident(struct sock *sk, in sctp_setsockopt_hmac_ident() argument
3414 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_hmac_ident()
3448 static int sctp_setsockopt_auth_key(struct sock *sk, in sctp_setsockopt_auth_key() argument
3452 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_key()
3472 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); in sctp_setsockopt_auth_key()
3473 if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) { in sctp_setsockopt_auth_key()
3490 static int sctp_setsockopt_active_key(struct sock *sk, in sctp_setsockopt_active_key() argument
3494 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_active_key()
3506 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_active_key()
3507 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_active_key()
3518 static int sctp_setsockopt_del_key(struct sock *sk, in sctp_setsockopt_del_key() argument
3522 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_del_key()
3534 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_del_key()
3535 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_del_key()
3556 static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, in sctp_setsockopt_auto_asconf() argument
3560 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_auto_asconf()
3566 if (!sctp_is_ep_boundall(sk) && val) in sctp_setsockopt_auto_asconf()
3571 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3577 &sock_net(sk)->sctp.auto_asconf_splist); in sctp_setsockopt_auto_asconf()
3580 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3591 static int sctp_setsockopt_paddr_thresholds(struct sock *sk, in sctp_setsockopt_paddr_thresholds() argument
3606 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { in sctp_setsockopt_paddr_thresholds()
3607 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3621 trans = sctp_addr_id2transport(sk, &val.spt_address, in sctp_setsockopt_paddr_thresholds()
3634 static int sctp_setsockopt_recvrcvinfo(struct sock *sk, in sctp_setsockopt_recvrcvinfo() argument
3645 sctp_sk(sk)->recvrcvinfo = (val == 0) ? 0 : 1; in sctp_setsockopt_recvrcvinfo()
3650 static int sctp_setsockopt_recvnxtinfo(struct sock *sk, in sctp_setsockopt_recvnxtinfo() argument
3661 sctp_sk(sk)->recvnxtinfo = (val == 0) ? 0 : 1; in sctp_setsockopt_recvnxtinfo()
3685 static int sctp_setsockopt(struct sock *sk, int level, int optname, in sctp_setsockopt() argument
3690 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname); in sctp_setsockopt()
3699 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_setsockopt()
3700 retval = af->setsockopt(sk, level, optname, optval, optlen); in sctp_setsockopt()
3704 lock_sock(sk); in sctp_setsockopt()
3709 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, in sctp_setsockopt()
3715 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, in sctp_setsockopt()
3721 retval = sctp_setsockopt_connectx_old(sk, in sctp_setsockopt()
3728 retval = sctp_setsockopt_connectx(sk, in sctp_setsockopt()
3734 retval = sctp_setsockopt_disable_fragments(sk, optval, optlen); in sctp_setsockopt()
3738 retval = sctp_setsockopt_events(sk, optval, optlen); in sctp_setsockopt()
3742 retval = sctp_setsockopt_autoclose(sk, optval, optlen); in sctp_setsockopt()
3746 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); in sctp_setsockopt()
3750 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); in sctp_setsockopt()
3753 retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen); in sctp_setsockopt()
3757 retval = sctp_setsockopt_initmsg(sk, optval, optlen); in sctp_setsockopt()
3760 retval = sctp_setsockopt_default_send_param(sk, optval, in sctp_setsockopt()
3764 retval = sctp_setsockopt_default_sndinfo(sk, optval, optlen); in sctp_setsockopt()
3767 retval = sctp_setsockopt_primary_addr(sk, optval, optlen); in sctp_setsockopt()
3770 retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen); in sctp_setsockopt()
3773 retval = sctp_setsockopt_nodelay(sk, optval, optlen); in sctp_setsockopt()
3776 retval = sctp_setsockopt_rtoinfo(sk, optval, optlen); in sctp_setsockopt()
3779 retval = sctp_setsockopt_associnfo(sk, optval, optlen); in sctp_setsockopt()
3782 retval = sctp_setsockopt_mappedv4(sk, optval, optlen); in sctp_setsockopt()
3785 retval = sctp_setsockopt_maxseg(sk, optval, optlen); in sctp_setsockopt()
3788 retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen); in sctp_setsockopt()
3791 retval = sctp_setsockopt_context(sk, optval, optlen); in sctp_setsockopt()
3794 retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen); in sctp_setsockopt()
3797 retval = sctp_setsockopt_maxburst(sk, optval, optlen); in sctp_setsockopt()
3800 retval = sctp_setsockopt_auth_chunk(sk, optval, optlen); in sctp_setsockopt()
3803 retval = sctp_setsockopt_hmac_ident(sk, optval, optlen); in sctp_setsockopt()
3806 retval = sctp_setsockopt_auth_key(sk, optval, optlen); in sctp_setsockopt()
3809 retval = sctp_setsockopt_active_key(sk, optval, optlen); in sctp_setsockopt()
3812 retval = sctp_setsockopt_del_key(sk, optval, optlen); in sctp_setsockopt()
3815 retval = sctp_setsockopt_auto_asconf(sk, optval, optlen); in sctp_setsockopt()
3818 retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen); in sctp_setsockopt()
3821 retval = sctp_setsockopt_recvrcvinfo(sk, optval, optlen); in sctp_setsockopt()
3824 retval = sctp_setsockopt_recvnxtinfo(sk, optval, optlen); in sctp_setsockopt()
3831 release_sock(sk); in sctp_setsockopt()
3853 static int sctp_connect(struct sock *sk, struct sockaddr *addr, in sctp_connect() argument
3859 lock_sock(sk); in sctp_connect()
3861 pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk, in sctp_connect()
3872 err = __sctp_connect(sk, addr, af->sockaddr_len, NULL); in sctp_connect()
3875 release_sock(sk); in sctp_connect()
3880 static int sctp_disconnect(struct sock *sk, int flags) in sctp_disconnect() argument
3892 static struct sock *sctp_accept(struct sock *sk, int flags, int *err) in sctp_accept() argument
3901 lock_sock(sk); in sctp_accept()
3903 sp = sctp_sk(sk); in sctp_accept()
3906 if (!sctp_style(sk, TCP)) { in sctp_accept()
3911 if (!sctp_sstate(sk, LISTENING)) { in sctp_accept()
3916 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); in sctp_accept()
3918 error = sctp_wait_for_accept(sk, timeo); in sctp_accept()
3927 newsk = sp->pf->create_accept_sk(sk, asoc); in sctp_accept()
3936 sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); in sctp_accept()
3939 release_sock(sk); in sctp_accept()
3945 static int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg) in sctp_ioctl() argument
3949 lock_sock(sk); in sctp_ioctl()
3955 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) in sctp_ioctl()
3963 skb = skb_peek(&sk->sk_receive_queue); in sctp_ioctl()
3979 release_sock(sk); in sctp_ioctl()
3987 static int sctp_init_sock(struct sock *sk) in sctp_init_sock() argument
3989 struct net *net = sock_net(sk); in sctp_init_sock()
3992 pr_debug("%s: sk:%p\n", __func__, sk); in sctp_init_sock()
3994 sp = sctp_sk(sk); in sctp_init_sock()
3997 switch (sk->sk_type) { in sctp_init_sock()
4090 sp->pf = sctp_get_pf_specific(sk->sk_family); in sctp_init_sock()
4101 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL); in sctp_init_sock()
4107 sk->sk_destruct = sctp_destruct_sock; in sctp_init_sock()
4113 sock_prot_inuse_add(net, sk->sk_prot, 1); in sctp_init_sock()
4119 spin_lock(&sock_net(sk)->sctp.addr_wq_lock); in sctp_init_sock()
4123 spin_unlock(&sock_net(sk)->sctp.addr_wq_lock); in sctp_init_sock()
4136 static void sctp_destroy_sock(struct sock *sk) in sctp_destroy_sock() argument
4140 pr_debug("%s: sk:%p\n", __func__, sk); in sctp_destroy_sock()
4143 sp = sctp_sk(sk); in sctp_destroy_sock()
4157 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in sctp_destroy_sock()
4162 static void sctp_destruct_sock(struct sock *sk) in sctp_destruct_sock() argument
4164 struct sctp_sock *sp = sctp_sk(sk); in sctp_destruct_sock()
4169 inet_sock_destruct(sk); in sctp_destruct_sock()
4188 static void sctp_shutdown(struct sock *sk, int how) in sctp_shutdown() argument
4190 struct net *net = sock_net(sk); in sctp_shutdown()
4194 if (!sctp_style(sk, TCP)) in sctp_shutdown()
4198 ep = sctp_sk(sk)->ep; in sctp_shutdown()
4214 static int sctp_getsockopt_sctp_status(struct sock *sk, int len, in sctp_getsockopt_sctp_status() argument
4236 asoc = sctp_id2assoc(sk, associd); in sctp_getsockopt_sctp_status()
4257 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_getsockopt_sctp_status()
4294 static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len, in sctp_getsockopt_peer_addr_info() argument
4313 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address, in sctp_getsockopt_peer_addr_info()
4349 static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, in sctp_getsockopt_disable_fragments() argument
4358 val = (sctp_sk(sk)->disable_fragments == 1); in sctp_getsockopt_disable_fragments()
4371 static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, in sctp_getsockopt_events() argument
4380 if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) in sctp_getsockopt_events()
4396 static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *opt… in sctp_getsockopt_autoclose() argument
4399 if (sctp_style(sk, TCP)) in sctp_getsockopt_autoclose()
4406 if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int))) in sctp_getsockopt_autoclose()
4412 int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp) in sctp_do_peeloff() argument
4414 struct sctp_association *asoc = sctp_id2assoc(sk, id); in sctp_do_peeloff()
4415 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_peeloff()
4425 if (!sctp_style(sk, UDP)) in sctp_do_peeloff()
4429 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); in sctp_do_peeloff()
4433 sctp_copy_sock(sock->sk, sk, asoc); in sctp_do_peeloff()
4438 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk); in sctp_do_peeloff()
4443 sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); in sctp_do_peeloff()
4451 static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optle… in sctp_getsockopt_peeloff() argument
4464 retval = sctp_do_peeloff(sk, peeloff.associd, &newsock); in sctp_getsockopt_peeloff()
4482 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk, in sctp_getsockopt_peeloff()
4595 static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len, in sctp_getsockopt_peer_addr_params() argument
4601 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addr_params()
4612 if (!sctp_is_any(sk, (union sctp_addr *)&params.spp_address)) { in sctp_getsockopt_peer_addr_params()
4613 trans = sctp_addr_id2transport(sk, &params.spp_address, in sctp_getsockopt_peer_addr_params()
4625 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_getsockopt_peer_addr_params()
4626 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) { in sctp_getsockopt_peer_addr_params()
4704 static int sctp_getsockopt_delayed_ack(struct sock *sk, int len, in sctp_getsockopt_delayed_ack() argument
4710 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_delayed_ack()
4732 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_getsockopt_delayed_ack()
4733 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_delayed_ack()
4778 static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optle… in sctp_getsockopt_initmsg() argument
4785 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) in sctp_getsockopt_initmsg()
4791 static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, in sctp_getsockopt_peer_addrs() argument
4800 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addrs()
4812 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_peer_addrs()
4822 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_peer_addrs()
4842 static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to, in sctp_copy_laddrs() argument
4849 struct net *net = sock_net(sk); in sctp_copy_laddrs()
4856 if ((PF_INET == sk->sk_family) && in sctp_copy_laddrs()
4859 if ((PF_INET6 == sk->sk_family) && in sctp_copy_laddrs()
4860 inet_v6_ipv6only(sk) && in sctp_copy_laddrs()
4867 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_copy_laddrs()
4868 ->addr_to_user(sctp_sk(sk), &temp); in sctp_copy_laddrs()
4887 static int sctp_getsockopt_local_addrs(struct sock *sk, int len, in sctp_getsockopt_local_addrs() argument
4897 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_local_addrs()
4918 bp = &sctp_sk(sk)->ep->base.bind_addr; in sctp_getsockopt_local_addrs()
4920 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_local_addrs()
4939 if (sctp_is_any(sk, &addr->a)) { in sctp_getsockopt_local_addrs()
4940 cnt = sctp_copy_laddrs(sk, bp->port, addrs, in sctp_getsockopt_local_addrs()
4957 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_local_addrs()
4992 static int sctp_getsockopt_primary_addr(struct sock *sk, int len, in sctp_getsockopt_primary_addr() argument
4997 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_primary_addr()
5007 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id); in sctp_getsockopt_primary_addr()
5017 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp, in sctp_getsockopt_primary_addr()
5034 static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len, in sctp_getsockopt_adaptation_layer() argument
5044 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind; in sctp_getsockopt_adaptation_layer()
5073 static int sctp_getsockopt_default_send_param(struct sock *sk, in sctp_getsockopt_default_send_param() argument
5077 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_send_param()
5089 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_getsockopt_default_send_param()
5090 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_default_send_param()
5117 static int sctp_getsockopt_default_sndinfo(struct sock *sk, int len, in sctp_getsockopt_default_sndinfo() argument
5121 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_sndinfo()
5133 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_getsockopt_default_sndinfo()
5134 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_default_sndinfo()
5166 static int sctp_getsockopt_nodelay(struct sock *sk, int len, in sctp_getsockopt_nodelay() argument
5175 val = (sctp_sk(sk)->nodelay == 1); in sctp_getsockopt_nodelay()
5195 static int sctp_getsockopt_rtoinfo(struct sock *sk, int len, in sctp_getsockopt_rtoinfo() argument
5209 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_getsockopt_rtoinfo()
5211 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_rtoinfo()
5221 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_rtoinfo()
5248 static int sctp_getsockopt_associnfo(struct sock *sk, int len, in sctp_getsockopt_associnfo() argument
5266 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_getsockopt_associnfo()
5268 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_associnfo()
5285 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_associnfo()
5316 static int sctp_getsockopt_mappedv4(struct sock *sk, int len, in sctp_getsockopt_mappedv4() argument
5320 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_mappedv4()
5339 static int sctp_getsockopt_context(struct sock *sk, int len, in sctp_getsockopt_context() argument
5354 sp = sctp_sk(sk); in sctp_getsockopt_context()
5357 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_context()
5400 static int sctp_getsockopt_maxseg(struct sock *sk, int len, in sctp_getsockopt_maxseg() argument
5420 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxseg()
5421 if (!asoc && params.assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_maxseg()
5427 params.assoc_value = sctp_sk(sk)->user_frag; in sctp_getsockopt_maxseg()
5446 static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len, in sctp_getsockopt_fragment_interleave() argument
5456 val = sctp_sk(sk)->frag_interleave; in sctp_getsockopt_fragment_interleave()
5469 static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len, in sctp_getsockopt_partial_delivery_point() argument
5480 val = sctp_sk(sk)->pd_point; in sctp_getsockopt_partial_delivery_point()
5493 static int sctp_getsockopt_maxburst(struct sock *sk, int len, in sctp_getsockopt_maxburst() argument
5515 sp = sctp_sk(sk); in sctp_getsockopt_maxburst()
5518 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxburst()
5537 static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, in sctp_getsockopt_hmac_ident() argument
5540 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_hmac_ident()
5572 static int sctp_getsockopt_active_key(struct sock *sk, int len, in sctp_getsockopt_active_key() argument
5575 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_active_key()
5587 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_getsockopt_active_key()
5588 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_active_key()
5605 static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, in sctp_getsockopt_peer_auth_chunks() argument
5608 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_peer_auth_chunks()
5626 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_peer_auth_chunks()
5650 static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, in sctp_getsockopt_local_auth_chunks() argument
5653 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_local_auth_chunks()
5671 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_local_auth_chunks()
5672 if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_local_auth_chunks()
5704 static int sctp_getsockopt_assoc_number(struct sock *sk, int len, in sctp_getsockopt_assoc_number() argument
5707 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_number()
5711 if (sctp_style(sk, TCP)) in sctp_getsockopt_assoc_number()
5735 static int sctp_getsockopt_auto_asconf(struct sock *sk, int len, in sctp_getsockopt_auto_asconf() argument
5744 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk)) in sctp_getsockopt_auto_asconf()
5760 static int sctp_getsockopt_assoc_ids(struct sock *sk, int len, in sctp_getsockopt_assoc_ids() argument
5763 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_ids()
5768 if (sctp_style(sk, TCP)) in sctp_getsockopt_assoc_ids()
5809 static int sctp_getsockopt_paddr_thresholds(struct sock *sk, in sctp_getsockopt_paddr_thresholds() argument
5824 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { in sctp_getsockopt_paddr_thresholds()
5825 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_getsockopt_paddr_thresholds()
5832 trans = sctp_addr_id2transport(sk, &val.spt_address, in sctp_getsockopt_paddr_thresholds()
5853 static int sctp_getsockopt_assoc_stats(struct sock *sk, int len, in sctp_getsockopt_assoc_stats() argument
5870 asoc = sctp_id2assoc(sk, sas.sas_assoc_id); in sctp_getsockopt_assoc_stats()
5911 static int sctp_getsockopt_recvrcvinfo(struct sock *sk, int len, in sctp_getsockopt_recvrcvinfo() argument
5921 if (sctp_sk(sk)->recvrcvinfo) in sctp_getsockopt_recvrcvinfo()
5931 static int sctp_getsockopt_recvnxtinfo(struct sock *sk, int len, in sctp_getsockopt_recvnxtinfo() argument
5941 if (sctp_sk(sk)->recvnxtinfo) in sctp_getsockopt_recvnxtinfo()
5951 static int sctp_getsockopt(struct sock *sk, int level, int optname, in sctp_getsockopt() argument
5957 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname); in sctp_getsockopt()
5966 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_getsockopt()
5968 retval = af->getsockopt(sk, level, optname, optval, optlen); in sctp_getsockopt()
5975 lock_sock(sk); in sctp_getsockopt()
5979 retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen); in sctp_getsockopt()
5982 retval = sctp_getsockopt_disable_fragments(sk, len, optval, in sctp_getsockopt()
5986 retval = sctp_getsockopt_events(sk, len, optval, optlen); in sctp_getsockopt()
5989 retval = sctp_getsockopt_autoclose(sk, len, optval, optlen); in sctp_getsockopt()
5992 retval = sctp_getsockopt_peeloff(sk, len, optval, optlen); in sctp_getsockopt()
5995 retval = sctp_getsockopt_peer_addr_params(sk, len, optval, in sctp_getsockopt()
5999 retval = sctp_getsockopt_delayed_ack(sk, len, optval, in sctp_getsockopt()
6003 retval = sctp_getsockopt_initmsg(sk, len, optval, optlen); in sctp_getsockopt()
6006 retval = sctp_getsockopt_peer_addrs(sk, len, optval, in sctp_getsockopt()
6010 retval = sctp_getsockopt_local_addrs(sk, len, optval, in sctp_getsockopt()
6014 retval = sctp_getsockopt_connectx3(sk, len, optval, optlen); in sctp_getsockopt()
6017 retval = sctp_getsockopt_default_send_param(sk, len, in sctp_getsockopt()
6021 retval = sctp_getsockopt_default_sndinfo(sk, len, in sctp_getsockopt()
6025 retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen); in sctp_getsockopt()
6028 retval = sctp_getsockopt_nodelay(sk, len, optval, optlen); in sctp_getsockopt()
6031 retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen); in sctp_getsockopt()
6034 retval = sctp_getsockopt_associnfo(sk, len, optval, optlen); in sctp_getsockopt()
6037 retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen); in sctp_getsockopt()
6040 retval = sctp_getsockopt_maxseg(sk, len, optval, optlen); in sctp_getsockopt()
6043 retval = sctp_getsockopt_peer_addr_info(sk, len, optval, in sctp_getsockopt()
6047 retval = sctp_getsockopt_adaptation_layer(sk, len, optval, in sctp_getsockopt()
6051 retval = sctp_getsockopt_context(sk, len, optval, optlen); in sctp_getsockopt()
6054 retval = sctp_getsockopt_fragment_interleave(sk, len, optval, in sctp_getsockopt()
6058 retval = sctp_getsockopt_partial_delivery_point(sk, len, optval, in sctp_getsockopt()
6062 retval = sctp_getsockopt_maxburst(sk, len, optval, optlen); in sctp_getsockopt()
6070 retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen); in sctp_getsockopt()
6073 retval = sctp_getsockopt_active_key(sk, len, optval, optlen); in sctp_getsockopt()
6076 retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval, in sctp_getsockopt()
6080 retval = sctp_getsockopt_local_auth_chunks(sk, len, optval, in sctp_getsockopt()
6084 retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen); in sctp_getsockopt()
6087 retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen); in sctp_getsockopt()
6090 retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen); in sctp_getsockopt()
6093 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen); in sctp_getsockopt()
6096 retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen); in sctp_getsockopt()
6099 retval = sctp_getsockopt_recvrcvinfo(sk, len, optval, optlen); in sctp_getsockopt()
6102 retval = sctp_getsockopt_recvnxtinfo(sk, len, optval, optlen); in sctp_getsockopt()
6109 release_sock(sk); in sctp_getsockopt()
6113 static void sctp_hash(struct sock *sk) in sctp_hash() argument
6118 static void sctp_unhash(struct sock *sk) in sctp_unhash() argument
6138 static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr) in sctp_get_port_local() argument
6155 struct net *net = sock_net(sk); in sctp_get_port_local()
6167 index = sctp_phashfn(sock_net(sk), rover); in sctp_get_port_local()
6172 net_eq(sock_net(sk), pp->net)) in sctp_get_port_local()
6196 head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)]; in sctp_get_port_local()
6199 if ((pp->port == snum) && net_eq(pp->net, sock_net(sk))) in sctp_get_port_local()
6212 int reuse = sk->sk_reuse; in sctp_get_port_local()
6217 if (pp->fastreuse && sk->sk_reuse && in sctp_get_port_local()
6218 sk->sk_state != SCTP_SS_LISTENING) in sctp_get_port_local()
6235 if (sk == sk2 || in sctp_get_port_local()
6241 sctp_sk(sk2), sctp_sk(sk))) { in sctp_get_port_local()
6252 if (!pp && !(pp = sctp_bucket_create(head, sock_net(sk), snum))) in sctp_get_port_local()
6260 if (sk->sk_reuse && sk->sk_state != SCTP_SS_LISTENING) in sctp_get_port_local()
6265 (!sk->sk_reuse || sk->sk_state == SCTP_SS_LISTENING)) in sctp_get_port_local()
6273 if (!sctp_sk(sk)->bind_hash) { in sctp_get_port_local()
6274 inet_sk(sk)->inet_num = snum; in sctp_get_port_local()
6275 sk_add_bind_node(sk, &pp->owner); in sctp_get_port_local()
6276 sctp_sk(sk)->bind_hash = pp; in sctp_get_port_local()
6291 static int sctp_get_port(struct sock *sk, unsigned short snum) in sctp_get_port() argument
6294 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_get_port()
6297 af->from_sk(&addr, sk); in sctp_get_port()
6301 return !!sctp_get_port_local(sk, &addr); in sctp_get_port()
6307 static int sctp_listen_start(struct sock *sk, int backlog) in sctp_listen_start() argument
6309 struct sctp_sock *sp = sctp_sk(sk); in sctp_listen_start()
6323 sctp_sk(sk)->hmac = tfm; in sctp_listen_start()
6337 sk->sk_state = SCTP_SS_LISTENING; in sctp_listen_start()
6339 if (sctp_autobind(sk)) in sctp_listen_start()
6342 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) { in sctp_listen_start()
6343 sk->sk_state = SCTP_SS_CLOSED; in sctp_listen_start()
6348 sk->sk_max_ack_backlog = backlog; in sctp_listen_start()
6369 struct sock *sk = sock->sk; in sctp_inet_listen() local
6370 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_inet_listen()
6376 lock_sock(sk); in sctp_inet_listen()
6379 if (sctp_style(sk, UDP_HIGH_BANDWIDTH)) in sctp_inet_listen()
6387 if (sctp_sstate(sk, CLOSED)) in sctp_inet_listen()
6392 sk->sk_state = SCTP_SS_CLOSED; in sctp_inet_listen()
6393 if (sk->sk_reuse) in sctp_inet_listen()
6394 sctp_sk(sk)->bind_hash->fastreuse = 1; in sctp_inet_listen()
6399 if (sctp_sstate(sk, LISTENING)) in sctp_inet_listen()
6400 sk->sk_max_ack_backlog = backlog; in sctp_inet_listen()
6402 err = sctp_listen_start(sk, backlog); in sctp_inet_listen()
6409 release_sock(sk); in sctp_inet_listen()
6428 struct sock *sk = sock->sk; in sctp_poll() local
6429 struct sctp_sock *sp = sctp_sk(sk); in sctp_poll()
6432 poll_wait(file, sk_sleep(sk), wait); in sctp_poll()
6437 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) in sctp_poll()
6444 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) in sctp_poll()
6446 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0); in sctp_poll()
6447 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_poll()
6449 if (sk->sk_shutdown == SHUTDOWN_MASK) in sctp_poll()
6453 if (!skb_queue_empty(&sk->sk_receive_queue)) in sctp_poll()
6457 if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED)) in sctp_poll()
6461 if (sctp_writeable(sk)) { in sctp_poll()
6464 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); in sctp_poll()
6473 if (sctp_writeable(sk)) in sctp_poll()
6511 static inline void __sctp_put_port(struct sock *sk) in __sctp_put_port() argument
6514 &sctp_port_hashtable[sctp_phashfn(sock_net(sk), in __sctp_put_port()
6515 inet_sk(sk)->inet_num)]; in __sctp_put_port()
6519 pp = sctp_sk(sk)->bind_hash; in __sctp_put_port()
6520 __sk_del_bind_node(sk); in __sctp_put_port()
6521 sctp_sk(sk)->bind_hash = NULL; in __sctp_put_port()
6522 inet_sk(sk)->inet_num = 0; in __sctp_put_port()
6527 void sctp_put_port(struct sock *sk) in sctp_put_port() argument
6530 __sctp_put_port(sk); in sctp_put_port()
6540 static int sctp_autobind(struct sock *sk) in sctp_autobind() argument
6547 af = sctp_sk(sk)->pf->af; in sctp_autobind()
6549 port = htons(inet_sk(sk)->inet_num); in sctp_autobind()
6552 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); in sctp_autobind()
6689 static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p) in sctp_wait_for_packet() argument
6694 prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in sctp_wait_for_packet()
6697 error = sock_error(sk); in sctp_wait_for_packet()
6701 if (!skb_queue_empty(&sk->sk_receive_queue)) in sctp_wait_for_packet()
6705 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_packet()
6714 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING)) in sctp_wait_for_packet()
6726 release_sock(sk); in sctp_wait_for_packet()
6728 lock_sock(sk); in sctp_wait_for_packet()
6731 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_packet()
6738 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_packet()
6747 struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, in sctp_skb_recv_datagram() argument
6754 timeo = sock_rcvtimeo(sk, noblock); in sctp_skb_recv_datagram()
6768 spin_lock_bh(&sk->sk_receive_queue.lock); in sctp_skb_recv_datagram()
6769 skb = skb_peek(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
6772 spin_unlock_bh(&sk->sk_receive_queue.lock); in sctp_skb_recv_datagram()
6774 skb = skb_dequeue(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
6781 error = sock_error(sk); in sctp_skb_recv_datagram()
6785 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_skb_recv_datagram()
6788 if (sk_can_busy_loop(sk) && in sctp_skb_recv_datagram()
6789 sk_busy_loop(sk, noblock)) in sctp_skb_recv_datagram()
6796 } while (sctp_wait_for_packet(sk, err, &timeo) == 0); in sctp_skb_recv_datagram()
6808 struct sock *sk = asoc->base.sk; in __sctp_write_space() local
6816 if (sctp_writeable(sk)) { in __sctp_write_space()
6820 wq = rcu_dereference(sk->sk_wq); in __sctp_write_space()
6829 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in __sctp_write_space()
6836 static void sctp_wake_up_waiters(struct sock *sk, in sctp_wake_up_waiters() argument
6851 return sctp_write_space(sk); in sctp_wake_up_waiters()
6866 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs)) in sctp_wake_up_waiters()
6884 struct sock *sk = asoc->base.sk; in sctp_wfree() local
6890 atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); in sctp_wfree()
6895 sk->sk_wmem_queued -= skb->truesize; in sctp_wfree()
6896 sk_mem_uncharge(sk, skb->truesize); in sctp_wfree()
6899 sctp_wake_up_waiters(sk, asoc); in sctp_wfree()
6911 struct sock *sk = skb->sk; in sctp_sock_rfree() local
6914 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc); in sctp_sock_rfree()
6919 sk_mem_uncharge(sk, event->rmem_len); in sctp_sock_rfree()
6927 struct sock *sk = asoc->base.sk; in sctp_wait_for_sndbuf() local
6944 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_sndbuf()
6955 release_sock(sk); in sctp_wait_for_sndbuf()
6957 BUG_ON(sk != asoc->base.sk); in sctp_wait_for_sndbuf()
6958 lock_sock(sk); in sctp_wait_for_sndbuf()
6984 void sctp_data_ready(struct sock *sk) in sctp_data_ready() argument
6989 wq = rcu_dereference(sk->sk_wq); in sctp_data_ready()
6993 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); in sctp_data_ready()
6998 void sctp_write_space(struct sock *sk) in sctp_write_space() argument
7003 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { in sctp_write_space()
7019 static int sctp_writeable(struct sock *sk) in sctp_writeable() argument
7023 amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk); in sctp_writeable()
7034 struct sock *sk = asoc->base.sk; in sctp_wait_for_connect() local
7049 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_connect()
7051 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_connect()
7063 release_sock(sk); in sctp_wait_for_connect()
7065 lock_sock(sk); in sctp_wait_for_connect()
7094 static int sctp_wait_for_accept(struct sock *sk, long timeo) in sctp_wait_for_accept() argument
7100 ep = sctp_sk(sk)->ep; in sctp_wait_for_accept()
7104 prepare_to_wait_exclusive(sk_sleep(sk), &wait, in sctp_wait_for_accept()
7108 release_sock(sk); in sctp_wait_for_accept()
7110 lock_sock(sk); in sctp_wait_for_accept()
7114 if (!sctp_sstate(sk, LISTENING)) in sctp_wait_for_accept()
7130 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_accept()
7135 static void sctp_wait_for_close(struct sock *sk, long timeout) in sctp_wait_for_close() argument
7140 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in sctp_wait_for_close()
7141 if (list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_wait_for_close()
7143 release_sock(sk); in sctp_wait_for_close()
7145 lock_sock(sk); in sctp_wait_for_close()
7148 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_close()
7151 static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk) in sctp_skb_set_owner_r_frag() argument
7160 sctp_skb_set_owner_r_frag(frag, sk); in sctp_skb_set_owner_r_frag()
7163 sctp_skb_set_owner_r(skb, sk); in sctp_skb_set_owner_r_frag()
7166 void sctp_copy_sock(struct sock *newsk, struct sock *sk, in sctp_copy_sock() argument
7169 struct inet_sock *inet = inet_sk(sk); in sctp_copy_sock()
7172 newsk->sk_type = sk->sk_type; in sctp_copy_sock()
7173 newsk->sk_bound_dev_if = sk->sk_bound_dev_if; in sctp_copy_sock()
7174 newsk->sk_flags = sk->sk_flags; in sctp_copy_sock()
7175 newsk->sk_tsflags = sk->sk_tsflags; in sctp_copy_sock()
7176 newsk->sk_no_check_tx = sk->sk_no_check_tx; in sctp_copy_sock()
7177 newsk->sk_no_check_rx = sk->sk_no_check_rx; in sctp_copy_sock()
7178 newsk->sk_reuse = sk->sk_reuse; in sctp_copy_sock()
7180 newsk->sk_shutdown = sk->sk_shutdown; in sctp_copy_sock()
7182 newsk->sk_family = sk->sk_family; in sctp_copy_sock()
7184 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; in sctp_copy_sock()
7185 newsk->sk_sndbuf = sk->sk_sndbuf; in sctp_copy_sock()
7186 newsk->sk_rcvbuf = sk->sk_rcvbuf; in sctp_copy_sock()
7187 newsk->sk_lingertime = sk->sk_lingertime; in sctp_copy_sock()
7188 newsk->sk_rcvtimeo = sk->sk_rcvtimeo; in sctp_copy_sock()
7189 newsk->sk_sndtimeo = sk->sk_sndtimeo; in sctp_copy_sock()
7212 security_sk_clone(sk, newsk); in sctp_copy_sock()
7394 static void sctp_v6_destroy_sock(struct sock *sk) in sctp_v6_destroy_sock() argument
7396 sctp_destroy_sock(sk); in sctp_v6_destroy_sock()
7397 inet6_destroy_sock(sk); in sctp_v6_destroy_sock()