*DECK NEIB1 
USETEXT NIPDEF
USETEXT DRHDR 
USETEXT NHEADER 
USETEXT NCNB
USETEXT LLCB
USETEXT NCNT
USETEXT SUPMSG
USETEXT AHEADER 
USETEXT ACB 
USETEXT ACNB
USETEXT ACNT
USETEXT AT
USETEXT NBT 
USETEXT PT
USETEXT STATTAB 
USETEXT OVERLAY 
USETEXT PARAMP
USETEXT PARAMS
  
PROC NEIB1 (BUFADDR,NBTHNN) ; 
STARTIMS; 
 #
*1DC  NEIB1 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        NEIB1               C. BITTNER          82/06/18 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        CALL APPROPRIATE PROCESSOR TO PROCESS
*        MESSAGES IN THE PIP INBOUND BUFFER 
*        AND MESSAGES IN THE A-A MESSAGE QUEUE. 
* 
*     3. METHOD USED
*        JUMP ON ACTION ORDINAL DERIVED FROM
*        PFC/SFC MATCH
* 
*     4. ENTRY PARAMETERS 
*        BUFADDR - ADDRESS OF MESSAGE BLOCK 
*        NBTHNN - HOST NODE ON INBOUND BLOCK
*        NBTIDX - INDEX OF CURRENT NBT ENTRY BEING PROCESSED
* 
*     5. EXIT PARAMETERS
*        NONE 
* 
*     6. SYMPL TEXTS USED 
*        NIPDEF              DRHDR
*        NHEADER             NCNB 
*        LLCB                NCNT 
*        SUPMSG              AHEADER
*        ACB                 AT 
*        NBT                 NETWORK BUFFER TABLE 
*        PT                  STATTAB
*        OVERLAY             PARAMP 
*        ACNB                ACNT 
*        PIT                 PARAMS 
* 
*     7. ROUTINES CALLED
*        BLINK - LINK MESSAGE ON APPLICATION-S ACB
*        LOCLLCB - LOCATE LLCB
*        LOCNCNT - LOCATE NCNT ENTRY
*        NBSTTP - NETWORK BLOCK STATE TABLE 
*        NPNIPSM - PROCESS NIP SM 
*        NPPWL - PROCESS PRU WORKLIST FROM PIP
*        OSCHAPP - SCHEDULE APPLICATION 
*        OVLCALL - LOAD AND EXECUTE OVERLAY 
*        FINDPIT         OVL ALLOCATE PIT ENTRY INDEX 
*        NGIGO           OVL PROCESS GARBAGE MESSAGE
*        HFASTQ - QUEUE UPLINE MESSAGE TO ACNB
*        MRELS - RELEASE BUFFER SPACE 
*        XTRACE - TRACE PROCEDURE CALL
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION 
* 
*        THIS PROCEDURE IS CALLED BY NEIB.
* 
 #
STOPIMS;
  
# 
      INPUT PARAMETERS
# 
      ITEM BUFADDR;          # ADDRESS OF MSG BLOCK                    #
      ITEM NBTHNN ;          # HOST NODE NUMBER FROM THE NBT           #
  
# 
      EXTERNAL VARIABLES
# 
 XREF 
   BEGIN
   PROC NPPWL;               # PROCESS PRU WORKLIST FROM PIP           #
   PROC LOCLLCB;             # LOCATE LLCB                             #
   PROC MRELS;               # RELEASE BUFFER                          #
   PROC NBSTTP;              # NETWORK BLOCK STATE TABLE               #
   PROC LOCNCNT;             # LOCATE NCNT ENTRY                       #
   PROC BLINK;               # LINK MSG ON APPLICATION-S ACB           #
   PROC HFASTQ ;
   PROC OSCHAPP;             # SCHEDULE APPLICATION                    #
   PROC OVLCALL;             # LOAD AND EXECUTE OVERLAY                #
   PROC NPNIPSM;             # PROCESS NIP SM                          #
   PROC XTRACE;              # TRACE PROCEDURE CALL                    #
   END
  
# 
      INTERNAL VARIABLES
