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

vipquerysystem.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 <string.h>
00014 
00015 #include "vipl_priv.h"
00016 
00073 VIP_ENTRY_POINT VIP_RETURN
00074 VipQuerySystemManagementInfo (VIP_NIC_HANDLE NicHandle,
00075                               VIP_ULONG InfoType, VIP_PVOID SysManInfo)
00076 {
00077   VIP_UINT32 id;
00078   VIP_UINT32 vip_num_nodes;
00079   VIP_UINT32 max_id_in_use;
00080   VIP_NIC *vip_nic_ptr;
00081   VIP_GM *vip_gm_ptr;
00082   VIP_NET_ADDRESS *vip_net_addr;
00083   VIP_AUTODISCOVERY_LIST *vip_disc_list_ptr;
00084   VIP_UCHAR *gm_host_name;
00085   VIP_UCHAR gm_mac_address[VI_GM_MAC_ADDRESS_LEN];
00086   gm_status_t gm_status;
00087   VIP_DEBUG_LABEL (("VipQuerySystemManagementInfo"));
00088 
00089   /* check InfoType */
00090   if (InfoType != VIP_SMI_AUTODISCOVERY)
00091     {
00092       VIP_DEBUG (("Invalid InfoType, "
00093                   "only VIP_SMI_AUTODISCOVERY is supported"));
00094       return VIP_INVALID_PARAMETER;
00095     }
00096 
00097   /* check SysManInfo */
00098   vip_disc_list_ptr = SysManInfo;
00099   if (vip_disc_list_ptr == NULL)
00100     {
00101       VIP_DEBUG (("SysManInfo is null"));
00102       return VIP_INVALID_PARAMETER;
00103     }
00104 
00105   /* check NumberOfHops */
00106   if (vip_disc_list_ptr->NumberOfHops == 0)
00107     {
00108       VIP_DEBUG (("NumberOfHops is null"));
00109       return VIP_INVALID_PARAMETER;
00110     }
00111 
00112   /* check nic handle */
00113   vip_nic_ptr = (VIP_NIC *) NicHandle;
00114   if (VIP_INVALID_NIC_HANDLE (vip_nic_ptr))
00115     {
00116       VIP_DEBUG (("Invalid NIC handle"));
00117       return VIP_INVALID_PARAMETER;
00118     }
00119   vip_gm_ptr = vip_nic_ptr->vip_gm_ptr;
00120   VIP_MUTEX_LOCK (&(vip_gm_ptr->lock));
00121   VIP_MUTEX_LOCK (&(vip_nic_ptr->lock));
00122 
00123   gm_status = gm_max_node_id_inuse (vip_gm_ptr->gm_port, &max_id_in_use);
00124   if (gm_status != GM_SUCCESS)
00125     {
00126       VIP_DEBUG_GM (("gm_max_node_id_inuse() failed"));
00127       vip_disc_list_ptr->NumberOfHops = 0;
00128       VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00129       VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock));
00130       return VIP_ERROR_RESOURCE;
00131     }
00132   VIP_ASSERT (max_id_in_use > 0);
00133 
00134   vip_num_nodes = 0;
00135   for (id = 0; id <= max_id_in_use; id++)
00136     {
00137       gm_bzero (gm_mac_address, VI_GM_MAC_ADDRESS_LEN);
00138       if ((gm_node_id_to_unique_id (vip_gm_ptr->gm_port,
00139                                     id, gm_mac_address) == GM_SUCCESS)
00140           && ((gm_mac_address[0] != 0)
00141               || (gm_mac_address[1] != 0)
00142               || (gm_mac_address[2] != 0)
00143               || (gm_mac_address[3] != 0)
00144               || (gm_mac_address[4] != 0) || (gm_mac_address[5] != 0)))
00145         {
00146           gm_host_name = gm_node_id_to_host_name (vip_gm_ptr->gm_port, id);
00147           VIP_ASSERT (strlen (gm_host_name) > 0);
00148 
00149           if (vip_num_nodes < vip_disc_list_ptr->NumAdAddrs)
00150             {
00151               vip_net_addr = vip_disc_list_ptr->ADAddrArray[vip_num_nodes];
00152               vip_net_addr->HostAddressLen = VI_GM_MAC_ADDRESS_LEN;
00153               memcpy (vip_net_addr->HostAddress, gm_mac_address,
00154                       VI_GM_MAC_ADDRESS_LEN);
00155             }
00156 
00157           vip_num_nodes++;
00158         }
00159     }
00160 
00161   if (vip_num_nodes > vip_disc_list_ptr->NumAdAddrs)
00162     {
00163       VIP_DEBUG (("Autodiscovery structure to small"));
00164       vip_disc_list_ptr->NumAdAddrs = vip_num_nodes;
00165       VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00166       VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock));
00167       return VIP_ERROR_RESOURCE;
00168     }
00169 
00170   VIP_DEBUG (("Success"));
00171   vip_disc_list_ptr->NumAdAddrs = vip_num_nodes;
00172   VIP_MUTEX_UNLOCK (&(vip_nic_ptr->lock));
00173   VIP_MUTEX_UNLOCK (&(vip_gm_ptr->lock));
00174   return VIP_SUCCESS;
00175 }
VI-GM-1.3 by Myricom © 1997-2006. Documentation generated on 20 May 2006 by doxygen 1.4.4.