Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

303 lines
8.5 KiB

  1. //+----------------------------------------------------------------------------
  2. //
  3. // File: cluster.cpp
  4. //
  5. // Module: WLBS API
  6. //
  7. // Description: Implement class CWlbsCluster
  8. //
  9. // Copyright (C) Microsoft Corporation. All rights reserved.
  10. //
  11. // Author: Created 3/9/00
  12. //
  13. //+----------------------------------------------------------------------------
  14. #include "precomp.h"
  15. #include <debug.h>
  16. #include "cluster.h"
  17. #include "control.h"
  18. #include "param.h"
  19. #include "cluster.tmh" // For event tracing
  20. CWlbsCluster::CWlbsCluster(DWORD dwConfigIndex)
  21. {
  22. m_reload_required = false;
  23. m_notify_adapter_required = false;
  24. m_this_cl_addr = 0;
  25. m_this_host_id = 0;
  26. m_this_ded_addr = 0;
  27. m_dwConfigIndex = dwConfigIndex;
  28. }
  29. //+----------------------------------------------------------------------------
  30. //
  31. // Function: CWlbsCluster::ReadConfig
  32. //
  33. // Description: Read cluster settings from registry
  34. //
  35. // Arguments: PWLBS_REG_PARAMS reg_data -
  36. //
  37. // Returns: DWORD -
  38. //
  39. // History: fengsun Created Header 1/25/00
  40. //
  41. //+----------------------------------------------------------------------------
  42. DWORD CWlbsCluster::ReadConfig(PWLBS_REG_PARAMS reg_data)
  43. {
  44. TRACE_VERB("->%!FUNC!");
  45. if (ParamReadReg(m_AdapterGuid, reg_data) == false)
  46. {
  47. TRACE_VERB("<-%!FUNC! return %d", WLBS_REG_ERROR);
  48. return WLBS_REG_ERROR;
  49. }
  50. /* create a copy in the old_params structure. this will be required to
  51. * determine whether a reload is needed or a reboot is needed for commit */
  52. memcpy ( &m_reg_params, reg_data, sizeof (WLBS_REG_PARAMS));
  53. // m_this_cl_addr = IpAddressFromAbcdWsz(m_reg_params.cl_ip_addr);
  54. m_this_ded_addr = IpAddressFromAbcdWsz(m_reg_params.ded_ip_addr);
  55. TRACE_VERB("<-%!FUNC! return %d", WLBS_OK);
  56. return WLBS_OK;
  57. }
  58. //+----------------------------------------------------------------------------
  59. //
  60. // Function: CWlbsCluster::GetClusterIpOrIndex
  61. //
  62. // Description: Get the index or IP of the cluster. If the cluster IP is non-zero
  63. // The IP is return.
  64. // If the cluster IP is 0, the index is returned
  65. //
  66. // Arguments: CWlbsControl* pControl -
  67. //
  68. // Returns: DWORD -
  69. //
  70. // History: fengsun Created Header 7/3/00
  71. //
  72. //+----------------------------------------------------------------------------
  73. DWORD CWlbsCluster::GetClusterIpOrIndex(CWlbsControl* pControl)
  74. {
  75. TRACE_VERB("->%!FUNC!");
  76. DWORD dwIp = CWlbsCluster::GetClusterIp();
  77. if (dwIp!=0)
  78. {
  79. //
  80. // Return the cluster IP if non 0
  81. //
  82. TRACE_VERB("<-%!FUNC! return %d", dwIp);
  83. return dwIp;
  84. }
  85. if (pControl->GetClusterNum() == 1)
  86. {
  87. //
  88. // For backward compatibility, return 0 if only one cluster exists
  89. //
  90. TRACE_VERB("<-%!FUNC! return 0");
  91. return 0;
  92. }
  93. //
  94. // Ip address is in the reverse order
  95. //
  96. dwIp = (CWlbsCluster::m_dwConfigIndex) <<24;
  97. TRACE_VERB("<-%!FUNC! returning IP address in reverse order %d", dwIp);
  98. return dwIp;
  99. }
  100. //+----------------------------------------------------------------------------
  101. //
  102. // Function: CWlbsCluster::WriteConfig
  103. //
  104. // Description: Write cluster settings to registry
  105. //
  106. // Arguments: WLBS_REG_PARAMS* reg_data -
  107. //
  108. // Returns: DWORD -
  109. //
  110. // History: fengsun Created Header 3/9/00
  111. //
  112. //+----------------------------------------------------------------------------
  113. DWORD CWlbsCluster::WriteConfig(WLBS_REG_PARAMS* reg_data)
  114. {
  115. TRACE_VERB("->%!FUNC!");
  116. DWORD Status;
  117. Status = ParamWriteConfig(m_AdapterGuid, reg_data, &m_reg_params, &m_reload_required, &m_notify_adapter_required);
  118. TRACE_VERB("<-%!FUNC! return %d", Status);
  119. return Status;
  120. }
  121. //+----------------------------------------------------------------------------
  122. //
  123. // Function: CWlbsCluster::CommitChanges
  124. //
  125. // Description: Notify wlbs driver or nic driver to pick up the changes
  126. //
  127. // Arguments: CWlbsControl* pWlbsControl -
  128. //
  129. // Returns: DWORD -
  130. //
  131. // History: fengsun Created Header 7/6/00
  132. // chrisdar 07.31.01 Modified adapter notification code to not disable
  133. // and enable the NIC. Just do property change now.
  134. // KarthicN 08/28/01 Moved contents over to ParamCommitChanges
  135. //
  136. //+----------------------------------------------------------------------------
  137. DWORD CWlbsCluster::CommitChanges(CWlbsControl* pWlbsControl)
  138. {
  139. TRACE_VERB("->%!FUNC!");
  140. DWORD Status;
  141. ASSERT(pWlbsControl);
  142. Status = ParamCommitChanges(m_AdapterGuid,
  143. pWlbsControl->GetDriverHandle(),
  144. m_this_cl_addr,
  145. m_this_ded_addr,
  146. &m_reload_required,
  147. &m_notify_adapter_required);
  148. TRACE_VERB("<-%!FUNC! return %d", Status);
  149. return Status;
  150. }
  151. //+----------------------------------------------------------------------------
  152. //
  153. // Function: CWlbsCluster::Initialize
  154. //
  155. // Description: Initialization
  156. //
  157. // Arguments: const GUID& AdapterGuid -
  158. //
  159. // Returns: bool - true if succeeded
  160. //
  161. // History: fengsun Created Header 3/9/00
  162. //
  163. //+----------------------------------------------------------------------------
  164. bool CWlbsCluster::Initialize(const GUID& AdapterGuid)
  165. {
  166. TRACE_VERB("->%!FUNC!");
  167. m_AdapterGuid = AdapterGuid;
  168. m_notify_adapter_required = false;
  169. m_reload_required = false;
  170. ZeroMemory (& m_reg_params, sizeof (m_reg_params));
  171. if (!ParamReadReg(m_AdapterGuid, &m_reg_params))
  172. {
  173. TRACE_CRIT("%!FUNC! ParamReadReg failed");
  174. // This check was added for tracing. No abort was done previously on error, so don't do so now.
  175. }
  176. m_this_cl_addr = IpAddressFromAbcdWsz(m_reg_params.cl_ip_addr);
  177. m_this_ded_addr = IpAddressFromAbcdWsz(m_reg_params.ded_ip_addr);
  178. m_this_host_id = m_reg_params.host_priority;
  179. TRACE_VERB("->%!FUNC! return true");
  180. return true;
  181. }
  182. //+----------------------------------------------------------------------------
  183. //
  184. // Function: CWlbsCluster::ReInitialize
  185. //
  186. // Description: Reload settings from registry
  187. //
  188. // Arguments:
  189. //
  190. // Returns: bool - true if succeeded
  191. //
  192. // History: fengsun Created Header 3/9/00
  193. //
  194. //+----------------------------------------------------------------------------
  195. bool CWlbsCluster::ReInitialize()
  196. {
  197. TRACE_VERB("->%!FUNC!");
  198. if (ParamReadReg(m_AdapterGuid, &m_reg_params) == false)
  199. {
  200. TRACE_CRIT("!FUNC! failed reading nlb registry parameters");
  201. TRACE_VERB("<-%!FUNC! return false");
  202. return false;
  203. }
  204. //
  205. // Do not change the ClusterIP if the changes has not been commited
  206. //
  207. if (!IsCommitPending())
  208. {
  209. m_this_cl_addr = IpAddressFromAbcdWsz(m_reg_params.cl_ip_addr);
  210. m_this_host_id = m_reg_params.host_priority;
  211. }
  212. m_this_ded_addr = IpAddressFromAbcdWsz(m_reg_params.ded_ip_addr);
  213. TRACE_VERB("<-%!FUNC! return true");
  214. return true;
  215. }
  216. //+----------------------------------------------------------------------------
  217. //
  218. // Function: CWlbsCluster::GetPassword
  219. //
  220. // Description: Get remote control password for this cluster
  221. //
  222. // Arguments:
  223. //
  224. // Returns: DWORD - password
  225. //
  226. // History: fengsun Created Header 2/3/00
  227. //
  228. //+----------------------------------------------------------------------------
  229. DWORD CWlbsCluster::GetPassword()
  230. {
  231. TRACE_VERB("->%!FUNC!");
  232. HKEY key = NULL;
  233. LONG status;
  234. DWORD dwRctPassword = 0;
  235. if (!(key = RegOpenWlbsSetting(m_AdapterGuid, true)))
  236. {
  237. TRACE_CRIT("%!FUNC! RegOpenWlbsSetting failed");
  238. // This check was added for tracing. No abort was done previously on error, so don't do so now.
  239. }
  240. DWORD size = sizeof(dwRctPassword);
  241. status = RegQueryValueEx (key, CVY_NAME_RCT_PASSWORD, 0L, NULL,
  242. (LPBYTE) & dwRctPassword, & size);
  243. if (status != ERROR_SUCCESS)
  244. {
  245. dwRctPassword = CVY_DEF_RCT_PASSWORD;
  246. TRACE_CRIT("%!FUNC! registry read for %ls failed with %d", CVY_NAME_RCT_PASSWORD, status);
  247. }
  248. status = RegCloseKey(key);
  249. if (ERROR_SUCCESS != status)
  250. {
  251. TRACE_CRIT("%!FUNC! registry close failed with %d", status);
  252. }
  253. TRACE_VERB("<-%!FUNC!");
  254. return dwRctPassword;
  255. }