Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

313 lines
8.6 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Abstract:
Netsh helper for IPv6
--*/
#include "precomp.h"
GUID g_Ipv6Guid = IPV6MON_GUID;
static const GUID g_IfGuid = IFMON_GUID;
#define IPV6_HELPER_VERSION 1
//
// The helper's commands are broken into 2 sets
// - The top level commands are those which deal with the helper
// itself (meta commands) and others which take 0 arguments
// - The rest of the commands are split into "command groups"
// i.e, commands grouped by the VERB where the VERB is ADD, DELETE,
// GET or SET. This is not for any technical reason - only for
// staying with the semantics used in other helpers
//
// A command is described using a CMD_ENTRY structure. It requires the
// command token, the handler, a short help message token and an extended
// help message token. To make it easier to create we use the
// CREATE_CMD_ENTRY macro. This, however puts restrictions on how the tokens
// are named.
//
// The command groups are simply arrays of the CMD_ENTRY structure. The
// top level commands are also grouped in a similar array.
//
// The info about a complete command group is put in a CMD_GROUP_ENTRY
// structure, all of which are put in an array.
//
//
// To add a command entry to a group, simply add the command to the appropriate
// array
// To add a command group - create and array and add its info to the
// command group array
//
CMD_ENTRY g_Ipv6AddCmdTable[] =
{
CREATE_CMD_ENTRY(IPV6_ADD_6OVER4TUNNEL, HandleAdd6over4Tunnel),
CREATE_CMD_ENTRY(IPV6_ADD_ADDRESS, HandleAddAddress),
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_ADD_DNS, HandleAddDns),
// CREATE_CMD_ENTRY(IPV6_ADD_DNS, HandleAddDns),
CREATE_CMD_ENTRY(IPV6_ADD_PREFIXPOLICY, HandleAddPrefixPolicy),
CREATE_CMD_ENTRY(IPV6_ADD_ROUTE, HandleAddRoute),
CREATE_CMD_ENTRY(IPV6_ADD_V6V4TUNNEL, HandleAddV6V4Tunnel),
};
CMD_ENTRY g_Ipv6DelCmdTable[] =
{
CREATE_CMD_ENTRY(IPV6_DEL_ADDRESS, HandleDelAddress),
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_DEL_DNS, HandleDelDns),
// CREATE_CMD_ENTRY(IPV6_DEL_DNS, HandleDelDns),
CREATE_CMD_ENTRY(IPV6_DEL_INTERFACE, HandleDelInterface),
CREATE_CMD_ENTRY(IPV6_DEL_NEIGHBORS, HandleDelNeighbors),
CREATE_CMD_ENTRY(IPV6_DEL_PREFIXPOLICY, HandleDelPrefixPolicy),
CREATE_CMD_ENTRY(IPV6_DEL_ROUTE, HandleDelRoute),
CREATE_CMD_ENTRY(IPV6_DEL_DESTINATIONCACHE, HandleDelDestinationCache),
};
CMD_ENTRY g_Ipv6SetCmdTable[] =
{
CREATE_CMD_ENTRY(IPV6_SET_ADDRESS, HandleSetAddress),
CREATE_CMD_ENTRY(IPV6_SET_GLOBAL, HandleSetGlobal),
CREATE_CMD_ENTRY(IPV6_SET_INTERFACE, HandleSetInterface),
CREATE_CMD_ENTRY(IPV6_SET_MOBILITY, HandleSetMobility),
CREATE_CMD_ENTRY(IPV6_SET_PREFIXPOLICY, HandleSetPrefixPolicy),
CREATE_CMD_ENTRY(IPV6_SET_PRIVACY, HandleSetPrivacy),
CREATE_CMD_ENTRY(IPV6_SET_ROUTE, HandleSetRoute),
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_SET_STATE, HandleSetState),
// CREATE_CMD_ENTRY(IPV6_SET_STATE, HandleSetState),
#if TEREDO
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_SET_TEREDO, HandleSetTeredo),
// CREATE_CMD_ENTRY(IPV6_SET_TEREDO, HandleSetTeredo),
#endif // TEREDO
};
CMD_ENTRY g_Ipv6ShowCmdTable[] =
{
CREATE_CMD_ENTRY(IPV6_SHOW_ADDRESS, HandleShowAddress),
CREATE_CMD_ENTRY(IPV6_SHOW_BINDINGCACHEENTRIES, HandleShowBindingCacheEntries),
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_SHOW_DNS, HandleShowDns),
// CREATE_CMD_ENTRY(IPV6_SHOW_DNS, HandleShowDns),
CREATE_CMD_ENTRY(IPV6_SHOW_GLOBAL, HandleShowGlobal),
CREATE_CMD_ENTRY(IPV6_SHOW_INTERFACE, HandleShowInterface),
CREATE_CMD_ENTRY(IPV6_SHOW_JOINS, HandleShowJoins),
CREATE_CMD_ENTRY(IPV6_SHOW_MOBILITY, HandleShowMobility),
CREATE_CMD_ENTRY(IPV6_SHOW_NEIGHBORS, HandleShowNeighbors),
CREATE_CMD_ENTRY(IPV6_SHOW_PREFIXPOLICY, HandleShowPrefixPolicy),
CREATE_CMD_ENTRY(IPV6_SHOW_PRIVACY, HandleShowPrivacy),
CREATE_CMD_ENTRY(IPV6_SHOW_DESTINATIONCACHE, HandleShowDestinationCache),
CREATE_CMD_ENTRY(IPV6_SHOW_ROUTES, HandleShowRoutes),
CREATE_CMD_ENTRY(IPV6_SHOW_SITEPREFIXES, HandleShowSitePrefixes),
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_SHOW_STATE, HandleShowState),
// CREATE_CMD_ENTRY(IPV6_SHOW_STATE, HandleShowState),
#if TEREDO
CREATE_UNDOCUMENTED_CMD_ENTRY(IPV6_SHOW_TEREDO, HandleShowTeredo),
// CREATE_CMD_ENTRY(IPV6_SHOW_TEREDO, HandleShowTeredo),
#endif // TEREDO
};
CMD_GROUP_ENTRY g_Ipv6CmdGroups[] =
{
CREATE_CMD_GROUP_ENTRY(GROUP_ADD, g_Ipv6AddCmdTable),
CREATE_CMD_GROUP_ENTRY(GROUP_DELETE, g_Ipv6DelCmdTable),
CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_Ipv6ShowCmdTable),
CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_Ipv6SetCmdTable),
};
ULONG g_ulNumGroups = sizeof(g_Ipv6CmdGroups)/sizeof(CMD_GROUP_ENTRY);
CMD_ENTRY g_Ipv6TopCmds[] =
{
CREATE_CMD_ENTRY(IPV6_INSTALL, HandleInstall),
CREATE_CMD_ENTRY(IPV6_RENEW, HandleRenew),
CREATE_CMD_ENTRY(IPV6_RESET, HandleReset),
CREATE_CMD_ENTRY(IPV6_UNINSTALL, HandleUninstall),
};
ULONG g_ulNumTopCmds = sizeof(g_Ipv6TopCmds)/sizeof(CMD_ENTRY);
HANDLE g_hModule;
PWCHAR g_pwszRouter = NULL;
DWORD ParentVersion;
BOOL g_bIfDirty = FALSE;
ULONG g_ulInitCount;
BOOL
WINAPI
Ipv6DllEntry(
HINSTANCE hInstDll,
DWORD fdwReason,
LPVOID pReserved
)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
g_hModule = hInstDll;
DisableThreadLibraryCalls(hInstDll);
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
default:
{
break;
}
}
return TRUE;
}
DWORD
WINAPI
Ipv6Dump(
IN LPCWSTR pwszRouter,
IN OUT LPWSTR *ppwcArguments,
IN DWORD dwArgCount,
IN LPCVOID pvData
)
/*++
Routine Description
Used when dumping all contexts
Arguments
Return Value
NO_ERROR
--*/
{
DWORD dwErr;
HANDLE hFile = (HANDLE)-1;
DisplayMessage( g_hModule, DMP_IPV6_HEADER_COMMENTS );
DisplayMessageT(DMP_IPV6_PUSHD);
//
// Dump persistent configuration information.
//
QueryGlobalParameters(FORMAT_DUMP, TRUE);
ShowIpv6StateConfig(TRUE);
ShowDnsServers(TRUE, NULL);
QueryPrivacyParameters(FORMAT_DUMP, TRUE);
QueryMobilityParameters(FORMAT_DUMP, TRUE);
QueryPrefixPolicy(FORMAT_DUMP, TRUE);
QueryRouteTable(FORMAT_DUMP, TRUE);
QueryInterface(NULL, FORMAT_DUMP, TRUE);
#if TEREDO
ShowTeredo(FORMAT_DUMP);
#endif // TEREDO
DisplayMessageT(DMP_IPV6_POPD);
DisplayMessage( g_hModule, DMP_IPV6_FOOTER_COMMENTS );
return NO_ERROR;
}
DWORD
WINAPI
Ipv6StartHelper(
IN CONST GUID *pguidParent,
IN DWORD dwVersion
)
{
DWORD dwErr;
NS_CONTEXT_ATTRIBUTES attMyAttributes;
ParentVersion = dwVersion;
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
attMyAttributes.pwszContext = L"ipv6";
attMyAttributes.guidHelper = g_Ipv6Guid;
attMyAttributes.dwVersion = IPV6_HELPER_VERSION;
attMyAttributes.dwFlags = CMD_FLAG_LOCAL | CMD_FLAG_ONLINE;
attMyAttributes.pfnDumpFn = Ipv6Dump;
attMyAttributes.ulNumTopCmds= g_ulNumTopCmds;
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_Ipv6TopCmds;
attMyAttributes.ulNumGroups = g_ulNumGroups;
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_Ipv6CmdGroups;
dwErr = RegisterContext( &attMyAttributes );
return dwErr;
}
DWORD
Ipv6UnInit(
IN DWORD dwReserved
)
{
if(InterlockedDecrement(&g_ulInitCount) isnot 0)
{
return NO_ERROR;
}
return NO_ERROR;
}
DWORD WINAPI
InitHelperDll(
IN DWORD dwNetshVersion,
OUT PVOID pReserved
)
{
DWORD dwErr;
NS_HELPER_ATTRIBUTES attMyAttributes;
WSADATA wsa;
//
// See if this is the first time we are being called
//
if (InterlockedIncrement(&g_ulInitCount) != 1)
{
return NO_ERROR;
}
dwErr = WSAStartup(MAKEWORD(2,0), &wsa);
// Register helpers
ZeroMemory( &attMyAttributes, sizeof(attMyAttributes) );
attMyAttributes.guidHelper = g_Ipv6Guid;
attMyAttributes.dwVersion = IPV6_HELPER_VERSION;
attMyAttributes.pfnStart = Ipv6StartHelper;
attMyAttributes.pfnStop = NULL;
RegisterHelper( &g_IfGuid, &attMyAttributes );
attMyAttributes.guidHelper = g_PpGuid;
attMyAttributes.dwVersion = PORTPROXY_HELPER_VERSION;
attMyAttributes.pfnStart = PpStartHelper;
attMyAttributes.pfnStop = NULL;
RegisterHelper( &g_IfGuid, &attMyAttributes );
dwErr = Ipv6InstallSubContexts();
if (dwErr isnot NO_ERROR)
{
Ipv6UnInit(0);
return dwErr;
}
return NO_ERROR;
}