*DECK FFSRPER 
USETEXT TEXTFFS                      # FS  SYSTEM DEFINITIONS         # 
PROC FFSRPER (CCT$, EVENT); 
*CALL COPYRITE
# TITLE FFSRPER - TCP PROCESS ERROR REPLIES.                          # 
  
      BEGIN                          # FFSRPER                        # 
  
# 
**    FFSRPER - TCP PROCESS ERROR REPLIES.
* 
*     CMP   02/88 
* 
*     'FFSRPER' PROCESSES ERROR REPLIES FROM THE TCP GATEWAY IN 
*     RESPONSE TO A PREVIOUSLY ISSUED TCP REQUEST.
* 
*     ENTRY (CCT$)       = CONNECTION CONTROL ENTRY NUMBER. 
*           (EVENT)      = EVENT GENERATED BY THE REPLY.
*           (DN$T$IDENT) = INDEX INTO PRIMITIVE TABLE OF REPLY HDDR.
* 
* 
*     DESCRIPTION.
* 
* 
*     RETURN. 
# 
  
      XREF
        BEGIN 
        PROC ABORT;                  # NOS ABORT MACRO                # 
        PROC FFSLNLH;                # NAM LAYER HANDLER              # 
        PROC FFSRSNC;                # TCP SEND CONNECTION REQUEST    # 
        PROC FFSUCLR;                # CLEAR MEMORY UTILITY           # 
        FUNC INT   I;                # FORTRAN INTEGER FUNCTION       # 
        PROC MESSAGE;                # NOS MESSAGE MACRO              # 
        END 
  
      ITEM CCT$       U;           # CN CONTROL ENTRY NUMBER          # 
      ITEM EVENT      U;           # EVENT GENERATED                  # 
  
  
      ARRAY ABTABM [00:00] S(3);     # CONNECTION-ABORT FAILURE       # 
        BEGIN 
        ITEM ABABT   C(00,00,20) =
          [" CN-ABORT FAILURE   "]; 
        ITEM ABZB0   U(02,00,60) = [0]; 
        END 
  
      ARRAY CSABTM [00:00] S(3);     # CLOSE SAP ABORT MESSAGE        # 
        BEGIN 
        ITEM CSABT   C(00,00,20) =
          [" CLOSE-SAP FAILURE  "]; 
        ITEM CSZB0   U(02,00,60) = [0]; 
        END 
  
      ARRAY INTRNL [00:00] S(3);     # INTERNAL ERROR MESSAGE         # 
        BEGIN 
        ITEM INTNL   C(00,00,20) =
          [" TCP GATEWAY ERROR  "]; 
        ITEM INTZB   U(02,00,60) = [0]; 
        END 
  
      ARRAY PCABTM [00:00] S(3);     # PASV CN ATTEMPT FAILURE        # 
        BEGIN 
        ITEM PCABT   C(00,00,20) =
          [" PC ATTEMPT FAILURE "]; 
        ITEM PCZB0   U(02,00,60) = [0]; 
        END 
  
  
      SWITCH REPLY : TCI$ID  # TCP REPLY SWITCH                       # 
         ALLOCATE  : TCI$A, 
         ACTIVECN  : TCI$AC,
         ABORTCON  : TCI$ACC, 
         CLOSESAP  : TCI$CS,
         DISCONNCT : TCI$D, 
         OPENSAP   : TCI$OS,
         PASVCN    : TCI$PC,
         STATUSRQ  : TCI$S, 
         SENDDATA  : TCI$SD,
         INVALID   : TCI$ABI, 
         INVALID   : TCI$CI,
         INVALID   : TCI$CSI, 
         INVALID   : TCI$DC,
         INVALID   : TCI$DI,
         INVALID   : TCI$EI,
         INVALID   : TCI$FCI, 
         INVALID   : TCI$R, 
         INVALID   : TCI$END; 
  
  
                                                         CONTROL EJECT; 
  
      P<GW$HEADER> = IND$ADDR[INAMTCP$];
  
# 
*     CASE REPLY OF 
# 
  
      GOTO REPLY [DN$T$IDENT];
  
INVALID:  
  
# 
*     ABORT THE APPLICATION - INTERNAL ERROR
# 
  
      MESSAGE(INTRNL, 0); 
      ABORT;
  
  
PASVCN: 
  
# 
*     ABORT THE APPLICATION - PASSIVE CONNECT ATTEMPT FAILURE 
# 
  
      MESSAGE(PCABTM, 0);            # PASSIVE CN ATTEMPT FAILURE     # 
      ABORT;
  
ACTIVECN: 
  
# 
*     INDICATION TO NEXT LAYER ALREADY SET - SET CN TYPE
# 
  
      IND$CTYPE[ITCPCM$] = CCT$;
      GOTO END$CASE;
  
OPENSAP:  
  
