*DECK     NVFCBPA 
USETEXT          TEXTSS 
USETEXT          TXSMNVF
USETEXT          TXTAPSS
USETEXT          TXTANVF
USETEXT          TXTSUSS
USETEXT          TXINNVF
USETEXT          TEXTNVF
PROC  NVFCBPA;
# TITLE NVFCBPA - BEGIN PROTOCOL ACTION.                               #
  
      BEGIN # NVFCBPA # 
# 
**    NVFCBPA - BEGIN PROTOCOL ACTION.
* 
*     S. H. FISCHER.         81/11/09.
*     D. G. DEPEW.           81/12/17.
*     C. J. BRION.           82/06/01.
* 
*     THIS PROCEDURE PERFORMS ALL THE CONNECTION(C) LAYER PROCESSING
*     REQUIRED FOR ALL INBOUND, CONNECTION/USER RELATED SUPERVISORY 
*     MESSAGES. 
* 
*     PROC NVFCBPA
* 
*     ENTRY    WCBUF[0] = WORD COUNT WORD FROM ORIGINAL CONNECTION
*                         TRAFFIC QUEUE (*CTQ*) ENTRY.
*             ABHBUF[0] = APPLICATION BLOCK HEADER FOR THE SM (BASED
*                         ARRAY *ABH* IN *TXTAPSS* POINTS HERE).
*             MSGBUF[0] = BODY OF THE SM (BASED ARRAY *APSM* IN 
*                         *TXTAPSS* POINTS HERE).  THE POSSIBLE PFC/SFC 
*                         VALUES ARE:  CR/ITE/R, CR/IAP/R, CR/RAP/R,
*                         CR/RCN/R, CR/SWH/N, CR/TRM/N, CR/ACC, CR/CB,
*                         AND TCH/TCHAR.
* 
*     EXIT    ANY OF THE FOLLOWING IN VARIOUS COMBINATIONS ACCORDING TO 
*             THE SM RECEIVED AND THE STATE OF THE ACN LIST ENTRY FOR 
*             THE USER IN QUESTION. 
*             - THE ACN LIST ENTRY HAS BEEN CREATED.
*             - THE ACN LIST ENTRY HAS BEEN DELETED.
*             - THE STATE OF THE ACN LIST ENTRY HAS BEEN UPDATED. 
*             - AN ENTRY HAS BEEN PLACED IN THE OUTGOING TRAFFIC QUEUE
*               (*OTQ*).
*             - AN ENTRY HAS BEEN PLACED IN THE TERMINAL-TO-APPLICATION 
*               CONNECTION INPUT QUEUE (*TAINPQ*).
*             - AN ENTRY HAS BEEN PLACED IN THE APPLICATION-TO- 
*               APPLICATION CONNECTION INPUT QUEUE (*AAINPQ*).
*             - ALL OUTPUT ENQUEUED (IN THE *WBQ*) FOR THE USER IN
*               QUESTION HAS BEEN DISCARDED.
* 
*     NOTE    THE PROCESSING IS DEFINED BY THE NVF/USER C-LAYER STATE 
*             DIAGRAM.
# 
  
  
  
  
# 
****  PROC NVFCBPA - XREF LIST. 
# 
      XREF
        BEGIN 
        PROC MOVE;           # MOVE BLOCK OF MEMORY                    #
        PROC NVFASWN;        # PROCESS CR/SWH/N SM                     #
        PROC NVFCFCE;        # FIND CONNECTION TABLE ENTRY             #
        PROC SSTATS;         # ALLOCATE TABLE STACE                    #
        PROC SSTAQE;         # ACCEPT QUEUE ENTRY                      #
        PROC SSTRTS;         # REMOVE TABLE SPACE                      #
        PROC SSSAWR;         # ACCEPT WORKLIST REQUEST                 #
        END 
