*DECK FFSSPFA 
USETEXT TEXTFFS 
      PROC FFSSPFA; 
*CALL COPYRITE
# TITLE FFSSPFA - PROCESS FC/ACK SUPERVISORY MESSAGE.                  #
  
      BEGIN                            # FFSSPFA                       #
# 
**    FFSSPFA  PROCESS FC/ACK SUPERVISORY MESSAGE.
* 
*     A. LIM                           88/01/18 
* 
*     THIS PROCEDURE PROCESSES A FC/ACK SUPERVISORY MESSAGE.
* 
*     PROC FFSSPFA
* 
*     ENTRY    P<APSM> = PTR TO INPUT SUPERVISORY MESSAGE (*INPBUF*). 
*              CURACN  = FILE SERVER CONNECTION NUMBER. 
* 
*     EXIT     FILE SERVER CONNECTION ENTRY UPDATED.
*              WAITING BLOCK QUEUE ENTRY DISPATCHED AND DELETED.
* 
*     METHOD   IF THE CONNECTION STATE IS *NULL*, *PCONACRQ*, *PENDING*,
*              OR *RETRYPEND* THEN THE FC/ACK IS TREATED AS A NAM 
*              PROTOCOL ERROR.
* 
*              IF THE CONNECTION STATE IS *ENDPEND*,
*              THEN THE FC/ACK IS IGNORED.
* 
*              IF THE CONNECTION STATE IS *ACTIVE* THEN THE 
*              OUTSTANDING BLOCK COUNT IS DECREMENTED. IF THERE IS A
*              WAITING BLOCK QUEUED THEN THE BLOCK IS SENT TO THE MDI , 
*              REMOVED FROM THE WAITING BLOCK QUEUE , THE OUTSTANDING 
*              BLOCK COUNT INCREMENTED AND THE WAITING BLOCK COUNT
*              DECREMENTED. 
* 
# 
  
# 
****  PROC FFSSPFA - XREF LIST
# 
      XREF
        BEGIN 
        PROC NETPUT;     # OUTPUT A MESSAGE ON A LOGICAL CONNECTION    #
        PROC FFSEEFS;    # END FILE SERVER CONNECTIONS                 #
        PROC FFSMDTS;    # DEALLOCATE TABLE SPACE                      #
        FUNC FFSUFCE B;  # UTILITY TO FIND FILE SERVER CONNECTION ENTRY#
        PROC FFSUFWE;    # UTILITY TO FIND WAITING BLOCK ENTRY         #
        END 
# 
****
# 
      ITEM INDEX         I;            # WAITING BLOCK QUEUE INDEX     #
      CONTROL EJECT;
  
#     START MAIN PROCEDURE                                             #
  
#     CONNECTION STATE IS *NULL* - TREAT AS A NAM PROTOCOL ERROR.      #
  
      IF NOT FFSUFCE                   # FIND CONNECTION ENTRY         #
      THEN
        BEGIN 
        FFSEEFS (NFCACK); 
        END 
# 
*     CONNECTION STATE IS *PCONACRQ*, *PENDING*, OR *RETRYPEND*,
*     THEN TREAT AS A NAM PROTOCOL ERROR. 
# 
      IF ACN$STATE[ACNX] LAN
        (PCONACRQ + PENDING + RETRYPEND) NQ 0 
      THEN
        BEGIN 
        FFSEEFS (NFCACK); 
        END 
# 
*     CONNECTION STATE IS *ENDPEND* - IGNORE. 
# 
      IF ACN$STATE[ACNX] LAN
        (ENDPEND + RETRYPEND) NQ 0
      THEN
        BEGIN 
        RETURN; 
        END 
# 
*     CONNECTION STATE IS *ACTIVE*: 
*       - DECREMENT THE OUTSTANDING BLOCK COUNT 
*       - DISPATCH THE NEXT BLOCK IF THERE IS ONE IN THE *WBQ*
# 
  
      IF ACN$STATE[ACNX] LAN
         (ACTIVE) NQ 0
      THEN
        BEGIN 
        ACN$OBC[ACNX] = ACN$OBC[ACNX] - 1; # DECREMENT OUTSTANDING CNT #
        IF ACN$WBC[ACNX] NQ 0 
        THEN
          BEGIN                              # WAITING BLOCK QUEUED    #
          IF ACN$DATACN[ACNX]                # DATA CONNECTION         #
          THEN
            BEGIN 
            NETPUT (SAVABH, SDTBUF);         # OUTPUT THE SAVED BUFFER #
            END 
          ELSE                               # DEQUEUE NON DATA CONN   #
            BEGIN 
            FFSUFWE (INDEX);                 # FIND NEXT WAITING BLOCK #
            NETPUT (WBQ[INDEX + ABH$],
                    WBQ[INDEX + TXT$]);      # OUTPUT THE DATA BLOCK   #
            FFSMDTS (P<WBQ>, INDEX, 
                     WBQ[INDEX + SIZ$]);     # DELETE BLOCK FROM QUEUE #
            END 
          ACN$OBC[ACNX] = ACN$OBC[ACNX] + 1; # INCREMENT OUTSTANDING CT#
          ACN$WBC[ACNX] = ACN$WBC[ACNX] - 1; # DECREMENT WAITING COUNT #
          IF ACN$WBC[ACNX] LS ACN$FCBC[ACNX]
          THEN
            BEGIN 
            ACN$FCR[ACNX] = TRUE;            # FLOW CONTROL IS RELEASED#
            IND$ICODE[INAMTCP$] = INAM"INFCREL";    #FLOW CTRL RELEASED#
            END 
          END 
        ELSE
          BEGIN                                  # WBC EQUALS 0        #
          IF     ACN$SNODR[ACNX]
             AND ACN$OBC[ACNX] EQ 0 
          THEN                         # SEND NO OUTSTANDING DATA IND  #
            BEGIN 
            IND$ICODE[INAMTCP$] = INAM"INNODATA";  # NO OUTSTANDG DATA #
            END 
          END 
  
        END;
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FFSSPFA                       #
  
      TERM
