*DECK     CSCCPA
USETEXT TEXTCS
USETEXT TEXTSS
USETEXT TXTAPSS 
PROC CSCCPA;
# TITLE CSCCPA - COMPLETE PROTOCOL ACTION.   #
  
      BEGIN  # CSCCPA # 
# 
**    CSCCPA - COMPLETE PROTOCOL ACTION.
* 
*     D. G. DEPEW.           82/03/16.
*     D. G. DEPEW.           82/06/03.
* 
*     THIS PROCEDURE PERFORMS ALL THE CONNECTION(C) LAYER PROCESSING
*     REQUIRED FOR ALL CONNECTION/OPERATOR RELATED SUPERVISORY MESSAGES 
*     THAT EMANATE FROM THE INNER(I) LAYER (TERMED PROTOCOL RESPONSES). 
* 
*     PROC CSCCPA 
* 
*     ENTRY    WCBUF[0] = WORD COUNT WORD FROM ORIGINAL CONNECTION
*                         TRAFFIC QUEUE (*CNQ*) 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:  HOP/START/N, CON/REQ/N,
*                         CON/END/R.  HOWEVER, ONLY THE CON/END/R 
*                         ACTUALLY HAS AN SM BODY PORTION AT THIS TIME. 
* 
*     EXIT    ANY OF THE FOLLOWING IN VARIOUS COMBINATIONS ACCORDING TO 
*             THE SM (PROTOCOL RESPONSE) RECEIVED AND THE STATE OF THE
*             ACN LIST ENTRY FOR THE OPERATOR IN QUESTION:  
*             - THE STATE OF THE ACN LIST ENTRY HAS BEEN UPDATED. 
*             - A CON/REQ/N OR CON/END/R SM HAS BEEN PLACED IN THE
*               OUTGOING TRAFFIC QUEUE (*OTQ*). 
*             - A HOP/START SM (ESSENTIALLY) HAS BEEN PLACED IN THE 
*               PROTOCOL EVENT QUEUE (*PEQ*). 
* 
*     NOTES   1. THERE IS NO REAL HOP/START/N SM.  THIS IS STRICTLY A 
*                CS INTERNAL CODE.
*             2. THE PROCESSING IS DEFINED BY THE CS/HOP AND CS/NOP 
*                STATE DIAGRAMS.
# 
  
# 
****  PROC CSCCPA - XREF LIST.
# 
      XREF
        BEGIN 
        PROC CSCPNQ;         # PURGE NOP QUEUE                         #
        PROC SSTAQE;         # ACCEPT QUEUE ENTRY                      #
        END 
# 
****
# 
  
  
      ITEM DUM; 
  
  
  
  
  
# 
*     WE EXECUTE WHAT AMOUNTS TO A CASE CONSTRUCT TO PROCESS THE THREE
*     TYPES OF PROTOCOL RESPONSES.
# 
  
  
  
      IF WCB$SMID[0] EQ SMID"HOPSRTN" 
      THEN                   # HOP/START PROCESSING BY I-LAYER DONE    #
        BEGIN 
  
# 
*       SIMPLY UPDATE THE STATE OF THE HOP PSEUDO ACN IN ACCORDANCE 
*       WITH ITS EXISTING STATE.
# 
        IF ACN$HOPST[HOPORD$] EQ S"CREATE"
        THEN                                # MOST USUAL CIRCUMSTANCE  #
          ACN$HOPST[HOPORD$] = S"COMMAND";  # HISTORY BUFFER TO FOLLOW #
  
        ELSE IF ACN$HOPST[HOPORD$] EQ S"STARTEND" 
        THEN
          ACN$HOPST[HOPORD$] = S"ENDED";    # WILL END AFTER HIST BUFF #
  
        ELSE                           # MUST BE HOP/BRK AFT HOP/START #
          ACN$HOPST[HOPORD$] = S"BREAK";    # WILL DISCARD HIST BUFFER #
  
        END                  # HOP/START/N PROTOCOL RESPONSE           #
  
  
  
      ELSE IF WCB$SMID[0] EQ SMID"CONREQN"
      THEN                   # CON/REQ/R PROCESSING BY I-LAYER DONE    #
        BEGIN 
  
