*DECK NVFCAUT USETEXT TEXTSS USETEXT TEXTNVF USETEXT TXINNVF USETEXT TXTANVF USETEXT TXTAPSS PROC NVFCAUT; # TITLE NVFCAUT - ACCEPT USER TEXT. # BEGIN # NVFCAUT # # ** NVFCAUT - ACCEPT USER TEXT. * * S. H. FISCHER. 81/12/04. * * THIS PROCEDURE HANDLES INBOUND DATA (SYNCHRONOUS) BLOCKS FROM THE * NETWORK. ITS FUNCTION IS TO FORWARD THE TYPEIN TO THE I-LAYER * (FOR LOGIN PROCESSING) OR DISCARD IT, AS APPROPRIATE. * * PROC NVFCAUT * * ENTRY WCBUF[0] = WORD COUNT WORD FROM ORIGINAL CONNECTION * TRAFFIC QUEUE (*CTQ*) ENTRY. * ABHBUF[0] = APPLICATION BLOCK (EVENT) HEADER FOR THE DATA * (BASED ARRAY *ABH* IN *TXTAPSS* POINTS HERE). * MSGBUF[0] = DISPLAY CODED TEXT LINE (BASED ARRAY *APSM* * IN *TXTAPSS* POINTS HERE). * * EXIT ONE OR MORE OF THE FOLLOWING ACCORDING TO THE BLOCK TYPE * OF THE INPUT DATA AND THE STATE OF THE ACN LIST ENTRY FOR * THE USER IN QUESTION. * - AN ENTRY FOR THE TYPEIN HAS BEEN PLACED IN THE TERMINAL- * TO-APPLICATION CONNECTION INPUT QUEUE (*TAINPQ*). * - THE TYPEIN HAS BEEN DISCARDED. * - A TERMINAL TEXT ENTRY CONTAINING THE MESSAGE * *INPUT IGNORED* HAS BEEN PLACED IN THE CONNECTION * TRAFFIC QUEUE (*CTQ*). * - A TERMINAL TEXT ENTRY FOR A ZERO LENGTH *MSG* TYPE * NETWORK BLOCK HAS BEEN PLACED IN THE *CTQ* (TO TURN * AROUND THE HALF DUPLEX OPERATION). * - THE STATE OF THE ACN LIST ENTRY HAS BEEN UPDATED. * - IF THIS IS A BLK BLOCKS, CHECK TO IF WE HAVE RECEIVED * UP TO 20 BLK BLOCKS. IF WE HAVE, TERMINATE THE * CONNECTION BECAUSE SOMETHING HAS GONE WRONG AT THE * TERMINAL TO CAUSE IT TO SEND THAT MANY BLK BLOCKS * UPLINE. * * NOTES 1. NVF ONLY PROCESSES *MSG* TYPE NETWORK BLOCKS, THE * CTRL/TCD SYNCHRONOUS SM AND NULL BLOCKS. ANY * OTHER TYPE OF SYNCHRONOUS INBOUND DATA (*BLK* BLOCKS * AND TRANSPARENT MODE INPUT) IS IGNORED AND THE MESSAGE * *INPUT IGNORED* IS SENT TO THE TERMINAL. * 2. NVF DISCARDS ALL SYNCHRONOUS INBOUND BLOCKS THAT WERE * TYPED AHEAD OF A USER BREAK. * 3. THE PROCESSING IS DEFINED BY THE NVF/USER C-LAYER * STATE DIAGRAM. # # **** PROC NVFCAUT - XREF LIST. # XREF BEGIN PROC ABORT; # ABORT PROGRAM # PROC MESSAGE; # SEND MESSAGE TO DAYFILE # PROC MOVE; # MOVE CM WORDS # PROC NVFCFCE; # FIND CONNECTION ENTRY # PROC SSSAWR; # ACCEPT WORKLIST REQUEST # PROC SSTAQE; # ACCEPT QUEUE ENTRY # PROC SSTATS; # ALLOCATE TABLE SPACE # PROC SSTRTS; # REMOVE TABLE SPACE # PROC NVFTETC; # END TERMINAL CONNECTION # END # **** # ITEM ACNN I; # ACN TO SEARCH FOR # ITEM AE I; # ORD OF MATCHED (OR NEW) LIST ENTRY # ITEM NEWACN B; # TRUE IF ACN NOT FOUND IN ACN LIST # ITEM RORD I; # INBOUND WAITING BLOCK QUEUE ORDINAL # ITEM TAINDX I; # INDEX INTO THE T-A INPUT QUEUE # ITEM PT I; # INDEX TO THE PTAC TABLE # ITEM NENTRY I; # NUMBER OF ENTRIES IN PTAC TABLE # ARRAY BLKIGH[00:00] S(1); BEGIN ITEM BLKH$ABT U(00,00,06) = [APPTTX$]; ITEM BLKH$ADR U(00,06,12); ITEM BLKH$ACT U(00,36,04) = [CT6DISPLAY]; ITEM BLKH$TLC U(00,48,12) = [20]; END ARRAY BLKIGM[00:00] S(2); BEGIN ITEM BLKM C(00,00,14) = [".INPUT IGNORED"]; END ACNN = ABHADR[0]; NVFCFCE( ACNN, AE, NEWACN ); # LOCATE ACN LIST ENTRY # IF NEWACN THEN BEGIN $BEGIN MESSAGE( " ACN LOST NVFCAUT", 0 ); ABORT; $END RETURN; # DISCARD INBOUND DATA BLOCK # END # * PROCESS INPUT ACCORDING TO BLOCK TYPE MSG, BLK AND NULL INBOUND * DATA BLOCKS PLUS SYNCHRONOUS SUPERVISORY MESSAGES INBOUND. # # * MSG BLOCKS ARE TEXT INPUT FROM THE USER AT THE TERMINAL. * THE MSG BLOCK IS PASSED TO THE PROGRAM IF THE CONNECTION IS IN * THE ACTIVE OR BRKOUT STATE AND THE MSG BLOCK HAS NOT BEEN * CANCELED BY THE USER. IF THE BLOCK HAS BEEN CANCELLED THEN A * EMPTY MSG BLOCK IS OUTPUT TO ALLOW THE NEXT BLOCK TO BE DELIVERED. # IF ABHABT[0] EQ APMSG THEN BEGIN IF ACN$STATE[AE] EQ ACNST"ACTIVE" OR ACN$STATE[AE] EQ ACNST"CLEARI" THEN BEGIN IF ACN$STATE[AE] EQ ACNST"CLEARI" OR ABHCAN[0] NQ 0 THEN # MUST TURN AROUND HALF DUPLEX # BEGIN WCB$WORD[1] = LLST + 2; # SEND LST/ON TO GET NEXT MSG BK# ABHWORD[1] = LLST; ABHABT[1] = APPCMD; ABHACT[1] = ACLST; SPMSG0[1] = 0; PFCSFC[1] = LSTON; LSTACN[1] = ACNN; SSTAQE( P,WCBUF[1],ABHBUF[1],APSM[1]); # PASS OUTBOUND# IF ACN$BLKF[AE] THEN BEGIN ACN$BLKF[AE] = FALSE; FOR RORD=0 STEP IWQ$WC[RORD] WHILE IWQ$ACN[RORD+1] NQ ACNN DO BEGIN END SSTRTS(P,RORD,IWQ$WC[RORD]); END END ELSE BEGIN IF ACN$BLKF[AE] THEN BEGIN ACN$BLKF[AE] = FALSE; FOR RORD=0 STEP IWQ$WC[RORD] WHILE ACNN NQ IWQ$ACN[RORD+1] DO BEGIN END TAINDX = TAQLNGTH; SSTATS(P,IWQ$WC[RORD]); MOVE(IWQ$WC[RORD],IWBQ[RORD],TAINPQ[TAINDX]); SSTRTS(P,RORD,IWQ$WC[RORD]); SSSAWR(WWDF"NTDQE"); END ELSE BEGIN SSTAQE( P, WCBUF, ABHBUF, MSGBUF ); END END END ELSE IF ACN$STATE[AE] EQ ACNST"BRKOUT" THEN BEGIN IF ACN$BKCNT[AE] EQ 0 AND ABHCAN[0] EQ 0 THEN BEGIN SSTAQE( P, WCBUF, ABHBUF, MSGBUF ); ACN$STATE[AE] = ACNST"BRKCMD"; END END END # * COUNT THE NUMBER OF UPLINE BLK BLOCKS. IF THE NUMBER REACH * 20, TERMINATE THE CONNECTION BECAUSE SOMETHING MUST HAVE * GONE WRONG AT THE TERMINAL TO CAUSE THAT MANY BLK BLOCKS * COME UPLINE. * ONLY THE FIRST BLK BLOCK IS QUEUE. THE REST IS DISCARDED. # ELSE IF ABHABT[0] EQ APPBLK THEN BEGIN ACN$BLKCNT[AE] = ACN$BLKCNT[AE] + 1; # INCRMT BLK COUNT# IF ACN$BLKCNT[AE] GQ 20 THEN BEGIN NENTRY = PTALNGTH / PTACSIZ$; # CALCULATE NUMBER OF ENTRIES# FOR PT = 0 STEP 1 WHILE ( PT LS NENTRY) AND (PTA$ACN[PT] NQ ACNN) DO BEGIN END IF PT LS NENTRY # ENTRY FOUND, TERMINATE CONNECTION # THEN BEGIN NVFTETC (PT); RETURN; END END IF ACN$STATE[AE] EQ ACNST"ACTIVE" THEN BEGIN IF NOT ACN$BLKF[AE] THEN BEGIN ACN$BLKF[AE] = TRUE; SSTAQE(P,WCBUF,ABHBUF,MSGBUF); END END END # * NULL BLOCKS SERVE TWO PURPOSES, MARKING THE POINT IN THE INPUT * STREAM WHERE A USER BREAK OCCURED SO TEXT CAN BE DISCARDED UP TO * THAT POINT AND INDICATING TO NVF THAT DISCARDED UPLINE ASCII * TEXT DESTINED TO A FAILED APPLICATION THAT CANNOT BE DELIVERED * TO NVF. NVF ALERTS THE USER TO THE IGNORED TEXT ONLY IN THE * ACTIVE STATE. # ELSE IF ABHABT[0] EQ APPNULL THEN BEGIN IF ABHXPT[0] EQ 1 THEN BEGIN IF ACN$STATE[AE] EQ ACNST"ACTIVE" THEN BEGIN WCB$WORD[0] = 4; BLKH$ADR[0] = ACNN; SSTAQE( P, WCBUF, BLKIGH, BLKIGM ); # PASS TO OUTBOUND# END END END END # NVFCAUT # TERM