//++
//
//  Copyright (C) Microsoft Corporation, 1987 - 1999
//
//  Module Name:
//
//      wantest.c
//
//  Abstract:
//
//      Queries into network drivers
//
//  Author:
//
//      Anilth	- 4-20-1998 
//
//  Environment:
//
//      User mode only.
//      Contains NT-specific code.
//
//  Revision History:
//
//--
#include "precomp.h"
#undef IsEqualGUID
#include <ras.h>
#include <tapi.h>
#include <unimodem.h>


//$REVIEW (nsun) is this reasonable
#define MAX_RASCONN  100


BOOL
WANTest(NETDIAG_PARAMS* pParams, NETDIAG_RESULT*  pResults)
// Description:
// This routine tests the WAN/TAPI configurations
//
//
// Author:
//  NSun
//
{
 HRESULT    hr = S_OK;
 DWORD dwReturn;
 DWORD dwByteCount;
 RASCONN pRasConn[MAX_RASCONN];
 RASENTRY RasEntry;
 DWORD    dwEntryInfoSize;
 RAS_STATS RasStats;

 DWORD   dwNumConnections;
 DWORD   i;


 PrintStatusMessage( pParams, 4, IDS_WAN_STATUS_MSG );

 InitializeListHead( &pResults->Wan.lmsgOutput );

 dwByteCount  = sizeof(RASCONN) * MAX_RASCONN;

 //
 // dwSize identifies the version of the structure being passed
 //

 pRasConn[0].dwSize = sizeof(RASCONN);

 dwReturn = RasEnumConnections(pRasConn,
                          &dwByteCount,
                          &dwNumConnections);


 if (dwReturn != 0) {
//IDS_WAN_15001                  "RasEnumConnections failed\n" 
  AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Quiet, IDS_WAN_15001);
  hr = S_FALSE;
  goto LERROR;
 }
     

 if (dwNumConnections == 0) {
//IDS_WAN_15002                  "No active remote access connections.\n" 
    AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15002);
	goto LERROR;
 }

 pResults->Wan.fPerformed = TRUE;

 for ( i = 0; i < dwNumConnections; i++) 
 {
  
     //IDS_WAN_15003                  "Entry Name: " 
     AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15003);

     if  (pRasConn[i].szEntryName[0] == '.') 
     {
         //IDS_WAN_15004                  "N/A, phone number %s\n" 
         AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15004, pRasConn[i].szEntryName+1); // skip the dot
        
         //IDS_WAN_15005                  "The following is default entry properties.\n" 
         AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15005);
		 pRasConn[i].szEntryName[0] = 0;
      }
     else
        //IDS_WAN_15006                  "%s\n" 
        AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15006, pRasConn[i].szEntryName);


   RasEntry.dwSize = sizeof(RasEntry);

   dwEntryInfoSize = sizeof(RasEntry);

   dwReturn =  RasGetEntryProperties(NULL,
                                     pRasConn[i].szEntryName,
                                     &RasEntry,
                                     &dwEntryInfoSize,
                                     NULL,
                                     NULL);

   if (dwReturn != 0) {
	 //IDS_WAN_15056		"RasGetEntryProperties for %s failed. [%s]\n"
     AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Quiet, IDS_WAN_15056, 
						 pRasConn[i].szEntryName, NetStatusToString(dwReturn));
     hr = S_FALSE;
     continue;
   }                                                                           

   //
   // dump the connection properties
   //

   // print the device type

   //IDS_WAN_15008                  "Device Type: " 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15008);

   //$ REVIEW
   // Why are there '\n''s at the end of the names?

   if (!_tcscmp(RasEntry.szDeviceType,_T("RASDT_Modem\n")))
   {
	   // IDS_WAN_15009 "Modem\n" 
	   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose,
						   IDS_WAN_15009);
   }
   else if (!_tcscmp(RasEntry.szDeviceType,_T("RASDT_Isdn\n")))
   {
	   // IDS_WAN_15010 "ISDN card\n" 
      AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose,
						  IDS_WAN_15010);
   }
   else if (!_tcscmp(RasEntry.szDeviceType,_T("RASDT_X25\n")))
   {
        //IDS_WAN_15011 "X25 card\n" 
      AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose,
						  IDS_WAN_15011);
   }
   else if (!_tcscmp(RasEntry.szDeviceType,_T("RASDT_Vpn\n")))
   {
        //IDS_WAN_15012                  "Virtual Private Network\n" 
      AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose,
						  IDS_WAN_15012);
   }
   else if (!_tcscmp(RasEntry.szDeviceType,_T("RASDT_PAD")))
   {
        //IDS_WAN_15013                  "Packet Assembler / Dissasembler\n" 
      AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose,
						  IDS_WAN_15013);
   }


   //
   // Framing protocol in use
   //

//IDS_WAN_15014                  "Framing protocol : " 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15014);
   if (RasEntry.dwFramingProtocol & RASFP_Ppp) 
//IDS_WAN_15015                  " PPP\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15015);
   else
   if (RasEntry.dwFramingProtocol & RASFP_Slip)
//IDS_WAN_15016                  " Slip\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15016);
   else
   if (RasEntry.dwFramingProtocol & RASFP_Ras)
