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

vipsetviattributes.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 
00055 VIP_ENTRY_POINT VIP_RETURN
00056 VipSetViAttributes (VIP_VI_HANDLE ViHandle, VIP_VI_ATTRIBUTES * ViAttribs)
00057 {
00058   VIP_VI *vip_vi_ptr;
00059   VIP_PTAG *new_vip_ptag_ptr;
00060   VIP_DEBUG_LABEL (("VipSetViAttributes"));
00061 
00062 
00063   if (ViAttribs == NULL)
00064     {
00065       VIP_DEBUG (("ViAttribs is NULL"));
00066       return VIP_INVALID_PARAMETER;
00067     }
00068 
00069   if (ViAttribs->EnableRdmaRead != VI_GM_ENABLE_RDMAREAD)
00070     {
00071       VIP_DEBUG (("Invalid EnableRdmaRead in ViAttribs"));
00072       return VIP_INVALID_RDMAREAD;
00073     }
00074 
00075   if (((ViAttribs->ReliabilityLevel & VI_GM_RELIABILITY_SUPPORT) == 0)
00076       || ((ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_RECEPTION)
00077           && (ViAttribs->ReliabilityLevel != VIP_SERVICE_RELIABLE_DELIVERY)
00078           && (ViAttribs->ReliabilityLevel != VIP_SERVICE_UNRELIABLE)))
00079     {
00080       VIP_DEBUG (("Invalid ReliabilityLevel in ViAttribs"));
00081       return VIP_INVALID_RELIABILITY_LEVEL;
00082     }
00083 
00084   if (ViAttribs->MaxTransferSize > VI_GM_MAX_TRANSFER_SIZE)
00085     {
00086       VIP_DEBUG (("Invalid MaxTransferSize in ViAttribs"));
00087       return VIP_INVALID_MTU;
00088     }
00089 
00090   if (ViAttribs->QoS != NULL)
00091     {
00092       VIP_DEBUG (("Invalid QoS in ViAttribs (Only NULL supported)"));
00093       return VIP_INVALID_QOS;
00094     }
00095 
00096   if ((ViAttribs->EnableRdmaWrite != VIP_TRUE)
00097       && (ViAttribs->EnableRdmaWrite != VIP_FALSE))
00098     {
00099       VIP_DEBUG (("Invalid EnableRdmaWrite in ViAttribs"));
00100       return VIP_INVALID_PARAMETER;
00101     }
00102 
00103   /* check vi handle */
00104   vip_vi_ptr = (VIP_VI *) ViHandle;
00105   if (VIP_INVALID_VI_HANDLE (vip_vi_ptr))
00106     {
00107       VIP_DEBUG (("Invalid VI handle"));
00108       return VIP_INVALID_PARAMETER;
00109     }
00110   VIP_MUTEX_LOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock));
00111 
00112   /* check vi state */
00113   if (vip_vi_ptr->state != VIP_STATE_IDLE)
00114     {
00115       VIP_DEBUG (("VI is not in idle state"));
00116       VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock));
00117       return VIP_INVALID_STATE;
00118     }
00119 
00120   /* check new ptag */
00121   new_vip_ptag_ptr = (VIP_PTAG *) ViAttribs->Ptag;
00122   if (VIP_INVALID_PTAG_HANDLE (new_vip_ptag_ptr))
00123     {
00124       VIP_DEBUG (("Invalid PTAG handle"));
00125       VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock));
00126       return VIP_INVALID_PTAG;
00127     }
00128 
00129   /* check new ptag's NIC */
00130   if (new_vip_ptag_ptr->handle.vip_nic_ptr != vip_vi_ptr->handle.vip_nic_ptr)
00131     {
00132       VIP_DEBUG (("PTAG handle's NIC inconsistency"));
00133       VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock));
00134       return VIP_INVALID_PTAG;
00135     }
00136 
00137   /* replace the ptag in VI attributes */
00138   if (vip_vi_ptr->vip_ptag_ptr != new_vip_ptag_ptr)
00139     {
00140       VIP_ASSERT (vip_vi_ptr->vip_ptag_ptr->handle.ref_count > 0);
00141       vip_vi_ptr->vip_ptag_ptr->handle.ref_count--;
00142       new_vip_ptag_ptr->handle.ref_count++;
00143     }
00144 
00145   vip_vi_ptr->vip_ptag_ptr = new_vip_ptag_ptr;
00146   vip_vi_ptr->qos = ViAttribs->QoS;
00147   vip_vi_ptr->mtu = ViAttribs->MaxTransferSize;
00148   vip_vi_ptr->rdma_write = ViAttribs->EnableRdmaWrite;
00149   vip_vi_ptr->reliability = ViAttribs->ReliabilityLevel;
00150 
00151   VIP_DEBUG (("Success"));
00152   VIP_MUTEX_UNLOCK (&(vip_vi_ptr->handle.vip_nic_ptr->lock));
00153   return VIP_SUCCESS;
00154 }
VI-GM-1.3 by Myricom © 1997-2006. Documentation generated on 20 May 2006 by doxygen 1.4.4.