*DECK HVLLCB
USETEXT NIPDEF
USETEXT PARAMP
USETEXT PARAMS
USETEXT SUPMSG
USETEXT PT
USETEXT TNT 
USETEXT AT
USETEXT ACB 
USETEXT ACNB
USETEXT LLCB
USETEXT NCNT
USETEXT OVERLAY 
PRGM HVLLCB;                 # VALIDATE LLCB AND SELECT CONNECTION     #
STARTIMS; 
 #
*1DC  HVLLLCB 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HVLLCB              A. BEN-ARZI         82/05/05 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        VALIDATE LOGICAL LINK AND SELECT CONNECTION NUMBER 
* 
*     3. METHOD USED
*        - VALIDATE THE LOGICAL LINK IN CR/IAP/N
*        - IF NOT EXISTING RETURN ADDRESS = 0  SEND CR/IAP/R TO NVF 
*          WITH A SPECIAL FORMAT OF A "RETRY" CASE. 
*        - IF IT EXISTS CHOOSE A CONNECTION NUMBER, USING THE RULE -
* 
*            * IF SN < DN START LOOKING FROM CN=1 
*            * IF SN > DN START LOOKING FROM CN=255 
* 
*     4. ENTRY PARAMETERS 
*        PARAMP1 - ADDRESS OF CR/IAP/N MESSAGE FROM NVF 
*        PARAMP2 - ADDRESS OF THE CONNECTION-S ACNB 
* 
*     5. EXIT PARAMETERS
*        PARAMP3 - LLCB ADDRESS 
*        PARAMP4 - NUMBER OF CONNECTION TO USE
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED 
*        NIPDEF     SUPMSG     PT     OPSIZE
*        LLCB     PARAMP     PARAMS     NCNT
* 
*     7. ROUTINES CALLED
*        LOCLLCB - FIND LLCB ADDRESS
*        XTRACE - TRACE PROCEDURE CALL
*        OVLCALL - LOAD AND EXECUTE OVERLAY 
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION 
*        THIS PROGRAM IS A PRIMARY OVERLAY CALLED BY HCSTTP.
*        W A R N I N G - THIS PROGRAM CANNOT EXCEED THE PRIMARY 
*CALL OPSIZE
* 
 #
STOPIMS;
# 
      EXTERNAL VARIABLES
# 
 XREF 
      BEGIN 
      PROC LOCLLCB;   # LOCATE LLCB                                    #
      PROC XTRACE ;   # DEBUG TRACE CALL                               #
      PROC OVLCALL;   # LOAD AND EXECUTE AN OVERLAY                    #
      PROC BLINK  ;   # SEND MESSAGE TO APPLICATION                    #
      PROC MGETS  ;   # GET A BUFFER                                   #
      PROC OSCHAPP;   # SCHEDULE APPLICATION                           #
      LABEL RJMAIN; 
      END 
# 
      INTERNAL VARIABLES
# 
      ITEM COUNT ;
      ITEM LLCBAD ;   # LOGICAL LINK ADDRESS                           #
      ITEM TEMPLL ;   # LAST LOGICAL LINK ADDRESS                      #
      ITEM I      ;   # LOOP INDEX                                     #
      ITEM FIRST  ;   # FIRST CONNECTION TO START LOOKING FROM         #
      ITEM STPSZ    ;   # STEP DIRECTION (+1 OR -1)                    #
      ITEM FOUND B;   # LOOP TERMINATOR WHEN WE FIND THE REQUESTED CONN#
      ARRAY CNX;
        BEGIN 
        ITEM  NCN    U(0,0,60);  # NETWORK CONNECTION NUMBER           #
        ITEM  CN1    U(0,52,4);  # INDEX TO NCNT                       #
        ITEM  CN2    U(0,56,4);  # INDEX TO NCNB                       #
        END 
