Lines Matching refs:asoc

88 static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
101 static int sctp_send_asconf(struct sctp_association *asoc,
120 static inline int sctp_wspace(struct sctp_association *asoc) in sctp_wspace() argument
124 if (asoc->ep->sndbuf_policy) in sctp_wspace()
125 amt = asoc->sndbuf_used; in sctp_wspace()
127 amt = sk_wmem_alloc_get(asoc->base.sk); in sctp_wspace()
129 if (amt >= asoc->base.sk->sk_sndbuf) { in sctp_wspace()
130 if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK) in sctp_wspace()
133 amt = sk_stream_wspace(asoc->base.sk); in sctp_wspace()
138 amt = asoc->base.sk->sk_sndbuf - amt; in sctp_wspace()
154 struct sctp_association *asoc = chunk->asoc; in sctp_set_owner_w() local
155 struct sock *sk = asoc->base.sk; in sctp_set_owner_w()
158 sctp_association_hold(asoc); in sctp_set_owner_w()
169 asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk) + in sctp_set_owner_w()
183 static void sctp_for_each_tx_datachunk(struct sctp_association *asoc, in sctp_for_each_tx_datachunk() argument
187 struct sctp_outq *q = &asoc->outqueue; in sctp_for_each_tx_datachunk()
191 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) in sctp_for_each_tx_datachunk()
208 static void sctp_for_each_rx_skb(struct sctp_association *asoc, struct sock *sk, in sctp_for_each_rx_skb() argument
214 sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp) in sctp_for_each_rx_skb()
217 sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp) in sctp_for_each_rx_skb()
220 sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp) in sctp_for_each_rx_skb()
250 struct sctp_association *asoc = NULL; in sctp_id2assoc() local
263 asoc = list_entry(sctp_sk(sk)->ep->asocs.next, in sctp_id2assoc()
265 return asoc; in sctp_id2assoc()
273 asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id); in sctp_id2assoc()
274 if (asoc && (asoc->base.sk != sk || asoc->base.dead)) in sctp_id2assoc()
275 asoc = NULL; in sctp_id2assoc()
278 return asoc; in sctp_id2assoc()
468 static int sctp_send_asconf(struct sctp_association *asoc, in sctp_send_asconf() argument
471 struct net *net = sock_net(asoc->base.sk); in sctp_send_asconf()
477 if (asoc->addip_last_asconf) { in sctp_send_asconf()
478 list_add_tail(&chunk->list, &asoc->addip_chunk_list); in sctp_send_asconf()
484 retval = sctp_primitive_ASCONF(net, asoc, chunk); in sctp_send_asconf()
488 asoc->addip_last_asconf = chunk; in sctp_send_asconf()
563 struct sctp_association *asoc; in sctp_send_asconf_add_ip() local
584 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_add_ip()
585 if (!asoc->peer.asconf_capable) in sctp_send_asconf_add_ip()
588 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP) in sctp_send_asconf_add_ip()
591 if (!sctp_state(asoc, ESTABLISHED)) in sctp_send_asconf_add_ip()
608 if (sctp_assoc_lookup_laddr(asoc, addr)) in sctp_send_asconf_add_ip()
619 bp = &asoc->base.bind_addr; in sctp_send_asconf_add_ip()
622 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, in sctp_send_asconf_add_ip()
642 if (asoc->src_out_of_asoc_ok) { in sctp_send_asconf_add_ip()
646 &asoc->peer.transport_addr_list, transports) { in sctp_send_asconf_add_ip()
647 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32, in sctp_send_asconf_add_ip()
648 2*asoc->pathmtu, 4380)); in sctp_send_asconf_add_ip()
649 trans->ssthresh = asoc->peer.i.a_rwnd; in sctp_send_asconf_add_ip()
650 trans->rto = asoc->rto_initial; in sctp_send_asconf_add_ip()
651 sctp_max_rto(asoc, trans); in sctp_send_asconf_add_ip()
655 sctp_sk(asoc->base.sk)); in sctp_send_asconf_add_ip()
658 retval = sctp_send_asconf(asoc, chunk); in sctp_send_asconf_add_ip()
766 struct sctp_association *asoc; in sctp_send_asconf_del_ip() local
788 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_del_ip()
790 if (!asoc->peer.asconf_capable) in sctp_send_asconf_del_ip()
793 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP) in sctp_send_asconf_del_ip()
796 if (!sctp_state(asoc, ESTABLISHED)) in sctp_send_asconf_del_ip()
813 if (!sctp_assoc_lookup_laddr(asoc, laddr)) in sctp_send_asconf_del_ip()
826 bp = &asoc->base.bind_addr; in sctp_send_asconf_del_ip()
830 if (asoc->asconf_addr_del_pending) in sctp_send_asconf_del_ip()
832 asoc->asconf_addr_del_pending = in sctp_send_asconf_del_ip()
834 if (asoc->asconf_addr_del_pending == NULL) { in sctp_send_asconf_del_ip()
838 asoc->asconf_addr_del_pending->sa.sa_family = in sctp_send_asconf_del_ip()
840 asoc->asconf_addr_del_pending->v4.sin_port = in sctp_send_asconf_del_ip()
846 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr; in sctp_send_asconf_del_ip()
851 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr; in sctp_send_asconf_del_ip()
855 __func__, asoc, &asoc->asconf_addr_del_pending->sa, in sctp_send_asconf_del_ip()
856 asoc->asconf_addr_del_pending); in sctp_send_asconf_del_ip()
858 asoc->src_out_of_asoc_ok = 1; in sctp_send_asconf_del_ip()
870 chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt, in sctp_send_asconf_del_ip()
896 list_for_each_entry(transport, &asoc->peer.transport_addr_list, in sctp_send_asconf_del_ip()
899 sctp_sk(asoc->base.sk)); in sctp_send_asconf_del_ip()
905 retval = sctp_send_asconf(asoc, chunk); in sctp_send_asconf_del_ip()
1093 struct sctp_association *asoc = NULL; in __sctp_connect() local
1153 if (asoc && asoc->peer.port && asoc->peer.port != port) { in __sctp_connect()
1162 if (asoc2 && asoc2 != asoc) { in __sctp_connect()
1179 if (!asoc) { in __sctp_connect()
1208 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); in __sctp_connect()
1209 if (!asoc) { in __sctp_connect()
1214 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, in __sctp_connect()
1223 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, in __sctp_connect()
1239 err = sctp_assoc_set_id(asoc, GFP_KERNEL); in __sctp_connect()
1244 err = sctp_primitive_ASSOCIATE(net, asoc, NULL); in __sctp_connect()
1250 inet_sk(sk)->inet_dport = htons(asoc->peer.port); in __sctp_connect()
1257 *assoc_id = asoc->assoc_id; in __sctp_connect()
1259 err = sctp_wait_for_connect(asoc, &timeo); in __sctp_connect()
1265 asoc = NULL; in __sctp_connect()
1269 __func__, asoc, kaddrs, err); in __sctp_connect()
1271 if (asoc) { in __sctp_connect()
1276 sctp_association_free(asoc); in __sctp_connect()
1519 struct sctp_association *asoc; in sctp_close() local
1537 asoc = list_entry(pos, struct sctp_association, asocs); in sctp_close()
1545 if (sctp_state(asoc, CLOSED)) { in sctp_close()
1546 sctp_association_free(asoc); in sctp_close()
1551 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) || in sctp_close()
1552 !skb_queue_empty(&asoc->ulpq.reasm) || in sctp_close()
1553 !skb_queue_empty(&asoc->ulpq.reasm_uo) || in sctp_close()
1557 chunk = sctp_make_abort_user(asoc, NULL, 0); in sctp_close()
1558 sctp_primitive_ABORT(net, asoc, chunk); in sctp_close()
1560 sctp_primitive_SHUTDOWN(net, asoc, NULL); in sctp_close()
1696 struct sctp_association *asoc; in sctp_sendmsg_new_asoc() local
1741 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); in sctp_sendmsg_new_asoc()
1742 if (!asoc) in sctp_sendmsg_new_asoc()
1745 if (sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL) < 0) { in sctp_sendmsg_new_asoc()
1756 asoc->c.sinit_num_ostreams = outcnt; in sctp_sendmsg_new_asoc()
1758 err = sctp_stream_init(&asoc->stream, outcnt, 0, in sctp_sendmsg_new_asoc()
1765 asoc->c.sinit_max_instreams = init->sinit_max_instreams; in sctp_sendmsg_new_asoc()
1768 asoc->max_init_attempts = init->sinit_max_attempts; in sctp_sendmsg_new_asoc()
1771 asoc->max_init_timeo = in sctp_sendmsg_new_asoc()
1775 *tp = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN); in sctp_sendmsg_new_asoc()
1810 daddr->v4.sin_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1821 daddr->v6.sin6_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1829 if (old && old != asoc) { in sctp_sendmsg_new_asoc()
1842 transport = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, in sctp_sendmsg_new_asoc()
1853 sctp_association_free(asoc); in sctp_sendmsg_new_asoc()
1857 static int sctp_sendmsg_check_sflags(struct sctp_association *asoc, in sctp_sendmsg_check_sflags() argument
1861 struct sock *sk = asoc->base.sk; in sctp_sendmsg_check_sflags()
1864 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) in sctp_sendmsg_check_sflags()
1868 !sctp_state(asoc, ESTABLISHED)) in sctp_sendmsg_check_sflags()
1872 pr_debug("%s: shutting down association:%p\n", __func__, asoc); in sctp_sendmsg_check_sflags()
1873 sctp_primitive_SHUTDOWN(net, asoc, NULL); in sctp_sendmsg_check_sflags()
1881 chunk = sctp_make_abort_user(asoc, msg, msg_len); in sctp_sendmsg_check_sflags()
1885 pr_debug("%s: aborting association:%p\n", __func__, asoc); in sctp_sendmsg_check_sflags()
1886 sctp_primitive_ABORT(net, asoc, chunk); in sctp_sendmsg_check_sflags()
1894 static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, in sctp_sendmsg_to_asoc() argument
1899 struct sock *sk = asoc->base.sk; in sctp_sendmsg_to_asoc()
1908 if (sinfo->sinfo_stream >= asoc->stream.outcnt) { in sctp_sendmsg_to_asoc()
1913 if (unlikely(!SCTP_SO(&asoc->stream, sinfo->sinfo_stream)->ext)) { in sctp_sendmsg_to_asoc()
1914 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream); in sctp_sendmsg_to_asoc()
1919 if (sp->disable_fragments && msg_len > asoc->frag_point) { in sctp_sendmsg_to_asoc()
1924 if (asoc->pmtu_pending) { in sctp_sendmsg_to_asoc()
1926 sctp_assoc_sync_pmtu(asoc); in sctp_sendmsg_to_asoc()
1927 asoc->pmtu_pending = 0; in sctp_sendmsg_to_asoc()
1930 if (sctp_wspace(asoc) < msg_len) in sctp_sendmsg_to_asoc()
1931 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); in sctp_sendmsg_to_asoc()
1933 if (!sctp_wspace(asoc)) { in sctp_sendmsg_to_asoc()
1935 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); in sctp_sendmsg_to_asoc()
1940 if (sctp_state(asoc, CLOSED)) { in sctp_sendmsg_to_asoc()
1941 err = sctp_primitive_ASSOCIATE(net, asoc, NULL); in sctp_sendmsg_to_asoc()
1947 err = sctp_wait_for_connect(asoc, &timeo); in sctp_sendmsg_to_asoc()
1959 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter); in sctp_sendmsg_to_asoc()
1965 asoc->force_delay = !!(msg->msg_flags & MSG_MORE); in sctp_sendmsg_to_asoc()
1973 err = sctp_primitive_SEND(net, asoc, datamsg); in sctp_sendmsg_to_asoc()
1985 sctp_wait_for_connect(asoc, &timeo); in sctp_sendmsg_to_asoc()
2017 static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc, in sctp_sendmsg_update_sinfo() argument
2022 sinfo->sinfo_stream = asoc->default_stream; in sctp_sendmsg_update_sinfo()
2023 sinfo->sinfo_ppid = asoc->default_ppid; in sctp_sendmsg_update_sinfo()
2024 sinfo->sinfo_context = asoc->default_context; in sctp_sendmsg_update_sinfo()
2025 sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); in sctp_sendmsg_update_sinfo()
2028 sinfo->sinfo_flags = asoc->default_flags; in sctp_sendmsg_update_sinfo()
2032 sinfo->sinfo_timetolive = asoc->default_timetolive; in sctp_sendmsg_update_sinfo()
2048 struct sctp_association *asoc; in sctp_sendmsg() local
2074 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_sendmsg()
2075 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, in sctp_sendmsg()
2082 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs); in sctp_sendmsg()
2084 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, in sctp_sendmsg()
2097 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport); in sctp_sendmsg()
2098 if (asoc) { in sctp_sendmsg()
2099 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, in sctp_sendmsg()
2109 asoc = transport->asoc; in sctp_sendmsg()
2116 asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id); in sctp_sendmsg()
2117 if (!asoc) { in sctp_sendmsg()
2122 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len); in sctp_sendmsg()
2128 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs); in sctp_sendmsg()
2131 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, transport, sinfo); in sctp_sendmsg()
2133 sctp_association_free(asoc); in sctp_sendmsg()
2272 sctp_assoc_rwnd_increase(event->asoc, copied); in sctp_recvmsg()
2325 struct sctp_association *asoc; in sctp_setsockopt_events() local
2339 asoc = sctp_id2assoc(sk, 0); in sctp_setsockopt_events()
2341 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) { in sctp_setsockopt_events()
2342 event = sctp_ulpevent_make_sender_dry_event(asoc, in sctp_setsockopt_events()
2347 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_setsockopt_events()
2525 struct sctp_association *asoc, in sctp_apply_peer_addr_params() argument
2534 struct net *net = sock_net(trans->asoc->base.sk); in sctp_apply_peer_addr_params()
2536 error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans); in sctp_apply_peer_addr_params()
2559 } else if (asoc) { in sctp_apply_peer_addr_params()
2560 asoc->hbinterval = in sctp_apply_peer_addr_params()
2572 } else if (asoc) { in sctp_apply_peer_addr_params()
2573 asoc->param_flags = in sctp_apply_peer_addr_params()
2574 (asoc->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2589 sctp_assoc_sync_pmtu(asoc); in sctp_apply_peer_addr_params()
2590 } else if (asoc) { in sctp_apply_peer_addr_params()
2591 sctp_assoc_set_pmtu(asoc, params->spp_pathmtu); in sctp_apply_peer_addr_params()
2605 sctp_assoc_sync_pmtu(asoc); in sctp_apply_peer_addr_params()
2607 } else if (asoc) { in sctp_apply_peer_addr_params()
2608 asoc->param_flags = in sctp_apply_peer_addr_params()
2609 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2624 } else if (asoc) { in sctp_apply_peer_addr_params()
2625 asoc->sackdelay = in sctp_apply_peer_addr_params()
2637 } else if (asoc) { in sctp_apply_peer_addr_params()
2638 asoc->param_flags = in sctp_apply_peer_addr_params()
2639 (asoc->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2654 } else if (asoc) { in sctp_apply_peer_addr_params()
2655 asoc->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2668 } else if (asoc) { in sctp_apply_peer_addr_params()
2671 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2679 asoc->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2681 asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2693 } else if (asoc) { in sctp_apply_peer_addr_params()
2696 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2702 asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2703 asoc->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2719 struct sctp_association *asoc = NULL; in sctp_setsockopt_peer_addr_params() local
2764 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2765 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_peer_addr_params()
2771 if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) in sctp_setsockopt_peer_addr_params()
2775 error = sctp_apply_peer_addr_params(&params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2785 if (!trans && asoc) { in sctp_setsockopt_peer_addr_params()
2786 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_peer_addr_params()
2788 sctp_apply_peer_addr_params(&params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2848 struct sctp_association *asoc = NULL; in sctp_setsockopt_delayed_ack() local
2881 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_setsockopt_delayed_ack()
2882 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_delayed_ack()
2886 if (asoc) { in sctp_setsockopt_delayed_ack()
2887 asoc->sackdelay = in sctp_setsockopt_delayed_ack()
2889 asoc->param_flags = in sctp_setsockopt_delayed_ack()
2890 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_setsockopt_delayed_ack()
2899 if (asoc) { in sctp_setsockopt_delayed_ack()
2900 asoc->param_flags = in sctp_setsockopt_delayed_ack()
2901 sctp_spp_sackdelay_disable(asoc->param_flags); in sctp_setsockopt_delayed_ack()
2907 if (asoc) { in sctp_setsockopt_delayed_ack()
2908 asoc->sackfreq = params.sack_freq; in sctp_setsockopt_delayed_ack()
2909 asoc->param_flags = in sctp_setsockopt_delayed_ack()
2910 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_setsockopt_delayed_ack()
2919 if (asoc) { in sctp_setsockopt_delayed_ack()
2920 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_delayed_ack()
2994 struct sctp_association *asoc; in sctp_setsockopt_default_send_param() local
3006 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_setsockopt_default_send_param()
3007 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_default_send_param()
3009 if (asoc) { in sctp_setsockopt_default_send_param()
3010 asoc->default_stream = info.sinfo_stream; in sctp_setsockopt_default_send_param()
3011 asoc->default_flags = info.sinfo_flags; in sctp_setsockopt_default_send_param()
3012 asoc->default_ppid = info.sinfo_ppid; in sctp_setsockopt_default_send_param()
3013 asoc->default_context = info.sinfo_context; in sctp_setsockopt_default_send_param()
3014 asoc->default_timetolive = info.sinfo_timetolive; in sctp_setsockopt_default_send_param()
3034 struct sctp_association *asoc; in sctp_setsockopt_default_sndinfo() local
3046 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_setsockopt_default_sndinfo()
3047 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_default_sndinfo()
3049 if (asoc) { in sctp_setsockopt_default_sndinfo()
3050 asoc->default_stream = info.snd_sid; in sctp_setsockopt_default_sndinfo()
3051 asoc->default_flags = info.snd_flags; in sctp_setsockopt_default_sndinfo()
3052 asoc->default_ppid = info.snd_ppid; in sctp_setsockopt_default_sndinfo()
3053 asoc->default_context = info.snd_context; in sctp_setsockopt_default_sndinfo()
3099 sctp_assoc_set_primary(trans->asoc, trans); in sctp_setsockopt_primary_addr()
3141 struct sctp_association *asoc; in sctp_setsockopt_rtoinfo() local
3151 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_setsockopt_rtoinfo()
3154 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_rtoinfo()
3161 rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; in sctp_setsockopt_rtoinfo()
3163 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max; in sctp_setsockopt_rtoinfo()
3166 rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min; in sctp_setsockopt_rtoinfo()
3168 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min; in sctp_setsockopt_rtoinfo()
3173 if (asoc) { in sctp_setsockopt_rtoinfo()
3175 asoc->rto_initial = in sctp_setsockopt_rtoinfo()
3177 asoc->rto_max = rto_max; in sctp_setsockopt_rtoinfo()
3178 asoc->rto_min = rto_min; in sctp_setsockopt_rtoinfo()
3207 struct sctp_association *asoc; in sctp_setsockopt_associnfo() local
3214 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_setsockopt_associnfo()
3216 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_associnfo()
3220 if (asoc) { in sctp_setsockopt_associnfo()
3226 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list, in sctp_setsockopt_associnfo()
3241 asoc->max_retrans = assocparams.sasoc_asocmaxrxt; in sctp_setsockopt_associnfo()
3245 asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life); in sctp_setsockopt_associnfo()
3318 struct sctp_association *asoc; in sctp_setsockopt_maxseg() local
3338 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_maxseg()
3342 __u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) : in sctp_setsockopt_maxseg()
3353 if (asoc) { in sctp_setsockopt_maxseg()
3354 asoc->user_frag = val; in sctp_setsockopt_maxseg()
3355 sctp_assoc_update_frag_point(asoc); in sctp_setsockopt_maxseg()
3379 struct sctp_association *asoc = NULL; in sctp_setsockopt_peer_primary_addr() local
3396 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); in sctp_setsockopt_peer_primary_addr()
3397 if (!asoc) in sctp_setsockopt_peer_primary_addr()
3400 if (!asoc->peer.asconf_capable) in sctp_setsockopt_peer_primary_addr()
3403 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY) in sctp_setsockopt_peer_primary_addr()
3406 if (!sctp_state(asoc, ESTABLISHED)) in sctp_setsockopt_peer_primary_addr()
3416 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) in sctp_setsockopt_peer_primary_addr()
3427 chunk = sctp_make_asconf_set_prim(asoc, in sctp_setsockopt_peer_primary_addr()
3432 err = sctp_send_asconf(asoc, chunk); in sctp_setsockopt_peer_primary_addr()
3473 struct sctp_association *asoc; in sctp_setsockopt_context() local
3483 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_context()
3484 if (!asoc) in sctp_setsockopt_context()
3486 asoc->default_rcv_context = params.assoc_value; in sctp_setsockopt_context()
3593 struct sctp_association *asoc; in sctp_setsockopt_maxburst() local
3616 asoc = sctp_id2assoc(sk, assoc_id); in sctp_setsockopt_maxburst()
3617 if (!asoc) in sctp_setsockopt_maxburst()
3619 asoc->max_burst = val; in sctp_setsockopt_maxburst()
3712 struct sctp_association *asoc; in sctp_setsockopt_auth_key() local
3735 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); in sctp_setsockopt_auth_key()
3736 if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) { in sctp_setsockopt_auth_key()
3741 ret = sctp_auth_set_key(ep, asoc, authkey); in sctp_setsockopt_auth_key()
3759 struct sctp_association *asoc; in sctp_setsockopt_active_key() local
3769 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_active_key()
3770 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_active_key()
3773 return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); in sctp_setsockopt_active_key()
3787 struct sctp_association *asoc; in sctp_setsockopt_del_key() local
3797 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_del_key()
3798 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_del_key()
3801 return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); in sctp_setsockopt_del_key()
3815 struct sctp_association *asoc; in sctp_setsockopt_deactivate_key() local
3825 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_deactivate_key()
3826 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_setsockopt_deactivate_key()
3829 return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); in sctp_setsockopt_deactivate_key()
3887 struct sctp_association *asoc; in sctp_setsockopt_paddr_thresholds() local
3897 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3898 if (!asoc) in sctp_setsockopt_paddr_thresholds()
3900 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_paddr_thresholds()
3908 asoc->pathmaxrxt = val.spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3909 asoc->pf_retrans = val.spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
3961 struct sctp_association *asoc; in sctp_setsockopt_pr_supported() local
3972 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_pr_supported()
3973 if (asoc) { in sctp_setsockopt_pr_supported()
3974 asoc->prsctp_enable = !!params.assoc_value; in sctp_setsockopt_pr_supported()
3994 struct sctp_association *asoc; in sctp_setsockopt_default_prinfo() local
4011 asoc = sctp_id2assoc(sk, info.pr_assoc_id); in sctp_setsockopt_default_prinfo()
4012 if (asoc) { in sctp_setsockopt_default_prinfo()
4013 SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); in sctp_setsockopt_default_prinfo()
4014 asoc->default_timetolive = info.pr_value; in sctp_setsockopt_default_prinfo()
4035 struct sctp_association *asoc; in sctp_setsockopt_reconfig_supported() local
4046 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_reconfig_supported()
4047 if (asoc) { in sctp_setsockopt_reconfig_supported()
4048 asoc->reconf_enable = !!params.assoc_value; in sctp_setsockopt_reconfig_supported()
4068 struct sctp_association *asoc; in sctp_setsockopt_enable_strreset() local
4082 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_enable_strreset()
4083 if (asoc) { in sctp_setsockopt_enable_strreset()
4084 asoc->strreset_enable = params.assoc_value; in sctp_setsockopt_enable_strreset()
4104 struct sctp_association *asoc; in sctp_setsockopt_reset_streams() local
4121 asoc = sctp_id2assoc(sk, params->srs_assoc_id); in sctp_setsockopt_reset_streams()
4122 if (!asoc) in sctp_setsockopt_reset_streams()
4125 retval = sctp_send_reset_streams(asoc, params); in sctp_setsockopt_reset_streams()
4136 struct sctp_association *asoc; in sctp_setsockopt_reset_assoc() local
4148 asoc = sctp_id2assoc(sk, associd); in sctp_setsockopt_reset_assoc()
4149 if (!asoc) in sctp_setsockopt_reset_assoc()
4152 retval = sctp_send_reset_assoc(asoc); in sctp_setsockopt_reset_assoc()
4162 struct sctp_association *asoc; in sctp_setsockopt_add_streams() local
4174 asoc = sctp_id2assoc(sk, params.sas_assoc_id); in sctp_setsockopt_add_streams()
4175 if (!asoc) in sctp_setsockopt_add_streams()
4178 retval = sctp_send_add_streams(asoc, &params); in sctp_setsockopt_add_streams()
4188 struct sctp_association *asoc; in sctp_setsockopt_scheduler() local
4204 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_scheduler()
4205 if (!asoc) in sctp_setsockopt_scheduler()
4208 retval = sctp_sched_set_sched(asoc, params.assoc_value); in sctp_setsockopt_scheduler()
4218 struct sctp_association *asoc; in sctp_setsockopt_scheduler_value() local
4231 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_scheduler_value()
4232 if (!asoc) in sctp_setsockopt_scheduler_value()
4235 retval = sctp_sched_set_value(asoc, params.stream_id, in sctp_setsockopt_scheduler_value()
4588 struct sctp_association *asoc; in sctp_accept() local
4616 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); in sctp_accept()
4618 newsk = sp->pf->create_accept_sk(sk, asoc, kern); in sctp_accept()
4627 sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); in sctp_accept()
4891 struct sctp_association *asoc; in sctp_shutdown() local
4894 asoc = list_entry(ep->asocs.next, in sctp_shutdown()
4896 sctp_primitive_SHUTDOWN(net, asoc, NULL); in sctp_shutdown()
4900 int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc, in sctp_get_sctp_info() argument
4908 if (!asoc) { in sctp_get_sctp_info()
4923 info->sctpi_tag = asoc->c.my_vtag; in sctp_get_sctp_info()
4924 info->sctpi_state = asoc->state; in sctp_get_sctp_info()
4925 info->sctpi_rwnd = asoc->a_rwnd; in sctp_get_sctp_info()
4926 info->sctpi_unackdata = asoc->unack_data; in sctp_get_sctp_info()
4927 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_get_sctp_info()
4928 info->sctpi_instrms = asoc->stream.incnt; in sctp_get_sctp_info()
4929 info->sctpi_outstrms = asoc->stream.outcnt; in sctp_get_sctp_info()
4930 list_for_each(pos, &asoc->base.inqueue.in_chunk_list) in sctp_get_sctp_info()
4932 list_for_each(pos, &asoc->outqueue.out_chunk_list) in sctp_get_sctp_info()
4934 info->sctpi_overall_error = asoc->overall_error_count; in sctp_get_sctp_info()
4935 info->sctpi_max_burst = asoc->max_burst; in sctp_get_sctp_info()
4936 info->sctpi_maxseg = asoc->frag_point; in sctp_get_sctp_info()
4937 info->sctpi_peer_rwnd = asoc->peer.rwnd; in sctp_get_sctp_info()
4938 info->sctpi_peer_tag = asoc->c.peer_vtag; in sctp_get_sctp_info()
4940 mask = asoc->peer.ecn_capable << 1; in sctp_get_sctp_info()
4941 mask = (mask | asoc->peer.ipv4_address) << 1; in sctp_get_sctp_info()
4942 mask = (mask | asoc->peer.ipv6_address) << 1; in sctp_get_sctp_info()
4943 mask = (mask | asoc->peer.hostname_address) << 1; in sctp_get_sctp_info()
4944 mask = (mask | asoc->peer.asconf_capable) << 1; in sctp_get_sctp_info()
4945 mask = (mask | asoc->peer.prsctp_capable) << 1; in sctp_get_sctp_info()
4946 mask = (mask | asoc->peer.auth_capable); in sctp_get_sctp_info()
4948 mask = asoc->peer.sack_needed << 1; in sctp_get_sctp_info()
4949 mask = (mask | asoc->peer.sack_generation) << 1; in sctp_get_sctp_info()
4950 mask = (mask | asoc->peer.zero_window_announced); in sctp_get_sctp_info()
4953 info->sctpi_isacks = asoc->stats.isacks; in sctp_get_sctp_info()
4954 info->sctpi_osacks = asoc->stats.osacks; in sctp_get_sctp_info()
4955 info->sctpi_opackets = asoc->stats.opackets; in sctp_get_sctp_info()
4956 info->sctpi_ipackets = asoc->stats.ipackets; in sctp_get_sctp_info()
4957 info->sctpi_rtxchunks = asoc->stats.rtxchunks; in sctp_get_sctp_info()
4958 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns; in sctp_get_sctp_info()
4959 info->sctpi_idupchunks = asoc->stats.idupchunks; in sctp_get_sctp_info()
4960 info->sctpi_gapcnt = asoc->stats.gapcnt; in sctp_get_sctp_info()
4961 info->sctpi_ouodchunks = asoc->stats.ouodchunks; in sctp_get_sctp_info()
4962 info->sctpi_iuodchunks = asoc->stats.iuodchunks; in sctp_get_sctp_info()
4963 info->sctpi_oodchunks = asoc->stats.oodchunks; in sctp_get_sctp_info()
4964 info->sctpi_iodchunks = asoc->stats.iodchunks; in sctp_get_sctp_info()
4965 info->sctpi_octrlchunks = asoc->stats.octrlchunks; in sctp_get_sctp_info()
4966 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks; in sctp_get_sctp_info()
4968 prim = asoc->peer.primary_path; in sctp_get_sctp_info()
5016 if (net_eq(sock_net(t->asoc->base.sk), net) && in sctp_transport_get_next()
5017 t->asoc->peer.primary_path == t) in sctp_transport_get_next()
5133 struct sctp_association *asoc = NULL; in sctp_getsockopt_sctp_status() local
5150 asoc = sctp_id2assoc(sk, associd); in sctp_getsockopt_sctp_status()
5151 if (!asoc) { in sctp_getsockopt_sctp_status()
5156 transport = asoc->peer.primary_path; in sctp_getsockopt_sctp_status()
5158 status.sstat_assoc_id = sctp_assoc2id(asoc); in sctp_getsockopt_sctp_status()
5159 status.sstat_state = sctp_assoc_to_state(asoc); in sctp_getsockopt_sctp_status()
5160 status.sstat_rwnd = asoc->peer.rwnd; in sctp_getsockopt_sctp_status()
5161 status.sstat_unackdata = asoc->unack_data; in sctp_getsockopt_sctp_status()
5163 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_getsockopt_sctp_status()
5164 status.sstat_instrms = asoc->stream.incnt; in sctp_getsockopt_sctp_status()
5165 status.sstat_outstrms = asoc->stream.outcnt; in sctp_getsockopt_sctp_status()
5166 status.sstat_fragmentation_point = asoc->frag_point; in sctp_getsockopt_sctp_status()
5167 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_sctp_status()
5232 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_peer_addr_info()
5328 struct sctp_association *asoc = sctp_id2assoc(sk, id); in sctp_do_peeloff() local
5337 if (!asoc) in sctp_do_peeloff()
5351 sctp_copy_sock(sock->sk, sk, asoc); in sctp_do_peeloff()
5357 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk); in sctp_do_peeloff()
5363 sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); in sctp_do_peeloff()
5612 struct sctp_association *asoc = NULL; in sctp_getsockopt_peer_addr_params() local
5643 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_getsockopt_peer_addr_params()
5644 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) { in sctp_getsockopt_peer_addr_params()
5667 } else if (asoc) { in sctp_getsockopt_peer_addr_params()
5669 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval); in sctp_getsockopt_peer_addr_params()
5670 params.spp_pathmtu = asoc->pathmtu; in sctp_getsockopt_peer_addr_params()
5671 params.spp_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5672 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_peer_addr_params()
5675 params.spp_flags = asoc->param_flags; in sctp_getsockopt_peer_addr_params()
5676 if (asoc->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5677 params.spp_ipv6_flowlabel = asoc->flowlabel & in sctp_getsockopt_peer_addr_params()
5681 if (asoc->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5682 params.spp_dscp = asoc->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
5754 struct sctp_association *asoc = NULL; in sctp_getsockopt_delayed_ack() local
5777 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_getsockopt_delayed_ack()
5778 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_delayed_ack()
5781 if (asoc) { in sctp_getsockopt_delayed_ack()
5783 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) { in sctp_getsockopt_delayed_ack()
5785 asoc->sackdelay); in sctp_getsockopt_delayed_ack()
5786 params.sack_freq = asoc->sackfreq; in sctp_getsockopt_delayed_ack()
5839 struct sctp_association *asoc; in sctp_getsockopt_peer_addrs() local
5857 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_peer_addrs()
5858 if (!asoc) in sctp_getsockopt_peer_addrs()
5864 list_for_each_entry(from, &asoc->peer.transport_addr_list, in sctp_getsockopt_peer_addrs()
5936 struct sctp_association *asoc; in sctp_getsockopt_local_addrs() local
5965 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_local_addrs()
5966 if (!asoc) in sctp_getsockopt_local_addrs()
5968 bp = &asoc->base.bind_addr; in sctp_getsockopt_local_addrs()
6044 struct sctp_association *asoc; in sctp_getsockopt_primary_addr() local
6055 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id); in sctp_getsockopt_primary_addr()
6056 if (!asoc) in sctp_getsockopt_primary_addr()
6059 if (!asoc->peer.primary_path) in sctp_getsockopt_primary_addr()
6062 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, in sctp_getsockopt_primary_addr()
6063 asoc->peer.primary_path->af_specific->sockaddr_len); in sctp_getsockopt_primary_addr()
6126 struct sctp_association *asoc; in sctp_getsockopt_default_send_param() local
6137 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_getsockopt_default_send_param()
6138 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_default_send_param()
6140 if (asoc) { in sctp_getsockopt_default_send_param()
6141 info.sinfo_stream = asoc->default_stream; in sctp_getsockopt_default_send_param()
6142 info.sinfo_flags = asoc->default_flags; in sctp_getsockopt_default_send_param()
6143 info.sinfo_ppid = asoc->default_ppid; in sctp_getsockopt_default_send_param()
6144 info.sinfo_context = asoc->default_context; in sctp_getsockopt_default_send_param()
6145 info.sinfo_timetolive = asoc->default_timetolive; in sctp_getsockopt_default_send_param()
6170 struct sctp_association *asoc; in sctp_getsockopt_default_sndinfo() local
6181 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_getsockopt_default_sndinfo()
6182 if (!asoc && info.snd_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_default_sndinfo()
6184 if (asoc) { in sctp_getsockopt_default_sndinfo()
6185 info.snd_sid = asoc->default_stream; in sctp_getsockopt_default_sndinfo()
6186 info.snd_flags = asoc->default_flags; in sctp_getsockopt_default_sndinfo()
6187 info.snd_ppid = asoc->default_ppid; in sctp_getsockopt_default_sndinfo()
6188 info.snd_context = asoc->default_context; in sctp_getsockopt_default_sndinfo()
6247 struct sctp_association *asoc; in sctp_getsockopt_rtoinfo() local
6257 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_getsockopt_rtoinfo()
6259 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_rtoinfo()
6263 if (asoc) { in sctp_getsockopt_rtoinfo()
6264 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); in sctp_getsockopt_rtoinfo()
6265 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); in sctp_getsockopt_rtoinfo()
6266 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); in sctp_getsockopt_rtoinfo()
6302 struct sctp_association *asoc; in sctp_getsockopt_associnfo() local
6314 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_getsockopt_associnfo()
6316 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_associnfo()
6320 if (asoc) { in sctp_getsockopt_associnfo()
6321 assocparams.sasoc_asocmaxrxt = asoc->max_retrans; in sctp_getsockopt_associnfo()
6322 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd; in sctp_getsockopt_associnfo()
6323 assocparams.sasoc_local_rwnd = asoc->a_rwnd; in sctp_getsockopt_associnfo()
6324 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life); in sctp_getsockopt_associnfo()
6326 list_for_each(pos, &asoc->peer.transport_addr_list) { in sctp_getsockopt_associnfo()
6392 struct sctp_association *asoc; in sctp_getsockopt_context() local
6405 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_context()
6406 if (!asoc) in sctp_getsockopt_context()
6408 params.assoc_value = asoc->default_rcv_context; in sctp_getsockopt_context()
6452 struct sctp_association *asoc; in sctp_getsockopt_maxseg() local
6468 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxseg()
6469 if (!asoc && params.assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_maxseg()
6472 if (asoc) in sctp_getsockopt_maxseg()
6473 params.assoc_value = asoc->frag_point; in sctp_getsockopt_maxseg()
6547 struct sctp_association *asoc; in sctp_getsockopt_maxburst() local
6566 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxburst()
6567 if (!asoc) in sctp_getsockopt_maxburst()
6569 params.assoc_value = asoc->max_burst; in sctp_getsockopt_maxburst()
6626 struct sctp_association *asoc; in sctp_getsockopt_active_key() local
6638 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_getsockopt_active_key()
6639 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_active_key()
6642 if (asoc) in sctp_getsockopt_active_key()
6643 val.scact_keynumber = asoc->active_key_id; in sctp_getsockopt_active_key()
6661 struct sctp_association *asoc; in sctp_getsockopt_peer_auth_chunks() local
6676 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_peer_auth_chunks()
6677 if (!asoc) in sctp_getsockopt_peer_auth_chunks()
6680 ch = asoc->peer.peer_chunks; in sctp_getsockopt_peer_auth_chunks()
6706 struct sctp_association *asoc; in sctp_getsockopt_local_auth_chunks() local
6721 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_local_auth_chunks()
6722 if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_local_auth_chunks()
6725 if (asoc) in sctp_getsockopt_local_auth_chunks()
6726 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks; in sctp_getsockopt_local_auth_chunks()
6758 struct sctp_association *asoc; in sctp_getsockopt_assoc_number() local
6769 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_number()
6814 struct sctp_association *asoc; in sctp_getsockopt_assoc_ids() local
6824 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
6839 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
6840 ids->gaids_assoc_id[num++] = asoc->assoc_id; in sctp_getsockopt_assoc_ids()
6866 struct sctp_association *asoc; in sctp_getsockopt_paddr_thresholds() local
6875 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_getsockopt_paddr_thresholds()
6876 if (!asoc) in sctp_getsockopt_paddr_thresholds()
6879 val.spt_pathpfthld = asoc->pf_retrans; in sctp_getsockopt_paddr_thresholds()
6880 val.spt_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
6908 struct sctp_association *asoc = NULL; in sctp_getsockopt_assoc_stats() local
6920 asoc = sctp_id2assoc(sk, sas.sas_assoc_id); in sctp_getsockopt_assoc_stats()
6921 if (!asoc) in sctp_getsockopt_assoc_stats()
6924 sas.sas_rtxchunks = asoc->stats.rtxchunks; in sctp_getsockopt_assoc_stats()
6925 sas.sas_gapcnt = asoc->stats.gapcnt; in sctp_getsockopt_assoc_stats()
6926 sas.sas_outofseqtsns = asoc->stats.outofseqtsns; in sctp_getsockopt_assoc_stats()
6927 sas.sas_osacks = asoc->stats.osacks; in sctp_getsockopt_assoc_stats()
6928 sas.sas_isacks = asoc->stats.isacks; in sctp_getsockopt_assoc_stats()
6929 sas.sas_octrlchunks = asoc->stats.octrlchunks; in sctp_getsockopt_assoc_stats()
6930 sas.sas_ictrlchunks = asoc->stats.ictrlchunks; in sctp_getsockopt_assoc_stats()
6931 sas.sas_oodchunks = asoc->stats.oodchunks; in sctp_getsockopt_assoc_stats()
6932 sas.sas_iodchunks = asoc->stats.iodchunks; in sctp_getsockopt_assoc_stats()
6933 sas.sas_ouodchunks = asoc->stats.ouodchunks; in sctp_getsockopt_assoc_stats()
6934 sas.sas_iuodchunks = asoc->stats.iuodchunks; in sctp_getsockopt_assoc_stats()
6935 sas.sas_idupchunks = asoc->stats.idupchunks; in sctp_getsockopt_assoc_stats()
6936 sas.sas_opackets = asoc->stats.opackets; in sctp_getsockopt_assoc_stats()
6937 sas.sas_ipackets = asoc->stats.ipackets; in sctp_getsockopt_assoc_stats()
6943 sas.sas_maxrto = asoc->stats.max_obs_rto; in sctp_getsockopt_assoc_stats()
6944 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr, in sctp_getsockopt_assoc_stats()
6948 asoc->stats.max_obs_rto = asoc->rto_min; in sctp_getsockopt_assoc_stats()
7006 struct sctp_association *asoc; in sctp_getsockopt_pr_supported() local
7018 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_pr_supported()
7019 if (asoc) { in sctp_getsockopt_pr_supported()
7020 params.assoc_value = asoc->prsctp_enable; in sctp_getsockopt_pr_supported()
7047 struct sctp_association *asoc; in sctp_getsockopt_default_prinfo() local
7059 asoc = sctp_id2assoc(sk, info.pr_assoc_id); in sctp_getsockopt_default_prinfo()
7060 if (asoc) { in sctp_getsockopt_default_prinfo()
7061 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags); in sctp_getsockopt_default_prinfo()
7062 info.pr_value = asoc->default_timetolive; in sctp_getsockopt_default_prinfo()
7090 struct sctp_association *asoc; in sctp_getsockopt_pr_assocstatus() local
7107 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id); in sctp_getsockopt_pr_assocstatus()
7108 if (!asoc) in sctp_getsockopt_pr_assocstatus()
7116 asoc->abandoned_unsent[policy]; in sctp_getsockopt_pr_assocstatus()
7118 asoc->abandoned_sent[policy]; in sctp_getsockopt_pr_assocstatus()
7122 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7124 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7148 struct sctp_association *asoc; in sctp_getsockopt_pr_streamstatus() local
7166 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id); in sctp_getsockopt_pr_streamstatus()
7167 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt) in sctp_getsockopt_pr_streamstatus()
7170 streamoute = SCTP_SO(&asoc->stream, params.sprstat_sid)->ext; in sctp_getsockopt_pr_streamstatus()
7211 struct sctp_association *asoc; in sctp_getsockopt_reconfig_supported() local
7223 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_reconfig_supported()
7224 if (asoc) { in sctp_getsockopt_reconfig_supported()
7225 params.assoc_value = asoc->reconf_enable; in sctp_getsockopt_reconfig_supported()
7252 struct sctp_association *asoc; in sctp_getsockopt_enable_strreset() local
7264 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_enable_strreset()
7265 if (asoc) { in sctp_getsockopt_enable_strreset()
7266 params.assoc_value = asoc->strreset_enable; in sctp_getsockopt_enable_strreset()
7293 struct sctp_association *asoc; in sctp_getsockopt_scheduler() local
7305 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_scheduler()
7306 if (!asoc) { in sctp_getsockopt_scheduler()
7311 params.assoc_value = sctp_sched_get_sched(asoc); in sctp_getsockopt_scheduler()
7330 struct sctp_association *asoc; in sctp_getsockopt_scheduler_value() local
7342 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_scheduler_value()
7343 if (!asoc) { in sctp_getsockopt_scheduler_value()
7348 retval = sctp_sched_get_value(asoc, params.stream_id, in sctp_getsockopt_scheduler_value()
7372 struct sctp_association *asoc; in sctp_getsockopt_interleaving_supported() local
7384 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_interleaving_supported()
7385 if (asoc) { in sctp_getsockopt_interleaving_supported()
7386 params.assoc_value = asoc->intl_enable; in sctp_getsockopt_interleaving_supported()
8384 static void __sctp_write_space(struct sctp_association *asoc) in __sctp_write_space() argument
8386 struct sock *sk = asoc->base.sk; in __sctp_write_space()
8388 if (sctp_wspace(asoc) <= 0) in __sctp_write_space()
8391 if (waitqueue_active(&asoc->wait)) in __sctp_write_space()
8392 wake_up_interruptible(&asoc->wait); in __sctp_write_space()
8415 struct sctp_association *asoc) in sctp_wake_up_waiters() argument
8417 struct sctp_association *tmp = asoc; in sctp_wake_up_waiters()
8422 if (asoc->ep->sndbuf_policy) in sctp_wake_up_waiters()
8423 return __sctp_write_space(asoc); in sctp_wake_up_waiters()
8428 if (asoc->base.dead) in sctp_wake_up_waiters()
8449 if (tmp == asoc) in sctp_wake_up_waiters()
8461 struct sctp_association *asoc = chunk->asoc; in sctp_wfree() local
8462 struct sock *sk = asoc->base.sk; in sctp_wfree()
8464 asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk) + in sctp_wfree()
8487 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id, in sctp_wfree()
8491 asoc->stream.si->enqueue_event(&asoc->ulpq, ev); in sctp_wfree()
8497 sctp_wake_up_waiters(sk, asoc); in sctp_wfree()
8499 sctp_association_put(asoc); in sctp_wfree()
8522 static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, in sctp_wait_for_sndbuf() argument
8525 struct sock *sk = asoc->base.sk; in sctp_wait_for_sndbuf()
8530 pr_debug("%s: asoc:%p, timeo:%ld, msg_len:%zu\n", __func__, asoc, in sctp_wait_for_sndbuf()
8534 sctp_association_hold(asoc); in sctp_wait_for_sndbuf()
8538 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_sndbuf()
8540 if (asoc->base.dead) in sctp_wait_for_sndbuf()
8544 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING) in sctp_wait_for_sndbuf()
8548 if (msg_len <= sctp_wspace(asoc)) in sctp_wait_for_sndbuf()
8557 if (sk != asoc->base.sk) in sctp_wait_for_sndbuf()
8564 finish_wait(&asoc->wait, &wait); in sctp_wait_for_sndbuf()
8567 sctp_association_put(asoc); in sctp_wait_for_sndbuf()
8604 struct sctp_association *asoc; in sctp_write_space() local
8607 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { in sctp_write_space()
8608 __sctp_write_space(asoc); in sctp_write_space()
8636 static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p) in sctp_wait_for_connect() argument
8638 struct sock *sk = asoc->base.sk; in sctp_wait_for_connect()
8643 pr_debug("%s: asoc:%p, timeo:%ld\n", __func__, asoc, *timeo_p); in sctp_wait_for_connect()
8646 sctp_association_hold(asoc); in sctp_wait_for_connect()
8649 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_connect()
8655 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_connect()
8656 asoc->base.dead) in sctp_wait_for_connect()
8661 if (sctp_state(asoc, ESTABLISHED)) in sctp_wait_for_connect()
8675 finish_wait(&asoc->wait, &wait); in sctp_wait_for_connect()
8678 sctp_association_put(asoc); in sctp_wait_for_connect()
8683 if (asoc->init_err_counter + 1 > asoc->max_init_attempts) in sctp_wait_for_connect()
8771 struct sctp_association *asoc) in sctp_copy_sock() argument
8807 newinet->inet_dport = htons(asoc->peer.port); in sctp_copy_sock()
8809 newinet->inet_id = asoc->next_tsn ^ jiffies; in sctp_copy_sock()
8889 if (event->asoc == assoc) { in sctp_sock_migrate()
8919 if (event->asoc == assoc) { in sctp_sock_migrate()