# 
****
# 
  
  
  
  
      ITEM I          I;     # LOOP VARIABLE                           #
      ITEM DTLOC      I;     # LOCAL DEVICE TYPE                       #
      ITEM NEWACN     B;     # TRUE IF ACN NOT FOUND IN ACN LIST       #
      ITEM RORD       I;     # ORDINAL OF ENTRY LOCATED IN WBQ         #
      ITEM AE         I;     # ORD OF MATCHED (OR NEW) ACN LIST ENTRY  #
      ITEM ACNN       I;     # ACN FROM ENTRY  WE ARE LOOKING FOR      #
      ITEM SIZ        I;     # SIZE OF ENTRY BEING MOVED TO *OTQ*      #
      ITEM OORD       I;     # ORDINAL OF ENTRY POSITION IN *OTQ*      #
      ITEM SMID  S:CTQSTAT;  # SUBSCRIPT FOR GOTO SWITCH               #
  
  
  
  
      SWITCH UCSWT:CTQSTAT
                 LLCRITE:    SITE,     # CR/ITE                        #
                 LLCRCB:     SCB,      # CR/CB                         #
                 LLCRTRMN:   STRMN,    # CR/TRM/N                      #
                 LLCRSWHN:   SSWHN,    # CR/SWH/N                      #
                 LLCRACC:    SACC,     # CR/ACC                        #
                 LLTCHAR:    STCHAR,   # TCH/TCAR                      #
                 LLCRIAP:    SIAP,     # CR/IAP # 
                 LLCRRAP:    SRAP,     # CR/RAP   # 
                 LLCRRCN:    SRCN;     # CR/RCN                        #
  
  
  
  
# 
*    IF NEWACN THEN IF CR/ITE/R THEN OK 
*     ELSE ACN MUST EXIST.
# 
  
  
  
  
      ACNN =CRACN[0]; 
      IF ACNN NQ 0
      THEN
        NVFCFCE( ACNN, AE, NEWACN );
  
      SMID = WCB$SMID[0];              # GET INTERNAL SM IDENTIFIER    #
      IF SFC[0] EQ ITE                   # IF CR/ITE DT IN DIFF FIELD # 
      THEN
        DTLOC = CRITDT[0];
      ELSE
        DTLOC = CRDT[0];
  
      GOTO UCSWT[SMID]; 
  
  
  
  
LLCRRCN:  
LLCRITE:  
      SSTATS( P<ACN>, ACNLSIZ$ ); 
      ACN$WORD0[AE] = 0;
      ACN$STATE[AE] = ACNST"CREATE";
      IF SMID EQ CTQSTAT"SITE"
      THEN
        ACN$ABL[AE] = CRITABL[0]; 
      ELSE
        ACN$ABL[AE] = CRABL[0]; 
      ACN$ABN[AE] = 1;
      ACN$DBZ[AE] = 500;
      ACN$ACN[AE] = CRACN[0]; 
      ACN$WORD1[AE] = 0;
  
# 
*     CHECK THE DEVICE TYPE OF THE INPUT SM. IF DEVICE TYPE 
*     IS FOR A-A TYPE CONNECTION, SEND TO A-A INPUT QUEUE.
*     OTHERWISE, TO THE T-A INPUT QUEUE.
# 
  
      IF DTLOC EQ DT$INTA OR
         DTLOC EQ DT$INTE 
      THEN
        SSTAQE(P<AAINPQ>,WCBUF,ABHBUF,MSGBUF);
      ELSE
        SSTAQE(P<TAINPQ>,WCBUF,ABHBUF,MSGBUF);
  
  
      GOTO ENDTAS;
  
