Lines Matching refs:asoc

73 static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
86 static int sctp_send_asconf(struct sctp_association *asoc,
105 static inline int sctp_wspace(struct sctp_association *asoc) in sctp_wspace() argument
107 struct sock *sk = asoc->base.sk; in sctp_wspace()
109 return asoc->ep->sndbuf_policy ? sk->sk_sndbuf - asoc->sndbuf_used in sctp_wspace()
124 struct sctp_association *asoc = chunk->asoc; in sctp_set_owner_w() local
125 struct sock *sk = asoc->base.sk; in sctp_set_owner_w()
128 sctp_association_hold(asoc); in sctp_set_owner_w()
140 asoc->sndbuf_used += chunk->skb->truesize + sizeof(struct sctp_chunk); in sctp_set_owner_w()
150 static void sctp_for_each_tx_datachunk(struct sctp_association *asoc, in sctp_for_each_tx_datachunk() argument
154 struct sctp_outq *q = &asoc->outqueue; in sctp_for_each_tx_datachunk()
158 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) in sctp_for_each_tx_datachunk()
175 static void sctp_for_each_rx_skb(struct sctp_association *asoc, struct sock *sk, in sctp_for_each_rx_skb() argument
181 sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp) in sctp_for_each_rx_skb()
184 sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp) in sctp_for_each_rx_skb()
187 sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp) in sctp_for_each_rx_skb()
217 struct sctp_association *asoc = NULL; in sctp_id2assoc() local
230 asoc = list_entry(sctp_sk(sk)->ep->asocs.next, in sctp_id2assoc()
232 return asoc; in sctp_id2assoc()
240 asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id); in sctp_id2assoc()
241 if (asoc && (asoc->base.sk != sk || asoc->base.dead)) in sctp_id2assoc()
242 asoc = NULL; in sctp_id2assoc()
245 return asoc; in sctp_id2assoc()
436 static int sctp_send_asconf(struct sctp_association *asoc, in sctp_send_asconf() argument
439 struct net *net = sock_net(asoc->base.sk); in sctp_send_asconf()
445 if (asoc->addip_last_asconf) { in sctp_send_asconf()
446 list_add_tail(&chunk->list, &asoc->addip_chunk_list); in sctp_send_asconf()
452 retval = sctp_primitive_ASCONF(net, asoc, chunk); in sctp_send_asconf()
456 asoc->addip_last_asconf = chunk; in sctp_send_asconf()
530 struct sctp_association *asoc; in sctp_send_asconf_add_ip() local
551 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_add_ip()
552 if (!asoc->peer.asconf_capable) in sctp_send_asconf_add_ip()
555 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP) in sctp_send_asconf_add_ip()
558 if (!sctp_state(asoc, ESTABLISHED)) in sctp_send_asconf_add_ip()
575 if (sctp_assoc_lookup_laddr(asoc, addr)) in sctp_send_asconf_add_ip()
586 bp = &asoc->base.bind_addr; in sctp_send_asconf_add_ip()
589 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, in sctp_send_asconf_add_ip()
609 if (asoc->src_out_of_asoc_ok) { in sctp_send_asconf_add_ip()
613 &asoc->peer.transport_addr_list, transports) { in sctp_send_asconf_add_ip()
614 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32, in sctp_send_asconf_add_ip()
615 2*asoc->pathmtu, 4380)); in sctp_send_asconf_add_ip()
616 trans->ssthresh = asoc->peer.i.a_rwnd; in sctp_send_asconf_add_ip()
617 trans->rto = asoc->rto_initial; in sctp_send_asconf_add_ip()
618 sctp_max_rto(asoc, trans); in sctp_send_asconf_add_ip()
622 sctp_sk(asoc->base.sk)); in sctp_send_asconf_add_ip()
625 retval = sctp_send_asconf(asoc, chunk); in sctp_send_asconf_add_ip()
732 struct sctp_association *asoc; in sctp_send_asconf_del_ip() local
754 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_send_asconf_del_ip()
756 if (!asoc->peer.asconf_capable) in sctp_send_asconf_del_ip()
759 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP) in sctp_send_asconf_del_ip()
762 if (!sctp_state(asoc, ESTABLISHED)) in sctp_send_asconf_del_ip()
779 if (!sctp_assoc_lookup_laddr(asoc, laddr)) in sctp_send_asconf_del_ip()
792 bp = &asoc->base.bind_addr; in sctp_send_asconf_del_ip()
796 if (asoc->asconf_addr_del_pending) in sctp_send_asconf_del_ip()
798 asoc->asconf_addr_del_pending = in sctp_send_asconf_del_ip()
800 if (asoc->asconf_addr_del_pending == NULL) { in sctp_send_asconf_del_ip()
804 asoc->asconf_addr_del_pending->sa.sa_family = in sctp_send_asconf_del_ip()
806 asoc->asconf_addr_del_pending->v4.sin_port = in sctp_send_asconf_del_ip()
812 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr; in sctp_send_asconf_del_ip()
817 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr; in sctp_send_asconf_del_ip()
821 __func__, asoc, &asoc->asconf_addr_del_pending->sa, in sctp_send_asconf_del_ip()
822 asoc->asconf_addr_del_pending); in sctp_send_asconf_del_ip()
824 asoc->src_out_of_asoc_ok = 1; in sctp_send_asconf_del_ip()
836 chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt, in sctp_send_asconf_del_ip()
862 list_for_each_entry(transport, &asoc->peer.transport_addr_list, in sctp_send_asconf_del_ip()
865 sctp_sk(asoc->base.sk)); in sctp_send_asconf_del_ip()
871 retval = sctp_send_asconf(asoc, chunk); in sctp_send_asconf_del_ip()
1051 struct sctp_association *asoc; in sctp_connect_new_asoc() local
1070 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); in sctp_connect_new_asoc()
1071 if (!asoc) in sctp_connect_new_asoc()
1074 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL); in sctp_connect_new_asoc()
1078 *tp = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN); in sctp_connect_new_asoc()
1090 asoc->c.sinit_num_ostreams = outcnt; in sctp_connect_new_asoc()
1092 err = sctp_stream_init(&asoc->stream, outcnt, 0, GFP_KERNEL); in sctp_connect_new_asoc()
1098 asoc->c.sinit_max_instreams = init->sinit_max_instreams; in sctp_connect_new_asoc()
1101 asoc->max_init_attempts = init->sinit_max_attempts; in sctp_connect_new_asoc()
1104 asoc->max_init_timeo = in sctp_connect_new_asoc()
1109 sctp_association_free(asoc); in sctp_connect_new_asoc()
1113 static int sctp_connect_add_peer(struct sctp_association *asoc, in sctp_connect_add_peer() argument
1116 struct sctp_endpoint *ep = asoc->ep; in sctp_connect_add_peer()
1126 if (old && old != asoc) in sctp_connect_add_peer()
1133 t = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN); in sctp_connect_add_peer()
1151 struct sctp_association *asoc; in __sctp_connect() local
1171 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport); in __sctp_connect()
1172 if (asoc) in __sctp_connect()
1173 return asoc->state >= SCTP_STATE_ESTABLISHED ? -EISCONN in __sctp_connect()
1179 asoc = transport->asoc; in __sctp_connect()
1193 if (asoc->peer.port != ntohs(daddr->v4.sin_port)) in __sctp_connect()
1196 err = sctp_connect_add_peer(asoc, daddr, af->sockaddr_len); in __sctp_connect()
1208 err = sctp_assoc_set_id(asoc, GFP_KERNEL); in __sctp_connect()
1213 err = sctp_primitive_ASSOCIATE(sock_net(sk), asoc, NULL); in __sctp_connect()
1218 inet_sk(sk)->inet_dport = htons(asoc->peer.port); in __sctp_connect()
1223 *assoc_id = asoc->assoc_id; in __sctp_connect()
1226 return sctp_wait_for_connect(asoc, &timeo); in __sctp_connect()
1230 __func__, asoc, kaddrs, err); in __sctp_connect()
1231 sctp_association_free(asoc); in __sctp_connect()
1474 struct sctp_association *asoc; in sctp_close() local
1492 asoc = list_entry(pos, struct sctp_association, asocs); in sctp_close()
1500 if (sctp_state(asoc, CLOSED)) { in sctp_close()
1501 sctp_association_free(asoc); in sctp_close()
1506 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) || in sctp_close()
1507 !skb_queue_empty(&asoc->ulpq.reasm) || in sctp_close()
1508 !skb_queue_empty(&asoc->ulpq.reasm_uo) || in sctp_close()
1512 chunk = sctp_make_abort_user(asoc, NULL, 0); in sctp_close()
1513 sctp_primitive_ABORT(net, asoc, chunk); in sctp_close()
1515 sctp_primitive_SHUTDOWN(net, asoc, NULL); in sctp_close()
1650 struct sctp_association *asoc; in sctp_sendmsg_new_asoc() local
1683 asoc = (*tp)->asoc; in sctp_sendmsg_new_asoc()
1712 daddr->v4.sin_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1723 daddr->v6.sin6_port = htons(asoc->peer.port); in sctp_sendmsg_new_asoc()
1727 err = sctp_connect_add_peer(asoc, daddr, sizeof(*daddr)); in sctp_sendmsg_new_asoc()
1735 sctp_association_free(asoc); in sctp_sendmsg_new_asoc()
1739 static int sctp_sendmsg_check_sflags(struct sctp_association *asoc, in sctp_sendmsg_check_sflags() argument
1743 struct sock *sk = asoc->base.sk; in sctp_sendmsg_check_sflags()
1746 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) in sctp_sendmsg_check_sflags()
1750 !sctp_state(asoc, ESTABLISHED)) in sctp_sendmsg_check_sflags()
1754 pr_debug("%s: shutting down association:%p\n", __func__, asoc); in sctp_sendmsg_check_sflags()
1755 sctp_primitive_SHUTDOWN(net, asoc, NULL); in sctp_sendmsg_check_sflags()
1763 chunk = sctp_make_abort_user(asoc, msg, msg_len); in sctp_sendmsg_check_sflags()
1767 pr_debug("%s: aborting association:%p\n", __func__, asoc); in sctp_sendmsg_check_sflags()
1768 sctp_primitive_ABORT(net, asoc, chunk); in sctp_sendmsg_check_sflags()
1777 static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, in sctp_sendmsg_to_asoc() argument
1782 struct sock *sk = asoc->base.sk; in sctp_sendmsg_to_asoc()
1791 if (sinfo->sinfo_stream >= asoc->stream.outcnt) { in sctp_sendmsg_to_asoc()
1796 if (unlikely(!SCTP_SO(&asoc->stream, sinfo->sinfo_stream)->ext)) { in sctp_sendmsg_to_asoc()
1797 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream); in sctp_sendmsg_to_asoc()
1802 if (sp->disable_fragments && msg_len > asoc->frag_point) { in sctp_sendmsg_to_asoc()
1807 if (asoc->pmtu_pending) { in sctp_sendmsg_to_asoc()
1809 sctp_assoc_sync_pmtu(asoc); in sctp_sendmsg_to_asoc()
1810 asoc->pmtu_pending = 0; in sctp_sendmsg_to_asoc()
1813 if (sctp_wspace(asoc) < (int)msg_len) in sctp_sendmsg_to_asoc()
1814 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); in sctp_sendmsg_to_asoc()
1819 if (sctp_wspace(asoc) <= 0 || !sk_wmem_schedule(sk, msg_len)) { in sctp_sendmsg_to_asoc()
1821 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); in sctp_sendmsg_to_asoc()
1826 if (sctp_state(asoc, CLOSED)) { in sctp_sendmsg_to_asoc()
1827 err = sctp_primitive_ASSOCIATE(net, asoc, NULL); in sctp_sendmsg_to_asoc()
1831 if (asoc->ep->intl_enable) { in sctp_sendmsg_to_asoc()
1833 err = sctp_wait_for_connect(asoc, &timeo); in sctp_sendmsg_to_asoc()
1845 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter); in sctp_sendmsg_to_asoc()
1851 asoc->force_delay = !!(msg->msg_flags & MSG_MORE); in sctp_sendmsg_to_asoc()
1859 err = sctp_primitive_SEND(net, asoc, datamsg); in sctp_sendmsg_to_asoc()
1871 sctp_wait_for_connect(asoc, &timeo); in sctp_sendmsg_to_asoc()
1903 static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc, in sctp_sendmsg_update_sinfo() argument
1908 sinfo->sinfo_stream = asoc->default_stream; in sctp_sendmsg_update_sinfo()
1909 sinfo->sinfo_ppid = asoc->default_ppid; in sctp_sendmsg_update_sinfo()
1910 sinfo->sinfo_context = asoc->default_context; in sctp_sendmsg_update_sinfo()
1911 sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); in sctp_sendmsg_update_sinfo()
1914 sinfo->sinfo_flags = asoc->default_flags; in sctp_sendmsg_update_sinfo()
1918 sinfo->sinfo_timetolive = asoc->default_timetolive; in sctp_sendmsg_update_sinfo()
1934 struct sctp_association *asoc, *tmp; in sctp_sendmsg() local
1960 list_for_each_entry_safe(asoc, tmp, &ep->asocs, asocs) { in sctp_sendmsg()
1961 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, in sctp_sendmsg()
1968 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs); in sctp_sendmsg()
1970 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, in sctp_sendmsg()
1983 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport); in sctp_sendmsg()
1984 if (asoc) { in sctp_sendmsg()
1985 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, in sctp_sendmsg()
1995 asoc = transport->asoc; in sctp_sendmsg()
2002 asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id); in sctp_sendmsg()
2003 if (!asoc) { in sctp_sendmsg()
2008 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len); in sctp_sendmsg()
2014 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs); in sctp_sendmsg()
2017 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, transport, sinfo); in sctp_sendmsg()
2019 sctp_association_free(asoc); in sctp_sendmsg()
2158 sctp_assoc_rwnd_increase(event->asoc, copied); in sctp_recvmsg()
2214 struct sctp_association *asoc; in sctp_setsockopt_events() local
2227 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_events()
2228 asoc->subscribe = sctp_sk(sk)->subscribe; in sctp_setsockopt_events()
2237 asoc = sctp_id2assoc(sk, 0); in sctp_setsockopt_events()
2238 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) { in sctp_setsockopt_events()
2239 event = sctp_ulpevent_make_sender_dry_event(asoc, in sctp_setsockopt_events()
2244 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_setsockopt_events()
2422 struct sctp_association *asoc, in sctp_apply_peer_addr_params() argument
2431 struct net *net = sock_net(trans->asoc->base.sk); in sctp_apply_peer_addr_params()
2433 error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans); in sctp_apply_peer_addr_params()
2456 } else if (asoc) { in sctp_apply_peer_addr_params()
2457 asoc->hbinterval = in sctp_apply_peer_addr_params()
2469 } else if (asoc) { in sctp_apply_peer_addr_params()
2470 asoc->param_flags = in sctp_apply_peer_addr_params()
2471 (asoc->param_flags & ~SPP_HB) | hb_change; in sctp_apply_peer_addr_params()
2486 sctp_assoc_sync_pmtu(asoc); in sctp_apply_peer_addr_params()
2487 } else if (asoc) { in sctp_apply_peer_addr_params()
2488 sctp_assoc_set_pmtu(asoc, params->spp_pathmtu); in sctp_apply_peer_addr_params()
2502 sctp_assoc_sync_pmtu(asoc); in sctp_apply_peer_addr_params()
2504 } else if (asoc) { in sctp_apply_peer_addr_params()
2505 asoc->param_flags = in sctp_apply_peer_addr_params()
2506 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change; in sctp_apply_peer_addr_params()
2521 } else if (asoc) { in sctp_apply_peer_addr_params()
2522 asoc->sackdelay = in sctp_apply_peer_addr_params()
2534 } else if (asoc) { in sctp_apply_peer_addr_params()
2535 asoc->param_flags = in sctp_apply_peer_addr_params()
2536 (asoc->param_flags & ~SPP_SACKDELAY) | in sctp_apply_peer_addr_params()
2551 } else if (asoc) { in sctp_apply_peer_addr_params()
2552 asoc->pathmaxrxt = params->spp_pathmaxrxt; in sctp_apply_peer_addr_params()
2565 } else if (asoc) { in sctp_apply_peer_addr_params()
2568 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2576 asoc->flowlabel = params->spp_ipv6_flowlabel & in sctp_apply_peer_addr_params()
2578 asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK; in sctp_apply_peer_addr_params()
2590 } else if (asoc) { in sctp_apply_peer_addr_params()
2593 list_for_each_entry(t, &asoc->peer.transport_addr_list, in sctp_apply_peer_addr_params()
2599 asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; in sctp_apply_peer_addr_params()
2600 asoc->dscp |= SCTP_DSCP_SET_MASK; in sctp_apply_peer_addr_params()
2616 struct sctp_association *asoc = NULL; in sctp_setsockopt_peer_addr_params() local
2661 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_setsockopt_peer_addr_params()
2662 if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_peer_addr_params()
2669 if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) in sctp_setsockopt_peer_addr_params()
2673 error = sctp_apply_peer_addr_params(&params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2683 if (!trans && asoc) { in sctp_setsockopt_peer_addr_params()
2684 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_peer_addr_params()
2686 sctp_apply_peer_addr_params(&params, trans, asoc, sp, in sctp_setsockopt_peer_addr_params()
2706 struct sctp_association *asoc) in sctp_apply_asoc_delayed_ack() argument
2711 asoc->sackdelay = msecs_to_jiffies(params->sack_delay); in sctp_apply_asoc_delayed_ack()
2712 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2713 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2716 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2717 sctp_spp_sackdelay_disable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2719 asoc->sackfreq = params->sack_freq; in sctp_apply_asoc_delayed_ack()
2720 asoc->param_flags = in sctp_apply_asoc_delayed_ack()
2721 sctp_spp_sackdelay_enable(asoc->param_flags); in sctp_apply_asoc_delayed_ack()
2724 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_apply_asoc_delayed_ack()
2782 struct sctp_association *asoc; in sctp_setsockopt_delayed_ack() local
2815 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_setsockopt_delayed_ack()
2816 if (!asoc && params.sack_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_delayed_ack()
2820 if (asoc) { in sctp_setsockopt_delayed_ack()
2821 sctp_apply_asoc_delayed_ack(&params, asoc); in sctp_setsockopt_delayed_ack()
2848 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_delayed_ack()
2849 sctp_apply_asoc_delayed_ack(&params, asoc); in sctp_setsockopt_delayed_ack()
2906 struct sctp_association *asoc; in sctp_setsockopt_default_send_param() local
2918 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_setsockopt_default_send_param()
2919 if (!asoc && info.sinfo_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_send_param()
2923 if (asoc) { in sctp_setsockopt_default_send_param()
2924 asoc->default_stream = info.sinfo_stream; in sctp_setsockopt_default_send_param()
2925 asoc->default_flags = info.sinfo_flags; in sctp_setsockopt_default_send_param()
2926 asoc->default_ppid = info.sinfo_ppid; in sctp_setsockopt_default_send_param()
2927 asoc->default_context = info.sinfo_context; in sctp_setsockopt_default_send_param()
2928 asoc->default_timetolive = info.sinfo_timetolive; in sctp_setsockopt_default_send_param()
2947 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_send_param()
2948 asoc->default_stream = info.sinfo_stream; in sctp_setsockopt_default_send_param()
2949 asoc->default_flags = info.sinfo_flags; in sctp_setsockopt_default_send_param()
2950 asoc->default_ppid = info.sinfo_ppid; in sctp_setsockopt_default_send_param()
2951 asoc->default_context = info.sinfo_context; in sctp_setsockopt_default_send_param()
2952 asoc->default_timetolive = info.sinfo_timetolive; in sctp_setsockopt_default_send_param()
2967 struct sctp_association *asoc; in sctp_setsockopt_default_sndinfo() local
2979 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_setsockopt_default_sndinfo()
2980 if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_sndinfo()
2984 if (asoc) { in sctp_setsockopt_default_sndinfo()
2985 asoc->default_stream = info.snd_sid; in sctp_setsockopt_default_sndinfo()
2986 asoc->default_flags = info.snd_flags; in sctp_setsockopt_default_sndinfo()
2987 asoc->default_ppid = info.snd_ppid; in sctp_setsockopt_default_sndinfo()
2988 asoc->default_context = info.snd_context; in sctp_setsockopt_default_sndinfo()
3006 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_sndinfo()
3007 asoc->default_stream = info.snd_sid; in sctp_setsockopt_default_sndinfo()
3008 asoc->default_flags = info.snd_flags; in sctp_setsockopt_default_sndinfo()
3009 asoc->default_ppid = info.snd_ppid; in sctp_setsockopt_default_sndinfo()
3010 asoc->default_context = info.snd_context; in sctp_setsockopt_default_sndinfo()
3052 sctp_assoc_set_primary(trans->asoc, trans); in sctp_setsockopt_primary_addr()
3094 struct sctp_association *asoc; in sctp_setsockopt_rtoinfo() local
3104 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_setsockopt_rtoinfo()
3107 if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_rtoinfo()
3115 rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max; in sctp_setsockopt_rtoinfo()
3117 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max; in sctp_setsockopt_rtoinfo()
3120 rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min; in sctp_setsockopt_rtoinfo()
3122 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min; in sctp_setsockopt_rtoinfo()
3127 if (asoc) { in sctp_setsockopt_rtoinfo()
3129 asoc->rto_initial = in sctp_setsockopt_rtoinfo()
3131 asoc->rto_max = rto_max; in sctp_setsockopt_rtoinfo()
3132 asoc->rto_min = rto_min; in sctp_setsockopt_rtoinfo()
3161 struct sctp_association *asoc; in sctp_setsockopt_associnfo() local
3168 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_setsockopt_associnfo()
3170 if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_associnfo()
3175 if (asoc) { in sctp_setsockopt_associnfo()
3181 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list, in sctp_setsockopt_associnfo()
3196 asoc->max_retrans = assocparams.sasoc_asocmaxrxt; in sctp_setsockopt_associnfo()
3200 asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life); in sctp_setsockopt_associnfo()
3273 struct sctp_association *asoc; in sctp_setsockopt_maxseg() local
3293 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_maxseg()
3294 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_maxseg()
3300 __u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) : in sctp_setsockopt_maxseg()
3310 if (asoc) { in sctp_setsockopt_maxseg()
3311 asoc->user_frag = val; in sctp_setsockopt_maxseg()
3312 sctp_assoc_update_frag_point(asoc); in sctp_setsockopt_maxseg()
3333 struct sctp_association *asoc = NULL; in sctp_setsockopt_peer_primary_addr() local
3350 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); in sctp_setsockopt_peer_primary_addr()
3351 if (!asoc) in sctp_setsockopt_peer_primary_addr()
3354 if (!asoc->peer.asconf_capable) in sctp_setsockopt_peer_primary_addr()
3357 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY) in sctp_setsockopt_peer_primary_addr()
3360 if (!sctp_state(asoc, ESTABLISHED)) in sctp_setsockopt_peer_primary_addr()
3370 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) in sctp_setsockopt_peer_primary_addr()
3381 chunk = sctp_make_asconf_set_prim(asoc, in sctp_setsockopt_peer_primary_addr()
3386 err = sctp_send_asconf(asoc, chunk); in sctp_setsockopt_peer_primary_addr()
3427 struct sctp_association *asoc; in sctp_setsockopt_context() local
3434 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_context()
3435 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_context()
3439 if (asoc) { in sctp_setsockopt_context()
3440 asoc->default_rcv_context = params.assoc_value; in sctp_setsockopt_context()
3454 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_context()
3455 asoc->default_rcv_context = params.assoc_value; in sctp_setsockopt_context()
3559 struct sctp_association *asoc; in sctp_setsockopt_maxburst() local
3576 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_maxburst()
3577 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_maxburst()
3581 if (asoc) { in sctp_setsockopt_maxburst()
3582 asoc->max_burst = params.assoc_value; in sctp_setsockopt_maxburst()
3596 list_for_each_entry(asoc, &sp->ep->asocs, asocs) in sctp_setsockopt_maxburst()
3597 asoc->max_burst = params.assoc_value; in sctp_setsockopt_maxburst()
3688 struct sctp_association *asoc; in sctp_setsockopt_auth_key() local
3705 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); in sctp_setsockopt_auth_key()
3706 if (!asoc && authkey->sca_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_auth_key()
3710 if (asoc) { in sctp_setsockopt_auth_key()
3711 ret = sctp_auth_set_key(ep, asoc, authkey); in sctp_setsockopt_auth_key()
3720 ret = sctp_auth_set_key(ep, asoc, authkey); in sctp_setsockopt_auth_key()
3729 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_auth_key()
3730 int res = sctp_auth_set_key(ep, asoc, authkey); in sctp_setsockopt_auth_key()
3753 struct sctp_association *asoc; in sctp_setsockopt_active_key() local
3762 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_active_key()
3763 if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_active_key()
3767 if (asoc) in sctp_setsockopt_active_key()
3768 return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); in sctp_setsockopt_active_key()
3775 ret = sctp_auth_set_active_key(ep, asoc, val.scact_keynumber); in sctp_setsockopt_active_key()
3782 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_active_key()
3783 int res = sctp_auth_set_active_key(ep, asoc, in sctp_setsockopt_active_key()
3804 struct sctp_association *asoc; in sctp_setsockopt_del_key() local
3813 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_del_key()
3814 if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_del_key()
3818 if (asoc) in sctp_setsockopt_del_key()
3819 return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); in sctp_setsockopt_del_key()
3826 ret = sctp_auth_del_key_id(ep, asoc, val.scact_keynumber); in sctp_setsockopt_del_key()
3833 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_del_key()
3834 int res = sctp_auth_del_key_id(ep, asoc, in sctp_setsockopt_del_key()
3854 struct sctp_association *asoc; in sctp_setsockopt_deactivate_key() local
3863 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_setsockopt_deactivate_key()
3864 if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_deactivate_key()
3868 if (asoc) in sctp_setsockopt_deactivate_key()
3869 return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); in sctp_setsockopt_deactivate_key()
3876 ret = sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber); in sctp_setsockopt_deactivate_key()
3883 list_for_each_entry(asoc, &ep->asocs, asocs) { in sctp_setsockopt_deactivate_key()
3884 int res = sctp_auth_deact_key_id(ep, asoc, in sctp_setsockopt_deactivate_key()
3950 struct sctp_association *asoc; in sctp_setsockopt_paddr_thresholds() local
3971 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_setsockopt_paddr_thresholds()
3972 if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_paddr_thresholds()
3976 if (asoc) { in sctp_setsockopt_paddr_thresholds()
3977 list_for_each_entry(trans, &asoc->peer.transport_addr_list, in sctp_setsockopt_paddr_thresholds()
3985 asoc->pathmaxrxt = val.spt_pathmaxrxt; in sctp_setsockopt_paddr_thresholds()
3986 asoc->pf_retrans = val.spt_pathpfthld; in sctp_setsockopt_paddr_thresholds()
4035 struct sctp_association *asoc; in sctp_setsockopt_pr_supported() local
4043 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_pr_supported()
4044 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_pr_supported()
4059 struct sctp_association *asoc; in sctp_setsockopt_default_prinfo() local
4076 asoc = sctp_id2assoc(sk, info.pr_assoc_id); in sctp_setsockopt_default_prinfo()
4077 if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_default_prinfo()
4083 if (asoc) { in sctp_setsockopt_default_prinfo()
4084 SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); in sctp_setsockopt_default_prinfo()
4085 asoc->default_timetolive = info.pr_value; in sctp_setsockopt_default_prinfo()
4100 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_default_prinfo()
4101 SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy); in sctp_setsockopt_default_prinfo()
4102 asoc->default_timetolive = info.pr_value; in sctp_setsockopt_default_prinfo()
4115 struct sctp_association *asoc; in sctp_setsockopt_reconfig_supported() local
4126 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_reconfig_supported()
4127 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_reconfig_supported()
4145 struct sctp_association *asoc; in sctp_setsockopt_enable_strreset() local
4159 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_enable_strreset()
4160 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_enable_strreset()
4166 if (asoc) { in sctp_setsockopt_enable_strreset()
4167 asoc->strreset_enable = params.assoc_value; in sctp_setsockopt_enable_strreset()
4180 list_for_each_entry(asoc, &ep->asocs, asocs) in sctp_setsockopt_enable_strreset()
4181 asoc->strreset_enable = params.assoc_value; in sctp_setsockopt_enable_strreset()
4192 struct sctp_association *asoc; in sctp_setsockopt_reset_streams() local
4209 asoc = sctp_id2assoc(sk, params->srs_assoc_id); in sctp_setsockopt_reset_streams()
4210 if (!asoc) in sctp_setsockopt_reset_streams()
4213 retval = sctp_send_reset_streams(asoc, params); in sctp_setsockopt_reset_streams()
4224 struct sctp_association *asoc; in sctp_setsockopt_reset_assoc() local
4236 asoc = sctp_id2assoc(sk, associd); in sctp_setsockopt_reset_assoc()
4237 if (!asoc) in sctp_setsockopt_reset_assoc()
4240 retval = sctp_send_reset_assoc(asoc); in sctp_setsockopt_reset_assoc()
4250 struct sctp_association *asoc; in sctp_setsockopt_add_streams() local
4262 asoc = sctp_id2assoc(sk, params.sas_assoc_id); in sctp_setsockopt_add_streams()
4263 if (!asoc) in sctp_setsockopt_add_streams()
4266 retval = sctp_send_add_streams(asoc, &params); in sctp_setsockopt_add_streams()
4277 struct sctp_association *asoc; in sctp_setsockopt_scheduler() local
4291 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_scheduler()
4292 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_scheduler()
4296 if (asoc) in sctp_setsockopt_scheduler()
4297 return sctp_sched_set_sched(asoc, params.assoc_value); in sctp_setsockopt_scheduler()
4308 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_scheduler()
4309 int ret = sctp_sched_set_sched(asoc, in sctp_setsockopt_scheduler()
4325 struct sctp_association *asoc; in sctp_setsockopt_scheduler_value() local
4337 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_scheduler_value()
4338 if (!asoc && params.assoc_id != SCTP_CURRENT_ASSOC && in sctp_setsockopt_scheduler_value()
4342 if (asoc) { in sctp_setsockopt_scheduler_value()
4343 retval = sctp_sched_set_value(asoc, params.stream_id, in sctp_setsockopt_scheduler_value()
4350 list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) { in sctp_setsockopt_scheduler_value()
4351 int ret = sctp_sched_set_value(asoc, params.stream_id, in sctp_setsockopt_scheduler_value()
4367 struct sctp_association *asoc; in sctp_setsockopt_interleaving_supported() local
4379 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_interleaving_supported()
4380 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_interleaving_supported()
4420 struct sctp_association *asoc) in sctp_assoc_ulpevent_type_set() argument
4424 sctp_ulpevent_type_set(&asoc->subscribe, param->se_type, param->se_on); in sctp_assoc_ulpevent_type_set()
4427 if (sctp_outq_is_empty(&asoc->outqueue)) { in sctp_assoc_ulpevent_type_set()
4428 event = sctp_ulpevent_make_sender_dry_event(asoc, in sctp_assoc_ulpevent_type_set()
4433 asoc->stream.si->enqueue_event(&asoc->ulpq, event); in sctp_assoc_ulpevent_type_set()
4444 struct sctp_association *asoc; in sctp_setsockopt_event() local
4459 asoc = sctp_id2assoc(sk, param.se_assoc_id); in sctp_setsockopt_event()
4460 if (!asoc && param.se_assoc_id > SCTP_ALL_ASSOC && in sctp_setsockopt_event()
4464 if (asoc) in sctp_setsockopt_event()
4465 return sctp_assoc_ulpevent_type_set(&param, asoc); in sctp_setsockopt_event()
4477 list_for_each_entry(asoc, &sp->ep->asocs, asocs) { in sctp_setsockopt_event()
4478 int ret = sctp_assoc_ulpevent_type_set(&param, asoc); in sctp_setsockopt_event()
4493 struct sctp_association *asoc; in sctp_setsockopt_asconf_supported() local
4505 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_asconf_supported()
4506 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_asconf_supported()
4529 struct sctp_association *asoc; in sctp_setsockopt_auth_supported() local
4541 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_auth_supported()
4542 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_auth_supported()
4569 struct sctp_association *asoc; in sctp_setsockopt_ecn_supported() local
4580 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_setsockopt_ecn_supported()
4581 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_setsockopt_ecn_supported()
4877 struct sctp_association *asoc; in sctp_accept() local
4905 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); in sctp_accept()
4907 newsk = sp->pf->create_accept_sk(sk, asoc, kern); in sctp_accept()
4916 error = sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); in sctp_accept()
5186 struct sctp_association *asoc; in sctp_shutdown() local
5189 asoc = list_entry(ep->asocs.next, in sctp_shutdown()
5191 sctp_primitive_SHUTDOWN(net, asoc, NULL); in sctp_shutdown()
5195 int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc, in sctp_get_sctp_info() argument
5203 if (!asoc) { in sctp_get_sctp_info()
5218 info->sctpi_tag = asoc->c.my_vtag; in sctp_get_sctp_info()
5219 info->sctpi_state = asoc->state; in sctp_get_sctp_info()
5220 info->sctpi_rwnd = asoc->a_rwnd; in sctp_get_sctp_info()
5221 info->sctpi_unackdata = asoc->unack_data; in sctp_get_sctp_info()
5222 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_get_sctp_info()
5223 info->sctpi_instrms = asoc->stream.incnt; in sctp_get_sctp_info()
5224 info->sctpi_outstrms = asoc->stream.outcnt; in sctp_get_sctp_info()
5225 list_for_each(pos, &asoc->base.inqueue.in_chunk_list) in sctp_get_sctp_info()
5227 list_for_each(pos, &asoc->outqueue.out_chunk_list) in sctp_get_sctp_info()
5229 info->sctpi_overall_error = asoc->overall_error_count; in sctp_get_sctp_info()
5230 info->sctpi_max_burst = asoc->max_burst; in sctp_get_sctp_info()
5231 info->sctpi_maxseg = asoc->frag_point; in sctp_get_sctp_info()
5232 info->sctpi_peer_rwnd = asoc->peer.rwnd; in sctp_get_sctp_info()
5233 info->sctpi_peer_tag = asoc->c.peer_vtag; in sctp_get_sctp_info()
5235 mask = asoc->peer.ecn_capable << 1; in sctp_get_sctp_info()
5236 mask = (mask | asoc->peer.ipv4_address) << 1; in sctp_get_sctp_info()
5237 mask = (mask | asoc->peer.ipv6_address) << 1; in sctp_get_sctp_info()
5238 mask = (mask | asoc->peer.hostname_address) << 1; in sctp_get_sctp_info()
5239 mask = (mask | asoc->peer.asconf_capable) << 1; in sctp_get_sctp_info()
5240 mask = (mask | asoc->peer.prsctp_capable) << 1; in sctp_get_sctp_info()
5241 mask = (mask | asoc->peer.auth_capable); in sctp_get_sctp_info()
5243 mask = asoc->peer.sack_needed << 1; in sctp_get_sctp_info()
5244 mask = (mask | asoc->peer.sack_generation) << 1; in sctp_get_sctp_info()
5245 mask = (mask | asoc->peer.zero_window_announced); in sctp_get_sctp_info()
5248 info->sctpi_isacks = asoc->stats.isacks; in sctp_get_sctp_info()
5249 info->sctpi_osacks = asoc->stats.osacks; in sctp_get_sctp_info()
5250 info->sctpi_opackets = asoc->stats.opackets; in sctp_get_sctp_info()
5251 info->sctpi_ipackets = asoc->stats.ipackets; in sctp_get_sctp_info()
5252 info->sctpi_rtxchunks = asoc->stats.rtxchunks; in sctp_get_sctp_info()
5253 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns; in sctp_get_sctp_info()
5254 info->sctpi_idupchunks = asoc->stats.idupchunks; in sctp_get_sctp_info()
5255 info->sctpi_gapcnt = asoc->stats.gapcnt; in sctp_get_sctp_info()
5256 info->sctpi_ouodchunks = asoc->stats.ouodchunks; in sctp_get_sctp_info()
5257 info->sctpi_iuodchunks = asoc->stats.iuodchunks; in sctp_get_sctp_info()
5258 info->sctpi_oodchunks = asoc->stats.oodchunks; in sctp_get_sctp_info()
5259 info->sctpi_iodchunks = asoc->stats.iodchunks; in sctp_get_sctp_info()
5260 info->sctpi_octrlchunks = asoc->stats.octrlchunks; in sctp_get_sctp_info()
5261 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks; in sctp_get_sctp_info()
5263 prim = asoc->peer.primary_path; in sctp_get_sctp_info()
5311 if (net_eq(sock_net(t->asoc->base.sk), net) && in sctp_transport_get_next()
5312 t->asoc->peer.primary_path == t) in sctp_transport_get_next()
5428 struct sctp_association *asoc = NULL; in sctp_getsockopt_sctp_status() local
5445 asoc = sctp_id2assoc(sk, associd); in sctp_getsockopt_sctp_status()
5446 if (!asoc) { in sctp_getsockopt_sctp_status()
5451 transport = asoc->peer.primary_path; in sctp_getsockopt_sctp_status()
5453 status.sstat_assoc_id = sctp_assoc2id(asoc); in sctp_getsockopt_sctp_status()
5454 status.sstat_state = sctp_assoc_to_state(asoc); in sctp_getsockopt_sctp_status()
5455 status.sstat_rwnd = asoc->peer.rwnd; in sctp_getsockopt_sctp_status()
5456 status.sstat_unackdata = asoc->unack_data; in sctp_getsockopt_sctp_status()
5458 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); in sctp_getsockopt_sctp_status()
5459 status.sstat_instrms = asoc->stream.incnt; in sctp_getsockopt_sctp_status()
5460 status.sstat_outstrms = asoc->stream.outcnt; in sctp_getsockopt_sctp_status()
5461 status.sstat_fragmentation_point = asoc->frag_point; in sctp_getsockopt_sctp_status()
5462 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_sctp_status()
5527 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); in sctp_getsockopt_peer_addr_info()
5633 struct sctp_association *asoc = sctp_id2assoc(sk, id); in sctp_do_peeloff() local
5642 if (!asoc) in sctp_do_peeloff()
5656 sctp_copy_sock(sock->sk, sk, asoc); in sctp_do_peeloff()
5662 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk); in sctp_do_peeloff()
5668 err = sctp_sock_migrate(sk, sock->sk, asoc, in sctp_do_peeloff()
5922 struct sctp_association *asoc = NULL; in sctp_getsockopt_peer_addr_params() local
5953 asoc = sctp_id2assoc(sk, params.spp_assoc_id); in sctp_getsockopt_peer_addr_params()
5954 if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_peer_addr_params()
5978 } else if (asoc) { in sctp_getsockopt_peer_addr_params()
5980 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval); in sctp_getsockopt_peer_addr_params()
5981 params.spp_pathmtu = asoc->pathmtu; in sctp_getsockopt_peer_addr_params()
5982 params.spp_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_peer_addr_params()
5983 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_peer_addr_params()
5986 params.spp_flags = asoc->param_flags; in sctp_getsockopt_peer_addr_params()
5987 if (asoc->flowlabel & SCTP_FLOWLABEL_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5988 params.spp_ipv6_flowlabel = asoc->flowlabel & in sctp_getsockopt_peer_addr_params()
5992 if (asoc->dscp & SCTP_DSCP_SET_MASK) { in sctp_getsockopt_peer_addr_params()
5993 params.spp_dscp = asoc->dscp & SCTP_DSCP_VAL_MASK; in sctp_getsockopt_peer_addr_params()
6065 struct sctp_association *asoc = NULL; in sctp_getsockopt_delayed_ack() local
6088 asoc = sctp_id2assoc(sk, params.sack_assoc_id); in sctp_getsockopt_delayed_ack()
6089 if (!asoc && params.sack_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_delayed_ack()
6093 if (asoc) { in sctp_getsockopt_delayed_ack()
6095 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) { in sctp_getsockopt_delayed_ack()
6096 params.sack_delay = jiffies_to_msecs(asoc->sackdelay); in sctp_getsockopt_delayed_ack()
6097 params.sack_freq = asoc->sackfreq; in sctp_getsockopt_delayed_ack()
6150 struct sctp_association *asoc; in sctp_getsockopt_peer_addrs() local
6168 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_peer_addrs()
6169 if (!asoc) in sctp_getsockopt_peer_addrs()
6175 list_for_each_entry(from, &asoc->peer.transport_addr_list, in sctp_getsockopt_peer_addrs()
6247 struct sctp_association *asoc; in sctp_getsockopt_local_addrs() local
6276 asoc = sctp_id2assoc(sk, getaddrs.assoc_id); in sctp_getsockopt_local_addrs()
6277 if (!asoc) in sctp_getsockopt_local_addrs()
6279 bp = &asoc->base.bind_addr; in sctp_getsockopt_local_addrs()
6355 struct sctp_association *asoc; in sctp_getsockopt_primary_addr() local
6366 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id); in sctp_getsockopt_primary_addr()
6367 if (!asoc) in sctp_getsockopt_primary_addr()
6370 if (!asoc->peer.primary_path) in sctp_getsockopt_primary_addr()
6373 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, in sctp_getsockopt_primary_addr()
6374 asoc->peer.primary_path->af_specific->sockaddr_len); in sctp_getsockopt_primary_addr()
6437 struct sctp_association *asoc; in sctp_getsockopt_default_send_param() local
6448 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); in sctp_getsockopt_default_send_param()
6449 if (!asoc && info.sinfo_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_default_send_param()
6453 if (asoc) { in sctp_getsockopt_default_send_param()
6454 info.sinfo_stream = asoc->default_stream; in sctp_getsockopt_default_send_param()
6455 info.sinfo_flags = asoc->default_flags; in sctp_getsockopt_default_send_param()
6456 info.sinfo_ppid = asoc->default_ppid; in sctp_getsockopt_default_send_param()
6457 info.sinfo_context = asoc->default_context; in sctp_getsockopt_default_send_param()
6458 info.sinfo_timetolive = asoc->default_timetolive; in sctp_getsockopt_default_send_param()
6483 struct sctp_association *asoc; in sctp_getsockopt_default_sndinfo() local
6494 asoc = sctp_id2assoc(sk, info.snd_assoc_id); in sctp_getsockopt_default_sndinfo()
6495 if (!asoc && info.snd_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_default_sndinfo()
6499 if (asoc) { in sctp_getsockopt_default_sndinfo()
6500 info.snd_sid = asoc->default_stream; in sctp_getsockopt_default_sndinfo()
6501 info.snd_flags = asoc->default_flags; in sctp_getsockopt_default_sndinfo()
6502 info.snd_ppid = asoc->default_ppid; in sctp_getsockopt_default_sndinfo()
6503 info.snd_context = asoc->default_context; in sctp_getsockopt_default_sndinfo()
6562 struct sctp_association *asoc; in sctp_getsockopt_rtoinfo() local
6572 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); in sctp_getsockopt_rtoinfo()
6574 if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_rtoinfo()
6579 if (asoc) { in sctp_getsockopt_rtoinfo()
6580 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); in sctp_getsockopt_rtoinfo()
6581 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); in sctp_getsockopt_rtoinfo()
6582 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); in sctp_getsockopt_rtoinfo()
6618 struct sctp_association *asoc; in sctp_getsockopt_associnfo() local
6630 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); in sctp_getsockopt_associnfo()
6632 if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_associnfo()
6637 if (asoc) { in sctp_getsockopt_associnfo()
6638 assocparams.sasoc_asocmaxrxt = asoc->max_retrans; in sctp_getsockopt_associnfo()
6639 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd; in sctp_getsockopt_associnfo()
6640 assocparams.sasoc_local_rwnd = asoc->a_rwnd; in sctp_getsockopt_associnfo()
6641 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life); in sctp_getsockopt_associnfo()
6643 list_for_each(pos, &asoc->peer.transport_addr_list) { in sctp_getsockopt_associnfo()
6708 struct sctp_association *asoc; in sctp_getsockopt_context() local
6718 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_context()
6719 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_context()
6723 params.assoc_value = asoc ? asoc->default_rcv_context in sctp_getsockopt_context()
6765 struct sctp_association *asoc; in sctp_getsockopt_maxseg() local
6781 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxseg()
6782 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_maxseg()
6786 if (asoc) in sctp_getsockopt_maxseg()
6787 params.assoc_value = asoc->frag_point; in sctp_getsockopt_maxseg()
6860 struct sctp_association *asoc; in sctp_getsockopt_maxburst() local
6876 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_maxburst()
6877 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_maxburst()
6881 params.assoc_value = asoc ? asoc->max_burst : sctp_sk(sk)->max_burst; in sctp_getsockopt_maxburst()
6936 struct sctp_association *asoc; in sctp_getsockopt_active_key() local
6945 asoc = sctp_id2assoc(sk, val.scact_assoc_id); in sctp_getsockopt_active_key()
6946 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) in sctp_getsockopt_active_key()
6949 if (asoc) { in sctp_getsockopt_active_key()
6950 if (!asoc->peer.auth_capable) in sctp_getsockopt_active_key()
6952 val.scact_keynumber = asoc->active_key_id; in sctp_getsockopt_active_key()
6972 struct sctp_association *asoc; in sctp_getsockopt_peer_auth_chunks() local
6984 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_peer_auth_chunks()
6985 if (!asoc) in sctp_getsockopt_peer_auth_chunks()
6988 if (!asoc->peer.auth_capable) in sctp_getsockopt_peer_auth_chunks()
6991 ch = asoc->peer.peer_chunks; in sctp_getsockopt_peer_auth_chunks()
7017 struct sctp_association *asoc; in sctp_getsockopt_local_auth_chunks() local
7029 asoc = sctp_id2assoc(sk, val.gauth_assoc_id); in sctp_getsockopt_local_auth_chunks()
7030 if (!asoc && val.gauth_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_local_auth_chunks()
7034 if (asoc) { in sctp_getsockopt_local_auth_chunks()
7035 if (!asoc->peer.auth_capable) in sctp_getsockopt_local_auth_chunks()
7037 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks; in sctp_getsockopt_local_auth_chunks()
7071 struct sctp_association *asoc; in sctp_getsockopt_assoc_number() local
7082 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_number()
7127 struct sctp_association *asoc; in sctp_getsockopt_assoc_ids() local
7137 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
7152 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { in sctp_getsockopt_assoc_ids()
7153 ids->gaids_assoc_id[num++] = asoc->assoc_id; in sctp_getsockopt_assoc_ids()
7179 struct sctp_association *asoc; in sctp_getsockopt_paddr_thresholds() local
7199 asoc = sctp_id2assoc(sk, val.spt_assoc_id); in sctp_getsockopt_paddr_thresholds()
7200 if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_paddr_thresholds()
7204 if (asoc) { in sctp_getsockopt_paddr_thresholds()
7205 val.spt_pathpfthld = asoc->pf_retrans; in sctp_getsockopt_paddr_thresholds()
7206 val.spt_pathmaxrxt = asoc->pathmaxrxt; in sctp_getsockopt_paddr_thresholds()
7232 struct sctp_association *asoc = NULL; in sctp_getsockopt_assoc_stats() local
7244 asoc = sctp_id2assoc(sk, sas.sas_assoc_id); in sctp_getsockopt_assoc_stats()
7245 if (!asoc) in sctp_getsockopt_assoc_stats()
7248 sas.sas_rtxchunks = asoc->stats.rtxchunks; in sctp_getsockopt_assoc_stats()
7249 sas.sas_gapcnt = asoc->stats.gapcnt; in sctp_getsockopt_assoc_stats()
7250 sas.sas_outofseqtsns = asoc->stats.outofseqtsns; in sctp_getsockopt_assoc_stats()
7251 sas.sas_osacks = asoc->stats.osacks; in sctp_getsockopt_assoc_stats()
7252 sas.sas_isacks = asoc->stats.isacks; in sctp_getsockopt_assoc_stats()
7253 sas.sas_octrlchunks = asoc->stats.octrlchunks; in sctp_getsockopt_assoc_stats()
7254 sas.sas_ictrlchunks = asoc->stats.ictrlchunks; in sctp_getsockopt_assoc_stats()
7255 sas.sas_oodchunks = asoc->stats.oodchunks; in sctp_getsockopt_assoc_stats()
7256 sas.sas_iodchunks = asoc->stats.iodchunks; in sctp_getsockopt_assoc_stats()
7257 sas.sas_ouodchunks = asoc->stats.ouodchunks; in sctp_getsockopt_assoc_stats()
7258 sas.sas_iuodchunks = asoc->stats.iuodchunks; in sctp_getsockopt_assoc_stats()
7259 sas.sas_idupchunks = asoc->stats.idupchunks; in sctp_getsockopt_assoc_stats()
7260 sas.sas_opackets = asoc->stats.opackets; in sctp_getsockopt_assoc_stats()
7261 sas.sas_ipackets = asoc->stats.ipackets; in sctp_getsockopt_assoc_stats()
7267 sas.sas_maxrto = asoc->stats.max_obs_rto; in sctp_getsockopt_assoc_stats()
7268 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr, in sctp_getsockopt_assoc_stats()
7272 asoc->stats.max_obs_rto = asoc->rto_min; in sctp_getsockopt_assoc_stats()
7330 struct sctp_association *asoc; in sctp_getsockopt_pr_supported() local
7342 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_pr_supported()
7343 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_pr_supported()
7349 params.assoc_value = asoc ? asoc->peer.prsctp_capable in sctp_getsockopt_pr_supported()
7369 struct sctp_association *asoc; in sctp_getsockopt_default_prinfo() local
7381 asoc = sctp_id2assoc(sk, info.pr_assoc_id); in sctp_getsockopt_default_prinfo()
7382 if (!asoc && info.pr_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_default_prinfo()
7388 if (asoc) { in sctp_getsockopt_default_prinfo()
7389 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags); in sctp_getsockopt_default_prinfo()
7390 info.pr_value = asoc->default_timetolive; in sctp_getsockopt_default_prinfo()
7415 struct sctp_association *asoc; in sctp_getsockopt_pr_assocstatus() local
7433 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id); in sctp_getsockopt_pr_assocstatus()
7434 if (!asoc) in sctp_getsockopt_pr_assocstatus()
7442 asoc->abandoned_unsent[policy]; in sctp_getsockopt_pr_assocstatus()
7444 asoc->abandoned_sent[policy]; in sctp_getsockopt_pr_assocstatus()
7448 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7450 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)]; in sctp_getsockopt_pr_assocstatus()
7474 struct sctp_association *asoc; in sctp_getsockopt_pr_streamstatus() local
7493 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id); in sctp_getsockopt_pr_streamstatus()
7494 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt) in sctp_getsockopt_pr_streamstatus()
7497 streamoute = SCTP_SO(&asoc->stream, params.sprstat_sid)->ext; in sctp_getsockopt_pr_streamstatus()
7538 struct sctp_association *asoc; in sctp_getsockopt_reconfig_supported() local
7550 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_reconfig_supported()
7551 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_reconfig_supported()
7557 params.assoc_value = asoc ? asoc->peer.reconf_capable in sctp_getsockopt_reconfig_supported()
7577 struct sctp_association *asoc; in sctp_getsockopt_enable_strreset() local
7589 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_enable_strreset()
7590 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_enable_strreset()
7596 params.assoc_value = asoc ? asoc->strreset_enable in sctp_getsockopt_enable_strreset()
7616 struct sctp_association *asoc; in sctp_getsockopt_scheduler() local
7628 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_scheduler()
7629 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_scheduler()
7635 params.assoc_value = asoc ? sctp_sched_get_sched(asoc) in sctp_getsockopt_scheduler()
7655 struct sctp_association *asoc; in sctp_getsockopt_scheduler_value() local
7667 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_scheduler_value()
7668 if (!asoc) { in sctp_getsockopt_scheduler_value()
7673 retval = sctp_sched_get_value(asoc, params.stream_id, in sctp_getsockopt_scheduler_value()
7697 struct sctp_association *asoc; in sctp_getsockopt_interleaving_supported() local
7709 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_interleaving_supported()
7710 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_interleaving_supported()
7716 params.assoc_value = asoc ? asoc->peer.intl_capable in sctp_getsockopt_interleaving_supported()
7754 struct sctp_association *asoc; in sctp_getsockopt_event() local
7769 asoc = sctp_id2assoc(sk, param.se_assoc_id); in sctp_getsockopt_event()
7770 if (!asoc && param.se_assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_event()
7774 subscribe = asoc ? asoc->subscribe : sctp_sk(sk)->subscribe; in sctp_getsockopt_event()
7791 struct sctp_association *asoc; in sctp_getsockopt_asconf_supported() local
7803 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_asconf_supported()
7804 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_asconf_supported()
7810 params.assoc_value = asoc ? asoc->peer.asconf_capable in sctp_getsockopt_asconf_supported()
7830 struct sctp_association *asoc; in sctp_getsockopt_auth_supported() local
7842 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_auth_supported()
7843 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_auth_supported()
7849 params.assoc_value = asoc ? asoc->peer.auth_capable in sctp_getsockopt_auth_supported()
7869 struct sctp_association *asoc; in sctp_getsockopt_ecn_supported() local
7881 asoc = sctp_id2assoc(sk, params.assoc_id); in sctp_getsockopt_ecn_supported()
7882 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && in sctp_getsockopt_ecn_supported()
7888 params.assoc_value = asoc ? asoc->peer.ecn_capable in sctp_getsockopt_ecn_supported()
8892 static void __sctp_write_space(struct sctp_association *asoc) in __sctp_write_space() argument
8894 struct sock *sk = asoc->base.sk; in __sctp_write_space()
8896 if (sctp_wspace(asoc) <= 0) in __sctp_write_space()
8899 if (waitqueue_active(&asoc->wait)) in __sctp_write_space()
8900 wake_up_interruptible(&asoc->wait); in __sctp_write_space()
8923 struct sctp_association *asoc) in sctp_wake_up_waiters() argument
8925 struct sctp_association *tmp = asoc; in sctp_wake_up_waiters()
8930 if (asoc->ep->sndbuf_policy) in sctp_wake_up_waiters()
8931 return __sctp_write_space(asoc); in sctp_wake_up_waiters()
8936 if (asoc->base.dead) in sctp_wake_up_waiters()
8957 if (tmp == asoc) in sctp_wake_up_waiters()
8969 struct sctp_association *asoc = chunk->asoc; in sctp_wfree() local
8970 struct sock *sk = asoc->base.sk; in sctp_wfree()
8974 asoc->sndbuf_used -= skb->truesize + sizeof(struct sctp_chunk); in sctp_wfree()
8989 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id, in sctp_wfree()
8993 asoc->stream.si->enqueue_event(&asoc->ulpq, ev); in sctp_wfree()
8999 sctp_wake_up_waiters(sk, asoc); in sctp_wfree()
9001 sctp_association_put(asoc); in sctp_wfree()
9024 static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, in sctp_wait_for_sndbuf() argument
9027 struct sock *sk = asoc->base.sk; in sctp_wait_for_sndbuf()
9032 pr_debug("%s: asoc:%p, timeo:%ld, msg_len:%zu\n", __func__, asoc, in sctp_wait_for_sndbuf()
9036 sctp_association_hold(asoc); in sctp_wait_for_sndbuf()
9040 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_sndbuf()
9042 if (asoc->base.dead) in sctp_wait_for_sndbuf()
9046 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING) in sctp_wait_for_sndbuf()
9052 if ((int)msg_len <= sctp_wspace(asoc) && in sctp_wait_for_sndbuf()
9062 if (sk != asoc->base.sk) in sctp_wait_for_sndbuf()
9069 finish_wait(&asoc->wait, &wait); in sctp_wait_for_sndbuf()
9072 sctp_association_put(asoc); in sctp_wait_for_sndbuf()
9109 struct sctp_association *asoc; in sctp_write_space() local
9112 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { in sctp_write_space()
9113 __sctp_write_space(asoc); in sctp_write_space()
9136 static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p) in sctp_wait_for_connect() argument
9138 struct sock *sk = asoc->base.sk; in sctp_wait_for_connect()
9143 pr_debug("%s: asoc:%p, timeo:%ld\n", __func__, asoc, *timeo_p); in sctp_wait_for_connect()
9146 sctp_association_hold(asoc); in sctp_wait_for_connect()
9149 prepare_to_wait_exclusive(&asoc->wait, &wait, in sctp_wait_for_connect()
9155 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || in sctp_wait_for_connect()
9156 asoc->base.dead) in sctp_wait_for_connect()
9161 if (sctp_state(asoc, ESTABLISHED)) in sctp_wait_for_connect()
9175 finish_wait(&asoc->wait, &wait); in sctp_wait_for_connect()
9178 sctp_association_put(asoc); in sctp_wait_for_connect()
9183 if (asoc->init_err_counter + 1 > asoc->max_init_attempts) in sctp_wait_for_connect()
9271 struct sctp_association *asoc) in sctp_copy_sock() argument
9307 newinet->inet_dport = htons(asoc->peer.port); in sctp_copy_sock()
9402 if (event->asoc == assoc) { in sctp_sock_migrate()
9431 if (event->asoc == assoc) { in sctp_sock_migrate()