*DECK FFSLNTH 
USETEXT TEXTFFS 
      PROC FFSLNTH; 
*CALL COPYRITE
# TITLE FFSLNTH - FTP FS NAM TRAFFIC HANDLER.                          #
  
      BEGIN                            # FFSLNTH                       #
# 
**    FFSLNTH  FTP FS NAM TRAFFIC HANDLER.
* 
*     A. LIM                           88/01/08 
* 
*     THIS PROCEDURE HANDLES ALL THE NAM TRAFFIC. 
* 
*     PROC FFSLNTH
*     PROC FFSLNLH
* 
*     ENTRY    THERE ARE TWO ENTRY POINTS TO THIS ROUTINE.
*                1) FFSLNTH - NAM TRAFFIC HANDLER 
*                   THIS ENTRY POINT IS CALLED BY THE 
*                   MAIN LOOP *FFSXPES* TO CHECK AND GET
*                   NAM INCOMING SUPERVISORY OR DATA MESSAGE
*                   AND CALL THE APPROPRIATE PROCESSOR TO 
*                   PROCESS THEM ACCORDINGLY. 
* 
*                2) FFSLNLH - NAM LAYER HANDLER 
*                   THIS ENTRY POINT IS CALLED BY THE 
*                   TCP LAYER ABOVE *FFSLTLH* TO PROCESS
*                   REQUEST MADE BY IT. 
* 
*                   REQUESTS[RTCPNAM$] = COMMON BLOCK DEFINED 
*                     IN *TEXTFFS* WHICH CONTAINS THE REQUEST 
*                     CODE AND ANY NECESSARY PARAMETERS.
* 
*     EXIT     ONE OR ANY OF THE FOLLOWING: 
*                - INCOMING SUPERVISORY OR DATA MESSAGE PROCESSED.
*                - INDICATION GENERATED FOR THE TCP LAYER ABOVE.
*                - REQUEST PROCESSED. 
* 
*     METHOD   1) FFSLNTH 
*                 - NETGETL 
*                 - IF DATA, CALL *FFSDPDB*.
*                 - IF SM, CALL *FFSSPSM*.
* 
*              2) FFSLNLH 
*                 - PROCESS ACCORDING TO REQUEST CODE.
* 
*              IF MESSAGE COUNT (MC) REACHED, CALL *NETREL* TO
*                RELEASE DEBUG LOG FILE.
# 
  
# 
****  PROC FFSLNTH - XREF LIST
# 
      XREF
        BEGIN 
        PROC NETGET;     # GET NEXT BLOCK ON SPECIFIED CONNECTION      #
        PROC NETGETL;    # GET NEXT BLOCK ON SPECIFIED LIST            #
        PROC NETREL;     # PROCESS NETWORK DEBUG LOG FILE              #
        PROC NETWAIT;    # SUSPEND NETWORK APPLICATION                 #
        PROC FFSDPDB;    # PROCESS DATA BLOCK                          #
        PROC FFSEEFS;    # END FILE SERVER                             #
        PROC FFSEESC;    # END SINGLE CONNECTION                       #
        PROC FFSOOBN;    # OUTPUT DATA BLOCK TO NETWORK                #
        PROC FFSOSMG;    # OUTPUT SUPERVISROY MESSAGE                  #
        PROC FFSSIAA;    # INITIATE A-A CONNECTION                     #
        PROC FFSSPSM;    # PROCESS SUPERVISORY MESSAGE                 #
        PROC FFSUCLR;    # CLEAR A BLOCK OF MEMORY                     #
        PROC FFSUWTB;    # WRITE TO TRACE BUFFER                       #
        END 
# 
****
# 
  
      ITEM I         U;                # INDEX INTO *REQUESTS*         #
      ITEM GETMLIST  U = DATA$;        # LIST TO GET TRAFFIC FROM      #
  
#     THIS ARRAY DEFINES THE LFN FOR THE *NETREL* CALL.                #
  
      ARRAY NTRLFN[00:00] S(1); 
        BEGIN 
        ITEM NTR$NAME    C(00,00,07) = [L1FN$]; 
        ITEM NTR$ZBYTE   U(00,42,18) = [0]; 
        END 
  
      SWITCH GETTRAFFIC                # SWITCH TO GET TRAFFIC FROM NAM#
        S0D0G0,                        # NO DATA AVAILABLE             #
        S0D0G1,                        # NO DATA AVAILABLE             #
        S0D1G0,                        # GET DATA (LIST 1)             #
        S0D1G1,                        # GET DATA (LIST 1)             #
        S1D0G0,                        # GET SM   (LIST 0)             #
        S1D0G1,                        # GET SM   (LIST 0)             #
        S1D1G0,                        # GET DATA (LIST 1)             #
        S1D1G1;                        # GET SM   (LIST 0)             #
  
      SWITCH REQC : RNAM               # SWITCH UPON REQUEST CODE      #
        INCON  : RNINCON,              # INITIATE C/N                  #
        ENDCON : RNENDCON,             # END CONNECTION                #
        SENDAT : RNSENDAT,             # SEND DATA                     #
        SDATAD : RNSDATAD,             # SUSPEND DATA DELIVERY         #
        RDATAD : RNRDATAD;             # RESUME DATA DELIVER           #
  
      CONTROL EJECT;
  
