
00001 /******************************************************** 00002 * Myricom VI-GM networking software and documentation * 00003 * Copyright (c) 2001 by Myricom, Inc. * 00004 * All rights reserved. * 00005 * See the file `COPYING' for copyright notice. * 00006 ********************************************************/ 00007 00013 #include <stdlib.h> 00014 00015 #include "vipl_priv.h" 00016 00017 00063 VIP_ENTRY_POINT VIP_RETURN 00064 VipConnectPeerWait (VIP_VI_HANDLE ViHandle, 00065 VIP_VI_ATTRIBUTES * RemoteViAttribs) 00066 { 00067 VIP_GM *vip_gm_ptr; 00068 VIP_VI *vip_vi_ptr; 00069 VIP_NIC *vip_nic_ptr; 00070 VIP_CONN *vip_conn_ptr; 00071 VIP_RETURN vip_status; 00072 VIP_DEBUG_LABEL (("VipConnectPeerWait")); 00073 00074 /* check RemoteViAttribs */ 00075 if (RemoteViAttribs == NULL) 00076 { 00077 VIP_DEBUG (("RemoteViAttribs is NULL")); 00078 return VIP_INVALID_PARAMETER; 00079 } 00080 00081 /* check VI handle */ 00082 vip_vi_ptr = (VIP_VI *) ViHandle; 00083 if (VIP_INVALID_VI_HANDLE (vip_vi_ptr)) 00084 { 00085 VIP_DEBUG (("Invalid VI handle")); 00086 return VIP_INVALID_PARAMETER; 00087 } 00088 vip_nic_ptr = vip_vi_ptr->handle.vip_nic_ptr; 00089 vip_gm_ptr = vip_nic_ptr->vip_gm_ptr; 00090 VIP_MUTEX_LOCK (&(vip_gm_ptr->lock)); 00091 VIP_PROGRESSION (vip_gm_ptr); 00092 VIP_MUTEX_LOCK (&(vip_nic_ptr->lock)); 00093 00094 /* check VI state */ 00095 if (vip_vi_ptr->state != VIP_STATE_CONNECT_PENDING) 00096 { 00097 VIP_DEBUG (("VI is not in CONNECT_PENDING state")); 00098 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00099 VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock)); 00100 return VIP_INVALID_STATE; 00101 } 00102 00103 /* check if connection has been initiated */ 00104 if (vip_vi_ptr->conn_ptr == NULL) 00105 { 00106 VIP_DEBUG (("VI is not engaged in a connection")); 00107 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00108 VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock)); 00109 return VIP_INVALID_PARAMETER; 00110 } 00111 00112 /* check conn handle */ 00113 vip_conn_ptr = vip_vi_ptr->conn_ptr; 00114 if (VIP_INVALID_CONN_HANDLE (vip_conn_ptr)) 00115 { 00116 VIP_DEBUG (("Invalid Peer CONN handle in VI")); 00117 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00118 VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock)); 00119 return VIP_INVALID_PARAMETER; 00120 } 00121 00122 /* check if connection is a peer connection */ 00123 if (vip_conn_ptr->type != VIP_CONN_TYPE_PEER) 00124 { 00125 VIP_DEBUG (("VI is not engaged in a PEER connection")); 00126 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00127 VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock)); 00128 return VIP_INVALID_PARAMETER; 00129 } 00130 00131 if (vip_conn_ptr->status == VIP_NOT_DONE) 00132 { 00133 /* blocks */ 00134 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00135 vip_status = vip_wait_for_notification (VIP_INFINITE, 00136 (VIP_HANDLE *) vip_conn_ptr, 00137 &(vip_conn_ptr->event), 00138 vip_is_conn_notified, 00139 vip_conn_ptr); 00140 VIP_MUTEX_LOCK (&(vip_nic_ptr->lock)); 00141 00142 if (vip_status == VIP_INVALID_PARAMETER) 00143 { 00144 if (vip_conn_ptr->status != VIP_TIMEOUT) 00145 { 00146 gm_cancel_alarm (&(vip_conn_ptr->peer_timeout_alarm)); 00147 vip_remove_conn_waiting_list (vip_nic_ptr->vip_gm_ptr, 00148 vip_conn_ptr); 00149 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00150 VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock)); 00151 return VIP_INVALID_PARAMETER; 00152 } 00153 } 00154 00155 VIP_ASSERT (vip_status == VIP_SUCCESS); 00156 } 00157 00158 vip_status = vip_conn_ptr->status; 00159 switch (vip_status) 00160 { 00161 case VIP_NOT_DONE: 00162 VIP_ABORT (("Should never get a VIP_NOT_DONE after blocking")); 00163 00164 case VIP_SUCCESS: 00165 /* connection established */ 00166 vip_vi_ptr->state = VIP_STATE_CONNECTED; 00167 *RemoteViAttribs = vip_conn_ptr->remote_vi_attribs; 00168 VIP_DEBUG (("Success")); 00169 break; 00170 00171 case VIP_INVALID_RELIABILITY_LEVEL: 00172 vip_vi_ptr->state = VIP_STATE_IDLE; 00173 VIP_DEBUG (("Invalid Reliability level")); 00174 break; 00175 00176 case VIP_INVALID_MTU: 00177 vip_vi_ptr->state = VIP_STATE_IDLE; 00178 VIP_DEBUG (("Invalid MTU")); 00179 break; 00180 00181 case VIP_INVALID_QOS: 00182 vip_vi_ptr->state = VIP_STATE_IDLE; 00183 VIP_DEBUG (("Invalid QoS")); 00184 break; 00185 00186 case VIP_TIMEOUT: 00187 vip_vi_ptr->state = VIP_STATE_IDLE; 00188 VIP_DEBUG (("Connection Timeout")); 00189 break; 00190 00191 default: 00192 VIP_ABORT (("Invalid status in Peer connection")); 00193 } 00194 00195 vip_free_handle (&(vip_nic_ptr->vip_conn_set), (VIP_HANDLE *) vip_conn_ptr); 00196 00197 VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock)); 00198 VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock)); 00199 return vip_status; 00200 }
1.4.4.