Lines Matching defs:mpts

106  *			mpts (mpts_lock)
562 struct mptsub *mpts;
564 mpts = (how == M_WAITOK) ? zalloc(mptsub_zone) :
566 if (mpts != NULL) {
567 bzero(mpts, mptsub_zone_size);
568 lck_mtx_init(&mpts->mpts_lock, mtcbinfo.mppi_lock_grp,
572 return (mpts);
580 mptcp_subflow_free(struct mptsub *mpts)
582 MPTS_LOCK_ASSERT_HELD(mpts);
584 VERIFY(mpts->mpts_refcnt == 0);
585 VERIFY(!(mpts->mpts_flags & MPTSF_ATTACHED));
586 VERIFY(mpts->mpts_mpte == NULL);
587 VERIFY(mpts->mpts_socket == NULL);
589 if (mpts->mpts_src_sl != NULL) {
590 sockaddrlist_free(mpts->mpts_src_sl);
591 mpts->mpts_src_sl = NULL;
593 if (mpts->mpts_dst_sl != NULL) {
594 sockaddrlist_free(mpts->mpts_dst_sl);
595 mpts->mpts_dst_sl = NULL;
597 MPTS_UNLOCK(mpts);
598 lck_mtx_destroy(&mpts->mpts_lock, mtcbinfo.mppi_lock_grp);
600 zfree(mptsub_zone, mpts);
607 mptcp_subflow_socreate(struct mptses *mpte, struct mptsub *mpts, int dom,
724 mpts->mpts_oprotosw = (*so)->so_proto;
743 struct mptsub *, mpts, int, dom, int, error);
755 mptcp_subflow_soclose(struct mptsub *mpts, struct socket *so)
757 MPTS_LOCK_ASSERT_HELD(mpts);
764 VERIFY(mpts->mpts_oprotosw != NULL);
765 so->so_proto = mpts->mpts_oprotosw;
768 mpts->mpts_socket = NULL; /* may already be NULL */
770 DTRACE_MPTCP5(subflow__close, struct mptsub *, mpts,
774 struct mptses *, mpts->mpts_mpte);
789 mptcp_subflow_soconnectx(struct mptses *mpte, struct mptsub *mpts)
795 MPTS_LOCK_ASSERT_HELD(mpts);
797 VERIFY((mpts->mpts_flags & (MPTSF_CONNECTING|MPTSF_CONNECTED)) ==
799 VERIFY(mpts->mpts_socket != NULL);
800 so = mpts->mpts_socket;
801 af = mpts->mpts_family;
807 dst_se = TAILQ_FIRST(&mpts->mpts_dst_sl->sl_head);
819 mpts->mpts_connid,
820 ((mpts->mpts_flags & MPTSF_CONNECT_PENDING) ?
824 mpts->mpts_flags &= ~MPTSF_CONNECT_PENDING;
830 error = soconnectxlocked(so, &mpts->mpts_src_sl, &mpts->mpts_dst_sl,
831 mpts->mpts_mpcr.mpcr_proc, mpts->mpts_mpcr.mpcr_ifscope,
833 &mpts->mpts_mpcr, sizeof (mpts->mpts_mpcr));
842 struct mptsub *, mpts, int, error);
1029 mptcp_subflow_sopeeloff(struct mptses *mpte, struct mptsub *mpts,
1038 MPTS_LOCK_ASSERT_HELD(mpts);
1072 VERIFY(mpts->mpts_oprotosw != NULL);
1073 so->so_proto = mpts->mpts_oprotosw;
1114 struct mptsub *, mpts, struct socket *, so,
1123 mptcp_subflow_add(struct mptses *mpte, struct mptsub *mpts,
1145 MPTS_LOCK(mpts);
1146 VERIFY(!(mpts->mpts_flags & (MPTSF_CONNECTING|MPTSF_CONNECTED)));
1147 VERIFY(mpts->mpts_mpte == NULL);
1148 VERIFY(mpts->mpts_socket == NULL);
1149 VERIFY(mpts->mpts_dst_sl != NULL);
1150 VERIFY(mpts->mpts_connid == CONNID_ANY);
1153 if ((error = in_selectaddrs(AF_UNSPEC, &mpts->mpts_src_sl, &src_se,
1154 &mpts->mpts_dst_sl, &dst_se)) != 0)
1157 VERIFY(mpts->mpts_dst_sl != NULL && dst_se != NULL);
1158 VERIFY(src_se == NULL || mpts->mpts_src_sl != NULL);
1159 af = mpts->mpts_family = dst_se->se_addr->sa_family;
1169 if (mpts->mpts_src_sl == NULL) {
1170 mpts->mpts_src_sl =
1171 sockaddrlist_dup(mpts->mpts_dst_sl, M_WAITOK);
1172 if (mpts->mpts_src_sl == NULL) {
1176 se = TAILQ_FIRST(&mpts->mpts_src_sl->sl_head);
1185 if ((error = mptcp_subflow_socreate(mpte, mpts, af, p, &so)) != 0)
1188 /* If fastjoin is requested, set state in mpts */
1192 mpts->mpts_flags |= MPTSF_FASTJ_REQD;
1193 mpts->mpts_rel_seq = 1;
1195 mpts->mpts_sndnxt = mp_tp->mpt_snduna;
1208 mpts->mpts_connid = mpte->mpte_connid_last;
1209 VERIFY(mpts->mpts_connid != CONNID_ANY &&
1210 mpts->mpts_connid != CONNID_ALL);
1220 error = inp_bindif(sotoinpcb(so), ifscope, &mpts->mpts_outif);
1223 (void) mptcp_subflow_soclose(mpts, so);
1226 VERIFY(mpts->mpts_outif != NULL);
1227 mpts->mpts_flags |= MPTSF_BOUND_IF;
1232 mpts->mpts_outif->if_xname,
1233 ifscope, mpts->mpts_connid));
1263 (void) mptcp_subflow_soclose(mpts, so);
1266 mpts->mpts_flags |= mpts_flags;
1277 ntohs(lport), mpts->mpts_connid));
1286 TAILQ_INSERT_TAIL(&mpte->mpte_subflows, mpts, mpts_entry);
1289 atomic_bitset_32(&mpts->mpts_flags, MPTSF_ATTACHED);
1290 mpts->mpts_mpte = mpte;
1291 mpts->mpts_socket = so;
1292 MPTS_ADDREF_LOCKED(mpts); /* for being in MPTCP subflow list */
1293 MPTS_ADDREF_LOCKED(mpts); /* for subflow socket */
1297 (void) sock_setupcalls(so, mptcp_subflow_rupcall, mpts,
1298 mptcp_subflow_wupcall, mpts);
1305 (void) sock_catchevents(so, mptcp_subflow_eupcall, mpts,
1316 VERIFY(!(mpts->mpts_flags &
1339 mpts->mpts_flags |= MPTSF_CONNECT_PENDING;
1343 (IFNET_IS_CELLULAR(mpts->mpts_outif))) {
1344 mpts->mpts_flags |= MPTSF_CONNECT_PENDING;
1350 mpts->mpts_mpcr = mpcr;
1351 mpts->mpts_flags |= MPTSF_CONNECTING;
1365 mpts->mpts_connid,
1366 ((mpts->mpts_flags & MPTSF_CONNECT_PENDING) ?
1371 if (!(mpts->mpts_flags & MPTSF_CONNECT_PENDING))
1372 error = mptcp_subflow_soconnectx(mpte, mpts);
1375 MPTS_UNLOCK(mpts);
1390 mptcp_subflow_del(struct mptses *mpte, struct mptsub *mpts, boolean_t close)
1397 MPTS_LOCK(mpts);
1398 so = mpts->mpts_socket;
1401 if (close && !((mpts->mpts_flags & MPTSF_DELETEOK) &&
1402 (mpts->mpts_flags & MPTSF_USER_DISCONNECT))) {
1403 MPTS_UNLOCK(mpts);
1405 mpts->mpts_soerror, mpts->mpts_flags));
1413 mp_so->so_retaincnt, mpts->mpts_connid,
1414 (close ? "YES" : "NO"), mpts->mpts_soerror,
1415 mpts->mpts_flags));
1417 VERIFY(mpts->mpts_mpte == mpte);
1418 VERIFY(mpts->mpts_connid != CONNID_ANY &&
1419 mpts->mpts_connid != CONNID_ALL);
1421 VERIFY(mpts->mpts_flags & MPTSF_ATTACHED);
1422 atomic_bitclear_32(&mpts->mpts_flags, MPTSF_ATTACHED);
1423 TAILQ_REMOVE(&mpte->mpte_subflows, mpts, mpts_entry);
1426 if (mpte->mpte_active_sub == mpts)
1439 (void) mptcp_subflow_soclose(mpts, so);
1443 mpts->mpts_mpte = NULL;
1444 mpts->mpts_socket = NULL;
1445 MPTS_UNLOCK(mpts);
1447 MPTS_REMREF(mpts); /* for MPTCP subflow list */
1448 MPTS_REMREF(mpts); /* for subflow socket */
1457 mptcp_subflow_disconnect(struct mptses *mpte, struct mptsub *mpts,
1465 MPTS_LOCK_ASSERT_HELD(mpts);
1467 VERIFY(mpts->mpts_mpte == mpte);
1468 VERIFY(mpts->mpts_socket != NULL);
1469 VERIFY(mpts->mpts_connid != CONNID_ANY &&
1470 mpts->mpts_connid != CONNID_ALL);
1472 if (mpts->mpts_flags & (MPTSF_DISCONNECTING|MPTSF_DISCONNECTED))
1475 mpts->mpts_flags |= MPTSF_DISCONNECTING;
1484 mpts->mpts_flags |= MPTSF_DELETEOK;
1486 so = mpts->mpts_socket;
1497 __func__, mpts->mpts_connid, send_dfin,
1514 mptcp_subflow_eupcall(so, mpts, SO_FILT_HINT_DISCONNECTED);
1531 struct mptsub *mpts = arg;
1532 struct mptses *mpte = mpts->mpts_mpte;
1553 mptcp_subflow_input(struct mptses *mpte, struct mptsub *mpts)
1561 MPTS_LOCK_ASSERT_HELD(mpts);
1564 struct mptsub *, mpts);
1566 if (!(mpts->mpts_flags & MPTSF_CONNECTED))
1569 so = mpts->mpts_socket;
1574 __func__, mpts->mpts_connid, error));
1575 MPTS_UNLOCK(mpts);
1576 mpts_alt = mptcp_get_subflow(mpte, mpts);
1580 mpts);
1587 mpts->mpts_connid));
1593 __func__, mpts->mpts_connid));
1597 MPTS_LOCK(mpts);
1600 __func__, mpts->mpts_connid));
1604 if ((mpts->mpts_flags & MPTSF_MP_DEGRADED) &&
1605 (!(mpts->mpts_flags & MPTSF_ACTIVE))) {
1618 MPTS_UNLOCK(mpts);
1620 MPTS_LOCK(mpts);
1638 struct mptsub *mpts = arg;
1639 struct mptses *mpte = mpts->mpts_mpte;
1661 mptcp_subflow_output(struct mptses *mpte, struct mptsub *mpts)
1674 MPTS_LOCK_ASSERT_HELD(mpts);
1676 so = mpts->mpts_socket;
1679 struct mptsub *, mpts);
1682 if (mpts->mpts_flags & MPTSF_SUSPENDED) {
1685 (u_int64_t)VM_KERNEL_ADDRPERM(mp_so), mpts->mpts_connid));
1690 if (!(mpts->mpts_flags & MPTSF_MP_CAPABLE) &&
1691 !(mpts->mpts_flags & MPTSF_MP_DEGRADED) &&
1692 !(mpts->mpts_flags & MPTSF_FASTJ_SEND)) {
1695 (u_int64_t)VM_KERNEL_ADDRPERM(mp_so), mpts->mpts_connid));
1758 if ((mpts->mpts_flags & MPTSF_MP_DEGRADED) &&
1767 if ((mpts->mpts_flags & MPTSF_MP_DEGRADED) &&
1772 mpts->mpts_sndnxt = mp_tp->mpt_dsn_at_csum_fail;
1779 if (MPTCP_SEQ_LT(mpts->mpts_sndnxt, mp_tp->mpt_snduna)) {
1780 mpts->mpts_sndnxt = mp_tp->mpt_snduna;
1785 if (mpts->mpts_rel_seq == 0)
1786 mpts->mpts_rel_seq = 1;
1805 if (MPTCP_SEQ_LT(mpts->mpts_sndnxt, mp_tp->mpt_sndmax)) {
1806 off = mpts->mpts_sndnxt - mp_tp->mpt_snduna;
1823 if ((mpts->mpts_connid == 2) || (mpts->mpts_flags & MPTSF_MP_DEGRADED))
1827 mp_tp->mpt_snduna, off, mpts->mpts_connid,
1828 mpts->mpts_sndnxt));
1861 m->m_pkthdr.mp_rseq = mpts->mpts_rel_seq;
1863 mpts->mpts_rel_seq += mlen;
1874 if (mpts->mpts_lastmap.mptsl_dsn +
1875 mpts->mpts_lastmap.mptsl_len == mpt_dsn) {
1876 mpts->mpts_lastmap.mptsl_len += tot_sent;
1877 } else if (MPTCP_SEQ_LT((mpts->mpts_lastmap.mptsl_dsn +
1878 mpts->mpts_lastmap.mptsl_len), mpt_dsn)) {
1881 mpts->mpts_lastmap.mptsl_dsn = m->m_pkthdr.mp_dsn;
1882 mpts->mpts_lastmap.mptsl_sseq = m->m_pkthdr.mp_rseq;
1883 mpts->mpts_lastmap.mptsl_len = m->m_pkthdr.mp_rlen;
1893 if (mpts->mpts_flags & MPTSF_FASTJ_SEND) {
1903 struct mptses *, mpte, struct mptsub *, mpts,
1908 mpts->mpts_sndnxt += tot_sent;
1910 if (MPTCP_SEQ_LT(mp_tp->mpt_sndnxt, mpts->mpts_sndnxt)) {
1911 if (MPTCP_DATASEQ_HIGH32(mpts->mpts_sndnxt) >
1914 mp_tp->mpt_sndnxt = mpts->mpts_sndnxt;
1920 if (mpts->mpts_flags & MPTSF_FASTJ_SEND) {
1922 mpts->mpts_flags &= ~MPTSF_FASTJ_SEND;
1925 if ((mpts->mpts_connid >= 2) ||
1926 (mpts->mpts_flags & MPTSF_MP_DEGRADED))
1928 __func__, mpts->mpts_connid, (int)tot_sent,
1932 __func__, mpts->mpts_connid, error, tot_sent));
1952 struct mptsub *mpts = arg;
1953 struct mptses *mpte = mpts->mpts_mpte;
1958 atomic_bitset_32(&mpts->mpts_evctl, events);
1969 mptcp_subflow_events(struct mptses *mpte, struct mptsub *mpts)
1975 MPTS_LOCK_ASSERT_HELD(mpts);
1978 if ((events = mpts->mpts_evctl) == 0)
1992 struct mptsub *, mpts, uint32_t, events);
1995 mpts->mpts_connid, events, SO_FILT_HINT_BITS));
1998 ev_ret_t error = mptcp_subflow_mpcantrcvmore_ev(mpte, mpts);
2003 ev_ret_t error = mptcp_subflow_failover_ev(mpte, mpts);
2008 ev_ret_t error = mptcp_subflow_connreset_ev(mpte, mpts);
2013 ev_ret_t error = mptcp_subflow_mustrst_ev(mpte, mpts);
2018 ev_ret_t error = mptcp_subflow_cantrcvmore_ev(mpte, mpts);
2023 ev_ret_t error = mptcp_subflow_cantsendmore_ev(mpte, mpts);
2028 ev_ret_t error = mptcp_subflow_timeout_ev(mpte, mpts);
2033 ev_ret_t error = mptcp_subflow_nosrcaddr_ev(mpte, mpts);
2038 ev_ret_t error = mptcp_subflow_ifdenied_ev(mpte, mpts);
2043 ev_ret_t error = mptcp_subflow_suspend_ev(mpte, mpts);
2048 ev_ret_t error = mptcp_subflow_resume_ev(mpte, mpts);
2053 ev_ret_t error = mptcp_subflow_connected_ev(mpte, mpts);
2058 ev_ret_t error = mptcp_subflow_mpstatus_ev(mpte, mpts);
2063 ev_ret_t error = mptcp_deleteok_ev(mpte, mpts);
2068 ev_ret_t error = mptcp_subflow_disconnected_ev(mpte, mpts);
2073 ev_ret_t error = mptcp_fastjoin_ev(mpte, mpts);
2086 __func__, mpts->mpts_connid,
2091 atomic_bitclear_32(&mpts->mpts_evctl, save_events);
2100 mptcp_subflow_connreset_ev(struct mptses *mpte, struct mptsub *mpts)
2107 MPTS_LOCK_ASSERT_HELD(mpts);
2111 so = mpts->mpts_socket;
2113 linger = (!(mpts->mpts_flags & MPTSF_DELETEOK) &&
2117 mpts->mpts_connid, (linger ? "YES" : "NO")));
2127 mptcp_subflow_disconnect(mpte, mpts, !linger);
2131 mpts->mpts_soerror = mp_so->so_error = ECONNREFUSED;
2133 mpts->mpts_soerror = mp_so->so_error = ECONNRESET;
2135 MPTS_UNLOCK(mpts);
2137 MPTS_LOCK(mpts);
2154 mptcp_subflow_cantrcvmore_ev(struct mptses *mpte, struct mptsub *mpts)
2159 MPTS_LOCK_ASSERT_HELD(mpts);
2161 so = mpts->mpts_socket;
2163 mptcplog((LOG_DEBUG, "%s: cid %d\n", __func__, mpts->mpts_connid));
2179 mptcp_subflow_cantsendmore_ev(struct mptses *mpte, struct mptsub *mpts)
2184 MPTS_LOCK_ASSERT_HELD(mpts);
2186 so = mpts->mpts_socket;
2188 mptcplog((LOG_DEBUG, "%s: cid %d\n", __func__, mpts->mpts_connid));
2196 mptcp_subflow_timeout_ev(struct mptses *mpte, struct mptsub *mpts)
2203 MPTS_LOCK_ASSERT_HELD(mpts);
2207 so = mpts->mpts_socket;
2209 linger = (!(mpts->mpts_flags & MPTSF_DELETEOK) &&
2213 mpts->mpts_connid, (linger ? "YES" : "NO")));
2215 if (mpts->mpts_soerror == 0)
2216 mpts->mpts_soerror = ETIMEDOUT;
2225 mptcp_subflow_disconnect(mpte, mpts, !linger);
2245 mptcp_subflow_nosrcaddr_ev(struct mptses *mpte, struct mptsub *mpts)
2253 MPTS_LOCK_ASSERT_HELD(mpts);
2258 so = mpts->mpts_socket;
2269 linger = (!(mpts->mpts_flags & MPTSF_DELETEOK) &&
2273 mpts->mpts_connid, (linger ? "YES" : "NO")));
2275 if (mpts->mpts_soerror == 0)
2276 mpts->mpts_soerror = EADDRNOTAVAIL;
2288 mptcp_subflow_disconnect(mpte, mpts, !linger);
2310 mptcp_subflow_mpcantrcvmore_ev(struct mptses *mpte, struct mptsub *mpts)
2316 MPTS_LOCK_ASSERT_HELD(mpts);
2318 so = mpts->mpts_socket;
2321 mptcplog((LOG_DEBUG, "%s: cid %d\n", __func__, mpts->mpts_connid));
2332 MPTS_UNLOCK(mpts);
2334 MPTS_LOCK(mpts);
2345 mptcp_subflow_failover_ev(struct mptses *mpte, struct mptsub *mpts)
2353 MPTS_LOCK_ASSERT_HELD(mpts);
2358 MPTS_UNLOCK(mpts);
2359 mpts_alt = mptcp_get_subflow(mpte, mpts);
2368 mpts_alt = mptcp_get_pending_subflow(mpte, mpts);
2376 MPTS_LOCK(mpts);
2417 mpts->mpts_connid, mpts_alt->mpts_connid));
2421 MPTS_LOCK(mpts);
2423 mpts->mpts_flags |= MPTSF_FAILINGOVER;
2424 mpts->mpts_flags &= ~MPTSF_ACTIVE;
2427 __func__, mpts->mpts_connid));
2429 so = mpts->mpts_socket;
2434 MPTS_LOCK_ASSERT_HELD(mpts);
2442 mptcp_subflow_ifdenied_ev(struct mptses *mpte, struct mptsub *mpts)
2449 MPTS_LOCK_ASSERT_HELD(mpts);
2453 so = mpts->mpts_socket;
2455 linger = (!(mpts->mpts_flags & MPTSF_DELETEOK) &&
2459 mpts->mpts_connid, (linger ? "YES" : "NO")));
2461 if (mpts->mpts_soerror == 0)
2462 mpts->mpts_soerror = EHOSTUNREACH;
2471 mptcp_subflow_disconnect(mpte, mpts, !linger);
2472 MPTS_UNLOCK(mpts);
2482 MPTS_LOCK(mpts);
2495 mptcp_subflow_suspend_ev(struct mptses *mpte, struct mptsub *mpts)
2500 MPTS_LOCK_ASSERT_HELD(mpts);
2502 so = mpts->mpts_socket;
2505 mpts->mpts_flags |= MPTSF_SUSPENDED;
2508 mpts->mpts_connid));
2517 mptcp_subflow_resume_ev(struct mptses *mpte, struct mptsub *mpts)
2522 MPTS_LOCK_ASSERT_HELD(mpts);
2524 so = mpts->mpts_socket;
2527 mpts->mpts_flags &= ~MPTSF_SUSPENDED;
2529 mptcplog((LOG_DEBUG, "%s: cid %d\n", __func__, mpts->mpts_connid));
2538 mptcp_subflow_connected_ev(struct mptses *mpte, struct mptsub *mpts)
2554 MPTS_LOCK_ASSERT_HELD(mpts);
2555 so = mpts->mpts_socket;
2556 af = mpts->mpts_family;
2558 if (mpts->mpts_flags & MPTSF_CONNECTED)
2561 if ((mpts->mpts_flags & MPTSF_DISCONNECTED) ||
2562 (mpts->mpts_flags & MPTSF_DISCONNECTING)) {
2567 __func__, mpts->mpts_connid));
2608 mpts->mpts_soerror = 0;
2609 mpts->mpts_flags &= ~MPTSF_CONNECTING;
2610 mpts->mpts_flags |= MPTSF_CONNECTED;
2612 mpts->mpts_flags |= MPTSF_MP_CAPABLE;
2614 VERIFY(mpts->mpts_dst_sl != NULL);
2615 dst_se = TAILQ_FIRST(&mpts->mpts_dst_sl->sl_head);
2619 VERIFY(mpts->mpts_src_sl != NULL);
2620 src_se = TAILQ_FIRST(&mpts->mpts_src_sl->sl_head);
2635 if ((mpts->mpts_flags & MPTSF_BOUND_IP) &&
2640 mpts->mpts_connid, inet_ntop(AF_INET,
2660 if ((mpts->mpts_flags & MPTSF_BOUND_IP) &&
2665 mpts->mpts_connid, inet_ntop(AF_INET6,
2683 __func__, mpts->mpts_connid, error));
2688 if (mpts->mpts_flags & MPTSF_BOUND_IF) {
2689 VERIFY(mpts->mpts_outif != NULL);
2690 if (mpts->mpts_outif != outifp) {
2692 "(expected %s)\n", __func__, mpts->mpts_connid,
2694 mpts->mpts_outif->if_xname));
2696 outifp = mpts->mpts_outif;
2699 mpts->mpts_outif = outifp;
2705 "is %s\n", __func__, mpts->mpts_connid, ((outifp != NULL) ?
2716 ((mpts->mpts_flags & MPTSF_MP_CAPABLE) ?
2719 mpok = (mpts->mpts_flags & MPTSF_MP_CAPABLE);
2720 MPTS_UNLOCK(mpts);
2739 mpte->mpte_associd = mpts->mpts_connid;
2747 mpts->mpts_connid, 1);
2751 MPTS_LOCK(mpts);
2754 mpts->mpts_rel_seq = 1;
2755 mpts->mpts_flags |= MPTSF_MPCAP_CTRSET;
2758 mpts->mpts_sndnxt = mp_tp->mpt_snduna;
2775 MPTS_LOCK(mpts);
2776 mpts->mpts_flags |= MPTSF_MPCAP_CTRSET;
2777 mpts->mpts_flags &= ~MPTSF_FASTJ_REQD;
2780 if (mpts->mpts_rel_seq == 0)
2781 mpts->mpts_rel_seq = 1;
2784 if (mpts->mpts_sndnxt == 0) {
2785 mpts->mpts_sndnxt = mp_tp->mpt_snduna;
2788 mptcp_output_needed(mpte, mpts);
2791 MPTS_LOCK(mpts);
2794 MPTS_LOCK_ASSERT_HELD(mpts);
2803 mptcp_subflow_disconnected_ev(struct mptses *mpte, struct mptsub *mpts)
2810 MPTS_LOCK_ASSERT_HELD(mpts);
2814 so = mpts->mpts_socket;
2816 linger = (!(mpts->mpts_flags & MPTSF_DELETEOK) &&
2820 mpts->mpts_connid, (linger ? "YES" : "NO")));
2822 if (mpts->mpts_flags & MPTSF_DISCONNECTED)
2829 mpts->mpts_flags &= ~(MPTSF_CONNECTING|MPTSF_CONNECT_PENDING|
2833 mpts->mpts_flags |= MPTSF_DISCONNECTED;
2841 MPTS_UNLOCK(mpts);
2845 if (mpts->mpts_flags & MPTSF_MPCAP_CTRSET) {
2847 if (mpte->mpte_active_sub == mpts) {
2852 mpts->mpts_flags &= ~MPTSF_MPCAP_CTRSET;
2863 MPTS_LOCK(mpts);
2878 mptcp_subflow_mpstatus_ev(struct mptses *mpte, struct mptsub *mpts)
2889 MPTS_LOCK_ASSERT_HELD(mpts);
2890 so = mpts->mpts_socket;
2896 mpts->mpts_flags |= MPTSF_MP_CAPABLE;
2898 mpts->mpts_flags &= ~MPTSF_MP_CAPABLE;
2901 if (mpts->mpts_flags & MPTSF_MP_DEGRADED)
2903 mpts->mpts_flags |= MPTSF_MP_DEGRADED;
2906 mpts->mpts_flags &= ~MPTSF_MP_DEGRADED;
2909 mpts->mpts_flags |= MPTSF_MP_READY;
2911 mpts->mpts_flags &= ~MPTSF_MP_READY;
2913 if (mpts->mpts_flags & MPTSF_MP_DEGRADED) {
2921 } else if (mpts->mpts_flags & MPTSF_MP_READY) {
2929 mp_tp->mpt_flags, MPTCPF_BITS, mpts->mpts_connid,
2930 mpts->mpts_flags, MPTSF_BITS));
2941 mptcp_subflow_mustrst_ev(struct mptses *mpte, struct mptsub *mpts)
2949 MPTS_LOCK_ASSERT_HELD(mpts);
2953 so = mpts->mpts_socket;
2955 linger = (!(mpts->mpts_flags & MPTSF_DELETEOK) &&
2958 if (mpts->mpts_soerror == 0)
2959 mpts->mpts_soerror = ECONNABORTED;
2987 so, mpts->mpts_connid));
2990 mptcp_subflow_disconnect(mpte, mpts, !linger);
2991 MPTS_UNLOCK(mpts);
3003 MPTS_LOCK(mpts);
3012 mptcp_fastjoin_ev(struct mptses *mpte, struct mptsub *mpts)
3015 MPTS_LOCK_ASSERT_HELD(mpts);
3021 __func__, mp_tp->mpt_snduna, mpts->mpts_sndnxt));
3022 mpte->mpte_active_sub = mpts;
3023 mpts->mpts_flags |= (MPTSF_FASTJ_SEND | MPTSF_ACTIVE);
3027 * then mpts->mpts_sndnxt is initialized to mp_tp->mpt_snduna
3028 * and further mpts->mpts_sndnxt is incremented by len copied.
3030 if (mpts->mpts_sndnxt == 0) {
3031 mpts->mpts_sndnxt = mp_tp->mpt_snduna;
3032 mpts->mpts_rel_seq = 1;
3041 mptcp_deleteok_ev(struct mptses *mpte, struct mptsub *mpts)
3044 MPTS_LOCK_ASSERT_HELD(mpts);
3046 mptcplog((LOG_DEBUG, "%s cid %d\n", __func__, mpts->mpts_connid));
3048 mpts->mpts_flags |= MPTSF_DELETEOK;
3049 if (mpts->mpts_flags & MPTSF_DISCONNECTED)
3084 mptcp_subflow_addref(struct mptsub *mpts, int locked)
3087 MPTS_LOCK(mpts);
3089 MPTS_LOCK_ASSERT_HELD(mpts);
3091 if (++mpts->mpts_refcnt == 0) {
3092 panic("%s: mpts %p wraparound refcnt\n", __func__, mpts);
3096 MPTS_UNLOCK(mpts);
3103 mptcp_subflow_remref(struct mptsub *mpts)
3105 MPTS_LOCK(mpts);
3106 if (mpts->mpts_refcnt == 0) {
3107 panic("%s: mpts %p negative refcnt\n", __func__, mpts);
3110 if (--mpts->mpts_refcnt > 0) {
3111 MPTS_UNLOCK(mpts);
3115 mptcp_subflow_free(mpts);
3253 struct mptsub *mpts, *tmpts;
3276 TAILQ_FOREACH_SAFE(mpts,
3278 MPTS_LOCK(mpts);
3279 mpts->mpts_flags |= MPTSF_DELETEOK;
3280 if (mpts->mpts_soerror == 0)
3281 mpts->mpts_soerror = ETIMEDOUT;
3282 mptcp_subflow_eupcall(mpts->mpts_socket,
3283 mpts, SO_FILT_HINT_DISCONNECTED);
3284 MPTS_UNLOCK(mpts);
3366 struct mptsub *mpts, *tmpts;
3387 TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
3388 MPTS_LOCK(mpts);
3389 mpts->mpts_flags |= MPTSF_USER_DISCONNECT;
3390 mptcp_subflow_disconnect(mpte, mpts, TRUE);
3391 MPTS_UNLOCK(mpts);
3392 mptcp_subflow_del(mpte, mpts, TRUE);
3452 struct mptsub *mpts, *tmpts;
3461 TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
3464 MPTS_LOCK(mpts);
3465 MPTS_ADDREF_LOCKED(mpts); /* for us */
3468 mptcp_update_last_owner(mpts, mp_so);
3470 mptcp_subflow_input(mpte, mpts);
3471 ret = mptcp_subflow_events(mpte, mpts);
3473 if (mpts->mpts_flags & MPTSF_ACTIVE) {
3475 mpts->mpts_connid));
3476 (void) mptcp_subflow_output(mpte, mpts);
3486 mptcp_subflow_disconnect(mpte, mpts, FALSE);
3487 MPTS_UNLOCK(mpts);
3497 mptcp_subflow_del(mpte, mpts, TRUE);
3506 MPTS_REMREF(mpts); /* ours */
3519 TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
3520 MPTS_LOCK(mpts);
3526 if (mpts->mpts_flags & MPTSF_MP_DEGRADED) {
3527 MPTS_UNLOCK(mpts);
3531 mpts->mpts_flags |= MPTSF_MP_DEGRADED;
3533 if (mpts->mpts_flags & (MPTSF_DISCONNECTING|
3535 MPTS_UNLOCK(mpts);
3538 so = mpts->mpts_socket;
3555 if (mpts->mpts_flags & MPTSF_ACTIVE) {
3557 MPTS_UNLOCK(mpts);
3571 (IFNET_IS_CELLULAR(mpts->mpts_outif))) {
3572 MPTS_UNLOCK(mpts);
3582 if (mpts->mpts_flags & MPTSF_CONNECT_PENDING) {
3583 (void) mptcp_subflow_soconnectx(mpte, mpts);
3586 MPTS_UNLOCK(mpts);
4825 mptcp_update_last_owner(struct mptsub *mpts, struct socket *parent_mpso)
4827 struct socket *subflow_so = mpts->mpts_socket;
4829 MPTS_LOCK_ASSERT_HELD(mpts);
4843 fill_mptcp_subflow(struct socket *so, mptcp_flow_t *flow, struct mptsub *mpts)
4871 flow->flow_flags = mpts->mpts_flags;
4872 flow->flow_cid = mpts->mpts_connid;
4884 struct mptsub *mpts;
4934 TAILQ_FOREACH(mpts, &mpte->mpte_subflows, mpts_entry) {
4935 MPTS_LOCK(mpts);
4936 so = mpts->mpts_socket;
4938 fill_mptcp_subflow(so, &flows[f], mpts);
4940 MPTS_UNLOCK(mpts);
5064 struct mptsub *mpts;
5094 TAILQ_FOREACH(mpts, &mpte->mpte_subflows, mpts_entry) {
5096 MPTS_LOCK(mpts);
5097 if (mpts->mpts_flags & MPTSF_ACTIVE) {
5098 struct socket *subf_so = mpts->mpts_socket;
5113 MPTS_UNLOCK(mpts);
5116 MPTS_UNLOCK(mpts);