# 
**    START OF *FFSLNTH*
* 
# 
  
# 
**    IF NO TRAFFIC IS AVAILABLE, CALL NETWAIT. 
*     IF TRAFFIC IS AVAILABLE, ISSUE A NETGETL ON EITHER THE
*     SUPERVISORY MESSAGE LIST OR THE DATA LIST, DEPENDING UPON THE 
*     PREVIOUS MESSAGE TYPE, AND CALL THE APPROPRIATE PROCESSOR.
# 
  
      FFSUCLR(LOC(INDICATION[INAMTCP$]), ESIZ$); # CLEAR INDICATION BLK#
  
      GOTO GETTRAFFIC[NSUP$SU[0]*4+NSUP$DU[0]*2+GETMLIST];
  
    S0D0G0:                            # NO TRAFFIC AVAILABLE          #
    S0D0G1: 
  
      NETWAIT(2, 0);
      IF (NOT NSUP$S[0]) AND
         (NOT NSUP$D[0])
      THEN
        BEGIN 
        NETWAIT(2, 0);
        END 
  
      IF (NOT NSUP$S[0]) AND
         (NOT NSUP$D[0])
      THEN
        BEGIN 
        NETWAIT(4095, 0); 
        END 
  
      GOTO NTHEND;                     # GO TO COMMON END OF PROCEDURE #
  
    S1D0G0:                            # GET SUPERVISORY MESSAGE       #
    S1D0G1: 
    S1D1G1: 
  
      GETMLIST = SM$;                  # SET GET MESSAGE TYPE TO SM    #
      NETGETL (GETMLIST, IABH, INPBUF, INPSIZ$);   # INPUT THE MESSAGE #
      P<ABH> = LOC(IABH);              # POINT ABH AT INPUT ABH BUFFER #
      IF     ABHABT[0] NQ 0            # NOT A NULL BLOCK FROM NAM     #
         AND ABHIBU[0] EQ 0            # AND A BLOCK WAS DELIVERED     #
      THEN
        BEGIN 
        FFSSPSM;                       # PROCESS SUPERVISORY MESSAGE   #
        END 
  
      GOTO NTHEND;                     # GO TO COMMON END OF PROCEDURE #
  
    S0D1G0:                            # GET DATA MESSAGE              #
    S0D1G1: 
    S1D1G0: 
  
      GETMLIST = DATA$;                # SET GET MESSAGE TYPE TO DATA  #
# 
*     GIVE PRIORITY TO SAP CONNECTION TRAFFIC.
# 
      P<ABH>  = LOC(IABH);
      ABHWORD = 0;
      IF ACN$STATE[CTYPE"CTSAP"] EQ ACTIVE
      THEN
        BEGIN 
        NETGET (ACN$ACN[CTYPE"CTSAP"], # GET SAP CONNECTION TRAFFIC    #
                IABH, INPBUF, INPSIZ$); 
        END 
  
      IF ABHABT[0] EQ 0 
      THEN
        BEGIN 
        NETGETL (GETMLIST, IABH,       # GET CONNECTION TRAFFIC        #
                 INPBUF, INPSIZ$);
        END 
  
      IF     ABHABT[0] NQ 0            # NOT A NULL BLOCK FROM NAM     #
         AND ABHIBU[0] EQ 0            # AND A BLOCK WAS DELIVERED     #
      THEN
        BEGIN 
        FFSDPDB;                       # PROCESS DATA BLOCK            #
        END 
  
      GOTO NTHEND;                     # GO TO COMMON END OF PROCEDURE #
  
      CONTROL EJECT;
      ENTRY PROC FFSLNLH; 
# 
**    START OF *FFSLNLH*
# 
  
# 
*     CALL *FFSUWTB* TO WRITE THE REQUEST BLOCK TO THE
*     CIRCULAR TRACE BUFFER *CTB*.
# 
      BTYPE = REQ$; 
      LNAME = S"LNAM";
      FFSUWTB;
