// -------------------------------------------- // // Copyright (c) 1990 Microsoft Corporation // // Module Name: // // results.c // // Abstract: // // This module handles the printing of the results of a given command. // // Author: // // Tom Adams (tomad) 2-Apr-1991 // // Revision History: // // 2-Apr-1991 tomad // // created // // Sanjeev Katariya (sanjeevk) // 4-12-1993 #5963 Events printed out are not being used/tested for one to one // correspondence The IndicationStatus. Thereby I am adding a // MAY_DIFFER flag to the event // // Tim Wynsma (timothyw) 4-27-94 // Added performance testing // 5-18-94 // Revised output format for performance tests; cleanup // 6-08-94 // Chgd perf output format for client/server model // // -------------------------------------------- #include #include #include #include #include #include #include #include "tpctl.h" #include "parse.h" VOID TpctlPrintResults( PREQUEST_RESULTS Results, DWORD CmdCode, NDIS_OID OID ) // ---------- // // Routine Description: // // Arguments: // // Return Value: // // --------- { DWORD Status; LPSTR TmpBuf; DWORD BytesWritten; BOOL ErrorReturned = FALSE; TmpBuf = GlobalBuf; TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tCmdCode = %s\n", TpctlGetCmdCode( CmdCode )); if ( CmdCode == SETINFO ) { //ASSERT( Results->OID == OID ); //ASSERT( Results->NdisRequestType == NdisRequestSetInformation ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tOID = %d\n",OID); } TmpBuf += (BYTE)sprintf(TmpBuf,"\tReturn Status = %s\n", TpctlGetStatus( Results->RequestStatus )); if ( Results->RequestStatus != STATUS_SUCCESS ) { ErrorReturned = TRUE; } TmpBuf += (BYTE)sprintf(TmpBuf,"\tRequest Pended = %s", Results->RequestPended ? "TRUE" : "FALSE"); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); if ( CmdCode == OPEN ) { if ( Results->OpenRequestStatus != NDIS_STATUS_SUCCESS ) { TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tWARNING: Secondary Open Request failed.\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\tRequest OID = 0x%08lX\n",Results->OID); TmpBuf += (BYTE)sprintf(TmpBuf,"\tRequest Returned Status = %s\n", TpctlGetStatus( Results->OpenRequestStatus )); if ( Results->OpenRequestStatus != STATUS_SUCCESS ) { ErrorReturned = TRUE; } TmpBuf += (BYTE)sprintf(TmpBuf,"\tBytesWritten = %d\n", Results->BytesReadWritten); TmpBuf += (BYTE)sprintf(TmpBuf,"\tBytesNeeded = %d\n\n", Results->BytesNeeded); TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tThe open instance exists but some tests may not\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\twork properly due to this failure.\n"); } } if ( Verbose ) { if ( !WriteFile(GetStdHandle( STD_OUTPUT_HANDLE ), GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to screen failed, returned 0x%lx\n",(PVOID)Status); } } if ( CommandsFromScript ) { if ( !WriteFile(Scripts[ScriptIndex].LogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } else if ( CommandLineLogging ) { if( !WriteFile( CommandLineLogHandle, GlobalBuf, (TmpBuf-GlobalBuf), &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } } VOID TpctlPrintStressResults( IN PSTRESS_RESULTS Results, IN BOOL Ack10 ) // --------- // // Routine Description: // // Arguments: // // Return Value: // // -------- { PGLOBAL_COUNTERS gc; PINSTANCE_COUNTERS ic; DWORD i; DWORD Status; LPSTR TmpBuf; DWORD BytesWritten; //ASSERT( Results->Signature == STRESS_RESULTS_SIGNATURE ); TmpBuf = GlobalBuf; TmpBuf += (BYTE)sprintf(TmpBuf,"\nCLIENT STRESS STATISTICS:\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"Client Address %02X-%02X-%02X-%02X-%02X-%02X - ", Results->Address[0],Results->Address[1],Results->Address[2], Results->Address[3],Results->Address[4],Results->Address[5]); TmpBuf += (BYTE)sprintf(TmpBuf,"OpenInstance %d",Results->OpenInstance); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER\n" ); gc = &Results->Global; for ( i=0;iNumServers;i++ ) { ic = &Results->Servers[i].Instance; gc->Sends += ic->Sends; gc->Receives += ic->Receives; gc->CorruptRecs = ic->CorruptRecs; } TmpBuf += (BYTE)sprintf(TmpBuf,"Total Packets Sent:\t\t%10lu\n", gc->Sends); TmpBuf += (BYTE)sprintf(TmpBuf,"Total Packets Received:\t\t%10lu\n", gc->Receives); if ( Ack10 == TRUE ) { TmpBuf += (BYTE)sprintf(TmpBuf,"Total Packets Lost:\t\t%10lu\n\n", (( 10 * gc->Sends ) - gc->Receives )); } else { TmpBuf += (BYTE)sprintf(TmpBuf,"Total Packets Lost:\t\t%10lu\n\n", ( gc->Sends - gc->Receives )); } if ( gc->CorruptRecs > 0 ) { TmpBuf += (BYTE)sprintf(TmpBuf,"Corrupted Packet Receives:\t%10lu\n\n", gc->CorruptRecs); } if ( gc->InvalidPacketRecs > 0 ) { TmpBuf += (BYTE)sprintf(TmpBuf,"Invalid Packet Receives:\t%10lu\n\n", gc->InvalidPacketRecs); } // // Display the number of packets sent/received per second. // TmpBuf += (BYTE)sprintf(TmpBuf,"Packets Per Second:\t\t%10lu", Results->PacketsPerSecond ); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER\n" ); // // And then print out the information about each of the Servers // involved in the test. // TmpBuf += (BYTE)sprintf(TmpBuf,"The Client had %d Server(s) for this test as follows:", Results->NumServers); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER\n" ); for ( i=0;iNumServers;i++ ) { //ASSERT( Results->Servers[i].Signature == STRESS_RESULTS_SIGNATURE ); TmpBuf += (BYTE)sprintf(TmpBuf,"Server # %d - ",i+1); TmpBuf += (BYTE)sprintf(TmpBuf,"Address %02X-%02X-%02X-%02X-%02X-%02X - ", Results->Servers[i].Address[0],Results->Servers[i].Address[1], Results->Servers[i].Address[2],Results->Servers[i].Address[3], Results->Servers[i].Address[4],Results->Servers[i].Address[5]); TmpBuf += (BYTE)sprintf(TmpBuf,"OpenInstance %d", Results->Servers[i].OpenInstance); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); } TmpBuf += (BYTE)sprintf(TmpBuf,"\nSERVER STRESS STATISTICS:\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"Server Instance Counters collected on the Client:\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"Server #"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu",i+1); } ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER\n" ); // Number of packets sent to the server. TmpBuf += (BYTE)sprintf(TmpBuf,"S:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].Instance.Sends); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packets received from the server. TmpBuf += (BYTE)sprintf(TmpBuf,"R:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].Instance.Receives); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packets lost in transit to the server and back. TmpBuf += (BYTE)sprintf(TmpBuf,"L:\t"); for ( i=0;iNumServers;i++ ) { if ( Ack10 == TRUE ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", (( 10 * Results->Servers[i].Instance.Sends ) - Results->Servers[i].Instance.Receives )); } else { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", ( Results->Servers[i].Instance.Sends - Results->Servers[i].Instance.Receives )); } } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packet sends that pended. TmpBuf += (BYTE)sprintf(TmpBuf,"SP:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].Instance.SendPends); } ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); // Number of packet sends pending that completed. TmpBuf += (BYTE)sprintf(TmpBuf,"SC:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].Instance.SendComps); } ADD_DIFF_FLAG( TmpBuf, "EQUAL_LAST" ); // Number of packet sends that failed. TmpBuf += (BYTE)sprintf(TmpBuf,"SF:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].Instance.SendFails); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of corrupted packets received. TmpBuf += (BYTE)sprintf(TmpBuf,"CR:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].Instance.CorruptRecs); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\nServer Instance Counters collected on the Server:\n\n"); // Number of packets received from the server. TmpBuf += (BYTE)sprintf(TmpBuf,"R:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.Receives); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packets sent to the server. TmpBuf += (BYTE)sprintf(TmpBuf,"S:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.Sends); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packets lost in transit to the server and back. TmpBuf += (BYTE)sprintf(TmpBuf,"L:\t"); for ( i=0;iNumServers;i++ ) { if ( Ack10 == TRUE ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", (( 10 * Results->Servers[i].S_Instance.Receives ) - Results->Servers[i].S_Instance.Sends )); } else { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", ( Results->Servers[i].S_Instance.Receives - Results->Servers[i].S_Instance.Sends )); } } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packets sends that failed. TmpBuf += (BYTE)sprintf(TmpBuf,"SF:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.SendFails); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); // Number of packets sends that pended. TmpBuf += (BYTE)sprintf(TmpBuf,"SP:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.SendPends); } ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); // Number of packets sends pending that completed. TmpBuf += (BYTE)sprintf(TmpBuf,"SC:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.SendComps); } ADD_DIFF_FLAG( TmpBuf, "EQUAL_LAST" ); // Number of transfer datas on packets. TmpBuf += (BYTE)sprintf(TmpBuf,"TD:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.XferData); } ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); // Number of transfer datas on packets that pended. TmpBuf += (BYTE)sprintf(TmpBuf,"TDP:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.XferDataPends); } ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); // Number of transfer datas on packets that completed. TmpBuf += (BYTE)sprintf(TmpBuf,"TDC:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.XferDataComps); } ADD_DIFF_FLAG( TmpBuf, "EQUAL_LAST" ); // Number of transfer datas on packets that failed. TmpBuf += (BYTE)sprintf(TmpBuf,"TDF:\t"); for ( i=0;iNumServers;i++ ) { TmpBuf += (BYTE)sprintf(TmpBuf,"%10lu", Results->Servers[i].S_Instance.XferDataFails); } TmpBuf += (BYTE)sprintf(TmpBuf,"\n"); if ( Verbose ) { if ( !WriteFile(GetStdHandle( STD_OUTPUT_HANDLE ), GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to screen failed, returned 0x%lx\n",(PVOID)Status); } } if ( CommandsFromScript ) { if ( !WriteFile(Scripts[ScriptIndex].LogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } else if ( CommandLineLogging ) { if ( !WriteFile(CommandLineLogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } TpctlZeroStressStatistics( Results ); } VOID TpctlPrintSendResults( PSEND_RECEIVE_RESULTS Results ) // ---- // // Routine Description: // // Arguments: // // Return Value: // // ----- { DWORD Status; LPSTR TmpBuf; DWORD BytesWritten; //ASSERT( Results->Signature == SENDREC_RESULTS_SIGNATURE ); TmpBuf = GlobalBuf; TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tPacket Sends = %10lu\n", Results->Counters.Sends); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Pends = %10lu", Results->Counters.SendPends); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Send Completes = %10lu", Results->Counters.SendComps); ADD_DIFF_FLAG( TmpBuf, "EQUAL_LAST" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Send Fails = %10lu\n", Results->Counters.SendFails); if ( Verbose ) { if ( !WriteFile(GetStdHandle( STD_OUTPUT_HANDLE ), GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to screen failed, returned 0x%lx\n",(PVOID)Status); } } if ( CommandsFromScript ) { if ( !WriteFile(Scripts[ScriptIndex].LogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } else if ( CommandLineLogging ) { if ( !WriteFile(CommandLineLogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } } VOID TpctlPrintReceiveResults( PSEND_RECEIVE_RESULTS Results ) // ------ // // Routine Description: // // Arguments: // // Return Value: // // ---- { DWORD Status; LPSTR TmpBuf; DWORD BytesWritten; //ASSERT( Results->Signature == SENDREC_RESULTS_SIGNATURE ); TmpBuf = GlobalBuf; // Receive statistics TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tPacket Receives = %10lu\n", Results->Counters.Receives); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Receive Completes = %10lu", Results->Counters.ReceiveComps); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tCorrupt Receives = %10lu\n", Results->Counters.CorruptRecs); // RESEND initiated statistics TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tRESEND initiated Packet Sends = %10lu\n", Results->Counters.Sends); TmpBuf += (BYTE)sprintf(TmpBuf,"\tRESEND initiated Packet Send Pends = %10lu", Results->Counters.SendPends); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tRESEND initiated Packet Send Completes = %10lu", Results->Counters.SendComps); ADD_DIFF_FLAG( TmpBuf, "EQUAL_LAST" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tRESEND initiated Packet Send Fails = %10lu\n", Results->Counters.SendFails); // Transfer Data statistics TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tPacket Transfer Data = %10lu\n", Results->Counters.XferData); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Transfer Data Pends = %10lu", Results->Counters.XferDataPends); ADD_DIFF_FLAG( TmpBuf, "MAY_DIFFER" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Transfer Data Completes = %10lu", Results->Counters.XferDataComps); ADD_DIFF_FLAG( TmpBuf, "EQUAL_LAST" ); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Transfer Data Fails = %10lu\n", Results->Counters.XferDataFails); if ( Verbose ) { if ( !WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to screen failed, returned 0x%lx\n",(PVOID)Status); } } if ( CommandsFromScript ) { if ( !WriteFile(Scripts[ScriptIndex].LogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } else if ( CommandLineLogging ) { if ( !WriteFile(CommandLineLogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } } VOID TpctlPrintPerformResults( PPERF_RESULTS Results ) // ---- // // Routine Description: // // Arguments: // // Return Value: // // ----- { DWORD Status; LPSTR TmpBuf; DWORD BytesWritten; ULONG speed; double d_speed; PULONG KernelPercent; ULONG NumCpus; ASSERT( Results->Signature == PERF_RESULTS_SIGNATURE ); if (!Results->ResultsExist) { return; } if (Results->Mode < 4) { NumCpus = CpuUsageGetData(&KernelPercent, Results->Milliseconds); } else if (Results->Mode < 6) { NumCpus = CpuUsageGetData(&KernelPercent, Results->S_Milliseconds); } TmpBuf = GlobalBuf; switch(Results->Mode) { case 0: // client -> address TmpBuf += (BYTE)sprintf(TmpBuf, "\n\nPerformance Test 0: Client -> Address\n\n"); break; case 1: // client -> server TmpBuf += (BYTE)sprintf(TmpBuf, "\n\nPerformance Test 1: Client -> Server\n\n"); break; case 2: // client -> server, server ACKS TmpBuf += (BYTE)sprintf(TmpBuf, "\n\nPerformance Test 2: Client -> Server with ACKS\n\n"); break; case 3: // client -> server, server -> client TmpBuf += (BYTE)sprintf(TmpBuf, "\n\nPerformance Test 3: Client <-> Server\n\n"); break; case 4: // server -> client TmpBuf += (BYTE)sprintf(TmpBuf, "\n\nPerformance Test 4: Server -> Client\n\n"); break; case 5: // client REQS, server -> client TmpBuf += (BYTE)sprintf(TmpBuf, "\n\nPerformance Test 5: Server -> Client with REQS\n\n"); break; default: printf("\n\nUnknown performance Test: %d\n\n", Results->Mode); return; } if (!NumCpus) { TmpBuf += (BYTE)sprintf(TmpBuf, "Cpu usage information not available\n\n"); } else if (NumCpus == 1) { if (KernelPercent[0] > 1000) { KernelPercent[0] = 1000; } TmpBuf += (BYTE)sprintf(TmpBuf, "Cpu usage = %d.%d%%\n\n",KernelPercent[0]/10, KernelPercent[0]%10); } else { ULONG cpucnt; ULONG *procPercent; procPercent = &KernelPercent[1]; TmpBuf += (BYTE)sprintf(TmpBuf, "Cpu usage per processor: "); for(cpucnt=0; cpucnt < NumCpus; cpucnt++) { if ( (cpucnt != 0) && ((cpucnt % 4) == 0) ) { ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); TmpBuf += (BYTE)sprintf(TmpBuf, " "); } if (*procPercent > 1000) { *procPercent = 1000; } TmpBuf += (BYTE)sprintf(TmpBuf, "#%d - %d.%d%% ", cpucnt, *procPercent/10, *procPercent%10); } ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); TmpBuf += (BYTE)sprintf(TmpBuf, "Average cpu usage = %d.%d%%\n\n", KernelPercent[0]/10, KernelPercent[0]%10); } TmpBuf += (BYTE)sprintf(TmpBuf, "Sending %d packets of %d bytes each\n\n", Results->PacketCount, Results->PacketSize); if (Results->Mode < 4) { TmpBuf += (BYTE)sprintf(TmpBuf, "Client transmission statistics\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\tPackets Sent = %10lu\n", Results->Sends); if (Results->SendFails) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Send Failures = %10lu\n", Results->SendFails); } if (Results -> Restarts) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tRestarts Required = %10lu\n", Results->Restarts); } TmpBuf += (BYTE)sprintf(TmpBuf,"\tElapsed time = %10lu milliseconds\n", Results->Milliseconds); d_speed = (1.0 * Results->Sends) / Results->Milliseconds; speed = (ULONG)((1000.0 * d_speed) + 0.5); TmpBuf += (BYTE)sprintf(TmpBuf,"\tTransmit Rate = %10lu packets per second\n", speed); d_speed *= Results->PacketSize; speed = (ULONG)(d_speed + 0.5); TmpBuf += (BYTE)sprintf(TmpBuf,"\t = %10lu Kbytes per second\n\n", speed); if (NumCpus && (Results->Mode < 2)) { d_speed *= 100.0; d_speed /= KernelPercent[0]; speed = (ULONG)(d_speed + 0.5); TmpBuf += (BYTE)sprintf(TmpBuf, "\tSend KB/sec/cpu = %8lu.%u\n\n", speed/10, speed%10); } if (Results->Mode > 0) { TmpBuf += (BYTE)sprintf(TmpBuf, "Server reception statistics\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tPackets Received = %10lu\n", Results->S_Receives); if (Results->S_Receives != Results->PacketCount) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tPackets Lost = %10lu\n", Results->PacketCount - Results->S_Receives); } if (Results->S_SelfReceives) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tOwn Packets Received = %10lu\n", Results->S_SelfReceives); } } } if (Results->Mode > 2) { TmpBuf += (BYTE)sprintf(TmpBuf, "\nServer transmission statistics\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tPackets Sent = %10lu\n", Results->S_Sends); if (Results->S_SendFails) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tPacket Send Failures = %10lu\n", Results->S_SendFails); } if (Results -> S_Restarts) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tRestarts Required = %10lu\n", Results->S_Restarts); } TmpBuf += (BYTE)sprintf(TmpBuf,"\tElapsed time = %10lu milliseconds\n", Results->S_Milliseconds); d_speed = (1.0 * Results->S_Sends) / Results->S_Milliseconds; speed = (ULONG)((1000.0 * d_speed) + 0.5); TmpBuf += (BYTE)sprintf(TmpBuf,"\tTransmit Rate = %10lu packets per second\n", speed); d_speed *= Results->PacketSize; speed = (ULONG)(d_speed + 0.5); TmpBuf += (BYTE)sprintf(TmpBuf,"\t = %10lu Kbytes per second\n\n", speed); TmpBuf += (BYTE)sprintf(TmpBuf, "Client reception statistics\n\n"); TmpBuf += (BYTE)sprintf(TmpBuf,"\n\tPackets Received = %10lu\n", Results->Receives); if (NumCpus && (Results->Mode == 4)) { d_speed *= 100.0; d_speed /= KernelPercent[0]; speed = (ULONG)(d_speed + 0.5); TmpBuf += (BYTE)sprintf(TmpBuf, "\tReceive KB/sec/cpu = %8lu.%u\n\n", speed/10, speed%10); } if (Results->Receives != Results->PacketCount) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tPackets Lost = %10lu", Results->PacketCount - Results->Receives); ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); } if (Results->SelfReceives) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tOwn Packets Received = %10lu", Results->SelfReceives); ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); } } TmpBuf += (BYTE)sprintf(TmpBuf, "\n\n\n"); if ( Verbose ) { if ( !WriteFile(GetStdHandle( STD_OUTPUT_HANDLE ), GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to screen failed, returned 0x%lx\n",(PVOID)Status); } } if ( CommandsFromScript ) { if ( !WriteFile(Scripts[ScriptIndex].LogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } } VOID TpctlPrintEventResults( PEVENT_RESULTS Event ) // ---- // // Routine Description: // // Arguments: // // Return Value: // // --- { DWORD Status; LPSTR TmpBuf; DWORD BytesWritten; //ASSERT( Event->Signature == EVENT_RESULTS_SIGNATURE ); TmpBuf = GlobalBuf; TmpBuf += (BYTE)sprintf(TmpBuf,"\tEvent Type = %s", TpctlGetEventType( Event->TpEventType )); // // SanjeevK : #5963 // #11324 Enhancement // if ( ( Event->TpEventType == IndicateStatusComplete ) || ( Event->TpEventType == IndicateStatus ) ) { ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); } else { TmpBuf += (BYTE)sprintf(TmpBuf,"\n" ); } if ( Event->QueueOverFlowed == TRUE ) { TmpBuf += (BYTE)sprintf(TmpBuf,"\tEvent Queue Overflowed."); // // SanjeevK : #5963 // // Note: This flag was added since all this does is cause an // this line to be ignored. The event however gets // reported which is the primary aim of this statement. // ADD_SKIP_FLAG( TmpBuf, "SKIP_LINE" ); } if ( Verbose ) { if ( !WriteFile(GetStdHandle( STD_OUTPUT_HANDLE ), GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to screen failed, returned 0x%lx\n",(PVOID)Status); } } if ( CommandsFromScript ) { if ( !WriteFile(Scripts[ScriptIndex].LogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } else if ( CommandLineLogging ) { if ( !WriteFile(CommandLineLogHandle, GlobalBuf, TmpBuf-GlobalBuf, &BytesWritten, NULL )) { Status = GetLastError(); TpctlErrorLog("\n\tTpctl: WriteFile to logfile failed, returned 0x%lx\n",(PVOID)Status); } } } VOID TpctlZeroStressStatistics( PSTRESS_RESULTS Results ) // ---- // // Routine Description: // // This routine zeros out the stress results buffer. // // Arguments: // // Results - the buffer to zero out the contents of. // // Return Value: // // None. // // ---- { DWORD i; ZeroMemory (Results->Address, ADDRESS_LENGTH); Results->OpenInstance = 0xFFFFFFFF; Results->NumServers = 0; Results->Global.Sends = 0; Results->Global.Receives = 0; Results->Global.CorruptRecs = 0; Results->Global.InvalidPacketRecs = 0; for ( i=0;iServers[i].Address, ADDRESS_LENGTH); Results->Servers[i].OpenInstance = 0xFFFFFFFF; Results->Servers[i].StatsRcvd = FALSE; Results->Servers[i].Instance.Sends = 0; Results->Servers[i].Instance.SendPends = 0; Results->Servers[i].Instance.SendComps = 0; Results->Servers[i].Instance.SendFails = 0; Results->Servers[i].Instance.Receives = 0; Results->Servers[i].Instance.CorruptRecs = 0; Results->Servers[i].S_Instance.Sends = 0; Results->Servers[i].S_Instance.SendPends = 0; Results->Servers[i].S_Instance.SendComps = 0; Results->Servers[i].S_Instance.SendFails = 0; Results->Servers[i].S_Instance.Receives = 0; Results->Servers[i].S_Instance.CorruptRecs = 0; Results->Servers[i].S_Global.Sends = 0; Results->Servers[i].S_Global.Receives = 0; Results->Servers[i].S_Global.CorruptRecs = 0; Results->Servers[i].S_Global.InvalidPacketRecs = 0; } } DWORD TpctlLog( LPSTR String, PVOID Input ) { DWORD Status; // // If we are in verbose mode, then print the string to the screen. // if ( Verbose ) { printf( String,Input ); // // If we are reading commands from a script write the string to // the script log file. // if ( CommandsFromScript ) { Status = TpctlScriptLog( String, Input ); } // // Otherwise if we are logging commands entered by hand write // the string to the commandline log file. // else if ( CommandLineLogging ) { Status = TpctlCmdLneLog( String,Input ); } } return NO_ERROR; } DWORD TpctlErrorLog( LPSTR String, PVOID Input ) { DWORD Status; // // First print the error message to the screen. // printf( String,Input ); // // If we are reading commands from a script write the string to // the script log file. // if ( CommandsFromScript ) { Status = TpctlScriptLog( String, Input ); } // // Otherwise we are logging commands entered by hand write the // string to the commandline log file. // else if ( CommandLineLogging ) { Status = TpctlCmdLneLog( String,Input ); } return NO_ERROR; } DWORD TpctlScriptLog( LPSTR String, PVOID Input ) { DWORD Status; BYTE Buffer[0x100]; DWORD BytesWritten; // // If we are reading commands from a script write the string to // the script's log file. // if ( CommandsFromScript ) { // // set up the buffer that will print it to the logfile, and write // it out. // sprintf( Buffer,String,Input ); if ( !WriteFile(Scripts[ScriptIndex].LogHandle, Buffer, strlen( Buffer ), &BytesWritten, NULL )) { Status = GetLastError(); printf("\n\tTpctlScriptLog: write to logfile failed, returned 0x%lx\n",Status); return Status; } } return NO_ERROR; } DWORD TpctlCmdLneLog( LPSTR String, PVOID Input ) { DWORD Status; BYTE Buffer[0x100]; DWORD BytesWritten; // // If we are logging commands entered by hand write the // string to that log file. We will not do this if we are // already logging commands to a scriptfile log file.. // if (( CommandLineLogging ) && ( !CommandsFromScript )) { // // Then set up the buffer that will print it to the logfile // sprintf( Buffer,String,Input ); // // and print it. // if ( !WriteFile(CommandLineLogHandle, Buffer, strlen( Buffer ), &BytesWritten, NULL )) { Status = GetLastError(); printf("\n\tTpctlCmdLneLog: write to command logging file failed, returned 0x%lx\n", Status); return Status; } } return NO_ERROR; }