#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; }