*DECK NLOPIP
USETEXT ACB 
USETEXT AHEADER 
USETEXT APPSTAT 
USETEXT DRHDR 
USETEXT LLCB
USETEXT NBT 
USETEXT NHEADER 
USETEXT NIPDEF
USETEXT OVERLAY 
USETEXT PARAMP
USETEXT PARAMS
USETEXT PT
USETEXT SUPMSG
PRGM NLOPIP;
#     LINK DOWNLINE (OUTBOUND) SUPERVISORY MESSAGE FOR PIP             #
  
 STARTIMS;
 #
*1DC  NLOPIP
* 
*     1. PROC NAME           AUTHOR              DATE 
*        NLOPIP              E. GEE              85/04/02 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        LINK CS/NS SUPERVISORY MESSAGES TO OUTBOUND BUFFER.
* 
*     3. METHOD USED
*        CHECK THAT THERE IS A CORRECT NBT ENTRY FOR THE SPECIFIC 
*          COUPLER. 
*        IF SUPERVISORY MESSAGE IS FROM CS, 
*          CHECK THAT LOGICAL LINK EXISTS AND SUPERVISION EXISTS FOR THE
*            LOGICAL LINK.
*        CHECK NPU OFF FLAG, ACTIVE FLAG, DOWN FLAG, BOOTSTRAP FLAG, AND
*          LLK FLAG TO ALLOW SUITABLE MESSAGES TO BE LINKED.
*        IF NO ERROR ENCOUNTERED, 
*          CONVERT APPLICATION HEADER TO NETWORK HEADER.
*          LINK MESSAGE TO PIP OUTBOUND CHAIN.
*        ELSE (BAD SUP MSG FROM CS/NS), 
*          CALL OMSG TO ISSUE DAYFILE MESSAGE.
*          CALL NGIGO TO DAYFILE AND DISCARD BAD SUPERVISORY MESSAGE. 
* 
*     4. ENTRY PARAMETERS 
*        ACBADDR             ACB ADDRESS OF NS/CS 
*        PARAMP1             MESSAGE BUFFER ADDRESS 
* 
*     5. EXIT PARAMETERS
*        NONE 
* 
*     6. COMDECKS CALLED
*        ACB                 APPLICATION CONTROL BLOCK TEMPLATE 
*        AHEADER             APPLICATION BLOCK HEADER WORD TEMPLATE 
*        APPSTAT             NETWORK WORKLIST PROCESSING TABLE
*        DRHDR               DATA ENTRY HEADER WORD TEMPLATE
*        LLCB                LOGICAL LINK CONTROL BLOCK TEMPLATE
*        NBT                 NETWORK BUFFER TABLE 
*        NHEADER             NETWORK BLOCK HEADER WORD TEMPLATE 
*        NIPDEF              NIP CONSTANT DEFINITIONS 
*        OVERLAY             OVERLAY TABLE
*        PARAMP              PARAMETERS PASSED TO PRIMARY OVERLAY 
*        PARAMS              PARAMETERS PASSED TO SECONDARY OVERLAY 
*        PT                  POINTER TABLE
*        SUPMSG              SUPERVISORY MESSAGE TEMPLATES
* 
*     7. ROUTINES AND OVERLAYS CALLED 
*        LOCLLCB             LOCATE LOGICAL LINK
*        NXBLINK             LINK MESSAGE ON PIP OUTBOUND CHAIN 
*        OMSG                ISSUE DAYFILE MESSAGE
*        OVLCALL             LOAD AND EXECUTE OVERLAY 
*        XTRACE              TRACE CALLS
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION 
* 
*        * BAD SUP MSG FROM NS/CS DISCARDED * 
* 
*        THIS PROGRAM IS A PRIMARY OVERLAY LOADED BY SUBROUTINE OVLCALL.
*        WHEN EXECUTION HAS COMPLETED, A JUMP IS MADE TO LOCATION RJMAIN
*        TO RETURN TO THE CALLING PROGRAM.
* 
*        W A R N I N G - THIS PROGRAM CANNOT EXCEED THE PRIMARY 
*                        OVERLAY BUFFER SIZE MINUS 5 (560B WORDS).
* 
*        THIS OVERLAY IS CALLED BY HPPUT. 
* 
 #
 STOPIMS; 
  
      XREF
        BEGIN 
        PROC MRELS;          # RELEASE BUFFER SPACE                    #
        PROC LOCLLCB;        # LOCATE LOGICAL LINK                     #
        PROC NXBLINK ;       # LOG MESSAGE INTO PIP OUT                #
        PROC OMSG;           # ISSUE DAYFILE MESSAGE                   #
        PROC OVLCALL;        # LOAD AND EXECUTE OVERLAY                #
        PROC XTRACE;         # RECORD TRACES                           #
        LABEL RJMAIN;        # RETURN ADDRESS IN OVLCALL               #
        END 
  
#     LOCAL VARIABLES                                                  #
  
      ITEM BUFAD;            # BUFFER ADDRESS                          #
      ITEM ERRORF B;         # ERROR FLAG                              #
      ITEM CNODE;            # COUPLER NODE                            #
      ITEM I;                # LOOP CONTROL VARIABLE                   #
      ITEM IND;              # INDEX                                   #
      ITEM INDX;             # INDEX                                   #
      ITEM TEMP;             # SAVE APPLICATION BLOCK HEADER           #
      ITEM FOUND B ;         # MATCHED NPU FLAG                        #
      ITEM TEMPDN ;          # TEMPORARY DEST. NODE                    #
  
      ARRAY MSG01 S(4); 
        BEGIN 
        ITEM MSG011 C(0,0,34) = [" BAD SUP MSG FROM NS/CS DISCARDED."]; 
        ITEM MSG01E U(3,24,36) = [0]; 
        END 
  
