170 lines
4.4 KiB
C
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;
|
|
}
|