#**********************************************************************#
      BEGIN 
      CONTROL IFEQ DEBUG,1; 
        XTRACE("VLLCB")   ; 
      CONTROL FI ;
      LLCBAD = 0  ;    #  PRE - SETTING                                #
      FOUND = FALSE ; 
      PARAMS1 = 0 ; 
      PARAMP3 =  0  ; 
      P<SUPMSG> = PARAMP1 + BLKHSIZE + AIPHSIZE ; 
      P<SMNVF>  = P<SUPMSG>  ;   # CR/IAP/N FROM NVF                   #
      IF CRISNOD[0] EQ 0 AND CRIDNOD[0] EQ 0
      THEN                     # THIS IS INTRA HOST                    #
        BEGIN 
        IF TNTLLAD[0] EQ 0
        THEN                 # NO INTRA HOST DUMMY LLCB YET            #
          BEGIN 
  
          MGETS(LLCBSIZE,LLCBAD,TRUE) ; 
          P<LLCB> = LLCBAD            ; 
          LLCBID [0] = LLCBIDVALUE    ; # FORMAT BASIC FIELDS          #
          LLCBHN [0] = 0 ;
          LLCBTN [0] = 1 ;
          LLCBHH[0] = TRUE ;
          LLCBHRL[0]= 3    ;
          LLCBNRL[0]= 3    ;
          LLCBFP [0] = 0 ; # THIS IS THE LAST IN THE LLCB-RING         #
          IF TNTNLL[1] NQ 0 
          THEN               # BUT IT IS NOT THE FIRST                 #
            BEGIN 
            P<LLCB> = TNTLLAD[1]  ; # THIS IS THE FIRST                #
            FOR I = 1 STEP 1 WHILE LLCBFP[0] NQ 0   DO
              BEGIN 
              P<LLCB> = LLCBFP[0] ;  # THAT IS THE NEXT                #
              END 
            LLCBFP[0] = LLCBAD    ;  # CAIN TO NEW ONE                 #
            TEMPLL = P<LLCB> ;
            P<LLCB>   = LLCBAD    ; 
            LLCBBP[0] = TEMPLL    ;  # AND CHAIN BACK                  #
            END 
          ELSE
            BEGIN 
            TNTLLAD[1] = LLCBAD;       # STORE LLCB ADDR IN TNT TABLE  #
            LLCBBP[0] = 0 ;  # IT IS THE FIRST ONE                     #
            END 
          TNTNLL[1] = TNTNLL[1] + 1 ; 
  
          MGETS(LLCBSIZE,LLCBAD,TRUE) ; 
          P<LLCB> = LLCBAD ;            # THIS IS THE SECOND DUMMY     #
          LLCBID [0] = LLCBIDVALUE ;
          LLCBHN [0] = 1 ;
          LLCBTN [0] = 0  ; 
          LLCBHH[0] = TRUE ;
          LLCBHRL[0]= 3    ;
          LLCBNRL[0]= 3    ;
          LLCBFP [0] = 0 ;
          LLCBBP [0] = 0 ; # CANNOT BE MORE THAN 1 LIKE THIS           #
          TNTNLL [0] = 1 ;
          TNTLLAD[0] = LLCBAD ; 
  
          END 
        ELSE
          LLCBAD = TNTLLAD[0] ; 
        END 
      ELSE
        LOCLLCB(CRISNOD[0],CRIDNOD[0],LLCBAD) ; 
      P<LLCB> = LLCBAD ;
      IF P<LLCB> EQ 0              # NO LLCB AVAILABLE                 #
           OR ( LLCBAD NQ 0 AND LLCBWOF[0] ) # LLCB BUT FAILURE IN     #
                                                       # PROGRESS      #
      THEN
        BEGIN             # NO SUCH LLCB EXISTS                        #
        PARAMS1 = RCIA"NLL" ;      # REASON CODE = 35, NO LLCB EXISTS  #
        END 
#                                                                      #
      ELSE
#                                                                      #
        BEGIN    # THIS LOGICAL LINK EXISTS.LET"S CHOOSE A CONNECTION  #
        PARAMP3 = LLCBAD ;
        P<LLCB> = LLCBAD ;   # BASE LLCB                               #
        IF CRISNOD[0] GR CRIDNOD[0] 
        THEN
          BEGIN              # WE START LOOKING FROM HIGHEST CONNECTION#
          FIRST = 1  ;       # START LOOKING FROM CONNECTION = 1       #
          STPSZ   = 1  ;
          END 
        ELSE
          BEGIN 
          FIRST =  LLCBESIZE * ( NCNTSIZE-NCNTHSIZE) - 1 ;
          STPSZ   = -1 ;       # SEARCH BACKWARDS                      #
          END 
# 
        NOW LOOP FOR SEARCH UNTIL FIRST NCNB ADDRESS IS ZERO
# 
        COUNT = 0 ;                # PRESET COUNT FROM 1 TO 255        #
        FOR I = FIRST STEP STPSZ WHILE ( NOT FOUND )
                                   AND COUNT LS 
                                     ( (  LLCBESIZE  *
                                         (NCNTSIZE - NCNTHSIZE)) - 1 )
  
                                    # COUNT ONLY GO FROM 1 TO 255 MAX  #
        DO
          BEGIN 
          NCN = I         ;   # TRY THIS CONNECTION NUMBER             #
          COUNT = COUNT + 1 ; 
          IF LLCBNCNT[LLCBHSIZE + CN1] EQ 0    # NO NCNT FOR THIS ENTRY#
          THEN
            FOUND = TRUE ;
          ELSE         # THERE IS A NCNT EXISTING                      #
            BEGIN 
            P<NCNT> = LLCBNCNT[LLCBHSIZE + CN1] ; 
            IF NCNTNCNB[NCNTHSIZE + CN2] EQ 0  # NO NCNB TO NCNT ENTRY #
            THEN
              FOUND = TRUE ;
            END 
          END         # SEARCH LOOP                                    #
        IF NOT FOUND               # DID NOT FIND ANY ENTRY FOR NCNT   #
        THEN
          BEGIN                    # NO NCNT AVAILABLE, SEND RC = TEMP #
            PARAMP3 = 0 ;          # UNVAILABLE.                       #
            PARAMS1 = RCIA"NLL" ; 
          END 
        ELSE
          PARAMP4 = NCN ;                # ENTRY FOUND                 #
  
        END           # CONNECTION CHOOSING                            #
#                                                                      #
        IF PARAMS1 NQ 0 
        THEN
          BEGIN                    # ERROR OCCURED                     #
          P<ACNB> = PARAMP2  ;
          PARAMS2 = ACNBACN[0] ; # APPLICATION CONNECTION NUMBER       #
          PARAMS3 = 0 ;   # APPLICATION NUMBER=0 MEANS NOT FIRST CALL  #
          PARAMS4 = PARAMP2 ;  # ACNB ADDRESS                          #
          PARAMS7 = 0;         # NO EXTRA WORDS PASSED                 #
          OVLNAME = HCRIAPRP ; # OVERLAY TO SEND CR/IAP/R TO NVF       #
          OVLCALL ;  # LOAD AND EXECUTE OVERLAY                        #
          END                      # ERROR OCCURED                     #
      GOTO RJMAIN ; 
      END  # MAIN                                                      #
TERM