LLCRCB: 
      IF ACNN NQ 0
      THEN
        BEGIN                # CONNECTION BELONGS TO NVF               #
        IF ACN$STATE[AE] EQ ACNST"ACTIVE" 
          OR ACN$STATE[AE] EQ ACNST"CLEARI" 
          OR ACN$STATE[AE] EQ ACNST"SWTPEND"
          OR ACN$STATE[AE] EQ ACNST"BRKCMD" 
          OR ACN$STATE[AE] EQ ACNST"TRMPEND"
        THEN
          BEGIN 
          RORD = 0;          # MUST DISCARD ANY WAITING OUTPUT         #
          FOR I = 1  STEP 1  UNTIL ACN$WBCNT[AE]
          DO
            BEGIN 
            FOR RORD = RORD  STEP WBQ$ESIZE[RORD] 
              WHILE WBQ$ABHACN[RORD] NQ ACNN
            DO
              BEGIN  END               # FIND ORD OF ENTRY TO DELETE   #
  
            SIZ = WBQ$ESIZE[RORD];     # SIZE OF ENTRY TO DELETE       #
            SSTRTS( P<WBQ>, RORD, SIZ );         # DELETE ENTRY        #
            END 
          ACN$WBCNT[AE] = 0;
          END 
  
        IF ACN$STATE[AE] EQ ACNST"TRMPEND"
          OR ACN$STATE[AE] EQ ACNST"SWTPEND"
        THEN
          BEGIN              # FIND AND SEND CR/TRM OR DELETE CR/SWH   #
          FOR RORD = RORD STEP WBQ$ESIZE[RORD]
            WHILE (WBQ$ABHACN[RORD] NQ 0 OR WBQ$CRSACN[RORD] NQ ACNN) 
              AND (RORD LS WBQLNGTH ) 
          DO
            BEGIN  END       # FIND ORD OF ASYNCHRONOUS ENTRY          #
  
          IF RORD LS WBQLNGTH     # CR/SWH OR CR/TRM FOUND IN WBQ      #
          THEN
            BEGIN 
            SIZ = WBQ$ESIZE[RORD];     # SIZE OF ENTRY TO BE PROCESSED #
  
            IF ACN$STATE[AE] EQ ACNST"TRMPEND"
            THEN
              BEGIN 
              OORD = OTQLNGTH;
              SSTATS( P<OTQ>, SIZ );
              MOVE( SIZ, WBQ[RORD], OTQ[OORD] );
              IF OORD EQ 0
              THEN
                SSSAWR( WWDF"SACNI" );
              ACN$STATE[AE] = ACNST"ENDED"; 
              END 
            SSTRTS( P<WBQ>, RORD, SIZ );
            END 
          END 
  
  
        IF ACN$STATE[AE] EQ ACNST"ACTIVE" 
          OR ACN$STATE[AE] EQ ACNST"CLEARI" 
          OR ACN$STATE[AE] EQ ACNST"SWTPEND"
          OR ACN$STATE[AE] EQ ACNST"BRKCMD" 
          OR ACN$STATE[AE] EQ ACNST"BRKOUT" 
          OR ACN$STATE[AE] EQ ACNST"SWSTART"
        THEN
          BEGIN 
          IF DTLOC EQ DT$INTA OR
             DTLOC EQ DT$INTE 
          THEN
            SSTAQE(P<AAINPQ>,WCBUF,ABHBUF,MSGBUF); # A-A INPUT #
          ELSE
            SSTAQE(P<TAINPQ>,WCBUF,ABHBUF,MSGBUF); # T-A INPUT #
          ACN$STATE[AE] = ACNST"BROKEN";
          END 
        END 
  
      ELSE
        BEGIN                # CR/CB FOR CONNECTION TO OTHER APPL      #
        IF DTLOC EQ DT$INTA OR
           DTLOC EQ DT$INTE 
        THEN
          SSTAQE(P<AAINPQ>,WCBUF,ABHBUF,MSGBUF);  # A-A INPUT # 
        ELSE
          SSTAQE(P<TAINPQ>,WCBUF,ABHBUF,MSGBUF);  # T-A INPUT # 
        END 
  
      GOTO ENDTAS;
  
  
  
  
