00001
00002
00003
00004
00005
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
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
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
00106 if (vip_disc_list_ptr->NumberOfHops == 0)
00107 {
00108 VIP_DEBUG (("NumberOfHops is null"));
00109 return VIP_INVALID_PARAMETER;
00110 }
00111
00112
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 }