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
1308 __func__, sk, addrs, addrs_size); in __sctp_setsockopt_connectx()
1325 err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id); in __sctp_setsockopt_connectx()
1337 static int sctp_setsockopt_connectx_old(struct sock *sk, in sctp_setsockopt_connectx_old() argument
1341 return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL); in sctp_setsockopt_connectx_old()
1350 static int sctp_setsockopt_connectx(struct sock *sk, in sctp_setsockopt_connectx() argument
1357 err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id); in sctp_setsockopt_connectx()
1381 static int sctp_getsockopt_connectx3(struct sock *sk, int len, in sctp_getsockopt_connectx3() argument
1410 err = __sctp_setsockopt_connectx(sk, (struct sockaddr __user *) in sctp_getsockopt_connectx3()
1473 static void sctp_close(struct sock *sk, long timeout) in sctp_close() argument
1475 struct net *net = sock_net(sk); in sctp_close()
1481 pr_debug("%s: sk:%p, timeout:%ld\n", __func__, sk, timeout); in sctp_close()
1483 lock_sock(sk); in sctp_close()
1484 sk->sk_shutdown = SHUTDOWN_MASK; in sctp_close()
1485 sk->sk_state = SCTP_SS_CLOSING; in sctp_close()
1487 ep = sctp_sk(sk)->ep; in sctp_close()
1490 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue); in sctp_close()
1491 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby); in sctp_close()
1497 if (sctp_style(sk, TCP)) { in sctp_close()
1512 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) { in sctp_close()
1522 if (sctp_style(sk, TCP) && timeout) in sctp_close()
1523 sctp_wait_for_close(sk, timeout); in sctp_close()
1526 release_sock(sk); in sctp_close()
1534 bh_lock_sock(sk); in sctp_close()
1539 sock_hold(sk); in sctp_close()
1540 sk_common_release(sk); in sctp_close()
1542 bh_unlock_sock(sk); in sctp_close()
1545 sock_put(sk); in sctp_close()
1551 static int sctp_error(struct sock *sk, int flags, int err) in sctp_error() argument
1554 err = sock_error(sk) ? : -EPIPE; in sctp_error()
1585 static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) in sctp_sendmsg() argument
1587 struct net *net = sock_net(sk); in sctp_sendmsg()
1609 sp = sctp_sk(sk); in sctp_sendmsg()
1612 pr_debug("%s: sk:%p, msg:%p, msg_len:%zu ep:%p\n", __func__, sk, in sctp_sendmsg()
1616 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) { in sctp_sendmsg()
1633 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { in sctp_sendmsg()
1636 err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name, in sctp_sendmsg()
1671 if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) { in sctp_sendmsg()
1699 lock_sock(sk); in sctp_sendmsg()
1711 if ((sctp_style(sk, TCP) && in sctp_sendmsg()
1712 sctp_sstate(sk, ESTABLISHED)) || in sctp_sendmsg()
1719 asoc = sctp_id2assoc(sk, associd); in sctp_sendmsg()
1734 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) { in sctp_sendmsg()
1802 if (sctp_autobind(sk)) { in sctp_sendmsg()
1822 new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); in sctp_sendmsg()
1890 if (msg_len > sk->sk_sndbuf) { in sctp_sendmsg()
1896 sctp_assoc_pending_pmtu(sk, asoc); in sctp_sendmsg()
1903 if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) { in sctp_sendmsg()
1914 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in sctp_sendmsg()
1925 if ((sctp_style(sk, TCP) && msg_name) || in sctp_sendmsg()
1980 timeo = sock_sndtimeo(sk, msg_flags & MSG_DONTWAIT); in sctp_sendmsg()
1995 release_sock(sk); in sctp_sendmsg()
1998 return sctp_error(sk, msg_flags, err); in sctp_sendmsg()
2005 err = sock_error(sk); in sctp_sendmsg()
2064 static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, in sctp_recvmsg() argument
2068 struct sctp_sock *sp = sctp_sk(sk); in sctp_recvmsg()
2075 "addr_len:%p)\n", __func__, sk, msg, len, noblock, flags, in sctp_recvmsg()
2078 lock_sock(sk); in sctp_recvmsg()
2080 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED)) { in sctp_recvmsg()
2085 skb = sctp_skb_recv_datagram(sk, flags, noblock, &err); in sctp_recvmsg()
2105 sock_recv_ts_and_drops(msg, sk, skb); in sctp_recvmsg()
2115 sctp_ulpevent_read_nxtinfo(event, msg, sk); in sctp_recvmsg()
2125 if (sk->sk_protinfo.af_inet.cmsg_flags) in sctp_recvmsg()
2140 skb_queue_head(&sk->sk_receive_queue, skb); in sctp_recvmsg()
2169 release_sock(sk); in sctp_recvmsg()
2180 static int sctp_setsockopt_disable_fragments(struct sock *sk, in sctp_setsockopt_disable_fragments() argument
2192 sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1; in sctp_setsockopt_disable_fragments()
2197 static int sctp_setsockopt_events(struct sock *sk, char __user *optval, in sctp_setsockopt_events() argument
2205 if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) in sctp_setsockopt_events()
2208 if (sctp_sk(sk)->subscribe.sctp_data_io_event) in sctp_setsockopt_events()
2219 &sctp_sk(sk)->subscribe)) { in sctp_setsockopt_events()
2220 asoc = sctp_id2assoc(sk, 0); in sctp_setsockopt_events()
2246 static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, in sctp_setsockopt_autoclose() argument
2249 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_autoclose()
2250 struct net *net = sock_net(sk); in sctp_setsockopt_autoclose()
2253 if (sctp_style(sk, TCP)) in sctp_setsockopt_autoclose()
2374 struct net *net = sock_net(trans->asoc->base.sk); in sctp_apply_peer_addr_params()
2505 static int sctp_setsockopt_peer_addr_params(struct sock *sk, in sctp_setsockopt_peer_addr_params() argument
2512 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_peer_addr_params()
2538 if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) { in sctp_setsockopt_peer_addr_params()
2539 trans = sctp_addr_id2transport(sk, ¶ms.spp_address, in sctp_setsockopt_peer_addr_params()
2549 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2550 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_peer_addr_params()
2628 static int sctp_setsockopt_delayed_ack(struct sock *sk, in sctp_setsockopt_delayed_ack() argument
2634 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_delayed_ack()
2666 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_setsockopt_delayed_ack()
2667 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_delayed_ack()
2738 static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_initmsg() argument
2741 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_initmsg()
2774 static int sctp_setsockopt_default_send_param(struct sock *sk, in sctp_setsockopt_default_send_param() argument
2778 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_send_param()
2791 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_setsockopt_default_send_param()
2792 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_default_send_param()
2814 static int sctp_setsockopt_default_sndinfo(struct sock *sk, in sctp_setsockopt_default_sndinfo() argument
2818 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_default_sndinfo()
2831 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_setsockopt_default_sndinfo()
2832 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_default_sndinfo()
2855 static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval, in sctp_setsockopt_primary_addr() argument
2867 trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); in sctp_setsockopt_primary_addr()
2884 static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval, in sctp_setsockopt_nodelay() argument
2894 sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1; in sctp_setsockopt_nodelay()
2910 static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_rtoinfo() argument
2915 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_rtoinfo()
2923 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_setsockopt_rtoinfo()
2926 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_rtoinfo()
2975 static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_associnfo() argument
2986 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_setsockopt_associnfo()
2988 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_associnfo()
3020 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_associnfo()
3042 static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_mappedv4() argument
3045 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_mappedv4()
3086 static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen) in sctp_setsockopt_maxseg() argument
3090 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_maxseg()
3112 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_maxseg()
3113 if (!asoc && params.assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_maxseg()
3141 static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval, in sctp_setsockopt_peer_primary_addr() argument
3144 struct net *net = sock_net(sk); in sctp_setsockopt_peer_primary_addr()
3152 sp = sctp_sk(sk); in sctp_setsockopt_peer_primary_addr()
3163 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); in sctp_setsockopt_peer_primary_addr()
3199 static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval, in sctp_setsockopt_adaptation_layer() argument
3209 sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind; in sctp_setsockopt_adaptation_layer()
3228 static int sctp_setsockopt_context(struct sock *sk, char __user *optval, in sctp_setsockopt_context() argument
3240 sp = sctp_sk(sk); in sctp_setsockopt_context()
3243 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_context()
3278 static int sctp_setsockopt_fragment_interleave(struct sock *sk, in sctp_setsockopt_fragment_interleave() argument
3289 sctp_sk(sk)->frag_interleave = (val == 0) ? 0 : 1; in sctp_setsockopt_fragment_interleave()
3311 static int sctp_setsockopt_partial_delivery_point(struct sock *sk, in sctp_setsockopt_partial_delivery_point() argument
3325 if (val > (sk->sk_rcvbuf >> 1)) in sctp_setsockopt_partial_delivery_point()
3328 sctp_sk(sk)->pd_point = val; in sctp_setsockopt_partial_delivery_point()
3344 static int sctp_setsockopt_maxburst(struct sock *sk, in sctp_setsockopt_maxburst() argument
3370 sp = sctp_sk(sk); in sctp_setsockopt_maxburst()
3373 asoc = sctp_id2assoc(sk, assoc_id); in sctp_setsockopt_maxburst()
3390 static int sctp_setsockopt_auth_chunk(struct sock *sk, in sctp_setsockopt_auth_chunk() argument
3394 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_chunk()
3423 static int sctp_setsockopt_hmac_ident(struct sock *sk, in sctp_setsockopt_hmac_ident() argument
3427 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_hmac_ident()
3461 static int sctp_setsockopt_auth_key(struct sock *sk, in sctp_setsockopt_auth_key() argument
3465 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_auth_key()
3485 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); in sctp_setsockopt_auth_key()
3486 if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) { in sctp_setsockopt_auth_key()
3503 static int sctp_setsockopt_active_key(struct sock *sk, in sctp_setsockopt_active_key() argument
3507 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_active_key()
3519 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_active_key()
3520 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_active_key()
3531 static int sctp_setsockopt_del_key(struct sock *sk, in sctp_setsockopt_del_key() argument
3535 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_setsockopt_del_key()
3547 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_del_key()
3548 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_del_key()
3569 static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, in sctp_setsockopt_auto_asconf() argument
3573 struct sctp_sock *sp = sctp_sk(sk); in sctp_setsockopt_auto_asconf()
3579 if (!sctp_is_ep_boundall(sk) && val) in sctp_setsockopt_auto_asconf()
3584 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3590 &sock_net(sk)->sctp.auto_asconf_splist); in sctp_setsockopt_auto_asconf()
3593 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); in sctp_setsockopt_auto_asconf()
3604 static int sctp_setsockopt_paddr_thresholds(struct sock *sk, in sctp_setsockopt_paddr_thresholds() argument
3619 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { in sctp_setsockopt_paddr_thresholds()
3620 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3634 trans = sctp_addr_id2transport(sk, &val.spt_address, in sctp_setsockopt_paddr_thresholds()
3647 static int sctp_setsockopt_recvrcvinfo(struct sock *sk, in sctp_setsockopt_recvrcvinfo() argument
3658 sctp_sk(sk)->recvrcvinfo = (val == 0) ? 0 : 1; in sctp_setsockopt_recvrcvinfo()
3663 static int sctp_setsockopt_recvnxtinfo(struct sock *sk, in sctp_setsockopt_recvnxtinfo() argument
3674 sctp_sk(sk)->recvnxtinfo = (val == 0) ? 0 : 1; in sctp_setsockopt_recvnxtinfo()
3698 static int sctp_setsockopt(struct sock *sk, int level, int optname, in sctp_setsockopt() argument
3703 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname); in sctp_setsockopt()
3712 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_setsockopt()
3713 retval = af->setsockopt(sk, level, optname, optval, optlen); in sctp_setsockopt()
3717 lock_sock(sk); in sctp_setsockopt()
3722 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, in sctp_setsockopt()
3728 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, in sctp_setsockopt()
3734 retval = sctp_setsockopt_connectx_old(sk, in sctp_setsockopt()
3741 retval = sctp_setsockopt_connectx(sk, in sctp_setsockopt()
3747 retval = sctp_setsockopt_disable_fragments(sk, optval, optlen); in sctp_setsockopt()
3751 retval = sctp_setsockopt_events(sk, optval, optlen); in sctp_setsockopt()
3755 retval = sctp_setsockopt_autoclose(sk, optval, optlen); in sctp_setsockopt()
3759 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); in sctp_setsockopt()
3763 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); in sctp_setsockopt()
3766 retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen); in sctp_setsockopt()
3770 retval = sctp_setsockopt_initmsg(sk, optval, optlen); in sctp_setsockopt()
3773 retval = sctp_setsockopt_default_send_param(sk, optval, in sctp_setsockopt()
3777 retval = sctp_setsockopt_default_sndinfo(sk, optval, optlen); in sctp_setsockopt()
3780 retval = sctp_setsockopt_primary_addr(sk, optval, optlen); in sctp_setsockopt()
3783 retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen); in sctp_setsockopt()
3786 retval = sctp_setsockopt_nodelay(sk, optval, optlen); in sctp_setsockopt()
3789 retval = sctp_setsockopt_rtoinfo(sk, optval, optlen); in sctp_setsockopt()
3792 retval = sctp_setsockopt_associnfo(sk, optval, optlen); in sctp_setsockopt()
3795 retval = sctp_setsockopt_mappedv4(sk, optval, optlen); in sctp_setsockopt()
3798 retval = sctp_setsockopt_maxseg(sk, optval, optlen); in sctp_setsockopt()
3801 retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen); in sctp_setsockopt()
3804 retval = sctp_setsockopt_context(sk, optval, optlen); in sctp_setsockopt()
3807 retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen); in sctp_setsockopt()
3810 retval = sctp_setsockopt_maxburst(sk, optval, optlen); in sctp_setsockopt()
3813 retval = sctp_setsockopt_auth_chunk(sk, optval, optlen); in sctp_setsockopt()
3816 retval = sctp_setsockopt_hmac_ident(sk, optval, optlen); in sctp_setsockopt()
3819 retval = sctp_setsockopt_auth_key(sk, optval, optlen); in sctp_setsockopt()
3822 retval = sctp_setsockopt_active_key(sk, optval, optlen); in sctp_setsockopt()
3825 retval = sctp_setsockopt_del_key(sk, optval, optlen); in sctp_setsockopt()
3828 retval = sctp_setsockopt_auto_asconf(sk, optval, optlen); in sctp_setsockopt()
3831 retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen); in sctp_setsockopt()
3834 retval = sctp_setsockopt_recvrcvinfo(sk, optval, optlen); in sctp_setsockopt()
3837 retval = sctp_setsockopt_recvnxtinfo(sk, optval, optlen); in sctp_setsockopt()
3844 release_sock(sk); in sctp_setsockopt()
3866 static int sctp_connect(struct sock *sk, struct sockaddr *addr, in sctp_connect() argument
3872 lock_sock(sk); in sctp_connect()
3874 pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk, in sctp_connect()
3885 err = __sctp_connect(sk, addr, af->sockaddr_len, NULL); in sctp_connect()
3888 release_sock(sk); in sctp_connect()
3893 static int sctp_disconnect(struct sock *sk, int flags) in sctp_disconnect() argument
3905 static struct sock *sctp_accept(struct sock *sk, int flags, int *err) in sctp_accept() argument
3914 lock_sock(sk); in sctp_accept()
3916 sp = sctp_sk(sk); in sctp_accept()
3919 if (!sctp_style(sk, TCP)) { in sctp_accept()
3924 if (!sctp_sstate(sk, LISTENING)) { in sctp_accept()
3929 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); in sctp_accept()
3931 error = sctp_wait_for_accept(sk, timeo); in sctp_accept()
3940 newsk = sp->pf->create_accept_sk(sk, asoc); in sctp_accept()
3949 sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); in sctp_accept()
3952 release_sock(sk); in sctp_accept()
3958 static int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg) in sctp_ioctl() argument
3962 lock_sock(sk); in sctp_ioctl()
3968 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) in sctp_ioctl()
3976 skb = skb_peek(&sk->sk_receive_queue); in sctp_ioctl()
3992 release_sock(sk); in sctp_ioctl()
4000 static int sctp_init_sock(struct sock *sk) in sctp_init_sock() argument
4002 struct net *net = sock_net(sk); in sctp_init_sock()
4005 pr_debug("%s: sk:%p\n", __func__, sk); in sctp_init_sock()
4007 sp = sctp_sk(sk); in sctp_init_sock()
4010 switch (sk->sk_type) { in sctp_init_sock()
4103 sp->pf = sctp_get_pf_specific(sk->sk_family); in sctp_init_sock()
4114 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL); in sctp_init_sock()
4120 sk->sk_destruct = sctp_destruct_sock; in sctp_init_sock()
4126 sock_prot_inuse_add(net, sk->sk_prot, 1); in sctp_init_sock()
4132 spin_lock(&sock_net(sk)->sctp.addr_wq_lock); in sctp_init_sock()
4136 spin_unlock(&sock_net(sk)->sctp.addr_wq_lock); in sctp_init_sock()
4149 static void sctp_destroy_sock(struct sock *sk) in sctp_destroy_sock() argument
4153 pr_debug("%s: sk:%p\n", __func__, sk); in sctp_destroy_sock()
4156 sp = sctp_sk(sk); in sctp_destroy_sock()
4170 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); in sctp_destroy_sock()
4175 static void sctp_destruct_sock(struct sock *sk) in sctp_destruct_sock() argument
4177 struct sctp_sock *sp = sctp_sk(sk); in sctp_destruct_sock()
4182 inet_sock_destruct(sk); in sctp_destruct_sock()
4201 static void sctp_shutdown(struct sock *sk, int how) in sctp_shutdown() argument
4203 struct net *net = sock_net(sk); in sctp_shutdown()
4207 if (!sctp_style(sk, TCP)) in sctp_shutdown()
4211 ep = sctp_sk(sk)->ep; in sctp_shutdown()
4227 static int sctp_getsockopt_sctp_status(struct sock *sk, int len, in sctp_getsockopt_sctp_status() argument
4249 asoc = sctp_id2assoc(sk, associd); in sctp_getsockopt_sctp_status()
4270 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk), in sctp_getsockopt_sctp_status()
4307 static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len, in sctp_getsockopt_peer_addr_info() argument
4326 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address, in sctp_getsockopt_peer_addr_info()
4362 static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, in sctp_getsockopt_disable_fragments() argument
4371 val = (sctp_sk(sk)->disable_fragments == 1); in sctp_getsockopt_disable_fragments()
4384 static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, in sctp_getsockopt_events() argument
4393 if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) in sctp_getsockopt_events()
4409 static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *opt… in sctp_getsockopt_autoclose() argument
4412 if (sctp_style(sk, TCP)) in sctp_getsockopt_autoclose()
4419 if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int))) in sctp_getsockopt_autoclose()
4425 int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp) in sctp_do_peeloff() argument
4427 struct sctp_association *asoc = sctp_id2assoc(sk, id); in sctp_do_peeloff()
4428 struct sctp_sock *sp = sctp_sk(sk); in sctp_do_peeloff()
4438 if (!sctp_style(sk, UDP)) in sctp_do_peeloff()
4442 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); in sctp_do_peeloff()
4446 sctp_copy_sock(sock->sk, sk, asoc); in sctp_do_peeloff()
4451 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk); in sctp_do_peeloff()
4456 sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); in sctp_do_peeloff()
4464 static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optle… in sctp_getsockopt_peeloff() argument
4477 retval = sctp_do_peeloff(sk, peeloff.associd, &newsock); in sctp_getsockopt_peeloff()
4495 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk, in sctp_getsockopt_peeloff()
4608 static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len, in sctp_getsockopt_peer_addr_params() argument
4614 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addr_params()
4625 if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) { in sctp_getsockopt_peer_addr_params()
4626 trans = sctp_addr_id2transport(sk, ¶ms.spp_address, in sctp_getsockopt_peer_addr_params()
4638 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_getsockopt_peer_addr_params()
4639 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) { in sctp_getsockopt_peer_addr_params()
4717 static int sctp_getsockopt_delayed_ack(struct sock *sk, int len, in sctp_getsockopt_delayed_ack() argument
4723 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_delayed_ack()
4745 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_getsockopt_delayed_ack()
4746 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_delayed_ack()
4791 static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optle… in sctp_getsockopt_initmsg() argument
4798 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) in sctp_getsockopt_initmsg()
4804 static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, in sctp_getsockopt_peer_addrs() argument
4813 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_peer_addrs()
4825 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_peer_addrs()
4835 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_peer_addrs()
4855 static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to, in sctp_copy_laddrs() argument
4862 struct net *net = sock_net(sk); in sctp_copy_laddrs()
4869 if ((PF_INET == sk->sk_family) && in sctp_copy_laddrs()
4872 if ((PF_INET6 == sk->sk_family) && in sctp_copy_laddrs()
4873 inet_v6_ipv6only(sk) && in sctp_copy_laddrs()
4880 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_copy_laddrs()
4881 ->addr_to_user(sctp_sk(sk), &temp); in sctp_copy_laddrs()
4900 static int sctp_getsockopt_local_addrs(struct sock *sk, int len, in sctp_getsockopt_local_addrs() argument
4910 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_local_addrs()
4931 bp = &sctp_sk(sk)->ep->base.bind_addr; in sctp_getsockopt_local_addrs()
4933 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_local_addrs()
4952 if (sctp_is_any(sk, &addr->a)) { in sctp_getsockopt_local_addrs()
4953 cnt = sctp_copy_laddrs(sk, bp->port, addrs, in sctp_getsockopt_local_addrs()
4970 addrlen = sctp_get_pf_specific(sk->sk_family) in sctp_getsockopt_local_addrs()
5005 static int sctp_getsockopt_primary_addr(struct sock *sk, int len, in sctp_getsockopt_primary_addr() argument
5010 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_primary_addr()
5020 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id); in sctp_getsockopt_primary_addr()
5030 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp, in sctp_getsockopt_primary_addr()
5047 static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len, in sctp_getsockopt_adaptation_layer() argument
5057 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind; in sctp_getsockopt_adaptation_layer()
5086 static int sctp_getsockopt_default_send_param(struct sock *sk, in sctp_getsockopt_default_send_param() argument
5090 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_send_param()
5102 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_getsockopt_default_send_param()
5103 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_default_send_param()
5130 static int sctp_getsockopt_default_sndinfo(struct sock *sk, int len, in sctp_getsockopt_default_sndinfo() argument
5134 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_default_sndinfo()
5146 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_getsockopt_default_sndinfo()
5147 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_default_sndinfo()
5179 static int sctp_getsockopt_nodelay(struct sock *sk, int len, in sctp_getsockopt_nodelay() argument
5188 val = (sctp_sk(sk)->nodelay == 1); in sctp_getsockopt_nodelay()
5208 static int sctp_getsockopt_rtoinfo(struct sock *sk, int len, in sctp_getsockopt_rtoinfo() argument
5222 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_getsockopt_rtoinfo()
5224 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_rtoinfo()
5234 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_rtoinfo()
5261 static int sctp_getsockopt_associnfo(struct sock *sk, int len, in sctp_getsockopt_associnfo() argument
5279 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_getsockopt_associnfo()
5281 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_associnfo()
5298 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_associnfo()
5329 static int sctp_getsockopt_mappedv4(struct sock *sk, int len, in sctp_getsockopt_mappedv4() argument
5333 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_mappedv4()
5352 static int sctp_getsockopt_context(struct sock *sk, int len, in sctp_getsockopt_context() argument
5367 sp = sctp_sk(sk); in sctp_getsockopt_context()
5370 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_context()
5413 static int sctp_getsockopt_maxseg(struct sock *sk, int len, in sctp_getsockopt_maxseg() argument
5433 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxseg()
5434 if (!asoc && params.assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_maxseg()
5440 params.assoc_value = sctp_sk(sk)->user_frag; in sctp_getsockopt_maxseg()
5459 static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len, in sctp_getsockopt_fragment_interleave() argument
5469 val = sctp_sk(sk)->frag_interleave; in sctp_getsockopt_fragment_interleave()
5482 static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len, in sctp_getsockopt_partial_delivery_point() argument
5493 val = sctp_sk(sk)->pd_point; in sctp_getsockopt_partial_delivery_point()
5506 static int sctp_getsockopt_maxburst(struct sock *sk, int len, in sctp_getsockopt_maxburst() argument
5528 sp = sctp_sk(sk); in sctp_getsockopt_maxburst()
5531 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxburst()
5550 static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, in sctp_getsockopt_hmac_ident() argument
5553 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_hmac_ident()
5585 static int sctp_getsockopt_active_key(struct sock *sk, int len, in sctp_getsockopt_active_key() argument
5588 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_active_key()
5600 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_getsockopt_active_key()
5601 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_active_key()
5618 static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, in sctp_getsockopt_peer_auth_chunks() argument
5621 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_peer_auth_chunks()
5639 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_peer_auth_chunks()
5663 static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, in sctp_getsockopt_local_auth_chunks() argument
5666 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_getsockopt_local_auth_chunks()
5684 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_local_auth_chunks()
5685 if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_local_auth_chunks()
5717 static int sctp_getsockopt_assoc_number(struct sock *sk, int len, in sctp_getsockopt_assoc_number() argument
5720 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_number()
5724 if (sctp_style(sk, TCP)) in sctp_getsockopt_assoc_number()
5748 static int sctp_getsockopt_auto_asconf(struct sock *sk, int len, in sctp_getsockopt_auto_asconf() argument
5757 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk)) in sctp_getsockopt_auto_asconf()
5773 static int sctp_getsockopt_assoc_ids(struct sock *sk, int len, in sctp_getsockopt_assoc_ids() argument
5776 struct sctp_sock *sp = sctp_sk(sk); in sctp_getsockopt_assoc_ids()
5781 if (sctp_style(sk, TCP)) in sctp_getsockopt_assoc_ids()
5822 static int sctp_getsockopt_paddr_thresholds(struct sock *sk, in sctp_getsockopt_paddr_thresholds() argument
5837 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { in sctp_getsockopt_paddr_thresholds()
5838 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_getsockopt_paddr_thresholds()
5845 trans = sctp_addr_id2transport(sk, &val.spt_address, in sctp_getsockopt_paddr_thresholds()
5866 static int sctp_getsockopt_assoc_stats(struct sock *sk, int len, in sctp_getsockopt_assoc_stats() argument
5883 asoc = sctp_id2assoc(sk, sas.sas_assoc_id); in sctp_getsockopt_assoc_stats()
5924 static int sctp_getsockopt_recvrcvinfo(struct sock *sk, int len, in sctp_getsockopt_recvrcvinfo() argument
5934 if (sctp_sk(sk)->recvrcvinfo) in sctp_getsockopt_recvrcvinfo()
5944 static int sctp_getsockopt_recvnxtinfo(struct sock *sk, int len, in sctp_getsockopt_recvnxtinfo() argument
5954 if (sctp_sk(sk)->recvnxtinfo) in sctp_getsockopt_recvnxtinfo()
5964 static int sctp_getsockopt(struct sock *sk, int level, int optname, in sctp_getsockopt() argument
5970 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname); in sctp_getsockopt()
5979 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_getsockopt()
5981 retval = af->getsockopt(sk, level, optname, optval, optlen); in sctp_getsockopt()
5988 lock_sock(sk); in sctp_getsockopt()
5992 retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen); in sctp_getsockopt()
5995 retval = sctp_getsockopt_disable_fragments(sk, len, optval, in sctp_getsockopt()
5999 retval = sctp_getsockopt_events(sk, len, optval, optlen); in sctp_getsockopt()
6002 retval = sctp_getsockopt_autoclose(sk, len, optval, optlen); in sctp_getsockopt()
6005 retval = sctp_getsockopt_peeloff(sk, len, optval, optlen); in sctp_getsockopt()
6008 retval = sctp_getsockopt_peer_addr_params(sk, len, optval, in sctp_getsockopt()
6012 retval = sctp_getsockopt_delayed_ack(sk, len, optval, in sctp_getsockopt()
6016 retval = sctp_getsockopt_initmsg(sk, len, optval, optlen); in sctp_getsockopt()
6019 retval = sctp_getsockopt_peer_addrs(sk, len, optval, in sctp_getsockopt()
6023 retval = sctp_getsockopt_local_addrs(sk, len, optval, in sctp_getsockopt()
6027 retval = sctp_getsockopt_connectx3(sk, len, optval, optlen); in sctp_getsockopt()
6030 retval = sctp_getsockopt_default_send_param(sk, len, in sctp_getsockopt()
6034 retval = sctp_getsockopt_default_sndinfo(sk, len, in sctp_getsockopt()
6038 retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen); in sctp_getsockopt()
6041 retval = sctp_getsockopt_nodelay(sk, len, optval, optlen); in sctp_getsockopt()
6044 retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen); in sctp_getsockopt()
6047 retval = sctp_getsockopt_associnfo(sk, len, optval, optlen); in sctp_getsockopt()
6050 retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen); in sctp_getsockopt()
6053 retval = sctp_getsockopt_maxseg(sk, len, optval, optlen); in sctp_getsockopt()
6056 retval = sctp_getsockopt_peer_addr_info(sk, len, optval, in sctp_getsockopt()
6060 retval = sctp_getsockopt_adaptation_layer(sk, len, optval, in sctp_getsockopt()
6064 retval = sctp_getsockopt_context(sk, len, optval, optlen); in sctp_getsockopt()
6067 retval = sctp_getsockopt_fragment_interleave(sk, len, optval, in sctp_getsockopt()
6071 retval = sctp_getsockopt_partial_delivery_point(sk, len, optval, in sctp_getsockopt()
6075 retval = sctp_getsockopt_maxburst(sk, len, optval, optlen); in sctp_getsockopt()
6083 retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen); in sctp_getsockopt()
6086 retval = sctp_getsockopt_active_key(sk, len, optval, optlen); in sctp_getsockopt()
6089 retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval, in sctp_getsockopt()
6093 retval = sctp_getsockopt_local_auth_chunks(sk, len, optval, in sctp_getsockopt()
6097 retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen); in sctp_getsockopt()
6100 retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen); in sctp_getsockopt()
6103 retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen); in sctp_getsockopt()
6106 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen); in sctp_getsockopt()
6109 retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen); in sctp_getsockopt()
6112 retval = sctp_getsockopt_recvrcvinfo(sk, len, optval, optlen); in sctp_getsockopt()
6115 retval = sctp_getsockopt_recvnxtinfo(sk, len, optval, optlen); in sctp_getsockopt()
6122 release_sock(sk); in sctp_getsockopt()
6126 static void sctp_hash(struct sock *sk) in sctp_hash() argument
6131 static void sctp_unhash(struct sock *sk) in sctp_unhash() argument
6151 static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr) in sctp_get_port_local() argument
6168 struct net *net = sock_net(sk); in sctp_get_port_local()
6180 index = sctp_phashfn(sock_net(sk), rover); in sctp_get_port_local()
6185 net_eq(sock_net(sk), pp->net)) in sctp_get_port_local()
6209 head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)]; in sctp_get_port_local()
6212 if ((pp->port == snum) && net_eq(pp->net, sock_net(sk))) in sctp_get_port_local()
6225 int reuse = sk->sk_reuse; in sctp_get_port_local()
6230 if (pp->fastreuse && sk->sk_reuse && in sctp_get_port_local()
6231 sk->sk_state != SCTP_SS_LISTENING) in sctp_get_port_local()
6248 if (sk == sk2 || in sctp_get_port_local()
6254 sctp_sk(sk2), sctp_sk(sk))) { in sctp_get_port_local()
6265 if (!pp && !(pp = sctp_bucket_create(head, sock_net(sk), snum))) in sctp_get_port_local()
6273 if (sk->sk_reuse && sk->sk_state != SCTP_SS_LISTENING) in sctp_get_port_local()
6278 (!sk->sk_reuse || sk->sk_state == SCTP_SS_LISTENING)) in sctp_get_port_local()
6286 if (!sctp_sk(sk)->bind_hash) { in sctp_get_port_local()
6287 inet_sk(sk)->inet_num = snum; in sctp_get_port_local()
6288 sk_add_bind_node(sk, &pp->owner); in sctp_get_port_local()
6289 sctp_sk(sk)->bind_hash = pp; in sctp_get_port_local()
6304 static int sctp_get_port(struct sock *sk, unsigned short snum) in sctp_get_port() argument
6307 struct sctp_af *af = sctp_sk(sk)->pf->af; in sctp_get_port()
6310 af->from_sk(&addr, sk); in sctp_get_port()
6314 return !!sctp_get_port_local(sk, &addr); in sctp_get_port()
6320 static int sctp_listen_start(struct sock *sk, int backlog) in sctp_listen_start() argument
6322 struct sctp_sock *sp = sctp_sk(sk); in sctp_listen_start()
6336 sctp_sk(sk)->hmac = tfm; in sctp_listen_start()
6350 sk->sk_state = SCTP_SS_LISTENING; in sctp_listen_start()
6352 if (sctp_autobind(sk)) in sctp_listen_start()
6355 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) { in sctp_listen_start()
6356 sk->sk_state = SCTP_SS_CLOSED; in sctp_listen_start()
6361 sk->sk_max_ack_backlog = backlog; in sctp_listen_start()
6382 struct sock *sk = sock->sk; in sctp_inet_listen() local
6383 struct sctp_endpoint *ep = sctp_sk(sk)->ep; in sctp_inet_listen()
6389 lock_sock(sk); in sctp_inet_listen()
6392 if (sctp_style(sk, UDP_HIGH_BANDWIDTH)) in sctp_inet_listen()
6400 if (sctp_sstate(sk, CLOSED)) in sctp_inet_listen()
6405 sk->sk_state = SCTP_SS_CLOSED; in sctp_inet_listen()
6406 if (sk->sk_reuse) in sctp_inet_listen()
6407 sctp_sk(sk)->bind_hash->fastreuse = 1; in sctp_inet_listen()
6412 if (sctp_sstate(sk, LISTENING)) in sctp_inet_listen()
6413 sk->sk_max_ack_backlog = backlog; in sctp_inet_listen()
6415 err = sctp_listen_start(sk, backlog); in sctp_inet_listen()
6422 release_sock(sk); in sctp_inet_listen()
6441 struct sock *sk = sock->sk; in sctp_poll() local
6442 struct sctp_sock *sp = sctp_sk(sk); in sctp_poll()
6445 poll_wait(file, sk_sleep(sk), wait); in sctp_poll()
6450 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) in sctp_poll()
6457 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) in sctp_poll()
6459 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? POLLPRI : 0); in sctp_poll()
6460 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_poll()
6462 if (sk->sk_shutdown == SHUTDOWN_MASK) in sctp_poll()
6466 if (!skb_queue_empty(&sk->sk_receive_queue)) in sctp_poll()
6470 if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED)) in sctp_poll()
6474 if (sctp_writeable(sk)) { in sctp_poll()
6477 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); in sctp_poll()
6486 if (sctp_writeable(sk)) in sctp_poll()
6524 static inline void __sctp_put_port(struct sock *sk) in __sctp_put_port() argument
6527 &sctp_port_hashtable[sctp_phashfn(sock_net(sk), in __sctp_put_port()
6528 inet_sk(sk)->inet_num)]; in __sctp_put_port()
6532 pp = sctp_sk(sk)->bind_hash; in __sctp_put_port()
6533 __sk_del_bind_node(sk); in __sctp_put_port()
6534 sctp_sk(sk)->bind_hash = NULL; in __sctp_put_port()
6535 inet_sk(sk)->inet_num = 0; in __sctp_put_port()
6540 void sctp_put_port(struct sock *sk) in sctp_put_port() argument
6543 __sctp_put_port(sk); in sctp_put_port()
6553 static int sctp_autobind(struct sock *sk) in sctp_autobind() argument
6560 af = sctp_sk(sk)->pf->af; in sctp_autobind()
6562 port = htons(inet_sk(sk)->inet_num); in sctp_autobind()
6565 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); in sctp_autobind()
6702 static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p) in sctp_wait_for_packet() argument
6707 prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in sctp_wait_for_packet()
6710 error = sock_error(sk); in sctp_wait_for_packet()
6714 if (!skb_queue_empty(&sk->sk_receive_queue)) in sctp_wait_for_packet()
6718 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_packet()
6727 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING)) in sctp_wait_for_packet()
6739 release_sock(sk); in sctp_wait_for_packet()
6741 lock_sock(sk); in sctp_wait_for_packet()
6744 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_packet()
6751 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_packet()
6760 struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, in sctp_skb_recv_datagram() argument
6767 timeo = sock_rcvtimeo(sk, noblock); in sctp_skb_recv_datagram()
6781 spin_lock_bh(&sk->sk_receive_queue.lock); in sctp_skb_recv_datagram()
6782 skb = skb_peek(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
6785 spin_unlock_bh(&sk->sk_receive_queue.lock); in sctp_skb_recv_datagram()
6787 skb = skb_dequeue(&sk->sk_receive_queue); in sctp_skb_recv_datagram()
6794 error = sock_error(sk); in sctp_skb_recv_datagram()
6798 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_skb_recv_datagram()
6801 if (sk_can_busy_loop(sk) && in sctp_skb_recv_datagram()
6802 sk_busy_loop(sk, noblock)) in sctp_skb_recv_datagram()
6809 } while (sctp_wait_for_packet(sk, err, &timeo) == 0); in sctp_skb_recv_datagram()
6821 struct sock *sk = asoc->base.sk; in __sctp_write_space() local
6822 struct socket *sock = sk->sk_socket; in __sctp_write_space()
6828 if (sctp_writeable(sk)) { in __sctp_write_space()
6829 wait_queue_head_t *wq = sk_sleep(sk); in __sctp_write_space()
6838 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in __sctp_write_space()
6845 static void sctp_wake_up_waiters(struct sock *sk, in sctp_wake_up_waiters() argument
6860 return sctp_write_space(sk); in sctp_wake_up_waiters()
6875 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs)) in sctp_wake_up_waiters()
6893 struct sock *sk = asoc->base.sk; in sctp_wfree() local
6899 atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); in sctp_wfree()
6904 sk->sk_wmem_queued -= skb->truesize; in sctp_wfree()
6905 sk_mem_uncharge(sk, skb->truesize); in sctp_wfree()
6908 sctp_wake_up_waiters(sk, asoc); in sctp_wfree()
6920 struct sock *sk = skb->sk; in sctp_sock_rfree() local
6923 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc); in sctp_sock_rfree()
6928 sk_mem_uncharge(sk, event->rmem_len); in sctp_sock_rfree()
6936 struct sock *sk = asoc->base.sk; in sctp_wait_for_sndbuf() local
6953 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_sndbuf()
6964 release_sock(sk); in sctp_wait_for_sndbuf()
6966 BUG_ON(sk != asoc->base.sk); in sctp_wait_for_sndbuf()
6967 lock_sock(sk); in sctp_wait_for_sndbuf()
6993 void sctp_data_ready(struct sock *sk) in sctp_data_ready() argument
6998 wq = rcu_dereference(sk->sk_wq); in sctp_data_ready()
7002 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); in sctp_data_ready()
7007 void sctp_write_space(struct sock *sk) in sctp_write_space() argument
7012 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { in sctp_write_space()
7028 static int sctp_writeable(struct sock *sk) in sctp_writeable() argument
7032 amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk); in sctp_writeable()
7043 struct sock *sk = asoc->base.sk; in sctp_wait_for_connect() local
7058 if (sk->sk_shutdown & RCV_SHUTDOWN) in sctp_wait_for_connect()
7060 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_connect()
7072 release_sock(sk); in sctp_wait_for_connect()
7074 lock_sock(sk); in sctp_wait_for_connect()
7103 static int sctp_wait_for_accept(struct sock *sk, long timeo) in sctp_wait_for_accept() argument
7109 ep = sctp_sk(sk)->ep; in sctp_wait_for_accept()
7113 prepare_to_wait_exclusive(sk_sleep(sk), &wait, in sctp_wait_for_accept()
7117 release_sock(sk); in sctp_wait_for_accept()
7119 lock_sock(sk); in sctp_wait_for_accept()
7123 if (!sctp_sstate(sk, LISTENING)) in sctp_wait_for_accept()
7139 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_accept()
7144 static void sctp_wait_for_close(struct sock *sk, long timeout) in sctp_wait_for_close() argument
7149 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); in sctp_wait_for_close()
7150 if (list_empty(&sctp_sk(sk)->ep->asocs)) in sctp_wait_for_close()
7152 release_sock(sk); in sctp_wait_for_close()
7154 lock_sock(sk); in sctp_wait_for_close()
7157 finish_wait(sk_sleep(sk), &wait); in sctp_wait_for_close()
7160 static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk) in sctp_skb_set_owner_r_frag() argument
7169 sctp_skb_set_owner_r_frag(frag, sk); in sctp_skb_set_owner_r_frag()
7172 sctp_skb_set_owner_r(skb, sk); in sctp_skb_set_owner_r_frag()
7175 void sctp_copy_sock(struct sock *newsk, struct sock *sk, in sctp_copy_sock() argument
7178 struct inet_sock *inet = inet_sk(sk); in sctp_copy_sock()
7181 newsk->sk_type = sk->sk_type; in sctp_copy_sock()
7182 newsk->sk_bound_dev_if = sk->sk_bound_dev_if; in sctp_copy_sock()
7183 newsk->sk_flags = sk->sk_flags; in sctp_copy_sock()
7184 newsk->sk_tsflags = sk->sk_tsflags; in sctp_copy_sock()
7185 newsk->sk_no_check_tx = sk->sk_no_check_tx; in sctp_copy_sock()
7186 newsk->sk_no_check_rx = sk->sk_no_check_rx; in sctp_copy_sock()
7187 newsk->sk_reuse = sk->sk_reuse; in sctp_copy_sock()
7189 newsk->sk_shutdown = sk->sk_shutdown; in sctp_copy_sock()
7191 newsk->sk_family = sk->sk_family; in sctp_copy_sock()
7193 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; in sctp_copy_sock()
7194 newsk->sk_sndbuf = sk->sk_sndbuf; in sctp_copy_sock()
7195 newsk->sk_rcvbuf = sk->sk_rcvbuf; in sctp_copy_sock()
7196 newsk->sk_lingertime = sk->sk_lingertime; in sctp_copy_sock()
7197 newsk->sk_rcvtimeo = sk->sk_rcvtimeo; in sctp_copy_sock()
7198 newsk->sk_sndtimeo = sk->sk_sndtimeo; in sctp_copy_sock()
7401 static void sctp_v6_destroy_sock(struct sock *sk) in sctp_v6_destroy_sock() argument
7403 sctp_destroy_sock(sk); in sctp_v6_destroy_sock()
7404 inet6_destroy_sock(sk); in sctp_v6_destroy_sock()