#**********************************************************************#
  
      BEGIN # NLOPIP #
      CONTROL IFEQ DEBUG,1; 
        XTRACE("LOPIP") ; 
      CONTROL FI; 
  
      P<DRHDRWD> = 0;        # DATA BLOCK HEADER ADDRESS               #
      P<ACB> = ACBADDR;      # ADDRESS OF CS/NS ACB                    #
      ERRORF = TRUE;         # INITIALIZE ERROR FLAG                   #
      P<SUPMSG> = PARAMP1 + DBHSIZE + ABHSIZE;  # SM ADDRESS           #
      P<AHEADER> = PARAMP1 + DBHSIZE;       # APPLICATION HEADER ADDR  #
      CNODE = ABHSN[0];      # COUPLER NODE                            #
      P<SMNIP> = P<SUPMSG>; 
      TEMPDN = ABHDN[0];     # DESTINATION NODE                        #
      FOUND = FALSE;
# 
      SEARCH FOR NBT ENTRY WITH MATCHING COUPLER NODE NUMBER
# 
      FOR I = 0 STEP NBTFETNO WHILE I LQ NBTMAXID 
                                    AND NOT FOUND 
      DO
        BEGIN                # SEARCH FOR NBTE WITH HN = COUPLE        #
        IF NBTHN[I] EQ CNODE
           AND NBTIUF[I]
        THEN
          BEGIN              # FOUND THE ENTRY                         #
          FOUND = TRUE ;
          IND = I;           # SAVE INDEX                              #
          END 
        END                  # SEARCH FOR NBTE WITH HN = COUPLR        #
  
      I = IND;
      INDX = I+4;            # INDEX INTO PIP FLAGS IN NBT 5TH FET     #
# 
      CHECK IF OKAY TO SEND SUPERVISORY MESSAGE TO NPU
# 
      IF FOUND                              AND    # ACTIVE NBT EXISTS #
         NOT NBTOF[INDX]                    AND    # NPU NOT OFF IN EST#
         ( ( NBTAF[INDX]           AND        # NPU ACTIVE             #
             NOT NBTMF[INDX]          ) OR    # AND SAMP IS NOT RUNNING#
           ( PFC EQ NPU            AND        # NS DUMP-LOAD SM FOR    #
             CNODE  EQ TEMPDN      AND        # LOCAL NPU-S WHICH IS   #
             ( NOT NBTAF[INDX] OR             # NOT AC AND SAM NOT LOAD#
               NBTDF[INDX]       )    ) OR    # OR IS IN NPU DUMP-LOAD #
           ( NBTLF[INDX]           AND        # PIP WAIT FOR REG/CP RSP#
             PFCSFC[0] EQ REGCP    AND        # REG/CP RSP TO PIP ALLOW#
             REGR[0]                  )     ) # RESPONSE BIT IS ON     #
      THEN
        BEGIN 
        ERRORF = FALSE;      # NO ERROR ENCOUNTERED                    #
        END 
      IF ACBAN[0] EQ PROCAN[CSORD]
      THEN                   # SUPERVISORY MESSAGE IS FROM CS          #
        BEGIN 
        ERRORF = TRUE;
        LOCLLCB(ABHSN[0],ABHDN[0],P<LLCB>) ;
        IF P<LLCB> NQ 0 AND  # LOGICAL LINK EXISTS                     #
           LLCBCS[0]         # CS HAS SUPERVISION OF THIS NPU          #
        THEN                 # VALID SUPERVISORY MESSAGE TO SEND TO PIP#
          BEGIN 
          ERRORF = FALSE;    # VALID FOR CS TO SEND SUP MSG TO THIS NPU#
          END 
        END 
      IF NOT ERRORF 
      THEN                   # NO ERROR WAS FOUND IN SUP MSG           #
        BEGIN 
# 
        CONVERT ABH TO NETWORK HEADER 
# 
        TEMP = ABHWORD[0];   # SAVE APPLICATION HEADER                 #
        ABHWORD[0] = 0;      # CLEAR APPLICATION HEADER                #
        P<NHEADER> = PARAMP1 + DBHSIZE;  # NETW HEADER ADDR            #
        P<AHEADER> = LOC(TEMP);  # APPLICATION HEADER                  #
        DN[0] = TEMPDN;      # DESTINATION NODE                        #
        SN[0] = CNODE;       # SOURCE NODE                             #
        CN[0] = 0;
        BT[0] = NETCMD;      # BLOCK TYPE                              #
        NHACT[0] = ABHACT[0];  # CHARACTER TYPE                        #
        CC[0] = ABHTLC[0];   # TEXT LENGTH                             #
        IND = NBTINDX[I]*NBTFETNO + OSTFET; 
        NXBLINK(PARAMP1,IND);    # LINK MESSAGE TO PIP OUTBOUND QUEUE  #
        END 
      ELSE                   # DISCARD BAD SUPERVISORY MESSAGE         #
        BEGIN 
        OMSG(MSG01,0);       # ISSUE DIAGNOSTICS DAYFILE MESSAGE       #
        PARAMS1 = PARAMP1;
        P<DRHDRWD> = PARAMP1; 
        PARAMS2 = BLKBS[0];  # SIZE OF BAD SUP MSG BLOCK               #
        OVLNAME = ODAYFLP;   # NAME OF OVERLAY TO LOAD                 #
        OVLCALL;
        END 
      GOTO RJMAIN;           # RETURN TO CALLING PROGRAM               #
      END 
TERM
