- MPTS_EVRET_DELETE = 1, /* delete this subflow */
- MPTS_EVRET_OK = 2, /* OK */
- MPTS_EVRET_CONNECT_PENDING = 3, /* resume pended connects */
- MPTS_EVRET_DISCONNECT_FALLBACK = 4, /* abort all but preferred */
+ MPTS_EVRET_DELETE = 1, /* delete this subflow */
+ MPTS_EVRET_OK = 2, /* OK */
+ MPTS_EVRET_CONNECT_PENDING = 3, /* resume pended connects */
+ MPTS_EVRET_DISCONNECT_FALLBACK = 4, /* abort all but preferred */
-SYSCTL_NODE(_net_inet, OID_AUTO, mptcp, CTLFLAG_RW|CTLFLAG_LOCKED, 0, "MPTCP");
+SYSCTL_NODE(_net_inet, OID_AUTO, mptcp, CTLFLAG_RW | CTLFLAG_LOCKED, 0, "MPTCP");
-uint32_t mptcp_dbg_area = 31; /* more noise if greater than 1 */
-SYSCTL_UINT(_net_inet_mptcp, OID_AUTO, dbg_area, CTLFLAG_RW|CTLFLAG_LOCKED,
- &mptcp_dbg_area, 0, "MPTCP debug area");
+uint32_t mptcp_dbg_area = 31; /* more noise if greater than 1 */
+SYSCTL_UINT(_net_inet_mptcp, OID_AUTO, dbg_area, CTLFLAG_RW | CTLFLAG_LOCKED,
+ &mptcp_dbg_area, 0, "MPTCP debug area");
uint32_t mptcp_dbg_level = 1;
SYSCTL_INT(_net_inet_mptcp, OID_AUTO, dbg_level, CTLFLAG_RW | CTLFLAG_LOCKED,
uint32_t mptcp_dbg_level = 1;
SYSCTL_INT(_net_inet_mptcp, OID_AUTO, dbg_level, CTLFLAG_RW | CTLFLAG_LOCKED,
-SYSCTL_UINT(_net_inet_mptcp, OID_AUTO, pcbcount, CTLFLAG_RD|CTLFLAG_LOCKED,
- &mtcbinfo.mppi_count, 0, "Number of active PCBs");
+SYSCTL_UINT(_net_inet_mptcp, OID_AUTO, pcbcount, CTLFLAG_RD | CTLFLAG_LOCKED,
+ &mtcbinfo.mppi_count, 0, "Number of active PCBs");
static int mptcp_alternate_port = 0;
SYSCTL_INT(_net_inet_mptcp, OID_AUTO, alternate_port, CTLFLAG_RW | CTLFLAG_LOCKED,
static int mptcp_alternate_port = 0;
SYSCTL_INT(_net_inet_mptcp, OID_AUTO, alternate_port, CTLFLAG_RW | CTLFLAG_LOCKED,
mptcp_subflow_protosw.pr_entry.tqe_next = NULL;
mptcp_subflow_protosw.pr_entry.tqe_prev = NULL;
mptcp_subflow_protosw.pr_usrreqs = &mptcp_subflow_usrreqs;
mptcp_subflow_protosw.pr_entry.tqe_next = NULL;
mptcp_subflow_protosw.pr_entry.tqe_prev = NULL;
mptcp_subflow_protosw.pr_usrreqs = &mptcp_subflow_usrreqs;
mptcp_subflow_protosw6.pr_entry.tqe_next = NULL;
mptcp_subflow_protosw6.pr_entry.tqe_prev = NULL;
mptcp_subflow_protosw6.pr_usrreqs = &mptcp_subflow_usrreqs6;
mptcp_subflow_protosw6.pr_entry.tqe_next = NULL;
mptcp_subflow_protosw6.pr_entry.tqe_prev = NULL;
mptcp_subflow_protosw6.pr_usrreqs = &mptcp_subflow_usrreqs6;
if ((mtcbinfo.mppi_zone = zinit(mtcbinfo.mppi_size,
1024 * mtcbinfo.mppi_size, 8192, "mptcb")) == NULL) {
panic("%s: unable to allocate MPTCP PCB zone\n", __func__);
if ((mtcbinfo.mppi_zone = zinit(mtcbinfo.mppi_size,
1024 * mtcbinfo.mppi_size, 8192, "mptcb")) == NULL) {
panic("%s: unable to allocate MPTCP PCB zone\n", __func__);
if ((mptsub_zone = zinit(mptsub_zone_size, 1024 * mptsub_zone_size,
8192, "mptsub")) == NULL) {
panic("%s: unable to allocate MPTCP subflow zone\n", __func__);
if ((mptsub_zone = zinit(mptsub_zone_size, 1024 * mptsub_zone_size,
8192, "mptsub")) == NULL) {
panic("%s: unable to allocate MPTCP subflow zone\n", __func__);
zone_change(mptsub_zone, Z_CALLERACCT, FALSE);
zone_change(mptsub_zone, Z_EXPAND, TRUE);
zone_change(mptsub_zone, Z_CALLERACCT, FALSE);
zone_change(mptsub_zone, Z_EXPAND, TRUE);
if ((mptopt_zone = zinit(mptopt_zone_size, 128 * mptopt_zone_size,
1024, "mptopt")) == NULL) {
panic("%s: unable to allocate MPTCP option zone\n", __func__);
if ((mptopt_zone = zinit(mptopt_zone_size, 128 * mptopt_zone_size,
1024, "mptopt")) == NULL) {
panic("%s: unable to allocate MPTCP option zone\n", __func__);
zone_change(mptopt_zone, Z_CALLERACCT, FALSE);
zone_change(mptopt_zone, Z_EXPAND, TRUE);
zone_change(mptopt_zone, Z_CALLERACCT, FALSE);
zone_change(mptopt_zone, Z_EXPAND, TRUE);
if ((mpt_subauth_zone = zinit(mpt_subauth_entry_size,
1024 * mpt_subauth_entry_size, 8192, "mptauth")) == NULL) {
panic("%s: unable to allocate MPTCP address auth zone \n",
if ((mpt_subauth_zone = zinit(mpt_subauth_entry_size,
1024 * mpt_subauth_entry_size, 8192, "mptauth")) == NULL) {
panic("%s: unable to allocate MPTCP address auth zone \n",
- return (mp_tp->mpt_state >= MPTCPS_ESTABLISHED &&
- mp_tp->mpt_state < MPTCPS_FIN_WAIT_1 &&
- !(mp_tp->mpt_flags & MPTCPF_FALLBACK_TO_TCP));
+ return mp_tp->mpt_state >= MPTCPS_ESTABLISHED &&
+ mp_tp->mpt_state < MPTCPS_FIN_WAIT_1 &&
+ !(mp_tp->mpt_flags & MPTCPF_FALLBACK_TO_TCP);
{
static const struct in6_addr well_known_prefix = {
.__u6_addr.__u6_addr8 = {0x00, 0x64, 0xff, 0x9b, 0x00, 0x00,
{
static const struct in6_addr well_known_prefix = {
.__u6_addr.__u6_addr8 = {0x00, 0x64, 0xff, 0x9b, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00},
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00},
IN_6TO4_RELAY_ANYCAST(ntohl(addrv4->s_addr)) || // 192.88.99.0/24 6to4 Relay Anycast
IN_MULTICAST(ntohl(addrv4->s_addr)) || // 224.0.0.0/4 Multicast
INADDR_BROADCAST == addrv4->s_addr) { // 255.255.255.255/32 Limited Broadcast
IN_6TO4_RELAY_ANYCAST(ntohl(addrv4->s_addr)) || // 192.88.99.0/24 6to4 Relay Anycast
IN_MULTICAST(ntohl(addrv4->s_addr)) || // 224.0.0.0/4 Multicast
INADDR_BROADCAST == addrv4->s_addr) { // 255.255.255.255/32 Limited Broadcast
}
/* Check for the well-known prefix */
if (len == NAT64_PREFIX_LEN_96 &&
IN6_ARE_ADDR_EQUAL(addr, &well_known_prefix)) {
if (IN_PRIVATE(ntohl(addrv4->s_addr)) || // 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 Private-Use
}
/* Check for the well-known prefix */
if (len == NAT64_PREFIX_LEN_96 &&
IN6_ARE_ADDR_EQUAL(addr, &well_known_prefix)) {
if (IN_PRIVATE(ntohl(addrv4->s_addr)) || // 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 Private-Use
- case NAT64_PREFIX_LEN_96:
- memcpy(ptr + 12, ptrv4, 4);
- break;
- case NAT64_PREFIX_LEN_64:
- memcpy(ptr + 9, ptrv4, 4);
- break;
- case NAT64_PREFIX_LEN_56:
- memcpy(ptr + 7, ptrv4, 1);
- memcpy(ptr + 9, ptrv4 + 1, 3);
- break;
- case NAT64_PREFIX_LEN_48:
- memcpy(ptr + 6, ptrv4, 2);
- memcpy(ptr + 9, ptrv4 + 2, 2);
- break;
- case NAT64_PREFIX_LEN_40:
- memcpy(ptr + 5, ptrv4, 3);
- memcpy(ptr + 9, ptrv4 + 3, 1);
- break;
- case NAT64_PREFIX_LEN_32:
- memcpy(ptr + 4, ptrv4, 4);
- break;
- default:
- panic("NAT64-prefix len is wrong: %u\n", len);
+ case NAT64_PREFIX_LEN_96:
+ memcpy(ptr + 12, ptrv4, 4);
+ break;
+ case NAT64_PREFIX_LEN_64:
+ memcpy(ptr + 9, ptrv4, 4);
+ break;
+ case NAT64_PREFIX_LEN_56:
+ memcpy(ptr + 7, ptrv4, 1);
+ memcpy(ptr + 9, ptrv4 + 1, 3);
+ break;
+ case NAT64_PREFIX_LEN_48:
+ memcpy(ptr + 6, ptrv4, 2);
+ memcpy(ptr + 9, ptrv4 + 2, 2);
+ break;
+ case NAT64_PREFIX_LEN_40:
+ memcpy(ptr + 5, ptrv4, 3);
+ memcpy(ptr + 9, ptrv4 + 3, 1);
+ break;
+ case NAT64_PREFIX_LEN_32:
+ memcpy(ptr + 4, ptrv4, 4);
+ break;
+ default:
+ panic("NAT64-prefix len is wrong: %u\n", len);
uuid_unparse_upper(mpsotomppcb(mp_so)->necp_client_uuid, uuidstr);
os_log_info(mptcp_log_handle, "%s asked irat to bringup cell for uuid %s, err %d\n",
uuid_unparse_upper(mpsotomppcb(mp_so)->necp_client_uuid, uuidstr);
os_log_info(mptcp_log_handle, "%s asked irat to bringup cell for uuid %s, err %d\n",
TAILQ_FOREACH(mpts, &mpte->mpte_subflows, mpts_entry) {
const struct ifnet *subifp = sotoinpcb(mpts->mpts_socket)->inp_last_outifp;
TAILQ_FOREACH(mpts, &mpte->mpte_subflows, mpts_entry) {
const struct ifnet *subifp = sotoinpcb(mpts->mpts_socket)->inp_last_outifp;
!IFNET_IS_CELLULAR(subifp) &&
!(mpts->mpts_flags & (MPTSF_DISCONNECTING | MPTSF_DISCONNECTED | MPTSF_CLOSE_REQD)) &&
(mptcp_is_wifi_unusable(mpte) == 0 ||
!IFNET_IS_CELLULAR(subifp) &&
!(mpts->mpts_flags & (MPTSF_DISCONNECTING | MPTSF_DISCONNECTED | MPTSF_CLOSE_REQD)) &&
(mptcp_is_wifi_unusable(mpte) == 0 ||
- __func__, mptcp_is_wifi_unusable(mpte),
- sototcpcb(mpts->mpts_socket)->t_rxtshift,
- !!(mpte->mpte_flags & MPTE_FIRSTPARTY),
- mptetoso(mpte)->so_snd.sb_cc,
- ifindex, subifp->if_index);
+ __func__, mptcp_is_wifi_unusable(mpte),
+ sototcpcb(mpts->mpts_socket)->t_rxtshift,
+ !!(mpte->mpte_flags & MPTE_FIRSTPARTY),
+ mptetoso(mpte)->so_snd.sb_cc,
+ ifindex, subifp->if_index);
- __func__, mpte->mpte_svctype, IFNET_IS_CELLULAR(subifp), mpts->mpts_flags,
- mptcp_is_wifi_unusable(mpte), sototcpcb(mpts->mpts_socket)->t_rxtshift,
- !!(mpte->mpte_flags & MPTE_FIRSTPARTY), mptetoso(mpte)->so_snd.sb_cc);
-
+ __func__, mpte->mpte_svctype, IFNET_IS_CELLULAR(subifp), mpts->mpts_flags,
+ mptcp_is_wifi_unusable(mpte), sototcpcb(mpts->mpts_socket)->t_rxtshift,
+ !!(mpte->mpte_flags & MPTE_FIRSTPARTY), mptetoso(mpte)->so_snd.sb_cc);
error = ifnet_get_nat64prefix(ifp, nat64prefixes);
if (error) {
os_log_error(mptcp_log_handle, "%s: no NAT64-prefix on itf %s, error %d\n",
error = ifnet_get_nat64prefix(ifp, nat64prefixes);
if (error) {
os_log_error(mptcp_log_handle, "%s: no NAT64-prefix on itf %s, error %d\n",
nat64pre.sin6_len = sizeof(struct sockaddr_in6);
nat64pre.sin6_family = AF_INET6;
nat64pre.sin6_port = mpte->__mpte_dst_v6.sin6_port;
nat64pre.sin6_len = sizeof(struct sockaddr_in6);
nat64pre.sin6_family = AF_INET6;
nat64pre.sin6_port = mpte->__mpte_dst_v6.sin6_port;
TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
const struct ifnet *ifp = sotoinpcb(mpts->mpts_socket)->inp_last_outifp;
/* Only remove cellular subflows */
TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
const struct ifnet *ifp = sotoinpcb(mpts->mpts_socket)->inp_last_outifp;
/* Only remove cellular subflows */
if (!mptcp_ok_to_create_subflows(mp_tp)) {
mptcplog((LOG_DEBUG, "%s: not a good time for subflows, state %u flags %#x",
if (!mptcp_ok_to_create_subflows(mp_tp)) {
mptcplog((LOG_DEBUG, "%s: not a good time for subflows, state %u flags %#x",
- __func__, mp_tp->mpt_state, mp_tp->mpt_flags),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, mp_tp->mpt_state, mp_tp->mpt_flags),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
VERIFY(mpo->mpo_flags & MPOF_ATTACHED);
mpo->mpo_flags &= ~MPOF_ATTACHED;
TAILQ_REMOVE(&mpte->mpte_sopts, mpo, mpo_entry);
VERIFY(mpo->mpo_flags & MPOF_ATTACHED);
mpo->mpo_flags &= ~MPOF_ATTACHED;
TAILQ_REMOVE(&mpte->mpte_sopts, mpo, mpo_entry);
mpte = tptomptp(sototcpcb(so))->mpt_mpte;
mpts = sototcpcb(so)->t_mpsub;
os_log_debug(mptcp_log_handle, "%s Subflow on itf %u became non-viable, power %u",
mpte = tptomptp(sototcpcb(so))->mpt_mpte;
mpts = sototcpcb(so)->t_mpsub;
os_log_debug(mptcp_log_handle, "%s Subflow on itf %u became non-viable, power %u",
mp_so = mptetoso(mpte);
p = proc_find(mp_so->last_pid);
if (p == PROC_NULL) {
mptcplog((LOG_ERR, "%s: Couldn't find proc for pid %u\n", __func__, mp_so->last_pid),
mp_so = mptetoso(mpte);
p = proc_find(mp_so->last_pid);
if (p == PROC_NULL) {
mptcplog((LOG_ERR, "%s: Couldn't find proc for pid %u\n", __func__, mp_so->last_pid),
*/
mpte_unlock(mpte);
error = socreate_internal(dom, so, SOCK_STREAM, IPPROTO_TCP, p,
*/
mpte_unlock(mpte);
error = socreate_internal(dom, so, SOCK_STREAM, IPPROTO_TCP, p,
- __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so), error),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_ERR);
+ __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so), error),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_ERR);
}
/* replay setsockopt(2) on the subflow sockets for eligible options */
TAILQ_FOREACH_SAFE(mpo, &mpte->mpte_sopts, mpo_entry, tmpo) {
int interim;
}
/* replay setsockopt(2) on the subflow sockets for eligible options */
TAILQ_FOREACH_SAFE(mpo, &mpte->mpte_sopts, mpo_entry, tmpo) {
int interim;
- "%s: ifindex %u dst %s:%d pended %u\n", __func__, mpts->mpts_ifscope,
- dbuf, dport, !!(mpts->mpts_flags & MPTSF_CONNECT_PENDING));
+ "%s: ifindex %u dst %s:%d pended %u\n", __func__, mpts->mpts_ifscope,
+ dbuf, dport, !!(mpts->mpts_flags & MPTSF_CONNECT_PENDING));
p = proc_find(mp_so->last_pid);
if (p == PROC_NULL) {
mptcplog((LOG_ERR, "%s: Couldn't find proc for pid %u\n", __func__, mp_so->last_pid),
p = proc_find(mp_so->last_pid);
if (p == PROC_NULL) {
mptcplog((LOG_ERR, "%s: Couldn't find proc for pid %u\n", __func__, mp_so->last_pid),
proc_rele(p);
DTRACE_MPTCP3(subflow__connect, struct mptses *, mpte,
struct mptsub *, mpts, int, error);
proc_rele(p);
DTRACE_MPTCP3(subflow__connect, struct mptses *, mpte,
struct mptsub *, mpts, int, error);
- __func__, error, mpts->mpts_ifscope),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_ERR);
+ __func__, error, mpts->mpts_ifscope),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_ERR);
+ }
/*
* For consistency with soreceive() semantics, we need to obey
* SB_LOCK in case some other code path has locked the buffer.
*/
error = sblock(&so->so_rcv, 0);
/*
* For consistency with soreceive() semantics, we need to obey
* SB_LOCK in case some other code path has locked the buffer.
*/
error = sblock(&so->so_rcv, 0);
/*
* Check if the full mapping is now present
*/
if ((int)so->so_rcv.sb_cc < dlen - dfin) {
mptcplog((LOG_INFO, "%s not enough data (%u) need %u for dsn %u\n",
/*
* Check if the full mapping is now present
*/
if ((int)so->so_rcv.sb_cc < dlen - dfin) {
mptcplog((LOG_INFO, "%s not enough data (%u) need %u for dsn %u\n",
- __func__, so->so_rcv.sb_cc, dlen, (uint32_t)dsn),
- MPTCP_RECEIVER_DBG, MPTCP_LOGLVL_LOG);
+ __func__, so->so_rcv.sb_cc, dlen, (uint32_t)dsn),
+ MPTCP_RECEIVER_DBG, MPTCP_LOGLVL_LOG);
if (mptcp_validate_csum(sototcpcb(so), start, dsn, sseq, orig_dlen, csum, dfin)) {
error = EIO;
if (mptcp_validate_csum(sototcpcb(so), start, dsn, sseq, orig_dlen, csum, dfin)) {
error = EIO;
DTRACE_MPTCP3(subflow__receive, struct socket *, so,
struct sockbuf *, &so->so_rcv, struct sockbuf *, &so->so_snd);
DTRACE_MPTCP3(subflow__receive, struct socket *, so,
struct sockbuf *, &so->so_rcv, struct sockbuf *, &so->so_snd);
OSIncrementAtomicLong(&p->p_stats->p_ru.ru_msgsnd);
error = sosendcheck(so, NULL, top->m_pkthdr.len, 0, 1, 0, &sblocked, NULL);
OSIncrementAtomicLong(&p->p_stats->p_ru.ru_msgsnd);
error = sosendcheck(so, NULL, top->m_pkthdr.len, 0, 1, 0, &sblocked, NULL);
error = (*so->so_proto->pr_usrreqs->pru_send)(so, 0, top, NULL, NULL, p);
top = NULL;
out:
error = (*so->so_proto->pr_usrreqs->pru_send)(so, 0, top, NULL, NULL, p);
top = NULL;
out:
mp_so = mptetoso(mpte);
mp_tp = mpte->mpte_mptcb;
if (mp_tp->mpt_state >= MPTCPS_CLOSE_WAIT) {
/* If the remote end sends Data FIN, refuse subflow adds */
mptcplog((LOG_ERR, "%s state %u\n", __func__, mp_tp->mpt_state),
mp_so = mptetoso(mpte);
mp_tp = mpte->mpte_mptcb;
if (mp_tp->mpt_state >= MPTCPS_CLOSE_WAIT) {
/* If the remote end sends Data FIN, refuse subflow adds */
mptcplog((LOG_ERR, "%s state %u\n", __func__, mp_tp->mpt_state),
mpts = mptcp_subflow_alloc();
if (mpts == NULL) {
mptcplog((LOG_ERR, "%s malloc subflow failed\n", __func__),
mpts = mptcp_subflow_alloc();
if (mpts == NULL) {
mptcplog((LOG_ERR, "%s malloc subflow failed\n", __func__),
- MALLOC(mpts->mpts_src, struct sockaddr *, len, M_SONAME,
+ if (src->sa_family == AF_INET &&
+ src->sa_len != sizeof(struct sockaddr_in)) {
+ error = EINVAL;
+ goto out_err;
+ }
+
+ if (src->sa_family == AF_INET6 &&
+ src->sa_len != sizeof(struct sockaddr_in6)) {
+ error = EINVAL;
+ goto out_err;
+ }
+
+ MALLOC(mpts->mpts_src, struct sockaddr *, src->sa_len, M_SONAME,
- bcopy(src, mpts->mpts_src, len);
+ bcopy(src, mpts->mpts_src, src->sa_len);
+ }
+
+ if (dst->sa_family != AF_INET && dst->sa_family != AF_INET6) {
+ error = EAFNOSUPPORT;
+ goto out_err;
+ }
+
+ if (dst->sa_family == AF_INET &&
+ dst->sa_len != sizeof(mpts->__mpts_dst_v4)) {
+ error = EINVAL;
+ goto out_err;
+ }
+
+ if (dst->sa_family == AF_INET6 &&
+ dst->sa_len != sizeof(mpts->__mpts_dst_v6)) {
+ error = EINVAL;
+ goto out_err;
/* register for subflow socket read/write events */
sock_setupcalls_locked(so, mptcp_subflow_rupcall, mpts, mptcp_subflow_wupcall, mpts, 1);
/* register for subflow socket read/write events */
sock_setupcalls_locked(so, mptcp_subflow_rupcall, mpts, mptcp_subflow_wupcall, mpts, 1);
inet_ntop(af, ((af == AF_INET) ?
(void *)&SIN(&mpts->mpts_dst)->sin_addr.s_addr :
(void *)&SIN6(&mpts->mpts_dst)->sin6_addr),
inet_ntop(af, ((af == AF_INET) ?
(void *)&SIN(&mpts->mpts_dst)->sin_addr.s_addr :
(void *)&SIN6(&mpts->mpts_dst)->sin6_addr),
VERIFY(mpts->mpts_mpte == mpte);
VERIFY(mpts->mpts_flags & MPTSF_ATTACHED);
VERIFY(mpte->mpte_numflows != 0);
VERIFY(mp_so->so_usecount > 0);
mptcplog((LOG_DEBUG, "%s: mp_so 0x%llx [u=%d,r=%d] cid %d %x error %d\n",
VERIFY(mpts->mpts_mpte == mpte);
VERIFY(mpts->mpts_flags & MPTSF_ATTACHED);
VERIFY(mpte->mpte_numflows != 0);
VERIFY(mp_so->so_usecount > 0);
mptcplog((LOG_DEBUG, "%s: mp_so 0x%llx [u=%d,r=%d] cid %d %x error %d\n",
- __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
- mp_so->so_usecount, mp_so->so_retaincnt, mpts->mpts_connid,
- mpts->mpts_flags, mp_so->so_error),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
+ mp_so->so_usecount, mp_so->so_retaincnt, mpts->mpts_connid,
+ mpts->mpts_flags, mp_so->so_error),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
atomic_bitclear_32(&mpts->mpts_flags, MPTSF_ATTACHED);
TAILQ_REMOVE(&mpte->mpte_subflows, mpts, mpts_entry);
mpte->mpte_numflows--;
atomic_bitclear_32(&mpts->mpts_flags, MPTSF_ATTACHED);
TAILQ_REMOVE(&mpte->mpte_subflows, mpts, mpts_entry);
mpte->mpte_numflows--;
__func__, mpts->mpts_connid, send_dfin),
MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
__func__, mpts->mpts_connid, send_dfin),
MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
__func__, mpts->mpts_connid, send_dfin),
MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
__func__, mpts->mpts_connid, send_dfin),
MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
(void) soshutdownlock(so, SHUT_RD);
(void) soshutdownlock(so, SHUT_WR);
(void) sodisconnectlocked(so);
(void) soshutdownlock(so, SHUT_RD);
(void) soshutdownlock(so, SHUT_WR);
(void) sodisconnectlocked(so);
VERIFY(mptcp_subflow_cwnd_space(mpts->mpts_socket) > 0);
mptcplog((LOG_DEBUG, "%s mpts_flags %#x, mpte_flags %#x cwnd_space %u\n",
VERIFY(mptcp_subflow_cwnd_space(mpts->mpts_socket) > 0);
mptcplog((LOG_DEBUG, "%s mpts_flags %#x, mpte_flags %#x cwnd_space %u\n",
- __func__, mpts->mpts_flags, mpte->mpte_flags,
- mptcp_subflow_cwnd_space(so)),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, mpts->mpts_flags, mpte->mpte_flags,
+ mptcp_subflow_cwnd_space(so)),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
- __func__, (uint32_t)mp_tp->mpt_sndmax, (uint32_t)mp_tp->mpt_sndnxt,
- (uint32_t)mp_tp->mpt_snduna, mp_tp->mpt_state, mp_so->so_flags1),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
+ __func__, (uint32_t)mp_tp->mpt_sndmax, (uint32_t)mp_tp->mpt_sndnxt,
+ (uint32_t)mp_tp->mpt_snduna, mp_tp->mpt_state, mp_so->so_flags1),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
/* First, drop acknowledged data */
if (MPTCP_SEQ_LT(mpt_dsn, mp_tp->mpt_snduna)) {
mptcplog((LOG_ERR, "%s: dropping data, should have been done earlier "
/* First, drop acknowledged data */
if (MPTCP_SEQ_LT(mpt_dsn, mp_tp->mpt_snduna)) {
mptcplog((LOG_ERR, "%s: dropping data, should have been done earlier "
- "dsn %u suna %u reinject? %u\n",
- __func__, (uint32_t)mpt_dsn,
- (uint32_t)mp_tp->mpt_snduna, !!mpte->mpte_reinjectq),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
+ "dsn %u suna %u reinject? %u\n",
+ __func__, (uint32_t)mpt_dsn,
+ (uint32_t)mp_tp->mpt_snduna, !!mpte->mpte_reinjectq),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
/* Check again because of above sbdrop */
if (mp_so->so_snd.sb_mb == NULL && mpte->mpte_reinjectq == NULL) {
mptcplog((LOG_ERR, "%s send-buffer is empty\n", __func__),
/* Check again because of above sbdrop */
if (mp_so->so_snd.sb_mb == NULL && mpte->mpte_reinjectq == NULL) {
mptcplog((LOG_ERR, "%s send-buffer is empty\n", __func__),
- __func__, (uint32_t)mpt_dsn, (uint32_t)mp_tp->mpt_sndnxt, (uint32_t)mp_tp->mpt_snduna),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
+ __func__, (uint32_t)mpt_dsn, (uint32_t)mp_tp->mpt_sndnxt, (uint32_t)mp_tp->mpt_snduna),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
- __func__, (uint32_t)mp_tp->mpt_sndnxt,
- (uint32_t)mp_tp->mpt_sndmax),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
+ __func__, (uint32_t)mp_tp->mpt_sndnxt,
+ (uint32_t)mp_tp->mpt_sndmax),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
sb_cc = min(sb_cc, mptcp_subflow_cwnd_space(so));
if (sb_cc <= 0) {
mptcplog((LOG_ERR, "%s sb_cc is %d, mp_so->sb_cc %u, sndwnd %u,sndnxt %u sndmax %u cwnd %u\n",
sb_cc = min(sb_cc, mptcp_subflow_cwnd_space(so));
if (sb_cc <= 0) {
mptcplog((LOG_ERR, "%s sb_cc is %d, mp_so->sb_cc %u, sndwnd %u,sndnxt %u sndmax %u cwnd %u\n",
- __func__, sb_cc, mp_so->so_snd.sb_cc, mp_tp->mpt_sndwnd,
- (uint32_t)mp_tp->mpt_sndnxt, (uint32_t)mp_tp->mpt_sndmax,
- mptcp_subflow_cwnd_space(so)),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
+ __func__, sb_cc, mp_so->so_snd.sb_cc, mp_tp->mpt_sndwnd,
+ (uint32_t)mp_tp->mpt_sndnxt, (uint32_t)mp_tp->mpt_sndmax,
+ mptcp_subflow_cwnd_space(so)),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
mptcplog((LOG_DEBUG, "%s: %u snduna = %u sndnxt = %u probe %d\n",
__func__, mpts->mpts_connid, (uint32_t)mp_tp->mpt_snduna, (uint32_t)mp_tp->mpt_sndnxt,
mpts->mpts_probecnt),
MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
mptcplog((LOG_DEBUG, "%s: %u snduna = %u sndnxt = %u probe %d\n",
__func__, mpts->mpts_connid, (uint32_t)mp_tp->mpt_snduna, (uint32_t)mp_tp->mpt_sndnxt,
mpts->mpts_probecnt),
MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
- __func__, (int)mlen, mpt_mbuf->m_pkthdr.mp_rlen,
- (uint32_t)off, sb_cc, tot_sent),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
+ __func__, (int)mlen, mpt_mbuf->m_pkthdr.mp_rlen,
+ (uint32_t)off, sb_cc, tot_sent),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_ERR);
m = m_copym_mode(mpt_mbuf, (int)off, mlen, M_DONTWAIT,
M_COPYM_MUST_COPY_HDR);
if (m == NULL) {
mptcplog((LOG_ERR, "%s m_copym_mode failed\n", __func__),
m = m_copym_mode(mpt_mbuf, (int)off, mlen, M_DONTWAIT,
M_COPYM_MUST_COPY_HDR);
if (m == NULL) {
mptcplog((LOG_ERR, "%s m_copym_mode failed\n", __func__),
- __func__, (uint32_t)mpt_dsn, mpts->mpts_rel_seq,
- tot_sent, mpts->mpts_connid), MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, (uint32_t)mpt_dsn, mpts->mpts_rel_seq,
+ tot_sent, mpts->mpts_connid), MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
if (head && (mp_tp->mpt_flags & MPTCPF_CHECKSUM)) {
dss_csum = mptcp_output_csum(head, mpt_dsn, mpts->mpts_rel_seq,
if (head && (mp_tp->mpt_flags & MPTCPF_CHECKSUM)) {
dss_csum = mptcp_output_csum(head, mpt_dsn, mpts->mpts_rel_seq,
mptcplog((LOG_DEBUG, "%s %u degraded %u wrote %d %d probe %d probedelta %d\n",
__func__, mpts->mpts_connid,
!!(mpts->mpts_flags & MPTSF_MP_DEGRADED),
tot_sent, (int) sb_cc, mpts->mpts_probecnt,
(tcp_now - mpts->mpts_probesoon)),
MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
mptcplog((LOG_DEBUG, "%s %u degraded %u wrote %d %d probe %d probedelta %d\n",
__func__, mpts->mpts_connid,
!!(mpts->mpts_flags & MPTSF_MP_DEGRADED),
tot_sent, (int) sb_cc, mpts->mpts_probecnt,
(tcp_now - mpts->mpts_probesoon)),
MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
zero_len_write:
/* Opting to call pru_send as no mbuf at subflow level */
error = (*so->so_proto->pr_usrreqs->pru_send)(so, 0, NULL, NULL,
zero_len_write:
/* Opting to call pru_send as no mbuf at subflow level */
error = (*so->so_proto->pr_usrreqs->pru_send)(so, 0, NULL, NULL,
struct mbuf *n, *prev = NULL;
mptcplog((LOG_DEBUG, "%s reinjecting dsn %u dlen %u rseq %u\n",
struct mbuf *n, *prev = NULL;
mptcplog((LOG_DEBUG, "%s reinjecting dsn %u dlen %u rseq %u\n",
- __func__, (uint32_t)m->m_pkthdr.mp_dsn, m->m_pkthdr.mp_rlen,
- m->m_pkthdr.mp_rseq),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, (uint32_t)m->m_pkthdr.mp_dsn, m->m_pkthdr.mp_rlen,
+ m->m_pkthdr.mp_rseq),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
if (n->m_pkthdr.mp_dsn == m->m_pkthdr.mp_dsn &&
n->m_pkthdr.mp_rlen >= m->m_pkthdr.mp_rlen) {
mptcplog((LOG_DEBUG, "%s fully covered with len %u\n",
if (n->m_pkthdr.mp_dsn == m->m_pkthdr.mp_dsn &&
n->m_pkthdr.mp_rlen >= m->m_pkthdr.mp_rlen) {
mptcplog((LOG_DEBUG, "%s fully covered with len %u\n",
- __func__, n->m_pkthdr.mp_rlen),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, n->m_pkthdr.mp_rlen),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
- __func__, m->m_pkthdr.mp_dsn, m->m_pkthdr.mp_rlen,
- n->m_pkthdr.mp_dsn, n->m_pkthdr.mp_rlen),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, m->m_pkthdr.mp_dsn, m->m_pkthdr.mp_rlen,
+ n->m_pkthdr.mp_dsn, n->m_pkthdr.mp_rlen),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
}
if (prev) {
/* m is already fully covered by the previous mbuf in the queue */
if (prev->m_pkthdr.mp_dsn + prev->m_pkthdr.mp_rlen >= m->m_pkthdr.mp_dsn + m->m_pkthdr.len) {
mptcplog((LOG_DEBUG, "%s prev covers us from %u with len %u\n",
}
if (prev) {
/* m is already fully covered by the previous mbuf in the queue */
if (prev->m_pkthdr.mp_dsn + prev->m_pkthdr.mp_rlen >= m->m_pkthdr.mp_dsn + m->m_pkthdr.len) {
mptcplog((LOG_DEBUG, "%s prev covers us from %u with len %u\n",
- __func__, prev->m_pkthdr.mp_dsn, prev->m_pkthdr.mp_rlen),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, prev->m_pkthdr.mp_dsn, prev->m_pkthdr.mp_rlen),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
n = m_copym_mode(m, 0, m->m_len, M_DONTWAIT, M_COPYM_MUST_COPY_HDR);
if (n == NULL) {
mptcplog((LOG_ERR, "%s m_copym_mode returned NULL\n", __func__),
n = m_copym_mode(m, 0, m->m_len, M_DONTWAIT, M_COPYM_MUST_COPY_HDR);
if (n == NULL) {
mptcplog((LOG_ERR, "%s m_copym_mode returned NULL\n", __func__),
struct mbuf *n = m->m_next, *orig = m;
mptcplog((LOG_DEBUG, "%s working on suna %u relseq %u iss %u len %u pktflags %#x\n",
struct mbuf *n = m->m_next, *orig = m;
mptcplog((LOG_DEBUG, "%s working on suna %u relseq %u iss %u len %u pktflags %#x\n",
- __func__, tp->snd_una, m->m_pkthdr.mp_rseq, mpts->mpts_iss,
- m->m_pkthdr.mp_rlen, m->m_pkthdr.pkt_flags),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, tp->snd_una, m->m_pkthdr.mp_rseq, mpts->mpts_iss,
+ m->m_pkthdr.mp_rlen, m->m_pkthdr.pkt_flags),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
/* Part of this has already been acknowledged - lookup in the
* MPTCP-socket for the segment.
*/
if (SEQ_GT(tp->snd_una - mpts->mpts_iss, m->m_pkthdr.mp_rseq)) {
m = mptcp_lookup_dsn(mpte, m->m_pkthdr.mp_dsn);
/* Part of this has already been acknowledged - lookup in the
* MPTCP-socket for the segment.
*/
if (SEQ_GT(tp->snd_una - mpts->mpts_iss, m->m_pkthdr.mp_rseq)) {
m = mptcp_lookup_dsn(mpte, m->m_pkthdr.mp_dsn);
- if (mpts->mpts_evctl & (SO_FILT_HINT_CONNRESET|SO_FILT_HINT_MUSTRST|
- SO_FILT_HINT_CANTSENDMORE|SO_FILT_HINT_TIMEOUT|
- SO_FILT_HINT_NOSRCADDR|SO_FILT_HINT_IFDENIED|
+ if (mpts->mpts_evctl & (SO_FILT_HINT_CONNRESET | SO_FILT_HINT_MUSTRST |
+ SO_FILT_HINT_CANTSENDMORE | SO_FILT_HINT_TIMEOUT |
+ SO_FILT_HINT_NOSRCADDR | SO_FILT_HINT_IFDENIED |
struct mptsub *, mpts, uint32_t, mpts->mpts_evctl);
mptcplog((LOG_DEBUG, "%s cid %d events=%b\n", __func__,
struct mptsub *, mpts, uint32_t, mpts->mpts_evctl);
mptcplog((LOG_DEBUG, "%s cid %d events=%b\n", __func__,
- mpts->mpts_connid, mpts->mpts_evctl, SO_FILT_HINT_BITS),
- MPTCP_EVENTS_DBG, MPTCP_LOGLVL_VERBOSE);
+ mpts->mpts_connid, mpts->mpts_evctl, SO_FILT_HINT_BITS),
+ MPTCP_EVENTS_DBG, MPTCP_LOGLVL_VERBOSE);
mptcplog((LOG_WARNING, "%s%s: cid %d evret %s (%d) unhandled events=%b\n", __func__,
(mpts->mpts_evctl && ret == MPTS_EVRET_OK) ? "MPTCP_ERROR " : "",
mpts->mpts_connid,
mptcp_evret2str(ret), ret, mpts->mpts_evctl, SO_FILT_HINT_BITS),
MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
mptcplog((LOG_WARNING, "%s%s: cid %d evret %s (%d) unhandled events=%b\n", __func__,
(mpts->mpts_evctl && ret == MPTS_EVRET_OK) ? "MPTCP_ERROR " : "",
mpts->mpts_connid,
mptcp_evret2str(ret), ret, mpts->mpts_evctl, SO_FILT_HINT_BITS),
MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
- mpts->mpts_evctl, SO_FILT_HINT_BITS),
- MPTCP_EVENTS_DBG, MPTCP_LOGLVL_VERBOSE);
+ mpts->mpts_evctl, SO_FILT_HINT_BITS),
+ MPTCP_EVENTS_DBG, MPTCP_LOGLVL_VERBOSE);
+ }
mpte->mpte_lost_aid = tp->t_local_aid;
mptcplog((LOG_DEBUG, "%s cid %d\n", __func__, mpts->mpts_connid),
mpte->mpte_lost_aid = tp->t_local_aid;
mptcplog((LOG_DEBUG, "%s cid %d\n", __func__, mpts->mpts_connid),
- * We got a Data FIN for the MPTCP connection.
- * The FIN may arrive with data. The data is handed up to the
- * mptcp socket and the user is notified so that it may close
- * the socket if needed.
- */
- if (mp_tp->mpt_state == MPTCPS_CLOSE_WAIT)
+ * We got a Data FIN for the MPTCP connection.
+ * The FIN may arrive with data. The data is handed up to the
+ * mptcp socket and the user is notified so that it may close
+ * the socket if needed.
+ */
+ if (mp_tp->mpt_state == MPTCPS_CLOSE_WAIT) {
mpte_lock_assert_held(mpte);
mp_so = mptetoso(mpte);
mptcplog((LOG_NOTICE, "%s: mp_so 0x%llx\n", __func__,
mpte_lock_assert_held(mpte);
mp_so = mptetoso(mpte);
mptcplog((LOG_NOTICE, "%s: mp_so 0x%llx\n", __func__,
- __func__, mpts->mpts_connid, mpts_alt->mpts_connid),
- MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
+ __func__, mpts->mpts_connid, mpts_alt->mpts_connid),
+ MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
mptcpstats_inc_switch(mpte, mpts);
sowwakeup(alt_so);
} else {
mptcplog((LOG_DEBUG, "%s: no alt cid = %d\n", __func__,
mptcpstats_inc_switch(mpte, mpts);
sowwakeup(alt_so);
} else {
mptcplog((LOG_DEBUG, "%s: no alt cid = %d\n", __func__,
VERIFY(mpte->mpte_mppcb != NULL);
mptcplog((LOG_DEBUG, "%s: cid %d\n", __func__,
VERIFY(mpte->mpte_mppcb != NULL);
mptcplog((LOG_DEBUG, "%s: cid %d\n", __func__,
- case NAT64_PREFIX_LEN_96:
- memcpy(ptrv4, ptr + 12, 4);
- break;
- case NAT64_PREFIX_LEN_64:
- memcpy(ptrv4, ptr + 9, 4);
- break;
- case NAT64_PREFIX_LEN_56:
- memcpy(ptrv4, ptr + 7, 1);
- memcpy(ptrv4 + 1, ptr + 9, 3);
- break;
- case NAT64_PREFIX_LEN_48:
- memcpy(ptrv4, ptr + 6, 2);
- memcpy(ptrv4 + 2, ptr + 9, 2);
- break;
- case NAT64_PREFIX_LEN_40:
- memcpy(ptrv4, ptr + 5, 3);
- memcpy(ptrv4 + 3, ptr + 9, 1);
- break;
- case NAT64_PREFIX_LEN_32:
- memcpy(ptrv4, ptr + 4, 4);
- break;
- default:
- panic("NAT64-prefix len is wrong: %u\n",
- prefix->prefix_len);
+ case NAT64_PREFIX_LEN_96:
+ memcpy(ptrv4, ptr + 12, 4);
+ break;
+ case NAT64_PREFIX_LEN_64:
+ memcpy(ptrv4, ptr + 9, 4);
+ break;
+ case NAT64_PREFIX_LEN_56:
+ memcpy(ptrv4, ptr + 7, 1);
+ memcpy(ptrv4 + 1, ptr + 9, 3);
+ break;
+ case NAT64_PREFIX_LEN_48:
+ memcpy(ptrv4, ptr + 6, 2);
+ memcpy(ptrv4 + 2, ptr + 9, 2);
+ break;
+ case NAT64_PREFIX_LEN_40:
+ memcpy(ptrv4, ptr + 5, 3);
+ memcpy(ptrv4 + 3, ptr + 9, 1);
+ break;
+ case NAT64_PREFIX_LEN_32:
+ memcpy(ptrv4, ptr + 4, 4);
+ break;
+ default:
+ panic("NAT64-prefix len is wrong: %u\n",
+ prefix->prefix_len);
if ((mpts->mpts_flags & MPTSF_DISCONNECTED) ||
(mpts->mpts_flags & MPTSF_DISCONNECTING)) {
if (!(so->so_state & (SS_ISDISCONNECTING | SS_ISDISCONNECTED)) &&
(so->so_state & SS_ISCONNECTED)) {
if ((mpts->mpts_flags & MPTSF_DISCONNECTED) ||
(mpts->mpts_flags & MPTSF_DISCONNECTING)) {
if (!(so->so_state & (SS_ISDISCONNECTING | SS_ISDISCONNECTED)) &&
(so->so_state & SS_ISCONNECTED)) {
- mptcplog((LOG_DEBUG, "%s: cid %d disconnect before tcp connect\n",
- __func__, mpts->mpts_connid),
- MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
+ mptcplog((LOG_DEBUG, "%s: cid %d disconnect before tcp connect\n",
+ __func__, mpts->mpts_connid),
+ MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
(void) soshutdownlock(so, SHUT_RD);
(void) soshutdownlock(so, SHUT_WR);
(void) sodisconnectlocked(so);
}
(void) soshutdownlock(so, SHUT_RD);
(void) soshutdownlock(so, SHUT_WR);
(void) sodisconnectlocked(so);
}
dst_in->sin_port = mpte->mpte_alternate_port;
mptcp_subflow_add(mpte, NULL, (struct sockaddr *)&dst,
dst_in->sin_port = mpte->mpte_alternate_port;
mptcp_subflow_add(mpte, NULL, (struct sockaddr *)&dst,
} else { /* Else, we tried all we could, mark this interface as non-MPTCP */
for (i = 0; i < mpte->mpte_itfinfo_size; i++) {
struct mpt_itf_info *info = &mpte->mpte_itfinfo[i];
} else { /* Else, we tried all we could, mark this interface as non-MPTCP */
for (i = 0; i < mpte->mpte_itfinfo_size; i++) {
struct mpt_itf_info *info = &mpte->mpte_itfinfo[i];
!!(mpts->mpts_flags & MPTSF_ACTIVE), sototcpcb(so)->t_mpflags),
MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
!!(mpts->mpts_flags & MPTSF_ACTIVE), sototcpcb(so)->t_mpflags),
MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
- mpts->mpts_flags &= ~(MPTSF_CONNECTING|MPTSF_CONNECT_PENDING|
- MPTSF_CONNECTED|MPTSF_DISCONNECTING|MPTSF_PREFERRED|
- MPTSF_MP_CAPABLE|MPTSF_MP_READY|MPTSF_MP_DEGRADED|MPTSF_ACTIVE);
+ mpts->mpts_flags &= ~(MPTSF_CONNECTING | MPTSF_CONNECT_PENDING |
+ MPTSF_CONNECTED | MPTSF_DISCONNECTING | MPTSF_PREFERRED |
+ MPTSF_MP_CAPABLE | MPTSF_MP_READY | MPTSF_MP_DEGRADED | MPTSF_ACTIVE);
{
#pragma unused(event, p_mpsofilt_hint)
struct socket *mp_so, *so;
struct mptcb *mp_tp;
ev_ret_t ret = MPTS_EVRET_OK;
{
#pragma unused(event, p_mpsofilt_hint)
struct socket *mp_so, *so;
struct mptcb *mp_tp;
ev_ret_t ret = MPTS_EVRET_OK;
- __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
- mp_tp->mpt_flags, MPTCPF_BITS, mpts->mpts_connid,
- mpts->mpts_flags, MPTSF_BITS),
- MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
+ __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
+ mp_tp->mpt_flags, MPTCPF_BITS, mpts->mpts_connid,
+ mpts->mpts_flags, MPTSF_BITS),
+ MPTCP_EVENTS_DBG, MPTCP_LOGLVL_LOG);
struct ifnet *ifp = ifindex2ifnet[mpts->mpts_ifscope];
mptcplog((LOG_DEBUG, "%s Setting CELL_FALLBACK, mpte_flags %#x, svctype %u wifi unusable %d lastcell? %d boundcell? %d\n",
struct ifnet *ifp = ifindex2ifnet[mpts->mpts_ifscope];
mptcplog((LOG_DEBUG, "%s Setting CELL_FALLBACK, mpte_flags %#x, svctype %u wifi unusable %d lastcell? %d boundcell? %d\n",
- __func__, mpte->mpte_flags, mpte->mpte_svctype, mptcp_is_wifi_unusable(mpte),
- sotoinpcb(so)->inp_last_outifp ? IFNET_IS_CELLULAR(sotoinpcb(so)->inp_last_outifp) : -1,
- mpts->mpts_ifscope != IFSCOPE_NONE && ifp ? IFNET_IS_CELLULAR(ifp) : -1),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, mpte->mpte_flags, mpte->mpte_svctype, mptcp_is_wifi_unusable(mpte),
+ sotoinpcb(so)->inp_last_outifp ? IFNET_IS_CELLULAR(sotoinpcb(so)->inp_last_outifp) : -1,
+ mpts->mpts_ifscope != IFSCOPE_NONE && ifp ? IFNET_IS_CELLULAR(ifp) : -1),
+ MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
sopt.sopt_dir = SOPT_SET;
sopt.sopt_level = mpo->mpo_level;
sopt.sopt_name = mpo->mpo_name;
sopt.sopt_val = CAST_USER_ADDR_T(&mpo->mpo_intval);
sopt.sopt_dir = SOPT_SET;
sopt.sopt_level = mpo->mpo_level;
sopt.sopt_name = mpo->mpo_name;
sopt.sopt_val = CAST_USER_ADDR_T(&mpo->mpo_intval);
sopt.sopt_dir = SOPT_GET;
sopt.sopt_level = mpo->mpo_level;
sopt.sopt_name = mpo->mpo_name;
sopt.sopt_val = CAST_USER_ADDR_T(&mpo->mpo_intval);
sopt.sopt_dir = SOPT_GET;
sopt.sopt_level = mpo->mpo_level;
sopt.sopt_name = mpo->mpo_name;
sopt.sopt_val = CAST_USER_ADDR_T(&mpo->mpo_intval);
mptcp_sopt2str(mpo->mpo_level, mpo->mpo_name), error),
MPTCP_SOCKET_DBG, MPTCP_LOGLVL_ERR);
}
mptcp_sopt2str(mpo->mpo_level, mpo->mpo_name), error),
MPTCP_SOCKET_DBG, MPTCP_LOGLVL_ERR);
}
- "[u=%d,r=%d,s=%d]\n", __func__,
- (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
- mp_so->so_usecount, mp_so->so_retaincnt,
- mpp->mpp_state);
+ "[u=%d,r=%d,s=%d]\n", __func__,
+ (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
+ mp_so->so_usecount, mp_so->so_retaincnt,
+ mpp->mpp_state);
VERIFY(mpte->mpte_mptcb == mp_tp);
mp_so = mptetoso(mpte);
DTRACE_MPTCP2(state__change, struct mptcb *, mp_tp,
uint32_t, 0 /* event */);
VERIFY(mpte->mpte_mptcb == mp_tp);
mp_so = mptetoso(mpte);
DTRACE_MPTCP2(state__change, struct mptcb *, mp_tp,
uint32_t, 0 /* event */);
TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
if (disconnect_fallback) {
TAILQ_FOREACH_SAFE(mpts, &mpte->mpte_subflows, mpts_entry, tmpts) {
if (disconnect_fallback) {
LIST_FOREACH(sauth_entry, &mp_tp->mpt_subauth_list, msae_next) {
if (sauth_entry->msae_laddr_id == tp->t_local_aid) {
LIST_FOREACH(sauth_entry, &mp_tp->mpt_subauth_list, msae_next) {
if (sauth_entry->msae_laddr_id == tp->t_local_aid) {
SHA1Init(&sha1ctxt);
SHA1Update(&sha1ctxt, sha1_base, sha1_size);
SHA1Final(sha_digest, &sha1ctxt);
SHA1Init(&sha1ctxt);
SHA1Update(&sha1ctxt, sha1_base, sha1_size);
SHA1Final(sha_digest, &sha1ctxt);
- SHA1Update(&sha1ctxt, (unsigned char *)key_ipad, sizeof (key_ipad));
- SHA1Update(&sha1ctxt, (unsigned char *)data, sizeof (data));
+ SHA1Update(&sha1ctxt, (unsigned char *)key_ipad, sizeof(key_ipad));
+ SHA1Update(&sha1ctxt, (unsigned char *)data, sizeof(data));
SHA1Update(&sha1ctxt, (unsigned char *)digest, SHA1_RESULTLEN);
SHA1Final(digest, &sha1ctxt);
}
SHA1Update(&sha1ctxt, (unsigned char *)digest, SHA1_RESULTLEN);
SHA1Final(digest, &sha1ctxt);
}
mptcp_do_sha1(&mp_tp->mpt_localkey, key_digest);
mptcp_generate_token(key_digest, SHA1_RESULTLEN,
mptcp_do_sha1(&mp_tp->mpt_localkey, key_digest);
mptcp_generate_token(key_digest, SHA1_RESULTLEN,
/* Setup local and remote tokens and Initial DSNs */
mptcp_do_sha1(&mp_tp->mpt_remotekey, remote_digest);
mptcp_generate_token(remote_digest, SHA1_RESULTLEN,
/* Setup local and remote tokens and Initial DSNs */
mptcp_do_sha1(&mp_tp->mpt_remotekey, remote_digest);
mptcp_generate_token(remote_digest, SHA1_RESULTLEN,
}
mptcplog((LOG_DEBUG, "%s: dsn %u ssn %u len %d %d\n",
__func__, (u_int32_t)m->m_pkthdr.mp_dsn,
}
mptcplog((LOG_DEBUG, "%s: dsn %u ssn %u len %d %d\n",
__func__, (u_int32_t)m->m_pkthdr.mp_dsn,
- __func__, (u_int32_t)(*dsn), *relseq, *data_len, off, off_orig),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, (u_int32_t)(*dsn), *relseq, *data_len, off, off_orig),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
m->m_pkthdr.mp_rseq = tp->t_rcv_map.mpt_sseq;
m->m_pkthdr.mp_rlen = tp->t_rcv_map.mpt_len;
m->m_pkthdr.mp_csum = tp->t_rcv_map.mpt_csum;
m->m_pkthdr.mp_rseq = tp->t_rcv_map.mpt_sseq;
m->m_pkthdr.mp_rlen = tp->t_rcv_map.mpt_len;
m->m_pkthdr.mp_csum = tp->t_rcv_map.mpt_csum;
m->m_pkthdr.pkt_flags |= PKTF_MPTCP;
tp->t_mpflags &= ~TMPF_EMBED_DSN;
tp->t_mpflags |= TMPF_MPTCP_ACKNOW;
} else if (tp->t_mpflags & TMPF_TCP_FALLBACK) {
m->m_pkthdr.pkt_flags |= PKTF_MPTCP;
tp->t_mpflags &= ~TMPF_EMBED_DSN;
tp->t_mpflags |= TMPF_MPTCP_ACKNOW;
} else if (tp->t_mpflags & TMPF_TCP_FALLBACK) {
- __func__, dsn, m->m_pkthdr.mp_dsn,
- rseq, m->m_pkthdr.mp_rseq,
- dlen, m->m_pkthdr.mp_rlen),
- MPTCP_RECEIVER_DBG, MPTCP_LOGLVL_ERR);
- return (-1);
+ __func__, dsn, m->m_pkthdr.mp_dsn,
+ rseq, m->m_pkthdr.mp_rseq,
+ dlen, m->m_pkthdr.mp_rlen),
+ MPTCP_RECEIVER_DBG, MPTCP_LOGLVL_ERR);
+ return -1;
off = dsn_fail - dsn;
*tcp_seq = m->m_pkthdr.mp_rseq + off;
mptcplog((LOG_DEBUG, "%s: %llu %llu \n", __func__, dsn,
off = dsn_fail - dsn;
*tcp_seq = m->m_pkthdr.mp_rseq + off;
mptcplog((LOG_DEBUG, "%s: %llu %llu \n", __func__, dsn,
mptcplog((LOG_ERR, "MPTCP Sender: "
"%s: %llu not found \n", __func__, dsn_fail),
MPTCP_SENDER_DBG, MPTCP_LOGLVL_LOG);
mptcplog((LOG_ERR, "MPTCP Sender: "
"%s: %llu not found \n", __func__, dsn_fail),
MPTCP_SENDER_DBG, MPTCP_LOGLVL_LOG);
- __func__, mdss_data_len, off, mdss_subflow_off, mdss_subflow_seq,
- mpts->mpts_iss, tp->snd_una), MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
- return (mdss_data_len - (off - mdss_subflow_off));
+ __func__, mdss_data_len, off, mdss_subflow_off, mdss_subflow_seq,
+ mpts->mpts_iss, tp->snd_una), MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
+ return mdss_data_len - (off - mdss_subflow_off);
#if CONTENT_FILTER
/* Compensate for data being processed by content filters */
pending = cfil_sock_data_space(sb);
#endif /* CONTENT_FILTER */
#if CONTENT_FILTER
/* Compensate for data being processed by content filters */
pending = cfil_sock_data_space(sb);
#endif /* CONTENT_FILTER */
DTRACE_MPTCP4(multipath__ready, struct socket *, so,
struct sockbuf *, &so->so_rcv, struct sockbuf *, &so->so_snd,
struct tcpcb *, tp);
DTRACE_MPTCP4(multipath__ready, struct socket *, so,
struct sockbuf *, &so->so_rcv, struct sockbuf *, &so->so_snd,
struct tcpcb *, tp);
DTRACE_MPTCP4(multipath__failed, struct socket *, so,
struct sockbuf *, &so->so_rcv, struct sockbuf *, &so->so_snd,
struct tcpcb *, tp);
DTRACE_MPTCP4(multipath__failed, struct socket *, so,
struct sockbuf *, &so->so_rcv, struct sockbuf *, &so->so_snd,
struct tcpcb *, tp);
-#define MPTCP_COMPUTE_LEN { \
- mss_lower = sizeof (struct mptcp_dss_ack_opt); \
- if (mp_tp->mpt_flags & MPTCPF_CHECKSUM) \
- mss_lower += 2; \
- else \
- /* adjust to 32-bit boundary + EOL */ \
- mss_lower += 2; \
+#define MPTCP_COMPUTE_LEN { \
+ mss_lower = sizeof (struct mptcp_dss_ack_opt); \
+ if (mp_tp->mpt_flags & MPTCPF_CHECKSUM) \
+ mss_lower += 2; \
+ else \
+ /* adjust to 32-bit boundary + EOL */ \
+ mss_lower += 2; \
lck_mtx_lock(&mtcbinfo.mppi_lock);
if (req->oldptr == USER_ADDR_NULL) {
size_t n = mtcbinfo.mppi_count;
lck_mtx_unlock(&mtcbinfo.mppi_lock);
lck_mtx_lock(&mtcbinfo.mppi_lock);
if (req->oldptr == USER_ADDR_NULL) {
size_t n = mtcbinfo.mppi_count;
lck_mtx_unlock(&mtcbinfo.mppi_lock);
"lowat %d notsent %d actual %d \n",
mp_tp->mpt_notsent_lowat, notsent,
notsent - (mp_tp->mpt_sndnxt - mp_tp->mpt_snduna)),
"lowat %d notsent %d actual %d \n",
mp_tp->mpt_notsent_lowat, notsent,
notsent - (mp_tp->mpt_sndnxt - mp_tp->mpt_snduna)),
mptcplog((LOG_DEBUG, "MPTCP Sender: lowat %d notsent %d"
" nodelay false \n",
mp_tp->mpt_notsent_lowat, notsent),
mptcplog((LOG_DEBUG, "MPTCP Sender: lowat %d notsent %d"
" nodelay false \n",
mp_tp->mpt_notsent_lowat, notsent),
} else if (sa->sa_nwk_status == SYMPTOMS_ADVISORY_NOCOMMENT) {
mptcplog((LOG_DEBUG, "%s: NOCOMMENT wifi %d\n", __func__,
mptcp_advisory.sa_wifi_status),
MPTCP_EVENTS_DBG, MPTCP_LOGLVL_VERBOSE);
} else if (sa->sa_nwk_status == SYMPTOMS_ADVISORY_USEAPP) {
uuid_t uuid;
} else if (sa->sa_nwk_status == SYMPTOMS_ADVISORY_NOCOMMENT) {
mptcplog((LOG_DEBUG, "%s: NOCOMMENT wifi %d\n", __func__,
mptcp_advisory.sa_wifi_status),
MPTCP_EVENTS_DBG, MPTCP_LOGLVL_VERBOSE);
} else if (sa->sa_nwk_status == SYMPTOMS_ADVISORY_USEAPP) {
uuid_t uuid;
- mptcplog((LOG_DEBUG, "%s Got response about useApp\n", __func__),
- MPTCP_SOCKET_DBG, MPTCP_LOGLVL_VERBOSE);
+ if (mbuf_len(m) < sizeof(uuid_t) + sizeof(*sa)) {
+ os_log_error(mptcp_log_handle, "%s: mbuf is %lu but need %lu\n",
+ __func__, mbuf_len(m), sizeof(uuid_t) + sizeof(*sa));
+ mbuf_free(m);
+ return EINVAL;
+ }
- uuid_copy(uuid, (unsigned char *)(sa + 1));
+ err = mbuf_copydata(m, sizeof(*sa), sizeof(uuid_t), uuid);
+ if (err) {
+ os_log_error(mptcp_log_handle, "%s: mbuf_copydata returned %d\n", __func__, err);
+ mbuf_free(m);
+ return err;
+ }
sbdrop(&mp_so->so_snd, (int)mp_droplen);
}
mptcplog((LOG_DEBUG, "%s: mp_so 0x%llx cid %d TFO tcp len %d mptcp len %d\n",
sbdrop(&mp_so->so_snd, (int)mp_droplen);
}
mptcplog((LOG_DEBUG, "%s: mp_so 0x%llx cid %d TFO tcp len %d mptcp len %d\n",
- __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
- mpts->mpts_connid, tcp_droplen, mp_droplen),
- MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
+ __func__, (u_int64_t)VM_KERNEL_ADDRPERM(mp_so),
+ mpts->mpts_connid, tcp_droplen, mp_droplen),
+ MPTCP_SENDER_DBG, MPTCP_LOGLVL_VERBOSE);
- ev_msg.vendor_code = KEV_VENDOR_APPLE;
- ev_msg.kev_class = KEV_NETWORK_CLASS;
- ev_msg.kev_subclass = KEV_MPTCP_SUBCLASS;
- ev_msg.event_code = event_code;
+ ev_msg.vendor_code = KEV_VENDOR_APPLE;
+ ev_msg.kev_class = KEV_NETWORK_CLASS;
+ ev_msg.kev_subclass = KEV_MPTCP_SUBCLASS;
+ ev_msg.event_code = event_code;
/* Remember the last time we set the cellicon (see mptcp_unset_cellicon) */
mptcp_last_cellicon_set = tcp_now;
/* If cellicon is already set, get out of here! */
/* Remember the last time we set the cellicon (see mptcp_unset_cellicon) */
mptcp_last_cellicon_set = tcp_now;
/* If cellicon is already set, get out of here! */