# 
      ITEM BADNBLK B;        # FLAG FOR BAD NETWORK BLOCK              #
      ITEM DISCSNS B;        # FLAG FOR JUST DISCARDING DUMP/LOAD      #
      ITEM I;                # INDEX OF PFCSFC FOUND                   #
      ITEM BLKT;             # TEMPORARY FOR BLOCK TYPE                #
      ITEM DNNUM ;
      ITEM FOUND B;          # PFCSFC MATCH FOUND FLAG                 #
      ITEM NBSTRIG;          # NBSTTP TRIGGER                          #
      ITEM TWORD;            # TEMPORARY TO HOLD NETWORK HEADER        #
      ITEM  ACNTINDX   ;  # INDEX INTO ACNB IN ACNT             # 
  
      DEF ERR1 #77#;       # ERROR CASE - NO VALID STATE TABLE TRIG  #
  
      SWITCH MSGDESTJT SMC0,SMC1,SMC2;
  
      ARRAY NBTRIGTAB [NETBLK:NETICMDR] S(1); 
        BEGIN  # NETW BLOCK STATE TABLE TRIGGER FOR NETW BLK           #
        ITEM NBS$TRIG U(0,0,60) = [ NBRMSG, 
                                    NBRMSG, 
                                    NBRBACK,
                                    NBRMSG, 
                                    NBRBRK, 
                                    NBRMSG, 
                                    NBRMSG, 
                                    NBRRST, 
                                    RINITR, 
                                    RINITN, 
                                    RTERM,
                                    NBRICMD,
                                    ICMDR 
                                                 ]; 
        END 
  
  
  
      BEGIN 
  
      CONTROL IFEQ DEBUG,1; 
        XTRACE("NEIB1");
      CONTROL FI; 
  
      P<DRHDRWD> = BUFADDR; 
      P<NHEADER> = P<DRHDRWD> + BLKHSIZE; 
      PARAMP4 = DMCBNBD;     # INDEX FOR BAD NETWORK BLK DISCARDED     #
      BADNBLK = TRUE; 
      DISCSNS = FALSE ; 
      DNNUM = DN[0] ; 
      IF ( (DNNUM NQ NBTHNN) OR              # DN DOES NOT MATCH HN    #
           (SN[0] EQ 0     )         ) AND   # SN IS 0                 #
         (NBTHNN NQ 0                ) AND   # NOT INTRAHOST MSG       #
         ( (DNNUM NQ 0           ) OR        # DN IS NONZERO           #
           (SN[0] NQ 0           ) OR        # SN IS NONZERO           #
           (NBTET[NBTIDX] NQ "ND")   )       # NOT CDCNET FRONT END    #
      THEN
        BEGIN 
        PARAMP4 = DMCBNN;    # INDEX FOR BAD NODE NUMBER DAY MSG       #
        GOTO NEXT ; 
        END 
      BLKT = BT[0]; # BLOCK TYPE                                       #
      IF BLKID[0] EQ PWLIDVALUE 
      THEN
        BEGIN 
        NPPWL(P<DRHDRWD>);  #  PROCESS PRU WORKLIST FROM PIP          # 
        BADNBLK = FALSE;
        END 
      ELSE
        BEGIN              # NOT A PWL                                 #
        IF BLKT LS NETBLK 
                 OR BLKT GR NETICMDR
        THEN
          BEGIN 
          IF BLKT EQ 0
          THEN               # ASSUME PIP IS DISCARDING BAD NETWORK MSG#
            BEGIN 
            PARAMP4 = DMCBNBD; # DMC FOR IVT BLK PROTOCOL ERR          #
            END 
          ELSE               # PIP GENERATED BAD BLOCK TYPE IN MSG     #
            BEGIN 
            PARAMP4 = DMCUBT;  # UNKNOWN BLOCK TYPE DAY MSG            #
            END 
          GOTO NEXT ;                # INVALID BLOCK TYPE FROM PIP     #
          END 
  
        IF CN[0] NQ 0 
        THEN
          BEGIN 
          LOCLLCB(DN[0],SN[0],P<LLCB>);  # LOCATE LLCB                 #
          IF P<LLCB> NQ 0 
          THEN
            BEGIN  # VALID NETWORK BLOCK                               #
            LOCNCNT(P<LLCB>,CN[0],P<NCNT>);  # LOCATE NCNT ENTRY       #
            IF P<NCNT> NQ 0 
            THEN
              BEGIN 
              P<NCNB> = NCNTNCNB[0];  # NCNB ADDRESS                   #
              IF P<NCNB> NQ 0 
              THEN
                BEGIN 
                NBSTRIG = NBS$TRIG[BLKT]; 
                IF NBSTRIG NQ ERR1  AND BLKT LQ NETICMDR
                THEN
                  BEGIN 
                  CONTROL IFEQ STAT,1;  # STATISTICS ON                #
                  IF BT[0] LQ NETMSG
                    OR BT[0] EQ NETQBLK 
                    OR BT[0] EQ NETQMSG 
                  THEN
                    BEGIN            # DATA BLOCK                      #
                    ST$IDB = ST$IDB + 1;  # INCR *N/W IN DATA BLOCK    #
                    ST$IDC = ST$IDC + CC[0];  # INCR *N/W IN DATA CHARS#
                    END 
                  ELSE
                    BEGIN            # NON DATA BLOCKS                 #
                    ST$INB = ST$INB + 1;  # INCR *N/W IN NON-DATA BK   #
                    ST$INC = ST$INC + CC[0]; # INCR *N/W IN ND CR      #
                    END 
                  CONTROL FI; 
                  P<ACNB> = NCNBACNB[0] ; # TRY FIND THE TWIN # 
                  IF NBSTRIG EQ NBRMSG AND P<ACNB> NQ 0 
                  THEN  # WE TRY TO SKIP THE STATE TABLES              #
                    BEGIN 
                    P<ACB> = ATACBA[ACNBAN[0]] ;
                    P<ACNT>= ACBACNT[0] ; 
                    ACNTINDX = ACNBACN[0]+ACNTHSIZE-ACNTMINACN[0] ; 
                    IF(   NCNBBST[0] EQ NBALLD # ALL DATA ALLOWED      #
                      AND ACNTIS[ACNTINDX] EQ HBALLD)# ALSO  HOST SIDE #
                    THEN
                      BEGIN 
                      IF NHBSN[0] LS 7
                      THEN
                        NCNTNIB[0] = NHBSN[0] + 1 ; # NEXT BSN OF UPLIN#
                      ELSE
                        NCNTNIB[0] = 1 ;
  
                      HFASTQ(BUFADDR,P<ACNB>) ; 
                      GOTO  GOON ;
                      END 
                    END 
  
                  NBSTTP(P<NCNB>,NBSTRIG,BUFADDR) ; 
