tcp_connect.c (02105b2ccdd6344146e0296172a9e0f17ff624ef) | tcp_connect.c (ea3b1ea53930879c9847044f5cb9c97411cae797) |
---|---|
1/* 2 * Copyright (c) 2006 Oracle. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 27 unchanged lines hidden (view full) --- 36 37#include "rds_single_path.h" 38#include "rds.h" 39#include "tcp.h" 40 41void rds_tcp_state_change(struct sock *sk) 42{ 43 void (*state_change)(struct sock *sk); | 1/* 2 * Copyright (c) 2006 Oracle. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 27 unchanged lines hidden (view full) --- 36 37#include "rds_single_path.h" 38#include "rds.h" 39#include "tcp.h" 40 41void rds_tcp_state_change(struct sock *sk) 42{ 43 void (*state_change)(struct sock *sk); |
44 struct rds_connection *conn; | 44 struct rds_conn_path *cp; |
45 struct rds_tcp_connection *tc; 46 47 read_lock_bh(&sk->sk_callback_lock); | 45 struct rds_tcp_connection *tc; 46 47 read_lock_bh(&sk->sk_callback_lock); |
48 conn = sk->sk_user_data; 49 if (!conn) { | 48 cp = sk->sk_user_data; 49 if (!cp) { |
50 state_change = sk->sk_state_change; 51 goto out; 52 } | 50 state_change = sk->sk_state_change; 51 goto out; 52 } |
53 tc = conn->c_transport_data; | 53 tc = cp->cp_transport_data; |
54 state_change = tc->t_orig_state_change; 55 56 rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state); 57 58 switch (sk->sk_state) { 59 /* ignore connecting sockets as they make progress */ 60 case TCP_SYN_SENT: 61 case TCP_SYN_RECV: 62 break; 63 case TCP_ESTABLISHED: | 54 state_change = tc->t_orig_state_change; 55 56 rdsdebug("sock %p state_change to %d\n", tc->t_sock, sk->sk_state); 57 58 switch (sk->sk_state) { 59 /* ignore connecting sockets as they make progress */ 60 case TCP_SYN_SENT: 61 case TCP_SYN_RECV: 62 break; 63 case TCP_ESTABLISHED: |
64 rds_connect_path_complete(&conn->c_path[0], 65 RDS_CONN_CONNECTING); | 64 rds_connect_path_complete(cp, RDS_CONN_CONNECTING); |
66 break; 67 case TCP_CLOSE_WAIT: 68 case TCP_CLOSE: | 65 break; 66 case TCP_CLOSE_WAIT: 67 case TCP_CLOSE: |
69 rds_conn_drop(conn); | 68 rds_conn_path_drop(cp); |
70 default: 71 break; 72 } 73out: 74 read_unlock_bh(&sk->sk_callback_lock); 75 state_change(sk); 76} 77 78int rds_tcp_conn_connect(struct rds_connection *conn) 79{ 80 struct socket *sock = NULL; 81 struct sockaddr_in src, dest; 82 int ret; 83 struct rds_tcp_connection *tc = conn->c_transport_data; | 69 default: 70 break; 71 } 72out: 73 read_unlock_bh(&sk->sk_callback_lock); 74 state_change(sk); 75} 76 77int rds_tcp_conn_connect(struct rds_connection *conn) 78{ 79 struct socket *sock = NULL; 80 struct sockaddr_in src, dest; 81 int ret; 82 struct rds_tcp_connection *tc = conn->c_transport_data; |
83 struct rds_conn_path *cp = &conn->c_path[0]; |
|
84 85 mutex_lock(&tc->t_conn_path_lock); 86 87 if (rds_conn_up(conn)) { 88 mutex_unlock(&tc->t_conn_path_lock); 89 return 0; 90 } 91 ret = sock_create_kern(rds_conn_net(conn), PF_INET, --- 17 unchanged lines hidden (view full) --- 109 dest.sin_family = AF_INET; 110 dest.sin_addr.s_addr = (__force u32)conn->c_faddr; 111 dest.sin_port = (__force u16)htons(RDS_TCP_PORT); 112 113 /* 114 * once we call connect() we can start getting callbacks and they 115 * own the socket 116 */ | 84 85 mutex_lock(&tc->t_conn_path_lock); 86 87 if (rds_conn_up(conn)) { 88 mutex_unlock(&tc->t_conn_path_lock); 89 return 0; 90 } 91 ret = sock_create_kern(rds_conn_net(conn), PF_INET, --- 17 unchanged lines hidden (view full) --- 109 dest.sin_family = AF_INET; 110 dest.sin_addr.s_addr = (__force u32)conn->c_faddr; 111 dest.sin_port = (__force u16)htons(RDS_TCP_PORT); 112 113 /* 114 * once we call connect() we can start getting callbacks and they 115 * own the socket 116 */ |
117 rds_tcp_set_callbacks(sock, conn); | 117 rds_tcp_set_callbacks(sock, cp); |
118 ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), 119 O_NONBLOCK); 120 121 rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret); 122 if (ret == -EINPROGRESS) 123 ret = 0; 124 if (ret == 0) { 125 rds_tcp_keepalive(sock); --- 45 unchanged lines hidden --- | 118 ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest), 119 O_NONBLOCK); 120 121 rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret); 122 if (ret == -EINPROGRESS) 123 ret = 0; 124 if (ret == 0) { 125 rds_tcp_keepalive(sock); --- 45 unchanged lines hidden --- |