*DECK FFSLCIP 
USETEXT TEXTFFS 
      PROC FFSLCIP; 
*CALL COPYRITE
# TITLE FFSLCIP - CONNECTION (MANAGEMENT LAYER) INDICATION PROCESSOR  # 
  
      BEGIN                          # FFSLCIP                        # 
  
# 
**    FFSLCIP - CONNECTION (MANAGEMENT LAYER) INDICATION PROCESSOR
* 
*     TET TRAN                         02/88
* 
* 
*     ENTRY  . THE ARRAY INDICATION (INDEXED BY ITCPCM$) CONTAINS 
*              THE CURRENT INDICATION CODE AND RELATED DETAILS. 
* 
*     EXIT   . THE INDICATION IS CONVERTED INTO A PROPER TRIGGER TO THE 
*              STATE TABLE. 
*            . THE CONNECTION MANAGEMENT LAYER STATE TABLE HANDLER -
*              FFSLCSH IS CALLED TO PROCESS THE TRIGGER.
* 
*     NOTE
* 
# 
  
# 
****  PROC FFSLCIP - XREF LIST
# 
  
      XREF
        BEGIN 
        PROC       CHNGCPU;            # CHANGE CPU PRIORITY          # 
        PROC       FFSIIMB;            # INITIALIZE MBT               # 
        PROC       FFSLCSH;            # CM LAYER STATE TABLE HANDLER # 
        PROC       FFSEABT;            # DAYFILE ERROR MSG THEN ABORT # 
        PROC       FFSUCLR;            # CLEAR A BLOCK OF MEMORY      # 
        PROC       FFSUWTB;            # WRITE TO TRACE BUFFER        # 
        PROC       NETUCAC;            # COPY ASCII CHARACTER         # 
        PROC       NETUCAS;            # COPY ASCII STRING            # 
        FUNC       FFSIRHF B;          # READ HOST FILE               # 
        FUNC       FFSUVIP B;          # VALID IP ADDRESS             # 
        END 
# 
*     DAYFILE MESSAGES
# 
      ARRAY BADCSCM [00:00] S(4); 
        BEGIN 
        ITEM BCSCM$HDR   C(00,00,10) = [" FFSLCIP -"];
        ITEM BCSCM$MSG   C(01,00,21) = [" BAD CS COMMAND CODE."]; 
        ITEM BCSCM$END   U(03,06,54) = [0]; 
        END 
  
      ARRAY BADCSID [00:00]  S(3);
        BEGIN 
        ITEM BCSID$HDR   C(00,00,10) = [" FFSLCIP -"];
        ITEM BCSID$MSG   C(01,00,16) = [" BAD CS ID CODE."];
        ITEM BCSID$END   U(02,00,36) = [0]; 
        END 
  
      ARRAY BADCNTP [00:00] S(4); 
        BEGIN 
        ITEM BCNTP$HDR   C(00,00,10) = [" FFSLCIP -"];
        ITEM BCNTP$MSG   C(01,00,21) = [" BAD CONNECTION TYPE."]; 
        ITEM BCNTP$END   U(03,06,54) = [0]; 
        END 
  
      ARRAY THISCHAR [00:00] S(1);
        BEGIN 
        ITEM THISCHR    U(00,00,08);
        END 
  
# 
*     LOCAL VARIABLE DECLARATIONS 
# 
  
      ITEM DINDEX       U;             # DESTINATION BUFFER INDEX     # 
      ITEM HNAMEL       U;             # HOST NAME LENGTH IN OCTETS   # 
  
      ITEM TRIGGER      S:FCS$;        # THE TRIGGER TO THE STATE TABL# 
      ITEM THEIND       S:ITCP;        # THE INDICATION FROM TCP LAYER# 
      ITEM CONTYPE      S:CTYPE;       # CONNECTION TYPE              # 
  
# 
*     THE LABEL SWITCH
# 
      SWITCH LABEL$SW : ITCP
        LAB$NOOP     : NULL,           # DO NOTHING, RETURN           # 
        LAB$CONCMP   : ITCONCMP,       # CONNECTION COMPLETE          # 
        LAB$CONCLSD  : ITCONCLSD,      # CONECTION CLOSED             # 
        LAB$GWCONCMP : ITGWCONCMP,     # GATE WAY CONNECTION COMPLETE # 
        LAB$PASVCONE : ITPASVCONE,     # PASIVE CONNECTION ESTABLISHED# 
        LAB$DATAV    : ITDATAV,        # DATA AVAILABLE               # 
        LAB$INCON    : ITINCON,        # INBOUND CONNECTION           # 
        LAB$NODATA   : ITNODATA,       # NO OUTSTANDING DATA          # 
        LAB$FCREL    : ITFCREL,        # FLOW CONTROL RELEASED        # 
        LAB$CONBKN   : ITCONBKN,       # CONNECTION BROKEN            # 
        LAB$IDLEDN   : ITIDLEDN,       # SHUT DOWN GRACEFULLY         # 
        LAB$SHUTDN   : ITSHUTDN,       # SHUT DOWN IMMEDIATELY        # 
        LAB$ACFAIL   : ITACFAIL,       # ACTIVE CONNECT ATTEMPT FAILED# 
        LAB$CONABT   : ITCONABT,       # CONNECTION ABORT INDICATION  # 
        LAB$CONABS   : ITCONABS,       # CONN. ABORT IND (SOLICIT)    # 
        LAB$END      : ITMAX;          # END OF FFSLCIP - RETURN      # 
  
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
  
