windows-nt/Source/XPSP1/NT/net/rras/netsh/ip/ipmon/ipip.c
2020-09-26 16:20:57 +08:00

170 lines
4.4 KiB
C

#include "precomp.h"
DWORD
AddSetIpIpTunnelInfo(
IN LPCWSTR pwszIfName,
IN PIPINIP_CONFIG_INFO pInfo
)
{
DWORD dwErr, dwType = 0;
WCHAR rgwcNameBuffer[MAX_INTERFACE_NAME_LEN + 2];
LPCWSTR pwszGuidName, pwszFriendlyName;
BOOL bCreateIf, bCreatedMapping;
PRTR_INFO_BLOCK_HEADER pIpInfo;
MPR_IPINIP_INTERFACE_0 NameInfo;
dwErr = GetInterfaceInfo(pwszIfName,
&pIpInfo,
NULL,
&dwType);
if(dwErr is NO_ERROR)
{
if(dwType is ROUTER_IF_TYPE_TUNNEL1)
{
dwErr = IpmontrSetInfoBlockInInterfaceInfo(pwszIfName,
IP_IPINIP_CFG_INFO,
(PBYTE)pInfo,
sizeof(IPINIP_CONFIG_INFO),
1);
if(dwErr isnot NO_ERROR)
{
DisplayMessage(g_hModule,
EMSG_CANT_SET_IF_INFO,
pwszIfName,
dwErr);
}
}
FREE_BUFFER(pIpInfo);
return dwErr;
}
if((dwErr isnot ERROR_NO_SUCH_INTERFACE) and
(dwErr isnot ERROR_TRANSPORT_NOT_PRESENT))
{
DisplayMessage(g_hModule,
EMSG_CANT_GET_IF_INFO,
pwszIfName,
dwErr);
return dwErr;
}
//
// If we get ERROR_NO_SUCH_INTERFACE, we need to create the i/f in
// the router, as well as adding it to IP
//
bCreateIf = (dwErr is ERROR_NO_SUCH_INTERFACE);
//
// Figure out if there is no friendly name <-> guid mapping.
// Even if the interface is not added with the router, there could
// be turds left in the name map. In case there is a friendly name
// present, then the IfName passed to us is a GUID.
//
dwErr = MprConfigGetFriendlyName(g_hMprConfig,
(LPWSTR)pwszIfName,
rgwcNameBuffer,
sizeof(rgwcNameBuffer));
if(dwErr is NO_ERROR)
{
//
// name mapping exists,
//
pwszGuidName = pwszIfName;
pwszFriendlyName = rgwcNameBuffer;
bCreatedMapping = FALSE;
}
else
{
//
// no such name. this means the IfName passed to us is the
// friendly name, so create a guid and map this name to it
//
if(UuidCreate(&(NameInfo.Guid)) isnot RPC_S_OK)
{
return ERROR_CAN_NOT_COMPLETE;
}
wcsncpy(NameInfo.wszFriendlyName,
pwszIfName,
MAX_INTERFACE_NAME_LEN);
NameInfo.wszFriendlyName[MAX_INTERFACE_NAME_LEN] = UNICODE_NULL;
//
// Set the mapping
//
dwErr = MprSetupIpInIpInterfaceFriendlyNameCreate(g_pwszRouter,
&NameInfo);
if(dwErr isnot NO_ERROR)
{
return dwErr;
}
ConvertGuidToString(&(NameInfo.Guid),
rgwcNameBuffer);
pwszGuidName = rgwcNameBuffer;
pwszFriendlyName = pwszIfName;
bCreatedMapping = TRUE;
}
dwErr = CreateInterface(pwszFriendlyName,
pwszGuidName,
ROUTER_IF_TYPE_TUNNEL1,
bCreateIf);
if(dwErr isnot NO_ERROR)
{
DisplayMessage(g_hModule,
EMSG_CANT_CREATE_IF,
pwszIfName,
dwErr);
if(bCreatedMapping or bCreateIf)
{
MprSetupIpInIpInterfaceFriendlyNameDelete(g_pwszRouter,
&(NameInfo.Guid));
}
return dwErr;
}
dwErr = IpmontrSetInfoBlockInInterfaceInfo(pwszGuidName,
IP_IPINIP_CFG_INFO,
(PBYTE)pInfo,
sizeof(IPINIP_CONFIG_INFO),
1);
if(dwErr isnot NO_ERROR)
{
DisplayMessage(g_hModule,
EMSG_CANT_SET_IF_INFO,
pwszIfName,
dwErr);
}
return NO_ERROR;
}