# 
*       SIMPLY FORMAT AND ISSUE THE CON/REQ/N SM.  UPDATE THE STATE.
# 
        WCB$WORD[1] = LCORQR + 2;      # ENTRY SIZE                    #
  
        ABHWORD[1] = LCORQR;           # TEXT LENGTH                   #
        ABHABT[1]  = APPCMD;           # BLOCK TYPE                    #
        ABHACT[1]  = CT60TRANS;        # CHARACTER TYPE - ABH COMPLETE #
  
        SPMSG0[0] = 0;                 # LIST NUMBER + OTHERS          #
        PFCSFC[0] = CONREQN;           # PFC/SFC                       #
        CONBDD[0] = TRUE;              # DISCARD INPUT UPON BREAK      #
        CONNXP[0] = TRUE;              # DISCARD TRANSPARENT DATA      #
        CONACT[0] = CT6DISPLAY;        # INPUT CHARACTER TYPE FOR CN   #
        CONACN[0] = ABHADR[0];         # NOP CN NUMBER - SM COMPLETE   #
  
        ACN$NOPST[ABHADR[0]] = S"COMMAND";       # WAIT FOR CS BANNER  #
        SSTAQE (P<OTQ>, WCBUF[1], ABHBUF[1], MSGBUF[0]);
  
        END                  # CON/REQ/N PROTOCOL RESPONSE             #
  
  
  
      ELSE                   # MUST BE CON/END/R (OP GONE FM I-LAYER)  #
        BEGIN 
  
# 
*       FIRST TAKE A MAIN BRANCH DEPENDING UPON WHETHER THIS REQUEST IS 
*       FOR THE HOP OR A NOP (THE PROCESSING IS COMPLETELY DIFFERENT).
# 
        IF ABHADR[0] EQ HOPORD$ 
        THEN                           # CON/END REQUEST FOR THE HOP   #
          BEGIN 
  
# 
*         THE CON/END/R PROTOCOL RESPONSE FOR THE HOP ALWAYS RESULTS
*         FROM A HOP/END SM HAVING BEEN PROCESSED.  THERE IS NO DEFINED 
*         RESPONSE TO A HOP/END SM.  HENCE, FOR THIS CASE THE CON/END/R 
*         PROTOCOL RESPONSE IS A CS INTERNAL SIGNAL FROM THE I-LAYER TO 
*         THE C-LAYER INDICATING ALL CLEANUP FOR THE HOP IS COMPLETE. 
*         IF A SUBSEQUENT HOP/START SM HAS ALREADY BEEN ENCOUNTERED, IT 
*         CAN NOW BE SENT TO THE I-LAYER (AS A PROTOCOL EVENT).  UPDATE 
*         THE STATE OF THE HOP PSEUDO ACN.
# 
          IF ACN$HOPST[HOPORD$] EQ S"ENDED" 
          THEN                              # MOST USUAL CIRCUMSTANCE  #
            ACN$HOPST[HOPORD$] = S"INACT";
  
          ELSE                         # MUST SND HOP/START TO I-LAYER #
            BEGIN 
            WCB$SMID[0] = SMID"HOPSTRT";         # ALL ELSE IS SET     #
            SSTAQE (P<PEQ>, WCBUF[0], ABH[0], APSM[0]);   # TO I-LAYER #
            IF ACN$HOPST[HOPORD$] EQ S"RESTART" 
            THEN
              ACN$HOPST[HOPORD$] = S"CREATE"; 
            ELSE
              ACN$HOPST[HOPORD$] = S"STARTBRK"; 
            END 
  
          END                          # HOP CON/END/R PROTOCOL RESP   #
  
  
        ELSE                           # CON/END REQUEST FOR A NOP     #
          BEGIN 
  
# 
*         FORMAT AND ISSUE THE CON/END/R SM.  PURGE ANY DATA QUEUED FOR 
*         THIS NOP.  UPDATE THE STATE.
# 
          WCB$WORD[1] = LCONEN + 2;    # ENTRY SIZE                    #
  
          ABHWORD[1] = LCONEN;         # TEXT LENGTH                   #
          ABHABT[1]  = APPCMD;         # BLOCK TYPE                    #
          ABHACT[1]  = CT60TRANS;      # CHARACTER TYPE - ABH COMPLETE #
  
          SPMSG0[0] = 0;
          PFCSFC[0] = CONEND;          # PFC/SFC                       #
          IF WCB$WC[0] EQ 2 
          THEN                         # I-LAYER DID NOT PROVIDE ANAME #
            SPMSG1[0] = 0;             # INSURE ANAME = 0              #
          CONACN[0] = ABHADR[0];       # NOP CN NUMBER - SM COMPLETE   #
  
          ACN$NOPST[ABHADR[0]] = S"ENDED";
          CSCPNQ (ABHADR[0], DUM);               # DELETE NOP'S OUTPUT #
          SSTAQE (P<OTQ>, WCBUF[1], ABHBUF[1], MSGBUF[0]);
  
          END                          # NOP CON/END/R PROTOCOL RESP   #
  
        END                  # CON/END/R PROTOCOL RESPONSE             #
  
  
      END  # CSCCPA # 
  
      TERM