# 
*     RETRY THE OPEN SAP REQUEST
*     SET UP OPEN SAP HEADER. 
*     CALL FFSRSNC TO SEND OPEN SAP/CONNECTION REQUEST HEADER.
# 
  
      P<GW$HEADER> = LOC(OUTBUF);    # POINT GW HEADER                # 
      FFSUCLR(LOC(OUTBUF), GW$HL$TOS);
      GW$IDENT     = GW$ID$TOS;      # IDENTIFY HEADER                # 
      GW$HDR$TYP   = 0;              # SET HEADER TYPE                # 
      GW$DAT$LEN   = 0;              # SET DATA LENGTH                # 
      GW$HDR$LEN   = INT (GW$HL$TOS * 7.5); # SET HEADER LENGTH       # 
      GW$VERSION   = DGWVERSION;     # SET VERSION                    # 
      GW$STATUS    = 0; 
      GW$TOS$ISI   = 0; 
      REQ$Q[RTCPNAM$] = TRUE; 
      REQ$M[RTCPNAM$] = FALSE;
  
      FFSRSNC (CCT$, LOC(OUTBUF));
  
      GOTO END$CASE;
  
STATUSRQ: 
  
# 
*     IGNORE... 
# 
  
      GOTO END$CASE;
  
ABORTCON: 
  
# 
*     ABORT THE APPLICATION WITH APPROPRIATE MESSAGE... 
# 
  
      MESSAGE(ABTABM, 0);            # CN-ABORT FAILURE               # 
      ABORT;
  
CLOSESAP: 
  
# 
*     ABORT THE APPLICATION WITH APPROPRIATE MESSAGE... 
# 
  
      MESSAGE(CSABTM, 0);            # CLOSE-SAP FAILURE              # 
      ABORT;
  
DISCONNCT:  
SENDDATA: 
  
# 
*     ABORT THE CONNECTION. 
# 
  
      P<GW$HEADER> = LOC(OUTBUF);    # POINT GW HEADER                # 
      FFSUCLR(LOC(OUTBUF), GW$HL$TACC); 
        GW$IDENT     = GW$ID$TACC;   # IDENTIFY HEADER                # 
        GW$HDR$TYP   = 0;            # SET HEADER TYPE                # 
        GW$DAT$LEN   = 0;            # SET DATA LENGTH                # 
        GW$HDR$LEN   = INT (GW$HL$TACC * 7.5); # SET HEADER LENGTH    # 
        GW$VERSION   = DGWVERSION;   # SET VERSION                    # 
        GW$STATUS    = 0; 
        GW$TACC$IC   = ACN$CCEPID[CCT$];
      REQ$Q[RTCPNAM$] = TRUE; 
      REQ$M[RTCPNAM$] = FALSE;
      REQ$RCODE[RTCPNAM$] = RNAM"RNSENDAT"; 
      REQ$CTYPE[RTCPNAM$] = CCT$; 
      REQ$LEN[RTCPNAM$] = GW$HDR$LEN + GW$DAT$LEN;
      REQ$ADDR[RTCPNAM$] = LOC(OUTBUF); 
  
      FFSLNLH;
  
      GOTO END$CASE;
  
ALLOCATE: 
  
# 
*     RETRY THE ALLOCATE... 
*     SET UP ALLOCATE HEADER. 
*     CALL FFSLNLH TO SEND THE BLOCK. 
# 
  
      P<GW$HEADER> = LOC(OUTBUF);    # POINT GW HEADER                # 
      FFSUCLR(LOC(OUTBUF), GW$HL$TA); 
      GW$IDENT     = GW$ID$TA;       # IDENTIFY HEADER                # 
      GW$HDR$TYP   = 0;              # SET HEADER TYPE                # 
      GW$DAT$LEN   = 0;              # SET DATA LENGTH                # 
      GW$HDR$LEN   = INT (GW$HL$TA * 7.5); # SET HEADER LENGTH        # 
      GW$VERSION   = DGWVERSION;     # SET VERSION                    # 
      GW$STATUS    = 0; 
      GW$TA$ICI    = ACN$CCEPID[CCT$];
      GW$TA$SZ     = X"7FF70000"; 
      REQ$Q[RTCPNAM$] = TRUE; 
      REQ$M[RTCPNAM$] = FALSE;
      REQ$RCODE[RTCPNAM$] = RNAM"RNSENDAT"; 
      REQ$CTYPE[RTCPNAM$] = CCT$; 
      REQ$LEN[RTCPNAM$] = GW$HDR$LEN + GW$DAT$LEN;
      REQ$ADDR[RTCPNAM$] = LOC(OUTBUF); 
  
      FFSLNLH;
  
      GOTO END$CASE;
  
END$CASE: 
  
# 
*     END CASE OF REPLY 
# 
  
      DN$T$ITTID = ACN$ACN[CCT$]; 
  
      RETURN; 
  
      END                            # FFSRPER #
  
      TERM