LLCRSWHN: 
      IF DTLOC EQ DT$INTA OR                     # IF A-A CONNECTION,  #
         DTLOC EQ DT$INTE                        # ADDITIONAL PAAC     #
      THEN                                       # PROCESSING ID NEEDED#
        BEGIN 
        NVFASWN(ACNN);                           # PROCESS CR/SWH/N    #
        END 
      SSTRTS(P<ACN>, AE*ACNLSIZ$, ACNLSIZ$);
  
      GOTO ENDTAS;
  
  
  
  
LLCRTRMN: 
      SSTRTS( P<ACN>, AE*ACNLSIZ$, ACNLSIZ$ );
      GOTO ENDTAS;
  
  
  
  
LLCRACC:  
      IF DTLOC EQ DT$INTA OR
         DTLOC EQ DT$INTE 
      THEN
        SSTAQE(P<AAINPQ>,WCBUF,ABHBUF,MSGBUF); # A-A INPUT #
      ELSE
        SSTAQE(P<TAINPQ>,WCBUF,ABHBUF,MSGBUF); # T-A INPUT #
      GOTO ENDTAS;
  
  
  
  
LLTCHAR:  
      IF ACN$STATE[AE] EQ ACNST"ACTIVE" 
        OR ACN$STATE[AE] EQ ACNST"BRKOUT" 
        OR ACN$STATE[AE] EQ ACNST"CLEARI" 
        OR ACN$STATE[AE] EQ ACNST"BRKCMD" 
      THEN
        SSTAQE( P<TAINPQ>, WCBUF, ABHBUF, MSGBUF ); 
      GOTO ENDTAS;
  
  
  
LLCRIAP:  
LLCRRAP:  
  
# 
*     IF THE INCOMING SM IS A CR/IAP/R, CHECK IF ACN EXISTS. IF SO, THEN
*     A REPEAT SM SEEN. FLUSH THE CR/SWH/R SM IN THE WAITING BLOCK QUEUE. 
*     IF PAAC EXISTS, CHECK STATE OF ACN. 
*     IF THE STATE IS "SWITCH PENDING", THEN THE CR/SWH/R SM IN THE 
*     WAITING BLOCK QUEUE MUST BE FLUSHED AND THE STATE OF THE ACN SET
*     TO "CREATE".
# 
  
  
# 
      IF AN INCOMING CR/RAP/R SM, SET UP ACN AND SEND TO AAINPQ.
# 
  
      IF NEWACN 
      THEN
        BEGIN 
        SSTATS(P<ACN>,ACNLSIZ$);
        ACN$WORD0[AE] = 0;
        ACN$WORD1[AE] = 0;
        ACN$ACN[AE] = CRACN[0]; 
        END 
      ELSE
        BEGIN 
  
# 
      ACN EXISTS, MUST BE A REPEAT CR/IAP/R SM. 
      CHECK STATE FOR "SWITCH PENDING". 
      IF SO, FIND CR/SWH/R SM FOR THIS ACN AND DISPOSE OF.
# 
  
        IF ACN$STATE[AE] EQ ACNST"SWTPEND"
        THEN
          BEGIN 
          RORD = 0; 
  
          FOR RORD = RORD STEP WBQ$ESIZE[RORD] WHILE
            WBQ$CRSACN[RORD] NQ ACNN OR 
            WBQ$ABHACN[RORD] NQ 0 
          DO
            BEGIN 
            END 
  
          SIZ = WBQ$ESIZE[RORD];
          SSTRTS(P<WBQ>,RORD,SIZ);
          END 
        END 
  
  
# 
      SET NEW ACN STATE AND SEND CR/XXX AS PROTOCOL EVENT TO AAINPQ.
# 
  
      ACN$STATE[AE] =ACNST"CREATE"; 
      SSTAQE(P<AAINPQ>,WCBUF,ABHBUF,MSGBUF);
      GOTO ENDTAS;
  
  
  
  
  
  
ENDTAS: 
  
      END # NVFCBPS # 
      TERM
