rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state);
switch (sk->sk_state) { /* ignore connecting sockets as they make progress */ case TCP_SYN_SENT: case TCP_SYN_RECV: break; case TCP_ESTABLISHED: /* Force the peer to reconnect so that we have the *TCPportsgoingfrom<smaller-ip>.<transient>to *<larger-ip>.<RDS_TCP_PORT>.Weavoidmarkingthe *RDSconnectionasRDS_CONN_UPuntilthereconnect, *toavoidRDSdatagramloss.
*/ if (rds_addr_cmp(&cp->cp_conn->c_laddr,
&cp->cp_conn->c_faddr) >= 0 &&
rds_conn_path_transition(cp, RDS_CONN_CONNECTING,
RDS_CONN_ERROR)) {
rds_conn_path_drop(cp, false);
} else {
rds_connect_path_complete(cp, RDS_CONN_CONNECTING);
} break; case TCP_CLOSE_WAIT: case TCP_CLOSE:
rds_conn_path_drop(cp, false); break; default: break;
}
out:
read_unlock_bh(&sk->sk_callback_lock);
state_change(sk);
}
/* for multipath rds,we only trigger the connection after *thehandshakeprobehasdeterminedthenumberofpaths.
*/ if (cp->cp_index > 0 && cp->cp_conn->c_npaths < 2) return -EAGAIN;
mutex_lock(&tc->t_conn_path_lock);
if (rds_conn_path_up(cp)) {
mutex_unlock(&tc->t_conn_path_lock); return0;
} if (ipv6_addr_v4mapped(&conn->c_laddr)) {
ret = sock_create_kern(rds_conn_net(conn), PF_INET,
SOCK_STREAM, IPPROTO_TCP, &sock);
isv6 = false;
} else {
ret = sock_create_kern(rds_conn_net(conn), PF_INET6,
SOCK_STREAM, IPPROTO_TCP, &sock);
isv6 = true;
}
if (ret < 0) goto out;
if (!rds_tcp_tune(sock)) {
ret = -EINVAL; goto out;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.