*DECK FFSSPCR 
USETEXT TEXTFFS 
      PROC FFSSPCR; 
*CALL COPYRITE
# TITLE FFSSPCR - PROCESS CON/REQ/R SUPERVISORY MESSAGE                #
  
      BEGIN                            # FFSSPCR                       #
# 
**    FFSSPCR  PROCESS CON/REQ/R SUPERVISORY MESSAGE
* 
*     A. LIM                           88/01/18 
* 
*     THIS PROCEDURE PROCESSES A CON/REQ/R SUPERVISORY MESSAGE. 
* 
*     PROC FFSSPCR
* 
*     ENTRY    P<ABH>  = PTR TO INPUT APPLICATION BLOCK HEADER (*IABH*).
*              CONABN  = 0 => NEW CONNECTION REQUEST
*                     <> 0 => RESPONSE TO CON/ACRQ
*                          =  C/N TYPE WHICH IS USED AS INDEX INTO ACN. 
*              P<APSM> = PTR TO INPUT SUPERVISORY MESSAGE (*INPBUF*). 
*              CURACN  = FILE SERVER CONNECTION NUMBER. 
*              NUMACN  = COUNT OF CURRENT FILE SERVER CONNECTIONS.
* 
*     EXIT     NUMACN  = COUNT OF CURRENT FILE SERVER CONNECTIONS.
*              P<APSM> = PTR TO OUTPUT SUPERVISORY MESSAGE (*OUTBUF*).
*              FILE SERVER CONNECTION ENTRY CREATED.
* 
*     METHOD
* 
*     TREAT THE REQUEST AS A NAM PROTOCOL ERROR BASED ON THE FOLLOWING: 
* 
*     1) ACN ALREADY ASSIGNED.
*     2) ABN INDEX INTO ACT IS OUT OF RANGE.
*     3) ACN ENTRY ALREADY IN USE.
*     4) INBOUND  CONNECTION AND DT <> INTRA-HOST.
*     5) OUTBOUND CONNECTION AND DT <> INTER-HOST.
*     6) INBOUND CONNECTION AND STATE NOT NULL. 
*     7) OUTBOUND CONNECTION AND STATE NOT CONNECTION REQUEST PENDING.
* 
*     FOR A VALID CONNECTION REQUEST: 
* 
*     1) CREATE THE FILE SERVER CONNECTION ENTRY. 
*     2) INCREMENT THE NUMBER OF ACTIVE CONNECTIONS.
*     3) SEND A CON/REQ/N SUPERVISORY MESSAGE.
* 
*     NOTE:    FOR A DETAIL DESCRIPTION, REFER TO NAM STATE TABLE.
# 
  
# 
****  PROC FFSSPCR - XREF LIST
# 
      XREF
        BEGIN 
        PROC FFSEEFS;    # END ALL FILE SERVER CONNECTIONS             #
        PROC FFSOSMG;    # OUTPUT SUPERVISORY MESSAGE TO NETWORK       #
        FUNC FFSUFCE B;  # UTILITY TO FIND FILE SERVER CONNECTION ENTRY#
        END 
# 
****
# 
  
      CONTROL EJECT;
# 
**    START MAIN PROCEDURE
# 
  
# 
*     VALIDATE THE CONNECTION REQUEST.
# 
  
      IF FFSUFCE
      THEN
        BEGIN                          # CONNECTION ALREADY IN USE     #
        FFSEEFS (NCONREQ);
        END;
  
      IF CONABN[0] GR CTYPE"CTDATA" 
      THEN
        BEGIN                          # ABN OUT OF RANGE              #
        FFSEEFS (NCONREQ);
        END;
  
      ACNX = CONABN[0];                # SET ACN ENTRY INDEX TO ABN    #
  
      IF ACN$ACN[ACNX] NQ 0 
      THEN
        BEGIN                          # ACN ENTRY ALREADY IN USE      #
        FFSEEFS (NCONREQ);
        END;
  
      IF    ((ACNX EQ 0) AND (COND[0] NQ DT$INTA))
         OR ((ACNX NQ 0) AND (COND[0] NQ DT$INTE))
      THEN
        BEGIN                          # INCORRECT DEVICE TYPE         #
        FFSEEFS (NCONREQ);
        END;
  
      IF    ((ACNX EQ 0) AND (ACN$STATE[ACNX] NQ NULL)) 
         OR ((ACNX NQ 0) AND (ACN$STATE[ACNX] NQ PCONACRQ)) 
      THEN
        BEGIN                          # INCORRECT CONNECTION STATE    #
        FFSEEFS (NCONREQ);
        END;
# 
*     CREATE THE FILE SERVER CONNECTION ENTRY.
# 
      ACN$ACN[ACNX]   = CURACN;        # STORE CONNECTION NUMBER       #
      ACN$STATE[ACNX] = PENDING;       # C/N STATE IS *PENDING*        #
      ACN$ABN[ACNX]   = 1;             # STORE APPLICATION BLOCK NO    #
      ACN$DBZ[ACNX]   = CONDBZ[0];     # STORE DOWNLINE BLOCK SIZE     #
      ACN$ABL[ACNX]   = CONABL[0];     # STORE APPLICATION BLOCK LIMIT #
      ACN$FCR[ACNX]   = TRUE;          # SET FLOW CONTROL TO RELEASED  #
# 
*     INCREMENT THE NUMBER OF ACTIVE CONNECTIONS. 
# 
      NUMACN  = NUMACN  + 1;
# 
*     SEND A CON/REQ/N SUPERVISORY MESSAGE. 
# 
      P<APSM>   = LOC(OUTBUF);         # BASE SUPERVISORY MESSAGE PTR  #
      SPMSG0[0] = 0;                   # CLEAR FIRST WORD              #
      RC[0]     = 0;                   # STORE REASON CODE             #
  
      CONNXP[0] = TRUE;                # SET NO TRANSPARENT DATA FLAG  #
      CONACT[0] = CT8ASCII;            # SET CHARACTER TYPE EXPECTED   #
      CONALN[0] = DATA$;               # ALL CONNECTIONS ON LIST DATA$ #
      FFSOSMG (CONREQN,LCORQR);        # FORMAT AND SEND CON/REQ/N SM  #
  
      P<APSM> = LOC(INPBUF);           # POINT APSM BACK TO INPBUF     #
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FFSSPCR                       #
  
      TERM
