/*++ Copyright (c) 2001 Microsoft Corporation Module Name: net\rras\ip\iprtrint\iprtrint.c Abstract: Contains the private APIs exported by static library iprtrint.lib Revision History: Anshul Dhir Created For help contact routerdev --*/ #include #include #include #include #include #include #include #include #include "iprtrint.h" #pragma hdrstop DWORD WINAPI InternalRouterUpdateProtocolInfo( DWORD dwProtocolId, DWORD dwOperationId, PVOID MoreInfo1, PVOID MoreInfo2) /*++ Routine Description: This routine is used to update protocol information maintained by the router. e.g. it can be used to enable/disable DNS_PROXY. Also, can be extended to control other protocols like DHCP_ALLOCATOR. NOTE: Any functionality added to this routine should also be added to InternalConfigUpdateProtocolInfo Arguments: dwProtocolId: Protocol whose status is to be updated. Currently supported protocols: MS_IP_DNS_PROXY dwOperationId: Possible values: UPI_OP_ENABLE enables the specified protocol UPI_OP_DISABLE disables the specified protocol UPI_OP_RESTORE_CONFIG information (corresponding to the specified protocol) stored in the config, is set to the router MoreInfo1: Any extra information required to perform the specified operation MoreInfo2: Any extra information required to perform the specified operation Return Value: DWORD - status code --*/ { #if defined(NT4) || defined(CHICAGO) return ERROR_NOT_SUPPORTED; #else BOOL bModified = FALSE; DWORD dwErr = NO_ERROR; HANDLE hMprAdmin = NULL; HANDLE hMprConfig = NULL; HANDLE hTransport = NULL; LPBYTE pAdminCurIPInfo = NULL; LPBYTE pAdminModIPInfo = NULL; LPBYTE pAdminProtoInfo = NULL; LPBYTE pConfigCurIPInfo = NULL; LPBYTE pConfigProtoInfo = NULL; LPBYTE pNewProtoInfo = NULL; PIP_DNS_PROXY_GLOBAL_INFO pDnsInfo = NULL; DWORD dwAdminCurIPInfoSize; DWORD dwAdminProtoInfoSize, dwAdminProtoInfoCount; DWORD dwConfigCurIPInfoSize; DWORD dwConfigProtoInfoSize, dwConfigProtoInfoCount; DWORD dwNewProtoInfoSize, dwNewProtoInfoCount; if ( dwProtocolId != MS_IP_DNS_PROXY ) { return ERROR_INVALID_PARAMETER; } do { dwErr = MprAdminServerConnect( NULL, &hMprAdmin); if (dwErr != NO_ERROR) { break; } // Get the global information for IP dwErr = MprAdminTransportGetInfo( hMprAdmin, PID_IP, (LPBYTE *) &pAdminCurIPInfo, &dwAdminCurIPInfoSize, NULL, NULL); if (dwErr != NO_ERROR) { break; } // Find the Protocol specific information dwErr = MprInfoBlockFind( pAdminCurIPInfo, dwProtocolId, &dwAdminProtoInfoSize, &dwAdminProtoInfoCount, &pAdminProtoInfo); if (dwErr != NO_ERROR) { break; } // If we have to restore the config information if ( dwOperationId == UPI_OP_RESTORE_CONFIG ) { dwErr = MprConfigServerConnect( NULL, &hMprConfig); if (dwErr != NO_ERROR) { break; } dwErr = MprConfigTransportGetHandle( hMprConfig, PID_IP, &hTransport); if (dwErr != NO_ERROR) { break; } dwErr = MprConfigTransportGetInfo( hMprConfig, hTransport, (LPBYTE *) &pConfigCurIPInfo, &dwConfigCurIPInfoSize, NULL, NULL, NULL); if (dwErr != NO_ERROR) { break; } dwErr = MprInfoBlockFind( pConfigCurIPInfo, dwProtocolId, &dwConfigProtoInfoSize, &dwConfigProtoInfoCount, &pConfigProtoInfo); if (dwErr != NO_ERROR) { break; } pNewProtoInfo = pConfigProtoInfo; dwNewProtoInfoSize = dwConfigProtoInfoSize; dwNewProtoInfoCount = dwConfigProtoInfoCount; // If we are restoring the router's protocol state to the // state stored in the registry (config), we always set the // bModfied flag bModified = TRUE; } else { // Perform the desired update if ( dwProtocolId == MS_IP_DNS_PROXY ) { pDnsInfo = (PIP_DNS_PROXY_GLOBAL_INFO)pAdminProtoInfo; // // jwesth: added some NULL checking on pDnsInfo to pacify PREFIX. // if ( dwOperationId == UPI_OP_ENABLE ) { if ( pDnsInfo && !(pDnsInfo->Flags & IP_DNS_PROXY_FLAG_ENABLE_DNS) ) { pDnsInfo->Flags |= IP_DNS_PROXY_FLAG_ENABLE_DNS; bModified = TRUE; } } else if ( dwOperationId == UPI_OP_DISABLE ) { if ( pDnsInfo && ( pDnsInfo->Flags & IP_DNS_PROXY_FLAG_ENABLE_DNS ) ) { pDnsInfo->Flags &= ~IP_DNS_PROXY_FLAG_ENABLE_DNS; bModified = TRUE; } } else { // The operation is invalid for the spcified protocol dwErr = ERROR_INVALID_PARAMETER; break; } pNewProtoInfo = pAdminProtoInfo; dwNewProtoInfoSize = dwAdminProtoInfoSize; dwNewProtoInfoCount = dwAdminProtoInfoCount; } else { // Invalid Protocol id dwErr = ERROR_INVALID_PARAMETER; break; } } // If any change was made, communicate that to the router if ( bModified ) { dwErr = MprInfoBlockSet( pAdminCurIPInfo, dwProtocolId, dwNewProtoInfoSize, dwNewProtoInfoCount, pNewProtoInfo, &pAdminModIPInfo); if ( dwErr != NO_ERROR ) { break; } // Set the modified IP info block back to the router dwErr = MprAdminTransportSetInfo( hMprAdmin, PID_IP, pAdminModIPInfo, dwAdminCurIPInfoSize, NULL, 0); if ( dwErr != NO_ERROR ) { break; } } } while (FALSE); if ( pAdminCurIPInfo ) MprAdminBufferFree(pAdminCurIPInfo); if ( pAdminModIPInfo ) MprAdminBufferFree(pAdminModIPInfo); if ( pConfigCurIPInfo ) MprConfigBufferFree(pConfigCurIPInfo); if ( hMprAdmin ) MprAdminServerDisconnect(hMprAdmin); if ( hMprConfig ) MprConfigServerDisconnect(hMprConfig); return dwErr; #endif } DWORD WINAPI InternalConfigUpdateProtocolInfo( DWORD dwProtocolId, DWORD dwOperationId, PVOID MoreInfo1, PVOID MoreInfo2) /*++ Routine Description: This routine is used to update protocol information stored in the config (registry) e.g. it can be used to enable/disable DNS_PROXY. Also, can be extended to control other protocols like DHCP_ALLOCATOR. NOTE: Any functionality added to this routine should also be added to InternalRouterUpdateProtocolInfo Arguments: dwProtocolId: Protocol whose status is to be updated. Currently supported protocols: MS_IP_DNS_PROXY dwOperationId: Possible values: UPI_OP_ENABLE enables the specified protocol UPI_OP_DISABLE disables the specified protocol MoreInfo1: Any extra information required to perform the specified operation MoreInfo2: Any extra information required to perform the specified operation Return Value: DWORD - status code --*/ { #if defined(NT4) || defined(CHICAGO) return ERROR_NOT_SUPPORTED; #else BOOL bModified = FALSE; DWORD dwErr = NO_ERROR; HANDLE hMprConfig = NULL, hTransport = NULL; LPBYTE pConfigCurIPInfo = NULL; LPBYTE pConfigModIPInfo = NULL; LPBYTE pConfigProtoInfo = NULL; PIP_DNS_PROXY_GLOBAL_INFO pDnsInfo = NULL; DWORD dwConfigCurIPInfoSize; DWORD dwConfigProtoInfoSize, dwConfigProtoInfoCount; if ( dwProtocolId != MS_IP_DNS_PROXY ) { return ERROR_INVALID_PARAMETER; } do { dwErr = MprConfigServerConnect( NULL, &hMprConfig); if (dwErr != NO_ERROR) { break; } dwErr = MprConfigTransportGetHandle( hMprConfig, PID_IP, &hTransport); if (dwErr != NO_ERROR) { break; } dwErr = MprConfigTransportGetInfo( hMprConfig, hTransport, (LPBYTE *) &pConfigCurIPInfo, &dwConfigCurIPInfoSize, NULL, NULL, NULL); if (dwErr != NO_ERROR) { break; } dwErr = MprInfoBlockFind( pConfigCurIPInfo, dwProtocolId, &dwConfigProtoInfoSize, &dwConfigProtoInfoCount, &pConfigProtoInfo); if (dwErr != NO_ERROR) { break; } // Perform the desired update if ( dwProtocolId == MS_IP_DNS_PROXY ) { pDnsInfo = (PIP_DNS_PROXY_GLOBAL_INFO)pConfigProtoInfo; if ( dwOperationId == UPI_OP_ENABLE ) { if ( !(pDnsInfo->Flags & IP_DNS_PROXY_FLAG_ENABLE_DNS) ) { pDnsInfo->Flags |= IP_DNS_PROXY_FLAG_ENABLE_DNS; bModified = TRUE; } } else if ( dwOperationId == UPI_OP_DISABLE ) { if ( pDnsInfo->Flags & IP_DNS_PROXY_FLAG_ENABLE_DNS ) { pDnsInfo->Flags &= ~IP_DNS_PROXY_FLAG_ENABLE_DNS; bModified = TRUE; } } else { // The operation is invalid for the spcified protocol dwErr = ERROR_INVALID_PARAMETER; break; } } else { // Invalid Protocol id dwErr = ERROR_INVALID_PARAMETER; break; } // If any change was made, save it to the config if ( bModified ) { dwErr = MprInfoBlockSet( pConfigCurIPInfo, dwProtocolId, dwConfigProtoInfoSize, dwConfigProtoInfoCount, pConfigProtoInfo, &pConfigModIPInfo); if ( dwErr != NO_ERROR ) { break; } // Set the modified IP info block back to the config dwErr = MprConfigTransportSetInfo( hMprConfig, hTransport, pConfigModIPInfo, dwConfigCurIPInfoSize, NULL, 0, NULL); if ( dwErr != NO_ERROR ) { break; } } } while (FALSE); if ( pConfigCurIPInfo ) MprConfigBufferFree(pConfigCurIPInfo); if ( pConfigModIPInfo ) MprConfigBufferFree(pConfigModIPInfo); if ( hMprConfig ) MprConfigServerDisconnect(hMprConfig); return dwErr; #endif } DWORD WINAPI InternalUpdateProtocolStatus( DWORD dwProtocolId, DWORD dwOperationId, DWORD dwFlags) /*++ Routine Description: This routine is used to enable/disable a protocol Arguments: dwProtocolId: Protocol whose status is to be updated. Currently supported protocols: MS_IP_DNS_PROXY dwOperationId: Possible values: UPI_OP_ENABLE enables the specified protocol UPI_OP_DISABLE disables the specified protocol UPI_OP_RESTORE_CONFIG information (corresponding to the specified protocol) stored in the config, is set to the router dwFlags: Possible values UPI_FLAG_WRITE_TO_CONFIG When specified, the changes are made to both router and the config Return Value: DWORD - status code --*/ { #if defined(NT4) || defined(CHICAGO) return ERROR_NOT_SUPPORTED; #else DWORD dwRouterErr = NO_ERROR; DWORD dwConfigErr = NO_ERROR; dwRouterErr = InternalRouterUpdateProtocolInfo( dwProtocolId, dwOperationId, NULL, NULL); if ( dwFlags & UPI_FLAG_WRITE_TO_CONFIG ) { dwConfigErr = InternalConfigUpdateProtocolInfo( dwProtocolId, dwOperationId, NULL, NULL); } return (dwRouterErr ? dwRouterErr : dwConfigErr); #endif } DWORD WINAPI InternalUpdateDNSProxyStatus( DWORD dwOperationId, DWORD dwFlags) /*++ Routine Description: This routine is used to enable/disable/restore DNS proxy Arguments: dwOperationId: Possible values: UPI_OP_ENABLE enables the specified protocol UPI_OP_DISABLE disables the specified protocol UPI_OP_RESTORE_CONFIG information (corresponding to the specified protocol) stored in the config, is set to the router dwFlags: Possible values UPI_FLAG_WRITE_TO_CONFIG When specified, the changes are made to both router and the config Return Value: DWORD - status code --*/ { #if defined(NT4) || defined(CHICAGO) return ERROR_NOT_SUPPORTED; #else DWORD dwErr = NO_ERROR; dwErr = InternalUpdateProtocolStatus( MS_IP_DNS_PROXY, dwOperationId, dwFlags); return dwErr; #endif }