*DECK NFOB
USETEXT NIPDEF
USETEXT AHEADER 
USETEXT ACNB
USETEXT BPIPBUF 
USETEXT DBGBUF
USETEXT DRHDR 
USETEXT NHEADER 
USETEXT LLCB
USETEXT NCNB
USETEXT STATTAB 
USETEXT SYSTIME 
 PROC NFOB(BUFADDR,NCNBAD)   ;   # LINK BLOCK TO PIP OUTBOUND          #
  
 STARTIMS;
 #
*1DC  NFOB
* 
*     1. PROC NAME           AUTHOR              DATE 
*          NFOB              P.C.TAM             80/02/08 
*                            C. BITTNER          81/07/13 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        THIS ROUTINE IS RESPONSIBLE FOR LINKING MESSAGES TO THE PIP
*        OUTBOUND BUFFER CHAIN AND THE A-A INTRA-HOST 
*        MESSAGE QUEUE. 
* 
*     3. METHOD USED. 
*          CN NON-ZERO
*            ABT = BLK,MSG,CMD (SYNCHRONOUS SM) 
*              IN REGULATION OR DOWNLINE BLOCK LIMIT REACHED
*                LINK MSG TO NCNB 
*              NOT IN REGULATION
*                SET-UP NETWORK HEADER
*                ADD BSN TO DOWNLINE MESSAGES 
*                CREATE ACKNOWLEDGE QUEUE ENTRY 
*                RESET HOSTSIDE INACTIVITY TIMER
*            ABT = APPNET (ONE WORD NETWORK MSG-INITR,RST,TERM,...) 
*          CN = 0 
*            SET UP NETWORK HEADER
*          UPDATE STATISTICS
*        IF THE MESSAGE IS AN A-A INTRA-HOST MESSAGE
*        (DN OR SN = 0) THEN CALL NFOB1 TO QUEUE
*        THE MESSAGE TO THE A-A INTRA-HOST QUEUE
*        ELSE (IF NOT A-A INTRA-HOST MESSAGE) 
*        CALL NXBLINK TO QUEUE THE MESSAGE TO 
*        THE PIP OUTBOUND CHAIN.
* 
*     4. ENTRY PARAMETERS.
*          BUFADD            ADDRESS OF DATA MESSAGE
*          NCNBAD            ADDRESS OF NCNB/LLCB 
* 
*     5. EXIT PARAMETERS. 
*        NONE 
* 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED 
*        BPIPBUF    DRHDR     DBGBUF     NHEADER
*        NIPDEF     ACNB      NCNB       STATTAB
*        SYSTIME    AHEADER   LLCB
* 
*     7. ROUTINES CALLED. 
*          BLINK             LINK DATA MESSAGE TO NCNB
*          LOCLLCB           LOCATE LLCB
*          NFOB1             INTRA-HOST LINK PROCESSOR
*          NXBLINK           LINK MSG TO PIP OUTBOUND CHAIN 
*          XTRACE            TRACES CALLS 
* 
*     8. DAYFILE MESSAGES.  NONE
* 
 #
 STOPIMS; 
# 
      FORMAL PARAMS 
# 
      ITEM BUFADDR ;         # FWA OF BLOCK TO SEND TO NPU             #
      ITEM NCNBAD   ;        # FWA OF NCNB/LLCB                        #
  
# 
      EXTERNAL VARIABLES
# 
 XREF BEGIN 
   PROC BLINK;               # LINK DATA MESSAGE TO NCNB               #
   PROC LOCLLCB;             # LOCATE LLCB                             #
   PROC NFOB1 ;              # INTRA-HOST LINK PROCESSOR               #
   PROC NXBLINK ;            # LOG MESSAGE INTO PIP OUT                #
   PROC TWRITE;              # RECORD MESSAGE IN ZZZZZDN FILE          #
   PROC XTRACE;              # TRACE CALL                              #
   END
# 
                    INTERNAL VARIABLES
# 
      ITEM FETINDEX;         # PRIORITY INDEX                          #
      ITEM INDEX2;           # NBT FET INDEX FOR DOWNLINE DATA         #
      ITEM ABHTEMP U;        # TEMPORARY TO STORE ABH                  #
  
