Lines Matching defs:stcb
450 sctp_is_addr_restricted(struct sctp_tcb *stcb, struct sockaddr *addr)
456 if (stcb == NULL) {
461 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list, sctp_nxt_addr) {
469 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list, sctp_nxt_addr) {
608 struct sctp_tcb *stcb,
655 (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin))) {
669 (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin))) {
682 starting_point = stcb->asoc.last_used_address;
684 if (stcb->asoc.last_used_address == NULL) {
686 stcb->asoc.last_used_address = LIST_FIRST(&inp->sctp_addr_list);
689 for (laddr = stcb->asoc.last_used_address; laddr;
699 (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin))) {
707 stcb->asoc.last_used_address = NULL;
711 stcb->asoc.last_used_address = starting_point;
714 if (stcb->asoc.last_used_address == NULL) {
716 stcb->asoc.last_used_address = LIST_FIRST(&inp->sctp_addr_list);
719 for (laddr = stcb->asoc.last_used_address; laddr;
729 (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin))) {
736 stcb->asoc.last_used_address = NULL;
752 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
776 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
800 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
813 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
830 sctp_select_v4_nth_prefered_addr_from_ifn_boundall (struct ifnet *ifn, struct sctp_tcb *stcb, int non_asoc_addr_ok,
841 if (stcb) {
842 if ((non_asoc_addr_ok == 0) && sctp_is_addr_restricted(stcb, (struct sockaddr *)sin)) {
858 sctp_count_v4_num_prefered_boundall (struct ifnet *ifn, struct sctp_tcb *stcb, int non_asoc_addr_ok,
869 if (stcb) {
870 if ((non_asoc_addr_ok == 0) && sctp_is_addr_restricted(stcb, (struct sockaddr *)sin)) {
885 struct sctp_tcb *stcb,
919 num_prefered = sctp_count_v4_num_prefered_boundall (ifn, stcb, non_asoc_addr_ok, loopscope, ipv4_scope, &sin_loop, &sin_local);
945 sin = sctp_select_v4_nth_prefered_addr_from_ifn_boundall (ifn, stcb, non_asoc_addr_ok, loopscope,
962 if (stcb) {
963 if ((non_asoc_addr_ok == 0) && sctp_is_addr_restricted(stcb, (struct sockaddr *)sin)) {
988 num_prefered = sctp_count_v4_num_prefered_boundall (ifn, stcb, non_asoc_addr_ok,
1007 sin = sctp_select_v4_nth_prefered_addr_from_ifn_boundall (ifn, stcb, non_asoc_addr_ok, loopscope,
1042 if (stcb) {
1043 if ((non_asoc_addr_ok == 0) && sctp_is_addr_restricted(stcb, (struct sockaddr *)sin)) {
1077 struct sctp_tcb *stcb, struct route *ro, struct sctp_nets *net,
1150 if (stcb) {
1151 ipv4_scope = stcb->asoc.ipv4_local_scope;
1152 loopscope = stcb->asoc.loopback_scope;
1178 ans = sctp_choose_v4_boundall(inp, stcb, net, rt,
1185 * a) stcb is NULL, which means we operate only from
1188 * b) stcb is NOT-NULL, which means we have an assoc structure and
1194 * c) stcb is NOT-NULL, which means we have an assoc structure and
1201 if (stcb) {
1202 ans = sctp_choose_v4_boundspecific_stcb(inp, stcb, net,
1272 struct sctp_tcb *stcb,
1317 (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin6))) {
1325 starting_point = stcb->asoc.last_used_address;
1328 if (stcb->asoc.last_used_address == NULL) {
1330 stcb->asoc.last_used_address = LIST_FIRST(&inp->sctp_addr_list);
1333 for (laddr = stcb->asoc.last_used_address; laddr;
1342 if ((non_asoc_addr_ok == 0) && (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin6))) {
1363 stcb->asoc.last_used_address = NULL;
1367 stcb->asoc.last_used_address = starting_point;
1370 if (stcb->asoc.last_used_address == NULL) {
1372 stcb->asoc.last_used_address = LIST_FIRST(&inp->sctp_addr_list);
1375 for (laddr = stcb->asoc.last_used_address; laddr;
1384 if ((non_asoc_addr_ok == 0) && (sctp_is_addr_restricted(stcb, (struct sockaddr *)sin6))) {
1391 stcb->asoc.last_used_address = NULL;
1401 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
1425 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
1451 LIST_FOREACH(laddr, &stcb->asoc.sctp_local_addr_list,
1553 sctp_select_v6_nth_addr_from_ifn_boundall (struct ifnet *ifn, struct sctp_tcb *stcb, int non_asoc_addr_ok, uint8_t loopscope,
1565 if (stcb) {
1566 if ((non_asoc_addr_ok == 0) && sctp_is_addr_restricted(stcb, (struct sockaddr *)sin6)) {
1601 sctp_count_v6_num_eligible_boundall (struct ifnet *ifn, struct sctp_tcb *stcb,
1613 if (stcb) {
1614 if ((non_asoc_addr_ok == 0) && sctp_is_addr_restricted(stcb, (struct sockaddr *)sin6)) {
1629 struct sctp_tcb *stcb,
1661 num_eligible_addr = sctp_count_v6_num_eligible_boundall (ifn, stcb, non_asoc_addr_ok, loopscope, loc_scope);
1688 sin6 = sctp_select_v6_nth_addr_from_ifn_boundall (ifn, stcb, non_asoc_addr_ok, loopscope,
1697 sin6 = sctp_select_v6_nth_addr_from_ifn_boundall (ifn, stcb, non_asoc_addr_ok, loopscope,
1781 num_eligible_addr = sctp_count_v6_num_eligible_boundall (ifn, stcb, non_asoc_addr_ok, loopscope, loc_scope);
1798 sin6 = sctp_select_v6_nth_addr_from_ifn_boundall (ifn, stcb, non_asoc_addr_ok, loopscope, loc_scope, 0, 1);
1803 sin6 = sctp_select_v6_nth_addr_from_ifn_boundall (ifn, stcb, non_asoc_addr_ok, loopscope, loc_scope, 0, 0);
1835 /* stcb and net may be NULL */
1838 struct sctp_tcb *stcb, struct route *ro, struct sctp_nets *net,
1861 * 4a) We have not stcb, which means we are using the
1863 * case we are similar to the stcb case (4b below)
1865 * 4b) We are bound specific with a stcb, which means we have a
1974 rt_addr = sctp_choose_v6_boundall(inp, stcb, net, rt, loc_scope, loopscope, non_asoc_addr_ok);
1981 if (stcb)
1982 rt_addr = sctp_choose_v6_boundspecific_stcb(inp, stcb, net, rt, loc_scope, loopscope, non_asoc_addr_ok);
2009 sctp_get_ect(struct sctp_tcb *stcb,
2022 if (stcb->asoc.peer_supports_ecn_nonce == 0) {
2030 if (((stcb->asoc.hb_random_idx == 3) &&
2031 (stcb->asoc.hb_ect_randombit > 7)) ||
2032 (stcb->asoc.hb_random_idx > 3)) {
2034 rndval = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep);
2035 memcpy(stcb->asoc.hb_random_values, &rndval,
2036 sizeof(stcb->asoc.hb_random_values));
2037 this_random = stcb->asoc.hb_random_values[0];
2038 stcb->asoc.hb_random_idx = 0;
2039 stcb->asoc.hb_ect_randombit = 0;
2041 if (stcb->asoc.hb_ect_randombit > 7) {
2042 stcb->asoc.hb_ect_randombit = 0;
2043 stcb->asoc.hb_random_idx++;
2045 this_random = stcb->asoc.hb_random_values[stcb->asoc.hb_random_idx];
2047 if ((this_random >> stcb->asoc.hb_ect_randombit) & 0x01) {
2051 stcb->asoc.hb_ect_randombit++;
2054 stcb->asoc.hb_ect_randombit++;
2063 struct sctp_tcb *stcb, /* may be NULL */
2109 (stcb) &&
2110 (stcb->asoc.loopback_scope)) {
2137 if (stcb) {
2138 if ((stcb->asoc.ecn_allowed) && ecn_ok) {
2141 sctp_get_ect(stcb, chk));
2172 stcb,
2183 stcb, ro, net, out_of_asoc_ok);
2208 if ((net->dest_state & SCTP_ADDR_REACHABLE) && stcb)
2210 stcb,
2215 if (stcb) {
2216 if (net == stcb->asoc.primary_destination) {
2219 alt = sctp_find_alternate_net(stcb, net);
2221 if (sctp_set_primary_addr(stcb,
2267 (stcb->asoc.smallest_mtu > rt->rt_rmx.rmx_mtu)) {
2268 sctp_mtu_size_reset(inp, &stcb->asoc,
2331 if (stcb != NULL) {
2332 if ((stcb->asoc.ecn_allowed) && ecn_ok) {
2334 tosBottom = (((in6p_flowinfo(inp) & 0x0c) | sctp_get_ect(stcb, chk)) << 4);
2362 stcb, ro, net, out_of_asoc_ok);
2371 inp, stcb, ro, net, out_of_asoc_ok);
2387 if ((net->dest_state & SCTP_ADDR_REACHABLE) && stcb)
2389 stcb,
2394 if (stcb) {
2395 if (net == stcb->asoc.primary_destination) {
2398 alt = sctp_find_alternate_net(stcb, net);
2400 if (sctp_set_primary_addr(stcb,
2472 (stcb->asoc.smallest_mtu > rt->rt_rmx.rmx_mtu)) {
2474 &stcb->asoc,
2480 (stcb->asoc.smallest_mtu > ifp->if_mtu)) {
2482 &stcb->asoc,
2566 sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb)
2581 net = stcb->asoc.primary_destination;
2583 net = TAILQ_FIRST(&stcb->asoc.nets);
2590 sctp_set_primary_addr(stcb, NULL, net);
2613 if (sctp_timer_start(SCTP_TIMER_TYPE_INIT, inp, stcb, net)) {
2634 initm->sh.dest_port = stcb->rport;
2643 initm->msg.init.initiate_tag = htonl(stcb->asoc.my_vtag);
2648 initm->msg.init.num_outbound_streams = htons(stcb->asoc.pre_open_streams);
2649 initm->msg.init.num_inbound_streams = htons(stcb->asoc.max_inbound_streams);
2650 initm->msg.init.initial_tsn = htonl(stcb->asoc.init_seq_number);
2679 if (stcb->asoc.cookie_preserve_req) {
2685 cookie_preserve->time = htonl(stcb->asoc.cookie_preserve_req);
2689 stcb->asoc.cookie_preserve_req = 0;
2745 if ((stcb->asoc.loopback_scope == 0) &&
2755 stcb->asoc.ipv4_addr_legal,
2756 stcb->asoc.ipv6_addr_legal,
2757 stcb->asoc.loopback_scope,
2758 stcb->asoc.ipv4_local_scope,
2759 stcb->asoc.local_scope,
2760 stcb->asoc.site_scope) == 0) {
2771 if ((stcb->asoc.loopback_scope == 0) &&
2781 stcb->asoc.ipv4_addr_legal,
2782 stcb->asoc.ipv6_addr_legal,
2783 stcb->asoc.loopback_scope,
2784 stcb->asoc.ipv4_local_scope,
2785 stcb->asoc.local_scope,
2786 stcb->asoc.site_scope) == 0) {
2806 stcb->asoc.ipv4_addr_legal,
2807 stcb->asoc.ipv6_addr_legal,
2808 stcb->asoc.loopback_scope,
2809 stcb->asoc.ipv4_local_scope,
2810 stcb->asoc.local_scope,
2811 stcb->asoc.site_scope) == 0) {
2831 stcb->asoc.ipv4_addr_legal,
2832 stcb->asoc.ipv6_addr_legal,
2833 stcb->asoc.loopback_scope,
2834 stcb->asoc.ipv4_local_scope,
2835 stcb->asoc.local_scope,
2836 stcb->asoc.site_scope) == 0) {
2877 printf("Calling lowlevel output stcb:%p net:%p\n",
2878 stcb, net);
2881 ret = sctp_lowlevel_chunk_output(inp, stcb, net,
2888 sctp_timer_start(SCTP_TIMER_TYPE_INIT, inp, stcb, net);
3245 sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
3270 if (stcb) {
3271 asoc = &stcb->asoc;
3319 SCTP_TCB_UNLOCK(stcb);
3342 SCTP_TCB_LOCK(stcb);
3343 SCTP_INP_RUNLOCK(stcb->sctp_ep);
3545 stcb, &net->ro, net, 0);
3565 stcb, &net->ro, net, 0);
3908 sctp_prune_prsctp(struct sctp_tcb *stcb,
3950 ret_spc = sctp_release_pr_sctp_chunk(stcb, chk,
3976 ret_spc = sctp_release_pr_sctp_chunk(stcb, chk,
3994 struct sctp_tcb *stcb,
4001 if ((stcb->asoc.peer_supports_prsctp) &&
4048 if (stcb->asoc.primary_destination)
4049 template->whoTo = stcb->asoc.primary_destination;
4064 if (stcb->asoc.peer_supports_prsctp) {
4080 template->asoc = &stcb->asoc;
4085 sctp_get_frag_point(struct sctp_tcb *stcb,
4095 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
4101 if (stcb->sctp_ep->sctp_frag_point > asoc->smallest_mtu)
4104 siz = (stcb->sctp_ep->sctp_frag_point - ovh);
4122 sctp_msg_append(struct sctp_tcb *stcb,
4141 if ((stcb == NULL) || (net == NULL) || (m == NULL) || (srcv == NULL)) {
4146 printf("stcb:%p net:%p m:%p srcv:%p\n",
4147 stcb, net, m, srcv);
4153 so = stcb->sctp_socket;
4154 asoc = &stcb->asoc;
4177 sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, m);
4238 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
4251 sctp_prune_prsctp(stcb, asoc, srcv, dataout);
4269 * been reset and our stcb destroyed. Returning
4273 inp = stcb->sctp_ep;
4282 inp->sctp_tcb_at_block = (void *)stcb;
4330 siz = sctp_get_frag_point(stcb, asoc);
4338 sctp_prepare_chunk(chk, stcb, srcv, strq, net);
4377 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_NO_FRAGMENT) &&
4383 sctp_prepare_chunk(&template, stcb, srcv, strq, net);
4510 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)) {
4540 sctp_send_shutdown(stcb, stcb->asoc.primary_destination);
4542 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb,
4544 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb,
4564 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
4565 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) {
4650 sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, u_int32_t val)
4670 if ((stcb->sctp_socket->so_state & SS_NBIO) == 0) {
4673 stcb->sctp_socket->so_state |= SS_NBIO;
4675 ret = sctp_msg_append(stcb, stcb->asoc.primary_destination, m, &ca->sndrcv, 0);
4678 stcb->sctp_socket->so_state &= ~SS_NBIO;
4853 sctp_toss_old_asconf(struct sctp_tcb *stcb)
4858 asoc = &stcb->asoc;
4883 sctp_clean_up_datalist(struct sctp_tcb *stcb,
4939 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
4988 sctp_move_to_outqueue(struct sctp_tcb *stcb,
5001 asoc = &stcb->asoc;
5016 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
5017 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) {
5018 stcb->sctp_socket->so_snd.sb_mbcnt += MSIZE;
5027 stcb->asoc.total_output_mbuf_queue_size += MSIZE;
5074 sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb,
5124 sctp_fill_outqueue(struct sctp_tcb *stcb,
5133 asoc = &stcb->asoc;
5198 mtu_fromwheel += sctp_move_to_outqueue(stcb, strq);
5228 sctp_move_to_an_alt(struct sctp_tcb *stcb,
5234 a_net = sctp_find_alternate_net(stcb, net);
5258 struct sctp_tcb *stcb,
5360 sctp_fill_outqueue(stcb, net);
5391 if (callout_pending(&stcb->asoc.dack_timer.timer)) {
5394 stcb->sctp_ep,
5395 stcb, NULL);
5396 sctp_send_sack(stcb);
5536 if (callout_pending(&stcb->asoc.dack_timer.timer)) {
5538 inp, stcb, net);
5572 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, net);
5576 sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, inp, stcb, net);
5597 shdr->dest_port = stcb->rport;
5598 shdr->v_tag = htonl(stcb->asoc.peer_vtag);
5601 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net,
5646 sctp_move_to_an_alt(stcb, asoc, net);
5671 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
5768 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
5819 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, net);
5823 sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, inp, stcb, net);
5837 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
5876 shdr->dest_port = stcb->rport;
5877 shdr->v_tag = htonl(stcb->asoc.peer_vtag);
5879 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net,
5924 sctp_move_to_an_alt(stcb, asoc, net);
5954 sctp_clean_up_datalist(stcb, asoc, data_list, bundle_at, net);
5972 sctp_queue_op_err(struct sctp_tcb *stcb, struct mbuf *op_err)
6012 chk->asoc = &stcb->asoc;
6029 struct sctp_tcb *stcb,
6106 chk->asoc = &stcb->asoc;
6116 sctp_send_heartbeat_ack(struct sctp_tcb *stcb,
6176 chk->asoc = &stcb->asoc;
6185 sctp_send_cookie_ack(struct sctp_tcb *stcb) {
6212 chk->asoc = &stcb->asoc;
6233 sctp_send_shutdown_ack(struct sctp_tcb *stcb, struct sctp_nets *net)
6261 chk->asoc = &stcb->asoc;
6278 sctp_send_shutdown(struct sctp_tcb *stcb, struct sctp_nets *net)
6306 chk->asoc = &stcb->asoc;
6315 shutdown_cp->cumulative_tsn_ack = htonl(stcb->asoc.cumulative_tsn);
6321 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
6322 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) {
6323 stcb->sctp_ep->sctp_socket->so_snd.sb_cc = 0;
6324 soisdisconnecting(stcb->sctp_ep->sctp_socket);
6330 sctp_send_asconf(struct sctp_tcb *stcb, struct sctp_nets *net)
6340 m_asconf = sctp_compose_asconf(stcb);
6359 chk->asoc = &stcb->asoc;
6368 sctp_send_asconf_ack(struct sctp_tcb *stcb, uint32_t retrans)
6378 if (stcb->asoc.last_asconf_ack_sent == NULL) {
6387 if (stcb->asoc.last_asconf_ack_sent->m_flags & M_PKTHDR) {
6388 m_ack = m_copypacket(stcb->asoc.last_asconf_ack_sent, M_DONTWAIT);
6391 m_ack = m_copym(stcb->asoc.last_asconf_ack_sent, 0, M_COPYALL, M_DONTWAIT);
6393 m_ack = m_copy(stcb->asoc.last_asconf_ack_sent, 0, M_COPYALL);
6412 if (stcb->asoc.used_alt_asconfack > 2) {
6417 chk->whoTo = sctp_find_alternate_net(stcb, stcb->asoc.last_control_chunk_from);
6418 stcb->asoc.used_alt_asconfack++;
6422 if (stcb->asoc.last_control_chunk_from == NULL)
6423 chk->whoTo = stcb->asoc.primary_destination;
6425 chk->whoTo = stcb->asoc.last_control_chunk_from;
6426 stcb->asoc.used_alt_asconfack = 0;
6430 if (stcb->asoc.last_control_chunk_from == NULL)
6431 chk->whoTo = stcb->asoc.primary_destination;
6433 chk->whoTo = stcb->asoc.last_control_chunk_from;
6434 stcb->asoc.used_alt_asconfack = 0;
6442 chk->asoc = &stcb->asoc;
6452 struct sctp_tcb *stcb,
6537 sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, inp, stcb, chk->whoTo);
6539 sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, chk->whoTo);
6555 shdr->dest_port = stcb->rport;
6556 shdr->v_tag = htonl(stcb->asoc.peer_vtag);
6560 if ((error = sctp_lowlevel_chunk_output(inp, stcb, chk->whoTo,
6602 sctp_auditing(20, inp, stcb, NULL);
6612 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
6729 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
6746 shdr->dest_port = stcb->rport;
6747 shdr->v_tag = htonl(stcb->asoc.peer_vtag);
6751 if ((error = sctp_lowlevel_chunk_output(inp, stcb, net,
6797 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
6815 sctp_timer_stop(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
6816 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net);
6821 sctp_auditing(21, inp, stcb, NULL);
6845 struct sctp_tcb *stcb,
6863 sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, asoc->primary_destination);
6869 struct sctp_tcb *stcb,
6891 asoc = &stcb->asoc;
6905 ret = sctp_chunk_retransmission(inp, stcb, asoc, &num_out, &now, &now_filled);
6918 (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1,
6927 sctp_auditing(8, inp, stcb, NULL);
6929 return (sctp_timer_validation(inp, stcb, asoc, ret));
6942 sctp_auditing(9, inp, stcb, NULL);
6954 sctp_auditing(10, inp, stcb, NULL);
6957 (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, &cwnd_full, from_where,
6967 sctp_auditing(12, inp, stcb, NULL);
6981 sctp_move_to_an_alt(stcb, asoc, net);
7018 error = sctp_med_chunk_output(inp, stcb, asoc, &num_out,
7089 struct sctp_tcb *stcb;
7101 stcb = NULL;
7167 stcb = LIST_FIRST(&inp->sctp_asoc_list);
7168 if (stcb) {
7169 SCTP_TCB_LOCK(stcb);
7173 if (stcb == NULL) {
7183 net = stcb->asoc.primary_destination;
7185 stcb = sctp_findassociation_ep_asocid(inp, srcv.sinfo_assoc_id);
7193 if ((stcb) &&
7197 net = sctp_findnet(stcb, addr);
7200 net = stcb->asoc.primary_destination;
7205 if (stcb == NULL) {
7208 stcb = LIST_FIRST(&inp->sctp_asoc_list);
7209 if (stcb) {
7210 SCTP_TCB_LOCK(stcb);
7213 if (stcb == NULL) {
7227 net = stcb->asoc.primary_destination;
7229 net = sctp_findnet(stcb, addr);
7231 net = stcb->asoc.primary_destination;
7239 stcb = sctp_findassociation_ep_addr(&t_inp, addr, &net, NULL, NULL);
7240 if (stcb == NULL) {
7248 if ((stcb == NULL) &&
7261 } else if ((stcb == NULL) &&
7274 } else if (stcb == NULL) {
7290 stcb = sctp_aloc_assoc(inp, addr, 1, &error, 0);
7291 if (stcb == NULL) {
7311 asoc = &stcb->asoc;
7364 sctp_send_initiate(inp, stcb);
7371 net = stcb->asoc.primary_destination;
7377 asoc = &stcb->asoc;
7393 sctp_msg_append(stcb, net, m, &srcv, flags);
7399 SCTP_TCB_UNLOCK(stcb);
7413 srcv = stcb->asoc.def_send;
7434 net = stcb->asoc.primary_destination;
7436 if ((error = sctp_msg_append(stcb, net, m, &srcv, flags))) {
7437 SCTP_TCB_UNLOCK(stcb);
7447 un_sent = ((stcb->asoc.total_output_queue_size - stcb->asoc.total_flight) +
7448 ((stcb->asoc.chunks_on_out_queue - stcb->asoc.total_flight_count) * sizeof(struct sctp_data_chunk)) +
7452 (stcb->asoc.total_flight > 0) &&
7453 (un_sent < (int)stcb->asoc.smallest_mtu)
7466 if ((queue_only == 0) && stcb->asoc.peers_rwnd) {
7475 sctp_auditing(6, inp, stcb, net);
7478 sctp_chunk_output(inp, stcb, 0);
7481 sctp_auditing(7, inp, stcb, net);
7487 printf("USR Send complete qo:%d prw:%d\n", queue_only, stcb->asoc.peers_rwnd);
7490 SCTP_TCB_UNLOCK(stcb);
7495 send_forward_tsn(struct sctp_tcb *stcb,
7575 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
7651 sctp_send_sack(struct sctp_tcb *stcb)
7670 asoc = &stcb->asoc;
7675 sctp_set_rwnd(stcb, asoc);
7694 stcb->sctp_ep, stcb, NULL);
7696 stcb->sctp_ep, stcb, NULL);
7723 a_chk->whoTo = sctp_find_alternate_net(stcb, asoc->last_data_chunk_from);
7763 stcb->sctp_ep, stcb, NULL);
7765 stcb->sctp_ep, stcb, NULL);
7882 stcb->sctp_ep, stcb, NULL);
7884 stcb->sctp_ep, stcb, NULL);
7957 sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr)
7985 abort_m->sh.src_port = stcb->sctp_ep->sctp_lport;
7986 abort_m->sh.dest_port = stcb->rport;
7987 abort_m->sh.v_tag = htonl(stcb->asoc.peer_vtag);
7991 sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb,
7992 stcb->asoc.primary_destination,
7993 rtcache_getdst(&stcb->asoc.primary_destination->ro),
7998 sctp_send_shutdown_complete(struct sctp_tcb *stcb,
8017 comp_cp->sh.src_port = stcb->sctp_ep->sctp_lport;
8018 comp_cp->sh.dest_port = stcb->rport;
8019 comp_cp->sh.v_tag = htonl(stcb->asoc.peer_vtag);
8024 sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb, net,
8027 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
8028 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) {
8029 stcb->sctp_ep->sctp_flags &= ~SCTP_PCB_FLAGS_CONNECTED;
8030 stcb->sctp_ep->sctp_socket->so_snd.sb_cc = 0;
8031 soisdisconnected(stcb->sctp_ep->sctp_socket);
8152 sctp_select_hb_destination(struct sctp_tcb *stcb, struct timeval *now)
8160 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
8174 if (sctp_destination_is_reachable(stcb, (struct sockaddr *)&net->ro.ro_sa) == 0) {
8249 sctp_send_hb(struct sctp_tcb *stcb, int user_req, struct sctp_nets *u_net)
8259 net = sctp_select_hb_destination(stcb, &now);
8264 if (stcb->asoc.state == 0) {
8268 stcb->sctp_ep,
8269 stcb,
8321 chk->asoc = &stcb->asoc;
8359 net->heartbeat_random1 = hb->heartbeat.hb_info.random_value1 = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep);
8360 net->heartbeat_random2 = hb->heartbeat.hb_info.random_value2 = sctp_select_initial_TSN(&stcb->sctp_ep->sctp_ep);
8383 if (sctp_threshold_management(stcb->sctp_ep, stcb, net,
8384 stcb->asoc.max_send_times)) {
8408 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next);
8409 stcb->asoc.ctrl_queue_cnt++;
8418 sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep,
8419 stcb, net);
8425 sctp_send_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net,
8431 asoc = &stcb->asoc;
8449 chk->asoc = &stcb->asoc;
8472 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next);
8477 sctp_send_packet_dropped(struct sctp_tcb *stcb, struct sctp_nets *net,
8489 asoc = &stcb->asoc;
8524 chk->asoc = &stcb->asoc;
8588 spc = stcb->sctp_socket->so_rcv.sb_hiwat;
8597 stcb->sctp_socket->so_rcv.sb_cc);
8601 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next);
8606 sctp_send_cwr(struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t high_tsn)
8612 asoc = &stcb->asoc;
8632 chk->asoc = &stcb->asoc;
8655 TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next);
8659 sctp_reset_the_streams(struct sctp_tcb *stcb,
8665 for (i=0; i<stcb->asoc.streamoutcnt; i++) {
8666 stcb->asoc.strmout[i].next_sequence_sent = 0;
8670 if (list[i] >= stcb->asoc.streamoutcnt) {
8674 stcb->asoc.strmout[(list[i])].next_sequence_sent = 0;
8677 sctp_ulp_notify(SCTP_NOTIFY_STR_RESET_SEND, stcb, number_entries, (void *)list);
8681 sctp_send_str_reset_ack(struct sctp_tcb *stcb,
8692 asoc = &stcb->asoc;
8705 chk->asoc = &stcb->asoc;
8798 sctp_reset_the_streams(stcb, req , number_entries, list);
8802 sctp_send_str_reset_req(stcb, number_entries, list, two_way, not_peer);
8818 sctp_send_str_reset_req(struct sctp_tcb *stcb,
8839 asoc = &stcb->asoc;
8859 chk->asoc = &stcb->asoc;
8942 sctp_timer_start(SCTP_TIMER_TYPE_STRRESET, stcb->sctp_ep, stcb, chk->whoTo);
9272 struct sctp_tcb *stcb,
9283 * that may effect the stcb/asoc. The sb is
9300 so = stcb->sctp_socket;
9329 sctp_prune_prsctp(stcb, asoc, srcv, sndlen);
9335 * been reset and our stcb destroyed. Returning
9354 inp->sctp_tcb_at_block = (void *)stcb;
9361 SCTP_TCB_UNLOCK(stcb);
9371 SCTP_TCB_LOCK(stcb);
9415 sctp_prune_prsctp(stcb, asoc, srcv, sndlen);
9474 sctp_abort_an_association(stcb->sctp_ep, stcb,
9509 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
9523 frag_size = sctp_get_frag_point(stcb, asoc);
9547 sctp_prepare_chunk(chk, stcb, srcv, strq, net);
9606 sctp_prepare_chunk(&template, stcb, srcv, strq, net);
9724 if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
9725 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) {
9730 (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)
9759 sctp_send_shutdown(stcb, stcb->asoc.primary_destination);
9761 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb,
9763 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb,
9806 struct sctp_tcb *stcb=NULL;
9816 stcb = NULL;
9849 stcb = LIST_FIRST(&inp->sctp_asoc_list);
9850 if (stcb == NULL) {
9856 SCTP_TCB_LOCK(stcb);
9858 net = stcb->asoc.primary_destination;
9886 if (stcb == NULL) {
9889 stcb = sctp_findassociation_ep_asocid(inp, srcv.sinfo_assoc_id);
9894 if ((stcb) &&
9897 net = sctp_findnet(stcb, addr);
9900 if (stcb == NULL) {
9909 stcb = sctp_findassociation_ep_addr(&t_inp, addr, &net, NULL, NULL);
9910 if (stcb == NULL) {
9918 if ((stcb == NULL) &&
9923 } else if ((stcb == NULL) && (addr == NULL)) {
9927 } else if (stcb == NULL) {
9936 /* get an asoc/stcb struct */
9937 stcb = sctp_aloc_assoc(inp, addr, 1, &error, 0);
9938 if (stcb == NULL) {
9951 asoc = &stcb->asoc;
10009 sctp_send_initiate(inp, stcb);
10016 net = stcb->asoc.primary_destination;
10017 asoc = &stcb->asoc;
10019 asoc = &stcb->asoc;
10031 srcv = stcb->asoc.def_send;
10056 if (stcb) {
10061 net = stcb->asoc.primary_destination;
10078 error = sctp_copy_it_in(inp, stcb, asoc, net, &srcv, uio, flags);
10088 error = sctp_msg_append(stcb, net, top, &srcv, flags);
10106 un_sent = ((stcb->asoc.total_output_queue_size - stcb->asoc.total_flight) +
10107 ((stcb->asoc.chunks_on_out_queue - stcb->asoc.total_flight_count) * sizeof(struct sctp_data_chunk)) +
10111 (stcb->asoc.total_flight > 0) &&
10112 (un_sent < (int)stcb->asoc.smallest_mtu)) {
10140 if ((queue_only == 0) && (stcb->asoc.peers_rwnd && un_sent)) {
10149 sctp_chunk_output(inp, stcb, 0);
10152 (stcb->asoc.peers_rwnd == 0) &&
10153 (stcb->asoc.total_flight == 0)) {
10157 sctp_chunk_output(inp, stcb, 0);
10161 } else if (!TAILQ_EMPTY(&stcb->asoc.control_send_queue)) {
10165 sctp_med_chunk_output(inp, stcb, &stcb->asoc, &num_out,
10172 queue_only, stcb->asoc.peers_rwnd, un_sent,
10173 stcb->asoc.total_flight, stcb->asoc.chunks_on_out_queue,
10174 stcb->asoc.total_output_queue_size);
10182 if (stcb) {
10183 SCTP_TCB_UNLOCK(stcb);