Lines Matching refs:stcb
711 sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to) in sctp_does_stcb_own_this_addr() argument
724 loopback_scope = stcb->asoc.scope.loopback_scope; in sctp_does_stcb_own_this_addr()
726 ipv4_local_scope = stcb->asoc.scope.ipv4_local_scope; in sctp_does_stcb_own_this_addr()
727 ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal; in sctp_does_stcb_own_this_addr()
730 local_scope = stcb->asoc.scope.local_scope; in sctp_does_stcb_own_this_addr()
731 site_scope = stcb->asoc.scope.site_scope; in sctp_does_stcb_own_this_addr()
732 ipv6_addr_legal = stcb->asoc.scope.ipv6_addr_legal; in sctp_does_stcb_own_this_addr()
736 vrf = sctp_find_vrf(stcb->asoc.vrf_id); in sctp_does_stcb_own_this_addr()
743 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { in sctp_does_stcb_own_this_addr()
750 if (sctp_is_addr_restricted(stcb, sctp_ifa) && in sctp_does_stcb_own_this_addr()
751 (!sctp_is_addr_pending(stcb, sctp_ifa))) { in sctp_does_stcb_own_this_addr()
775 if (prison_check_ip4(stcb->sctp_ep->ip_inp.inp.inp_cred, in sctp_does_stcb_own_this_addr()
794 if (prison_check_ip6(stcb->sctp_ep->ip_inp.inp.inp_cred, in sctp_does_stcb_own_this_addr()
826 LIST_FOREACH(laddr, &stcb->sctp_ep->sctp_addr_list, sctp_nxt_addr) { in sctp_does_stcb_own_this_addr()
831 if (sctp_is_addr_restricted(stcb, laddr->ifa) && in sctp_does_stcb_own_this_addr()
832 (!sctp_is_addr_pending(stcb, laddr->ifa))) { in sctp_does_stcb_own_this_addr()
896 struct sctp_tcb *stcb; in sctp_tcb_special_locate() local
1041 stcb = LIST_FIRST(&inp->sctp_asoc_list); in sctp_tcb_special_locate()
1042 if (stcb == NULL) { in sctp_tcb_special_locate()
1046 SCTP_TCB_LOCK(stcb); in sctp_tcb_special_locate()
1047 if (!sctp_does_stcb_own_this_addr(stcb, to)) { in sctp_tcb_special_locate()
1048 SCTP_TCB_UNLOCK(stcb); in sctp_tcb_special_locate()
1052 if (stcb->rport != rport) { in sctp_tcb_special_locate()
1054 SCTP_TCB_UNLOCK(stcb); in sctp_tcb_special_locate()
1058 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_tcb_special_locate()
1059 SCTP_TCB_UNLOCK(stcb); in sctp_tcb_special_locate()
1063 if (!sctp_does_stcb_own_this_addr(stcb, to)) { in sctp_tcb_special_locate()
1064 SCTP_TCB_UNLOCK(stcb); in sctp_tcb_special_locate()
1069 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_tcb_special_locate()
1094 return (stcb); in sctp_tcb_special_locate()
1118 return (stcb); in sctp_tcb_special_locate()
1128 SCTP_TCB_UNLOCK(stcb); in sctp_tcb_special_locate()
1149 struct sctp_tcb *stcb = NULL; in sctp_findassociation_ep_addr() local
1188 stcb = sctp_tcb_special_locate(inp_p, remote, local, in sctp_findassociation_ep_addr()
1190 if ((stcb != NULL) && (locked_tcb == NULL)) { in sctp_findassociation_ep_addr()
1194 if ((locked_tcb != NULL) && (locked_tcb != stcb)) { in sctp_findassociation_ep_addr()
1201 return (stcb); in sctp_findassociation_ep_addr()
1207 stcb = LIST_FIRST(&inp->sctp_asoc_list); in sctp_findassociation_ep_addr()
1208 if (stcb == NULL) { in sctp_findassociation_ep_addr()
1211 SCTP_TCB_LOCK(stcb); in sctp_findassociation_ep_addr()
1213 if (stcb->rport != rport) { in sctp_findassociation_ep_addr()
1215 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1218 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_findassociation_ep_addr()
1219 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1222 if (local && !sctp_does_stcb_own_this_addr(stcb, local)) { in sctp_findassociation_ep_addr()
1223 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1227 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_findassociation_ep_addr()
1256 } else if (locked_tcb != stcb) { in sctp_findassociation_ep_addr()
1265 return (stcb); in sctp_findassociation_ep_addr()
1286 } else if (locked_tcb != stcb) { in sctp_findassociation_ep_addr()
1294 return (stcb); in sctp_findassociation_ep_addr()
1304 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1313 LIST_FOREACH(stcb, head, sctp_tcbhash) { in sctp_findassociation_ep_addr()
1314 if (stcb->rport != rport) { in sctp_findassociation_ep_addr()
1318 SCTP_TCB_LOCK(stcb); in sctp_findassociation_ep_addr()
1319 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_findassociation_ep_addr()
1320 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1323 if (local && !sctp_does_stcb_own_this_addr(stcb, local)) { in sctp_findassociation_ep_addr()
1324 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1328 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_findassociation_ep_addr()
1357 } else if (locked_tcb != stcb) { in sctp_findassociation_ep_addr()
1365 return (stcb); in sctp_findassociation_ep_addr()
1387 } else if (locked_tcb != stcb) { in sctp_findassociation_ep_addr()
1395 return (stcb); in sctp_findassociation_ep_addr()
1405 SCTP_TCB_UNLOCK(stcb); in sctp_findassociation_ep_addr()
1431 struct sctp_tcb *stcb; in sctp_findasoc_ep_asocid_locked() local
1445 LIST_FOREACH(stcb, head, sctp_tcbasocidhash) { in sctp_findasoc_ep_asocid_locked()
1446 if (stcb->asoc.assoc_id == id) { in sctp_findasoc_ep_asocid_locked()
1447 if (inp != stcb->sctp_ep) { in sctp_findasoc_ep_asocid_locked()
1455 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_findasoc_ep_asocid_locked()
1459 SCTP_TCB_LOCK(stcb); in sctp_findasoc_ep_asocid_locked()
1461 return (stcb); in sctp_findasoc_ep_asocid_locked()
1470 struct sctp_tcb *stcb; in sctp_findassociation_ep_asocid() local
1473 stcb = sctp_findasoc_ep_asocid_locked(inp, asoc_id, want_lock); in sctp_findassociation_ep_asocid()
1475 return (stcb); in sctp_findassociation_ep_asocid()
1859 struct sctp_tcb *stcb; in sctp_findassociation_addr_sa() local
1864 stcb = sctp_tcb_special_locate(inp_p, from, to, netp, in sctp_findassociation_addr_sa()
1867 stcb = sctp_tcb_special_locate(&inp, from, to, netp, in sctp_findassociation_addr_sa()
1870 if (stcb != NULL) { in sctp_findassociation_addr_sa()
1872 return (stcb); in sctp_findassociation_addr_sa()
1890 stcb = sctp_findassociation_ep_addr(inp_p, from, netp, to, in sctp_findassociation_addr_sa()
1893 stcb = sctp_findassociation_ep_addr(&inp, from, netp, to, in sctp_findassociation_addr_sa()
1896 return (stcb); in sctp_findassociation_addr_sa()
1911 struct sctp_tcb *stcb; in sctp_findassociation_special_addr() local
1961 stcb = sctp_findassociation_ep_addr(inp_p, in sctp_findassociation_special_addr()
1963 if (stcb != NULL) { in sctp_findassociation_special_addr()
1964 return (stcb); in sctp_findassociation_special_addr()
1982 stcb = sctp_findassociation_ep_addr(inp_p, in sctp_findassociation_special_addr()
1984 if (stcb != NULL) { in sctp_findassociation_special_addr()
1985 return (stcb); in sctp_findassociation_special_addr()
2008 struct sctp_tcb *stcb; in sctp_findassoc_by_vtag() local
2013 LIST_FOREACH(stcb, head, sctp_asocs) { in sctp_findassoc_by_vtag()
2014 SCTP_INP_RLOCK(stcb->sctp_ep); in sctp_findassoc_by_vtag()
2015 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) { in sctp_findassoc_by_vtag()
2016 SCTP_INP_RUNLOCK(stcb->sctp_ep); in sctp_findassoc_by_vtag()
2019 if (stcb->sctp_ep->def_vrf_id != vrf_id) { in sctp_findassoc_by_vtag()
2020 SCTP_INP_RUNLOCK(stcb->sctp_ep); in sctp_findassoc_by_vtag()
2023 SCTP_TCB_LOCK(stcb); in sctp_findassoc_by_vtag()
2024 SCTP_INP_RUNLOCK(stcb->sctp_ep); in sctp_findassoc_by_vtag()
2025 if (stcb->asoc.my_vtag == vtag) { in sctp_findassoc_by_vtag()
2027 if (stcb->rport != rport) { in sctp_findassoc_by_vtag()
2028 SCTP_TCB_UNLOCK(stcb); in sctp_findassoc_by_vtag()
2031 if (stcb->sctp_ep->sctp_lport != lport) { in sctp_findassoc_by_vtag()
2032 SCTP_TCB_UNLOCK(stcb); in sctp_findassoc_by_vtag()
2035 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_findassoc_by_vtag()
2036 SCTP_TCB_UNLOCK(stcb); in sctp_findassoc_by_vtag()
2040 if (sctp_does_stcb_own_this_addr(stcb, to) == 0) { in sctp_findassoc_by_vtag()
2042 SCTP_TCB_UNLOCK(stcb); in sctp_findassoc_by_vtag()
2050 if (stcb->asoc.peer_vtag == remote_tag) { in sctp_findassoc_by_vtag()
2062 *netp = sctp_findnet(stcb, from); in sctp_findassoc_by_vtag()
2067 *inp_p = stcb->sctp_ep; in sctp_findassoc_by_vtag()
2069 return (stcb); in sctp_findassoc_by_vtag()
2071 net = sctp_findnet(stcb, from); in sctp_findassoc_by_vtag()
2076 *inp_p = stcb->sctp_ep; in sctp_findassoc_by_vtag()
2078 return (stcb); in sctp_findassoc_by_vtag()
2087 SCTP_TCB_UNLOCK(stcb); in sctp_findassoc_by_vtag()
2103 struct sctp_tcb *stcb; in sctp_findassociation_addr() local
2108 stcb = sctp_findassoc_by_vtag(src, dst, ntohl(sh->v_tag), in sctp_findassociation_addr()
2110 if (stcb) { in sctp_findassociation_addr()
2111 return (stcb); in sctp_findassociation_addr()
2116 stcb = sctp_findassociation_addr_sa(src, dst, inp_p, netp, in sctp_findassociation_addr()
2120 stcb = sctp_findassociation_addr_sa(src, dst, &inp, netp, in sctp_findassociation_addr()
2123 SCTPDBG(SCTP_DEBUG_PCB1, "stcb:%p inp:%p\n", (void *)stcb, (void *)inp); in sctp_findassociation_addr()
2124 if (stcb == NULL && inp) { in sctp_findassociation_addr()
2142 stcb = sctp_findassociation_special_addr(m, in sctp_findassociation_addr()
2149 SCTPDBG(SCTP_DEBUG_PCB1, "stcb is %p\n", (void *)stcb); in sctp_findassociation_addr()
2150 return (stcb); in sctp_findassociation_addr()
2162 struct sctp_tcb *stcb; in sctp_findassociation_ep_asconf() local
2245 stcb = sctp_findassoc_by_vtag(NULL, dst, ntohl(sh->v_tag), inp_p, in sctp_findassociation_ep_asconf()
2247 if (stcb != NULL) { in sctp_findassociation_ep_asconf()
2251 stcb = sctp_findassociation_ep_addr(inp_p, in sctp_findassociation_ep_asconf()
2255 return (stcb); in sctp_findassociation_ep_asconf()
2497 struct sctp_tcb *stcb) in sctp_move_pcb_and_assoc() argument
2504 atomic_add_int(&stcb->asoc.refcnt, 1); in sctp_move_pcb_and_assoc()
2505 SCTP_TCB_UNLOCK(stcb); in sctp_move_pcb_and_assoc()
2509 SCTP_TCB_LOCK(stcb); in sctp_move_pcb_and_assoc()
2510 atomic_subtract_int(&stcb->asoc.refcnt, 1); in sctp_move_pcb_and_assoc()
2540 stcb->sctp_socket = new_inp->sctp_socket; in sctp_move_pcb_and_assoc()
2541 stcb->sctp_ep = new_inp; in sctp_move_pcb_and_assoc()
2545 rport = stcb->rport; in sctp_move_pcb_and_assoc()
2547 LIST_REMOVE(stcb, sctp_tcbhash); in sctp_move_pcb_and_assoc()
2548 LIST_REMOVE(stcb, sctp_tcblist); in sctp_move_pcb_and_assoc()
2549 if (stcb->asoc.in_asocid_hash) { in sctp_move_pcb_and_assoc()
2550 LIST_REMOVE(stcb, sctp_tcbasocidhash); in sctp_move_pcb_and_assoc()
2560 LIST_INSERT_HEAD(&new_inp->sctp_asoc_list, stcb, sctp_tcblist); in sctp_move_pcb_and_assoc()
2566 if (stcb->asoc.in_asocid_hash) { in sctp_move_pcb_and_assoc()
2569 lhd = &new_inp->sctp_asocidhash[SCTP_PCBHASH_ASOC(stcb->asoc.assoc_id, in sctp_move_pcb_and_assoc()
2571 LIST_INSERT_HEAD(lhd, stcb, sctp_tcbasocidhash); in sctp_move_pcb_and_assoc()
2574 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_move_pcb_and_assoc()
2576 stcb, net); in sctp_move_pcb_and_assoc()
2605 if (oladdr == stcb->asoc.last_used_address) { in sctp_move_pcb_and_assoc()
2606 stcb->asoc.last_used_address = laddr; in sctp_move_pcb_and_assoc()
2611 if (stcb->asoc.dack_timer.ep == old_inp) { in sctp_move_pcb_and_assoc()
2613 stcb->asoc.dack_timer.ep = new_inp; in sctp_move_pcb_and_assoc()
2616 if (stcb->asoc.asconf_timer.ep == old_inp) { in sctp_move_pcb_and_assoc()
2618 stcb->asoc.asconf_timer.ep = new_inp; in sctp_move_pcb_and_assoc()
2621 if (stcb->asoc.strreset_timer.ep == old_inp) { in sctp_move_pcb_and_assoc()
2623 stcb->asoc.strreset_timer.ep = new_inp; in sctp_move_pcb_and_assoc()
2626 if (stcb->asoc.shut_guard_timer.ep == old_inp) { in sctp_move_pcb_and_assoc()
2628 stcb->asoc.shut_guard_timer.ep = new_inp; in sctp_move_pcb_and_assoc()
2631 if (stcb->asoc.autoclose_timer.ep == old_inp) { in sctp_move_pcb_and_assoc()
2633 stcb->asoc.autoclose_timer.ep = new_inp; in sctp_move_pcb_and_assoc()
2636 if (stcb->asoc.delete_prim_timer.ep == old_inp) { in sctp_move_pcb_and_assoc()
2638 stcb->asoc.delete_prim_timer.ep = new_inp; in sctp_move_pcb_and_assoc()
2642 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_move_pcb_and_assoc()
3207 struct sctp_tcb *stcb, *nstcb; in sctp_inpcb_free() local
3258 LIST_FOREACH_SAFE(stcb, &inp->sctp_asoc_list, sctp_tcblist, nstcb) { in sctp_inpcb_free()
3259 SCTP_TCB_LOCK(stcb); in sctp_inpcb_free()
3261 stcb->sctp_socket = NULL; in sctp_inpcb_free()
3262 SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_CLOSED_SOCKET); in sctp_inpcb_free()
3263 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_inpcb_free()
3266 if (stcb->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE) { in sctp_inpcb_free()
3273 SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); in sctp_inpcb_free()
3274 sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); in sctp_inpcb_free()
3276 SCTP_TCB_UNLOCK(stcb); in sctp_inpcb_free()
3279 if (((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || in sctp_inpcb_free()
3280 (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) && in sctp_inpcb_free()
3281 (stcb->asoc.total_output_queue_size == 0)) { in sctp_inpcb_free()
3289 if (sctp_free_assoc(inp, stcb, SCTP_PCBFREE_NOFORCE, in sctp_inpcb_free()
3295 if ((stcb->asoc.size_on_reasm_queue > 0) || in sctp_inpcb_free()
3296 (stcb->asoc.size_on_all_streams > 0) || in sctp_inpcb_free()
3302 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_3; in sctp_inpcb_free()
3303 sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); in sctp_inpcb_free()
3305 if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || in sctp_inpcb_free()
3306 (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { in sctp_inpcb_free()
3309 if (sctp_free_assoc(inp, stcb, in sctp_inpcb_free()
3314 } else if (TAILQ_EMPTY(&stcb->asoc.send_queue) && in sctp_inpcb_free()
3315 TAILQ_EMPTY(&stcb->asoc.sent_queue) && in sctp_inpcb_free()
3316 (stcb->asoc.stream_queue_cnt == 0)) { in sctp_inpcb_free()
3317 if ((*stcb->asoc.ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, &stcb->asoc)) { in sctp_inpcb_free()
3320 if ((SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_SENT) && in sctp_inpcb_free()
3321 (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { in sctp_inpcb_free()
3328 if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || in sctp_inpcb_free()
3329 (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { in sctp_inpcb_free()
3332 SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT); in sctp_inpcb_free()
3333 sctp_stop_timers_for_shutdown(stcb); in sctp_inpcb_free()
3334 if (stcb->asoc.alternate) { in sctp_inpcb_free()
3335 netp = stcb->asoc.alternate; in sctp_inpcb_free()
3337 netp = stcb->asoc.primary_destination; in sctp_inpcb_free()
3339 sctp_send_shutdown(stcb, netp); in sctp_inpcb_free()
3340 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, in sctp_inpcb_free()
3342 sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, NULL); in sctp_inpcb_free()
3343 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_LOCKED); in sctp_inpcb_free()
3347 SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING); in sctp_inpcb_free()
3348 if ((*stcb->asoc.ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, &stcb->asoc)) { in sctp_inpcb_free()
3349 SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_PARTIAL_MSG_LEFT); in sctp_inpcb_free()
3351 if (TAILQ_EMPTY(&stcb->asoc.send_queue) && in sctp_inpcb_free()
3352 TAILQ_EMPTY(&stcb->asoc.sent_queue) && in sctp_inpcb_free()
3353 (stcb->asoc.state & SCTP_STATE_PARTIAL_MSG_LEFT)) { in sctp_inpcb_free()
3358 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_5; in sctp_inpcb_free()
3359 sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); in sctp_inpcb_free()
3361 if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || in sctp_inpcb_free()
3362 (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { in sctp_inpcb_free()
3365 if (sctp_free_assoc(inp, stcb, in sctp_inpcb_free()
3372 sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_CLOSING, SCTP_SO_LOCKED); in sctp_inpcb_free()
3376 SCTP_TCB_UNLOCK(stcb); in sctp_inpcb_free()
3405 LIST_FOREACH_SAFE(stcb, &inp->sctp_asoc_list, sctp_tcblist, nstcb) { in sctp_inpcb_free()
3406 SCTP_TCB_LOCK(stcb); in sctp_inpcb_free()
3409 stcb->sctp_socket = NULL; in sctp_inpcb_free()
3410 SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_CLOSED_SOCKET); in sctp_inpcb_free()
3412 if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_inpcb_free()
3413 if (stcb->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE) { in sctp_inpcb_free()
3414 SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); in sctp_inpcb_free()
3415 sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); in sctp_inpcb_free()
3418 SCTP_TCB_UNLOCK(stcb); in sctp_inpcb_free()
3422 if ((SCTP_GET_STATE(stcb) != SCTP_STATE_COOKIE_WAIT) && in sctp_inpcb_free()
3423 ((stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0)) { in sctp_inpcb_free()
3427 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_7; in sctp_inpcb_free()
3428 sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); in sctp_inpcb_free()
3430 } else if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { in sctp_inpcb_free()
3432 SCTP_TCB_UNLOCK(stcb); in sctp_inpcb_free()
3435 if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || in sctp_inpcb_free()
3436 (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { in sctp_inpcb_free()
3439 if (sctp_free_assoc(inp, stcb, SCTP_PCBFREE_FORCE, in sctp_inpcb_free()
3549 LIST_FOREACH_SAFE(stcb, &inp->sctp_asoc_free_list, sctp_tcblist, nstcb) { in sctp_inpcb_free()
3550 LIST_REMOVE(stcb, sctp_tcblist); in sctp_inpcb_free()
3551 SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); in sctp_inpcb_free()
3572 sctp_findnet(struct sctp_tcb *stcb, struct sockaddr *addr) in sctp_findnet() argument
3577 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_findnet()
3603 sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, in sctp_add_remote_addr() argument
3618 netfirst = sctp_findnet(stcb, newaddr); in sctp_add_remote_addr()
3658 stcb->asoc.scope.ipv4_local_scope = 1; in sctp_add_remote_addr()
3663 (stcb->asoc.scope.ipv4_local_scope == 0)) { in sctp_add_remote_addr()
3683 if (sctp_is_address_on_local_host(newaddr, stcb->asoc.vrf_id)) { in sctp_add_remote_addr()
3684 stcb->asoc.scope.loopback_scope = 1; in sctp_add_remote_addr()
3685 stcb->asoc.scope.local_scope = 0; in sctp_add_remote_addr()
3686 stcb->asoc.scope.ipv4_local_scope = 1; in sctp_add_remote_addr()
3687 stcb->asoc.scope.site_scope = 1; in sctp_add_remote_addr()
3699 stcb->asoc.scope.ipv4_local_scope = 1; in sctp_add_remote_addr()
3700 stcb->asoc.scope.site_scope = 1; in sctp_add_remote_addr()
3707 stcb->asoc.scope.site_scope = 1; in sctp_add_remote_addr()
3712 (stcb->asoc.scope.loopback_scope == 0)) { in sctp_add_remote_addr()
3715 (stcb->asoc.scope.local_scope == 0)) { in sctp_add_remote_addr()
3718 (stcb->asoc.scope.site_scope == 0)) { in sctp_add_remote_addr()
3740 ((struct sockaddr_in *)&net->ro._l_addr)->sin_port = stcb->rport; in sctp_add_remote_addr()
3745 ((struct sockaddr_in6 *)&net->ro._l_addr)->sin6_port = stcb->rport; in sctp_add_remote_addr()
3751 net->addr_is_local = sctp_is_address_on_local_host(newaddr, stcb->asoc.vrf_id); in sctp_add_remote_addr()
3753 stcb->asoc.scope.loopback_scope = 1; in sctp_add_remote_addr()
3754 stcb->asoc.scope.ipv4_local_scope = 1; in sctp_add_remote_addr()
3755 stcb->asoc.scope.local_scope = 0; in sctp_add_remote_addr()
3756 stcb->asoc.scope.site_scope = 1; in sctp_add_remote_addr()
3759 net->failure_threshold = stcb->asoc.def_net_failure; in sctp_add_remote_addr()
3760 net->pf_threshold = stcb->asoc.def_net_pf_threshold; in sctp_add_remote_addr()
3779 stcb->asoc.numnets++; in sctp_add_remote_addr()
3781 net->cwr_window_tsn = net->last_cwr_tsn = stcb->asoc.sending_seq - 1; in sctp_add_remote_addr()
3783 net->dscp = stcb->asoc.default_dscp; in sctp_add_remote_addr()
3785 net->flowlabel = stcb->asoc.default_flowlabel; in sctp_add_remote_addr()
3787 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) { in sctp_add_remote_addr()
3792 if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_DO_NOT_PMTUD)) { in sctp_add_remote_addr()
3797 net->heart_beat_delay = stcb->asoc.heart_beat_delay; in sctp_add_remote_addr()
3815 stcb->asoc.vrf_id, in sctp_add_remote_addr()
3816 stcb->sctp_ep->fibnum); in sctp_add_remote_addr()
3821 net->ro._s_addr = sctp_source_address_selection(stcb->sctp_ep, in sctp_add_remote_addr()
3822 stcb, in sctp_add_remote_addr()
3826 stcb->asoc.vrf_id); in sctp_add_remote_addr()
3827 if (stcb->asoc.default_mtu > 0) { in sctp_add_remote_addr()
3828 net->mtu = stcb->asoc.default_mtu; in sctp_add_remote_addr()
3864 hcmtu = sctp_hc_get_mtu(&net->ro._l_addr, stcb->sctp_ep->fibnum); in sctp_add_remote_addr()
3869 if (stcb->asoc.default_mtu > 0) { in sctp_add_remote_addr()
3870 net->mtu = stcb->asoc.default_mtu; in sctp_add_remote_addr()
3913 stcb->asoc.smallest_mtu = net->mtu; in sctp_add_remote_addr()
3915 if (stcb->asoc.smallest_mtu > net->mtu) { in sctp_add_remote_addr()
3916 sctp_pathmtu_adjustment(stcb, net->mtu, true); in sctp_add_remote_addr()
3928 if (stcb->asoc.cc_functions.sctp_set_initial_cc_param != NULL) in sctp_add_remote_addr()
3929 (*stcb->asoc.cc_functions.sctp_set_initial_cc_param) (stcb, net); in sctp_add_remote_addr()
3938 net->flowid = stcb->asoc.my_vtag ^ in sctp_add_remote_addr()
3939 ntohs(stcb->rport) ^ in sctp_add_remote_addr()
3940 ntohs(stcb->sctp_ep->sctp_lport); in sctp_add_remote_addr()
3945 netfirst = TAILQ_FIRST(&stcb->asoc.nets); in sctp_add_remote_addr()
3948 TAILQ_INSERT_TAIL(&stcb->asoc.nets, net, sctp_next); in sctp_add_remote_addr()
3951 TAILQ_INSERT_HEAD(&stcb->asoc.nets, net, sctp_next); in sctp_add_remote_addr()
3957 TAILQ_INSERT_HEAD(&stcb->asoc.nets, net, sctp_next); in sctp_add_remote_addr()
3963 TAILQ_INSERT_HEAD(&stcb->asoc.nets, net, sctp_next); in sctp_add_remote_addr()
3977 TAILQ_INSERT_TAIL(&stcb->asoc.nets, net, sctp_next); in sctp_add_remote_addr()
3984 TAILQ_INSERT_AFTER(&stcb->asoc.nets, netlook, in sctp_add_remote_addr()
3994 if (stcb->asoc.primary_destination == 0) { in sctp_add_remote_addr()
3995 stcb->asoc.primary_destination = net; in sctp_add_remote_addr()
3996 } else if ((stcb->asoc.primary_destination->ro.ro_nh == NULL) && in sctp_add_remote_addr()
4000 stcb->asoc.primary_destination = net; in sctp_add_remote_addr()
4003 net = TAILQ_FIRST(&stcb->asoc.nets); in sctp_add_remote_addr()
4004 if ((net != stcb->asoc.primary_destination) && in sctp_add_remote_addr()
4005 (stcb->asoc.primary_destination)) { in sctp_add_remote_addr()
4011 TAILQ_REMOVE(&stcb->asoc.nets, in sctp_add_remote_addr()
4012 stcb->asoc.primary_destination, sctp_next); in sctp_add_remote_addr()
4013 TAILQ_INSERT_HEAD(&stcb->asoc.nets, in sctp_add_remote_addr()
4014 stcb->asoc.primary_destination, sctp_next); in sctp_add_remote_addr()
4020 sctp_aloc_a_assoc_id(struct sctp_inpcb *inp, struct sctp_tcb *stcb) in sctp_aloc_a_assoc_id() argument
4045 LIST_INSERT_HEAD(head, stcb, sctp_tcbasocidhash); in sctp_aloc_a_assoc_id()
4046 stcb->asoc.in_asocid_hash = 1; in sctp_aloc_a_assoc_id()
4064 struct sctp_tcb *stcb; in sctp_aloc_assoc_locked() local
4197 stcb = SCTP_ZONE_GET(SCTP_BASE_INFO(ipi_zone_asoc), struct sctp_tcb); in sctp_aloc_assoc_locked()
4198 if (stcb == NULL) { in sctp_aloc_assoc_locked()
4206 memset(stcb, 0, sizeof(*stcb)); in sctp_aloc_assoc_locked()
4207 asoc = &stcb->asoc; in sctp_aloc_assoc_locked()
4209 SCTP_TCB_LOCK_INIT(stcb); in sctp_aloc_assoc_locked()
4210 stcb->rport = rport; in sctp_aloc_assoc_locked()
4212 stcb->sctp_ep = inp; in sctp_aloc_assoc_locked()
4213 stcb->sctp_socket = inp->sctp_socket; in sctp_aloc_assoc_locked()
4214 if ((err = sctp_init_asoc(inp, stcb, override_tag, initial_tsn, vrf_id, o_streams))) { in sctp_aloc_assoc_locked()
4216 SCTP_TCB_LOCK_DESTROY(stcb); in sctp_aloc_assoc_locked()
4217 SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); in sctp_aloc_assoc_locked()
4222 SCTP_TCB_LOCK(stcb); in sctp_aloc_assoc_locked()
4224 asoc->assoc_id = sctp_aloc_a_assoc_id(inp, stcb); in sctp_aloc_assoc_locked()
4226 …head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(stcb->asoc.my_vtag, SCTP_BASE_INFO(hashaso… in sctp_aloc_assoc_locked()
4228 LIST_INSERT_HEAD(head, stcb, sctp_asocs); in sctp_aloc_assoc_locked()
4230 if (sctp_add_remote_addr(stcb, firstaddr, NULL, port, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC)) { in sctp_aloc_assoc_locked()
4245 SCTP_TCB_UNLOCK(stcb); in sctp_aloc_assoc_locked()
4246 SCTP_TCB_LOCK_DESTROY(stcb); in sctp_aloc_assoc_locked()
4247 LIST_REMOVE(stcb, sctp_asocs); in sctp_aloc_assoc_locked()
4248 LIST_REMOVE(stcb, sctp_tcbasocidhash); in sctp_aloc_assoc_locked()
4249 SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); in sctp_aloc_assoc_locked()
4262 LIST_INSERT_HEAD(&inp->sctp_asoc_list, stcb, sctp_tcblist); in sctp_aloc_assoc_locked()
4265 head = &inp->sctp_tcbhash[SCTP_PCBHASH_ALLADDR(stcb->rport, in sctp_aloc_assoc_locked()
4267 LIST_INSERT_HEAD(head, stcb, sctp_tcbhash); in sctp_aloc_assoc_locked()
4270 sctp_initialize_auth_params(inp, stcb); in sctp_aloc_assoc_locked()
4272 SCTPDBG(SCTP_DEBUG_PCB1, "Association %p now allocated\n", (void *)stcb); in sctp_aloc_assoc_locked()
4273 return (stcb); in sctp_aloc_assoc_locked()
4283 struct sctp_tcb *stcb; in sctp_aloc_assoc() local
4287 stcb = sctp_aloc_assoc_locked(inp, firstaddr, error, override_tag, in sctp_aloc_assoc()
4291 return (stcb); in sctp_aloc_assoc()
4301 struct sctp_tcb *stcb; in sctp_aloc_assoc_connected() local
4312 stcb = sctp_aloc_assoc_locked(inp, firstaddr, error, override_tag, in sctp_aloc_assoc_connected()
4315 if (stcb != NULL && (inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)) { in sctp_aloc_assoc_connected()
4320 return (stcb); in sctp_aloc_assoc_connected()
4324 sctp_remove_net(struct sctp_tcb *stcb, struct sctp_nets *net) in sctp_remove_net() argument
4329 inp = stcb->sctp_ep; in sctp_remove_net()
4330 asoc = &stcb->asoc; in sctp_remove_net()
4343 if (sctp_is_mobility_feature_on(stcb->sctp_ep, in sctp_remove_net()
4345 sctp_is_mobility_feature_on(stcb->sctp_ep, in sctp_remove_net()
4356 sctp_mobility_feature_on(stcb->sctp_ep, in sctp_remove_net()
4359 stcb->sctp_ep, stcb, NULL); in sctp_remove_net()
4363 asoc->primary_destination = sctp_find_alternate_net(stcb, lnet, 0); in sctp_remove_net()
4377 if (net == stcb->asoc.alternate) { in sctp_remove_net()
4378 sctp_free_remote_addr(stcb->asoc.alternate); in sctp_remove_net()
4379 stcb->asoc.alternate = NULL; in sctp_remove_net()
4381 sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net, in sctp_remove_net()
4383 sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, in sctp_remove_net()
4394 sctp_del_remote_addr(struct sctp_tcb *stcb, struct sockaddr *remaddr) in sctp_del_remote_addr() argument
4406 asoc = &stcb->asoc; in sctp_del_remote_addr()
4420 sctp_remove_net(stcb, net); in sctp_del_remote_addr()
4518 sctp_clean_up_stream(struct sctp_tcb *stcb, struct sctp_readhead *rh) in sctp_clean_up_stream() argument
4541 sctp_auth_key_release(stcb, chk->auth_keyid, SCTP_SO_LOCKED); in sctp_clean_up_stream()
4552 sctp_free_a_readq(stcb, control); in sctp_clean_up_stream()
4566 sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfree, int from_locatio… in sctp_free_assoc() argument
4582 SCTP_TCB_LOCK_ASSERT(stcb); in sctp_free_assoc()
4585 sctp_log_closing(inp, stcb, 6); in sctp_free_assoc()
4587 if (stcb->asoc.state == 0) { in sctp_free_assoc()
4594 if (stcb->asoc.alternate) { in sctp_free_assoc()
4595 sctp_free_remote_addr(stcb->asoc.alternate); in sctp_free_assoc()
4596 stcb->asoc.alternate = NULL; in sctp_free_assoc()
4599 if (stcb->freed_from_where == 0) { in sctp_free_assoc()
4601 stcb->freed_from_where = from_location; in sctp_free_assoc()
4605 asoc = &stcb->asoc; in sctp_free_assoc()
4618 if ((stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) && in sctp_free_assoc()
4624 if (stcb->asoc.refcnt) { in sctp_free_assoc()
4626 sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); in sctp_free_assoc()
4628 SCTP_TCB_UNLOCK(stcb); in sctp_free_assoc()
4630 sctp_log_closing(inp, stcb, 8); in sctp_free_assoc()
4636 sctp_stop_association_timers(stcb, false); in sctp_free_assoc()
4638 if ((stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0) { in sctp_free_assoc()
4639 SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_ABOUT_TO_BE_FREED); in sctp_free_assoc()
4642 if (sq->stcb == stcb) { in sctp_free_assoc()
4644 sq->sinfo_cumtsn = stcb->asoc.cumulative_tsn; in sctp_free_assoc()
4653 if (sctp_stcb_is_feature_on(inp, stcb, SCTP_PCB_FLAGS_PDAPIEVNT) && (so != NULL)) { in sctp_free_assoc()
4655 stcb, in sctp_free_assoc()
4666 if (stcb->block_entry) { in sctp_free_assoc()
4667 SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_PCB, ECONNRESET); in sctp_free_assoc()
4668 stcb->block_entry->error = ECONNRESET; in sctp_free_assoc()
4669 stcb->block_entry = NULL; in sctp_free_assoc()
4672 if ((stcb->asoc.refcnt) || (stcb->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE)) { in sctp_free_assoc()
4677 if ((stcb->asoc.refcnt) || in sctp_free_assoc()
4680 SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); in sctp_free_assoc()
4681 sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); in sctp_free_assoc()
4692 SCTP_TCB_UNLOCK(stcb); in sctp_free_assoc()
4695 sctp_log_closing(inp, stcb, 9); in sctp_free_assoc()
4701 sctp_log_closing(inp, stcb, 10); in sctp_free_assoc()
4714 atomic_add_int(&stcb->asoc.refcnt, 1); in sctp_free_assoc()
4716 SCTP_TCB_UNLOCK(stcb); in sctp_free_assoc()
4719 SCTP_TCB_LOCK(stcb); in sctp_free_assoc()
4757 atomic_subtract_int(&stcb->asoc.refcnt, 1); in sctp_free_assoc()
4759 if (stcb->asoc.refcnt) { in sctp_free_assoc()
4760 SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); in sctp_free_assoc()
4761 sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); in sctp_free_assoc()
4766 SCTP_TCB_UNLOCK(stcb); in sctp_free_assoc()
4771 LIST_REMOVE(stcb, sctp_tcbhash); in sctp_free_assoc()
4773 if (stcb->asoc.in_asocid_hash) { in sctp_free_assoc()
4774 LIST_REMOVE(stcb, sctp_tcbasocidhash); in sctp_free_assoc()
4777 stcb->sctp_socket = NULL; in sctp_free_assoc()
4780 LIST_REMOVE(stcb, sctp_tcblist); in sctp_free_assoc()
4786 LIST_REMOVE(stcb, sctp_asocs); in sctp_free_assoc()
4787 sctp_add_vtag_to_timewait(asoc->my_vtag, inp->sctp_lport, stcb->rport); in sctp_free_assoc()
4792 sctp_stop_association_timers(stcb, true); in sctp_free_assoc()
4807 stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp); in sctp_free_assoc()
4808 sctp_free_spbufspace(stcb, asoc, sp); in sctp_free_assoc()
4812 sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, in sctp_free_assoc()
4826 sctp_free_a_strmoq(stcb, sp, SCTP_SO_LOCKED); in sctp_free_assoc()
4842 sq->stcb = NULL; in sctp_free_assoc()
4844 sctp_free_a_readq(stcb, sq); in sctp_free_assoc()
4854 sctp_auth_key_release(stcb, chk->auth_keyid, SCTP_SO_LOCKED); in sctp_free_assoc()
4874 sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, in sctp_free_assoc()
4883 sctp_auth_key_release(stcb, chk->auth_keyid, SCTP_SO_LOCKED); in sctp_free_assoc()
4907 sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, in sctp_free_assoc()
4916 sctp_auth_key_release(stcb, chk->auth_keyid, SCTP_SO_LOCKED); in sctp_free_assoc()
4923 for (i = 0; i < stcb->asoc.streamoutcnt; i++) { in sctp_free_assoc()
4924 if (stcb->asoc.strmout[i].chunks_on_queues > 0) { in sctp_free_assoc()
4925 panic("%u chunks left for stream %u.", stcb->asoc.strmout[i].chunks_on_queues, i); in sctp_free_assoc()
4937 sctp_auth_key_release(stcb, chk->auth_keyid, SCTP_SO_LOCKED); in sctp_free_assoc()
4951 sctp_auth_key_release(stcb, chk->auth_keyid, SCTP_SO_LOCKED); in sctp_free_assoc()
4973 sctp_clean_up_stream(stcb, &asoc->strmin[i].inqueue); in sctp_free_assoc()
4974 sctp_clean_up_stream(stcb, &asoc->strmin[i].uno_inqueue); in sctp_free_assoc()
5030 SCTP_TCB_UNLOCK(stcb); in sctp_free_assoc()
5031 SCTP_TCB_LOCK_DESTROY(stcb); in sctp_free_assoc()
5039 SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); in sctp_free_assoc()
5042 LIST_INSERT_HEAD(&inp->sctp_asoc_free_list, stcb, sctp_tcblist); in sctp_free_assoc()
5045 SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); in sctp_free_assoc()
5089 sctp_destination_is_reachable(struct sctp_tcb *stcb, struct sockaddr *destaddr) in sctp_destination_is_reachable() argument
5104 inp = stcb->sctp_ep; in sctp_destination_is_reachable()
5180 struct sctp_tcb *stcb; in sctp_add_local_addr_ep() local
5226 LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { in sctp_add_local_addr_ep()
5227 sctp_add_local_addr_restricted(stcb, ifa); in sctp_add_local_addr_ep()
5239 sctp_select_primary_destination(struct sctp_tcb *stcb) in sctp_select_primary_destination() argument
5243 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_select_primary_destination()
5247 if (sctp_destination_is_reachable(stcb, in sctp_select_primary_destination()
5250 stcb->asoc.primary_destination = net; in sctp_select_primary_destination()
5288 struct sctp_tcb *stcb; in sctp_del_local_addr_ep() local
5296 LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { in sctp_del_local_addr_ep()
5299 SCTP_TCB_LOCK(stcb); in sctp_del_local_addr_ep()
5300 if (stcb->asoc.last_used_address == laddr) in sctp_del_local_addr_ep()
5302 stcb->asoc.last_used_address = NULL; in sctp_del_local_addr_ep()
5307 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_del_local_addr_ep()
5316 SCTP_TCB_UNLOCK(stcb); in sctp_del_local_addr_ep()
5333 sctp_add_local_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa) in sctp_add_local_addr_restricted() argument
5342 list = &stcb->asoc.sctp_restricted_addrs; in sctp_add_local_addr_restricted()
5368 sctp_del_local_addr_restricted(struct sctp_tcb *stcb, struct sctp_ifa *ifa) in sctp_del_local_addr_restricted() argument
5383 inp = stcb->sctp_ep; in sctp_del_local_addr_restricted()
5387 if (stcb->sctp_ep->laddr_count < 2) { in sctp_del_local_addr_restricted()
5392 LIST_FOREACH(laddr, &stcb->asoc.sctp_restricted_addrs, sctp_nxt_addr) { in sctp_del_local_addr_restricted()
5867 sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, in sctp_load_addresses_from_init() argument
5920 sin.sin_port = stcb->rport; in sctp_load_addresses_from_init()
5926 sin6.sin6_port = stcb->rport; in sctp_load_addresses_from_init()
5942 TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { in sctp_load_addresses_from_init()
5947 inp = stcb->sctp_ep; in sctp_load_addresses_from_init()
5948 atomic_add_int(&stcb->asoc.refcnt, 1); in sctp_load_addresses_from_init()
5949 stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net_tmp, dst, stcb); in sctp_load_addresses_from_init()
5950 atomic_subtract_int(&stcb->asoc.refcnt, 1); in sctp_load_addresses_from_init()
5952 if ((stcb_tmp == NULL && inp == stcb->sctp_ep) || inp == NULL) { in sctp_load_addresses_from_init()
5958 if (stcb->asoc.scope.ipv4_addr_legal) { in sctp_load_addresses_from_init()
5959 if (sctp_add_remote_addr(stcb, sa, NULL, port, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_2)) { in sctp_load_addresses_from_init()
5967 if (stcb->asoc.scope.ipv6_addr_legal) { in sctp_load_addresses_from_init()
5968 if (sctp_add_remote_addr(stcb, sa, NULL, port, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_3)) { in sctp_load_addresses_from_init()
5978 if (net_tmp != NULL && stcb_tmp == stcb) { in sctp_load_addresses_from_init()
5980 } else if (stcb_tmp != stcb) { in sctp_load_addresses_from_init()
5987 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6008 if (stcb->asoc.scope.ipv4_addr_legal) { in sctp_load_addresses_from_init()
6029 inp = stcb->sctp_ep; in sctp_load_addresses_from_init()
6030 atomic_add_int(&stcb->asoc.refcnt, 1); in sctp_load_addresses_from_init()
6032 dst, stcb); in sctp_load_addresses_from_init()
6033 atomic_subtract_int(&stcb->asoc.refcnt, 1); in sctp_load_addresses_from_init()
6035 if ((stcb_tmp == NULL && inp == stcb->sctp_ep) || in sctp_load_addresses_from_init()
6048 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6052 if (sctp_add_remote_addr(stcb, sa, NULL, port, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_4)) { in sctp_load_addresses_from_init()
6055 } else if (stcb_tmp == stcb) { in sctp_load_addresses_from_init()
6056 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6091 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6102 if (stcb->asoc.scope.ipv6_addr_legal) { in sctp_load_addresses_from_init()
6128 inp = stcb->sctp_ep; in sctp_load_addresses_from_init()
6129 atomic_add_int(&stcb->asoc.refcnt, 1); in sctp_load_addresses_from_init()
6131 dst, stcb); in sctp_load_addresses_from_init()
6132 atomic_subtract_int(&stcb->asoc.refcnt, 1); in sctp_load_addresses_from_init()
6134 (inp == stcb->sctp_ep || inp == NULL)) { in sctp_load_addresses_from_init()
6140 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6148 if (sctp_add_remote_addr(stcb, sa, NULL, port, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_5)) { in sctp_load_addresses_from_init()
6151 } else if (stcb_tmp == stcb) { in sctp_load_addresses_from_init()
6156 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6190 if (stcb->asoc.state == 0) { in sctp_load_addresses_from_init()
6202 if (stcb->asoc.state != SCTP_STATE_OPEN) { in sctp_load_addresses_from_init()
6210 stcb->asoc.peers_adaptation = ntohl(aip->indication); in sctp_load_addresses_from_init()
6211 stcb->asoc.adaptation_needed = 1; in sctp_load_addresses_from_init()
6222 if (stcb->asoc.asconf_supported == 0) { in sctp_load_addresses_from_init()
6273 (void)sctp_set_primary_addr(stcb, sa, NULL); in sctp_load_addresses_from_init()
6276 stcb->asoc.peer_supports_nat = 1; in sctp_load_addresses_from_init()
6295 (ntohl(zero_chksum_p->edmid) == stcb->asoc.rcv_edmid)) { in sctp_load_addresses_from_init()
6296 stcb->asoc.snd_edmid = stcb->asoc.rcv_edmid; in sctp_load_addresses_from_init()
6388 if (stcb->asoc.peer_hmacs != NULL) in sctp_load_addresses_from_init()
6389 sctp_free_hmaclist(stcb->asoc.peer_hmacs); in sctp_load_addresses_from_init()
6390 stcb->asoc.peer_hmacs = sctp_alloc_hmaclist(num_hmacs); in sctp_load_addresses_from_init()
6391 if (stcb->asoc.peer_hmacs != NULL) { in sctp_load_addresses_from_init()
6393 (void)sctp_auth_add_hmacid(stcb->asoc.peer_hmacs, in sctp_load_addresses_from_init()
6414 if (stcb->asoc.peer_auth_chunks != NULL) in sctp_load_addresses_from_init()
6415 sctp_clear_chunklist(stcb->asoc.peer_auth_chunks); in sctp_load_addresses_from_init()
6417 stcb->asoc.peer_auth_chunks = sctp_alloc_chunklist(); in sctp_load_addresses_from_init()
6420 stcb->asoc.peer_auth_chunks); in sctp_load_addresses_from_init()
6460 TAILQ_FOREACH_SAFE(net, &stcb->asoc.nets, sctp_next, nnet) { in sctp_load_addresses_from_init()
6465 stcb->asoc.numnets--; in sctp_load_addresses_from_init()
6466 TAILQ_REMOVE(&stcb->asoc.nets, net, sctp_next); in sctp_load_addresses_from_init()
6467 if (net == stcb->asoc.alternate) { in sctp_load_addresses_from_init()
6468 sctp_free_remote_addr(stcb->asoc.alternate); in sctp_load_addresses_from_init()
6469 stcb->asoc.alternate = NULL; in sctp_load_addresses_from_init()
6471 if (net == stcb->asoc.primary_destination) { in sctp_load_addresses_from_init()
6472 stcb->asoc.primary_destination = NULL; in sctp_load_addresses_from_init()
6473 sctp_select_primary_destination(stcb); in sctp_load_addresses_from_init()
6478 if ((stcb->asoc.ecn_supported == 1) && in sctp_load_addresses_from_init()
6480 stcb->asoc.ecn_supported = 0; in sctp_load_addresses_from_init()
6482 if ((stcb->asoc.prsctp_supported == 1) && in sctp_load_addresses_from_init()
6484 stcb->asoc.prsctp_supported = 0; in sctp_load_addresses_from_init()
6486 if ((stcb->asoc.auth_supported == 1) && in sctp_load_addresses_from_init()
6489 stcb->asoc.auth_supported = 0; in sctp_load_addresses_from_init()
6491 if ((stcb->asoc.asconf_supported == 1) && in sctp_load_addresses_from_init()
6493 (stcb->asoc.auth_supported == 0) || in sctp_load_addresses_from_init()
6495 stcb->asoc.asconf_supported = 0; in sctp_load_addresses_from_init()
6497 if ((stcb->asoc.reconfig_supported == 1) && in sctp_load_addresses_from_init()
6499 stcb->asoc.reconfig_supported = 0; in sctp_load_addresses_from_init()
6501 if ((stcb->asoc.idata_supported == 1) && in sctp_load_addresses_from_init()
6503 stcb->asoc.idata_supported = 0; in sctp_load_addresses_from_init()
6505 if ((stcb->asoc.nrsack_supported == 1) && in sctp_load_addresses_from_init()
6507 stcb->asoc.nrsack_supported = 0; in sctp_load_addresses_from_init()
6509 if ((stcb->asoc.pktdrop_supported == 1) && in sctp_load_addresses_from_init()
6511 stcb->asoc.pktdrop_supported = 0; in sctp_load_addresses_from_init()
6555 if (stcb->asoc.authinfo.peer_random != NULL) in sctp_load_addresses_from_init()
6556 sctp_free_key(stcb->asoc.authinfo.peer_random); in sctp_load_addresses_from_init()
6557 stcb->asoc.authinfo.peer_random = new_key; in sctp_load_addresses_from_init()
6558 sctp_clear_cachedkeys(stcb, stcb->asoc.authinfo.assoc_keyid); in sctp_load_addresses_from_init()
6559 sctp_clear_cachedkeys(stcb, stcb->asoc.authinfo.recv_keyid); in sctp_load_addresses_from_init()
6565 sctp_set_primary_addr(struct sctp_tcb *stcb, struct sockaddr *sa, in sctp_set_primary_addr() argument
6570 net = sctp_findnet(stcb, sa); in sctp_set_primary_addr()
6582 stcb->asoc.primary_destination = net; in sctp_set_primary_addr()
6584 (stcb->asoc.alternate != NULL)) { in sctp_set_primary_addr()
6585 sctp_free_remote_addr(stcb->asoc.alternate); in sctp_set_primary_addr()
6586 stcb->asoc.alternate = NULL; in sctp_set_primary_addr()
6588 net = TAILQ_FIRST(&stcb->asoc.nets); in sctp_set_primary_addr()
6589 if (net != stcb->asoc.primary_destination) { in sctp_set_primary_addr()
6595 TAILQ_REMOVE(&stcb->asoc.nets, stcb->asoc.primary_destination, sctp_next); in sctp_set_primary_addr()
6596 TAILQ_INSERT_HEAD(&stcb->asoc.nets, stcb->asoc.primary_destination, sctp_next); in sctp_set_primary_addr()
6606 struct sctp_tcb *stcb; in sctp_is_vtag_good() local
6611 LIST_FOREACH(stcb, head, sctp_asocs) { in sctp_is_vtag_good()
6618 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) { in sctp_is_vtag_good()
6621 if (stcb->asoc.my_vtag == tag) { in sctp_is_vtag_good()
6623 if (stcb->rport != rport) { in sctp_is_vtag_good()
6626 if (stcb->sctp_ep->sctp_lport != lport) { in sctp_is_vtag_good()
6637 sctp_drain_mbufs(struct sctp_tcb *stcb) in sctp_drain_mbufs() argument
6653 asoc = &stcb->asoc; in sctp_drain_mbufs()
6687 TAILQ_REMOVE(&stcb->sctp_ep->read_queue, control, next); in sctp_drain_mbufs()
6718 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); in sctp_drain_mbufs()
6720 sctp_free_a_readq(stcb, control); in sctp_drain_mbufs()
6747 TAILQ_REMOVE(&stcb->sctp_ep->read_queue, control, next); in sctp_drain_mbufs()
6778 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); in sctp_drain_mbufs()
6780 sctp_free_a_readq(stcb, control); in sctp_drain_mbufs()
6822 sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, in sctp_drain_mbufs()
6825 sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED); in sctp_drain_mbufs()
6826 sctp_chunk_output(stcb->sctp_ep, stcb, SCTP_OUTPUT_FROM_DRAIN, SCTP_SO_NOT_LOCKED); in sctp_drain_mbufs()
6856 struct sctp_tcb *stcb; in sctp_drain() local
6871 LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { in sctp_drain()
6873 SCTP_TCB_LOCK(stcb); in sctp_drain()
6874 sctp_drain_mbufs(stcb); in sctp_drain()
6875 SCTP_TCB_UNLOCK(stcb); in sctp_drain()