234 lines
7 KiB
C
234 lines
7 KiB
C
|
//++
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1987 - 1999
|
||
|
//
|
||
|
// Module Name:
|
||
|
//
|
||
|
// defgw.c
|
||
|
//
|
||
|
// Abstract:
|
||
|
//
|
||
|
// Queries into network drivers
|
||
|
//
|
||
|
// Author:
|
||
|
//
|
||
|
// Anilth - 4-20-1998
|
||
|
//
|
||
|
// Environment:
|
||
|
//
|
||
|
// User mode only.
|
||
|
// Contains NT-specific code.
|
||
|
//
|
||
|
// Revision History:
|
||
|
//
|
||
|
// NSun 08/30/98
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------//
|
||
|
//###### D e f G w T e s t () ###########################################//
|
||
|
//-------------------------------------------------------------------------//
|
||
|
HRESULT
|
||
|
DefGwTest(NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults)
|
||
|
//++
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Tests that the default gateway can be pinged. This doesn't really
|
||
|
// confirms forwarding on that IP address but it's a start.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// TRUE: Test suceeded.
|
||
|
// FALSE: Test failed
|
||
|
//
|
||
|
//--
|
||
|
{
|
||
|
DWORD nReplyCnt;
|
||
|
IPAddr GwAddress;
|
||
|
int nGwsReachable = 0;
|
||
|
int i;
|
||
|
|
||
|
PIP_ADAPTER_INFO pIpAdapterInfo;
|
||
|
IP_ADDR_STRING Gateway;
|
||
|
|
||
|
PrintStatusMessage(pParams, 4, IDS_DEFGW_STATUS_MSG);
|
||
|
|
||
|
//
|
||
|
// try to ping all gateways on all adapters
|
||
|
//
|
||
|
for( i = 0; i < pResults->cNumInterfaces; i++)
|
||
|
{
|
||
|
pIpAdapterInfo = pResults->pArrayInterface[i].IpConfig.pAdapterInfo;
|
||
|
|
||
|
InitializeListHead( &pResults->pArrayInterface[i].DefGw.lmsgOutput );
|
||
|
|
||
|
if (!pResults->pArrayInterface[i].IpConfig.fActive ||
|
||
|
NETCARD_DISCONNECTED == pResults->pArrayInterface[i].dwNetCardStatus)
|
||
|
continue;
|
||
|
|
||
|
pResults->pArrayInterface[i].DefGw.dwNumReachable = 0;
|
||
|
|
||
|
|
||
|
Gateway = pIpAdapterInfo->GatewayList;
|
||
|
if ( Gateway.IpAddress.String[0] == 0 )
|
||
|
{
|
||
|
//No default gateway configured
|
||
|
pResults->pArrayInterface[i].DefGw.dwNumReachable = -1;
|
||
|
continue;
|
||
|
}
|
||
|
while ( TRUE ) {
|
||
|
AddMessageToList(&pResults->pArrayInterface[i].DefGw.lmsgOutput, Nd_ReallyVerbose, IDS_DEFGW_12003, Gateway.IpAddress.String );
|
||
|
//IDS_DEFGW_12003 " Pinging gateway %s "
|
||
|
|
||
|
if ( IsIcmpResponseA(Gateway.IpAddress.String) )
|
||
|
{
|
||
|
AddMessageToListId(&pResults->pArrayInterface[i].DefGw.lmsgOutput, Nd_ReallyVerbose, IDS_DEFGW_12004 );
|
||
|
//IDS_DEFGW_12004 "- reachable\n"
|
||
|
nGwsReachable++;
|
||
|
pResults->pArrayInterface[i].DefGw.dwNumReachable ++;
|
||
|
}
|
||
|
else {
|
||
|
AddMessageToListId(&pResults->pArrayInterface[i].DefGw.lmsgOutput, Nd_ReallyVerbose, IDS_DEFGW_12005 );
|
||
|
//IDS_DEFGW_12005 "- not reachable\n"
|
||
|
}
|
||
|
if ( Gateway.Next == NULL ) { break; }
|
||
|
Gateway = *(Gateway.Next);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// No gateway is reachable - fatal.
|
||
|
//
|
||
|
if ( nGwsReachable == 0 )
|
||
|
{
|
||
|
PrintStatusMessage(pParams, 0, IDS_GLOBAL_FAIL_NL);
|
||
|
pResults->DefGw.hrReachable = S_FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PrintStatusMessage(pParams, 0, IDS_GLOBAL_PASS_NL);
|
||
|
pResults->DefGw.hrReachable = S_OK;
|
||
|
}
|
||
|
|
||
|
return pResults->DefGw.hrReachable;
|
||
|
} /* END OF DefGwTest() */
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------
|
||
|
//
|
||
|
// DefGwGlobalPrint
|
||
|
//
|
||
|
// Author NSun
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
|
||
|
void DefGwGlobalPrint(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults)
|
||
|
{
|
||
|
if (!pResults->IpConfig.fEnabled)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pParams->fVerbose || !FHrOK(pResults->DefGw.hrReachable))
|
||
|
{
|
||
|
PrintNewLine(pParams, 2);
|
||
|
PrintTestTitleResult(pParams,
|
||
|
IDS_DEFGW_LONG,
|
||
|
IDS_DEFGW_SHORT,
|
||
|
TRUE,
|
||
|
pResults->DefGw.hrReachable,
|
||
|
0);
|
||
|
}
|
||
|
|
||
|
if(FHrOK(pResults->DefGw.hrReachable))
|
||
|
{
|
||
|
if (pParams->fReallyVerbose)
|
||
|
PrintMessage(pParams, IDS_DEFGW_12011 );
|
||
|
//IDS_DEFGW_12011 "\n PASS - you have at least one reachable gateway.\n"
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//IDS_DEFGW_12006 "\n"
|
||
|
PrintMessage(pParams, IDS_DEFGW_12006 );
|
||
|
//IDS_DEFGW_12007 " [FATAL] NO GATEWAYS ARE REACHABLE.\n"
|
||
|
PrintMessage(pParams, IDS_DEFGW_12007 );
|
||
|
//IDS_DEFGW_12008 " You have no connectivity to other network segments.\n"
|
||
|
PrintMessage(pParams, IDS_DEFGW_12008 );
|
||
|
//IDS_DEFGW_12009 " If you configured the IP protocol manually then\n"
|
||
|
PrintMessage(pParams, IDS_DEFGW_12009 );
|
||
|
//IDS_DEFGW_12010 " you need to add at least one valid gateway.\n"
|
||
|
PrintMessage(pParams, IDS_DEFGW_12010 );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------
|
||
|
//
|
||
|
// DefGwPerInterfacePrint
|
||
|
//
|
||
|
// Author NSun
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void DefGwPerInterfacePrint(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults, INTERFACE_RESULT *pInterfaceResults)
|
||
|
{
|
||
|
if (!pInterfaceResults->fActive ||
|
||
|
!pInterfaceResults->IpConfig.fActive ||
|
||
|
NETCARD_DISCONNECTED == pInterfaceResults->dwNetCardStatus)
|
||
|
return;
|
||
|
|
||
|
if (pParams->fVerbose)
|
||
|
{
|
||
|
PrintNewLine(pParams, 1);
|
||
|
if(-1 == pInterfaceResults->DefGw.dwNumReachable) //test skipped on this interface
|
||
|
PrintTestTitleResult(pParams, IDS_DEFGW_LONG, IDS_DEFGW_SHORT, FALSE, S_FALSE, 8);
|
||
|
else if(pInterfaceResults->DefGw.dwNumReachable == 0)
|
||
|
PrintTestTitleResult(pParams, IDS_DEFGW_LONG, IDS_DEFGW_SHORT, TRUE, S_FALSE, 8);
|
||
|
else
|
||
|
PrintTestTitleResult(pParams, IDS_DEFGW_LONG, IDS_DEFGW_SHORT, TRUE, S_OK, 8);
|
||
|
}
|
||
|
|
||
|
PrintMessageList(pParams, &pInterfaceResults->DefGw.lmsgOutput);
|
||
|
if(pParams->fVerbose)
|
||
|
{
|
||
|
if(-1 == pInterfaceResults->DefGw.dwNumReachable)
|
||
|
PrintMessage(pParams, IDS_DEFGW_12002 );
|
||
|
//IDS_DEFGW_12002 " There is no gateway defined for this adapter.\n"
|
||
|
else if( 0 == pInterfaceResults->DefGw.dwNumReachable)
|
||
|
PrintMessage(pParams, IDS_DEFGW_12001);
|
||
|
//IDS_DEFGW_12001 " No gateway reachable for this adapter. \n"
|
||
|
else if (pParams->fReallyVerbose)
|
||
|
PrintMessage(pParams, IDS_DEFGW_12012);
|
||
|
//IDS_DEFGW_12012 " At least one gateway for this adapter is reachable. \n"
|
||
|
|
||
|
PrintNewLine(pParams, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------
|
||
|
//
|
||
|
// DefGwCleanup
|
||
|
//
|
||
|
// Author NSun
|
||
|
//
|
||
|
//------------------------------------------------------------------
|
||
|
void DefGwCleanup(IN NETDIAG_PARAMS *pParams,
|
||
|
IN OUT NETDIAG_RESULT *pResults)
|
||
|
{
|
||
|
int i;
|
||
|
for(i = 0; i < pResults->cNumInterfaces; i++)
|
||
|
{
|
||
|
MessageListCleanUp(&pResults->pArrayInterface[i].DefGw.lmsgOutput);
|
||
|
}
|
||
|
}
|