-- DiagnosticsImplC.mesa - edited by: -- Poskanzer 27-Apr-83 10:31:52 -- Paul 9-Jan-84 10:32:49 DIRECTORY Address USING [AddressTrouble, NetworkAddressToString, StringsToNetworkAddress], CommOnlineDiagnostics USING [ CommError, EchoResults, EventReporter, GetEchoResults, StartEchoUser, WordsInPacket], DiagnosticsOps USING [ CheckForAbort, PutCR, PutChar, PutLine, PutLongNumber, PutNumber, PutText], Format USING [StringProc], Heap USING [systemZone], NetworkStream USING [AssignNetworkAddress], NSConstants USING [echoerSocket], Process USING [Detach, SecondsToTicks, SetTimeout, Pause], String USING [Replace], System USING [NetworkAddress, nullNetworkAddress]; DiagnosticsImplC: MONITOR IMPORTS Address, CommOnlineDiagnostics, DiagnosticsOps, Heap, NetworkStream, Process, String EXPORTS DiagnosticsOps = BEGIN doneWithSession: BOOLEAN ← FALSE; echoResults: CommOnlineDiagnostics.EchoResults; hostAddr: System.NetworkAddress ← System.nullNetworkAddress; showEchoes: BOOLEAN ← TRUE; EchoUserTest: PUBLIC PROCEDURE [ currDomain: LONG STRING, currOrganization: LONG STRING, usernet: LONG STRING, user: LONG STRING, targetnet: LONG STRING, target: LONG STRING, realFeedBack, waitResponse: BOOLEAN, dataPattern: CommOnlineDiagnostics.WordsInPacket, minPacketSize, maxPacketSize, delayBetween: CARDINAL] = BEGIN CopyMyAddress: Format.StringProc = { String.Replace[@myAddress, s, Heap.systemZone]}; destAddr: System.NetworkAddress; myAddr: System.NetworkAddress = NetworkStream.AssignNetworkAddress[]; myAddress: LONG STRING ← NIL; errFlag: BOOLEAN ← FALSE; showEchoes ← realFeedBack; hostAddr ← Address.StringsToNetworkAddress[ user, NSConstants.echoerSocket, usernet ! Address.AddressTrouble => BEGIN DiagnosticsOps.PutText["Echo Source address translation troubles: "L]; DiagnosticsOps.PutLine[reason]; errFlag ← TRUE; CONTINUE; END]; destAddr ← Address.StringsToNetworkAddress[ target, NSConstants.echoerSocket, targetnet ! Address.AddressTrouble => BEGIN DiagnosticsOps.PutText["Destination address translation troubles: "L]; DiagnosticsOps.PutLine[reason]; errFlag ← TRUE; CONTINUE; END]; IF hostAddr.net # myAddr.net OR hostAddr.host # myAddr.host THEN showEchoes ← FALSE; -- can't show remotes Address.NetworkAddressToString[ myAddr, CopyMyAddress ! Address.AddressTrouble => BEGIN DiagnosticsOps.PutText["Local Network Address translation troubles: "L]; DiagnosticsOps.PutLine[reason]; errFlag ← TRUE; CONTINUE; END]; IF errFlag THEN RETURN; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutLine[" Echo Test Parameters:"L]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Current Domain:Organization = "L]; DiagnosticsOps.PutText[currDomain]; DiagnosticsOps.PutChar[':]; DiagnosticsOps.PutText[currOrganization]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Local Network Address = "L]; DiagnosticsOps.PutText[myAddress]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Echo Source = "L]; DiagnosticsOps.PutText[user]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Echo Destination = "L]; DiagnosticsOps.PutText[target]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Data Pattern: "L]; DiagnosticsOps.PutText[ SELECT dataPattern FROM all0s => "All 0's"L, all1s => "All 1's"L, incrWords => "Incrementing"L, allConstant => "Constant"L, dontCare => "Random"L, ENDCASE => "Unknown"L]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Minimum Packet Size: "L]; DiagnosticsOps.PutNumber[minPacketSize, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Maximum Packet Size: "L]; DiagnosticsOps.PutNumber[maxPacketSize, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Wait for response: "L]; DiagnosticsOps.PutText[IF waitResponse THEN "YES"L ELSE "NO"L]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Delay parameter: "L]; DiagnosticsOps.PutNumber[delayBetween, 10]; DiagnosticsOps.PutText[" milliseconds"L]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutLine["Feedback key:"L]; DiagnosticsOps.PutLine["Each '!' represents a successful echo operation."L]; DiagnosticsOps.PutLine[ "Each '?' represents no packet echoed back during waiting period."L]; DiagnosticsOps.PutLine["Each '#' represents a packet echoed back late."L]; DiagnosticsOps.PutLine[ "Each '~' represents a packet which was echoed with bad data but a good CRC."L]; DiagnosticsOps.PutLine[ "Each ':' marks largest size packet has just been transmitted."L]; DiagnosticsOps.PutLine["Each '*' represents an unexpected packet."L]; DiagnosticsOps.PutCR[]; echoResults.totalTime ← 0; echoResults.totalAttempts ← 0; echoResults.successes ← 0; echoResults.timeouts ← 0; echoResults.late ← 0; echoResults.unexpected ← 0; echoResults.bad ← 0; echoResults.avgDelayInMsecs ← 0; CommOnlineDiagnostics.StartEchoUser[ targetSystemElement: destAddr, echoParams: [ minPacketSizeInBytes: minPacketSize, maxPacketSizeInBytes: maxPacketSize, wordContents: dataPattern, waitForResponse: waitResponse, minMsecsBetweenPackets: delayBetween], eventReporter: PrintFeedback, host: hostAddr ! CommOnlineDiagnostics.CommError => BEGIN DiagnosticsOps.PutText["Communication Error: "L]; DiagnosticsOps.PutLine[ SELECT reason FROM transmissionMediumProblem => "Transmission Medium Problem"L, noAnswerOrBusy => "No Answer Or Busy"L, noRouteToSystemElement => "No Route To System Element"L, remoteSystemElementNotResponding => "Remote System Element Not Responding"L, tooManyConnections => "Too Many Connections"L, noSuchDiagnostic => "No Such Diagnostic"L, communicationError => "Communication Error"L, ENDCASE => "Unknown Error"L]; CONTINUE; END]; --remote needs ServerOn!!!!! DiagnosticsOps.PutLine["Echo Test Started"L]; doneWithSession ← FALSE; Process.Detach[FORK Echoer[]]; DO DiagnosticsOps.CheckForAbort[ ! ABORTED => EXIT]; Process.Pause[Process.SecondsToTicks[1]]; ENDLOOP; doneWithSession ← TRUE; [echoResults] ← CommOnlineDiagnostics.GetEchoResults[ stopIt: TRUE, host: hostAddr ! CommOnlineDiagnostics.CommError => BEGIN DiagnosticsOps.PutText["Communication Error: "L]; DiagnosticsOps.PutLine[ SELECT reason FROM transmissionMediumProblem => "Transmission Medium Problem"L, noAnswerOrBusy => "No Answer Or Busy"L, noRouteToSystemElement => "No Route To System Element"L, remoteSystemElementNotResponding => "Remote System Element Not Responding"L, tooManyConnections => "Too Many Connections"L, noSuchDiagnostic => "No Such Diagnostic"L, communicationError => "Communication Error"L, ENDCASE => "Unknown Error"L]; CONTINUE; END]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutLine["Final results: "L]; PrintResults[]; DiagnosticsOps.PutLine["Done"L]; END; -- EchoUserTest -- Echoer: ENTRY PROC = { cv: CONDITION; Process.SetTimeout[@cv, Process.SecondsToTicks[50]]; UNTIL doneWithSession DO WAIT cv; IF doneWithSession THEN EXIT; [echoResults] ← CommOnlineDiagnostics.GetEchoResults[ stopIt: FALSE, host: hostAddr ! CommOnlineDiagnostics.CommError => BEGIN DiagnosticsOps.PutText["Communication Error: "L]; DiagnosticsOps.PutLine[ SELECT reason FROM transmissionMediumProblem => "Transmission Medium Problem"L, noAnswerOrBusy => "No Answer Or Busy"L, noRouteToSystemElement => "No Route To System Element"L, remoteSystemElementNotResponding => "Remote System Element Not Responding"L, tooManyConnections => "Too Many Connections"L, noSuchDiagnostic => "No Such Diagnostic"L, communicationError => "Communication Error"L, ENDCASE => "Unknown Error"L]; EXIT; END]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Intermediate results: "L]; PrintResults[]; ENDLOOP}; PrintResults: PROCEDURE [] = { DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Total number of packet attempts: "L]; DiagnosticsOps.PutLongNumber[echoResults.totalAttempts, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Number of good packets received: "L]; DiagnosticsOps.PutLongNumber[echoResults.successes, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Number of timed-out packets: "L]; DiagnosticsOps.PutLongNumber[echoResults.timeouts, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Number of late packets: "L]; DiagnosticsOps.PutLongNumber[echoResults.late, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText["Number of bad packets: "L]; DiagnosticsOps.PutLongNumber[echoResults.bad, 10]; DiagnosticsOps.PutCR[]; DiagnosticsOps.PutText[ "Percent of packets transmitted that were received correctly: "L]; DiagnosticsOps.PutLongNumber[ IF echoResults.totalAttempts = 0 THEN 0 ELSE (echoResults.successes * 100) / echoResults.totalAttempts, 10]; DiagnosticsOps.PutLine["%"L]; DiagnosticsOps.PutCR[]}; PrintFeedback: CommOnlineDiagnostics.EventReporter = BEGIN -- If NOT showEchoes Then just Return IF showEchoes THEN DiagnosticsOps.PutChar[ SELECT event FROM success => '!, late => '#, timeout => '?, badDataGoodCRC => '~, sizeChange => ':, unexpected => '*, ENDCASE => '@]; END; END.