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.

311 lines
8.7 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Abstract:
  4. Netsh helper for IPv6
  5. --*/
  6. #include "precomp.h"
  7. GUID g_Ipv6Guid = IPV6MON_GUID;
  8. static const GUID g_IfGuid = IFMON_GUID;
  9. #define IPV6_HELPER_VERSION 1
  10. //
  11. // The helper's commands are broken into 2 sets
  12. // - The top level commands are those which deal with the helper
  13. // itself (meta commands) and others which take 0 arguments
  14. // - The rest of the commands are split into "command groups"
  15. // i.e, commands grouped by the VERB where the VERB is ADD, DELETE,
  16. // GET or SET. This is not for any technical reason - only for
  17. // staying with the semantics used in other helpers
  18. //
  19. // A command is described using a CMD_ENTRY structure. It requires the
  20. // command token, the handler, a short help message token and an extended
  21. // help message token. To make it easier to create we use the
  22. // CREATE_CMD_ENTRY macro. This, however puts restrictions on how the tokens
  23. // are named.
  24. //
  25. // The command groups are simply arrays of the CMD_ENTRY structure. The
  26. // top level commands are also grouped in a similar array.
  27. //
  28. // The info about a complete command group is put in a CMD_GROUP_ENTRY
  29. // structure, all of which are put in an array.
  30. //
  31. //
  32. // To add a command entry to a group, simply add the command to the appropriate
  33. // array
  34. // To add a command group - create and array and add its info to the
  35. // command group array
  36. //
  37. CMD_ENTRY g_Ipv6AddCmdTable[] =
  38. {
  39. CREATE_CMD_ENTRY(IPV6_ADD_6OVER4TUNNEL, HandleAdd6over4Tunnel),
  40. CREATE_CMD_ENTRY(IPV6_ADD_ADDRESS, HandleAddAddress),
  41. CREATE_CMD_ENTRY(IPV6_ADD_DNS, HandleAddDns),
  42. CREATE_CMD_ENTRY(IPV6_ADD_PREFIXPOLICY, HandleAddPrefixPolicy),
  43. CREATE_CMD_ENTRY(IPV6_ADD_ROUTE, HandleAddRoute),
  44. CREATE_CMD_ENTRY(IPV6_ADD_V6V4TUNNEL, HandleAddV6V4Tunnel),
  45. };
  46. CMD_ENTRY g_Ipv6DelCmdTable[] =
  47. {
  48. CREATE_CMD_ENTRY(IPV6_DEL_ADDRESS, HandleDelAddress),
  49. CREATE_CMD_ENTRY(IPV6_DEL_DNS, HandleDelDns),
  50. CREATE_CMD_ENTRY(IPV6_DEL_INTERFACE, HandleDelInterface),
  51. CREATE_CMD_ENTRY(IPV6_DEL_NEIGHBORS, HandleDelNeighbors),
  52. CREATE_CMD_ENTRY(IPV6_DEL_PREFIXPOLICY, HandleDelPrefixPolicy),
  53. CREATE_CMD_ENTRY(IPV6_DEL_ROUTE, HandleDelRoute),
  54. CREATE_CMD_ENTRY(IPV6_DEL_DESTINATIONCACHE, HandleDelDestinationCache),
  55. };
  56. CMD_ENTRY g_Ipv6SetCmdTable[] =
  57. {
  58. CREATE_CMD_ENTRY(IPV6_SET_ADDRESS, HandleSetAddress),
  59. CREATE_CMD_ENTRY(IPV6_SET_GLOBAL, HandleSetGlobal),
  60. CREATE_CMD_ENTRY(IPV6_SET_INTERFACE, HandleSetInterface),
  61. CREATE_CMD_ENTRY(IPV6_SET_MOBILITY, HandleSetMobility),
  62. CREATE_CMD_ENTRY(IPV6_SET_PREFIXPOLICY, HandleSetPrefixPolicy),
  63. CREATE_CMD_ENTRY(IPV6_SET_PRIVACY, HandleSetPrivacy),
  64. CREATE_CMD_ENTRY(IPV6_SET_ROUTE, HandleSetRoute),
  65. CREATE_CMD_ENTRY(IPV6_SET_STATE, HandleSetState),
  66. #ifdef TEREDO
  67. CREATE_CMD_ENTRY(IPV6_SET_TEREDO, HandleSetTeredo),
  68. #endif // TEREDO
  69. };
  70. CMD_ENTRY g_Ipv6ShowCmdTable[] =
  71. {
  72. CREATE_CMD_ENTRY(IPV6_SHOW_ADDRESS, HandleShowAddress),
  73. CREATE_CMD_ENTRY(IPV6_SHOW_BINDINGCACHEENTRIES, HandleShowBindingCacheEntries),
  74. CREATE_CMD_ENTRY(IPV6_SHOW_DNS, HandleShowDns),
  75. CREATE_CMD_ENTRY(IPV6_SHOW_GLOBAL, HandleShowGlobal),
  76. CREATE_CMD_ENTRY(IPV6_SHOW_INTERFACE, HandleShowInterface),
  77. CREATE_CMD_ENTRY(IPV6_SHOW_JOINS, HandleShowJoins),
  78. CREATE_CMD_ENTRY(IPV6_SHOW_MOBILITY, HandleShowMobility),
  79. CREATE_CMD_ENTRY(IPV6_SHOW_NEIGHBORS, HandleShowNeighbors),
  80. CREATE_CMD_ENTRY(IPV6_SHOW_PREFIXPOLICY, HandleShowPrefixPolicy),
  81. CREATE_CMD_ENTRY(IPV6_SHOW_PRIVACY, HandleShowPrivacy),
  82. CREATE_CMD_ENTRY(IPV6_SHOW_DESTINATIONCACHE, HandleShowDestinationCache),
  83. CREATE_CMD_ENTRY(IPV6_SHOW_ROUTES, HandleShowRoutes),
  84. CREATE_CMD_ENTRY(IPV6_SHOW_SITEPREFIXES, HandleShowSitePrefixes),
  85. CREATE_CMD_ENTRY(IPV6_SHOW_STATE, HandleShowState),
  86. #ifdef TEREDO
  87. CREATE_CMD_ENTRY(IPV6_SHOW_TEREDO, HandleShowTeredo),
  88. #endif // TEREDO
  89. };
  90. CMD_GROUP_ENTRY g_Ipv6CmdGroups[] =
  91. {
  92. CREATE_CMD_GROUP_ENTRY(GROUP_ADD, g_Ipv6AddCmdTable),
  93. CREATE_CMD_GROUP_ENTRY(GROUP_DELETE, g_Ipv6DelCmdTable),
  94. CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_Ipv6ShowCmdTable),
  95. CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_Ipv6SetCmdTable),
  96. };
  97. ULONG g_ulNumGroups = sizeof(g_Ipv6CmdGroups)/sizeof(CMD_GROUP_ENTRY);
  98. CMD_ENTRY g_Ipv6TopCmds[] =
  99. {
  100. CREATE_CMD_ENTRY(IPV6_INSTALL, HandleInstall),
  101. CREATE_CMD_ENTRY(IPV6_RENEW, HandleRenew),
  102. CREATE_CMD_ENTRY(IPV6_RESET, HandleReset),
  103. CREATE_CMD_ENTRY(IPV6_UNINSTALL, HandleUninstall),
  104. };
  105. ULONG g_ulNumTopCmds = sizeof(g_Ipv6TopCmds)/sizeof(CMD_ENTRY);
  106. HANDLE g_hModule;
  107. PWCHAR g_pwszRouter = NULL;
  108. DWORD ParentVersion;
  109. BOOL g_bIfDirty = FALSE;
  110. ULONG g_ulInitCount;
  111. BOOL
  112. WINAPI
  113. Ipv6DllEntry(
  114. HINSTANCE hInstDll,
  115. DWORD fdwReason,
  116. LPVOID pReserved
  117. )
  118. {
  119. switch (fdwReason)
  120. {
  121. case DLL_PROCESS_ATTACH:
  122. {
  123. g_hModule = hInstDll;
  124. DisableThreadLibraryCalls(hInstDll);
  125. break;
  126. }
  127. case DLL_PROCESS_DETACH:
  128. {
  129. break;
  130. }
  131. default:
  132. {
  133. break;
  134. }
  135. }
  136. return TRUE;
  137. }
  138. DWORD
  139. WINAPI
  140. Ipv6Dump(
  141. IN LPCWSTR pwszRouter,
  142. IN OUT LPWSTR *ppwcArguments,
  143. IN DWORD dwArgCount,
  144. IN LPCVOID pvData
  145. )
  146. /*++
  147. Routine Description
  148. Used when dumping all contexts
  149. Arguments
  150. Return Value
  151. NO_ERROR
  152. --*/
  153. {
  154. DisplayMessage( g_hModule, DMP_IPV6_HEADER_COMMENTS );
  155. DisplayMessageT(DMP_IPV6_PUSHD);
  156. if (OpenIPv6(FORMAT_DUMP) == NO_ERROR) {
  157. DisplayMessageT(DMP_IPV6_COMMAND, CMD_IPV6_INSTALL);
  158. DisplayMessageT(DMP_IPV6_COMMAND, CMD_IPV6_RESET);
  159. //
  160. // Dump persistent configuration information.
  161. //
  162. QueryGlobalParameters(FORMAT_DUMP, TRUE);
  163. ShowIpv6StateConfig(TRUE);
  164. ShowDnsServers(TRUE, NULL);
  165. QueryPrivacyParameters(FORMAT_DUMP, TRUE);
  166. QueryMobilityParameters(FORMAT_DUMP, TRUE);
  167. QueryPrefixPolicy(FORMAT_DUMP, TRUE);
  168. QueryRouteTable(FORMAT_DUMP, TRUE);
  169. QueryInterface(NULL, FORMAT_DUMP, TRUE);
  170. QueryAddressTable(NULL, FORMAT_DUMP, TRUE);
  171. #ifdef TEREDO
  172. ShowTeredo(FORMAT_DUMP);
  173. #endif // TEREDO
  174. } else {
  175. DisplayMessageT(DMP_IPV6_COMMAND, CMD_IPV6_UNINSTALL);
  176. }
  177. DisplayMessageT(DMP_IPV6_POPD);
  178. DisplayMessage( g_hModule, DMP_IPV6_FOOTER_COMMENTS );
  179. return NO_ERROR;
  180. }
  181. DWORD
  182. WINAPI
  183. Ipv6StartHelper(
  184. IN CONST GUID *pguidParent,
  185. IN DWORD dwVersion
  186. )
  187. {
  188. DWORD dwErr;
  189. NS_CONTEXT_ATTRIBUTES attMyAttributes;
  190. ParentVersion = dwVersion;
  191. ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
  192. attMyAttributes.pwszContext = L"ipv6";
  193. attMyAttributes.guidHelper = g_Ipv6Guid;
  194. attMyAttributes.dwVersion = IPV6_HELPER_VERSION;
  195. attMyAttributes.dwFlags = CMD_FLAG_LOCAL | CMD_FLAG_ONLINE;
  196. attMyAttributes.pfnDumpFn = Ipv6Dump;
  197. attMyAttributes.ulNumTopCmds= g_ulNumTopCmds;
  198. attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_Ipv6TopCmds;
  199. attMyAttributes.ulNumGroups = g_ulNumGroups;
  200. attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_Ipv6CmdGroups;
  201. dwErr = RegisterContext( &attMyAttributes );
  202. return dwErr;
  203. }
  204. DWORD
  205. Ipv6UnInit(
  206. IN DWORD dwReserved
  207. )
  208. {
  209. if(InterlockedDecrement((PLONG)&g_ulInitCount) isnot 0)
  210. {
  211. return NO_ERROR;
  212. }
  213. return NO_ERROR;
  214. }
  215. DWORD WINAPI
  216. InitHelperDll(
  217. IN DWORD dwNetshVersion,
  218. OUT PVOID pReserved
  219. )
  220. {
  221. DWORD dwErr;
  222. NS_HELPER_ATTRIBUTES attMyAttributes;
  223. WSADATA wsa;
  224. //
  225. // See if this is the first time we are being called
  226. //
  227. if (InterlockedIncrement((PLONG)&g_ulInitCount) != 1)
  228. {
  229. return NO_ERROR;
  230. }
  231. dwErr = WSAStartup(MAKEWORD(2,0), &wsa);
  232. // Register helpers
  233. ZeroMemory( &attMyAttributes, sizeof(attMyAttributes) );
  234. attMyAttributes.guidHelper = g_Ipv6Guid;
  235. attMyAttributes.dwVersion = IPV6_HELPER_VERSION;
  236. attMyAttributes.pfnStart = Ipv6StartHelper;
  237. attMyAttributes.pfnStop = NULL;
  238. RegisterHelper( &g_IfGuid, &attMyAttributes );
  239. attMyAttributes.guidHelper = g_PpGuid;
  240. attMyAttributes.dwVersion = PORTPROXY_HELPER_VERSION;
  241. attMyAttributes.pfnStart = PpStartHelper;
  242. attMyAttributes.pfnStop = NULL;
  243. RegisterHelper( &g_IfGuid, &attMyAttributes );
  244. dwErr = Ipv6InstallSubContexts();
  245. if (dwErr isnot NO_ERROR)
  246. {
  247. Ipv6UnInit(0);
  248. return dwErr;
  249. }
  250. return NO_ERROR;
  251. }