#**********************************************************************#
      BEGIN 
      CONTROL IFEQ DEBUG,1 ;
        XTRACE("NFOB ") ; 
      CONTROL FI; 
  
      P<DRHDRWD> = 0; 
  
      P<NCNB> = NCNBAD; 
      P<AHEADER> = BUFADDR + BLKHSIZE ; 
      ABHTEMP = ABHWORD[0] ;           # SAVE ABH                      #
      P<NHEADER> = P<AHEADER> ; 
      P<AHEADER> = LOC(ABHTEMP) ; 
      FETINDEX = 0;                    # INITIALIZE FET INDEX          #
  
      IF NCNBID[0] EQ NCNBIDVALUE 
      THEN
        BEGIN                # CN NON-ZERO                             #
        LOCLLCB(NCNBHN[0],NCNBTN[0],P<LLCB>);  # FIND MATCHING LLCB    #
  
        IF ABHABT[0] NQ 0 
        THEN # IT IS BLK, MSG, OR SYNCHRONOUS COMAND                   #
          BEGIN 
  
          IF (NCNBNBO[0] GQ NCNBDBL[0]) OR NCNBHR[0] OR NCNBNR[0] 
          THEN
            BEGIN            # IN REGULATION OR NBL REACHED            #
            BLINK(BUFADDR,NCNBAD);  # LINK MSG TO NCNB                 #
            GOTO NFOB77;
            END 
          ELSE
            BEGIN            # SEND CONNECTION DATA TO NPU             #
            NHWORD[0] = 0;   # CLEAR NETWORK HEADER                    #
            IF ABHABT[0] NQ APPCMD
            THEN                      # DATA MESSAGE                   #
              BEGIN 
              BT[0] = ABHABT[0] ;     # BLOCK TYPE                     #
              NHDBC[0] = ABHDBC[0] ;  # DATA BLOCK CLARIFIER           #
              END 
            ELSE
              BT[0] = NETCMD ;        # SYNCH MESSAGE                  #
  
            # ADD BSN TO DOWNLINE MESSAGES                             #
            IF NCNBDBSN[0] LS 7 
            THEN             # BSN RANGES FROM 1 TO 7                  #
              NCNBDBSN[0] = NCNBDBSN[0] + 1;
            ELSE
              NCNBDBSN[0] = 1;
            NHBSN[0] = NCNBDBSN[0];  # INSERT BSN INTO NETW HEADER     #
            NCNBNBO[0] = NCNBNBO[0] + 1;  # INCR DOWNLN BLK CTR        #
  
            # CREATE ACKNOWLEDGE QUEUE ENTRY                           #
            # THE APPLICATION BLOCK HEADER WITH ADR=BSN IS ACKQ ENTRY  #
            ABHADR[0] = NCNBDBSN[0];  # SAVE BSN IN ACKQ ENTRY         #
            CMWORD[NCNBACKQ[0]+ACKHSIZE+NCNBAKIN[0]] = ABHWORD[0];
            IF (NCNBAKIN[0] + 1) GQ NCNBDBL[0]
            THEN
              NCNBAKIN[0] = 0;  # RESET OFFSET TO BEGIN OF BUFFER      #
            ELSE
              NCNBAKIN[0] = NCNBAKIN[0] + 1;  # UPDATE IN PRT OFFSET   #
  
            # RESET THE INACTIVITY COUNTER IN THE ACNB                 #
            P<ACNB> = NCNBACNB[0];
            IF P<ACNB> NQ 0 
            THEN
              ACNBINACT[0] = RTSECS[0] + INACTVAL;
  
            CONTROL IFEQ STAT,1;
            NCNBTOTB[0] = NCNBTOTB[0] + 1;
            NCNBTOTC[0] = NCNBTOTC[0] + ABHTLC[0];
            CONTROL FI; 
            END 
          END 
  
        NHADDR[0] = NCNBNADR[0]; # SET NETWORK NADRESS DN/SN/CN        #
        IF BT[0] NQ NETBACK 
        THEN # DELIVER BLOCK PROTOCOL ELEMENTS ON CONNECTION PRIORITY  #
          BEGIN 
          FETINDEX = NCNBPRI[0];                                         JCL1109     9
          IF FETINDEX EQ 1
          THEN                 # HIGH PRIORITY CONNECTION              #
            BEGIN 
            NHPRI[0] = TRUE;
            END 
          ELSE
            BEGIN 
            NHPRI[0] = FALSE; 
            END 
          END 
  
        END 
  
      ELSE                   # ASYNCHRONOUS SUPERVISORY MESSAGE        #
        BEGIN 
        P<LLCB> = NCNBAD ;   # FWA OF LLCB                             #
        NHWORD[0] = 0;       # CLEAR NETWORK HEADER                    #
        DN[0] = LLCBTN[0];  # DESTINATION NODE                         #
        SN[0] = LLCBHN[0];  # SOURCE NODE                              #
        BT[0] = NETCMD;  # BLOCK TYPE                                  #
        END 
  
      INDEX2 = (LLCBNBTE[0]*NBTFETNO) + OSTFET + FETINDEX;
      NHACT[0] = ABHACT[0] ;    # SET TEXT LENGTH                      #
      CC[0] = ABHTLC[0] ;       # CHARACTER COUNT                      #
  
      CONTROL IFEQ STAT,1;              # STATISTICS ON                #
        LLCBCMTC[0] = LLCBCMTC[0] + CC[0];
      CONTROL FI; 
  
  
      IF DN[0] EQ 0 
        OR SN[0] EQ 0 
      THEN                 # INTRA-HOST A TO A                         #
        NFOB1(BUFADDR) ;
      ELSE                # NETWORK OUTBOUND DATA                      #
        NXBLINK(BUFADDR,INDEX2) ; 
  
NFOB77: 
      RETURN; 
      END 
TERM