GOON:             BADNBLK = FALSE ; 
                  END 
                END 
              END 
            END 
          END 
        ELSE                 # CN = 0   ASYNCHRONOUS SM                #
          IF (CC[0] GQ 2 ) AND         # SUP MSG IS NOT TOO SMALL      #
             (CC[0] LQ 472)            # SUP MSG IS NOT TOO LARGE      #
          THEN
            BEGIN 
            P<SUPMSG> = P<NHEADER> + NBHSIZE; 
            FOUND = FALSE;
            IF (PFCSFC[0] EQ NPIDD) OR
               (PFCSFC[0] EQ NPIPP) 
            THEN             # HALT NPU SUP MSG TO BE PROCESSED BY NIP #
              BEGIN          # FALL THROUGH TO LABEL SMC0              #
              FOUND = TRUE;  # FOUND MATCHING PFC/SFC                  #
              END 
            FOR I=1 STEP 1 WHILE I LQ 4 AND NOT FOUND 
            DO
              BEGIN 
              IF PFC[0] GQ MINPFC[I]
              AND PFC[0] LQ MAXPFC[I] 
              THEN
                BEGIN 
                IF PROCAN[I] NQ 0 
                THEN
                  BEGIN  # WITHIN PFC/SFC RANGE                        #
                  FOUND = TRUE; 
                  GOTO MSGDESTJT[CASEORD[I]]; 
                  END 
                ELSE
                  BEGIN 
                  IF I NQ 4   # MSG TO MISSING CS OR NS                #
                  THEN
                    DISCSNS = TRUE ;
                  END 
                END 
              END 
  
SMC0: 
# 
      SM-S PROCESSED BY NIP 
# 
  
      NPNIPSM(P<DRHDRWD>,BADNBLK);
      GOTO SMC2;
  
  
SMC1: 
# 
      SM-S PROCESSED BY NS/CS 
# 
  
      P<ACB> = ATACBA[PROCAN[I]] ;
  
      IF ATNVFN[ACBAN] OR ATNVFF[ACBAN] 
      THEN
        BEGIN                      # APPLICATION HAS NETTED OFF OR FAIL#
        BADNBLK = TRUE ;           # DISCARD THIS MESAGE               #
        GOTO NEXT ; 
        END                        # APPL. HAS NETTED OFF OR FAILED    #
  
      # FORMAT SPECIAL ABH FOR ABT=4                                   #
      P<AHEADER> = P<NHEADER>;
      TWORD = NHWORD[0];  # SAVE NETWORK HEADER                        #
      P<NHEADER> = LOC(TWORD);
      ABHWORD[0] = 0; 
      ABHABT[0] = APPSUP;  # APPLICATION BLOCK TYPE                    #
      ABHBT[0] = BLKT;   # NETWORK BLOCK TYPE                          #
      ABHNBH[0] = NBHABH[0];  # SET DN/SN/CN                           #
      ABHTLC[0] = CC[0];  # TEXT LENGTH                                #
      ABHACT[0] = CT8ASCII;  # CHARACTER TYPE                          #
      BLINK(P<DRHDRWD>,P<ACB>);  # LINK SM TO APP ACB                  #
      OSCHAPP(P<ACB>);  # SCHEDULE APPLICATION                         #
      BADNBLK = FALSE;
  
  
  
  
SMC2: 
  
            END 
        END                # NOT A PWL                                 #
  
  
NEXT: IF BADNBLK   AND ( NOT DISCSNS) 
      THEN                   # PROCESS GARBAGE MESSAGE                 #
        BEGIN 
        OVLNAME = NGIGOP; # OVERLAY NAME                               #
        PARAMP1 = P<DRHDRWD>;  # ADDRESS OF BAD MSG                    #
        OVLCALL;             # LOAD AND EXECUTE OVERLAY                #
        END 
  
      BLKT = BLKID[0];
      IF BLKT NQ DRIDVALUE AND BLKT NQ PWLRIDVALUE
      AND BLKT NQ POBIDVALUE
      THEN    # BUFFER NOT QUEUED TO DATA RING
                BUFFER NOT QUEUED TO ACB
              # 
        MRELS(P<DRHDRWD>);  #RELEASE BUFFER#
      RETURN; 
  
  
  
      END 
TERM
