%OWNINTEGER END = -1 %OWNINTEGERARRAY TIME(0:1100) = 0(1101) %OWNINTEGERARRAY KBS(0:1100) = 0(1101) %OWNINTEGERARRAY CPU(0:1100) = 0(1101) %OWNINTEGERARRAY USERS(0:1100) = 0(1101) %OWNINTEGERARRAY RJE(0:1100) = 0(1101) %OWNINTEGERARRAY PKTS(0:1100) = 0(1101) %OWNINTEGERARRAY SBR(0:1100) = 0(1101) %OWNINTEGERARRAY ITP(0:1100) = 0(1101) %OWNINTEGERARRAY RJEI(0:1100) = 0(1101) %OWNREAL TIMEI = 1, MAX1, MAX2, SLOPE1, SLOPE2 %ROUTINESPEC SPECGRAPHS(%STRING (255) S) %EXTERNALROUTINESPEC DEFINE(%STRING (255) S) %EXTERNALROUTINESPEC CLOSE STREAM(%INTEGER CHAM) %EXTERNALROUTINE FEPDO(%STRING (255) S) %STRING (255) T, U, UU, TITLE, UUU %RECORDFORMAT FF( %C %INTEGER TIM, USERS,STA,CPU,PKTS,SBR,BYT,RJEO,RJEI) %INTEGER I, DIFF, K, L, US, CP, KB, PK, RJ, WHO, WHO1, WHO2 %OWNINTEGER USERSX, STA, CPUX, PKTSX, SBRX, BYT, RJEO, TIM, RJEIX %OWNINTEGER POINTS, FEP NO = -1, FLAG = -1 %CONSTINTEGERARRAY CPU F(0:6) = %C 118(3), 139, 97, 260, 97 %RECORD F(FF) !! !! !! %ROUTINE RD(%INTEGERNAME N) READ(N) %IF N< 0 %THEN N = N+32768*2 %END !! !! %ROUTINE DO REPLY %INTEGER K %ROUTINE OUT(%INTEGER N) %END %INTEGERFN CALC(%INTEGER NEW, %INTEGERNAME OLD, %INTEGER X) %INTEGER N, P, K %IF OLD>NEW %THEN OLD = OLD-32768*2 N = NEW-OLD %IF N < 0 %THEN N = -N N = N//DIFF; P = N %IF X = -1 %START P =100-((N*100)//CPU F(FEP NO)) OUT(P) %FINISHELSESTART %IF X = -2 %START; ! BYTES N = N+2*PK; ! ALLOW FOR ROUNDING (SEE SBR) %IF N < 128 %THEN OUT(N*8) %ELSE %C %START K = N//128 N = (N-(K*128))*8 %FINISH %FINISHELSESTART P = N*2*X; OUT(P) %FINISH %FINISH OLD = NEW %RESULT = P %END !! DIFF = F_TIM-TIM DIFF = 1 %IF DIFF<=0 TIM = F_TIM STA = F_STA OUT(F_USERS) CP = CALC(F_CPU, CPUX, -1) I = CALC(F_PKTS, PKTSX, 1) PK = I K = CALC(F_RJEO, RJEO, 1) L = CALC(F_SBR, SBRX, 1) OUT(I-K-L) RJ = CALC(F_RJEI, RJEIX, 1) KB = CALC(F_BYT, BYT, -2) %IF CP < -2 %OR CP > 110 %START %FINISHELSESTART END = END+1 KBS(END) = (KB*16)//750 %IF CP<0 %OR CP>100 %THEN CP=0 %IF F_USERS<0 %THEN F_USERS = 0 CPU(END) = CP; USERS(END) = F_USERS PKTS(END) = I; RJE(END) = K SBR(END) = L; ITP(END) = I-K-L RJEI(END) = RJ %FINISH POINTS = POINTS+1 %END FLAG = -1 %UNLESS S -> T.(":").UUU %START PRINTSTRING("PARAMS ??? ") %RETURN %FINISH U = "SS#TMP" UU = "SS#TMP2" FEP NO = CHARNO(UUU, 1)-'0' DEFINE("1,".T) SELECT INPUT(1) %CYCLE READSYMBOL(I) %EXIT %IF I = NL %REPEAT %CYCLE RD(WHO) %EXIT %IF WHO > 32000 %IF WHO # FEP NO %AND FEP NO # -1 %START %CYCLE WHO1 = 1, 1, 9 RD(WHO2) %REPEAT %CONTINUE %FINISH FLAG = 1 RD(F_TIM) %EXIT %IF END = 1100 F_TIM = F_TIM//6 RD(F_USERS); RD(F_STA) %IF F_USERS>32766 %THEN F_USERS = -1 RD(F_CPU); RD(F_PKTS); RD(F_SBR) RD(F_BYT); RD(F_RJEO) RD(F_RJEI) DO REPLY %REPEAT SELECT OUTPUT(0); SELECT INPUT(0); CLOSE STREAM(1) CLOSE STREAM(3) %IF FLAG >= 0 %AND END = -1 %START PRINTSTRING("INCONSISTENCY ******************** ") %STOP %FINISH SPECGRAPHS(UU) %UNLESS FLAG < 0 %END %EXTERNALROUTINE MAINDO(%STRING (255) S) %EXTERNALROUTINESPEC PROMPT(%STRING (15) S) %DYNAMICROUTINESPEC SPECGRAPHS(%STRING (255) S) %EXTERNALROUTINESPEC DEFINE(%STRING (255) S) %STRING (255) T, U, UU, TITLE, UUU %RECORDFORMAT FF( %C %INTEGER TIM, USERS,STA,CPU,PKTS,SBR,BYT,RJEO,RJEI) %INTEGER I, DIFF, K, L, US, CP, KB, PK, RJ, WHO, WHO1, WHO2, JUNK %OWNINTEGER USERSX, STA, CPUX, PKTSX, SBRX, BYT, RJEO, TIM, RJEIX %OWNINTEGER POINTS, FEP NO = -1 %CONSTINTEGERARRAY CPU F(0:3) = %C 354, 0, 0, 236; ! NB ASSUMES 2 FEPS ON 2972 %RECORD F(FF) !! !! !! %ROUTINE RD(%INTEGERNAME N) READ(N) %IF N< 0 %THEN N = N+32768*2 %END !! !! %ROUTINE DO REPLY %INTEGER K %ROUTINE OUT(%INTEGER N) %END %INTEGERFN CALC(%INTEGER NEW, %INTEGERNAME OLD, %INTEGER X) %INTEGER N, P, K %IF OLD>NEW %THEN OLD = OLD-32768*2 %IF OLD>NEW %THEN OLD = OLD-32768*2 N = NEW-OLD %IF N < 0 %THEN N = -N N = N//DIFF; P = N %IF X = -1 %START P =100-((N*100)//CPU F(FEP NO)) OUT(P) %FINISHELSESTART %IF X = -2 %START; ! BYTES N = N+2*PK; ! ALLOW FOR ROUNDING (SEE SBR) %IF N < 128 %THEN OUT(N*8) %ELSE %C %START K = N//128 N = (N-(K*128))*8 %FINISH %FINISHELSESTART P = N*2*X; OUT(P) %FINISH %FINISH OLD = NEW %RESULT = P %END !! DIFF = F_TIM-TIM DIFF = 1 %IF DIFF<=0 TIM = F_TIM STA = F_STA OUT(F_USERS) CP = CALC(F_CPU, CPUX, -1) I = CALC(F_PKTS, PKTSX, 1) PK = I K = CALC(F_RJEO, RJEO, 1) L = CALC(F_SBR, SBRX, 1) OUT(I-K-L) RJ = CALC(F_RJEI, RJEIX, 1) KB = CALC(F_BYT, BYT, -2) %IF CP < -2 %OR CP > 110 %START ! PRINTSTRING(" 0 0 0 0 0 0 0 0!"); ! DELETED FOR NOW %FINISHELSESTART END = END+1 KBS(END) = (KB*16)//750 %IF CP<0 %OR CP>100 %THEN CP=0 %IF F_USERS<0 %THEN F_USERS = 0 CPU(END) = CP; USERS(END) = F_USERS PKTS(END) = I; RJE(END) = K SBR(END) = L; ITP(END) = I-K-L RJEI(END) = RJ %FINISH POINTS = POINTS+1 %END %UNLESS S -> T.("/").U %START T = S %IF S -> T.(":").U %START FEPNO = CHARNO(U, 1)-'0' %FINISH U = "SS#LIST"; UU = "MON#TMP"; UUU = "G" %FINISHELSESTART %UNLESS U -> U.(":").UUU %THEN UUU="" %UNLESS U -> U.(",").UU %THEN UU = "MON#TMP" %FINISH DEFINE("1,".T) SELECT INPUT(1) %CYCLE READSYMBOL(I) %EXIT %IF I = NL %REPEAT RD(WHO) %CYCLE F_USERS = 0; F_CPU = 0; F_PKTS = 0; F_SBR = 0; F_BYT = 0 F_RJEO = 0; F_RJEI = 0 %CYCLE %IF (0<=WHO<=2 %AND FEP NO#0) %OR (3<=WHO<=5 %AND FEP NO %C = 0 ) %START %CYCLE WHO1 = 1, 1, 9 RD(WHO2) %REPEAT -> READ NEXT %FINISH RD(F_TIM) -> END %IF END = 1100 F_TIM = F_TIM//6 RD(I) %IF I>32766 %THEN I = 0 F_USERS = F_USERS+I RD(F_STA) RD(I); F_CPU = F_CPU+I RD(I); F_PKTS = F_PKTS+I RD(I); F_SBR = F_SBR+I RD(I); F_BYT = F_BYT+I RD(I); F_RJEO = F_RJEO+I RD(I); F_RJEI = F_RJEI+I READ NEXT: RD(WHO) -> END %IF END > 1099 -> END %IF WHO > 32000; ! END MARKER %EXIT %IF WHO = 0; ! ONE CYCLE DONE %REPEAT DO REPLY %REPEAT END: SELECT OUTPUT(0); SELECT INPUT(0); CLOSE STREAM(1) %UNLESS UUU="" %THEN SPECGRAPHS(UU) %END ! %EXTERNALROUTINE FEPFIG(%STRING (255) S) %OWNSTRING (3) NN = "0" %CONSTSTRING (7) %ARRAY NAMES(0:5) = %C "2980(0)", "2980(1)", "2980(2)", "2972(0)", "2972(1)", "2972(2)" %INTEGER I DEFINE("ST1,".S) SELECT INPUT(1) %CYCLE READSYMBOL(I); PRINTSYMBOL(I) %EXIT %IF I = NL %REPEAT PRINTSTRING(" All the 2980 FEPs together ") SELECT INPUT(0); CLOSE STREAM(1) MAINDO(S.":0") CLOSE STREAM(1) PRINTSTRING(" All the 2972 FEPs together ") END = -1 MAINDO(S.":3") !! %CYCLE I = 0, 1, 5 CHARNO(NN, 1) = I+'0' NEWLINES(3) PRINTSTRING("Figures for FEP:") PRINTSTRING(NAMES(I)); NEWLINES(2) SELECT INPUT(0); SELECT OUTPUT(0) CLOSE STREAM(1) END = -1 FEPDO(S.":".NN) CLOSE STREAM(1) %REPEAT %END ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! 2900 FEP STATISTICS PACKAGE ! ! ! ! GRAPH1 - USERS V KILO BYTES/SECOND AND CPU ! ! GRAPH2 - 2900 USERS V BLOCKS RXD & TXD ! ! GRAPH3 - 2970 USERS V BLOCKS RXD & TXD ! ! GRAPH4 - FREQUENCY V PKTS/MIN/USER ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! %EXTERNALROUTINESPEC LIST(%STRING(63) S) %EXTERNALROUTINESPEC DESTROY(%STRING(63) S) %EXTERNALROUTINESPEC PROMPT(%STRING(15) S) ! ! ! ALL INPUT IS IN THE FORM OF LINES OF SEVEN NUMBERS ! THE NUMBERS ARE (IN A PER MIN FORM OR PERCENTAGE) ! KBITS/SEC, CPU, USERS, TOTAL PKTS, RJE PKTS, SBR PKTS, OTHER PKTS (ITP) ! ! ! ! %ROUTINE REGRESSION(%INTEGERARRAYNAME X,Y, %C %INTEGER END, %LONGREALNAME A0,B0,A1,B1) %INTEGER I %LONGREAL SX,SY,SX2,SXY,SY2 SX=0;SY=0;SX2=0;SXY=0;SY2=0 %CYCLE I = 1, 1, END SX = SX+X(I); SY = SY+Y(I) SX2 = SX2 + X(I)*X(I); SY2 = SY2+Y(I)*Y(I) SXY = SXY+X(I)*Y(I) %REPEAT %RETURN %IF SX=0 %OR SY=0 B0 = ((SY*SX2)-(SX*SXY))/((END*SX2-SX*SX)) B1 = ((SX*SY2)-(SY*SXY))/(END*SY2-SY*SY) A0 = (END*SXY-SX*SY)/(END*SX2-SX*SX) A1 = (END*SXY-SX*SY)/(END*SY2-SY*SY) %END ! %ROUTINE DRAW REGRESSION LINES(%INTEGERARRAYNAME X, Y, %C %INTEGER END, %LONGREAL MINX,MAXX,MINY,MAXY) %OWNLONGREAL A0=0,A1=0,B0=0,B1=0 %LONGREALARRAY NOS,AVS(0:1) REGRESSION(X,Y,END,A0,B0,A1,B1) NOS(0) = 0; NOS(1) = MAXX AVS(0) = B0; AVS(1) = MAXX*A0+B0 MAX1 = AVS(1); SLOPE1 = AVS(1)/MAXX %IF B0<0 %START %RETURN %IF A0=0 AVS(0) = 0; NOS(0) = -B0/A0 %FINISH %IF AVS(1) > MAXY %START %RETURN %IF A0=0 AVS(1) = MAXY; NOS(1) = MAXY/A0-B0/A0 %FINISH NOS(0) = 0; NOS(1) = MAXX %RETURN %IF A1=0 AVS(0) = -B1/A1; AVS(1) = MAXX/A1-B1/A1 MAX2 = AVS(1); SLOPE2 = AVS(1)/MAXX %IF AVS(0) < 0 %START AVS(0) = 0; NOS(0) = B1 %FINISH %IF AVS(1)>MAXY %START AVS(1) = MAXY NOS(1) = MAXY*A1+B1 %FINISH %END ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! 2900 FEP STATISTICS GRAPH 1 ROUTINE ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! THIS ANALYSES THE DATA FROM THE #PRE FILE AND PRODUCES A ! GRAPH OF TIME V. TOTAL USERS,NIBBLES AND CPU RATE. ! THE FILE IS LISTED AUTOMATICALLY TO .GP ! ! %ROUTINE GRAPH1(%STRING(63) S) %LONGREALARRAY NOS,AVS(0:400) %STRING(63) FILE,TITLE %INTEGER I,K, USN, USA, CPM, CPA %OWNLONGREAL A0=0,A1=0,B0=0,B1=0 ! ! ! %ROUTINE ZAP %INTEGER I %CYCLE I=0,1,400 AVS(I)=0; NOS(I)=0 %REPEAT %END ! %ROUTINE AVG %INTEGER I %CYCLE I=0,1,120 %IF NOS(I)>0 %THEN AVS(I)=AVS(I)/NOS(I) %REPEAT %END ! ! CODE STARTS HERE ! DEFINE("1,".S) ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! SECOND PLOT STARTS HERE ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! ! ! ZAP %CYCLE I=0,1,END; !SCATTER K=INT PT(USERS(I)) AVS(K)=AVS(K)+KBS(I) NOS(K)=NOS(K)+1 %REPEAT AVG ! ! ZAP USN = 0; USA = 0; CPM = 0; CPA = 0 %CYCLE I=0,1,END K=INT PT(USERS(I)) AVS(K)=AVS(K)+CPU(I) NOS(K)=NOS(K)+1 %IF K > USN %THEN USN = K USA = USA+K K = INT PT(CPU(I)) %IF K>CPM %THEN CPM = K CPA = CPA+K %REPEAT AVG DRAW REGRESSION LINES(USERS, CPU,END,0,120,0,100) PRINTSTRING("Max number of users was"); WRITE(USN, 2) PRINTSTRING(" The average number was") PRINT(USA/(END+1), 2, 1) PRINTSTRING(" Max CPU used was"); WRITE(CPM, 2) PRINTSTRING("%, the average was") PRINT(CPA/(END+1), 2, 1); PRINTSTRING("% ") %IF USN > 0 %START PRINTSTRING(" Each User used between") PRINT(1/SLOPE1, 1, 2); PRINTSTRING("% and") PRINT(1/SLOPE2, 1, 2); PRINTSTRING("% CPU (average) during the run ") PRINTSTRING("The max number of supportable users lies between") WRITE(INT PT(100*SLOPE1), 2); PRINTSTRING(" and ") WRITE(INT PT(100*SLOPE2), 2); NEWLINE %FINISH %END ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! 2900 FEP STATISTICS GRAPH 2 ROUTINE ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! THIS ANALYSES THE DATA FROM THE #PRE FILE AND PRODUCES A ! GRAPH OF TIME V NSI BLOCKS RECEIVED AND TRANSMITTEDTO 4 75 ! THE FILE IS LISTED AUTOMATICALLY TO .GP ! ! %ROUTINE GRAPH2(%STRING(63) S) %LONGREALARRAY NOS,AVS(0:200) %STRING(63) FILE,TITLE %INTEGER I,K ! ! ! %ROUTINE ZAP %INTEGER I %CYCLE I=0,1,200 AVS(I)=0; NOS(I)=0 %REPEAT %END ! %ROUTINE AVG %INTEGER I %CYCLE I=0,1,200 %IF NOS(I)>0 %THEN AVS(I)=AVS(I)/NOS(I) %REPEAT %END ! ! CODE STARTS HERE ! DEFINE("1,".S) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! SECOND PLOT STARTS HERE ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! ZAP %CYCLE I=0,1,END; !SCATTER K=INT PT(USERS(I)) AVS(K)=AVS(K)+PKTS(I) NOS(K)=NOS(K)+1 %REPEAT AVG ! ! ZAP %CYCLE I=0,1,END K=INT PT(USERS(I)) AVS(K)=AVS(K)+ITP(I) NOS(K)=NOS(K)+1 %REPEAT AVG DRAW REGRESSION LINES(USERS, ITP, END, 0, 120, 0, 2000) PRINTSTRING(" The average number of ITP packets transmitted per user lies between") PRINT(SLOPE1, 2, 1); PRINTSTRING(" and ") PRINT(SLOPE2, 2, 1); NEWLINE %END ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! 2900 FEP STATISTICS GRAPH 4 ROUTINE ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! THIS PRODUCES A GRAPH OF THE FREQUENCY AGAINST ! PACKETS PER USER PER MIN AND CALCULATES THE AVERAGE AND ! STANDARD DEVIATION. ! ! %ROUTINE GRAPH4(%STRING(63) S) %STRING(63) FILE,TITLE %REAL RAVER,TAVER,RDEVIATION,TDEVIATION %OWNINTEGERARRAY RFREQ(0:50) %OWNINTEGERARRAY TFREQ(0:50) %OWNINTEGERARRAY TKEEP(1:1100) %OWNINTEGERARRAY RKEEP(1:1100) %LONGINTEGER RCOUNT,TCOUNT %INTEGER CO %CONSTINTEGER MAXHOST=2 %INTEGER HOST,I ! ! ! %ROUTINE COMPUTE DEVIATION %INTEGER I,RJ,TJ %REAL RTOT,TTOT RTOT=0; TTOT=0 %CYCLE I=1,1,CO RTOT=RTOT+((RAVER-RKEEP(I))**2) TTOT=TTOT+((TAVER-TKEEP(I))**2) %REPEAT RDEVIATION=SQRT(RTOT/CO) TDEVIATION=SQRT(TTOT/CO) %END ! ! CODE STARTS HERE ! DEFINE("1,".S) COMPUTE DEVIATION ! ! %CYCLE I=0,10,140 %REPEAT ! ! ! ! NEWLINE PRINTSTRING("ITP PKTS/MIN/USER ="); PRINT(RAVER, 3, 2) NEWLINE PRINTSTRING("SBR PKTS/MIN/USER ="); PRINT(TAVER, 3, 2) NEWLINES(2) %END %ROUTINE GRAPH5(%STRING(63) S) %LONGREALARRAY NOS,AVS(0:100) %STRING(63) FILE,TITLE %INTEGER I,K %OWNLONGREAL A0=0, A1=0, B0=0, B1=0 ! ! ! %ROUTINE ZAP %INTEGER I %CYCLE I=0,1,100 AVS(I)=0; NOS(I)=0 %REPEAT %END ! %ROUTINE AVG %INTEGER I %INTEGERARRAY TT(0:100) %CYCLE I=0,1,100 TT(I) = I %IF NOS(I)>0 %THEN AVS(I)=AVS(I)/NOS(I) %REPEAT %END ! ! CODE STARTS HERE ! DEFINE("1,".S) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! SECOND PLOT STARTS HERE ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! ! ! ! DRAW REGRESSION LINES(CPU,PKTS,END,0,100,0,2000) PRINTSTRING(" At 100% CPU, the number of packets that can be transmitted") PRINTSTRING(" lies between") PRINT(MAX1, 4, 0); PRINTSTRING(" and ") PRINT(MAX2, 4, 0); NEWLINE ! ! ZAP %CYCLE I=0,1,END ITP(I) = PKTS(I)+RJEI(I) K=INT PT(CPU(I)) AVS(K)=AVS(K)+ITP(I) NOS(K)=NOS(K)+1 %REPEAT DRAW REGRESSION LINES(CPU, ITP, END,0,100,0,2000) PRINTSTRING("Adding in unbalanced input pkts changes the rate to") PRINT(MAX1, 4, 0); PRINTSTRING(" and ") PRINT(MAX2, 4, 0); NEWLINE %END ! %EXTERNALROUTINE SPECGRAPHS(%STRING (255) S) %EXTERNALROUTINESPEC CLEAR(%STRING (255) S) %EXTERNALROUTINESPEC LIST(%STRING (255) S) GRAPH1(S) SELECT INPUT(0); CLOSE STREAM(1) CLEAR("") GRAPH2(S) SELECT INPUT(0); CLOSE STREAM(1) CLEAR("") ! GRAPH4(S) SELECT INPUT(0); CLOSE STREAM(1) GRAPH5(S) SELECT INPUT(0); CLOSE STREAM(1) CLEAR("") %END %ENDOFFILE