# 
*     CALL *FFSUWTB* TO WRITE THE INDICATION BLOCK TO THE 
*     CIRCULAR TRACE BUFFER *CTB*.
# 
  
      BTYPE = IND$; 
      LNAME = S"LCM"; 
      FFSUWTB;
  
      THEIND = IND$ICODE [ITCPCM$];    # THE INICATION FROM TCP LAYER # 
      CONTYPE = IND$CTYPE [ITCPCM$];   # THE CONNECTION TYPE          # 
      GOTO LABEL$SW [THEIND];          # GO PROCESSTHE INDICATION     # 
  
  
LAB$NOOP:                              # DO NOTHING, RETURN           # 
  
      GOTO LAB$END; 
  
  
LAB$CONCMP:                            # CONNECTION COMPLETE          # 
  
      IF CONTYPE EQ CTYPE"CTSAP"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$SAPCMPL";   # SAP CONNECTION COMPLETE      # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTCTRL"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CTCNCP";    # CTRL CONNECTION COMPLETE     # 
        CHNGCPU;                       # CHANGE CPU PRIORITY #
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTCNCMPL";  # DATA CONNECTION COMPLETE     # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$CONCLSD:                           # CONECTION CLOSED             # 
  
      IF CONTYPE EQ CTYPE"CTCTRL" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CLCTIND";   # CTRL CN CLOSE IND            # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CLDTIND";   # DATA CONN CLOSED - EOF       # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$GWCONCMP:                          # GATE WAY CONNECTION COMPLETE # 
  
      IF CONTYPE EQ CTYPE"CTCTRL" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CTAACP";    # A-A ESTABISHED FOR CTRL CN   # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTAACP";    # A-A ESTABLISHED FOR DATA CN  # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$PASVCONE:                          # PASIVE CONNECTION ESTABLISHED# 
  
      IF CONTYPE EQ CTYPE"CTCTRL" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CTPCEST";   # CTRL PC ESTABLISHED          # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTPCEST";   # DATA PC ESTABLISHED          # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$DATAV:                             # DATA AVAILABLE               # 
  
      IF CONTYPE EQ CTYPE"CTCTRL" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CTDTAVL";   # DATA AVAILABLE ON CTRL CONN  # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTDTAVL";   # DATA AVAILABLE ON DATA CONN  # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTCS"
      THEN
        BEGIN                          # DATA AVAILABLE ON CS CONN    # 
        P<APDT> = IND$ADDR[ITCPCM$];   # POINT BASE ARRAY TO INPUT BLK# 
  
        IF AIPI$FC EQ AIPIC            # THIS IS A CONNECT REQUEST    # 
        THEN
          BEGIN 
          IF AIPI$ID EQ LOCALID 
          THEN
            BEGIN 
            TRIGGER = FCE$"FCE$CNLOCAL";      # CONNECT LOCAL TRIGGER # 
            END 
  
          ELSE IF AIPI$ID EQ REMOTEID 
          THEN
            BEGIN                             # CONNECT REMOTE        # 
            TRIGGER  = FCE$"FCE$CNREMOTE";    # PRESET TO CON REMOTE  # 
            P<APDT>  = IND$ADDR[ITCPCM$];     # POINT AT ADDR OF DATA # 
            P<TBUFF> = LOC(AIPI$TEXT[0]);     # POINT AT BEGIN OF DATA# 
            HNAMEL   = IND$LEN[ITCPCM$] - 17; # HOST NAME/IP ADDR LEN=# 
                                              # BLCK SIZE - HDR - CRLF# 
            FFSUCLR(LOC(PARMS[1]),            # ZERO OUT PARMS BLOCK  # 
                    MAXPARMS$ * PARSIZ$); 
            DINDEX = 0; 
            NETUCAC(TBUFF, 0, THISCHAR,       # GET FIRST CHARACTER   # 
                    DINDEX);
            IF     (THISCHR GQ ASCIZERO)
               AND (THISCHR LQ ASCININE)
            THEN
              BEGIN                           # CHARACTER IS 0 -9..   # 
              IF NOT FFSUVIP(TBUFF,HNAMEL)    #..IP ADDRESS ENTERED   # 
              THEN
                BEGIN                         # INVALID IP ADDRESS    # 
                TRIGGER = FCE$"FCE$CNRMINVD"; # CONNECT REMOTE INVALID# 
                END 
              END 
  
            ELSE
              BEGIN                             # HOST NAME ENTERED   # 
              IF HNAMEL GR HNAMEL$
              THEN
                BEGIN                           # HOST NAME TOO LONG  # 
                TRIGGER = FCE$"FCE$CNRMINVD";   # CON REMOTE INVALID  # 
                END 
  
              ELSE
                BEGIN                             # HOST NAME LEN O.K.# 
                DINDEX = 0; 
                NETUCAS(TBUFF, 0, HNAMEL,         # COPY HOST NAME TO # 
                        PARMS[1], DINDEX);        # ..PARMS[1]        # 
                PARAMSZ[1] = HNAMEL;              # SAVE HOST NAME LEN# 
                FFSIIMB;                          # INITIALIZE MBT    # 
                IF NOT FFSIRHF
                THEN
                  BEGIN                           # HOST NAME UNKNOWN # 
                  TRIGGER = FCE$"FCE$CNRMINVD";   # CON REMOTE INVALID# 
                  END 
                END                               # HOST NAME LEN O.K.# 
              END                                 # HOST NAME ENTERED # 
            END                                   # CONNECT REMOTE    # 
          ELSE
            BEGIN 
            FFSEABT (BADCSID);         # UNKNOWN AIPI ID CODE         # 
            END 
          END 
  
        ELSE IF AIPI$FC EQ AIPISC      # THIS IS A SEND REQUEST       # 
        THEN
          BEGIN 
          IF AIPI$ID EQ LOCALID 
          THEN
            BEGIN 
            TRIGGER = FCE$"FCE$SDLOCAL";         # SEND LOCAL TRIGGER # 
            END 
          ELSE IF AIPI$ID EQ REMOTEID 
          THEN
            BEGIN 
            TRIGGER = FCE$"FCE$SDREMOTE";       # SEND REMOTE TRIGGER # 
            END 
          ELSE
            BEGIN 
            FFSEABT (BADCSID);         # UNKNOWN AIPI ID CODE         # 
            END 
          END 
  
        ELSE IF AIPI$FC EQ AIPIAT      # THIS IS A ABORT DATA TRANSFER# 
        THEN
          BEGIN 
          TRIGGER = FCE$"FCE$ABTXFR";  # TRIGGER IS ABORT DATA TRANSFR# 
          END 
  
        ELSE
          BEGIN 
          FFSEABT (BADCSCM);           # UNKNOWN AIPI COMMAND CODE    # 
          END 
  
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$INCON:                             # INBOUND CONNECTION           # 
  
      IF CONTYPE EQ CTYPE"CTCS" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CSCNECT";   # CONTROL STATEMENT CONNECT    # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$NODATA:                            # NO OUTSTANDING DATA          # 
  
      TRIGGER = FCE$"FCE$NODTOUT";     # NO OUTSTANDING DATA TRIGGER  # 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$FCREL:                             # FLOW CONTROL RELEASED        # 
  
      TRIGGER = FCE$"FCE$FLCTREL";     # FLOW CONTROL RELEASED TRIGGER# 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$CONBKN:                            # CONNECTION BROKEN            # 
  
      IF CONTYPE EQ CTYPE"CTCS" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CSBRKN";    # CONN. WITH CS BROKEN         # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTSAP" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$SAPBRKN";   # SAP CONN. BROKEN             # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTCTRL"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$AACTBRKN";  # A-A FOR CTRL CONN. BROKEN    # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$AADTBRKN";  # A-A FOR DATA CONN. BROKEN    # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$IDLEDN:                            # SHUT DOWN GRACEFULLY         # 
  
      TRIGGER = FCE$"FCE$SHUTSLOW";    # TRIGGER FOR SHUT DOWN SLOWLY # 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$SHUTDN:                            # SHUT DOWN IMMEDIATELY        # 
  
      TRIGGER = FCE$"FCE$SHUTFAST";    # TRIGGER FOR SHUT DOWN IMMEDT.# 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$ACFAIL:                            # ACTIVE CONNECT ATTEMPT FAILED# 
  
      IF CONTYPE EQ CTYPE"CTCTRL" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CTCNACFL";  # AC ATTEMPT FAILED FOR CTRL CN# 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTCNACFL";  # AC ATTEMPT FAILED FOR DATA CN# 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             # BAD CONTYPE FOR INDICATION   # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$CONABT:                            # CONNECTION ABORT INDICATION  # 
  
      IF CONTYPE EQ CTYPE"CTCTRL" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$CTCNABID";  # CTRL CN ABORT INDICATION     # 
        END 
  
      ELSE IF CONTYPE EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTCNABID";  # DATA CN ABORT INDICATION     # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             #                              # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$CONABS: 
  
      IF CONTYPE EQ CTYPE"CTDATA" 
      THEN
        BEGIN 
        TRIGGER = FCE$"FCE$DTCNABSO";  # DATA CN ABORT IND (SOLICIT)  # 
        END 
  
      ELSE
        BEGIN 
        FFSEABT (BADCNTP);             #                              # 
        END 
  
      GOTO LAB$CALLSTH;                # GOTO CALL STATE TABLE HANDLER# 
  
  
LAB$CALLSTH:                           # CALL STATE TABLE HANDLER     # 
  
      FFSLCSH (TRIGGER);
  
  
LAB$END:                               # END OF FFSLCIP               # 
  
      RETURN; 
  
      END                            # FFSLCIP #
  
      TERM
