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

vipcreatevi.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 "vipl_priv.h"
00014 
00015 
00060 VIP_ENTRY_POINT VIP_RETURN
00061 VipCreateVi (VIP_NIC_HANDLE NicHandle,
00062              VIP_VI_ATTRIBUTES * ViAttribs,
00063              VIP_CQ_HANDLE SendCQHandle,
00064              VIP_CQ_HANDLE RecvCQHandle, VIP_VI_HANDLE * ViHandle)
00065 {
00066   VIP_VI *vip_vi_ptr;
00067   VIP_NIC *vip_nic_ptr;
00068   VIP_PTAG *vip_ptag_ptr;
00069   VIP_UINT16 index;
00070   VIP_CQ *send_vip_cq_ptr = NULL;
00071   VIP_CQ *recv_vip_cq_ptr = NULL;
00072   VIP_DEBUG_LABEL (("VipCreateVi"));
00073 
00074 
00075   if (ViAttribs == NULL)
00076     {
00077       VIP_DEBUG (("ViAttribs is NULL"));
00078       return VIP_INVALID_PARAMETER;
00079     }
00080 
00081   if (ViAttribs->EnableRdmaRead != VI_GM_ENABLE_RDMAREAD)
00082     {
00083       VIP_DEBUG (("Invalid EnableRdmaRead in ViAttribs"));
00084       return VIP_INVALID_RDMAREAD;
00085     }
00086 
00087   if (((ViAttribs->ReliabilityLevel & VI_GM_RELIABILITY_SUPPORT) == 0)
00088       || ((ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_RECEPTION)
00089           && (ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_DELIVERY)
00090           && (ViAttribs->ReliabilityLevel != VIP_SERVICE_UNRELIABLE)))
00091     {
00092       VIP_DEBUG (("Invalid ReliabilityLevel in ViAttribs"));
00093       return VIP_INVALID_RELIABILITY_LEVEL;
00094     }
00095 
00096   if (ViAttribs->MaxTransferSize > VI_GM_MAX_TRANSFER_SIZE)
00097     {
00098       VIP_DEBUG (("Invalid MaxTransferSize in ViAttribs"));
00099       return VIP_INVALID_MTU;
00100     }
00101 
00102   if (ViAttribs->QoS != NULL)
00103     {
00104       VIP_DEBUG (("Invalid QoS in ViAttribs (Only NULL supported)"));
00105       return VIP_INVALID_QOS;
00106     }
00107 
00108   if ((ViAttribs->EnableRdmaWrite != VIP_TRUE)
00109       && (ViAttribs->EnableRdmaWrite != VIP_FALSE))
00110     {
00111       VIP_DEBUG (("Invalid EnableRdmaWrite in ViAttribs"));
00112       return VIP_INVALID_PARAMETER;
00113     }
00114 
00115   /* check nic handle */
00116   vip_nic_ptr = (VIP_NIC *) NicHandle;
00117   if (VIP_INVALID_NIC_HANDLE (vip_nic_ptr))
00118     {
00119       VIP_DEBUG (("Invalid NIC handle"));
00120       return VIP_INVALID_PARAMETER;
00121     }
00122   VIP_MUTEX_LOCK (&(vip_nic_ptr->lock));
00123 
00124   /* check send cq handle */
00125   if (SendCQHandle != NULL)
00126     {
00127       send_vip_cq_ptr = (VIP_CQ *) SendCQHandle;
00128       if (VIP_INVALID_CQ_HANDLE (send_vip_cq_ptr))
00129         {
00130           VIP_DEBUG (("Invalid Send CQ handle"));
00131           VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00132           return VIP_INVALID_PARAMETER;
00133         }
00134 
00135       if (send_vip_cq_ptr->handle.vip_nic_ptr != vip_nic_ptr)
00136         {
00137           VIP_DEBUG (("Inconsistent NIC in Send CQ handle"));
00138           VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00139           return VIP_INVALID_PARAMETER;
00140         }
00141     }
00142 
00143   /* check recv cq handle */
00144   if (RecvCQHandle != NULL)
00145     {
00146       recv_vip_cq_ptr = (VIP_CQ *) RecvCQHandle;
00147       if (VIP_INVALID_CQ_HANDLE (recv_vip_cq_ptr))
00148         {
00149           VIP_DEBUG (("Invalid Recv CQ handle"));
00150           VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00151           return VIP_INVALID_PARAMETER;
00152         }
00153       
00154       if (recv_vip_cq_ptr->handle.vip_nic_ptr != vip_nic_ptr)
00155         {
00156           VIP_DEBUG (("Inconsistent NIC in Recv CQ handle"));
00157           VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00158           return VIP_INVALID_PARAMETER;
00159         }
00160     }
00161 
00162   /* check ptag */
00163   vip_ptag_ptr = (VIP_PTAG *) ViAttribs->Ptag;
00164   if (VIP_INVALID_PTAG_HANDLE (vip_ptag_ptr))
00165     {
00166       VIP_DEBUG (("Invalid PTAG handle"));
00167       VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00168       return VIP_INVALID_PTAG;
00169     }
00170 
00171   /* check ptag's NIC */
00172   if (vip_ptag_ptr->handle.vip_nic_ptr != vip_nic_ptr)
00173     {
00174       VIP_DEBUG (("PTAG handle's NIC inconsistency"));
00175       VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00176       return VIP_INVALID_PTAG;
00177     }
00178 
00179   /* allocate vi */
00180   vip_vi_ptr = (VIP_VI *) vip_allocate_handle (&(vip_nic_ptr->vip_vi_set));
00181   if (vip_vi_ptr == NULL)
00182     {
00183       VIP_DEBUG (("VIP_VI alloc failed"));
00184       VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00185       return VIP_ERROR_RESOURCE;
00186     }
00187 
00188   vip_ptag_ptr->handle.ref_count++;
00189   vip_vi_ptr->vip_ptag_ptr = vip_ptag_ptr;
00190 
00191   if (send_vip_cq_ptr != NULL)
00192     {
00193       vip_vi_ptr->send_queue.vip_cq_ptr = send_vip_cq_ptr;
00194       send_vip_cq_ptr->handle.ref_count++;
00195     }
00196   else
00197     {
00198       vip_vi_ptr->send_queue.vip_cq_ptr = NULL;
00199     }
00200 
00201   if (recv_vip_cq_ptr != NULL)
00202     {
00203       vip_vi_ptr->recv_queue.vip_cq_ptr = recv_vip_cq_ptr;
00204       recv_vip_cq_ptr->handle.ref_count++;
00205     }
00206   else
00207     {
00208       vip_vi_ptr->recv_queue.vip_cq_ptr = NULL;
00209     }
00210 
00211   vip_vi_ptr->send_queue.first = NULL;
00212   vip_vi_ptr->send_queue.last = NULL;
00213   vip_vi_ptr->send_queue.current_desc = NULL;
00214   vip_vi_ptr->send_queue.current_mem = 0;
00215   vip_vi_ptr->send_queue.total_count = 0;
00216   vip_vi_ptr->send_queue.count_to_process = 0;
00217   vip_vi_ptr->send_queue.event_count = 0;
00218   VIP_EVENT_INIT (&(vip_vi_ptr->send_queue.event));
00219   VIP_SEMAPHORE_INIT (&(vip_vi_ptr->send_queue.notify_tokens), 0);
00220   vip_vi_ptr->send_queue.notify_initialized = VIP_FALSE;
00221   vip_vi_ptr->send_queue.notify_cancelled = VIP_FALSE;
00222   vip_vi_ptr->send_queue.first_notify_handler = NULL;
00223   vip_vi_ptr->send_queue.last_notify_handler = NULL;
00224 
00225   vip_vi_ptr->recv_queue.first = NULL;
00226   vip_vi_ptr->recv_queue.last = NULL;
00227   vip_vi_ptr->recv_queue.current_desc = NULL;
00228   vip_vi_ptr->recv_queue.current_mem = 0;
00229   vip_vi_ptr->recv_queue.total_count = 0;
00230   vip_vi_ptr->recv_queue.count_to_process = 0;
00231   vip_vi_ptr->recv_queue.event_count = 0;
00232   VIP_EVENT_INIT (&(vip_vi_ptr->recv_queue.event));
00233   VIP_SEMAPHORE_INIT (&(vip_vi_ptr->recv_queue.notify_tokens), 0);
00234   vip_vi_ptr->recv_queue.notify_initialized = VIP_FALSE;
00235   vip_vi_ptr->recv_queue.notify_cancelled = VIP_FALSE;
00236   vip_vi_ptr->recv_queue.first_notify_handler = NULL;
00237   vip_vi_ptr->recv_queue.last_notify_handler = NULL;
00238 
00239   vip_vi_ptr->conn_ptr = NULL;
00240   vip_vi_ptr->net_remote_nic_index =  VIP_HTON_UINT16 (0);
00241   vip_vi_ptr->net_remote_vi_index =  VIP_HTON_UINT16 (0);
00242   vip_vi_ptr->mtu = ViAttribs->MaxTransferSize;
00243   vip_vi_ptr->qos = ViAttribs->QoS;
00244   vip_vi_ptr->gm_dest_id = 0;
00245   vip_vi_ptr->gm_dest_port = 0;
00246   vip_vi_ptr->rdma_write = ViAttribs->EnableRdmaWrite;
00247   vip_vi_ptr->reliability = ViAttribs->ReliabilityLevel;
00248   vip_vi_ptr->pending_callbacks = 0;
00249   vip_vi_ptr->state = VIP_STATE_IDLE;
00250 
00251   /* register the VI handle pointer into the VI pts tab */
00252   index = vip_nic_ptr->vip_vi_index_free;
00253   vip_nic_ptr->vip_vi_index_free =
00254     (((VIP_UINTPTR) (vip_nic_ptr->vip_vi_ptrs[index])) & 0xFFFF);
00255   vip_nic_ptr->vip_vi_ptrs[index] = vip_vi_ptr;
00256   vip_vi_ptr->index = index;
00257 
00258   *ViHandle = (VIP_VI_HANDLE) vip_vi_ptr;
00259   VIP_DEBUG (("Success"));
00260   VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00261   return VIP_SUCCESS;
00262 }
VI-GM-1.3 by Myricom © 1997-2006. Documentation generated on 20 May 2006 by doxygen 1.4.4.