# 
*     INITIALIZE VARIABLES. 
# 
      I      = RTCPNAM$;               # GET INDEX INTO REQUESTS       #
      ACNX   = REQ$CTYPE[I];           # GET C/N TYPE (INDEX INTO ACN) #
      CURACN = ACN$ACN[ACNX];          # GET APPLICATION C/N NUMBER    #
      FFSUCLR(LOC(INDICATION[INAMTCP$]), ESIZ$); # CLEAR INDICATION BLK#
  
      GOTO REQC[REQ$RCODE[I]];         # SWITCH ON REQUEST CODE        #
# 
**    INITIATE CONNECTION REQUEST.
*       - CALL *FFSSIAA* TO INITIATE A-A CONNECTION.
* 
# 
    INCON:  
      FFSSIAA;                         # INITIATE A-A CONNECTION       #
      GOTO NTHEND;
# 
**    END THE CONNECTION
*       - IF STATE IS ACTIVE: 
*           CALL *FFSEESC* TO END THE SINGLE CONNECTION.
*           CHANGE STATE TO TERMINATION PENDING.
*         ELSE (FOR ALL OTHER STATES) 
*           ABORT WITH A DAYFILE MESSAGE. 
* 
# 
    ENDCON: 
  
      IF ACN$STATE[ACNX] LAN ACTIVE NQ 0
      THEN
        BEGIN                          # STATE IS ACTIVE               #
        FFSEESC;                       # END THE CONNECTION            #
        ACN$STATE[ACNX] = ENDPEND;     # CHANGE STATE TO END PENDING   #
        END 
      ELSE
        BEGIN                          # ALL OTHER STATES              #
        FFSEEFS(NENDCN);               # ABORT WITH A MESSAGE          #
        END 
      GOTO NTHEND;
# 
**    SEND DATA REQUEST 
*       - CALL *FFSOOBN* TO OUTPUT THE BLOCK TO NETWORK.
* 
# 
    SENDAT: 
      FFSOOBN;                         # OUTPUT BLOCK TO NETWORK       #
      GOTO NTHEND;
# 
**    SUSPEND DATA DELIVERY.
*       - IF STATE IS *PENDING* OR *ACTIVE* 
*           ISSUE LST/OFF.
*         ELSE (FOR ALL OTHER STATES) 
*           ABORT WITH A MESSAGE. 
# 
    SDATAD: 
  
      IF ACN$STATE[ACNX] LAN
        (PENDING + ACTIVE) NQ 0 
      THEN
        BEGIN                          # STATE IS PENDING OR ACTIVE    #
        FFSOSMG(LSTOFF, LLST);         # SEND LST/OFF                  #
        END 
      ELSE                             # FOR ALL OTHER STATES          #
        BEGIN 
        FFSEEFS(NSUPDATA);             # ABORT WITH A MESSSAGE         #
        END 
      GOTO NTHEND;
# 
**    RESUME DATA DELIVERY. 
*       - IF STATE IS *PENDING* OR *ACTIVE* 
*           ISSUE LST/OFF.
*         ELSE (FOR ALL OTHER STATES) 
*           ABORT WITH A MESSAGE. 
* 
# 
    RDATAD: 
  
      IF ACN$STATE[ACNX] LAN
        (PENDING + ACTIVE) NQ 0 
      THEN
        BEGIN                          # STATE IS PENDING OR ACTIVE    #
        FFSOSMG(LSTON, LLST);          # SEND LST/ON                   #
        END 
      ELSE                             # FOR ALL OTHER STATES          #
        BEGIN 
        FFSEEFS(NREDATA);              # ABORT WITH A MESSAGE          #
        END 
      GOTO NTHEND;
  
  
    NTHEND:                            # COMMON END                    #
  
# 
*     IF AN INDICATION HAS BEEN GENERATED,
*     SET CONNECTION TYPE IN INDICATION BLOCK.
# 
      IF IND$ICODE[INAMTCP$] NQ NULL
      THEN
        BEGIN 
        IND$CTYPE[INAMTCP$] = ACNX; 
        END 
  
#     RELEASE CURRENT DEBUG LOG FILE IF MAXIMUM MESSAGE COUNT EXCEEDED.#
  
      IF (FSMC NQ 0) AND
         (NSUP$MC[0] GQ FSMC) 
      THEN
        BEGIN                          # TRACE MESSAGE COUNT EXCEEDED  #
        NETREL (NTRLFN, 0, 0);         # RELEASE CURRENT DEBUG LOG FILE#
        END;
      END                              # FFSLNTH                       #
  
      TERM