//IDS_WAN_15017                  " MS Proprietary protocol\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15017);
  


   //
   // PPP and LCP Settings
   //
 
   if (RasEntry.dwFramingProtocol & RASFP_Ppp) {

        //IDS_WAN_15018                  "LCP Extensions : " 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15018);
       if (RasEntry.dwfOptions & RASEO_DisableLcpExtensions)
            //IDS_WAN_DISABLED                  " Disabled\n" 
           AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_DISABLED);
       else
            //IDS_WAN_ENABLED                  " Enabled\n" 
           AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_ENABLED);

        //IDS_WAN_15021                  "Software Compression : " 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15021);
       if (RasEntry.dwfOptions & RASEO_SwCompression) 
            //IDS_WAN_ENABLED                  " Enabled\n" 
          AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_ENABLED);
       else
            //IDS_WAN_DISABLED                  " Disabled\n" 
          AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_DISABLED);

   }

   //
   // Network protocols in use and options
   // 

    //IDS_WAN_15024                  "Network protocols :\n " 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15024);
   if (RasEntry.dwfNetProtocols & RASNP_NetBEUI) 
        //IDS_WAN_15025                  "     NetBEUI\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15025); 
   if (RasEntry.dwfNetProtocols & RASNP_Ipx) 
        //IDS_WAN_15026                  "     IPX\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15026);
   if (RasEntry.dwfNetProtocols & RASNP_Ip)
//IDS_WAN_15027                  "     TCP/IP\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15027); 

   //
   // TCP/IP options
   //


   if (RasEntry.dwfNetProtocols & RASNP_Ip) {

    //IDS_WAN_15028                  "IP Address :  " 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15028);
   if (RasEntry.dwfOptions & RASEO_SpecificIpAddr)
        //IDS_WAN_15029                  "Specified\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15029);
   else
        //IDS_WAN_15030                  "Server Assigned\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15030);

    //IDS_WAN_15031                  "Name Server: " 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15031);
   if (RasEntry.dwfOptions & RASEO_SpecificNameServers)
        //IDS_WAN_15032                  "Specified\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15032);
   else
        //IDS_WAN_15033                  "Server Assigned\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15033);

   // IP hdr compression makes sense only if we use PPP

   if (RasEntry.dwFramingProtocol & RASFP_Ppp) {

        //IDS_WAN_15034                  "IP Header compression : " 
     AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15034);
     if (RasEntry.dwfOptions & RASEO_IpHeaderCompression)
            //IDS_WAN_15035                  " Enabled\n" 
         AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15035);
     else
        //IDS_WAN_15036                  " Disabled\n" 
         AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15036); 
     }

    //IDS_WAN_15037                  "Use default gateway on remote network : " 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15037);
   if (RasEntry.dwfOptions & RASEO_RemoteDefaultGateway) 
        //IDS_WAN_15038                  "Enabled\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15038);
   else
//IDS_WAN_15039                  "Disabled\n" 
       AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15039); 

   }

   //
   // Collect statistics regarding this connection
   //

   RasStats.dwSize = sizeof(RAS_STATS); // pass version information

   dwReturn = RasGetConnectionStatistics(
                                 pRasConn[i].hrasconn,
                                 &RasStats);

   if (dwReturn != 0) {
        //IDS_WAN_15040                  "    RasGetConnectionStatistics for %s failed. [%s]\n" 
       AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Quiet, IDS_WAN_15040,
						   pRasConn[i].szEntryName, NetStatusToString(dwReturn) ); 
       hr = S_FALSE;
       continue;
   }
  
    //IDS_WAN_15041                  "\n\tConnection Statistics:\n" 
   AddMessageToListId( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15041); 

    //IDS_WAN_15042                  "\tBytes Transmitted     : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15042, RasStats.dwBytesXmited);
    //IDS_WAN_15043                  "\tBytes Received        : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15043,RasStats.dwBytesRcved);
    //IDS_WAN_15044                  "\tFrames Transmitted    : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15044,RasStats.dwFramesXmited);
    //IDS_WAN_15045                  "\tFrames Received       : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15045,RasStats.dwFramesRcved);
    //IDS_WAN_15046                  "\tCRC    Errors         : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15046,RasStats.dwFramesRcved);
    //IDS_WAN_15047                  "\tTimeout Errors        : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15047,RasStats.dwTimeoutErr);
    //IDS_WAN_15048                  "\tAlignment Errors      : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15048,RasStats.dwAlignmentErr);
    //IDS_WAN_15049                  "\tH/W Overrun Errors    : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15049,RasStats.dwHardwareOverrunErr);
    //IDS_WAN_15050                  "\tFraming Errors        : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15050,RasStats.dwFramingErr);
    //IDS_WAN_15051                  "\tBuffer Overrun Errors : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15051,RasStats.dwBufferOverrunErr);
    //IDS_WAN_15052                  "\tCompression Ratio In  : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15052,RasStats.dwCompressionRatioIn);
    //IDS_WAN_15053                  "\tCompression Ratio Out : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15053,RasStats.dwCompressionRatioOut);
    //IDS_WAN_15054                  "\tBaud Rate ( Bps )     : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15054,RasStats.dwBps);
    //IDS_WAN_15055                  "\tConnection Duration   : %d\n" 
   AddMessageToList( &pResults->Wan.lmsgOutput, Nd_Verbose, IDS_WAN_15055,RasStats.dwConnectDuration);
  

 } // end of for loop

LERROR:
 pResults->Wan.hr = hr;
 return hr;
}



void WANGlobalPrint(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults)
{
	if (pParams->fVerbose)
	{
		PrintNewLine(pParams, 2);
		PrintTestTitleResult(pParams,
							 IDS_WAN_LONG,
							 IDS_WAN_SHORT,
							 pResults->Wan.fPerformed,
							 pResults->Wan.hr,
							 0);
	}
	
    PrintMessageList(pParams, &pResults->Wan.lmsgOutput);
}

void WANPerInterfacePrint(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults, INTERFACE_RESULT *pInterfaceResults)
{
    //Not a PerInterface test
}

void WANCleanup(IN NETDIAG_PARAMS *pParams, IN OUT NETDIAG_RESULT *pResults)
{
    MessageListCleanUp(&pResults->Wan.lmsgOutput);
}