Main Page | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

vipconnectpeerwait.c

Go to the documentation of this file.
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 }
VI-GM-1.3 by Myricom © 1997-2006. Documentation generated on 20 May 2006 by doxygen 1.4.4.